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.