Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma into for-next
I had merged the hfi1-tid code into my local copy of for-next, but was waiting on 0day testing before pushing it (I pushed it to my wip branch). Having waited several days for 0day testing to show up, I'm finally just going to push it out. In the meantime, though, Jason pushed other stuff to for-next, so I needed to merge up the branches before pushing. Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
@@ -50,7 +50,7 @@
|
||||
|
||||
/**
|
||||
* rvt_alloc_pd - allocate a protection domain
|
||||
* @ibdev: ib device
|
||||
* @ibpd: PD
|
||||
* @context: optional user context
|
||||
* @udata: optional user data
|
||||
*
|
||||
@@ -58,19 +58,14 @@
|
||||
*
|
||||
* Return: 0 on success
|
||||
*/
|
||||
struct ib_pd *rvt_alloc_pd(struct ib_device *ibdev,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
int rvt_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct ib_device *ibdev = ibpd->device;
|
||||
struct rvt_dev_info *dev = ib_to_rvt(ibdev);
|
||||
struct rvt_pd *pd;
|
||||
struct ib_pd *ret;
|
||||
struct rvt_pd *pd = ibpd_to_rvtpd(ibpd);
|
||||
int ret = 0;
|
||||
|
||||
pd = kzalloc(sizeof(*pd), GFP_KERNEL);
|
||||
if (!pd) {
|
||||
ret = ERR_PTR(-ENOMEM);
|
||||
goto bail;
|
||||
}
|
||||
/*
|
||||
* While we could continue allocating protecetion domains, being
|
||||
* constrained only by system resources. The IBTA spec defines that
|
||||
@@ -81,8 +76,7 @@ struct ib_pd *rvt_alloc_pd(struct ib_device *ibdev,
|
||||
spin_lock(&dev->n_pds_lock);
|
||||
if (dev->n_pds_allocated == dev->dparms.props.max_pd) {
|
||||
spin_unlock(&dev->n_pds_lock);
|
||||
kfree(pd);
|
||||
ret = ERR_PTR(-ENOMEM);
|
||||
ret = -ENOMEM;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
@@ -92,8 +86,6 @@ struct ib_pd *rvt_alloc_pd(struct ib_device *ibdev,
|
||||
/* ib_alloc_pd() will initialize pd->ibpd. */
|
||||
pd->user = !!udata;
|
||||
|
||||
ret = &pd->ibpd;
|
||||
|
||||
bail:
|
||||
return ret;
|
||||
}
|
||||
@@ -104,16 +96,11 @@ bail:
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int rvt_dealloc_pd(struct ib_pd *ibpd)
|
||||
void rvt_dealloc_pd(struct ib_pd *ibpd)
|
||||
{
|
||||
struct rvt_pd *pd = ibpd_to_rvtpd(ibpd);
|
||||
struct rvt_dev_info *dev = ib_to_rvt(ibpd->device);
|
||||
|
||||
spin_lock(&dev->n_pds_lock);
|
||||
dev->n_pds_allocated--;
|
||||
spin_unlock(&dev->n_pds_lock);
|
||||
|
||||
kfree(pd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -50,9 +50,8 @@
|
||||
|
||||
#include <rdma/rdma_vt.h>
|
||||
|
||||
struct ib_pd *rvt_alloc_pd(struct ib_device *ibdev,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int rvt_dealloc_pd(struct ib_pd *ibpd);
|
||||
int rvt_alloc_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
void rvt_dealloc_pd(struct ib_pd *ibpd);
|
||||
|
||||
#endif /* DEF_RDMAVTPD_H */
|
||||
|
@@ -436,6 +436,7 @@ static const struct ib_device_ops rvt_dev_ops = {
|
||||
.req_notify_cq = rvt_req_notify_cq,
|
||||
.resize_cq = rvt_resize_cq,
|
||||
.unmap_fmr = rvt_unmap_fmr,
|
||||
INIT_RDMA_OBJ_SIZE(ib_pd, rvt_pd, ibpd),
|
||||
};
|
||||
|
||||
static noinline int check_support(struct rvt_dev_info *rdi, int verb)
|
||||
|
@@ -162,11 +162,10 @@ int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
|
||||
u64 length, u64 iova, int access, struct ib_udata *udata,
|
||||
struct rxe_mem *mem)
|
||||
{
|
||||
int entry;
|
||||
struct rxe_map **map;
|
||||
struct rxe_phys_buf *buf = NULL;
|
||||
struct ib_umem *umem;
|
||||
struct scatterlist *sg;
|
||||
struct sg_page_iter sg_iter;
|
||||
int num_buf;
|
||||
void *vaddr;
|
||||
int err;
|
||||
@@ -191,16 +190,16 @@ int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
|
||||
goto err1;
|
||||
}
|
||||
|
||||
mem->page_shift = umem->page_shift;
|
||||
mem->page_mask = BIT(umem->page_shift) - 1;
|
||||
mem->page_shift = PAGE_SHIFT;
|
||||
mem->page_mask = PAGE_SIZE - 1;
|
||||
|
||||
num_buf = 0;
|
||||
map = mem->map;
|
||||
if (length > 0) {
|
||||
buf = map[0]->buf;
|
||||
|
||||
for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) {
|
||||
vaddr = page_address(sg_page(sg));
|
||||
for_each_sg_page(umem->sg_head.sgl, &sg_iter, umem->nmap, 0) {
|
||||
vaddr = page_address(sg_page_iter_page(&sg_iter));
|
||||
if (!vaddr) {
|
||||
pr_warn("null vaddr\n");
|
||||
err = -ENOMEM;
|
||||
@@ -208,7 +207,7 @@ int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
|
||||
}
|
||||
|
||||
buf->addr = (uintptr_t)vaddr;
|
||||
buf->size = BIT(umem->page_shift);
|
||||
buf->size = PAGE_SIZE;
|
||||
num_buf++;
|
||||
buf++;
|
||||
|
||||
|
@@ -46,6 +46,7 @@ struct rxe_type_info rxe_type_info[RXE_NUM_TYPES] = {
|
||||
[RXE_TYPE_PD] = {
|
||||
.name = "rxe-pd",
|
||||
.size = sizeof(struct rxe_pd),
|
||||
.flags = RXE_POOL_NO_ALLOC,
|
||||
},
|
||||
[RXE_TYPE_AH] = {
|
||||
.name = "rxe-ah",
|
||||
@@ -119,8 +120,10 @@ static void rxe_cache_clean(size_t cnt)
|
||||
|
||||
for (i = 0; i < cnt; i++) {
|
||||
type = &rxe_type_info[i];
|
||||
kmem_cache_destroy(type->cache);
|
||||
type->cache = NULL;
|
||||
if (!(type->flags & RXE_POOL_NO_ALLOC)) {
|
||||
kmem_cache_destroy(type->cache);
|
||||
type->cache = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,14 +137,17 @@ int rxe_cache_init(void)
|
||||
for (i = 0; i < RXE_NUM_TYPES; i++) {
|
||||
type = &rxe_type_info[i];
|
||||
size = ALIGN(type->size, RXE_POOL_ALIGN);
|
||||
type->cache = kmem_cache_create(type->name, size,
|
||||
RXE_POOL_ALIGN,
|
||||
RXE_POOL_CACHE_FLAGS, NULL);
|
||||
if (!type->cache) {
|
||||
pr_err("Unable to init kmem cache for %s\n",
|
||||
type->name);
|
||||
err = -ENOMEM;
|
||||
goto err1;
|
||||
if (!(type->flags & RXE_POOL_NO_ALLOC)) {
|
||||
type->cache =
|
||||
kmem_cache_create(type->name, size,
|
||||
RXE_POOL_ALIGN,
|
||||
RXE_POOL_CACHE_FLAGS, NULL);
|
||||
if (!type->cache) {
|
||||
pr_err("Unable to init kmem cache for %s\n",
|
||||
type->name);
|
||||
err = -ENOMEM;
|
||||
goto err1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -415,6 +421,37 @@ out_put_pool:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_entry *elem)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
might_sleep_if(!(pool->flags & RXE_POOL_ATOMIC));
|
||||
|
||||
read_lock_irqsave(&pool->pool_lock, flags);
|
||||
if (pool->state != RXE_POOL_STATE_VALID) {
|
||||
read_unlock_irqrestore(&pool->pool_lock, flags);
|
||||
return -EINVAL;
|
||||
}
|
||||
kref_get(&pool->ref_cnt);
|
||||
read_unlock_irqrestore(&pool->pool_lock, flags);
|
||||
|
||||
kref_get(&pool->rxe->ref_cnt);
|
||||
|
||||
if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
|
||||
goto out_put_pool;
|
||||
|
||||
elem->pool = pool;
|
||||
kref_init(&elem->ref_cnt);
|
||||
|
||||
return 0;
|
||||
|
||||
out_put_pool:
|
||||
atomic_dec(&pool->num_elem);
|
||||
rxe_dev_put(pool->rxe);
|
||||
rxe_pool_put(pool);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
void rxe_elem_release(struct kref *kref)
|
||||
{
|
||||
struct rxe_pool_entry *elem =
|
||||
@@ -424,7 +461,8 @@ void rxe_elem_release(struct kref *kref)
|
||||
if (pool->cleanup)
|
||||
pool->cleanup(elem);
|
||||
|
||||
kmem_cache_free(pool_cache(pool), elem);
|
||||
if (!(pool->flags & RXE_POOL_NO_ALLOC))
|
||||
kmem_cache_free(pool_cache(pool), elem);
|
||||
atomic_dec(&pool->num_elem);
|
||||
rxe_dev_put(pool->rxe);
|
||||
rxe_pool_put(pool);
|
||||
|
@@ -41,6 +41,7 @@ enum rxe_pool_flags {
|
||||
RXE_POOL_ATOMIC = BIT(0),
|
||||
RXE_POOL_INDEX = BIT(1),
|
||||
RXE_POOL_KEY = BIT(2),
|
||||
RXE_POOL_NO_ALLOC = BIT(4),
|
||||
};
|
||||
|
||||
enum rxe_elem_type {
|
||||
@@ -131,6 +132,9 @@ void rxe_pool_cleanup(struct rxe_pool *pool);
|
||||
/* allocate an object from pool */
|
||||
void *rxe_alloc(struct rxe_pool *pool);
|
||||
|
||||
/* connect already allocated object to pool */
|
||||
int rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_entry *elem);
|
||||
|
||||
/* assign an index to an indexed object and insert object into
|
||||
* pool's rb tree
|
||||
*/
|
||||
|
@@ -191,23 +191,20 @@ static int rxe_port_immutable(struct ib_device *dev, u8 port_num,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ib_pd *rxe_alloc_pd(struct ib_device *dev,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
static int rxe_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct rxe_dev *rxe = to_rdev(dev);
|
||||
struct rxe_pd *pd;
|
||||
struct rxe_dev *rxe = to_rdev(ibpd->device);
|
||||
struct rxe_pd *pd = to_rpd(ibpd);
|
||||
|
||||
pd = rxe_alloc(&rxe->pd_pool);
|
||||
return pd ? &pd->ibpd : ERR_PTR(-ENOMEM);
|
||||
return rxe_add_to_pool(&rxe->pd_pool, &pd->pelem);
|
||||
}
|
||||
|
||||
static int rxe_dealloc_pd(struct ib_pd *ibpd)
|
||||
static void rxe_dealloc_pd(struct ib_pd *ibpd)
|
||||
{
|
||||
struct rxe_pd *pd = to_rpd(ibpd);
|
||||
|
||||
rxe_drop_ref(pd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ib_ah *rxe_create_ah(struct ib_pd *ibpd,
|
||||
@@ -1183,6 +1180,7 @@ static const struct ib_device_ops rxe_dev_ops = {
|
||||
.reg_user_mr = rxe_reg_user_mr,
|
||||
.req_notify_cq = rxe_req_notify_cq,
|
||||
.resize_cq = rxe_resize_cq,
|
||||
INIT_RDMA_OBJ_SIZE(ib_pd, rxe_pd, ibpd),
|
||||
};
|
||||
|
||||
int rxe_register_device(struct rxe_dev *rxe)
|
||||
|
@@ -66,8 +66,8 @@ struct rxe_ucontext {
|
||||
};
|
||||
|
||||
struct rxe_pd {
|
||||
struct ib_pd ibpd;
|
||||
struct rxe_pool_entry pelem;
|
||||
struct ib_pd ibpd;
|
||||
};
|
||||
|
||||
struct rxe_ah {
|
||||
|
Reference in New Issue
Block a user