mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
IB: Enable FMR pool user to set page size
This patch allows the consumer to set the page size of "pages" mapped by the pool FMRs, which is a feature already existing in the base verbs API. On the cosmetic side it changes ib_fmr_attr.page_size field to be named page_shift. Signed-off-by: Or Gerlitz <ogerlitz@voltaire.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
6dfc3901b0
commit
d36f34aadf
@ -278,9 +278,9 @@ struct ib_fmr_pool *ib_create_fmr_pool(struct ib_pd *pd,
|
||||
{
|
||||
struct ib_pool_fmr *fmr;
|
||||
struct ib_fmr_attr attr = {
|
||||
.max_pages = params->max_pages_per_fmr,
|
||||
.max_maps = IB_FMR_MAX_REMAPS,
|
||||
.page_size = PAGE_SHIFT
|
||||
.max_pages = params->max_pages_per_fmr,
|
||||
.max_maps = IB_FMR_MAX_REMAPS,
|
||||
.page_shift = params->page_shift
|
||||
};
|
||||
|
||||
for (i = 0; i < params->pool_size; ++i) {
|
||||
|
@ -491,7 +491,7 @@ int mthca_fmr_alloc(struct mthca_dev *dev, u32 pd,
|
||||
int err = -ENOMEM;
|
||||
int i;
|
||||
|
||||
if (mr->attr.page_size < 12 || mr->attr.page_size >= 32)
|
||||
if (mr->attr.page_shift < 12 || mr->attr.page_shift >= 32)
|
||||
return -EINVAL;
|
||||
|
||||
/* For Arbel, all MTTs must fit in the same page. */
|
||||
@ -543,7 +543,7 @@ int mthca_fmr_alloc(struct mthca_dev *dev, u32 pd,
|
||||
MTHCA_MPT_FLAG_REGION |
|
||||
access);
|
||||
|
||||
mpt_entry->page_size = cpu_to_be32(mr->attr.page_size - 12);
|
||||
mpt_entry->page_size = cpu_to_be32(mr->attr.page_shift - 12);
|
||||
mpt_entry->key = cpu_to_be32(key);
|
||||
mpt_entry->pd = cpu_to_be32(pd);
|
||||
memset(&mpt_entry->start, 0,
|
||||
@ -611,7 +611,7 @@ static inline int mthca_check_fmr(struct mthca_fmr *fmr, u64 *page_list,
|
||||
if (list_len > fmr->attr.max_pages)
|
||||
return -EINVAL;
|
||||
|
||||
page_mask = (1 << fmr->attr.page_size) - 1;
|
||||
page_mask = (1 << fmr->attr.page_shift) - 1;
|
||||
|
||||
/* We are getting page lists, so va must be page aligned. */
|
||||
if (iova & page_mask)
|
||||
@ -659,7 +659,7 @@ int mthca_tavor_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list,
|
||||
}
|
||||
|
||||
mpt_entry.lkey = cpu_to_be32(key);
|
||||
mpt_entry.length = cpu_to_be64(list_len * (1ull << fmr->attr.page_size));
|
||||
mpt_entry.length = cpu_to_be64(list_len * (1ull << fmr->attr.page_shift));
|
||||
mpt_entry.start = cpu_to_be64(iova);
|
||||
|
||||
__raw_writel((__force u32) mpt_entry.lkey, &fmr->mem.tavor.mpt->key);
|
||||
@ -700,7 +700,7 @@ int mthca_arbel_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list,
|
||||
|
||||
fmr->mem.arbel.mpt->key = cpu_to_be32(key);
|
||||
fmr->mem.arbel.mpt->lkey = cpu_to_be32(key);
|
||||
fmr->mem.arbel.mpt->length = cpu_to_be64(list_len * (1ull << fmr->attr.page_size));
|
||||
fmr->mem.arbel.mpt->length = cpu_to_be64(list_len * (1ull << fmr->attr.page_shift));
|
||||
fmr->mem.arbel.mpt->start = cpu_to_be64(iova);
|
||||
|
||||
wmb();
|
||||
|
@ -43,6 +43,7 @@ struct ib_fmr_pool;
|
||||
/**
|
||||
* struct ib_fmr_pool_param - Parameters for creating FMR pool
|
||||
* @max_pages_per_fmr:Maximum number of pages per map request.
|
||||
* @page_shift: Log2 of sizeof "pages" mapped by this fmr
|
||||
* @access:Access flags for FMRs in pool.
|
||||
* @pool_size:Number of FMRs to allocate for pool.
|
||||
* @dirty_watermark:Flush is triggered when @dirty_watermark dirty
|
||||
@ -55,6 +56,7 @@ struct ib_fmr_pool;
|
||||
*/
|
||||
struct ib_fmr_pool_param {
|
||||
int max_pages_per_fmr;
|
||||
int page_shift;
|
||||
enum ib_access_flags access;
|
||||
int pool_size;
|
||||
int dirty_watermark;
|
||||
|
@ -651,7 +651,7 @@ struct ib_mw_bind {
|
||||
struct ib_fmr_attr {
|
||||
int max_pages;
|
||||
int max_maps;
|
||||
u8 page_size;
|
||||
u8 page_shift;
|
||||
};
|
||||
|
||||
struct ib_ucontext {
|
||||
|
Loading…
Reference in New Issue
Block a user