• Andrei Vagin's avatar
    net: allow to call netif_reset_xps_queues() under cpus_read_lock · 4d99f660
    Andrei Vagin authored
    The definition of static_key_slow_inc() has cpus_read_lock in place. In the
    virtio_net driver, XPS queues are initialized after setting the queue:cpu
    affinity in virtnet_set_affinity() which is already protected within
    cpus_read_lock. Lockdep prints a warning when we are trying to acquire
    cpus_read_lock when it is already held.
    
    This patch adds an ability to call __netif_set_xps_queue under
    cpus_read_lock().
    Acked-by: default avatarJason Wang <jasowang@redhat.com>
    
    ============================================
    WARNING: possible recursive locking detected
    4.18.0-rc3-next-20180703+ #1 Not tainted
    --------------------------------------------
    swapper/0/1 is trying to acquire lock:
    00000000cf973d46 (cpu_hotplug_lock.rw_sem){++++}, at: static_key_slow_inc+0xe/0x20
    
    but task is already holding lock:
    00000000cf973d46 (cpu_hotplug_lock.rw_sem){++++}, at: init_vqs+0x513/0x5a0
    
    other info that might help us debug this:
     Possible unsafe locking scenario:
    
           CPU0
           ----
      lock(cpu_hotplug_lock.rw_sem);
      lock(cpu_hotplug_lock.rw_sem);
    
     *** DEADLOCK ***
    
     May be due to missing lock nesting notation
    
    3 locks held by swapper/0/1:
     #0: 00000000244bc7da (&dev->mutex){....}, at: __driver_attach+0x5a/0x110
     #1: 00000000cf973d46 (cpu_hotplug_lock.rw_sem){++++}, at: init_vqs+0x513/0x5a0
     #2: 000000005cd8463f (xps_map_mutex){+.+.}, at: __netif_set_xps_queue+0x8d/0xc60
    
    v2: move cpus_read_lock() out of __netif_set_xps_queue()
    
    Cc: "Nambiar, Amritha" <amritha.nambiar@intel.com>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Jason Wang <jasowang@redhat.com>
    Fixes: 8af2c06f ("net-sysfs: Add interface for Rx queue(s) map per Tx queue")
    Signed-off-by: default avatarAndrei Vagin <avagin@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    4d99f660
dev.c 240 KB