https://github.com/torvalds/linux
Revision 44bda4b7d26e9fffed6d7152d98a2e9edaeb2a76 authored by Hari Vyas on 03 July 2018, 09:05:41 UTC, committed by Bjorn Helgaas on 31 July 2018, 16:27:54 UTC
When a PCI device is detected, pdev->is_added is set to 1 and proc and sysfs entries are created. When the device is removed, pdev->is_added is checked for one and then device is detached with clearing of proc and sys entries and at end, pdev->is_added is set to 0. is_added and is_busmaster are bit fields in pci_dev structure sharing same memory location. A strange issue was observed with multiple removal and rescan of a PCIe NVMe device using sysfs commands where is_added flag was observed as zero instead of one while removing device and proc,sys entries are not cleared. This causes issue in later device addition with warning message "proc_dir_entry" already registered. Debugging revealed a race condition between the PCI core setting the is_added bit in pci_bus_add_device() and the NVMe driver reset work-queue setting the is_busmaster bit in pci_set_master(). As these fields are not handled atomically, that clears the is_added bit. Move the is_added bit to a separate private flag variable and use atomic functions to set and retrieve the device addition state. This avoids the race because is_added no longer shares a memory location with is_busmaster. Link: https://bugzilla.kernel.org/show_bug.cgi?id=200283 Signed-off-by: Hari Vyas <hari.vyas@broadcom.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Lukas Wunner <lukas@wunner.de> Acked-by: Michael Ellerman <mpe@ellerman.id.au>
1 parent a54e43f
Tip revision: 44bda4b7d26e9fffed6d7152d98a2e9edaeb2a76 authored by Hari Vyas on 03 July 2018, 09:05:41 UTC
PCI: Fix is_added/is_busmaster race condition
PCI: Fix is_added/is_busmaster race condition
Tip revision: 44bda4b
File | Mode | Size |
---|---|---|
6fire | ||
bcd2000 | ||
caiaq | ||
hiface | ||
line6 | ||
misc | ||
usx2y | ||
Kconfig | -rw-r--r-- | 4.6 KB |
Makefile | -rw-r--r-- | 654 bytes |
card.c | -rw-r--r-- | 24.0 KB |
card.h | -rw-r--r-- | 6.7 KB |
clock.c | -rw-r--r-- | 16.3 KB |
clock.h | -rw-r--r-- | 392 bytes |
debug.h | -rw-r--r-- | 301 bytes |
endpoint.c | -rw-r--r-- | 33.0 KB |
endpoint.h | -rw-r--r-- | 1.4 KB |
format.c | -rw-r--r-- | 15.6 KB |
format.h | -rw-r--r-- | 489 bytes |
helper.c | -rw-r--r-- | 3.1 KB |
helper.h | -rw-r--r-- | 1.1 KB |
midi.c | -rw-r--r-- | 68.9 KB |
midi.h | -rw-r--r-- | 1.9 KB |
mixer.c | -rw-r--r-- | 91.5 KB |
mixer.h | -rw-r--r-- | 3.2 KB |
mixer_maps.c | -rw-r--r-- | 15.9 KB |
mixer_quirks.c | -rw-r--r-- | 51.7 KB |
mixer_quirks.h | -rw-r--r-- | 655 bytes |
mixer_scarlett.c | -rw-r--r-- | 28.1 KB |
mixer_scarlett.h | -rw-r--r-- | 208 bytes |
mixer_us16x08.c | -rw-r--r-- | 37.6 KB |
mixer_us16x08.h | -rw-r--r-- | 4.0 KB |
pcm.c | -rw-r--r-- | 48.6 KB |
pcm.h | -rw-r--r-- | 483 bytes |
power.h | -rw-r--r-- | 414 bytes |
proc.c | -rw-r--r-- | 6.0 KB |
proc.h | -rw-r--r-- | 250 bytes |
quirks-table.h | -rw-r--r-- | 79.5 KB |
quirks.c | -rw-r--r-- | 44.3 KB |
quirks.h | -rw-r--r-- | 1.5 KB |
stream.c | -rw-r--r-- | 30.0 KB |
stream.h | -rw-r--r-- | 325 bytes |
usbaudio.h | -rw-r--r-- | 3.7 KB |
Computing file changes ...