From b9d86ddb326b006b921042c2020b44bb3dac4811 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Wed, 27 Feb 2013 17:04:23 -0800 Subject: [PATCH] --- yaml --- r: 359347 b: refs/heads/master c: 6a9200603d76de1f8029b83c041f8eef99877a65 h: refs/heads/master i: 359345: bb9919693bd7e26b0122be34e610d5fd7595b713 359343: b3b04a1fec3eae4bf2d5f0858df9de62c5a2d07b v: v3 --- [refs] | 2 +- trunk/drivers/infiniband/hw/mlx4/cm.c | 32 +++++++++++++-------------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/[refs] b/[refs] index 2241a1eb95d9..f1a17211a32e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5c213f86417b264b38b279def3363811c2be54f0 +refs/heads/master: 6a9200603d76de1f8029b83c041f8eef99877a65 diff --git a/trunk/drivers/infiniband/hw/mlx4/cm.c b/trunk/drivers/infiniband/hw/mlx4/cm.c index dbc99d41605c..80e59ed864b3 100644 --- a/trunk/drivers/infiniband/hw/mlx4/cm.c +++ b/trunk/drivers/infiniband/hw/mlx4/cm.c @@ -203,7 +203,7 @@ static void sl_id_map_add(struct ib_device *ibdev, struct id_map_entry *new) static struct id_map_entry * id_map_alloc(struct ib_device *ibdev, int slave_id, u32 sl_cm_id) { - int ret, id; + int ret; static int next_id; struct id_map_entry *ent; struct mlx4_ib_sriov *sriov = &to_mdev(ibdev)->sriov; @@ -220,25 +220,23 @@ id_map_alloc(struct ib_device *ibdev, int slave_id, u32 sl_cm_id) ent->dev = to_mdev(ibdev); INIT_DELAYED_WORK(&ent->timeout, id_map_ent_timeout); - do { - spin_lock(&to_mdev(ibdev)->sriov.id_map_lock); - ret = idr_get_new_above(&sriov->pv_id_table, ent, - next_id, &id); - if (!ret) { - next_id = ((unsigned) id + 1) & MAX_IDR_MASK; - ent->pv_cm_id = (u32)id; - sl_id_map_add(ibdev, ent); - } + idr_preload(GFP_KERNEL); + spin_lock(&to_mdev(ibdev)->sriov.id_map_lock); - spin_unlock(&sriov->id_map_lock); - } while (ret == -EAGAIN && idr_pre_get(&sriov->pv_id_table, GFP_KERNEL)); - /*the function idr_get_new_above can return -ENOSPC, so don't insert in that case.*/ - if (!ret) { - spin_lock(&sriov->id_map_lock); + ret = idr_alloc(&sriov->pv_id_table, ent, next_id, 0, GFP_NOWAIT); + if (ret >= 0) { + next_id = ((unsigned)ret + 1) & MAX_IDR_MASK; + ent->pv_cm_id = (u32)ret; + sl_id_map_add(ibdev, ent); list_add_tail(&ent->list, &sriov->cm_list); - spin_unlock(&sriov->id_map_lock); - return ent; } + + spin_unlock(&sriov->id_map_lock); + idr_preload_end(); + + if (ret >= 0) + return ent; + /*error flow*/ kfree(ent); mlx4_ib_warn(ibdev, "No more space in the idr (err:0x%x)\n", ret);