On Tue, 2019-04-23 at 18:32 +0800, Ming Lei wrote:
> +/*
> + * Size of integrity meta data size is usually small, 1 inline sg
                        ^^^^^^^^^^^^^^
Please change this into "metadata". Mentioning "size" twice is not
useful.
> + * should cover normal cases.
> + */
> +#define  SCSI_INLINE_PROT_SG_CNT  1
> +
>  static struct kmem_cache *scsi_sdb_cache;
>  static struct kmem_cache *scsi_sense_cache;
>  static struct kmem_cache *scsi_sense_isadma_cache;
> @@ -553,12 +559,21 @@ static void scsi_uninit_cmd(struct scsi_cmnd *cmd)
>         }
>  }
>  
> +static inline bool scsi_prot_use_inline_sg(struct scsi_cmnd *cmd)
> +{
> +       if (!scsi_prot_sglist(cmd))
> +               return false;

Since scsi_prot_use_inline_sg() is only called if scsi_prot_sg_count() > 0,
is the above test necessary?

> +       return cmd->prot_sdb->table.sgl ==
> +               (struct scatterlist *)(cmd->prot_sdb + 1);
> +}
> +
>  static void scsi_mq_free_sgtables(struct scsi_cmnd *cmd)
>  {
>         if (cmd->sdb.table.nents)
>                 sg_free_table_chained(&cmd->sdb.table, true);
> -       if (scsi_prot_sg_count(cmd))
> -               sg_free_table_chained(&cmd->prot_sdb->table, true);
> +       if (scsi_prot_sg_count(cmd) && !scsi_prot_use_inline_sg(cmd))
> +               sg_free_table_chained(&cmd->prot_sdb->table, false);
>  }
>  
>  static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd)
> @@ -1044,9 +1059,11 @@ blk_status_t scsi_init_io(struct scsi_cmnd *cmd)
>                 }
>  
>                 ivecs = blk_rq_count_integrity_sg(rq->q, rq->bio);
> -
> -               if (sg_alloc_table_chained(&prot_sdb->table, ivecs,
> -                               prot_sdb->table.sgl)) {
> +               if (ivecs <= SCSI_INLINE_PROT_SG_CNT)
> +                       prot_sdb->table.nents = prot_sdb->table.orig_nents =
> +                               SCSI_INLINE_PROT_SG_CNT;

Please call sg_init_table() instead of open-coding it.

> +               else if (sg_alloc_table_chained(&prot_sdb->table, ivecs,
> +                                       NULL)) {
>                         ret = BLK_STS_RESOURCE;
>                         goto out_free_sgtables;
>                 }

Bart.

Reply via email to