johansen at sun.com wrote:
> On Wed, Sep 09, 2009 at 04:02:15PM -0500, Rich.Brown at sun.com wrote:
>   
>>  == Introduction/Background ==
>>
>>  Zero-copy (copy avoidance) is essentially buffer sharing
>>  among multiple modules that pass data between the modules. 
>>  This proposal avoids the data copy in the READ/WRITE path 
>>  of filesystems, by providing a mechanism to share data buffers
>>  between the modules. It is intended to be used by network file
>>  sharing services like NFS, CIFS or others.
>>
>>  Although the buffer sharing can be achieved through a few different
>>  solutions, any such solution must work with File Event Monitors
>>  (FEM monitors)[1] installed on the files. The solution must
>>  allow the underlying filesystem to maintain any existing file 
>>  range locking in the filesystem.
>>  
>>  The proposed solution provides extensions to the existing VOP
>>  interface to request and return buffers from a filesystem. The 
>>  buffers are then used with existing VOP_READ/VOP_WRITE calls with
>>  minimal changes.
>>
>>
>>  == Proposed Changes ==
>>     
> <...>
>
>   
>>  == Using the New VOP Interfaces for Zero-copy ==
>>
>>  VOP_REQZCBUF()/VOP_RETZCBUF() are expected to be used in conjunction with
>>  VOP_READ() or VOP_WRITE() to implement zero-copy read or write. 
>>
>>  a. Read
>>
>>     In a normal read, the consumer allocates the data buffer and passes it to
>>     VOP_READ().  The provider initiates the I/O, and copies the data from its
>>     own cache buffer to the consumer supplied buffer.
>>
>>     To avoid the copy (initiating a zero-copy read), the consumer
>>     first calls VOP_REQZCBUF() to inform the provider to prepare to
>>     loan out its cache buffer.  It then calls VOP_READ().  After the
>>     call returns, the consumer has direct access to the cache buffer
>>     loaned out by the provider.  After processing the data, the
>>     consumer calls VOP_RETZCBUF() to return the loaned cache buffer to
>>     the provider.
>>     
> <...>
>
>   
>>  b. Write
>>
>>     In a normal write, the consumer allocates the data buffer, loads the 
>> data,
>>     and passes the buffer to VOP_WRITE().  The provider copies the data from
>>     the consumer supplied buffer to its own cache buffer, and starts the I/O.
>>
>>     To initiate a zero-copy write, the consumer first calls VOP_REQZCBUF() to
>>     grab a cache buffer from the provider.  It loads the data directly to
>>     the loaned cache buffer, and calls VOP_WRITE().  After the call returns,
>>     the consumer calls VOP_RETZCBUF() to return the loaned cache buffer to
>>     the provider.
>>     
>
> Just for clarification: this interface only affects pages mapped in the
> kernel, correct?  I'm trying to understand if this is just for reducing
> the number of in-kernel copies, or if this is a userland <-> kernel
> zero-copy interface.
>
>   
That is correct. This interface is to prevent in-kernel copies and allow
buffer sharing between kernel modules (that can be used by in-kernel
services like NFS or CIFS). The spec does not define any userland <-> kernel
zero-copy interface.

Thanks,
Mahesh
> Thanks,
>
> -j
>   

Reply via email to