On Fri, Aug 26, 2016 at 11:44:11AM -0500, Don Brace wrote:
> From: Kevin Barnett <[email protected]>
>
> Take advantage of controller improvements.
>
> Reviewed-by: Scott Teel <[email protected]>
> Reviewed-by: Scott Benesh <[email protected]>
> Signed-off-by: Kevin Barnett <[email protected]>
> Signed-off-by: Don Brace <[email protected]>
> ---
> drivers/scsi/smartpqi/smartpqi_init.c | 68
> +++++++++++++++++++--------------
> 1 file changed, 39 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/scsi/smartpqi/smartpqi_init.c
> b/drivers/scsi/smartpqi/smartpqi_init.c
> index 906f1aa..418f636 100644
> --- a/drivers/scsi/smartpqi/smartpqi_init.c
> +++ b/drivers/scsi/smartpqi/smartpqi_init.c
> @@ -4263,48 +4263,58 @@ static int pqi_build_aio_sg_list(struct pqi_ctrl_info
> *ctrl_info,
> int i;
> u16 iu_length;
> int sg_count;
> - unsigned int num_sg_in_iu = 0;
> + bool chained;
> + unsigned int num_sg_in_iu;
> + unsigned int max_sg_per_iu;
> struct scatterlist *sg;
> struct pqi_sg_descriptor *sg_descriptor;
>
> sg_count = scsi_dma_map(scmd);
> if (sg_count < 0)
> return sg_count;
> +
> + iu_length = offsetof(struct pqi_aio_path_request, sg_descriptors) -
> + PQI_REQUEST_HEADER_LENGTH;
> + num_sg_in_iu = 0;
> +
> if (sg_count == 0)
> goto out;
>
> - if (sg_count <= ctrl_info->max_sg_per_iu) {
> - sg_descriptor = &request->sg_descriptors[0];
> - scsi_for_each_sg(scmd, sg, sg_count, i) {
> - pqi_set_sg_descriptor(sg_descriptor, sg);
> - sg_descriptor++;
> - }
> - put_unaligned_le32(CISS_SG_LAST,
> - &request->sg_descriptors[sg_count - 1].flags);
> - num_sg_in_iu = sg_count;
> - } else {
> - sg_descriptor = &request->sg_descriptors[0];
> - put_unaligned_le64((u64)io_request->sg_chain_buffer_dma_handle,
> - &sg_descriptor->address);
> - put_unaligned_le32(sg_count * sizeof(*sg_descriptor),
> - &sg_descriptor->length);
> - put_unaligned_le32(CISS_SG_CHAIN, &sg_descriptor->flags);
> -
> - sg_descriptor = io_request->sg_chain_buffer;
> - scsi_for_each_sg(scmd, sg, sg_count, i) {
> - pqi_set_sg_descriptor(sg_descriptor, sg);
> - sg_descriptor++;
> + sg = scsi_sglist(scmd);
> + sg_descriptor = request->sg_descriptors;
> + max_sg_per_iu = ctrl_info->max_sg_per_iu - 1;
> + chained = false;
> + i = 0;
> +
> + while (1) {
Is there any compelling reason why you didn't use scsi_for_each_sg()
here? I don't see a reason for the while (1) construct.
> + pqi_set_sg_descriptor(sg_descriptor, sg);
> + if (!chained)
> + num_sg_in_iu++;
> + i++;
> + if (i == sg_count)
> + break;
> + sg_descriptor++;
> + if (i == max_sg_per_iu) {
> + put_unaligned_le64(
> + (u64)io_request->sg_chain_buffer_dma_handle,
> + &sg_descriptor->address);
> + put_unaligned_le32((sg_count - num_sg_in_iu)
> + * sizeof(*sg_descriptor),
> + &sg_descriptor->length);
> + put_unaligned_le32(CISS_SG_CHAIN,
> + &sg_descriptor->flags);
> + chained = true;
> + num_sg_in_iu++;
> + sg_descriptor = io_request->sg_chain_buffer;
> }
> - put_unaligned_le32(CISS_SG_LAST,
> - &io_request->sg_chain_buffer[sg_count - 1].flags);
> - num_sg_in_iu = 1;
> - request->partial = 1;
> + sg = sg_next(sg);
> }
>
> -out:
> - iu_length = offsetof(struct pqi_aio_path_request, sg_descriptors) -
> - PQI_REQUEST_HEADER_LENGTH;
> + put_unaligned_le32(CISS_SG_LAST, &sg_descriptor->flags);
> + request->partial = chained;
> iu_length += num_sg_in_iu * sizeof(*sg_descriptor);
> +
> +out:
> put_unaligned_le16(iu_length, &request->header.iu_length);
> request->num_sg_descriptors = num_sg_in_iu;
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Johannes Thumshirn Storage
[email protected] +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html