> Subject: [PATCH rdma-next 03/13] RDMA/mana_ib: helpers to allocate kernel > queues > > From: Konstantin Taranov <kotaranov@xxxxxxxxxxxxx> > > Introduce helpers to allocate queues for kernel-level use. > > Signed-off-by: Konstantin Taranov <kotaranov@xxxxxxxxxxxxx> > Reviewed-by: Shiraz Saleem <shirazsaleem@xxxxxxxxxxxxx> Reviewed-by: Long Li <longli@xxxxxxxxxxxxx> > --- > drivers/infiniband/hw/mana/main.c | 23 +++++++++++++++++++ > drivers/infiniband/hw/mana/mana_ib.h | 3 +++ > .../net/ethernet/microsoft/mana/gdma_main.c | 1 + > 3 files changed, 27 insertions(+) > > diff --git a/drivers/infiniband/hw/mana/main.c > b/drivers/infiniband/hw/mana/main.c > index 45b251b..f2f6bb3 100644 > --- a/drivers/infiniband/hw/mana/main.c > +++ b/drivers/infiniband/hw/mana/main.c > @@ -240,6 +240,27 @@ void mana_ib_dealloc_ucontext(struct ib_ucontext > *ibcontext) > ibdev_dbg(ibdev, "Failed to destroy doorbell page %d\n", ret); } > > +int mana_ib_create_kernel_queue(struct mana_ib_dev *mdev, u32 size, enum > gdma_queue_type type, > + struct mana_ib_queue *queue) > +{ > + struct gdma_context *gc = mdev_to_gc(mdev); > + struct gdma_queue_spec spec = {}; > + int err; > + > + queue->id = INVALID_QUEUE_ID; > + queue->gdma_region = GDMA_INVALID_DMA_REGION; > + spec.type = type; > + spec.monitor_avl_buf = false; > + spec.queue_size = size; > + err = mana_gd_create_mana_wq_cq(&gc->mana_ib, &spec, &queue- > >kmem); > + if (err) > + return err; > + /* take ownership into mana_ib from mana */ > + queue->gdma_region = queue->kmem->mem_info.dma_region_handle; > + queue->kmem->mem_info.dma_region_handle = > GDMA_INVALID_DMA_REGION; > + return 0; > +} > + > int mana_ib_create_queue(struct mana_ib_dev *mdev, u64 addr, u32 size, > struct mana_ib_queue *queue) > { > @@ -279,6 +300,8 @@ void mana_ib_destroy_queue(struct mana_ib_dev > *mdev, struct mana_ib_queue *queue > */ > mana_ib_gd_destroy_dma_region(mdev, queue->gdma_region); > ib_umem_release(queue->umem); > + if (queue->kmem) > + mana_gd_destroy_queue(mdev_to_gc(mdev), queue->kmem); > } > > static int > diff --git a/drivers/infiniband/hw/mana/mana_ib.h > b/drivers/infiniband/hw/mana/mana_ib.h > index b53a5b4..79ebd95 100644 > --- a/drivers/infiniband/hw/mana/mana_ib.h > +++ b/drivers/infiniband/hw/mana/mana_ib.h > @@ -52,6 +52,7 @@ struct mana_ib_adapter_caps { > > struct mana_ib_queue { > struct ib_umem *umem; > + struct gdma_queue *kmem; > u64 gdma_region; > u64 id; > }; > @@ -388,6 +389,8 @@ int mana_ib_create_dma_region(struct mana_ib_dev > *dev, struct ib_umem *umem, int mana_ib_gd_destroy_dma_region(struct > mana_ib_dev *dev, > mana_handle_t gdma_region); > > +int mana_ib_create_kernel_queue(struct mana_ib_dev *mdev, u32 size, enum > gdma_queue_type type, > + struct mana_ib_queue *queue); > int mana_ib_create_queue(struct mana_ib_dev *mdev, u64 addr, u32 size, > struct mana_ib_queue *queue); > void mana_ib_destroy_queue(struct mana_ib_dev *mdev, struct > mana_ib_queue *queue); diff --git > a/drivers/net/ethernet/microsoft/mana/gdma_main.c > b/drivers/net/ethernet/microsoft/mana/gdma_main.c > index e97af7a..3cb0543 100644 > --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c > +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c > @@ -867,6 +867,7 @@ free_q: > kfree(queue); > return err; > } > +EXPORT_SYMBOL_NS(mana_gd_create_mana_wq_cq, NET_MANA); > > void mana_gd_destroy_queue(struct gdma_context *gc, struct gdma_queue > *queue) { > -- > 2.43.0