Skip to content
  • Thomas Gleixner's avatar
    PCI: Replace the racy recursion prevention · 0b2c2a71
    Thomas Gleixner authored
    
    
    pci_call_probe() can called recursively when a physcial function is probed
    and the probing creates virtual functions, which are populated via
    pci_bus_add_device() which in turn can end up calling pci_call_probe()
    again.
    
    The code has an interesting way to prevent recursing into the workqueue
    code.  That's accomplished by a check whether the current task runs already
    on the numa node which is associated with the device.
    
    While that works to prevent the recursion into the workqueue code, it's
    racy versus normal execution as there is no guarantee that the node does
    not vanish after the check.
    
    There is another issue with this code. It dereferences cpumask_of_node()
    unconditionally without checking whether the node is available.
    
    Make the detection reliable by:
    
     - Mark a probed device as 'is_probed' in pci_call_probe()
     
     - Check in pci_call_probe for a virtual function. If it's a virtual
       function and the associated physical function device is marked
       'is_probed' then this is a recursive call, so the call can be invoked in
       the calling context.
    
     - Add a check whether the node is online before dereferencing it.
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Acked-by: default avatarIngo Molnar <mingo@kernel.org>
    Acked-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: linux-pci@vger.kernel.org
    Cc: Sebastian Siewior <bigeasy@linutronix.de>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Link: http://lkml.kernel.org/r/20170524081548.771457199@linutronix.de
    0b2c2a71