From patchwork Mon Apr 19 08:55:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emanuele Giuseppe Esposito X-Patchwork-Id: 12211229 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EF9B4C433B4 for ; Mon, 19 Apr 2021 08:59:15 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9EC2161151 for ; Mon, 19 Apr 2021 08:59:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9EC2161151 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:41286 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lYPkQ-0005bX-P8 for qemu-devel@archiver.kernel.org; Mon, 19 Apr 2021 04:59:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:41680) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lYPhP-0000ny-L4 for qemu-devel@nongnu.org; Mon, 19 Apr 2021 04:56:07 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:50960) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lYPhN-0000yl-Uf for qemu-devel@nongnu.org; Mon, 19 Apr 2021 04:56:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1618822565; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Q7e3ACKik/9Tt3fAfsgsQlAWRQdjxhC03g6iQjWjbOg=; b=Zs1MADo7T9lfMfLbZAxiNlTswSWSFsmmRJfzdIXGxDHWKl18epEAafr/XGcBEPTJJu3yEA 3VJyYUh/ddhXSnwCAqdHj7LS7ne2kPLRNJk2zu9WWkG9FMQ3OV8A3f6jhiqPtYUJSiu/HJ dH8zTj3L+IpmciHPQ2beWZJJoz8c3Fg= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-159-37hii6YUNGyykaSM_9xJtw-1; Mon, 19 Apr 2021 04:56:01 -0400 X-MC-Unique: 37hii6YUNGyykaSM_9xJtw-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 5E36387A82A; Mon, 19 Apr 2021 08:56:00 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-114-195.ams2.redhat.com [10.36.114.195]) by smtp.corp.redhat.com (Postfix) with ESMTP id BF93C5D742; Mon, 19 Apr 2021 08:55:57 +0000 (UTC) From: Emanuele Giuseppe Esposito To: qemu-block@nongnu.org Subject: [PATCH v2 3/8] util: use RCU accessors for notifiers Date: Mon, 19 Apr 2021 10:55:36 +0200 Message-Id: <20210419085541.22310-4-eesposit@redhat.com> In-Reply-To: <20210419085541.22310-1-eesposit@redhat.com> References: <20210419085541.22310-1-eesposit@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=eesposit@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=216.205.24.124; envelope-from=eesposit@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , qemu-devel@nongnu.org, Emanuele Giuseppe Esposito , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , John Snow Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" 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 Signed-off-by: Paolo Bonzini Signed-off-by: Emanuele Giuseppe Esposito --- 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;