21 Apr, 2010

1 commit

  • Define a new function to return the waitqueue of a "struct sock".

    static inline wait_queue_head_t *sk_sleep(struct sock *sk)
    {
    return sk->sk_sleep;
    }

    Change all read occurrences of sk_sleep by a call to this function.

    Needed for a future RCU conversion. sk_sleep wont be a field directly
    available.

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

20 Apr, 2010

16 commits

  • Since netdev_chain is guarded by rtnl_lock, ASSERT_RTNL should be
    present here to make sure that all callers of call_netdevice_notifiers
    does the locking properly.

    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Jiri Pirko
     
  • In case we compute a software skb->rxhash, we can generate a consistent
    hash : Its value will be the same in both flow directions.

    This helps some workloads, like conntracking, since the same state needs
    to be accessed in both directions.

    tbench + RFS + this patch gives better results than tbench with default
    kernel configuration (no RPS, no RFS)

    Also fixed some sparse warnings.

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • struct softnet_data holds many queues, so consistent use "sd" name
    instead of "queue" is better.

    Adds a rps_ipi_queued() helper to cleanup enqueue_to_backlog()

    Adds a _and_irq_disable suffix to net_rps_action() name, as David
    suggested.

    incr_input_queue_head() becomes input_queue_head_incr()

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • store_rps_map() & store_rps_dev_flow_table_cnt() are static.

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • net_rps_action() is a bit expensive on NR_CPUS=64..4096 kernels, even if
    RPS is not active.

    Tom Herbert used two bitmasks to hold information needed to send IPI,
    but a single LIFO list seems more appropriate.

    Move all RPS logic into net_rps_action() to cleanup net_rx_action() code
    (remove two ifdefs)

    Move rps_remote_softirq_cpus into softnet_data to share its first cache
    line, filling an existing hole.

    In a future patch, we could call net_rps_action() from process_backlog()
    to make sure we send IPI before handling this cpu backlog.

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • Set version to 1.52.53-1.

    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     
  • Author: Yaniv Rosner
    Signed-off-by: Yaniv Rosner
    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     
  • Move "don't shut down the power" logic into bnx2x_set_power_state() to make the code cleaner.

    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     
  • Properly mask the value to be written to the register (according to the register size) during the self-test.
    Otherwise immediate parity error would be generated.

    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     
  • Try to enable less MSI-X vectors if initial request has failed.

    Author: Dmitry Kravkov
    Signed-off-by: Dmitry Kravkov
    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     
  • Added total_mcast/bcast_pkts_transmitted statistics.

    Author: Dmitry Kravkov
    Signed-off-by: Dmitry Kravkov
    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     
  • White spaces, code readability and prints.

    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     
  • Don't run code that can't be run if MCP is not present.
    This will prevent NULL pointer dereferencing.

    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     
  • Increase DMAE max write size for 57711 to the maximum allowed value.

    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     
  • Author: Dmitry Kravkov
    Signed-off-by: Dmitry Kravkov
    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     
  • This patch introduces the parity errors handling code for 57710 and 57711 chips.

    HW is configured to stop all DMA transactions to the host and sending packets to the network
    once parity error is detected, which is meant to prevent silent data corruption.
    At the same time HW generates the attention interrupt to every function of the device where parity
    has been detected so that driver can start the recovery flow.

    The recovery is actually resetting the chip and restarting the driver on all active functions
    of the chip where the parity error has been reported.

    Signed-off-by: Vladislav Zolotarov
    Signed-off-by: Eilon Greenstein
    Signed-off-by: David S. Miller

    Vladislav Zolotarov
     

18 Apr, 2010

2 commits

  • Transmitted skb might be attached to a socket and a destructor, for
    memory accounting purposes.

    Traditionally, this destructor is called at tx completion time, when skb
    is freed.

    When tx completion is performed by another cpu than the sender, this
    forces some cache lines to change ownership. XPS was an attempt to give
    tx completion to initial cpu.

    David idea is to call destructor right before giving skb to device (call
    to ndo_start_xmit()). Because device queues are usually small, orphaning
    skb before tx completion is not a big deal. Some drivers already do
    this, we could do it in upper level.

    There is one known exception to this early orphaning, called tx
    timestamping. It needs to keep a reference to socket until device can
    give a hardware or software timestamp.

    This patch adds a skb_orphan_try() helper, to centralize all exceptions
    to early orphaning in one spot, and use it in dev_hard_start_xmit().

    "tbench 16" results on a Nehalem machine (2 X5570 @ 2.93GHz)
    before: Throughput 4428.9 MB/sec 16 procs
    after: Throughput 4448.14 MB/sec 16 procs

    UDP should get even better results, its destructor being more complex,
    since SOCK_USE_WRITE_QUEUE is not set (four atomic ops instead of one)

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • - There is no point to enforce a time limit in process_backlog(), since
    other napi instances dont follow same rule. We can exit after only one
    packet processed...
    The normal quota of 64 packets per napi instance should be the norm, and
    net_rx_action() already has its own time limit.
    Note : /proc/net/core/dev_weight can be used to tune this 64 default
    value.

    - Use DEFINE_PER_CPU_ALIGNED for softnet_data definition.

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

17 Apr, 2010

2 commits

  • Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • This patch implements receive flow steering (RFS). RFS steers
    received packets for layer 3 and 4 processing to the CPU where
    the application for the corresponding flow is running. RFS is an
    extension of Receive Packet Steering (RPS).

    The basic idea of RFS is that when an application calls recvmsg
    (or sendmsg) the application's running CPU is stored in a hash
    table that is indexed by the connection's rxhash which is stored in
    the socket structure. The rxhash is passed in skb's received on
    the connection from netif_receive_skb. For each received packet,
    the associated rxhash is used to look up the CPU in the hash table,
    if a valid CPU is set then the packet is steered to that CPU using
    the RPS mechanisms.

    The convolution of the simple approach is that it would potentially
    allow OOO packets. If threads are thrashing around CPUs or multiple
    threads are trying to read from the same sockets, a quickly changing
    CPU value in the hash table could cause rampant OOO packets--
    we consider this a non-starter.

    To avoid OOO packets, this solution implements two types of hash
    tables: rps_sock_flow_table and rps_dev_flow_table.

    rps_sock_table is a global hash table. Each entry is just a CPU
    number and it is populated in recvmsg and sendmsg as described above.
    This table contains the "desired" CPUs for flows.

    rps_dev_flow_table is specific to each device queue. Each entry
    contains a CPU and a tail queue counter. The CPU is the "current"
    CPU for a matching flow. The tail queue counter holds the value
    of a tail queue counter for the associated CPU's backlog queue at
    the time of last enqueue for a flow matching the entry.

    Each backlog queue has a queue head counter which is incremented
    on dequeue, and so a queue tail counter is computed as queue head
    count + queue length. When a packet is enqueued on a backlog queue,
    the current value of the queue tail counter is saved in the hash
    entry of the rps_dev_flow_table.

    And now the trick: when selecting the CPU for RPS (get_rps_cpu)
    the rps_sock_flow table and the rps_dev_flow table for the RX queue
    are consulted. When the desired CPU for the flow (found in the
    rps_sock_flow table) does not match the current CPU (found in the
    rps_dev_flow table), the current CPU is changed to the desired CPU
    if one of the following is true:

    - The current CPU is unset (equal to RPS_NO_CPU)
    - Current CPU is offline
    - The current CPU's queue head counter >= queue tail counter in the
    rps_dev_flow table. This checks if the queue tail has advanced
    beyond the last packet that was enqueued using this table entry.
    This guarantees that all packets queued using this entry have been
    dequeued, thus preserving in order delivery.

    Making each queue have its own rps_dev_flow table has two advantages:
    1) the tail queue counters will be written on each receive, so
    keeping the table local to interrupting CPU s good for locality. 2)
    this allows lockless access to the table-- the CPU number and queue
    tail counter need to be accessed together under mutual exclusion
    from netif_receive_skb, we assume that this is only called from
    device napi_poll which is non-reentrant.

    This patch implements RFS for TCP and connected UDP sockets.
    It should be usable for other flow oriented protocols.

    There are two configuration parameters for RFS. The
    "rps_flow_entries" kernel init parameter sets the number of
    entries in the rps_sock_flow_table, the per rxqueue sysfs entry
    "rps_flow_cnt" contains the number of entries in the rps_dev_flow
    table for the rxqueue. Both are rounded to power of two.

    The obvious benefit of RFS (over just RPS) is that it achieves
    CPU locality between the receive processing for a flow and the
    applications processing; this can result in increased performance
    (higher pps, lower latency).

    The benefits of RFS are dependent on cache hierarchy, application
    load, and other factors. On simple benchmarks, we don't necessarily
    see improvement and sometimes see degradation. However, for more
    complex benchmarks and for applications where cache pressure is
    much higher this technique seems to perform very well.

    Below are some benchmark results which show the potential benfit of
    this patch. The netperf test has 500 instances of netperf TCP_RR
    test with 1 byte req. and resp. The RPC test is an request/response
    test similar in structure to netperf RR test ith 100 threads on
    each host, but does more work in userspace that netperf.

    e1000e on 8 core Intel
    No RFS or RPS 104K tps at 30% CPU
    No RFS (best RPS config): 290K tps at 63% CPU
    RFS 303K tps at 61% CPU

    RPC test tps CPU% 50/90/99% usec latency Latency StdDev
    No RFS/RPS 103K 48% 757/900/3185 4472.35
    RPS only: 174K 73% 415/993/2468 491.66
    RFS 223K 73% 379/651/1382 315.61

    Signed-off-by: Tom Herbert
    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Tom Herbert
     

16 Apr, 2010

7 commits


15 Apr, 2010

12 commits

  • Fix an oversight in ipmr_destroy_unres() - the net pointer is
    unconditionally initialized to NULL, resulting in a NULL pointer
    dereference later on.

    Fix by adding a net pointer to struct mr_table and using it in
    ipmr_destroy_unres().

    Signed-off-by: Patrick McHardy

    Patrick McHardy
     
  • The patch to convert struct mfc_cache to list_heads (ipv4: ipmr: convert
    struct mfc_cache to struct list_head) introduced a bug when adding new
    cache entries that don't match any unresolved entries.

    The unres queue is searched for a matching entry, which is then resolved.
    When no matching entry is present, the iterator points to the head of the
    list, but is treated as a matching entry. Use a seperate variable to
    indicate that a matching entry was found.

    Signed-off-by: Patrick McHardy

    Patrick McHardy
     
  • IP_MROUTE_MULTIPLE_TABLES should depend on IP_MROUTE.

    Signed-off-by: Patrick McHardy

    Patrick McHardy
     
  • Signed-off-by: Changli Gao
    Signed-off-by: David S. Miller

    Changli Gao
     
  • Eric Paris reported netif_rx() is calling smp_processor_id() from
    preemptible context, in particular when caller is
    ip_dev_loopback_xmit().

    RPS commit added this smp_processor_id() call, this patch makes sure
    preemption is disabled. rps_get_cpus() wants rcu_read_lock() anyway, we
    can dot it a bit earlier.

    Reported-by: Eric Paris
    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • David S. Miller
     
  • The ixgbe driver was setting up 82598 hardware correctly, so that
    when promiscuous mode was enabled hardware stripping was turned
    off. But on 82599 the logic to disable/enable hardware stripping
    is different, and the code was not updated correctly when the
    hardware vlan stripping was enabled as default.

    This change comprises the creation of two new helper functions
    and calling them from the right locations to disable and enable
    hardware stripping of vlan tags at appropriate times.

    Signed-off-by: Jesse Brandeburg
    Signed-off-by: Jeff Kirsher
    Signed-off-by: David S. Miller

    Jesse Brandeburg
     
  • replaces (skb->len - skb->data_len) occurrences by skb_headlen(skb)

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • A very useful information was provided by Sitecom R&D guys:

    Please find the information regarding our latest Ralink adapters below;

    WL-302 - VID: 0x0DF6, PID: 0x002D - Ralink RT2771
    WL-315 - VID: 0x0DF6, PID: 0x0039 - Ralink RT2770
    WL-319 - VID: 0x182D, PID: 0x0037 - Ralink RT2860
    WL-321 - VID: 0x0DF6, PID: 0x003B - Ralink RT2770
    WL-324 - VID: 0x0DF6, PID: 0x003D - Ralink RT2870
    WL-329 - VID: 0x0DF6, PID: 0x0041 - Ralink RT3572
    WL-343 - VID: 0x0DF6, PID: 0x003E - Ralink RT3070
    WL-344 - VID: 0x0DF6, PID: 0x0040 - Ralink RT3071
    WL-345 - VID: 0x0DF6, PID: 0x0042 - Ralink RT3072
    WL-608 - VID: 0x0DF6, PID: 0x003F - Ralink RT2070

    Note:
    PID: 0x003C, 0x004A, and 0x004D: --these products do not exist; devices were never produced/shipped--

    The WL-349v4 USB dongle (0x0df6,0x0050) will be shipped soon (it isn't available yet), and uses a Ralink RT3370 chipset.

    Signed-off-by: Xose Vazquez Perez
    Acked-by: Gertjan van Wingerde
    Signed-off-by: John W. Linville

    Xose Vazquez Perez
     
  • This patch adds the following 5 entries to the usbid device table:

    * Netgear WNA1000
    * Proxim ORiNOCO Dual Band 802.11n USB Adapter
    * 3Com Dual Band 802.11n USB Adapter
    * H3C Dual Band 802.11n USB Adapter
    * WNC Generic 11n USB dongle

    CC:
    Signed-off-by: Christian Lamparter
    Signed-off-by: John W. Linville

    Christian Lamparter
     
  • If EEPROM is used, NVS data is now loaded but ignored.
    Stop loading it to avoid need of dummy NVS file for modules with EEPROM.

    Signed-off-by: Grazvydas Ignotas
    Acked-by: Kalle Valo
    Signed-off-by: John W. Linville

    Grazvydas Ignotas
     
  • This patch fixes two warnings below after unplugging ar9271 usb device:
    -one is a kernel warning[1]
    -another is a lockdep warning[2]

    The root reason is that __skb_queue_purge can't be executed in hardirq
    context, so the patch forks ath9k_skb_queue_purge(ath9k version of _skb_queue_purge),
    which frees skb with dev_kfree_skb_any which can be run in hardirq
    context safely, then prevent the lockdep warning and kernel warning after
    unplugging ar9271 usb device.

    [1] kernel warning
    [ 602.894005] ------------[ cut here ]------------
    [ 602.894005] WARNING: at net/core/skbuff.c:398 skb_release_head_state+0x71/0x87()
    [ 602.894005] Hardware name: 6475EK2
    [ 602.894005] Modules linked in: ath9k_htc ath9k ath9k_common ath9k_hw ath bridge stp llc sunrpc ipv6 cpufreq_ondemand acpi_cpufreq freq_table kvm_intel kvm arc4 ecb mac80211 snd_hda_codec_conexant snd_hda_intel snd_hda_codec snd_hwdep thinkpad_acpi snd_pcm snd_timer hwmon iTCO_wdt snd e1000e pcspkr i2c_i801 usbhid iTCO_vendor_support wmi cfg80211 yenta_socket rsrc_nonstatic pata_acpi snd_page_alloc soundcore uhci_hcd ohci_hcd ehci_hcd usbcore i915 drm_kms_helper drm i2c_algo_bit i2c_core video output [last unloaded: ath]
    [ 602.894005] Pid: 2506, comm: ping Tainted: G W 2.6.34-rc3-wl #20
    [ 602.894005] Call Trace:
    [ 602.894005] [] warn_slowpath_common+0x7c/0x94
    [ 602.894005] [] ? __skb_queue_purge+0x43/0x4a [ath9k_htc]
    [ 602.894005] [] warn_slowpath_null+0x14/0x16
    [ 602.894005] [] skb_release_head_state+0x71/0x87
    [ 602.894005] [] __kfree_skb+0x16/0x81
    [ 602.894005] [] kfree_skb+0x7e/0x86
    [ 602.894005] [] __skb_queue_purge+0x43/0x4a [ath9k_htc]
    [ 602.894005] [] __hif_usb_tx+0x1c1/0x21b [ath9k_htc]
    [ 602.894005] [] hif_usb_tx_cb+0x12f/0x154 [ath9k_htc]
    [ 602.894005] [] usb_hcd_giveback_urb+0x91/0xc5 [usbcore]
    [ 602.894005] [] ehci_urb_done+0x7a/0x8b [ehci_hcd]
    [ 602.894005] [] qh_completions+0x2ee/0x376 [ehci_hcd]
    [ 602.894005] [] ehci_work+0x95/0x76e [ehci_hcd]
    [ 602.894005] [] ? ehci_irq+0x2f/0x1d4 [ehci_hcd]
    [ 602.894005] [] ehci_irq+0x1a6/0x1d4 [ehci_hcd]
    [ 602.894005] [] ? __rcu_process_callbacks+0x7a/0x2df
    [ 602.894005] [] ? handle_fasteoi_irq+0x22/0xd2
    [ 602.894005] [] usb_hcd_irq+0x4a/0xa7 [usbcore]
    [ 602.894005] [] handle_IRQ_event+0x77/0x14f
    [ 602.894005] [] ? skb_release_data+0xc9/0xce
    [ 602.894005] [] handle_fasteoi_irq+0x92/0xd2
    [ 602.894005] [] handle_irq+0x88/0x91
    [ 602.894005] [] do_IRQ+0x63/0xc9
    [ 602.894005] [] ? ip_flush_pending_frames+0x4d/0x5c
    [ 602.894005] [] ret_from_intr+0x0/0x16
    [ 602.894005] [] ? __delete_object+0x5a/0xb1
    [ 602.894005] [] ? _raw_write_unlock_irqrestore+0x47/0x7e
    [ 602.894005] [] ? _raw_write_unlock_irqrestore+0x4c/0x7e
    [ 602.894005] [] __delete_object+0x5a/0xb1
    [ 602.894005] [] delete_object_full+0x25/0x31
    [ 602.894005] [] kmemleak_free+0x26/0x45
    [ 602.894005] [] kfree+0xaa/0x149
    [ 602.894005] [] ? sock_def_write_space+0x84/0x89
    [ 602.894005] [] ? ip_flush_pending_frames+0x4d/0x5c
    [ 602.894005] [] skb_release_data+0xc9/0xce
    [ 602.894005] [] __kfree_skb+0x1e/0x81
    [ 602.894005] [] kfree_skb+0x7e/0x86
    [ 602.894005] [] ip_flush_pending_frames+0x4d/0x5c
    [ 602.894005] [] raw_sendmsg+0x653/0x709
    [ 602.894005] [] inet_sendmsg+0x54/0x5d
    [ 602.894005] [] ? sock_recvmsg+0xc6/0xdf
    [ 602.894005] [] sock_sendmsg+0xc0/0xd9
    [ 602.894005] [] ? might_fault+0x68/0xb8
    [ 602.894005] [] ? might_fault+0xb1/0xb8
    [ 602.894005] [] ? copy_from_user+0x2f/0x31
    [ 602.894005] [] ? verify_iovec+0x54/0x91
    [ 602.894005] [] sys_sendmsg+0x1da/0x241
    [ 602.894005] [] ? finish_task_switch+0x0/0xc9
    [ 602.894005] [] ? finish_task_switch+0x0/0xc9
    [ 602.894005] [] ? trace_hardirqs_on_caller+0x16/0x150
    [ 602.894005] [] ? _raw_spin_unlock_irq+0x56/0x63
    [ 602.894005] [] ? finish_task_switch+0xa4/0xc9
    [ 602.894005] [] ? finish_task_switch+0x0/0xc9
    [ 602.894005] [] ? need_resched+0x23/0x2d
    [ 602.894005] [] ? trace_hardirqs_on_caller+0x16/0x150
    [ 602.894005] [] ? trace_hardirqs_on_thunk+0x3a/0x3f
    [ 602.894005] [] system_call_fastpath+0x16/0x1b
    [ 602.894005] ---[ end trace 91ba2d8dc7826839 ]---

    [2] lockdep warning
    [ 169.363215] ======================================================
    [ 169.365390] [ INFO: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected ]
    [ 169.366334] 2.6.34-rc3-wl #20
    [ 169.366872] ------------------------------------------------------
    [ 169.366872] khubd/78 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire:
    [ 169.366872] (clock-AF_INET){++.?..}, at: [] sock_def_write_space+0x1e/0x89
    [ 169.366872]
    [ 169.366872] and this task is already holding:
    [ 169.366872] (&(&hif_dev->tx.tx_lock)->rlock){-.-...}, at: [] hif_usb_stop+0x24/0x53 [ath9k_htc]
    [ 169.366872] which would create a new lock dependency:
    [ 169.366872] (&(&hif_dev->tx.tx_lock)->rlock){-.-...} -> (clock-AF_INET){++.?..}
    [ 169.366872]
    [ 169.366872] but this new dependency connects a HARDIRQ-irq-safe lock:
    [ 169.366872] (&(&hif_dev->tx.tx_lock)->rlock){-.-...}
    [ 169.366872] ... which became HARDIRQ-irq-safe at:
    [ 169.366872] [] __lock_acquire+0x2c6/0xd2b
    [ 169.366872] [] lock_acquire+0xec/0x119
    [ 169.366872] [] _raw_spin_lock+0x40/0x73
    [ 169.366872] [] hif_usb_tx_cb+0x5e/0x154 [ath9k_htc]
    [ 169.366872] [] usb_hcd_giveback_urb+0x91/0xc5 [usbcore]
    [ 169.366872] [] ehci_urb_done+0x7a/0x8b [ehci_hcd]
    [ 169.366872] [] qh_completions+0x2ee/0x376 [ehci_hcd]
    [ 169.366872] [] ehci_work+0x95/0x76e [ehci_hcd]
    [ 169.366872] [] ehci_irq+0x1a6/0x1d4 [ehci_hcd]
    [ 169.366872] [] usb_hcd_irq+0x4a/0xa7 [usbcore]
    [ 169.366872] [] handle_IRQ_event+0x77/0x14f
    [ 169.366872] [] handle_fasteoi_irq+0x92/0xd2
    [ 169.366872] [] handle_irq+0x88/0x91
    [ 169.366872] [] do_IRQ+0x63/0xc9
    [ 169.366872] [] ret_from_intr+0x0/0x16
    [ 169.366872] [] cpuidle_idle_call+0xa7/0x115
    [ 169.366872] [] cpu_idle+0x68/0xc4
    [ 169.366872] [] rest_init+0x104/0x10b
    [ 169.366872] [] start_kernel+0x3f1/0x3fc
    [ 169.366872] [] x86_64_start_reservations+0xb3/0xb7
    [ 169.366872] [] x86_64_start_kernel+0xf8/0x107
    [ 169.366872]
    [ 169.366872] to a HARDIRQ-irq-unsafe lock:
    [ 169.366872] (clock-AF_INET){++.?..}
    [ 169.366872] ... which became HARDIRQ-irq-unsafe at:
    [ 169.366872] ... [] __lock_acquire+0x33a/0xd2b
    [ 169.366872] [] lock_acquire+0xec/0x119
    [ 169.366872] [] _raw_write_lock_bh+0x45/0x7a
    [ 169.366872] [] tcp_close+0x165/0x34d
    [ 169.366872] [] inet_release+0x55/0x5c
    [ 169.366872] [] sock_release+0x1f/0x6e
    [ 169.366872] [] sock_close+0x27/0x2b
    [ 169.366872] [] __fput+0x125/0x1ca
    [ 169.366872] [] fput+0x1a/0x1c
    [ 169.366872] [] filp_close+0x68/0x72
    [ 169.366872] [] sys_close+0xad/0xe7
    [ 169.366872] [] system_call_fastpath+0x16/0x1b

    (Trimmed at the "other info that might help us debug this" line in
    the interest of brevity... -- JWL)

    Signed-off-by: Ming Lei
    Acked-by: Sujith
    Signed-off-by: John W. Linville

    Ming Lei