@@ -5360,10 +5360,12 @@ static void pci_bus_lock(struct pci_bus *bus)
53605360{
53615361 struct pci_dev * dev ;
53625362
5363+ pci_dev_lock (bus -> self );
53635364 list_for_each_entry (dev , & bus -> devices , bus_list ) {
5364- pci_dev_lock (dev );
53655365 if (dev -> subordinate )
53665366 pci_bus_lock (dev -> subordinate );
5367+ else
5368+ pci_dev_lock (dev );
53675369 }
53685370}
53695371
@@ -5375,33 +5377,37 @@ static void pci_bus_unlock(struct pci_bus *bus)
53755377 list_for_each_entry (dev , & bus -> devices , bus_list ) {
53765378 if (dev -> subordinate )
53775379 pci_bus_unlock (dev -> subordinate );
5378- pci_dev_unlock (dev );
5380+ else
5381+ pci_dev_unlock (dev );
53795382 }
5383+ pci_dev_unlock (bus -> self );
53805384}
53815385
53825386/* Return 1 on successful lock, 0 on contention */
53835387static int pci_bus_trylock (struct pci_bus * bus )
53845388{
53855389 struct pci_dev * dev ;
53865390
5391+ if (!pci_dev_trylock (bus -> self ))
5392+ return 0 ;
5393+
53875394 list_for_each_entry (dev , & bus -> devices , bus_list ) {
5388- if (!pci_dev_trylock (dev ))
5389- goto unlock ;
53905395 if (dev -> subordinate ) {
5391- if (!pci_bus_trylock (dev -> subordinate )) {
5392- pci_dev_unlock (dev );
5396+ if (!pci_bus_trylock (dev -> subordinate ))
53935397 goto unlock ;
5394- }
5395- }
5398+ } else if (! pci_dev_trylock ( dev ))
5399+ goto unlock ;
53965400 }
53975401 return 1 ;
53985402
53995403unlock :
54005404 list_for_each_entry_continue_reverse (dev , & bus -> devices , bus_list ) {
54015405 if (dev -> subordinate )
54025406 pci_bus_unlock (dev -> subordinate );
5403- pci_dev_unlock (dev );
5407+ else
5408+ pci_dev_unlock (dev );
54045409 }
5410+ pci_dev_unlock (bus -> self );
54055411 return 0 ;
54065412}
54075413
@@ -5433,9 +5439,10 @@ static void pci_slot_lock(struct pci_slot *slot)
54335439 list_for_each_entry (dev , & slot -> bus -> devices , bus_list ) {
54345440 if (!dev -> slot || dev -> slot != slot )
54355441 continue ;
5436- pci_dev_lock (dev );
54375442 if (dev -> subordinate )
54385443 pci_bus_lock (dev -> subordinate );
5444+ else
5445+ pci_dev_lock (dev );
54395446 }
54405447}
54415448
@@ -5461,14 +5468,13 @@ static int pci_slot_trylock(struct pci_slot *slot)
54615468 list_for_each_entry (dev , & slot -> bus -> devices , bus_list ) {
54625469 if (!dev -> slot || dev -> slot != slot )
54635470 continue ;
5464- if (!pci_dev_trylock (dev ))
5465- goto unlock ;
54665471 if (dev -> subordinate ) {
54675472 if (!pci_bus_trylock (dev -> subordinate )) {
54685473 pci_dev_unlock (dev );
54695474 goto unlock ;
54705475 }
5471- }
5476+ } else if (!pci_dev_trylock (dev ))
5477+ goto unlock ;
54725478 }
54735479 return 1 ;
54745480
@@ -5479,7 +5485,8 @@ static int pci_slot_trylock(struct pci_slot *slot)
54795485 continue ;
54805486 if (dev -> subordinate )
54815487 pci_bus_unlock (dev -> subordinate );
5482- pci_dev_unlock (dev );
5488+ else
5489+ pci_dev_unlock (dev );
54835490 }
54845491 return 0 ;
54855492}
0 commit comments