From: Ming Lei <ming.lei@redhat.com> To: Finn Thain <fthain@telegraphics.com.au> Cc: "Juergen E . Fischer" <fischer@norbit.de>, linux-scsi@vger.kernel.org, "Martin K . Petersen" <martin.petersen@oracle.com>, James Bottomley <James.Bottomley@hansenpartnership.com>, Bart Van Assche <bvanassche@acm.org>, Hannes Reinecke <hare@suse.com>, Christoph Hellwig <hch@lst.de>, Jim Gill <jgill@vmware.com>, Cathy Avery <cavery@redhat.com>, "Ewan D . Milne" <emilne@redhat.com>, Brian King <brking@us.ibm.com>, James Smart <james.smart@broadcom.com>, Michael Schmitz <schmitzmic@gmail.com>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, devel@driverdev.osuosl.org, linux-usb@vger.kernel.org, Dan Carpenter <dan.carpenter@oracle.com>, Benjamin Block <bblock@linux.ibm.com> Subject: Re: [PATCH V3 10/15] scsi: aha152x: use sg helper to operate scatterlist Date: Fri, 14 Jun 2019 16:17:33 +0800 [thread overview] Message-ID: <20190614081732.GC24393@ming.t460p> (raw) In-Reply-To: <alpine.LNX.2.21.1906141404270.33@nippy.intranet> On Fri, Jun 14, 2019 at 03:27:36PM +1000, Finn Thain wrote: > Hi Ming, > > On Fri, 14 Jun 2019, Ming Lei wrote: > > > Use the scatterlist iterators and remove direct indexing of the > > scatterlist array. > > > > This way allows us to pre-allocate one small scatterlist, which can be > > chained with one runtime allocated scatterlist if the pre-allocated one > > isn't enough for the whole request. > > > > Signed-off-by: Ming Lei <ming.lei@redhat.com> > > --- > > drivers/scsi/aha152x.c | 29 +++++++++++++++++++---------- > > 1 file changed, 19 insertions(+), 10 deletions(-) > > > > diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c > > index 97872838b983..bc9d12aa7880 100644 > > --- a/drivers/scsi/aha152x.c > > +++ b/drivers/scsi/aha152x.c > > @@ -2033,7 +2033,7 @@ static void datai_run(struct Scsi_Host *shpnt) > > CURRENT_SC->SCp.buffers_residual > 0) { > > /* advance to next buffer */ > > CURRENT_SC->SCp.buffers_residual--; > > - CURRENT_SC->SCp.buffer++; > > + CURRENT_SC->SCp.buffer = sg_next(CURRENT_SC->SCp.buffer); > > CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); > > CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; > > } > > @@ -2139,7 +2139,7 @@ static void datao_run(struct Scsi_Host *shpnt) > > if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) { > > /* advance to next buffer */ > > CURRENT_SC->SCp.buffers_residual--; > > - CURRENT_SC->SCp.buffer++; > > + CURRENT_SC->SCp.buffer = sg_next(CURRENT_SC->SCp.buffer); > > CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); > > CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; > > } > > @@ -2160,20 +2160,29 @@ static void datao_end(struct Scsi_Host *shpnt) > > if(TESTLO(DMASTAT, DFIFOEMP)) { > > int data_count = (DATA_LEN - scsi_get_resid(CURRENT_SC)) - > > GETSTCNT(); > > data_count appears to be the number of bytes remaining in the FIFO. (I > have to infer that much from the surrounding code. I don't have > documentation for this controller.) Yeah, it should be so, that is the data which need to transfer again. > > Some comments would be nice. > > > + struct scatterlist *sg = scsi_sglist(CURRENT_SC); > > + int left, i = 0; > > > > CMD_INC_RESID(CURRENT_SC, data_count); > > > > Apparently the aim is to increase the residual by the number of bytes that > will never leave the FIFO. Above we can see that increase performed by > scsi_set_resid() and now the same has to be done to the SCp struct. Agree. > > > data_count -= CURRENT_SC->SCp.ptr - > > SG_ADDRESS(CURRENT_SC->SCp.buffer); > > Here, data_count effectively has SCp.this_residual subtracted from it. > > > - while(data_count>0) { > > - CURRENT_SC->SCp.buffer--; > > - CURRENT_SC->SCp.buffers_residual++; > > - data_count -= CURRENT_SC->SCp.buffer->length; > > - } > > So far, so good. > > > - CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) - > > - data_count; > > - CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length + > > - data_count; > > This is like saying ptr = buffer + residual, which is bogus. This must be > an old bug, but we never hit it because the FIFO is always empty when we > get a DISCONNECT message. Probably because every SG segment has a length > that is a multiple of 128 bytes. (Juergen?) > > > + > > + left = CURRENT_SC->transfersize - data_count; > > Are you sure about that? Perhaps you meant to write, > left = scsi_bufflen(CURRENT_SC) - scsi_get_resid(CURRENT_SC); > > Is there a better name for this variable? Maybe 'sent' or 'bytes_sent'? 'left' can be renamed as 'done', and done = GETSTCNT - (CURRENT_SC->SCp.ptr - SG_ADDRESS(CURRENT_SC->SCp.buffer)) > > > + for (i = 0; left > 0 && !sg_is_last(sg); i++, sg = sg_next(sg)) { > > + if (left < sg->length) > > + break; > > + left -= sg->length; > > + } > > + > > + if (data_count > 0) { > > + CURRENT_SC->SCp.buffers_residual += i; > > Shouldn't that be, > CURRENT_SC->SCp.buffers_residual = i; Good catch. > > > + CURRENT_SC->SCp.buffer = sg; > > + > > + CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) + left; > > + CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length - > > + left; > > + } > > } > > > > SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT); > > > > BTW, datao_run() seems to guarantee that the FIFO will never contain more > than min(128, SCp.this_residual) so I suspect that this code can be > simplified. That's just BTW. I wouldn't attempt to optimize this branch as > it will only run when the FIFO is not empty, if ever. So I'd prefer > clarity. Besides, I don't have the hardware to test it on. I'd suggest to simply translate into code which uses current sg helper. Follows the fixed version, could you review again? From f03484d4bac083c39d70665cfbadb641093b63de Mon Sep 17 00:00:00 2001 From: Ming Lei <ming.lei@redhat.com> Date: Wed, 12 Jun 2019 20:37:35 +0800 Subject: [PATCH] scsi: aha152x: use sg helper to operate scatterlist Use the scatterlist iterators and remove direct indexing of the scatterlist array. This way allows us to pre-allocate one small scatterlist, which can be chained with one runtime allocated scatterlist if the pre-allocated one isn't enough for the whole request. Signed-off-by: Ming Lei <ming.lei@redhat.com> --- drivers/scsi/aha152x.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index 97872838b983..7faecdefda56 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c @@ -2033,7 +2033,7 @@ static void datai_run(struct Scsi_Host *shpnt) CURRENT_SC->SCp.buffers_residual > 0) { /* advance to next buffer */ CURRENT_SC->SCp.buffers_residual--; - CURRENT_SC->SCp.buffer++; + CURRENT_SC->SCp.buffer = sg_next(CURRENT_SC->SCp.buffer); CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; } @@ -2139,7 +2139,7 @@ static void datao_run(struct Scsi_Host *shpnt) if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) { /* advance to next buffer */ CURRENT_SC->SCp.buffers_residual--; - CURRENT_SC->SCp.buffer++; + CURRENT_SC->SCp.buffer = sg_next(CURRENT_SC->SCp.buffer); CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; } @@ -2158,22 +2158,28 @@ static void datao_run(struct Scsi_Host *shpnt) static void datao_end(struct Scsi_Host *shpnt) { if(TESTLO(DMASTAT, DFIFOEMP)) { - int data_count = (DATA_LEN - scsi_get_resid(CURRENT_SC)) - - GETSTCNT(); + int done = GETSTCNT(); + int data_count = (DATA_LEN - scsi_get_resid(CURRENT_SC)) - done; + struct scatterlist *sg = scsi_sglist(CURRENT_SC); + int i; CMD_INC_RESID(CURRENT_SC, data_count); - data_count -= CURRENT_SC->SCp.ptr - - SG_ADDRESS(CURRENT_SC->SCp.buffer); - while(data_count>0) { - CURRENT_SC->SCp.buffer--; - CURRENT_SC->SCp.buffers_residual++; - data_count -= CURRENT_SC->SCp.buffer->length; + /* + * rewind where we have done, and we have to start from + * the beginning + */ + for (i = 0; done > 0 && !sg_is_last(sg); i++, sg = sg_next(sg)) { + if (done < sg->length) + break; + done -= sg->length; } - CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) - - data_count; - CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length + - data_count; + + CURRENT_SC->SCp.buffers_residual = i; + CURRENT_SC->SCp.buffer = sg; + CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) + done; + CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length - + done; } SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT); -- 2.20.1 thanks, Ming
WARNING: multiple messages have this Message-ID (diff)
From: Ming Lei <ming.lei@redhat.com> To: Finn Thain <fthain@telegraphics.com.au> Cc: Michael Schmitz <schmitzmic@gmail.com>, devel@driverdev.osuosl.org, Hannes Reinecke <hare@suse.com>, Benjamin Block <bblock@linux.ibm.com>, linux-scsi@vger.kernel.org, "Martin K . Petersen" <martin.petersen@oracle.com>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, linux-usb@vger.kernel.org, James Smart <james.smart@broadcom.com>, "Ewan D . Milne" <emilne@redhat.com>, Jim Gill <jgill@vmware.com>, James Bottomley <James.Bottomley@hansenpartnership.com>, Brian King <brking@us.ibm.com>, "Juergen E . Fischer" <fischer@norbit.de>, Christoph Hellwig <hch@lst.de>, Dan Carpenter <dan.carpenter@oracle.com>, Bart Van Assche <bvanassche@acm.org> Subject: Re: [PATCH V3 10/15] scsi: aha152x: use sg helper to operate scatterlist Date: Fri, 14 Jun 2019 16:17:33 +0800 [thread overview] Message-ID: <20190614081732.GC24393@ming.t460p> (raw) In-Reply-To: <alpine.LNX.2.21.1906141404270.33@nippy.intranet> On Fri, Jun 14, 2019 at 03:27:36PM +1000, Finn Thain wrote: > Hi Ming, > > On Fri, 14 Jun 2019, Ming Lei wrote: > > > Use the scatterlist iterators and remove direct indexing of the > > scatterlist array. > > > > This way allows us to pre-allocate one small scatterlist, which can be > > chained with one runtime allocated scatterlist if the pre-allocated one > > isn't enough for the whole request. > > > > Signed-off-by: Ming Lei <ming.lei@redhat.com> > > --- > > drivers/scsi/aha152x.c | 29 +++++++++++++++++++---------- > > 1 file changed, 19 insertions(+), 10 deletions(-) > > > > diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c > > index 97872838b983..bc9d12aa7880 100644 > > --- a/drivers/scsi/aha152x.c > > +++ b/drivers/scsi/aha152x.c > > @@ -2033,7 +2033,7 @@ static void datai_run(struct Scsi_Host *shpnt) > > CURRENT_SC->SCp.buffers_residual > 0) { > > /* advance to next buffer */ > > CURRENT_SC->SCp.buffers_residual--; > > - CURRENT_SC->SCp.buffer++; > > + CURRENT_SC->SCp.buffer = sg_next(CURRENT_SC->SCp.buffer); > > CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); > > CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; > > } > > @@ -2139,7 +2139,7 @@ static void datao_run(struct Scsi_Host *shpnt) > > if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) { > > /* advance to next buffer */ > > CURRENT_SC->SCp.buffers_residual--; > > - CURRENT_SC->SCp.buffer++; > > + CURRENT_SC->SCp.buffer = sg_next(CURRENT_SC->SCp.buffer); > > CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); > > CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; > > } > > @@ -2160,20 +2160,29 @@ static void datao_end(struct Scsi_Host *shpnt) > > if(TESTLO(DMASTAT, DFIFOEMP)) { > > int data_count = (DATA_LEN - scsi_get_resid(CURRENT_SC)) - > > GETSTCNT(); > > data_count appears to be the number of bytes remaining in the FIFO. (I > have to infer that much from the surrounding code. I don't have > documentation for this controller.) Yeah, it should be so, that is the data which need to transfer again. > > Some comments would be nice. > > > + struct scatterlist *sg = scsi_sglist(CURRENT_SC); > > + int left, i = 0; > > > > CMD_INC_RESID(CURRENT_SC, data_count); > > > > Apparently the aim is to increase the residual by the number of bytes that > will never leave the FIFO. Above we can see that increase performed by > scsi_set_resid() and now the same has to be done to the SCp struct. Agree. > > > data_count -= CURRENT_SC->SCp.ptr - > > SG_ADDRESS(CURRENT_SC->SCp.buffer); > > Here, data_count effectively has SCp.this_residual subtracted from it. > > > - while(data_count>0) { > > - CURRENT_SC->SCp.buffer--; > > - CURRENT_SC->SCp.buffers_residual++; > > - data_count -= CURRENT_SC->SCp.buffer->length; > > - } > > So far, so good. > > > - CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) - > > - data_count; > > - CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length + > > - data_count; > > This is like saying ptr = buffer + residual, which is bogus. This must be > an old bug, but we never hit it because the FIFO is always empty when we > get a DISCONNECT message. Probably because every SG segment has a length > that is a multiple of 128 bytes. (Juergen?) > > > + > > + left = CURRENT_SC->transfersize - data_count; > > Are you sure about that? Perhaps you meant to write, > left = scsi_bufflen(CURRENT_SC) - scsi_get_resid(CURRENT_SC); > > Is there a better name for this variable? Maybe 'sent' or 'bytes_sent'? 'left' can be renamed as 'done', and done = GETSTCNT - (CURRENT_SC->SCp.ptr - SG_ADDRESS(CURRENT_SC->SCp.buffer)) > > > + for (i = 0; left > 0 && !sg_is_last(sg); i++, sg = sg_next(sg)) { > > + if (left < sg->length) > > + break; > > + left -= sg->length; > > + } > > + > > + if (data_count > 0) { > > + CURRENT_SC->SCp.buffers_residual += i; > > Shouldn't that be, > CURRENT_SC->SCp.buffers_residual = i; Good catch. > > > + CURRENT_SC->SCp.buffer = sg; > > + > > + CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) + left; > > + CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length - > > + left; > > + } > > } > > > > SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT); > > > > BTW, datao_run() seems to guarantee that the FIFO will never contain more > than min(128, SCp.this_residual) so I suspect that this code can be > simplified. That's just BTW. I wouldn't attempt to optimize this branch as > it will only run when the FIFO is not empty, if ever. So I'd prefer > clarity. Besides, I don't have the hardware to test it on. I'd suggest to simply translate into code which uses current sg helper. Follows the fixed version, could you review again? >From f03484d4bac083c39d70665cfbadb641093b63de Mon Sep 17 00:00:00 2001 From: Ming Lei <ming.lei@redhat.com> Date: Wed, 12 Jun 2019 20:37:35 +0800 Subject: [PATCH] scsi: aha152x: use sg helper to operate scatterlist Use the scatterlist iterators and remove direct indexing of the scatterlist array. This way allows us to pre-allocate one small scatterlist, which can be chained with one runtime allocated scatterlist if the pre-allocated one isn't enough for the whole request. Signed-off-by: Ming Lei <ming.lei@redhat.com> --- drivers/scsi/aha152x.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index 97872838b983..7faecdefda56 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c @@ -2033,7 +2033,7 @@ static void datai_run(struct Scsi_Host *shpnt) CURRENT_SC->SCp.buffers_residual > 0) { /* advance to next buffer */ CURRENT_SC->SCp.buffers_residual--; - CURRENT_SC->SCp.buffer++; + CURRENT_SC->SCp.buffer = sg_next(CURRENT_SC->SCp.buffer); CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; } @@ -2139,7 +2139,7 @@ static void datao_run(struct Scsi_Host *shpnt) if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) { /* advance to next buffer */ CURRENT_SC->SCp.buffers_residual--; - CURRENT_SC->SCp.buffer++; + CURRENT_SC->SCp.buffer = sg_next(CURRENT_SC->SCp.buffer); CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; } @@ -2158,22 +2158,28 @@ static void datao_run(struct Scsi_Host *shpnt) static void datao_end(struct Scsi_Host *shpnt) { if(TESTLO(DMASTAT, DFIFOEMP)) { - int data_count = (DATA_LEN - scsi_get_resid(CURRENT_SC)) - - GETSTCNT(); + int done = GETSTCNT(); + int data_count = (DATA_LEN - scsi_get_resid(CURRENT_SC)) - done; + struct scatterlist *sg = scsi_sglist(CURRENT_SC); + int i; CMD_INC_RESID(CURRENT_SC, data_count); - data_count -= CURRENT_SC->SCp.ptr - - SG_ADDRESS(CURRENT_SC->SCp.buffer); - while(data_count>0) { - CURRENT_SC->SCp.buffer--; - CURRENT_SC->SCp.buffers_residual++; - data_count -= CURRENT_SC->SCp.buffer->length; + /* + * rewind where we have done, and we have to start from + * the beginning + */ + for (i = 0; done > 0 && !sg_is_last(sg); i++, sg = sg_next(sg)) { + if (done < sg->length) + break; + done -= sg->length; } - CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) - - data_count; - CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length + - data_count; + + CURRENT_SC->SCp.buffers_residual = i; + CURRENT_SC->SCp.buffer = sg; + CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) + done; + CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length - + done; } SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT); -- 2.20.1 thanks, Ming
next prev parent reply other threads:[~2019-06-14 8:18 UTC|newest] Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-06-14 2:53 [PATCH V3 00/15] use sg helper to operate scatterlist Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 01/15] scsi: vmw_pscsi: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 02/15] scsi: advansys: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 03/15] scsi: lpfc: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 04/15] scsi: mvumi: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 05/15] scsi: ipr: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 06/15] scsi: pmcraid: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 07/15] usb: image: microtek: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 5:39 ` Finn Thain 2019-06-14 5:39 ` Finn Thain 2019-06-14 6:57 ` Ming Lei 2019-06-14 6:57 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 08/15] staging: unisys: visorhba: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 5:48 ` Greg Kroah-Hartman 2019-06-14 5:48 ` Greg Kroah-Hartman 2019-06-14 2:53 ` [PATCH V3 09/15] s390: zfcp_fc: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-16 16:25 ` Benjamin Block 2019-06-16 16:25 ` Benjamin Block 2019-06-16 16:25 ` Benjamin Block 2019-06-14 2:53 ` [PATCH V3 10/15] scsi: aha152x: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 5:27 ` Finn Thain 2019-06-14 5:27 ` Finn Thain 2019-06-14 8:17 ` Ming Lei [this message] 2019-06-14 8:17 ` Ming Lei 2019-06-14 10:36 ` Finn Thain 2019-06-14 10:36 ` Finn Thain 2019-06-17 1:14 ` Ming Lei 2019-06-17 1:14 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 11/15] scsi: imm: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 12/15] scsi: pcmcia: nsp_cs: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 13/15] scsi: ppa: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 14/15] scsi: wd33c93: " Ming Lei 2019-06-14 2:53 ` Ming Lei 2019-06-14 2:53 ` [PATCH V3 15/15] NCR5380: Support chained sg lists Ming Lei 2019-06-14 2:53 ` Ming Lei
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=20190614081732.GC24393@ming.t460p \ --to=ming.lei@redhat.com \ --cc=James.Bottomley@hansenpartnership.com \ --cc=bblock@linux.ibm.com \ --cc=brking@us.ibm.com \ --cc=bvanassche@acm.org \ --cc=cavery@redhat.com \ --cc=dan.carpenter@oracle.com \ --cc=devel@driverdev.osuosl.org \ --cc=emilne@redhat.com \ --cc=fischer@norbit.de \ --cc=fthain@telegraphics.com.au \ --cc=gregkh@linuxfoundation.org \ --cc=hare@suse.com \ --cc=hch@lst.de \ --cc=james.smart@broadcom.com \ --cc=jgill@vmware.com \ --cc=linux-scsi@vger.kernel.org \ --cc=linux-usb@vger.kernel.org \ --cc=martin.petersen@oracle.com \ --cc=schmitzmic@gmail.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.