On 10/18/2013 1:43 AM, Hefty, Sean wrote:
This commit introduces verbs for creating memory regions
which will allow new types of memory key operations such
as indirect memory registration and protected memory
registration.

Indirect memory registration is registering several (one
of more) pre-registered memory regions in a specific layout.
The Indirect region may potentialy describe several regions
and some repitition format between them.
I didn't follow this direct versus indirect difference.  See below.

Hey Sean, thanks for looking into this!

Indirect memory registration feature will be submitted in the future. Signature feature is using it "under the hood". I'll remove it from v2 as it creates a source of confusion and I want to concentrate on signature.

Now since you opened this door, briefly,
unlike direct (known) MRs which are associated with a page-list, indirect MRs can be associated with other MRs in the form of a list of tuples {lkey, addr, len} providing more flexible memory registrations.

+struct ib_mr *ib_create_mr(struct ib_pd *pd,
+                          struct ib_mr_init_attr *mr_init_attr)
+{
+       struct ib_mr *mr;
+
+       if (!pd->device->create_mr)
+               return ERR_PTR(-ENOSYS);
+
+       mr = pd->device->create_mr(pd, mr_init_attr);
+
+       if (!IS_ERR(mr)) {
+               mr->device  = pd->device;
+               mr->pd      = pd;
+               mr->uobject = NULL;
+               atomic_inc(&pd->usecnt);
+               atomic_set(&mr->usecnt, 0);
+       }
+
+       return mr;
+}
+EXPORT_SYMBOL(ib_create_mr);
+
+int ib_destroy_mr(struct ib_mr *mr)
+{
+       struct ib_pd *pd;
+       int ret;
+
+       if (atomic_read(&mr->usecnt))
+               return -EBUSY;
+
+       pd = mr->pd;
+       ret = mr->device->destroy_mr(mr);
+       if (!ret)
+               atomic_dec(&pd->usecnt);
+
+       return ret;
+}
+EXPORT_SYMBOL(ib_destroy_mr);
+
  struct ib_mr *ib_alloc_fast_reg_mr(struct ib_pd *pd, int
max_page_list_len)
  {
        struct ib_mr *mr;
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 645c3ce..65b7e79 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -925,6 +925,30 @@ enum ib_mr_rereg_flags {
        IB_MR_REREG_ACCESS      = (1<<2)
  };

+enum ib_mr_create_flags {
+               IB_MR_SIGNATURE_EN = 1,
+};
+
+enum ib_mr_reg_type {
+       IB_MR_REG_DIRECT,
+       IB_MR_REG_INDIRECT,
+};
+
+/**
+ * ib_mr_init_attr - Memory region init attributes passed to routine
+ *     ib_create_mr.
+ * @reg_type: requested mapping type, this can be direct/indirect
+ *   registration or repetitive structure registration.
+ * @max_reg_descriptors: max number of registration units that
+ *   may be used with UMR work requests.
+ * @flags: MR creation flags bit mask.
+ */
+struct ib_mr_init_attr {
+       enum ib_mr_reg_type     reg_type;
+       int                     max_reg_descriptors;
+       enum ib_mr_create_flags flags;
+};
+
  /**
   * struct ib_mw_bind - Parameters for a type 1 memory window bind
operation.
   * @wr_id:      Work request id.
@@ -1257,6 +1281,9 @@ struct ib_device {
        int                        (*query_mr)(struct ib_mr *mr,
                                               struct ib_mr_attr *mr_attr);
        int                        (*dereg_mr)(struct ib_mr *mr);
+       int                        (*destroy_mr)(struct ib_mr *mr);
+       struct ib_mr *             (*create_mr)(struct ib_pd *pd,
+                                               struct ib_mr_init_attr 
*mr_init_attr);
These create and destroy something called an 'MR', but are not actually 
associated with any memory buffers.  Is this some sort of conceptual 
sub-protection domain?  Why is this needed, versus defining new ib_mr_attr 
fields?

This MR can be perceived as a generalization of fast_reg MR. When using fast memory registration the verbs user will call ib_alloc_fast_reg_mr() in order to allocate an MR that may be used for fast registration method by posting a fast registration work-request on the send-queue (FRWR). The user does not pass any memory buffers to ib_alloc_fast_reg_mr() as the actual registration is done via posting WR. This follows the same notation, but allows new functionality (such as signature enable).

As things are today, No MR creation method (fast_reg, dma, phys, user...) allows passing initialization parameters. signature feature requires some internal resources management, and we need some kind of indication that signature is requested for this MR. I'm suggesting that this verb will cover the general case and later on, it is possible to extend this method to cover all existing flavors of MR creation (implement the existing ones with it).

Do you agree? or do you prefer to extend other MR allocation methods to receive initialization parameters?

- Sean

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to