/*
* If an FMR is not in use, then the list member will point to either
* its pool's free_list (if the FMR can be mapped again; that is,
- * remap_count < pool->max_remaps) or its pool's dirty_list (if the
+ * remap_count < IB_FMR_MAX_REMAPS) or its pool's dirty_list (if the
* FMR needs to be unmapped before being remapped). In either of
* these cases it is a bug if the ref_count is not 0. In other words,
* if ref_count is > 0, then the list member must not be linked into
int pool_size;
int max_pages;
- int max_remaps;
int dirty_watermark;
int dirty_len;
struct list_head free_list;
{
struct ib_device *device;
struct ib_fmr_pool *pool;
- struct ib_device_attr *attr;
int i;
int ret;
- int max_remaps;
if (!params)
return ERR_PTR(-EINVAL);
return ERR_PTR(-ENOSYS);
}
- attr = kmalloc(sizeof *attr, GFP_KERNEL);
- if (!attr) {
- printk(KERN_WARNING "couldn't allocate device attr struct");
- return ERR_PTR(-ENOMEM);
- }
-
- ret = ib_query_device(device, attr);
- if (ret) {
- printk(KERN_WARNING "couldn't query device");
- kfree(attr);
- return ERR_PTR(ret);
- }
-
- if (!attr->max_map_per_fmr)
- max_remaps = IB_FMR_MAX_REMAPS;
- else
- max_remaps = attr->max_map_per_fmr;
-
- kfree(attr);
-
pool = kmalloc(sizeof *pool, GFP_KERNEL);
if (!pool) {
printk(KERN_WARNING "couldn't allocate pool struct");
pool->pool_size = 0;
pool->max_pages = params->max_pages_per_fmr;
- pool->max_remaps = max_remaps;
pool->dirty_watermark = params->dirty_watermark;
pool->dirty_len = 0;
spin_lock_init(&pool->pool_lock);
struct ib_pool_fmr *fmr;
struct ib_fmr_attr attr = {
.max_pages = params->max_pages_per_fmr,
- .max_maps = pool->max_remaps,
+ .max_maps = IB_FMR_MAX_REMAPS,
.page_shift = params->page_shift
};
struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle,
u64 *page_list,
int list_len,
- u64 io_virtual_address)
+ u64 *io_virtual_address)
{
struct ib_fmr_pool *pool = pool_handle;
struct ib_pool_fmr *fmr;
fmr = ib_fmr_cache_lookup(pool,
page_list,
list_len,
- io_virtual_address);
+ *io_virtual_address);
if (fmr) {
/* found in cache */
++fmr->ref_count;
spin_unlock_irqrestore(&pool->pool_lock, flags);
result = ib_map_phys_fmr(fmr->fmr, page_list, list_len,
- io_virtual_address);
+ *io_virtual_address);
if (result) {
spin_lock_irqsave(&pool->pool_lock, flags);
fmr->ref_count = 1;
if (pool->cache_bucket) {
- fmr->io_virtual_address = io_virtual_address;
+ fmr->io_virtual_address = *io_virtual_address;
fmr->page_list_len = list_len;
memcpy(fmr->page_list, page_list, list_len * sizeof(*page_list));
--fmr->ref_count;
if (!fmr->ref_count) {
- if (fmr->remap_count < pool->max_remaps) {
+ if (fmr->remap_count < IB_FMR_MAX_REMAPS) {
list_add_tail(&fmr->list, &pool->free_list);
} else {
list_add_tail(&fmr->list, &pool->dirty_list);