Storage Performance Development Kit (SPDK)
 help / color / mirror / Atom feed
From: Harris, James R <james.r.harris at intel.com>
To: spdk@lists.01.org
Subject: Re: [SPDK] BDEV-IO Lifecycle - Need your input.
Date: Mon, 09 Jul 2018 15:30:23 +0000	[thread overview]
Message-ID: <4F90FCAF-FDFA-4AD4-828B-A395698463BF@intel.com> (raw)
In-Reply-To: BN7PR06MB4033F4C2F83CA65463A038A892440@BN7PR06MB4033.namprd06.prod.outlook.com

[-- Attachment #1: Type: text/plain, Size: 15597 bytes --]

Hi Sriram:

Ben has some later patches in this series with some examples:

https://review.gerrithub.io/#/c/spdk/spdk/+/386167/ - implements this zero copy API in the simple ‘malloc’ bdev module
https://review.gerrithub.io/#/c/spdk/spdk/+/416579/ - uses the zero copy API in the SPDK bdevperf utility

-Jim


On 7/9/18, 3:34 AM, "Popuri, Sriram" <Sriram.Popuri(a)netapp.com> wrote:

    Sorry was not focusing on this change. Just give me a day or two to get back.
    From a quick glance I didn't understand how zcopy start/end fits into a read/write life cycle. Is there an example on how zcopy start/end is consumed or someone can do give me a quick dump on how its envisioned to be used.
    
    Regards,
    ~Sriram
    
    -----Original Message-----
    From: Meneghini, John 
    Sent: Friday, July 6, 2018 10:16 PM
    To: Walker, Benjamin <benjamin.walker(a)intel.com>; Verkamp, Daniel <daniel.verkamp(a)intel.com>; Harris, James R <james.r.harris(a)intel.com>; Kaligotla, Srikanth <Srikanth.Kaligotla(a)netapp.com>
    Cc: raju.gottumukkala(a)broadcom.com; spdk(a)lists.01.org; Rodriguez, Edwin <Ed.Rodriguez(a)netapp.com>; Pai, Madhu <Madhusudan.Pai(a)netapp.com>; NGC-john.barnard-broadcom.com <john.barnard(a)broadcom.com>; Popuri, Sriram <Sriram.Popuri(a)netapp.com>
    Subject: Re: BDEV-IO Lifecycle - Need your input.
    
    I'm adding Sriram to this thread.  Sriram is another NetApp engineer who is working on this stuff internally.
    
    /John
    
    On 7/6/18, 12:41 PM, "Walker, Benjamin" <benjamin.walker(a)intel.com> wrote:
    
        Hi Srikanth,
        
        I wanted to check in to see if you had any additional feedback on the zero copy
        operations in the bdev layer here:
        
        https://review.gerrithub.io/#/c/spdk/spdk/+/386166/
        
        This does not address extending the lifetime of the bdev_io in the NVMe-oF
        target, but I think this is looking like the right mechanism for the bdev layer.
        
        Thanks,
        Ben
        
        On Thu, 2018-06-21 at 18:11 -0700, Harris, James R wrote:
        > Thanks Srikanth.  Sounds like the spdk_bdev_io pool sizing along with
        > spdk_bdev_queue_io_wait() meets your needs then regarding the spdk_bdev_io
        > memory.
        >  
        > Regarding zcopy_start/zcopy_end – it looks like you’ve already added a bunch
        > of comments to Ben’s patch on GerritHub.  For now I’d say let’s continue our
        > discussion there.  I’ve responded to a couple of similar questions there and
        > I’m sure Ben will have more replies tomorrow.
        >  
        > -Jim
        >  
        >  
        > From: "Kaligotla, Srikanth" <Srikanth.Kaligotla(a)netapp.com>
        > Date: Thursday, June 21, 2018 at 5:01 PM
        > To: James Harris <james.r.harris(a)intel.com>, "Walker, Benjamin" <benjamin.walk
        > er(a)intel.com>, Daniel Verkamp <daniel.verkamp(a)intel.com>
        > Cc: "raju.gottumukkala(a)broadcom.com" <raju.gottumukkala(a)broadcom.com>,
        > "Meneghini, John" <John.Meneghini(a)netapp.com>, "Rodriguez, Edwin" <Ed.Rodrigue
        > z(a)netapp.com>, "Pai, Madhu" <Madhusudan.Pai(a)netapp.com>, "NGC-john.barnard-
        > broadcom.com" <john.barnard(a)broadcom.com>, "spdk(a)lists.01.org" <spdk(a)lists.01.
        > org>
        > Subject: RE: BDEV-IO Lifecycle - Need your input.
        >  
        > Hi Jim,
        >  
        > I wish I joined the community meeting, I also missed the
        > spdk_bdev_queue_io_wait().
        >  
        > So, there are 2 issues I am intending to solve,
        >  
        > 1.       We want to ensure that an instance of bdev-io is acquired prior to or
        > along with I/O data buffer. This allows for better error handling when bdev_io
        > pool is exhausted. Yes, we can solve it via sizing the pool right. The changes
        > queue-io-wait also addresses the problem.
        > 2.       Most importantly, by extending the life of bdev-io (Same life span as
        > nvmf_request structure), abort use case and other use cases that involve
        > cleaning up of IO data buffer are accomplished effectively. Let me elaborate;
        > bdev-io is the fabric that connects the nvme command and operation with the
        > backend. The driver context and data buffer context is stored in bdev-io. The
        > freeing up of bdev_io resource is pushed to the end so the I/O cleanup can
        > happen after controller has transmitted the data to the host. In absence of
        > bdev_io, we will have end up adding more and more void context in request
        > structure. Hence the push to extend the life of bdev_io.
        >  
        > I see Ben’s recent patch “zcopy_start” and “zcopy_end”; We can make that work
        > as long as the bdev-io allocated/acquired stays till the end. One of the
        > challenges I see with that patch is defining a callback for the I/O
        > submission. For instance, zopy_start will allocate bdev_io and submits the I/O
        > to the bdev device. Underlying implementation can be synchronous or can be
        > asynchronous. The callback for this submission should check to see if it is a
        > BUFFER-READY or PENDING and accordingly relay it back to transport. Next phase
        > is actual I/O submission. Let’s say, it reuses the bdev-io obtained in ZCOPY-
        > START, now the callback should determine if it is a success or failure.
        > Finally when ZCOPY-END is invoked the supplied bdev_io will have all necessary
        > data to release the WRITE buffer or unlock the read buffer based on the
        > operation performed.
        >  
        > I hope I’m making sense. I guess, my effort is to extend the lifespan of bdev-
        > io and let it continue to host the driver context and buffer context populated
        > during the BEGIN phase.
        >  
        > Regards,
        > Srikanth
        >  
        > From: Harris, James R <james.r.harris(a)intel.com> 
        > Sent: Thursday, June 21, 2018 2:21 PM
        > To: Kaligotla, Srikanth <Srikanth.Kaligotla(a)netapp.com>; Walker, Benjamin <ben
        > jamin.walker(a)intel.com>; Verkamp, Daniel <daniel.verkamp(a)intel.com>
        > Cc: raju.gottumukkala(a)broadcom.com; Meneghini, John <John.Meneghini(a)netapp.com
        > >; Rodriguez, Edwin <Ed.Rodriguez(a)netapp.com>; Pai, Madhu <Madhusudan.Pai(a)neta
        > pp.com>; NGC-john.barnard-broadcom.com <john.barnard(a)broadcom.com>; spdk(a)lists
        > .01.org
        > Subject: Re: BDEV-IO Lifecycle - Need your input.
        >  
        > Hi Srikanth,
        >  
        > Following up on this thread and the discussion in yesterday’s community
        > meeting.
        >  
        > The recent spdk_bdev_queue_io_wait() changes allow an SPDK application to work
        > better in general when the spdk_bdev_io buffer pool is exhausted.  We still
        > need to make changes to the NVMe-oF target to use this new API but that should
        > be done soon-ish.
        >  
        > With that in place, the spdk_bdev_io buffer pool itself can be configured up
        > or down when the application starts.  Currently the default is 64K
        > spdk_bdev_io buffers.  sizeof(struct spdk_bdev_io) == 216 plus the per-IO
        > context size allocated for the bdev module.  This can be up to 192 bytes
        > (virtio bdev module) but is likely much smaller for you depending on the
        > context size for your ontap bdev module.
        >  
        > Let’s assume your per-IO context size is 64 bytes.  64K x (192 + 64) = 16MB.
        >  
        > I’m not sure how many spdk_bdev_io you need in flight at any given time.  64K
        > seems like a lot but I’d be curious to hear your thoughts on this.  If this is
        > the right number, then worst case, there would be about 16MB of DRAM that
        > would sit unused if the NVMe-oF target in your system was not active.  Is that
        > too burdensome for your application?
        >  
        > Thanks,
        >  
        > -Jim
        >  
        >  
        >  
        > From: "Kaligotla, Srikanth" <Srikanth.Kaligotla(a)netapp.com>
        > Date: Wednesday, June 20, 2018 at 12:47 PM
        > To: "Walker, Benjamin" <benjamin.walker(a)intel.com>, James Harris <james.r.harr
        > is(a)intel.com>, Daniel Verkamp <daniel.verkamp(a)intel.com>
        > Cc: "raju.gottumukkala(a)broadcom.com" <raju.gottumukkala(a)broadcom.com>,
        > "Meneghini, John" <John.Meneghini(a)netapp.com>, "Rodriguez, Edwin" <Ed.Rodrigue
        > z(a)netapp.com>, "Pai, Madhu" <Madhusudan.Pai(a)netapp.com>, "NGC-john.barnard-
        > broadcom.com" <john.barnard(a)broadcom.com>, "spdk(a)lists.01.org" <spdk(a)lists.01.
        > org>
        > Subject: RE: BDEV-IO Lifecycle - Need your input.
        >  
        > Hello,
        >  
        > First revision of changes to extend the lifecycle of bdev_io are available for
        > review. I would like to solicit your input on the proposed API/Code flow
        > changes.
        >  
        > https://review.gerrithub.io/c/spdk/spdk/+/415860
        >  
        > Thanks,
        > Srikanth
        >  
        >  
        > From: "Kaligotla, Srikanth" <Srikanth.Kaligotla(a)netapp.com>
        > Date: Friday, May 11, 2018 at 2:27 PM
        > To: "Walker, Benjamin" <benjamin.walker(a)intel.com>, "Harris, James R" <james.r
        > .harris(a)intel.com>
        > Cc: "raju.gottumukkala(a)broadcom.com" <raju.gottumukkala(a)broadcom.com>,
        > "Meneghini, John" <John.Meneghini(a)netapp.com>, "Rodriguez, Edwin" <Ed.Rodrigue
        > z(a)netapp.com>, "Pai, Madhu" <Madhusudan.Pai(a)netapp.com>, "NGC-john.barnard-
        > broadcom.com" <john.barnard(a)broadcom.com>, "spdk(a)lists.01.org" <spdk(a)lists.01.
        > org>
        > Subject: RE: BDEV-IO Lifecycle - Need your input.
        >  
        > CC: List
        >  
        > Hi Ben,
        >  
        > Your proposal to interface with the backend to acquire and release buffers is
        > good. You have accurately stated that the challenge is in developing intuitive
        > semantics. And that has been my struggle. To me, there are two problem
        > statements;
        >  
        > 1.       It is expected that bdev_io pool is sized correctly so the call to
        > get bdev_io succeeds. Failure to acquire bdev_io will result in DEVICE-ERROR.
        > The transport is already capable of handling temporary memory failures by
        > moving the request to PENDING-Queue. Hence the proposal to change the bdev_io
        > lifecycle and perhaps connect it with the spdk_nvmf_request object. Thus all
        > buffer needs are addressed at the beginning of I/O request.
        > 2.       I/O Data buffers are sourced and managed by the backend. One of the
        > challenges I see with your proposed interface is the lack of details like if
        > resource is being acquired for a READ operation or WRITE operation. The
        > handling is quite different in each case. Since bdev_io->type is overloaded
        > the type of I/O operation is lost. I suppose one can cast the cb_arg
        > (nvmf_request) and then proceed. Also, the bdev_io should be present to
        > RELEASE the buffer. Zero copy semantics warrants that data buffer stays until
        > controller-to-host has occurred. In other words, bdev_io lives till REQUEST
        > come to COMPLETE state.
        >  
        > What are your thoughts in introducing spdk_bdev_init() and spdk_bdev_fini() as
        > an alternative approach to extend the lifecyle of bdev_io and allow data
        > buffer management via bdev fn_table ?
        >  
        > I hope I’m making sense…
        >  
        > Thanks,
        > Srikanth
        >  
        > From: Walker, Benjamin <benjamin.walker(a)intel.com> 
        > Sent: Friday, May 11, 2018 12:28 PM
        > To: Harris, James R <james.r.harris(a)intel.com>; Kaligotla, Srikanth <Srikanth.
        > Kaligotla(a)netapp.com>
        > Cc: raju.gottumukkala(a)broadcom.com; Meneghini, John <John.Meneghini(a)netapp.com
        > >; Rodriguez, Edwin <Ed.Rodriguez(a)netapp.com>; Pai, Madhu <Madhusudan.Pai(a)neta
        > pp.com>; NGC-john.barnard-broadcom.com <john.barnard(a)broadcom.com>
        > Subject: Re: BDEV-IO Lifecycle - Need your input.
        >  
        > Hi Srikanth,
        >  
        > Yes - we'll need to introduce some way to acquire and release buffers from the
        > bdev layer earlier on in the state machine that processes an NVMe-oF request.
        > I've had this patch out for review for several months as a proposal for this
        > scenario:
        >  
        > https://review.gerrithub.io/#/c/spdk/spdk/+/386166/
        >  
        > It doesn't pass the tests - it's just a proposal for the interface. 90% of the
        > challenge here is in developing intuitive semantics.
        >  
        > Thanks,
        > Ben
        >  
        > P.S. This is the kind of discussion that would fit perfectly on the mailing
        > list.
        >  
        > On Wed, 2018-05-09 at 20:35 +0000, Kaligotla, Srikanth wrote:
        > > Hi Ben, Hi James,
        > >  
        > > I would like to solicit opinions on the lifecycle for bdev-io resource
        > > object. Attached is the image of RDMA state machine in its current
        > > implementation. When the REQUEST enters the NEED-BUFFER state, the buffers
        > > necessary for carrying out I/O operation are allocated/acquired from the
        > > memory pool. An instance of BDEV-IO comes into existence after REQUEST
        > > reaches READY-TO-EXECUTE state. The BDEV-IO is teared down as soon the
        > > backend returns. From a BDEV perspective, BDEV-IO is simply a translation
        > > unit that facilitates I/O buffers from the backend. The driver context
        > > embedded within bdev_io holds great deal of information pertaining to the
        > > I/O under execution. It assists in error handling, dereferencing the buffers
        > > upon I/O completion and in abort handling. In summary, the bdev_io stays
        > > alive until request has come to COMPLETE state. I’d like to hear peoples
        > > thoughts in introducing the plumbing to acquire BDEV-IO resource in REQUEST-
        > > NEED-BUFFER state and release it in REQUEST-COMPLETE state.  I will shortly
        > > have patch available for review that introduces spdk_bdev_init and
        > > spdk_bdev_fini which in turn invokes the corresponding bdev fn_table to
        > >  initialize/cleanup.  
        > >  
        > > I wanted to use this email to communicate our intent and solicit your
        > > feedback. We have a working implementation of the above proposal and prior
        > > to pushing it upstream for review would like to hear your thoughts. These
        > > proposed changes to upstream are a result of FC transport work in
        > > collaboration with the Broadcom team who are also copied to this mail.
        > > Myself and John will be at SPDK Dev conference and if required we can
        > > elaborate further on this proposal.
        > >  
        > > Thanks,
        > > Srikanth
        > 
        >  
        
    
    


             reply	other threads:[~2018-07-09 15:30 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-09 15:30 Harris, James R [this message]
  -- strict thread matches above, loose matches on Subject: below --
2018-07-09 19:19 [SPDK] BDEV-IO Lifecycle - Need your input Popuri, Sriram
2018-07-09 17:52 Walker, Benjamin
2018-07-09 16:18 Meneghini, John
2018-07-09 10:34 Popuri, Sriram
2018-07-06 16:46 Meneghini, John
2018-07-06 16:41 Walker, Benjamin
2018-06-22  1:11 Harris, James R
2018-06-22  0:01 Kaligotla, Srikanth
2018-06-21 18:20 Harris, James R
2018-06-20 19:47 Kaligotla, Srikanth
2018-05-11 18:27 Kaligotla, Srikanth

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F90FCAF-FDFA-4AD4-828B-A395698463BF@intel.com \
    --to=spdk@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox