[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 3/8] util: use RCU accessors for notifiers
From: |
Emanuele Giuseppe Esposito |
Subject: |
[PATCH v2 3/8] util: use RCU accessors for notifiers |
Date: |
Mon, 19 Apr 2021 10:55:36 +0200 |
Note that calling rcu_read_lock() is left to the caller. In fact,
if the notifier is really only used within the BQL, it's unnecessary.
Even outside the BQL, RCU accessors can also be used with any API that has
the same contract as synchronize_rcu, i.e. it stops until all concurrent
readers complete, no matter how "readers" are defined. In the next patch,
for example, synchronize_rcu's role is taken by bdrv_drain (which is a
superset of synchronize_rcu, since it also blocks new incoming readers).
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
---
util/notify.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/util/notify.c b/util/notify.c
index 76bab212ae..529f1d121e 100644
--- a/util/notify.c
+++ b/util/notify.c
@@ -15,6 +15,7 @@
#include "qemu/osdep.h"
#include "qemu/notify.h"
+#include "qemu/rcu_queue.h"
void notifier_list_init(NotifierList *list)
{
@@ -23,19 +24,19 @@ void notifier_list_init(NotifierList *list)
void notifier_list_add(NotifierList *list, Notifier *notifier)
{
- QLIST_INSERT_HEAD(&list->notifiers, notifier, node);
+ QLIST_INSERT_HEAD_RCU(&list->notifiers, notifier, node);
}
void notifier_remove(Notifier *notifier)
{
- QLIST_REMOVE(notifier, node);
+ QLIST_REMOVE_RCU(notifier, node);
}
void notifier_list_notify(NotifierList *list, void *data)
{
Notifier *notifier, *next;
- QLIST_FOREACH_SAFE(notifier, &list->notifiers, node, next) {
+ QLIST_FOREACH_SAFE_RCU(notifier, &list->notifiers, node, next) {
notifier->notify(notifier, data);
}
}
@@ -53,12 +54,12 @@ void notifier_with_return_list_init(NotifierWithReturnList
*list)
void notifier_with_return_list_add(NotifierWithReturnList *list,
NotifierWithReturn *notifier)
{
- QLIST_INSERT_HEAD(&list->notifiers, notifier, node);
+ QLIST_INSERT_HEAD_RCU(&list->notifiers, notifier, node);
}
void notifier_with_return_remove(NotifierWithReturn *notifier)
{
- QLIST_REMOVE(notifier, node);
+ QLIST_REMOVE_RCU(notifier, node);
}
int notifier_with_return_list_notify(NotifierWithReturnList *list, void *data)
@@ -66,7 +67,7 @@ int notifier_with_return_list_notify(NotifierWithReturnList
*list, void *data)
NotifierWithReturn *notifier, *next;
int ret = 0;
- QLIST_FOREACH_SAFE(notifier, &list->notifiers, node, next) {
+ QLIST_FOREACH_SAFE_RCU(notifier, &list->notifiers, node, next) {
ret = notifier->notify(notifier, data);
if (ret != 0) {
break;
--
2.30.2
- [PATCH v2 0/8] Block layer thread-safety, continued, Emanuele Giuseppe Esposito, 2021/04/19
- [PATCH v2 1/8] block: prepare write threshold code for thread safety, Emanuele Giuseppe Esposito, 2021/04/19
- [PATCH v2 2/8] block: protect write threshold QMP commands from concurrent requests, Emanuele Giuseppe Esposito, 2021/04/19
- [PATCH v2 3/8] util: use RCU accessors for notifiers,
Emanuele Giuseppe Esposito <=
- [PATCH v2 4/8] block: make before-write notifiers thread-safe, Emanuele Giuseppe Esposito, 2021/04/19
- [PATCH v2 5/8] block: add a few more notes on locking, Emanuele Giuseppe Esposito, 2021/04/19
- [PATCH v2 6/8] block: do not acquire AioContext in check_to_replace_node, Emanuele Giuseppe Esposito, 2021/04/19
- [PATCH v2 7/8] block/replication: do not acquire AioContext, Emanuele Giuseppe Esposito, 2021/04/19
- [PATCH v2 8/8] block: do not take AioContext around reopen, Emanuele Giuseppe Esposito, 2021/04/19
- Re: [PATCH v2 0/8] Block layer thread-safety, continued, Paolo Bonzini, 2021/04/21