ath9k: Get rid of unnecessary ATOMIC memory alloc during init time
We can sleep for memory during init time and so allocating rx buffers, descriptro buffers with GFP_KERNEL should help us to get rid of transient alloc fails. Signed-off-by: Senthil Balasubramanian <senthilkumar@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
ec329acef9
commit
f0e6ce13c1
@@ -1804,7 +1804,7 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
|
|||||||
|
|
||||||
/* allocate descriptors */
|
/* allocate descriptors */
|
||||||
dd->dd_desc = dma_alloc_coherent(sc->dev, dd->dd_desc_len,
|
dd->dd_desc = dma_alloc_coherent(sc->dev, dd->dd_desc_len,
|
||||||
&dd->dd_desc_paddr, GFP_ATOMIC);
|
&dd->dd_desc_paddr, GFP_KERNEL);
|
||||||
if (dd->dd_desc == NULL) {
|
if (dd->dd_desc == NULL) {
|
||||||
error = -ENOMEM;
|
error = -ENOMEM;
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -1816,12 +1816,11 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
|
|||||||
|
|
||||||
/* allocate buffers */
|
/* allocate buffers */
|
||||||
bsize = sizeof(struct ath_buf) * nbuf;
|
bsize = sizeof(struct ath_buf) * nbuf;
|
||||||
bf = kmalloc(bsize, GFP_KERNEL);
|
bf = kzalloc(bsize, GFP_KERNEL);
|
||||||
if (bf == NULL) {
|
if (bf == NULL) {
|
||||||
error = -ENOMEM;
|
error = -ENOMEM;
|
||||||
goto fail2;
|
goto fail2;
|
||||||
}
|
}
|
||||||
memset(bf, 0, bsize);
|
|
||||||
dd->dd_bufptr = bf;
|
dd->dd_bufptr = bf;
|
||||||
|
|
||||||
INIT_LIST_HEAD(head);
|
INIT_LIST_HEAD(head);
|
||||||
|
@@ -100,7 +100,7 @@ static u64 ath_extend_tsf(struct ath_softc *sc, u32 rstamp)
|
|||||||
return (tsf & ~0x7fff) | rstamp;
|
return (tsf & ~0x7fff) | rstamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sk_buff *ath_rxbuf_alloc(struct ath_softc *sc, u32 len)
|
static struct sk_buff *ath_rxbuf_alloc(struct ath_softc *sc, u32 len, gfp_t gfp_mask)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
u32 off;
|
u32 off;
|
||||||
@@ -118,7 +118,7 @@ static struct sk_buff *ath_rxbuf_alloc(struct ath_softc *sc, u32 len)
|
|||||||
* Unfortunately this means we may get 8 KB here from the
|
* Unfortunately this means we may get 8 KB here from the
|
||||||
* kernel... and that is actually what is observed on some
|
* kernel... and that is actually what is observed on some
|
||||||
* systems :( */
|
* systems :( */
|
||||||
skb = dev_alloc_skb(len + sc->cachelsz - 1);
|
skb = __dev_alloc_skb(len + sc->cachelsz - 1, gfp_mask);
|
||||||
if (skb != NULL) {
|
if (skb != NULL) {
|
||||||
off = ((unsigned long) skb->data) % sc->cachelsz;
|
off = ((unsigned long) skb->data) % sc->cachelsz;
|
||||||
if (off != 0)
|
if (off != 0)
|
||||||
@@ -306,7 +306,7 @@ int ath_rx_init(struct ath_softc *sc, int nbufs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
list_for_each_entry(bf, &sc->rx.rxbuf, list) {
|
list_for_each_entry(bf, &sc->rx.rxbuf, list) {
|
||||||
skb = ath_rxbuf_alloc(sc, sc->rx.bufsize);
|
skb = ath_rxbuf_alloc(sc, sc->rx.bufsize, GFP_KERNEL);
|
||||||
if (skb == NULL) {
|
if (skb == NULL) {
|
||||||
error = -ENOMEM;
|
error = -ENOMEM;
|
||||||
break;
|
break;
|
||||||
@@ -580,7 +580,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
|
|||||||
|
|
||||||
/* Ensure we always have an skb to requeue once we are done
|
/* Ensure we always have an skb to requeue once we are done
|
||||||
* processing the current buffer's skb */
|
* processing the current buffer's skb */
|
||||||
requeue_skb = ath_rxbuf_alloc(sc, sc->rx.bufsize);
|
requeue_skb = ath_rxbuf_alloc(sc, sc->rx.bufsize, GFP_ATOMIC);
|
||||||
|
|
||||||
/* If there is no memory we ignore the current RX'd frame,
|
/* If there is no memory we ignore the current RX'd frame,
|
||||||
* tell hardware it can give us a new frame using the old
|
* tell hardware it can give us a new frame using the old
|
||||||
|
Reference in New Issue
Block a user