diff --git a/modules/cas_cache/classifier_defs.h b/modules/cas_cache/classifier_defs.h index f514c2d..a891ded 100644 --- a/modules/cas_cache/classifier_defs.h +++ b/modules/cas_cache/classifier_defs.h @@ -30,7 +30,7 @@ struct cas_classifier { struct workqueue_struct *wq; /* Lock for rules list */ - rwlock_t lock; + rwlock_t lock __attribute__((aligned(64))); }; struct cas_cls_condition_handler; diff --git a/modules/cas_cache/layer_upgrade.c b/modules/cas_cache/layer_upgrade.c index f8750ce..7500e3a 100644 --- a/modules/cas_cache/layer_upgrade.c +++ b/modules/cas_cache/layer_upgrade.c @@ -192,8 +192,8 @@ static int _cas_upgrade_dump_cache_conf_main(ocf_cache_t cache, } struct _ocf_core_visitor_ctx { - int i; struct cas_properties *cache_props; + int i; int error; }; @@ -710,9 +710,9 @@ static int _cas_upgrade_init_props_array( } struct _cas_cache_dump_conf_visitor_ctx { - int i; struct cas_properties **caches_props_array; struct casdsk_props_conf *caches_serialized_conf; + int i; int error; }; diff --git a/modules/cas_cache/ocf_env.c b/modules/cas_cache/ocf_env.c index e4c55b1..f627873 100644 --- a/modules/cas_cache/ocf_env.c +++ b/modules/cas_cache/ocf_env.c @@ -14,16 +14,16 @@ struct _env_allocator { /*!< Memory pool ID unique name */ char *name; - /*!< Size of specific item of memory pool */ - uint32_t item_size; - /*!< OS handle to memory pool */ struct kmem_cache *kmem_cache; - /*!< Number of currently allocated items in pool */ - atomic_t count; - struct cas_reserve_pool *rpool; + + /*!< Size of specific item of memory pool */ + uint32_t item_size; + + /*!< Number of currently allocated items in pool */ + atomic_t count __attribute__((aligned(64))); }; static inline size_t env_allocator_align(size_t size) diff --git a/modules/cas_cache/threads.c b/modules/cas_cache/threads.c index 8f4f1ca..ca3ef92 100644 --- a/modules/cas_cache/threads.c +++ b/modules/cas_cache/threads.c @@ -9,14 +9,14 @@ #define MAX_THREAD_NAME_SIZE 48 struct cas_thread_info { + char name[MAX_THREAD_NAME_SIZE]; + void *sync_data; atomic_t stop; + atomic_t kicked; struct completion compl; struct completion sync_compl; - void *sync_data; wait_queue_head_t wq; - atomic_t kicked; struct task_struct *thread; - char name[MAX_THREAD_NAME_SIZE]; }; static int _cas_io_queue_thread(void *data) diff --git a/modules/cas_cache/utils/utils_mpool.c b/modules/cas_cache/utils/utils_mpool.c index 34b0ec0..3ca1ede 100644 --- a/modules/cas_cache/utils/utils_mpool.c +++ b/modules/cas_cache/utils/utils_mpool.c @@ -7,12 +7,12 @@ #include "ocf_env.h" struct env_mpool { - int mpool_max; - /*!< Max mpool allocation order */ - env_allocator *allocator[env_mpool_max]; /*!< OS handle to memory pool */ + int mpool_max; + /*!< Max mpool allocation order */ + uint32_t hdr_size; /*!< Data header size (constant allocation part) */ diff --git a/modules/cas_cache/utils/utils_rpool.c b/modules/cas_cache/utils/utils_rpool.c index 7da026d..b431064 100644 --- a/modules/cas_cache/utils/utils_rpool.c +++ b/modules/cas_cache/utils/utils_rpool.c @@ -25,25 +25,31 @@ #define CAS_DEBUG_PARAM(format, ...) #endif +/* This is currently 24B padded/force aligned to 32B. + * With a 64B cacheline this means two structs on different cores may + * invalidate each other. This shouldn't happen between different physical + * CPUs and cause false sharing though, since with an even number of cores + * per CPU same cacheline shouldn't be polluted from the other physical CPU. + * */ struct _cas_reserve_pool_per_cpu { spinlock_t lock; struct list_head list; atomic_t count; -}; +} __attribute__((__aligned__(32))); struct cas_reserve_pool { uint32_t limit; - char *name; uint32_t entry_size; + char *name; struct _cas_reserve_pool_per_cpu *rpools; }; struct _cas_rpool_pre_alloc_info { struct work_struct ws; + struct completion cmpl; struct cas_reserve_pool *rpool_master; cas_rpool_new rpool_new; void *allocator_ctx; - struct completion cmpl; int error; };