ath9k: Get rid of unnecessary ATOMIC memory alloc during init time
authorSenthil Balasubramanian <senthilkumar@atheros.com>
Fri, 6 Mar 2009 05:54:08 +0000 (11:24 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 16 Mar 2009 22:09:30 +0000 (18:09 -0400)
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>
drivers/net/wireless/ath9k/main.c
drivers/net/wireless/ath9k/recv.c

index bb30ccc..4bc43db 100644 (file)
@@ -1804,7 +1804,7 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
 
        /* allocate descriptors */
        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) {
                error = -ENOMEM;
                goto fail;
@@ -1816,12 +1816,11 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
 
        /* allocate buffers */
        bsize = sizeof(struct ath_buf) * nbuf;
-       bf = kmalloc(bsize, GFP_KERNEL);
+       bf = kzalloc(bsize, GFP_KERNEL);
        if (bf == NULL) {
                error = -ENOMEM;
                goto fail2;
        }
-       memset(bf, 0, bsize);
        dd->dd_bufptr = bf;
 
        INIT_LIST_HEAD(head);
index 3df5c78..9439cb3 100644 (file)
@@ -100,7 +100,7 @@ static u64 ath_extend_tsf(struct ath_softc *sc, u32 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;
        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
         * kernel... and that is actually what is observed on some
         * systems :( */
-       skb = dev_alloc_skb(len + sc->cachelsz - 1);
+       skb = __dev_alloc_skb(len + sc->cachelsz - 1, gfp_mask);
        if (skb != NULL) {
                off = ((unsigned long) skb->data) % sc->cachelsz;
                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) {
-                       skb = ath_rxbuf_alloc(sc, sc->rx.bufsize);
+                       skb = ath_rxbuf_alloc(sc, sc->rx.bufsize, GFP_KERNEL);
                        if (skb == NULL) {
                                error = -ENOMEM;
                                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
                 * 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,
                 * tell hardware it can give us a new frame using the old