Message ID | 20230625182327.984115-1-moritzf@google.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next,v2] net: lan743x: Don't sleep in atomic context | expand |
On Sun, 25 Jun 2023 18:23:27 +0000 Moritz Fischer wrote: > dev_set_rx_mode() grabs a spin_lock, and the lan743x implementation > proceeds subsequently to go to sleep using readx_poll_timeout(). > > Introduce a helper wrapping the readx_poll_timeout_atomic() function > and use it to replace the calls to readx_polL_timeout(). > > Signed-off-by: Moritz Fischer <moritzf@google.com> > --- > > Changes from v1: > - Added line-breaks > - Changed subject to target net-next > - Removed Tested-by: tag Sleeping in atomic context is a bug, this is a bug fix. You should add a Fixes tag (probably 23f0703c125be AFAICT) and target the patch at net rather than net-next. Make sure you CC the authors of the patch under fixes (get_maintainer will point them out if run on a patch file with a Fixes tag) One more nit below... > drivers/net/ethernet/microchip/lan743x_main.c | 22 +++++++++++++++---- > 1 file changed, 18 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c > index f1bded993edc..4f277ffff1dc 100644 > --- a/drivers/net/ethernet/microchip/lan743x_main.c > +++ b/drivers/net/ethernet/microchip/lan743x_main.c > @@ -144,6 +144,19 @@ static int lan743x_csr_light_reset(struct lan743x_adapter *adapter) > !(data & HW_CFG_LRST_), 100000, 10000000); > } > > +static int lan743x_csr_wait_for_bit_atomic(struct lan743x_adapter *adapter, > + int offset, u32 bit_mask, > + int target_value, int udelay_min, > + int udelay_max, int count) > +{ > + u32 data; > + > + return readx_poll_timeout_atomic(LAN743X_CSR_READ_OP, offset, data, > + target_value == ((data & bit_mask) ? > + 1 : 0), udelay_max, You can save the awkward wrapping by using a double negation: target_value == !!(data & bit_mask) this is a fairly common form in the kernel.
diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c index f1bded993edc..4f277ffff1dc 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -144,6 +144,19 @@ static int lan743x_csr_light_reset(struct lan743x_adapter *adapter) !(data & HW_CFG_LRST_), 100000, 10000000); } +static int lan743x_csr_wait_for_bit_atomic(struct lan743x_adapter *adapter, + int offset, u32 bit_mask, + int target_value, int udelay_min, + int udelay_max, int count) +{ + u32 data; + + return readx_poll_timeout_atomic(LAN743X_CSR_READ_OP, offset, data, + target_value == ((data & bit_mask) ? + 1 : 0), udelay_max, + udelay_min * count); +} + static int lan743x_csr_wait_for_bit(struct lan743x_adapter *adapter, int offset, u32 bit_mask, int target_value, int usleep_min, @@ -736,8 +749,8 @@ static int lan743x_dp_write(struct lan743x_adapter *adapter, u32 dp_sel; int i; - if (lan743x_csr_wait_for_bit(adapter, DP_SEL, DP_SEL_DPRDY_, - 1, 40, 100, 100)) + if (lan743x_csr_wait_for_bit_atomic(adapter, DP_SEL, DP_SEL_DPRDY_, + 1, 40, 100, 100)) return -EIO; dp_sel = lan743x_csr_read(adapter, DP_SEL); dp_sel &= ~DP_SEL_MASK_; @@ -748,8 +761,9 @@ static int lan743x_dp_write(struct lan743x_adapter *adapter, lan743x_csr_write(adapter, DP_ADDR, addr + i); lan743x_csr_write(adapter, DP_DATA_0, buf[i]); lan743x_csr_write(adapter, DP_CMD, DP_CMD_WRITE_); - if (lan743x_csr_wait_for_bit(adapter, DP_SEL, DP_SEL_DPRDY_, - 1, 40, 100, 100)) + if (lan743x_csr_wait_for_bit_atomic(adapter, DP_SEL, + DP_SEL_DPRDY_, + 1, 40, 100, 100)) return -EIO; }
dev_set_rx_mode() grabs a spin_lock, and the lan743x implementation proceeds subsequently to go to sleep using readx_poll_timeout(). Introduce a helper wrapping the readx_poll_timeout_atomic() function and use it to replace the calls to readx_polL_timeout(). Signed-off-by: Moritz Fischer <moritzf@google.com> --- Changes from v1: - Added line-breaks - Changed subject to target net-next - Removed Tested-by: tag --- drivers/net/ethernet/microchip/lan743x_main.c | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)