mlx4_core: Add interface to allocate fmr with pre-reserved MPTs
PATCH 4/10 mlx4_core: Add interface to allocate fmr with pre-reserved MPTs
Quoted 1 line
From
9652f29170c7daabf2e9a62acb848a05dc71db9aMon Sep 17 00:00:00 2001
From: Vu Pham <vu-OnC3O1emZK9LiOotz6YBiwC/[email protected]>
Date: Tue, 10 Aug 2010 14:16:50 -0700
Subject: [PATCH 04/10] mlx4_core: Add interface to allocate fmr with pre-reserved MPTs
As we did with MRs, the fmr_alloc() will call mr_alloc() to allocate bitmap and create MPTs entry. fmr_alloc_reserver will call mr_alloc_reserve() to create MPTs entry with pre-reserved range
Signed-off-by Oren Duer <oren-VPRAkNaXOzVS1MOuV/[email protected]>
Signed-off-by Vu Pham <vu-VPRAkNaXOzVWk0Htik3J/[email protected]>
--- drivers/net/mlx4/mr.c | 55 +++++++++++++++++++++++++++++++++++++++++++ include/linux/mlx4/device.h | 4 +++ 2 files changed, 59 insertions(+), 0 deletions(-)
drivers/net/mlx4/mr.c +55 -0
@@ -655,6 +655,49 @@ err_free: }EXPORT_SYMBOL_GPL (mlx4_fmr_alloc); +int mlx4_fmr_alloc_reserved (struct mlx4_dev *dev,u32 mridx, +u32 pd,u32 access,int max_pages, +int max_maps,u8 page_shift,struct mlx4_fmr *fmr) +{ +struct mlx4_priv *priv =mlx4_priv (dev); +u64 mtt_seg; +int err = -ENOMEM ; + +if (page_shift < (ffs (dev->caps.page_size_cap) -1 ) || page_shift >=32 ) +return -EINVAL ; + +/* All MTTs must fit in the same page */ +if (max_pages *sizeof *fmr->mtts >PAGE_SIZE ) +return -EINVAL ; + + fmr->page_shift = page_shift; + fmr->max_pages = max_pages; + fmr->max_maps = max_maps; + fmr->maps =0 ; + + err =mlx4_mr_alloc_reserved (dev, mridx, pd,0 ,0 , access, max_pages, + page_shift, &fmr->mr); +if (err) +return err; + + mtt_seg = fmr->mr.mtt.first_seg * dev->caps.mtt_entry_sz; + + fmr->mtts =mlx4_table_find (&priv->mr_table.mtt_table, + fmr->mr.mtt.first_seg, + &fmr->dma_handle); +if (!fmr->mtts) { + err = -ENOMEM ; + goto err_free; + } + +return 0 ; + +err_free: +mlx4_mr_free_reserved (dev, &fmr->mr); +return err; +} +EXPORT_SYMBOL_GPL (mlx4_fmr_alloc_reserved); +int mlx4_fmr_enable (struct mlx4_dev *dev,struct mlx4_fmr *fmr) {struct mlx4_priv *priv =mlx4_priv (dev);
@@ -697,6 +740,18 @@ int mlx4_fmr_free(struct mlx4_dev *dev, struct mlx4_fmr *fmr) }EXPORT_SYMBOL_GPL (mlx4_fmr_free); +int mlx4_fmr_free_reserved (struct mlx4_dev *dev,struct mlx4_fmr *fmr) +{ +if (fmr->maps) +return -EBUSY ; + + fmr->mr.enabled =0 ; +mlx4_mr_free_reserved (dev, &fmr->mr); + +return 0 ; +} +EXPORT_SYMBOL_GPL (mlx4_fmr_free_reserved); +int mlx4_SYNC_TPT (struct mlx4_dev *dev) {return mlx4_cmd (dev,0 ,0 ,0 ,MLX4_CMD_SYNC_TPT ,1000 );
include/linux/mlx4/device.h +4 -0
@@ -474,11 +474,15 @@ void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index);int mlx4_map_phys_fmr (struct mlx4_dev *dev,struct mlx4_fmr *fmr,u64 *page_list,int npages,u64 iova,u32 *lkey,u32 *rkey); +int mlx4_fmr_alloc_reserved (struct mlx4_dev *dev,u32 mridx,u32 pd, +u32 access,int max_pages,int max_maps, +u8 page_shift,struct mlx4_fmr *fmr);int mlx4_fmr_alloc (struct mlx4_dev *dev,u32 pd,u32 access,int max_pages,int max_maps,u8 page_shift,struct mlx4_fmr *fmr);int mlx4_fmr_enable (struct mlx4_dev *dev,struct mlx4_fmr *fmr);void mlx4_fmr_unmap (struct mlx4_dev *dev,struct mlx4_fmr *fmr,u32 *lkey,u32 *rkey); +int mlx4_fmr_free_reserved (struct mlx4_dev *dev,struct mlx4_fmr *fmr);int mlx4_fmr_free (struct mlx4_dev *dev,struct mlx4_fmr *fmr);int mlx4_SYNC_TPT (struct mlx4_dev *dev);
Signature · 1 line
1.6.3.3
_______________________________________________
ewg mailing list [email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg