Skip to content

Commit d6c36cb

Browse files
Sebastian Andrzej Siewiorkuba-moo
authored andcommitted
r8169: Use a raw_spinlock_t for the register locks.
The driver's interrupt service routine is requested with the IRQF_NO_THREAD if MSI is available. This means that the routine is invoked in hardirq context even on PREEMPT_RT. The routine itself is relatively short and schedules a worker, performs register access and schedules NAPI. On PREEMPT_RT, scheduling NAPI from hardirq results in waking ksoftirqd for further processing so using NAPI threads with this driver is highly recommended since it NULL routes the threaded-IRQ efforts. Adding rtl_hw_aspm_clkreq_enable() to the ISR is problematic on PREEMPT_RT because the function uses spinlock_t locks which become sleeping locks on PREEMPT_RT. The locks are only used to protect register access and don't nest into other functions or locks. They are also not used for unbounded period of time. Therefore it looks okay to convert them to raw_spinlock_t. Convert the three locks which are used from the interrupt service routine to raw_spinlock_t. Fixes: e1ed3e4 ("r8169: disable ASPM during NAPI poll") Signed-off-by: Sebastian Andrzej Siewior <[email protected]> Reviewed-by: Heiner Kallweit <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 368d3cb commit d6c36cb

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

drivers/net/ethernet/realtek/r8169_main.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -616,10 +616,10 @@ struct rtl8169_private {
616616
struct work_struct work;
617617
} wk;
618618

619-
spinlock_t config25_lock;
620-
spinlock_t mac_ocp_lock;
619+
raw_spinlock_t config25_lock;
620+
raw_spinlock_t mac_ocp_lock;
621621

622-
spinlock_t cfg9346_usage_lock;
622+
raw_spinlock_t cfg9346_usage_lock;
623623
int cfg9346_usage_count;
624624

625625
unsigned supports_gmii:1;
@@ -671,20 +671,20 @@ static void rtl_lock_config_regs(struct rtl8169_private *tp)
671671
{
672672
unsigned long flags;
673673

674-
spin_lock_irqsave(&tp->cfg9346_usage_lock, flags);
674+
raw_spin_lock_irqsave(&tp->cfg9346_usage_lock, flags);
675675
if (!--tp->cfg9346_usage_count)
676676
RTL_W8(tp, Cfg9346, Cfg9346_Lock);
677-
spin_unlock_irqrestore(&tp->cfg9346_usage_lock, flags);
677+
raw_spin_unlock_irqrestore(&tp->cfg9346_usage_lock, flags);
678678
}
679679

680680
static void rtl_unlock_config_regs(struct rtl8169_private *tp)
681681
{
682682
unsigned long flags;
683683

684-
spin_lock_irqsave(&tp->cfg9346_usage_lock, flags);
684+
raw_spin_lock_irqsave(&tp->cfg9346_usage_lock, flags);
685685
if (!tp->cfg9346_usage_count++)
686686
RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
687-
spin_unlock_irqrestore(&tp->cfg9346_usage_lock, flags);
687+
raw_spin_unlock_irqrestore(&tp->cfg9346_usage_lock, flags);
688688
}
689689

690690
static void rtl_pci_commit(struct rtl8169_private *tp)
@@ -698,21 +698,21 @@ static void rtl_mod_config2(struct rtl8169_private *tp, u8 clear, u8 set)
698698
unsigned long flags;
699699
u8 val;
700700

701-
spin_lock_irqsave(&tp->config25_lock, flags);
701+
raw_spin_lock_irqsave(&tp->config25_lock, flags);
702702
val = RTL_R8(tp, Config2);
703703
RTL_W8(tp, Config2, (val & ~clear) | set);
704-
spin_unlock_irqrestore(&tp->config25_lock, flags);
704+
raw_spin_unlock_irqrestore(&tp->config25_lock, flags);
705705
}
706706

707707
static void rtl_mod_config5(struct rtl8169_private *tp, u8 clear, u8 set)
708708
{
709709
unsigned long flags;
710710
u8 val;
711711

712-
spin_lock_irqsave(&tp->config25_lock, flags);
712+
raw_spin_lock_irqsave(&tp->config25_lock, flags);
713713
val = RTL_R8(tp, Config5);
714714
RTL_W8(tp, Config5, (val & ~clear) | set);
715-
spin_unlock_irqrestore(&tp->config25_lock, flags);
715+
raw_spin_unlock_irqrestore(&tp->config25_lock, flags);
716716
}
717717

718718
static bool rtl_is_8125(struct rtl8169_private *tp)
@@ -899,9 +899,9 @@ static void r8168_mac_ocp_write(struct rtl8169_private *tp, u32 reg, u32 data)
899899
{
900900
unsigned long flags;
901901

902-
spin_lock_irqsave(&tp->mac_ocp_lock, flags);
902+
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
903903
__r8168_mac_ocp_write(tp, reg, data);
904-
spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
904+
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
905905
}
906906

907907
static u16 __r8168_mac_ocp_read(struct rtl8169_private *tp, u32 reg)
@@ -919,9 +919,9 @@ static u16 r8168_mac_ocp_read(struct rtl8169_private *tp, u32 reg)
919919
unsigned long flags;
920920
u16 val;
921921

922-
spin_lock_irqsave(&tp->mac_ocp_lock, flags);
922+
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
923923
val = __r8168_mac_ocp_read(tp, reg);
924-
spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
924+
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
925925

926926
return val;
927927
}
@@ -932,10 +932,10 @@ static void r8168_mac_ocp_modify(struct rtl8169_private *tp, u32 reg, u16 mask,
932932
unsigned long flags;
933933
u16 data;
934934

935-
spin_lock_irqsave(&tp->mac_ocp_lock, flags);
935+
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
936936
data = __r8168_mac_ocp_read(tp, reg);
937937
__r8168_mac_ocp_write(tp, reg, (data & ~mask) | set);
938-
spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
938+
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
939939
}
940940

941941
/* Work around a hw issue with RTL8168g PHY, the quirk disables
@@ -1420,14 +1420,14 @@ static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
14201420
r8168_mac_ocp_modify(tp, 0xc0b6, BIT(0), 0);
14211421
}
14221422

1423-
spin_lock_irqsave(&tp->config25_lock, flags);
1423+
raw_spin_lock_irqsave(&tp->config25_lock, flags);
14241424
for (i = 0; i < tmp; i++) {
14251425
options = RTL_R8(tp, cfg[i].reg) & ~cfg[i].mask;
14261426
if (wolopts & cfg[i].opt)
14271427
options |= cfg[i].mask;
14281428
RTL_W8(tp, cfg[i].reg, options);
14291429
}
1430-
spin_unlock_irqrestore(&tp->config25_lock, flags);
1430+
raw_spin_unlock_irqrestore(&tp->config25_lock, flags);
14311431

14321432
switch (tp->mac_version) {
14331433
case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
@@ -5179,9 +5179,9 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
51795179
tp->eee_adv = -1;
51805180
tp->ocp_base = OCP_STD_PHY_BASE;
51815181

5182-
spin_lock_init(&tp->cfg9346_usage_lock);
5183-
spin_lock_init(&tp->config25_lock);
5184-
spin_lock_init(&tp->mac_ocp_lock);
5182+
raw_spin_lock_init(&tp->cfg9346_usage_lock);
5183+
raw_spin_lock_init(&tp->config25_lock);
5184+
raw_spin_lock_init(&tp->mac_ocp_lock);
51855185

51865186
dev->tstats = devm_netdev_alloc_pcpu_stats(&pdev->dev,
51875187
struct pcpu_sw_netstats);

0 commit comments

Comments
 (0)