diff --git a/include/urcu/list.h b/include/urcu/list.h index 4aaf869..d5f28fe 100644 --- a/include/urcu/list.h +++ b/include/urcu/list.h @@ -40,6 +40,11 @@ struct cds_list_head { #define CDS_LIST_HEAD(name) \ struct cds_list_head name = { &(name), &(name) } +/* Likewise but aligned to ALIGN bytes. */ +#define CDS_LIST_HEAD_ALIGNED(name, align) \ + struct cds_list_head name __attribute__((aligned (align))) \ + = { &(name), &(name) } + /* Initialize a new list head. */ #define CDS_INIT_LIST_HEAD(ptr) \ (ptr)->next = (ptr)->prev = (ptr) diff --git a/src/urcu-bp.c b/src/urcu-bp.c index 05efd97..4e31147 100644 --- a/src/urcu-bp.c +++ b/src/urcu-bp.c @@ -154,12 +154,15 @@ URCU_ATTR_ALIAS("urcu_bp_gp") extern struct urcu_bp_gp rcu_gp_bp; DEFINE_URCU_TLS(struct urcu_bp_reader *, urcu_bp_reader); DEFINE_URCU_TLS_ALIAS(struct urcu_bp_reader *, urcu_bp_reader, rcu_reader_bp); -static CDS_LIST_HEAD(registry); +static CDS_LIST_HEAD_ALIGNED(registry, CAA_CACHE_LINE_SIZE); struct registry_chunk { size_t data_len; /* data length */ size_t used; /* amount of data used */ struct cds_list_head node; /* chunk_list node */ + char pad[CAA_CACHE_LINE_SIZE - /* pad to ensure expected alignment */ + sizeof(size_t) * 2 - + sizeof(struct cds_list_head)]; char data[]; }; @@ -270,8 +273,8 @@ static void wait_for_readers(struct cds_list_head *input_readers, void urcu_bp_synchronize_rcu(void) { - CDS_LIST_HEAD(cur_snap_readers); - CDS_LIST_HEAD(qsreaders); + CDS_LIST_HEAD_ALIGNED(cur_snap_readers, CAA_CACHE_LINE_SIZE); + CDS_LIST_HEAD_ALIGNED(qsreaders, CAA_CACHE_LINE_SIZE); sigset_t newmask, oldmask; int ret;