idr: Return the deleted entry from idr_remove
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>
This commit is contained in:
parent
8ac0486831
commit
d3e709e63e
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user