提交 f0e6ce13 编写于 作者: S Senthil Balasubramanian 提交者: John W. Linville

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: NSenthil Balasubramanian <senthilkumar@atheros.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 ec329ace
...@@ -1804,7 +1804,7 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册