X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Ffat-rwlock.c;h=82dfbfe1cea9cd2b07552aeef8236fba490213e5;hb=0ef165ecb57943e17a8ee8270df68ffb8d032e29;hp=3866dda490a31d80d84f5488f81300b49d311acf;hpb=e205100808563d803fd983b610865c5aceb09e9d;p=sliver-openvswitch.git diff --git a/lib/fat-rwlock.c b/lib/fat-rwlock.c index 3866dda49..82dfbfe1c 100644 --- a/lib/fat-rwlock.c +++ b/lib/fat-rwlock.c @@ -57,16 +57,6 @@ struct fat_rwlock_slot { * Accessed only by the slot's own thread, so no synchronization is * needed. */ unsigned int depth; - - /* To prevent two of these structures from accidentally occupying the same - * cache line (causing "false sharing"), we cache-align each of these data - * structures. That requires malloc()ing extra space and throwing away - * some space at the beginning, which means that the pointer to this struct - * isn't necessarily the pointer to the beginning of the block, and so we - * need to retain the original pointer to free later. - * - * Accessed only by a single thread, so no synchronization is needed. */ - void *base; /* Pointer to pass to free() for this block. */ }; static void @@ -77,7 +67,7 @@ free_slot(struct fat_rwlock_slot *slot) } list_remove(&slot->list_node); - free(slot->base); + free_cacheline(slot); } static void @@ -124,7 +114,6 @@ static struct fat_rwlock_slot * fat_rwlock_get_slot__(struct fat_rwlock *rwlock) { struct fat_rwlock_slot *slot; - void *base; /* Fast path. */ slot = ovsthread_getspecific(rwlock->key); @@ -134,21 +123,7 @@ fat_rwlock_get_slot__(struct fat_rwlock *rwlock) /* Slow path: create a new slot for 'rwlock' in this thread. */ - /* Allocate room for: - * - * - Up to CACHE_LINE_SIZE - 1 bytes before the per-thread, so that - * the start of the slot doesn't potentially share a cache line. - * - * - The slot itself. - * - * - Space following the slot up to the end of the cache line, so - * that the end of the slot doesn't potentially share a cache - * line. */ - base = xmalloc((CACHE_LINE_SIZE - 1) - + ROUND_UP(sizeof *slot, CACHE_LINE_SIZE)); - slot = (void *) ROUND_UP((uintptr_t) base, CACHE_LINE_SIZE); - - slot->base = base; + slot = xmalloc_cacheline(sizeof *slot); slot->rwlock = rwlock; ovs_mutex_init(&slot->mutex); slot->depth = 0;