From 04ae868c450141a0ea903fcd697e82147ea869c9 Mon Sep 17 00:00:00 2001 From: Ramesh Rangavittal Date: Tue, 11 Apr 2023 11:26:11 -0500 Subject: [PATCH 152/296] brcm80211: Resolve skb alloc failures in FMAC --- .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 5 ++--- .../wireless/broadcom/brcm80211/brcmutil/utils.c | 13 +++++++++++++ .../broadcom/brcm80211/include/brcmu_utils.h | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c index 29ade00cbec0..ed23f8583b7c 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c @@ -975,7 +975,7 @@ static u32 brcmf_msgbuf_rxbuf_data_post(struct brcmf_msgbuf *msgbuf, u32 count) rx_bufpost = (struct msgbuf_rx_bufpost *)ret_ptr; memset(rx_bufpost, 0, sizeof(*rx_bufpost)); - skb = brcmu_pkt_buf_get_skb(BRCMF_MSGBUF_MAX_PKT_SIZE); + skb = __brcmu_pkt_buf_get_skb(BRCMF_MSGBUF_MAX_PKT_SIZE, GFP_KERNEL); if (skb == NULL) { bphy_err(drvr, "Failed to alloc SKB\n"); @@ -1085,8 +1085,7 @@ brcmf_msgbuf_rxbuf_ctrl_post(struct brcmf_msgbuf *msgbuf, bool event_buf, rx_bufpost = (struct msgbuf_rx_ioctl_resp_or_event *)ret_ptr; memset(rx_bufpost, 0, sizeof(*rx_bufpost)); - skb = brcmu_pkt_buf_get_skb(BRCMF_MSGBUF_MAX_CTL_PKT_SIZE); - + skb = __brcmu_pkt_buf_get_skb(BRCMF_MSGBUF_MAX_CTL_PKT_SIZE, GFP_KERNEL); if (skb == NULL) { bphy_err(drvr, "Failed to alloc SKB\n"); brcmf_commonring_write_cancel(commonring, alloced - i); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmutil/utils.c b/drivers/net/wireless/broadcom/brcm80211/brcmutil/utils.c index fe94db0ba3f3..f2db507a42bc 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmutil/utils.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmutil/utils.c @@ -292,6 +292,19 @@ char *brcmu_dotrev_str(u32 dotrev, char *buf) } EXPORT_SYMBOL(brcmu_dotrev_str); +struct sk_buff *__brcmu_pkt_buf_get_skb(uint len, gfp_t gfp_mask) +{ + struct sk_buff *skb; + + skb = __netdev_alloc_skb(NULL, len, gfp_mask); + if (skb) { + skb_put(skb, len); + skb->priority = 0; + } + return skb; +} +EXPORT_SYMBOL(__brcmu_pkt_buf_get_skb); + #if defined(DEBUG) /* pretty hex print a pkt buffer chain */ void brcmu_prpkt(const char *msg, struct sk_buff *p0) diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_utils.h b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_utils.h index 48791ac87496..1b4f43c81745 100644 --- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_utils.h +++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_utils.h @@ -129,6 +129,7 @@ struct sk_buff *brcmu_pktq_pdeq_match(struct pktq *pq, int prec, /* packet primitives */ struct sk_buff *brcmu_pkt_buf_get_skb(uint len); void brcmu_pkt_buf_free_skb(struct sk_buff *skb); +struct sk_buff *__brcmu_pkt_buf_get_skb(uint len, gfp_t gfp_mask); /* Empty the queue at particular precedence level */ /* callback function fn(pkt, arg) returns true if pkt belongs to if */ -- 2.25.1