idr: Return the deleted entry from idr_remove
authorMatthew Wilcox <mawilcox@microsoft.com>
Thu, 22 Dec 2016 18:30:22 +0000 (13:30 -0500)
committerMatthew Wilcox <mawilcox@microsoft.com>
Tue, 14 Feb 2017 02:44:03 +0000 (21:44 -0500)
It is a relatively common idiom (8 instances) to first look up an IDR
entry, and then remove it from the tree if it is found, possibly doing
further operations upon the entry afterwards.  If we change idr_remove()
to return the removed object, all of these users can save themselves a
walk of the IDR tree.

Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
drivers/atm/nicstar.c
drivers/block/drbd/drbd_main.c
drivers/firewire/core-cdev.c
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
drivers/net/wireless/marvell/mwifiex/txrx.c
drivers/target/target_core_user.c
include/linux/idr.h
net/mac80211/status.c

index cb28579..d879f3b 100644 (file)
@@ -1980,13 +1980,12 @@ 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_find(&card->idr, id);
+       skb = idr_remove(&card->idr, id);
        if (!skb) {
                RXPRINTK(KERN_ERR
-                        "nicstar%d: idr_find() failed!\n", card->index);
+                        "nicstar%d: skb not found!\n", card->index);
                return;
        }
-       idr_remove(&card->idr, id);
        dma_sync_single_for_cpu(&card->pcidev->dev,
                                NS_PRV_DMA(skb),
                                (NS_PRV_BUFTYPE(skb) == BUF_SM
index 8348272..6bb3b80 100644 (file)
@@ -2915,11 +2915,9 @@ out_idr_remove_vol:
        idr_remove(&connection->peer_devices, vnr);
 out_idr_remove_from_resource:
        for_each_connection(connection, resource) {
-               peer_device = idr_find(&connection->peer_devices, vnr);
-               if (peer_device) {
-                       idr_remove(&connection->peer_devices, vnr);
+               peer_device = idr_remove(&connection->peer_devices, vnr);
+               if (peer_device)
                        kref_put(&connection->kref, drbd_destroy_connection);
-               }
        }
        for_each_peer_device_safe(peer_device, tmp_peer_device, device) {
                list_del(&peer_device->peer_devices);
index aee149b..a301fcf 100644 (file)
@@ -1307,8 +1307,7 @@ static void iso_resource_work(struct work_struct *work)
         */
        if (r->todo == ISO_RES_REALLOC && !success &&
            !client->in_shutdown &&
-           idr_find(&client->resource_idr, r->resource.handle)) {
-               idr_remove(&client->resource_idr, r->resource.handle);
+           idr_remove(&client->resource_idr, r->resource.handle)) {
                client_put(client);
                free = true;
        }
index c02db01..0218cea 100644 (file)
@@ -70,10 +70,10 @@ static void amdgpu_bo_list_destroy(struct amdgpu_fpriv *fpriv, int id)
        struct amdgpu_bo_list *list;
 
        mutex_lock(&fpriv->bo_list_lock);
-       list = idr_find(&fpriv->bo_list_handles, id);
+       list = idr_remove(&fpriv->bo_list_handles, id);
        if (list) {
+               /* Another user may have a reference to this list still */
                mutex_lock(&list->lock);
-               idr_remove(&fpriv->bo_list_handles, id);
                mutex_unlock(&list->lock);
                amdgpu_bo_list_free(list);
        }
index 400c66b..cf05006 100644 (file)
@@ -135,15 +135,11 @@ static int amdgpu_ctx_free(struct amdgpu_fpriv *fpriv, uint32_t id)
        struct amdgpu_ctx *ctx;
 
        mutex_lock(&mgr->lock);
-       ctx = idr_find(&mgr->ctx_handles, id);
-       if (ctx) {
-               idr_remove(&mgr->ctx_handles, id);
+       ctx = idr_remove(&mgr->ctx_handles, id);
+       if (ctx)
                kref_put(&ctx->refcount, amdgpu_ctx_do_release);
-               mutex_unlock(&mgr->lock);
-               return 0;
-       }
        mutex_unlock(&mgr->lock);
-       return -EINVAL;
+       return ctx ? 0 : -EINVAL;
 }
 
 static int amdgpu_ctx_query(struct amdgpu_device *adev,
index abdd0cf..fac28bd 100644 (file)
@@ -346,9 +346,7 @@ void mwifiex_parse_tx_status_event(struct mwifiex_private *priv,
                return;
 
        spin_lock_irqsave(&priv->ack_status_lock, flags);
-       ack_skb = idr_find(&priv->ack_status_frames, tx_status->tx_token_id);
-       if (ack_skb)
-               idr_remove(&priv->ack_status_frames, tx_status->tx_token_id);
+       ack_skb = idr_remove(&priv->ack_status_frames, tx_status->tx_token_id);
        spin_unlock_irqrestore(&priv->ack_status_lock, flags);
 
        if (ack_skb) {
index 8041710..18f0ec2 100644 (file)
@@ -642,9 +642,7 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)
                WARN_ON(tcmu_hdr_get_op(entry->hdr.len_op) != TCMU_OP_CMD);
 
                spin_lock(&udev->commands_lock);
-               cmd = idr_find(&udev->commands, entry->hdr.cmd_id);
-               if (cmd)
-                       idr_remove(&udev->commands, cmd->cmd_id);
+               cmd = idr_remove(&udev->commands, entry->hdr.cmd_id);
                spin_unlock(&udev->commands_lock);
 
                if (!cmd) {
index 2027c7a..bf70b3e 100644 (file)
@@ -88,9 +88,9 @@ void *idr_get_next(struct idr *, int *nextid);
 void *idr_replace(struct idr *, void *, int id);
 void idr_destroy(struct idr *);
 
-static inline void idr_remove(struct idr *idr, int id)
+static inline void *idr_remove(struct idr *idr, int id)
 {
-       radix_tree_delete(&idr->idr_rt, id);
+       return radix_tree_delete_item(&idr->idr_rt, id, NULL);
 }
 
 static inline void idr_init(struct idr *idr)
index ddf71c6..43dd331 100644 (file)
@@ -462,9 +462,7 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
        unsigned long flags;
 
        spin_lock_irqsave(&local->ack_status_lock, flags);
-       skb = idr_find(&local->ack_status_frames, info->ack_frame_id);
-       if (skb)
-               idr_remove(&local->ack_status_frames, info->ack_frame_id);
+       skb = idr_remove(&local->ack_status_frames, info->ack_frame_id);
        spin_unlock_irqrestore(&local->ack_status_lock, flags);
 
        if (!skb)