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
History
Tip revision: 44bda4b7d26e9fffed6d7152d98a2e9edaeb2a76 authored by Hari Vyas on 03 July 2018, 09:05:41 UTC
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

back to top