mlx4_core: Add mr_alloc_reserved to able create MPTs with pre-reserve range
PATCH 2/10 mlx4_core: Add mr_alloc_reserved to able create MPTs with pre-reserve range
Quoted 1 line
From
7c943349148dcbcb173814a9b6800ac2a2b12626Mon Sep 17 00:00:00 2001
From: Vu Pham <vu-OnC3O1emZK9LiOotz6YBiwC/[email protected]>
Date: Tue, 10 Aug 2010 14:03:53 -0700
Subject: [PATCH 02/10] mlx4_core: Add mr_alloc_reserved to able create MPTs with pre-reserve range
As we did with QPs, range of the MPTs are pre-reserved (the MPTs that are mapped for FEXCHs, 2*64K of them).
We need to split the operation of allocating an MPT to two:
. The allocation of a bit from the bitmap
. The actual creation of the entry (and it's MTT).
So, mr_alloc_reserved() is the second part, where you know which MPT number was allocated. mr_alloc() is the one that allocates a number from the bitmap.
Normal users keep using the original mr_alloc(). For FEXCH, when we know the pre-reserved MPT entry, we call mr_alloc_reserved() directly.
Same with the mr_free() and corresponding mr_free_reserved(). The first will just put back the bit, the later will actually destroy the entry, but will leave the bit set.
--- drivers/net/mlx4/mr.c | 35 +++++++++++++++++++++++++---------- include/linux/mlx4/device.h | 4 ++++ 2 files changed, 29 insertions(+), 10 deletions(-)
drivers/net/mlx4/mr.c +25 -10
@@ -263,6 +263,21 @@ static int mlx4_HW2SW_MPT(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox !mailbox, MLX4_CMD_HW2SW_MPT, MLX4_CMD_TIME_CLASS_B); } +int mlx4_mr_alloc_reserved (struct mlx4_dev *dev,u32 mridx,u32 pd, +u64 iova,u64 size,u32 access,int npages, +int page_shift,struct mlx4_mr *mr) +{ + mr->iova = iova; + mr->size = size; + mr->pd = pd; + mr->access = access; + mr->enabled =0 ; + mr->key =hw_index_to_key (mridx); + +return mlx4_mtt_init (dev, npages, page_shift, &mr->mtt); +} +EXPORT_SYMBOL_GPL (mlx4_mr_alloc_reserved); +int mlx4_mr_alloc (struct mlx4_dev *dev,u32 pd,u64 iova,u64 size,u32 access,int npages,int page_shift,struct mlx4_mr *mr) {
@@ -274,14 +289,8 @@ int mlx4_mr_alloc(struct mlx4_dev *dev, u32 pd, u64 iova, u64 size, u32 access,if (index ==-1 )return -ENOMEM ; - mr->iova = iova; - mr->size = size; - mr->pd = pd; - mr->access = access; - mr->enabled =0 ; - mr->key =hw_index_to_key (index); - - err =mlx4_mtt_init (dev, npages, page_shift, &mr->mtt); + err =mlx4_mr_alloc_reserved (dev, index, pd, iova, size, + access, npages, page_shift, mr);if (err)mlx4_bitmap_free (&priv->mr_table.mpt_bitmap, index);
@@ -289,9 +298,8 @@ int mlx4_mr_alloc(struct mlx4_dev *dev, u32 pd, u64 iova, u64 size, u32 access, }EXPORT_SYMBOL_GPL (mlx4_mr_alloc); -void mlx4_mr_free (struct mlx4_dev *dev,struct mlx4_mr *mr) +void mlx4_mr_free_reserved (struct mlx4_dev *dev,struct mlx4_mr *mr) { -struct mlx4_priv *priv =mlx4_priv (dev);int err;if (mr->enabled) {
@@ -303,6 +311,13 @@ void mlx4_mr_free(struct mlx4_dev *dev, struct mlx4_mr *mr) }mlx4_mtt_cleanup (dev, &mr->mtt); +} +EXPORT_SYMBOL_GPL (mlx4_mr_free_reserved); + +void mlx4_mr_free (struct mlx4_dev *dev,struct mlx4_mr *mr) +{ +struct mlx4_priv *priv =mlx4_priv (dev); +mlx4_mr_free_reserved (dev, mr);mlx4_bitmap_free (&priv->mr_table.mpt_bitmap,key_to_hw_index (mr->key)); }EXPORT_SYMBOL_GPL (mlx4_mr_free);
include/linux/mlx4/device.h +4 -0
@@ -424,8 +424,12 @@ int mlx4_mtt_init(struct mlx4_dev *dev, int npages, int page_shift,void mlx4_mtt_cleanup (struct mlx4_dev *dev,struct mlx4_mtt *mtt);u64 mlx4_mtt_addr (struct mlx4_dev *dev,struct mlx4_mtt *mtt); +int mlx4_mr_alloc_reserved (struct mlx4_dev *dev,u32 mridx,u32 pd, +u64 iova,u64 size,u32 access,int npages, +int page_shift,struct mlx4_mr *mr);int mlx4_mr_alloc (struct mlx4_dev *dev,u32 pd,u64 iova,u64 size,u32 access,int npages,int page_shift,struct mlx4_mr *mr); +void mlx4_mr_free_reserved (struct mlx4_dev *dev,struct mlx4_mr *mr);void mlx4_mr_free (struct mlx4_dev *dev,struct mlx4_mr *mr);int mlx4_mr_enable (struct mlx4_dev *dev,struct mlx4_mr *mr); int mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
Signature · 1 line
1.6.3.3
_______________________________________________
ewg mailing list [email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg