|
@@ -1636,6 +1636,68 @@ int ib_modify_wq(struct ib_wq *wq, struct ib_wq_attr *wq_attr,
|
|
|
}
|
|
|
EXPORT_SYMBOL(ib_modify_wq);
|
|
|
|
|
|
+/*
|
|
|
+ * ib_create_rwq_ind_table - Creates a RQ Indirection Table.
|
|
|
+ * @device: The device on which to create the rwq indirection table.
|
|
|
+ * @ib_rwq_ind_table_init_attr: A list of initial attributes required to
|
|
|
+ * create the Indirection Table.
|
|
|
+ *
|
|
|
+ * Note: The life time of ib_rwq_ind_table_init_attr->ind_tbl is not less
|
|
|
+ * than the created ib_rwq_ind_table object and the caller is responsible
|
|
|
+ * for its memory allocation/free.
|
|
|
+ */
|
|
|
+struct ib_rwq_ind_table *ib_create_rwq_ind_table(struct ib_device *device,
|
|
|
+ struct ib_rwq_ind_table_init_attr *init_attr)
|
|
|
+{
|
|
|
+ struct ib_rwq_ind_table *rwq_ind_table;
|
|
|
+ int i;
|
|
|
+ u32 table_size;
|
|
|
+
|
|
|
+ if (!device->create_rwq_ind_table)
|
|
|
+ return ERR_PTR(-ENOSYS);
|
|
|
+
|
|
|
+ table_size = (1 << init_attr->log_ind_tbl_size);
|
|
|
+ rwq_ind_table = device->create_rwq_ind_table(device,
|
|
|
+ init_attr, NULL);
|
|
|
+ if (IS_ERR(rwq_ind_table))
|
|
|
+ return rwq_ind_table;
|
|
|
+
|
|
|
+ rwq_ind_table->ind_tbl = init_attr->ind_tbl;
|
|
|
+ rwq_ind_table->log_ind_tbl_size = init_attr->log_ind_tbl_size;
|
|
|
+ rwq_ind_table->device = device;
|
|
|
+ rwq_ind_table->uobject = NULL;
|
|
|
+ atomic_set(&rwq_ind_table->usecnt, 0);
|
|
|
+
|
|
|
+ for (i = 0; i < table_size; i++)
|
|
|
+ atomic_inc(&rwq_ind_table->ind_tbl[i]->usecnt);
|
|
|
+
|
|
|
+ return rwq_ind_table;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(ib_create_rwq_ind_table);
|
|
|
+
|
|
|
+/*
|
|
|
+ * ib_destroy_rwq_ind_table - Destroys the specified Indirection Table.
|
|
|
+ * @wq_ind_table: The Indirection Table to destroy.
|
|
|
+*/
|
|
|
+int ib_destroy_rwq_ind_table(struct ib_rwq_ind_table *rwq_ind_table)
|
|
|
+{
|
|
|
+ int err, i;
|
|
|
+ u32 table_size = (1 << rwq_ind_table->log_ind_tbl_size);
|
|
|
+ struct ib_wq **ind_tbl = rwq_ind_table->ind_tbl;
|
|
|
+
|
|
|
+ if (atomic_read(&rwq_ind_table->usecnt))
|
|
|
+ return -EBUSY;
|
|
|
+
|
|
|
+ err = rwq_ind_table->device->destroy_rwq_ind_table(rwq_ind_table);
|
|
|
+ if (!err) {
|
|
|
+ for (i = 0; i < table_size; i++)
|
|
|
+ atomic_dec(&ind_tbl[i]->usecnt);
|
|
|
+ }
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(ib_destroy_rwq_ind_table);
|
|
|
+
|
|
|
struct ib_flow *ib_create_flow(struct ib_qp *qp,
|
|
|
struct ib_flow_attr *flow_attr,
|
|
|
int domain)
|