IB/mlx5: Add MR to radix tree in reg_mr_callback
authorHaggai Eran <haggaie@mellanox.com>
Thu, 22 May 2014 11:50:09 +0000 (14:50 +0300)
committerRoland Dreier <roland@purestorage.com>
Tue, 27 May 2014 18:53:05 +0000 (11:53 -0700)
For memory regions that are allocated using reg_umr, the suffix of
mlx5_core_create_mkey isn't being called.  Instead the creation is
completed in a callback function (reg_mr_callback).  This means that
these MRs aren't being added to the MR radix tree.  Add them in the
callback.

Signed-off-by: Haggai Eran <haggaie@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/mlx5/mr.c

index ad58985..9d932a2 100644 (file)
@@ -73,6 +73,8 @@ static void reg_mr_callback(int status, void *context)
        struct mlx5_cache_ent *ent = &cache->ent[c];
        u8 key;
        unsigned long flags;
+       struct mlx5_mr_table *table = &dev->mdev.priv.mr_table;
+       int err;
 
        spin_lock_irqsave(&ent->lock, flags);
        ent->pending--;
@@ -107,6 +109,13 @@ static void reg_mr_callback(int status, void *context)
        ent->cur++;
        ent->size++;
        spin_unlock_irqrestore(&ent->lock, flags);
+
+       write_lock_irqsave(&table->lock, flags);
+       err = radix_tree_insert(&table->tree, mlx5_base_mkey(mr->mmr.key),
+                               &mr->mmr);
+       if (err)
+               pr_err("Error inserting to mr tree. 0x%x\n", -err);
+       write_unlock_irqrestore(&table->lock, flags);
 }
 
 static int add_keys(struct mlx5_ib_dev *dev, int c, int num)