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:
Родитель
2a5a24aa83
Коммит
9ebb4d70dc
|
@ -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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче