(ufmr_pool1_blocksize + PAGE_SIZE) >> PAGE_SHIFT;
int pool2pages =
(ufmr_pool2_blocksize + PAGE_SIZE) >> PAGE_SHIFT;
- struct ib_pd *pool_pd = file->device->ib_dev->relaxed_pd;
+ struct ib_pd *pool_pd = NULL;
+
+ /*
+ * If not already allocated, we do (lazy)
+ * pd allocation for usnic node type devices!
+ */
+ if (file->device &&
+ file->device->ib_dev &&
+ file->device->ib_dev->relaxed_pd == NULL &&
+ (file->device->ib_dev->node_type == RDMA_NODE_USNIC ||
+ file->device->ib_dev->node_type == RDMA_NODE_USNIC_UDP)) {
+ file->device->ib_dev->relaxed_pd =
+ ib_alloc_pd(file->device->ib_dev);
+ if (IS_ERR(file->device->ib_dev->relaxed_pd)) {
+ ret = PTR_ERR(file->device->ib_dev->relaxed_pd);
+ file->device->ib_dev->relaxed_pd = NULL;
+ goto err_put;
+ }
+ }
+
+ pool_pd = file->device->ib_dev->relaxed_pd;
/* Create pool for 8kb buffers */
ret = create_fmr_pool(pool_pd, pool1pages, ufmr_pool1_nelems,
if (device_create_file(uverbs_dev->dev, &dev_attr_abi_version))
goto err_class;
- device->relaxed_pd = ib_alloc_pd(device);
- if (IS_ERR(device->relaxed_pd)) {
- device->relaxed_pd = NULL;
- goto err_class;
+ device->relaxed_pd = NULL;
+ /*
+ * Allocate pd if not a usnic device node
+ * (For usnic devices we do lazy allocation of pd)
+ */
+ if (device->node_type != RDMA_NODE_USNIC &&
+ device->node_type != RDMA_NODE_USNIC_UDP) {
+ device->relaxed_pd = ib_alloc_pd(device);
+ if (IS_ERR(device->relaxed_pd)) {
+ device->relaxed_pd = NULL;
+ goto err_class;
+ }
}
ib_set_client_data(device, &uverbs_client, uverbs_dev);
kfree(pos);
}
- ret = ib_dealloc_pd(device->relaxed_pd);
- device->relaxed_pd = NULL;
+ /* free pd if allocated! */
+ if (device->relaxed_pd) {
+ ret = ib_dealloc_pd(device->relaxed_pd);
+ device->relaxed_pd = NULL;
+ }
dev_set_drvdata(uverbs_dev->dev, NULL);
device_destroy(uverbs_class, uverbs_dev->cdev.dev);