[PATCH] pci: lock the pci_cfg_wait queue for the consistency of data

From: Xiang Zheng
Date: Mon Oct 28 2019 - 09:30:21 EST

Commit "7ea7e98fd8d0" suggests that the "pci_lock" is sufficient,
and all the callers of pci_wait_cfg() are wrapped with the "pci_lock".

However, since the commit "cdcb33f98244" merged, the accesses to
the pci_cfg_wait queue are not safe anymore. A "pci_lock" is
insufficient and we need to hold an additional queue lock while
read/write the wait queue.

So let's use the add_wait_queue()/remove_wait_queue() instead of

Signed-off-by: Xiang Zheng <zhengxiang9@xxxxxxxxxx>
Cc: Heyi Guo <guoheyi@xxxxxxxxxx>
Cc: Biaoxiang Ye <yebiaoxiang@xxxxxxxxxx>
Cc: Xiongfeng Wang <wangxiongfeng2@xxxxxxxxxx>
drivers/pci/access.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/access.c b/drivers/pci/access.c
index 2fccb5762c76..247bf36e0047 100644
--- a/drivers/pci/access.c
+++ b/drivers/pci/access.c
@@ -207,14 +207,14 @@ static noinline void pci_wait_cfg(struct pci_dev *dev)
DECLARE_WAITQUEUE(wait, current);

- __add_wait_queue(&pci_cfg_wait, &wait);
+ add_wait_queue(&pci_cfg_wait, &wait);
do {
} while (dev->block_cfg_access);
- __remove_wait_queue(&pci_cfg_wait, &wait);
+ remove_wait_queue(&pci_cfg_wait, &wait);

/* Returns 0 on success, negative values indicate error. */