scsi: core: Put hot fields of scsi_host_template in one cacheline

The following three fields of scsi_host_template are referenced in the SCSI
I/O submission hot path. Put them together in one cacheline:

 - cmd_size

 - queuecommand

 - commit_rqs

Link: https://lore.kernel.org/r/20210122023317.687987-10-ming.lei@redhat.com
Cc: Omar Sandoval <osandov@fb.com>
Cc: Kashyap Desai <kashyap.desai@broadcom.com>
Cc: Sumanesh Samanta <sumanesh.samanta@broadcom.com>
Cc: Ewan D. Milne <emilne@redhat.com>
Cc: Hannes Reinecke <hare@suse.de>
Tested-by: Sumanesh Samanta <sumanesh.samanta@broadcom.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Ming Lei 2021-01-22 10:33:13 +08:00 committed by Martin K. Petersen
parent 2a5a24aa83
commit 9ebb4d70dc

View File

@ -30,40 +30,15 @@ struct scsi_transport_template;
#define MODE_TARGET 0x02
struct scsi_host_template {
struct module *module;
const char *name;
/*
* Put fields referenced in IO submission path together in
* same cacheline
*/
/*
* The info function will return whatever useful information the
* developer sees fit. If not provided, then the name field will
* be used instead.
*
* Status: OPTIONAL
* Additional per-command data allocated for the driver.
*/
const char *(* info)(struct Scsi_Host *);
/*
* Ioctl interface
*
* Status: OPTIONAL
*/
int (*ioctl)(struct scsi_device *dev, unsigned int cmd,
void __user *arg);
#ifdef CONFIG_COMPAT
/*
* Compat handler. Handle 32bit ABI.
* When unknown ioctl is passed return -ENOIOCTLCMD.
*
* Status: OPTIONAL
*/
int (*compat_ioctl)(struct scsi_device *dev, unsigned int cmd,
void __user *arg);
#endif
int (*init_cmd_priv)(struct Scsi_Host *shost, struct scsi_cmnd *cmd);
int (*exit_cmd_priv)(struct Scsi_Host *shost, struct scsi_cmnd *cmd);
unsigned int cmd_size;
/*
* The queuecommand function is used to queue up a scsi
@ -111,6 +86,41 @@ struct scsi_host_template {
*/
void (*commit_rqs)(struct Scsi_Host *, u16);
struct module *module;
const char *name;
/*
* The info function will return whatever useful information the
* developer sees fit. If not provided, then the name field will
* be used instead.
*
* Status: OPTIONAL
*/
const char *(*info)(struct Scsi_Host *);
/*
* Ioctl interface
*
* Status: OPTIONAL
*/
int (*ioctl)(struct scsi_device *dev, unsigned int cmd,
void __user *arg);
#ifdef CONFIG_COMPAT
/*
* Compat handler. Handle 32bit ABI.
* When unknown ioctl is passed return -ENOIOCTLCMD.
*
* Status: OPTIONAL
*/
int (*compat_ioctl)(struct scsi_device *dev, unsigned int cmd,
void __user *arg);
#endif
int (*init_cmd_priv)(struct Scsi_Host *shost, struct scsi_cmnd *cmd);
int (*exit_cmd_priv)(struct Scsi_Host *shost, struct scsi_cmnd *cmd);
/*
* This is an error handling strategy routine. You don't need to
* define one of these if you don't want to - there is a default
@ -484,10 +494,6 @@ struct scsi_host_template {
*/
u64 vendor_id;
/*
* Additional per-command data allocated for the driver.
*/
unsigned int cmd_size;
struct scsi_host_cmd_pool *cmd_pool;
/* Delay for runtime autosuspend */