brcmsmac: Use kvmalloc() for ucode allocations
authorTakashi Iwai <tiwai@suse.de>
Thu, 13 Sep 2018 06:15:17 +0000 (08:15 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Nov 2019 17:47:09 +0000 (18:47 +0100)
[ Upstream commit 6c3efbe77bc78bf49db851aec7f385be475afca6 ]

The ucode chunk might be relatively large and the allocation with
kmalloc() may fail occasionally.  Since the data isn't DMA-transferred
but by manual loops, we can use vmalloc instead of kmalloc.
For a better performance, though, kvmalloc() would be the best choice
in such a case, so let's replace with it.

Bugzilla: https://bugzilla.suse.com/show_bug.cgi?id=1103431
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c

index ecc89e7..6255fb6 100644 (file)
@@ -1578,10 +1578,10 @@ int brcms_ucode_init_buf(struct brcms_info *wl, void **pbuf, u32 idx)
                        if (le32_to_cpu(hdr->idx) == idx) {
                                pdata = wl->fw.fw_bin[i]->data +
                                        le32_to_cpu(hdr->offset);
-                               *pbuf = kmemdup(pdata, len, GFP_KERNEL);
+                               *pbuf = kvmalloc(len, GFP_KERNEL);
                                if (*pbuf == NULL)
                                        goto fail;
-
+                               memcpy(*pbuf, pdata, len);
                                return 0;
                        }
                }
@@ -1629,7 +1629,7 @@ int brcms_ucode_init_uint(struct brcms_info *wl, size_t *n_bytes, u32 idx)
  */
 void brcms_ucode_free_buf(void *p)
 {
-       kfree(p);
+       kvfree(p);
 }
 
 /*