diff --git a/scst/include/scst.h b/scst/include/scst.h index 998c5722f..8d5c81eaa 100644 --- a/scst/include/scst.h +++ b/scst/include/scst.h @@ -1662,7 +1662,7 @@ struct scst_session { * very beginning, because otherwise they can be missed during * TM processing. */ - struct list_head sess_cmd_list; + struct list_head sess_cmd_list ____cacheline_aligned_in_smp; spinlock_t sess_list_lock; /* protects sess_cmd_list, etc */ @@ -2303,7 +2303,7 @@ struct scst_dev_registrant { * SCST device */ struct scst_device { - unsigned short type; /* SCSI type of the device */ + unsigned int type; /* SCSI type of the device */ /************************************************************* ** Dev's flags. Updates serialized by dev_lock or suspended @@ -2311,16 +2311,16 @@ struct scst_device { *************************************************************/ /* Set if dev is RESERVED */ - unsigned short dev_reserved:1; + unsigned int dev_reserved:1; /* Set if double reset UA is possible */ - unsigned short dev_double_ua_possible:1; + unsigned int dev_double_ua_possible:1; /* If set, dev is read only */ - unsigned short dev_rd_only:1; + unsigned int dev_rd_only:1; /* Set, if a strictly serialized cmd is waiting blocked */ - unsigned short strictly_serialized_cmd_waiting:1; + unsigned int strictly_serialized_cmd_waiting:1; /* * Set, if this device is being unregistered. Useful to let sysfs @@ -2328,7 +2328,7 @@ struct scst_device { * possible deadlocks with their device unregistration waiting for * their kobj last put. */ - unsigned short dev_unregistering:1; + unsigned int dev_unregistering:1; /**************************************************************/ @@ -2353,37 +2353,6 @@ struct scst_device { /**************************************************************/ - /* - * Device lock. Modified independently to the above fields, hence - * the alignment. Gcc reported to have a long standing bug, when - * it uses 64-bit memory accesses for int bit fields, so this - * alignment must be here to workaroud it. - */ - spinlock_t dev_lock __aligned(sizeof(long)); - -#ifdef CONFIG_SCST_PER_DEVICE_CMD_COUNT_LIMIT - /* How many cmds alive on this dev */ - atomic_t dev_cmd_count; -#endif - - /* - * How many times device was blocked for new cmds execution. - * Protected by dev_lock. - */ - int block_count; - - /* - * How many there are "on_dev" commands, i.e. ones who passed - * scst_check_blocked_dev(). Protected by dev_lock. - */ - int on_dev_cmd_count; - - /* - * How many threads are checking commands for PR allowance. - * Protected by dev_lock. - */ - int pr_readers_count; - /* * Device block size and block shift if fixed size blocks used. Supposed * to be read-only or serialized the same way as MODE pages changes. @@ -2411,12 +2380,43 @@ struct scst_device { /* Corresponding real SCSI device, could be NULL for virtual devices */ struct scsi_device *scsi_dev; - /* List of commands with lock, if dedicated threads are used */ - struct scst_cmd_threads dev_cmd_threads; + /* + * Device lock. Modified independently to the above fields, hence + * the alignment. Gcc reported to have a long standing bug, when + * it uses 64-bit memory accesses for int bit fields, so this + * alignment must be here to workaroud it. + */ + spinlock_t dev_lock ____cacheline_aligned_in_smp; + +#ifdef CONFIG_SCST_PER_DEVICE_CMD_COUNT_LIMIT + /* How many cmds alive on this dev */ + atomic_t dev_cmd_count; +#endif + + /* + * How many times device was blocked for new cmds execution. + * Protected by dev_lock. + */ + int block_count; + + /* + * How many there are "on_dev" commands, i.e. ones who passed + * scst_check_blocked_dev(). Protected by dev_lock. + */ + int on_dev_cmd_count; + + /* + * How many threads are checking commands for PR allowance. + * Protected by dev_lock. + */ + int pr_readers_count; /* Memory limits for this device */ struct scst_mem_lim dev_mem_lim; + /* List of commands with lock, if dedicated threads are used */ + struct scst_cmd_threads dev_cmd_threads; + /************************************************************* ** Persistent reservation fields. Protected by dev_pr_mutex. *************************************************************/ @@ -2552,7 +2552,7 @@ struct scst_tgt_dev { void *dh_priv; /* How many cmds alive on this dev in this session */ - atomic_t tgt_dev_cmd_count; + atomic_t tgt_dev_cmd_count ____cacheline_aligned_in_smp; struct scst_order_data *curr_order_data; struct scst_order_data tgt_dev_order_data; diff --git a/scst/src/scst_main.c b/scst/src/scst_main.c index 43a00e2c7..813dc75ee 100644 --- a/scst/src/scst_main.c +++ b/scst/src/scst_main.c @@ -2302,12 +2302,24 @@ static int __init init_scst(void) INIT_CACHEP(scst_sense_cachep, scst_sense, out_destroy_ua_cache); } - INIT_CACHEP(scst_aen_cachep, scst_aen, out_destroy_sense_cache); + INIT_CACHEP(scst_aen_cachep, scst_aen, out_destroy_sense_cache); /* read-mostly */ INIT_CACHEP_ALIGN(scst_cmd_cachep, scst_cmd, out_destroy_aen_cache); - INIT_CACHEP_ALIGN(scst_sess_cachep, scst_session, out_destroy_cmd_cache); - INIT_CACHEP_ALIGN(scst_dev_cachep, scst_device, out_destroy_sess_cache); +#ifdef CONFIG_SCST_MEASURE_LATENCY + INIT_CACHEP_ALIGN( +#else + /* Big enough with read-mostly head and tail */ + INIT_CACHEP( +#endif + scst_sess_cachep, scst_session, out_destroy_cmd_cache); + INIT_CACHEP(scst_dev_cachep, scst_device, out_destroy_sess_cache); /* big enough */ INIT_CACHEP(scst_tgt_cachep, scst_tgt, out_destroy_dev_cache); /* read-mostly */ - INIT_CACHEP(scst_tgtd_cachep, scst_tgt_dev, out_destroy_tgt_cache); +#ifdef CONFIG_SCST_MEASURE_LATENCY + INIT_CACHEP_ALIGN( +#else + /* Big enough with read-mostly head and tail */ + INIT_CACHEP( +#endif + scst_tgtd_cachep, scst_tgt_dev, out_destroy_tgt_cache); /* big enough */ INIT_CACHEP(scst_acgd_cachep, scst_acg_dev, out_destroy_tgtd_cache); /* read-mostly */ scst_mgmt_mempool = mempool_create(64, mempool_alloc_slab,