[ovs-dev] [PATCH] [RFC] fat-rwlock: New fast but big rwlock implementation.
Alex Wang
alexw at nicira.com
Wed Jan 8 19:07:38 UTC 2014
I'm trying to learn, want to ask few questions
I suspect that this approach to a rwlock is faster when lots of threads
> try to take the read lock at once, because it should avoid cross-core
> contention on cache lines.
For avoiding the contention, is that only because each thread will have its
own lock
or more precisely "fat_rwlock_perthread" which is aligned to cache line?
+void
> +fat_rwlock_destroy(struct fat_rwlock *rwlock)
> +{
> + struct fat_rwlock_perthread *perthread, *next;
> +
> + ovs_mutex_lock(&mutex);
> + LIST_FOR_EACH_SAFE (perthread, next, list_node, &rwlock->threads) {
> + list_remove(&perthread->list_node);
> + hmap_remove(&perthread->table->perthreads, &perthread->hmap_node);
> + ovs_mutex_destroy(&perthread->mutex);
> + free(perthread->base);
> + }
> + ovs_mutex_unlock(&mutex);
> +}
> +
> +static struct fat_rwlock_perthread *
> +fat_rwlock_get_perthread__(struct fat_rwlock *rwlock)
> + OVS_NO_THREAD_SAFETY_ANALYSIS
> +{
> + struct fat_rwlock_perthread_table *table;
> + struct fat_rwlock_perthread *perthread;
> + void *base;
> +
> + table = pthread_getspecific(perthread_table_key);
> + if (!table) {
> + table = xmalloc(sizeof *table);
> + hmap_init(&table->perthreads);
> + xpthread_setspecific(perthread_table_key, table);
> + }
> +
> + HMAP_FOR_EACH_WITH_HASH (perthread, hmap_node, rwlock->id,
> + &table->perthreads) {
> + return perthread;
> + }
> +
> + ovs_mutex_lock(&mutex);
> + fat_rwlock_lockall__(rwlock);
> +
> + base = xmalloc(sizeof *perthread + CACHE_LINE_SIZE - 1);
> + perthread = (void *) ROUND_UP((uintptr_t) base, CACHE_LINE_SIZE);
> +
>
> * + perthread = xmalloc(sizeof *perthread);* + perthread->base =
> base;
> + perthread->rwlock = rwlock;
> + list_push_back(&rwlock->threads, &perthread->list_node);
> + perthread->table = table;
> + hmap_insert(&table->perthreads, &perthread->hmap_node, rwlock->id);
> + ovs_mutex_init(&perthread->mutex);
> + ovs_mutex_lock(&perthread->mutex);
> + perthread->depth = 0;
>
Here, you want to align the perthread to cache line size, right?
What is the meaning of this second "perthread = xmalloc(sizeof
*perthread);" ?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20140108/694088c5/attachment-0003.html>
More information about the dev
mailing list