On 10/01/14 17:18, Yishai Hadas wrote:
+static int num_registered_peers;

Is the only purpose of this variable to check whether or not peer_memory_list is empty ? In that case please drop this variable and use list_empty() instead.

+static int ib_invalidate_peer_memory(void *reg_handle, void *core_context)
+
+{
+       return -ENOSYS;
+}

Please follow the Linux kernel coding style which means no empty line above the function body.

+#define PEER_MEM_MANDATORY_FUNC(x) {\
+       offsetof(struct peer_memory_client, x), #x }

Shouldn't the opening brace have been placed on the same line as the offsetof() macro to improve readability ?

+       if (invalidate_callback) {
+               *invalidate_callback = ib_invalidate_peer_memory;
+               ib_peer_client->invalidation_required = 1;
+       }
+       mutex_lock(&peer_memory_mutex);
+       list_add_tail(&ib_peer_client->core_peer_list, &peer_memory_list);
+       num_registered_peers++;
+       mutex_unlock(&peer_memory_mutex);
+       return ib_peer_client;

Please insert an empty line before mutex_lock() and after mutex_unlock().

+void ib_unregister_peer_memory_client(void *reg_handle)
+{
+       struct ib_peer_memory_client *ib_peer_client =
+               (struct ib_peer_memory_client *)reg_handle;

No cast is needed when assigning a void pointer to a non-void pointer.

+struct peer_memory_client {
+       char    name[IB_PEER_MEMORY_NAME_MAX];
+       char    version[IB_PEER_MEMORY_VER_MAX];
+       /* The peer-direct controller (IB CORE) uses this callback to detect if 
a virtual address is under
+        * the responsibility of a specific peer direct client. If the answer 
is positive further calls
+        * for memory management will be directed to the callback of this peer 
driver.
+        * Any peer internal error should resulted in a zero answer, in case 
address range
+        * really belongs to the peer, no owner will be found and application 
will get an error
+        * from IB CORE as expected.
+        * Parameters:
+               addr                  [IN]  - virtual address to be checked 
whether belongs to.
+               size                  [IN]  - size of memory area starting at 
addr.
+               peer_mem_private_data [IN]  - The contents of ib_ucontext-> 
peer_mem_private_data.
+                                             This parameter allows usage of 
the peer-direct
+                                             API in implementations where it 
is impossible
+                                             to detect if the memory belongs 
to the device
+                                             based upon the virtual address 
alone. In such
+                                             cases, the peer device can create 
a special
+                                             ib_ucontext, which will be 
associated with the
+                                             relevant peer memory.
+               peer_mem_name         [IN]  - The contents of ib_ucontext-> 
peer_mem_name.
+                                             Used to identify the peer memory 
client that
+                                             initialized the ib_ucontext.
+                                             This parameter is normally used 
along with
+                                             peer_mem_private_data.
+               client_context        [OUT] - peer opaque data which holds a 
peer context for
+                                             the acquired address range, will 
be provided
+                                             back to the peer memory in 
subsequent
+                                             calls for that given memory.
+
+       * Return value:
+       *       1 - virtual address belongs to the peer device, otherwise 0
+       */
+       int (*acquire)(unsigned long addr, size_t size, void 
*peer_mem_private_data,
+                      char *peer_mem_name, void **client_context);
+       /* The peer memory client is expected to pin the physical pages of the 
given address range
+        * and to fill sg_table with the information of the
+        * physical pages associated with the given address range. This 
function is
+        * equivalent to the kernel API of get_user_pages(), but targets peer 
memory.
+        * Parameters:
+               addr           [IN] - start virtual address of that given 
allocation.
+               size           [IN] - size of memory area starting at addr.
+               write          [IN] - indicates whether the pages will be 
written to by the caller.
+                                     Same meaning as of kernel API 
get_user_pages, can be
+                                     ignored if not relevant.
+               force          [IN] - indicates whether to force write access 
even if user
+                                     mapping is readonly. Same meaning as of 
kernel API
+                                     get_user_pages, can be ignored if not 
relevant.
+               sg_head        [IN/OUT] - pointer to head of struct sg_table.
+                                         The peer client should allocate a 
table big
+                                         enough to store all of the required 
entries. This
+                                         function should fill the table with 
physical addresses
+                                         and sizes of the memory segments 
composing this
+                                         memory mapping.
+                                         The table allocation can be done 
using sg_alloc_table.
+                                         Filling in the physical memory 
addresses and size can
+                                         be done using sg_set_page.
+               client_context [IN] - peer context for the given allocation, as 
received from
+                                     the acquire call.
+               core_context   [IN] - opaque IB core context. If the peer 
client wishes to
+                                     invalidate any of the pages pinned 
through this API,
+                                     it must provide this context as an 
argument to the
+                                     invalidate callback.
+
+       * Return value:
+       *       0 success, otherwise errno error code.
+       */
+       int (*get_pages)(unsigned long addr,
+                        size_t size, int write, int force,
+                        struct sg_table *sg_head,
+                        void *client_context, void *core_context);
+       /* The peer-direct controller (IB CORE) calls this function to request 
from the
+        * peer driver to fill the sg_table with dma address mapping for the 
peer memory exposed.
+        * The parameters provided have the parameters for calling dma_map_sg.
+        * Parameters:
+               sg_head        [IN/OUT] - pointer to head of struct sg_table. 
The peer memory
+                                         should fill the dma_address & 
dma_length for
+                                         each scatter gather entry in the 
table.
+               client_context [IN] - peer context for the allocation mapped.
+               dma_device     [IN] - the RDMA capable device which requires 
access to the
+                                     peer memory.
+               dmasync        [IN] - flush in-flight DMA when the memory 
region is written.
+                                     Same meaning as with host memory mapping, 
can be ignored if not relevant.
+               nmap           [OUT] - number of mapped/set entries.
+
+       * Return value:
+       *               0 success, otherwise errno error code.
+       */
+       int (*dma_map)(struct sg_table *sg_head, void *client_context,
+                      struct device *dma_device, int dmasync, int *nmap);
+       /* This callback is the opposite of the dma map API, it should take 
relevant actions
+        * to unmap the memory.
+       * Parameters:
+               sg_head        [IN/OUT] - pointer to head of struct sg_table. 
The peer memory
+                                         should fill the dma_address & 
dma_length for
+                                         each scatter gather entry in the 
table.
+               client_context [IN] - peer context for the allocation mapped.
+               dma_device     [IN] - the RDMA capable device which requires 
access to the
+                                     peer memory.
+               dmasync        [IN] - flush in-flight DMA when the memory 
region is written.
+                                     Same meaning as with host memory mapping, 
can be ignored if not relevant.
+               nmap           [OUT] - number of mapped/set entries.
+
+       * Return value:
+       *       0 success, otherwise errno error code.
+       */
+       int (*dma_unmap)(struct sg_table *sg_head, void *client_context,
+                        struct device  *dma_device);
+       /* This callback is the opposite of the get_pages API, it should remove 
the pinning
+        * from the pages, it's the peer-direct equivalent of the kernel API 
put_page.
+        * Parameters:
+               sg_head        [IN] - pointer to head of struct sg_table.
+               client_context [IN] - peer context for that given allocation.
+       */
+       void (*put_pages)(struct sg_table *sg_head, void *client_context);
+       /* This callback returns page size for the given allocation
+        * Parameters:
+               sg_head        [IN] - pointer to head of struct sg_table.
+               client_context [IN] - peer context for that given allocation.
+       * Return value:
+       *       Page size in bytes
+       */
+       unsigned long (*get_page_size)(void *client_context);
+       /* This callback is the opposite of the acquire call, let peer release 
all resources associated
+        * with the acquired context. The call will be performed only for 
contexts that have been
+        * successfully acquired (i.e. acquire returned a non-zero value).
+        * Parameters:
+        *      client_context [IN] - peer context for the given allocation.
+       */
+       void (*release)(void *client_context);
+
+};

All these comments inside a struct make a struct definition hard to read. Please use kernel-doc style instead. See also https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/kernel-doc-nano-HOWTO.txt.

Thanks,

Bart.

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

Reply via email to