* [PATCH net-next v2] net: lan743x: Don't sleep in atomic context
@ 2023-06-25 18:23 Moritz Fischer
2023-06-26 20:10 ` Jakub Kicinski
0 siblings, 1 reply; 2+ messages in thread
From: Moritz Fischer @ 2023-06-25 18:23 UTC (permalink / raw)
To: netdev
Cc: pabeni, kuba, edumazet, davem, bryan.whitehead, UNGLinuxDriver,
mdf, Moritz Fischer
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(-)
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;
}
--
2.41.0.178.g377b9f9a00-goog
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH net-next v2] net: lan743x: Don't sleep in atomic context
2023-06-25 18:23 [PATCH net-next v2] net: lan743x: Don't sleep in atomic context Moritz Fischer
@ 2023-06-26 20:10 ` Jakub Kicinski
0 siblings, 0 replies; 2+ messages in thread
From: Jakub Kicinski @ 2023-06-26 20:10 UTC (permalink / raw)
To: Moritz Fischer
Cc: netdev, pabeni, edumazet, davem, bryan.whitehead, UNGLinuxDriver,
mdf
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.
--
pw-bot: cr
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-06-26 20:10 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-25 18:23 [PATCH net-next v2] net: lan743x: Don't sleep in atomic context Moritz Fischer
2023-06-26 20:10 ` Jakub Kicinski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).