RE: [PATCH V1 for-next 1/9] IB/core: Introduce peer client interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Bart,

> -----Original Message-----
> From: Bart Van Assche [mailto:bvanassche@xxxxxxx]
> Sent: Wednesday, October 08, 2014 12:23 PM
> To: Yishai Hadas; roland@xxxxxxxxxx
> Cc: linux-rdma@xxxxxxxxxxxxxxx; Shachar Raindel
> Subject: Re: [PATCH V1 for-next 1/9] IB/core: Introduce peer client
> interface
> 
> On 10/06/14 15:26, Yishai Hadas wrote:
> > +/**
> > + *  struct peer_memory_client - registration information for peer
> client.
> > + *  @name:	peer client name
> > + *  @version:	peer client version
> > + *  @acquire:	callback function to be used by IB core to detect
> whether a

<SNIP - long comment>

> > + *
> > + **/
> 
> The kernel-doc output for the above comment block is incomplete. Please
> fix this, and please also fix the warnings reported by the kernel-doc

We are not sure what is the best way to document an operations struct
using nanodocs.
Looking at mmu_notifiers, they are documented inline, using a
comment style that nanodoc can't parse
(http://lxr.free-electrons.com/source/include/linux/mmu_notifier.h#L27 )
Looking at the file_operations struct, there is no documentation
whatsoever
(http://lxr.free-electrons.com/source/include/linux/fs.h#L1482 )
Looking at ib_device
(http://lxr.free-electrons.com/source/include/rdma/ib_verbs.h#L1436 ),
again there is no documentation.

> tool. The attached HTML file has been generated as follows:
> 
> scripts/kernel-doc -html include/rdma/peer_mem.h >peer_mem.html
> Error(include/rdma/peer_mem.h:136): duplicate section name 'Return'
> Error(include/rdma/peer_mem.h:146): duplicate section name 'Return'
> Error(include/rdma/peer_mem.h:156): duplicate section name 'Return'
> Error(include/rdma/peer_mem.h:161): duplicate section name 'Return'
> Warning(include/rdma/peer_mem.h:178): Excess struct/union/enum/typedef
> member 'addr' description in 'peer_memory_client'
> Warning(include/rdma/peer_mem.h:178): Excess struct/union/enum/typedef
> member 'size' description in 'peer_memory_client'
> 

I attach our current nanodoc parsable comment. No errors are now
generated when running kernel-doc on the attached file.
Is this what you are aiming at? Can you give an example for the proper
way to format such comments?


Thanks,
--Shachar
/*
 * Copyright (c) 2014,  Mellanox Technologies. All rights reserved.
 *
 * This software is available to you under a choice of one of two
 * licenses.  You may choose to be licensed under the terms of the GNU
 * General Public License (GPL) Version 2, available from the file
 * COPYING in the main directory of this source tree, or the
 * OpenIB.org BSD license below:
 *
 *     Redistribution and use in source and binary forms, with or
 *     without modification, are permitted provided that the following
 *     conditions are met:
 *
 *      - Redistributions of source code must retain the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer.
 *
 *      - Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer in the documentation and/or other materials
 *        provided with the distribution.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#if !defined(PEER_MEM_H)
#define PEER_MEM_H

#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/export.h>
#include <linux/scatterlist.h>

#define IB_PEER_MEMORY_NAME_MAX 64
#define IB_PEER_MEMORY_VER_MAX 16

/**
 *  struct peer_memory_client - registration information for peer client.
 *  @name:	peer client name
 *  @version:	peer client version
 *  @acquire:	callback function to be used by IB core to detect whether a
 *		virtual address in under the responsibility of a specific peer client.
 *  @get_pages: callback function to be used by IB core asking the peer client to pin
 *		the physical pages of the given address range and returns that information.
 *		It equivalents to the kernel API of get_user_pages(), but targets peer memory.
 *  @dma_map:	callback function to be used by IB core asking the peer client to fill
 *		the dma address mapping for a given address range.
 *  @dma_unmap:	callback function to be used by IB core asking the peer client to take
 *		relevant actions to unmap the memory.
 *  @put_pages:	callback function to be used by IB core asking the peer client to remove the
 *		pinning from the given memory.
 *		It's the peer-direct equivalent of the kernel API put_page.
 *  @get_page_size: callback function to be used by IB core to query the peer client for
 *		    the page size for the given allocation.
 *  @release:	callback function to be used by IB core asking peer client to release all
 *		resources associated with previous acquire call. The call will be performed
 *		only for contexts that have been successfully acquired (i.e. acquire returned a non-zero value).
 *              Additionally, IB core guarentees that there will be no pages pinned through this context when the callback is called.
 *
 *  The subsections in this description contain detailed description
 *  of the callback arguments and expected return values for the
 *  callbacks defined in this struct.
 *
 *	acquire:
 *
 *              Callback function to be used by IB core to detect
 *		whether a virtual address in under the responsibility
 *		of a specific peer client.
 *
 *		addr	[IN] - virtual address to be checked whether belongs to peer.
 *
 *		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.
 *
 *		If peer takes responsibility on the given address range further calls for memory management
 *		will be directed to the callbacks of this peer client.
 *
 *		Return - 1 in case peer client takes responsibility on that range otherwise 0.
 *			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.
 *
 *	get_pages:
 *
 *              Callback function to be used by IB core asking the
 *		peer client to pin the physical pages of the given
 *		address range and returns that information.  It
 *		equivalents to the kernel API of get_user_pages(), but
 *		targets peer memory.
 *
 *		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 read only. 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] - 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 - 0 success, otherwise errno error code.
 *
 *	dma_map:
 *
 *              Callback function to be used by IB core asking the peer client to fill
 *		the dma address mapping for a given address range.
 *
 *		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 - 0 success, otherwise errno error code.
 *
 *	dma_unmap:
 *
 *              Callback function to be used by IB core asking the peer client to take
 *		relevant actions to unmap the memory.
 *
 *		sg_head        [IN] - 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.
 *
 *		Return -  0 success, otherwise errno error code.
 *
 *	put_pages:
 *
 *              Callback function to be used by IB core asking the peer client to remove the
 *		pinning from the given memory.
 *		It's the peer-direct equivalent of the kernel API put_page.
 *
 *		sg_head        [IN] - pointer to head of struct sg_table.
 *
 *		client_context [IN] - peer context for that given allocation.
 *
 *	get_page_size:
 *
 *              Callback function to be used by IB core to query the
 *		peer client for the page size for the given
 *		allocation.
 *
 *		sg_head        [IN] - pointer to head of struct sg_table.
 *
 *		client_context [IN] - peer context for that given allocation.
 *
 *		Return -  Page size in bytes
 *
 *	release:
 *
 *              Callback function to be used by IB core asking peer
 *		client to release all resources associated with
 *		previous acquire call. The call will be performed only
 *		for contexts that have been successfully acquired
 *		(i.e. acquire returned a non-zero value).
 *		Additionally, IB core guarentees that there will be no
 *		pages pinned through this context when the callback is
 *		called.
 *
 *		client_context [IN] - peer context for the given allocation.
 *
 **/
struct peer_memory_client {
	char	name[IB_PEER_MEMORY_NAME_MAX];
	char	version[IB_PEER_MEMORY_VER_MAX];
	int (*acquire)(unsigned long addr, size_t size, void *peer_mem_private_data,
		       char *peer_mem_name, void **client_context);
	int (*get_pages)(unsigned long addr,
			 size_t size, int write, int force,
			 struct sg_table *sg_head,
			 void *client_context, u64 core_context);
	int (*dma_map)(struct sg_table *sg_head, void *client_context,
		       struct device *dma_device, int dmasync, int *nmap);
	int (*dma_unmap)(struct sg_table *sg_head, void *client_context,
			 struct device  *dma_device);
	void (*put_pages)(struct sg_table *sg_head, void *client_context);
	unsigned long (*get_page_size)(void *client_context);
	void (*release)(void *client_context);
};

typedef int (*invalidate_peer_memory)(void *reg_handle, u64 core_context);

void *ib_register_peer_memory_client(const struct peer_memory_client *peer_client,
				     invalidate_peer_memory *invalidate_callback);
void ib_unregister_peer_memory_client(void *reg_handle);

#endif

[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux