diff mbox series

mwifiex: Do not use GFP_KERNEL in atomic context

Message ID 20200809092906.744621-1-christophe.jaillet@wanadoo.fr (mailing list archive)
State Accepted
Commit d2ab7f00f4321370a8ee14e5630d4349fdacc42e
Delegated to: Kalle Valo
Headers show
Series mwifiex: Do not use GFP_KERNEL in atomic context | expand

Commit Message

Christophe JAILLET Aug. 9, 2020, 9:29 a.m. UTC
A possible call chain is as follow:
  mwifiex_sdio_interrupt                            (sdio.c)
    --> mwifiex_main_process                        (main.c)
      --> mwifiex_process_cmdresp                   (cmdevt.c)
        --> mwifiex_process_sta_cmdresp             (sta_cmdresp.c)
          --> mwifiex_ret_802_11_scan               (scan.c)
            --> mwifiex_parse_single_response_buf   (scan.c)

'mwifiex_sdio_interrupt()' is an interrupt function.

Also note that 'mwifiex_ret_802_11_scan()' already uses GFP_ATOMIC.

So use GFP_ATOMIC instead of GFP_KERNEL when memory is allocated in
'mwifiex_parse_single_response_buf()'.

Fixes: 7c6fa2a843c5 ("mwifiex: use cfg80211 dynamic scan table and cfg80211_get_bss API")
or
Fixes: 601216e12c65e ("mwifiex: process RX packets in SDIO IRQ thread directly")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
This is completely speculative. I don't know if the call chain given above
if possible in RL application.
So review carefully :)

I'm not sure of the Fixes tag. If I'm correct:
 - The first one is when the GFP_KERNEL has been introduced.
 - the 2nd one is when some logic has been changed to call interrupt
   handler directly instead of existing workqueue

Note that if my analysis is completely broken, it is likely that
'mwifiex_ret_802_11_scan()' could use GFP_KERNEL in order to relax some
memory allocation constrains.
---
 drivers/net/wireless/marvell/mwifiex/scan.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Kalle Valo Aug. 18, 2020, 12:52 p.m. UTC | #1
Christophe JAILLET <christophe.jaillet@wanadoo.fr> wrote:

> A possible call chain is as follow:
>   mwifiex_sdio_interrupt                            (sdio.c)
>     --> mwifiex_main_process                        (main.c)
>       --> mwifiex_process_cmdresp                   (cmdevt.c)
>         --> mwifiex_process_sta_cmdresp             (sta_cmdresp.c)
>           --> mwifiex_ret_802_11_scan               (scan.c)
>             --> mwifiex_parse_single_response_buf   (scan.c)
> 
> 'mwifiex_sdio_interrupt()' is an interrupt function.
> 
> Also note that 'mwifiex_ret_802_11_scan()' already uses GFP_ATOMIC.
> 
> So use GFP_ATOMIC instead of GFP_KERNEL when memory is allocated in
> 'mwifiex_parse_single_response_buf()'.
> 
> Fixes: 7c6fa2a843c5 ("mwifiex: use cfg80211 dynamic scan table and cfg80211_get_bss API")
> or
> Fixes: 601216e12c65e ("mwifiex: process RX packets in SDIO IRQ thread directly")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>

Patch applied to wireless-drivers-next.git, thanks.

d2ab7f00f432 mwifiex: Do not use GFP_KERNEL in atomic context
diff mbox series

Patch

diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c
index ff932627a46c..2fb69a590bd8 100644
--- a/drivers/net/wireless/marvell/mwifiex/scan.c
+++ b/drivers/net/wireless/marvell/mwifiex/scan.c
@@ -1889,7 +1889,7 @@  mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info,
 					    chan, CFG80211_BSS_FTYPE_UNKNOWN,
 					    bssid, timestamp,
 					    cap_info_bitmap, beacon_period,
-					    ie_buf, ie_len, rssi, GFP_KERNEL);
+					    ie_buf, ie_len, rssi, GFP_ATOMIC);
 			if (bss) {
 				bss_priv = (struct mwifiex_bss_priv *)bss->priv;
 				bss_priv->band = band;