]> www.infradead.org Git - users/willy/xarray.git/commitdiff
nicstar: Convert to XArray
authorMatthew Wilcox <willy@infradead.org>
Fri, 15 Feb 2019 21:01:15 +0000 (16:01 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 9 Aug 2019 01:38:17 +0000 (21:38 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/atm/nicstar.c
drivers/atm/nicstar.h

index 8db8c0fb5e2dac6851893e62d25b682177539a7f..914244952fe9e65c22512fad24906c7b63b0398b 100644 (file)
@@ -49,7 +49,7 @@
 #include <linux/interrupt.h>
 #include <linux/bitops.h>
 #include <linux/slab.h>
-#include <linux/idr.h>
+#include <linux/xarray.h>
 #include <asm/io.h>
 #include <linux/uaccess.h>
 #include <linux/atomic.h>
@@ -244,7 +244,6 @@ static void nicstar_remove_one(struct pci_dev *pcidev)
                if (card->scd2vc[j] != NULL)
                        free_scq(card, card->scd2vc[j]->scq, card->scd2vc[j]->tx_vcc);
        }
-       idr_destroy(&card->idr);
        dma_free_coherent(&card->pcidev->dev, NS_RSQSIZE + NS_RSQ_ALIGNMENT,
                          card->rsq.org, card->rsq.dma);
        dma_free_coherent(&card->pcidev->dev, NS_TSQSIZE + NS_TSQ_ALIGNMENT,
@@ -637,7 +636,7 @@ static int ns_init_card(int i, struct pci_dev *pcidev)
 
        card->efbie = 1;        /* To prevent push_rxbufs from enabling the interrupt */
 
-       idr_init(&card->idr);
+       xa_init_flags(&card->handles, XA_FLAGS_ALLOC);
 
        /* Pre-allocate some huge buffers */
        skb_queue_head_init(&card->hbpool.queue);
@@ -942,7 +941,7 @@ static void free_scq(ns_dev *card, scq_info *scq, struct atm_vcc *vcc)
 static void push_rxbufs(ns_dev * card, struct sk_buff *skb)
 {
        struct sk_buff *handle1, *handle2;
-       int id1, id2;
+       int id1, id2, ret;
        u32 addr1, addr2;
        u32 stat;
        unsigned long flags;
@@ -1018,13 +1017,17 @@ static void push_rxbufs(ns_dev * card, struct sk_buff *skb)
                                card->lbfqc += 2;
                }
 
-               id1 = idr_alloc(&card->idr, handle1, 0, 0, GFP_ATOMIC);
-               if (id1 < 0)
+               ret = xa_alloc(&card->handles, &id1, handle1, xa_limit_31b,
+                               GFP_ATOMIC);
+               if (ret < 0)
                        goto out;
 
-               id2 = idr_alloc(&card->idr, handle2, 0, 0, GFP_ATOMIC);
-               if (id2 < 0)
+               ret = xa_alloc(&card->handles, &id2, handle2, xa_limit_31b,
+                               GFP_ATOMIC);
+               if (ret < 0) {
+                       xa_erase(&card->handles, id1);
                        goto out;
+               }
 
                spin_lock_irqsave(&card->res_lock, flags);
                while (CMD_BUSY(card)) ;
@@ -1150,7 +1153,7 @@ static irqreturn_t ns_irq_handler(int irq, void *dev_id)
                                struct sk_buff *oldbuf;
 
                                oldbuf = card->rcbuf;
-                               card->rcbuf = idr_find(&card->idr,
+                               card->rcbuf = xa_load(&card->handles,
                                                       ns_rcqe_nextbufhandle(card->rawcell));
                                card->rawch = NS_PRV_DMA(card->rcbuf);
                                card->rawcell = (struct ns_rcqe *)
@@ -1979,7 +1982,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe)
        card->lbfqc = ns_stat_lfbqc_get(stat);
 
        id = le32_to_cpu(rsqe->buffer_handle);
-       skb = idr_remove(&card->idr, id);
+       skb = xa_erase(&card->handles, id);
        if (!skb) {
                RXPRINTK(KERN_ERR
                         "nicstar%d: skb not found!\n", card->index);
index 1b7f1dfc1735271f1bf9f274db78716c6c9dc38d..bbd42f38930384111fcc5c93ba65324ed297bb94 100644 (file)
 
 #include <linux/types.h>
 #include <linux/pci.h>
-#include <linux/idr.h>
 #include <linux/uio.h>
 #include <linux/skbuff.h>
 #include <linux/atmdev.h>
 #include <linux/atm_nicstar.h>
+#include <linux/xarray.h>
 
 /* Options */
 
@@ -714,7 +714,7 @@ typedef struct ns_dev {
        int vpibits;
        int vcibits;
        struct pci_dev *pcidev;
-       struct idr idr;
+       struct xarray handles;
        struct atm_dev *atmdev;
        tsq_info tsq;
        rsq_info rsq;