@@ -4954,6 +4954,9 @@ void __weak pcibios_reset_secondary_bus(struct pci_dev *dev)
4954
4954
int pci_bridge_secondary_bus_reset (struct pci_dev * dev )
4955
4955
{
4956
4956
lock_map_assert_held (& dev -> cfg_access_lock );
4957
+ if (!dev -> block_cfg_access )
4958
+ pci_warn_once (dev , "unlocked secondary bus reset via: %pS\n" ,
4959
+ __builtin_return_address (0 ));
4957
4960
pcibios_reset_secondary_bus (dev );
4958
4961
4959
4962
return pci_bridge_wait_for_secondary_bus (dev , "bus reset" );
@@ -5512,10 +5515,12 @@ static void pci_bus_lock(struct pci_bus *bus)
5512
5515
{
5513
5516
struct pci_dev * dev ;
5514
5517
5518
+ pci_dev_lock (bus -> self );
5515
5519
list_for_each_entry (dev , & bus -> devices , bus_list ) {
5516
- pci_dev_lock (dev );
5517
5520
if (dev -> subordinate )
5518
5521
pci_bus_lock (dev -> subordinate );
5522
+ else
5523
+ pci_dev_lock (dev );
5519
5524
}
5520
5525
}
5521
5526
@@ -5527,33 +5532,37 @@ static void pci_bus_unlock(struct pci_bus *bus)
5527
5532
list_for_each_entry (dev , & bus -> devices , bus_list ) {
5528
5533
if (dev -> subordinate )
5529
5534
pci_bus_unlock (dev -> subordinate );
5530
- pci_dev_unlock (dev );
5535
+ else
5536
+ pci_dev_unlock (dev );
5531
5537
}
5538
+ pci_dev_unlock (bus -> self );
5532
5539
}
5533
5540
5534
5541
/* Return 1 on successful lock, 0 on contention */
5535
5542
static int pci_bus_trylock (struct pci_bus * bus )
5536
5543
{
5537
5544
struct pci_dev * dev ;
5538
5545
5546
+ if (!pci_dev_trylock (bus -> self ))
5547
+ return 0 ;
5548
+
5539
5549
list_for_each_entry (dev , & bus -> devices , bus_list ) {
5540
- if (!pci_dev_trylock (dev ))
5541
- goto unlock ;
5542
5550
if (dev -> subordinate ) {
5543
- if (!pci_bus_trylock (dev -> subordinate )) {
5544
- pci_dev_unlock (dev );
5551
+ if (!pci_bus_trylock (dev -> subordinate ))
5545
5552
goto unlock ;
5546
- }
5547
- }
5553
+ } else if (! pci_dev_trylock ( dev ))
5554
+ goto unlock ;
5548
5555
}
5549
5556
return 1 ;
5550
5557
5551
5558
unlock :
5552
5559
list_for_each_entry_continue_reverse (dev , & bus -> devices , bus_list ) {
5553
5560
if (dev -> subordinate )
5554
5561
pci_bus_unlock (dev -> subordinate );
5555
- pci_dev_unlock (dev );
5562
+ else
5563
+ pci_dev_unlock (dev );
5556
5564
}
5565
+ pci_dev_unlock (bus -> self );
5557
5566
return 0 ;
5558
5567
}
5559
5568
@@ -5585,9 +5594,10 @@ static void pci_slot_lock(struct pci_slot *slot)
5585
5594
list_for_each_entry (dev , & slot -> bus -> devices , bus_list ) {
5586
5595
if (!dev -> slot || dev -> slot != slot )
5587
5596
continue ;
5588
- pci_dev_lock (dev );
5589
5597
if (dev -> subordinate )
5590
5598
pci_bus_lock (dev -> subordinate );
5599
+ else
5600
+ pci_dev_lock (dev );
5591
5601
}
5592
5602
}
5593
5603
@@ -5613,14 +5623,13 @@ static int pci_slot_trylock(struct pci_slot *slot)
5613
5623
list_for_each_entry (dev , & slot -> bus -> devices , bus_list ) {
5614
5624
if (!dev -> slot || dev -> slot != slot )
5615
5625
continue ;
5616
- if (!pci_dev_trylock (dev ))
5617
- goto unlock ;
5618
5626
if (dev -> subordinate ) {
5619
5627
if (!pci_bus_trylock (dev -> subordinate )) {
5620
5628
pci_dev_unlock (dev );
5621
5629
goto unlock ;
5622
5630
}
5623
- }
5631
+ } else if (!pci_dev_trylock (dev ))
5632
+ goto unlock ;
5624
5633
}
5625
5634
return 1 ;
5626
5635
@@ -5631,7 +5640,8 @@ static int pci_slot_trylock(struct pci_slot *slot)
5631
5640
continue ;
5632
5641
if (dev -> subordinate )
5633
5642
pci_bus_unlock (dev -> subordinate );
5634
- pci_dev_unlock (dev );
5643
+ else
5644
+ pci_dev_unlock (dev );
5635
5645
}
5636
5646
return 0 ;
5637
5647
}
0 commit comments