From nobody Sun Oct 5 23:57:03 2025 Received: from fout-a6-smtp.messagingengine.com (fout-a6-smtp.messagingengine.com [103.168.172.149]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B64CE1684B0 for ; Mon, 28 Jul 2025 01:51:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.149 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753667495; cv=none; b=lKydipBNqNU/uFN5NS/4svqjPh9ZCMg0szSNvucPMHOeoYwc82vi7wc/rjjbcp/qQfegqVpA6k7CIu3cYABG1HFLzWpnbDFOQmNvt+ZG9AEsOdv6WVaSTwMs/4Anycq6+rUbTQWwD739nqd4aH4WbDe7IM0fQ5Ih/UJdbggJ3a0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753667495; c=relaxed/simple; bh=NBOMXeN7jfbrMYzOfrYMQ9qDbDr5qjIwvGsaTdXgWX8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FwrzW8aIXvhwGrRlJgng0zzkpdQFqsIPEWdvV/Yubq4ER9EhlI0yzKUV3IW9KIIQPIeCGdEH01OuA/4BO+KDJMeCxHMKij6TDolELcfJoTd/Cz0iFIVPntM31NhYSeVzmX8Itq8FAo+NqNnStHB0BJmIr+73Qz43EDQ1ufelRuk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=sakamocchi.jp; spf=pass smtp.mailfrom=sakamocchi.jp; dkim=pass (2048-bit key) header.d=sakamocchi.jp header.i=@sakamocchi.jp header.b=l3gV/XPJ; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=F8bbBz0l; arc=none smtp.client-ip=103.168.172.149 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=sakamocchi.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sakamocchi.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sakamocchi.jp header.i=@sakamocchi.jp header.b="l3gV/XPJ"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="F8bbBz0l" Received: from phl-compute-05.internal (phl-compute-05.phl.internal [10.202.2.45]) by mailfout.phl.internal (Postfix) with ESMTP id B102EEC0019; Sun, 27 Jul 2025 21:51:31 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-05.internal (MEProxy); Sun, 27 Jul 2025 21:51:31 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sakamocchi.jp; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm3; t=1753667491; x= 1753753891; bh=uIT7ZT2GEbaZ13vB+uEm7pnNUB9wlozg2/F7BnXZ+14=; b=l 3gV/XPJ4r1xwxtQ9ksecb5jrtlvMfWJtbXS1CuhqNt/3KDu0iaHldDK5L0SS3fLQ ej1yHobFmaramHnZ0aF1H+eeeMY36qaEcqFL5nLe3aWSTf7BpAGq/UbO5asjskF3 Q/xF5L0GMRUzvUxbhFb9ZORmQPLN5IHVhZEFLhEQS8PPuTToyAzmFohrgvkqZLWJ NVg+9IMPHCxgSuJHhmDOhF95rsGGaSf9TIKZ4XKdDAiAPw5gJiyuFoL7LauDSTxS SxoC/PXL0xt4LETcpHcwG1InTUZ4BbdSA/FNvKy09qYByHnca3L8rnNMY9LV7JxM QQafrML4XzGIPLKBr/k1w== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1753667491; x=1753753891; bh=u IT7ZT2GEbaZ13vB+uEm7pnNUB9wlozg2/F7BnXZ+14=; b=F8bbBz0lyHYKe4Aml DJP0RrI+gmxl0mhs3kVJIQrR9ohMh9sm199eN9ze+D5YnZ/5BxQxoN2bY6y7im/p iHKvmy2B+EmbNN8HzfkIPWiPMhNNrNdtE38k+hBTcJ6x8bu3EMM8YBc66+3/D1Mn UpDyYEED7MZz8U0+ITpjNw5nBgHby3ZjpawkQpqbs8B97Y91+LNG6fVwsUgVDKqp UScU9bsG9sGGJhrzR6vybUG/uHiJIrXd/PuYGzGFkG0BvetYbKJYpDHkWzqBHMQj 51tsqdyWH8vhFwA6RyaXd4d4KBDuhM0kGMUoFWxvW4EfyykGtSJPY3LFT9Sk3b9M ssnFw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdeltdeltdcutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecunecujfgurhephffvvefufffkofgjfhgggfestdekredtre dttdenucfhrhhomhepvfgrkhgrshhhihcuufgrkhgrmhhothhouceoohdqthgrkhgrshhh ihesshgrkhgrmhhotggthhhirdhjpheqnecuggftrfgrthhtvghrnhepvdejgfejuedvgf duudekleevtefgtdevhfdtffefiefgveeuteffiedvffekvddtnecuvehluhhsthgvrhfu ihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepohdqthgrkhgrshhhihesshgrkh grmhhotggthhhirdhjphdpnhgspghrtghpthhtohepvddpmhhouggvpehsmhhtphhouhht pdhrtghpthhtoheplhhinhhugidufeelgedquggvvhgvlheslhhishhtshdrshhouhhrtg gvfhhorhhgvgdrnhgvthdprhgtphhtthhopehlihhnuhigqdhkvghrnhgvlhesvhhgvghr rdhkvghrnhgvlhdrohhrgh X-ME-Proxy: Feedback-ID: ie8e14432:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 27 Jul 2025 21:51:30 -0400 (EDT) From: Takashi Sakamoto To: linux1394-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org Subject: [PATCH 1/3] firewire: core: use reference counting to invoke address handlers safely Date: Mon, 28 Jul 2025 10:51:23 +0900 Message-ID: <20250728015125.17825-2-o-takashi@sakamocchi.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250728015125.17825-1-o-takashi@sakamocchi.jp> References: <20250728015125.17825-1-o-takashi@sakamocchi.jp> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The lifetime of address handler has been managed by linked list and RCU. This approach was introduced in commit 35202f7d8420 ("firewire: remove global lock around address handlers, convert to RCU"). The invocations of address handler are performed within RCU read-side critical sections. In commit 57e6d9f85fff ("firewire: ohci: use workqueue to handle events of AR request/response contexts"), the invocations are in a workqueue context. The approach still imposes limitation that sleeping is not allowed within RCU read-side critical sections. However, since sleeping is not permitted within RCU read-side critical sections, this approach still has a limitation. This commit adds reference counting to decouple handler invocation from handler discovery. The linked list and RCU is used to discover the handlers, while the reference counting is used to invoke them safely. Signed-off-by: Takashi Sakamoto --- drivers/firewire/core-transaction.c | 32 +++++++++++++++++++++++++++-- include/linux/firewire.h | 4 ++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-tr= ansaction.c index d28477d84697..29ca9f3f14ce 100644 --- a/drivers/firewire/core-transaction.c +++ b/drivers/firewire/core-transaction.c @@ -550,6 +550,23 @@ const struct fw_address_region fw_unit_space_region = =3D { .start =3D 0xfffff0000900ULL, .end =3D 0x1000000000000ULL, }; #endif /* 0 */ =20 +static void complete_address_handler(struct kref *kref) +{ + struct fw_address_handler *handler =3D container_of(kref, struct fw_addre= ss_handler, kref); + + complete(&handler->done); +} + +static void get_address_handler(struct fw_address_handler *handler) +{ + kref_get(&handler->kref); +} + +static int put_address_handler(struct fw_address_handler *handler) +{ + return kref_put(&handler->kref, complete_address_handler); +} + /** * fw_core_add_address_handler() - register for incoming requests * @handler: callback @@ -596,6 +613,8 @@ int fw_core_add_address_handler(struct fw_address_handl= er *handler, if (other !=3D NULL) { handler->offset +=3D other->length; } else { + init_completion(&handler->done); + kref_init(&handler->kref); list_add_tail_rcu(&handler->link, &address_handler_list); ret =3D 0; break; @@ -621,6 +640,9 @@ void fw_core_remove_address_handler(struct fw_address_h= andler *handler) list_del_rcu(&handler->link); =20 synchronize_rcu(); + + if (!put_address_handler(handler)) + wait_for_completion(&handler->done); } EXPORT_SYMBOL(fw_core_remove_address_handler); =20 @@ -913,10 +935,13 @@ static void handle_exclusive_region_request(struct fw= _card *card, scoped_guard(rcu) { handler =3D lookup_enclosing_address_handler(&address_handler_list, offs= et, request->length); - if (handler) + if (handler) { + get_address_handler(handler); handler->address_callback(card, request, tcode, destination, source, p->generation, offset, request->data, request->length, handler->callback_data); + put_address_handler(handler); + } } =20 if (!handler) @@ -952,10 +977,13 @@ static void handle_fcp_region_request(struct fw_card = *card, =20 scoped_guard(rcu) { list_for_each_entry_rcu(handler, &address_handler_list, link) { - if (is_enclosing_handler(handler, offset, request->length)) + if (is_enclosing_handler(handler, offset, request->length)) { + get_address_handler(handler); handler->address_callback(card, request, tcode, destination, source, p->generation, offset, request->data, request->length, handler->callback_data); + put_address_handler(handler); + } } } =20 diff --git a/include/linux/firewire.h b/include/linux/firewire.h index cceb70415ed2..d38c6e538e5c 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h @@ -341,7 +341,11 @@ struct fw_address_handler { u64 length; fw_address_callback_t address_callback; void *callback_data; + + // Only for core functions. struct list_head link; + struct kref kref; + struct completion done; }; =20 struct fw_address_region { --=20 2.48.1 From nobody Sun Oct 5 23:57:03 2025 Received: from fout-a6-smtp.messagingengine.com (fout-a6-smtp.messagingengine.com [103.168.172.149]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CAD47198851 for ; Mon, 28 Jul 2025 01:51:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.149 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753667495; cv=none; b=DPIXWPa6hv7f+8AdOd6HYJEXn5WDdVr7fdThPj6l8CX+wzja/6pivlALB1mcmWqKN59bqcLZcC8NZ2+u663ObytFd8+sfo+proKOONQXik5C6xmRGXDy0kFsSskMBpo4krdzHzv8yNFotmmJFZxZqNMKuz+DiD5HKRg0QlsH07M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753667495; c=relaxed/simple; bh=q9otTa9NZdOiCJNQl4OD6xqn9lIKwfmzJlUv8Z4LWuk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VIIjAf4gb8HSRuscqm0TPg26rHtdrPUzQloLNz9grntsoezl8Dt9j3sQX3Pfm1CeHegHPj55LeSX0JcLuuHgvblCkY+BFT6q4Mqy+udysjS2lyh6IRGeuU+h8AsmxuUEYiwoZpRI9Va0JtT/dQEHc59Lbjw/2+1inaEPa4MVjOo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=sakamocchi.jp; spf=pass smtp.mailfrom=sakamocchi.jp; dkim=pass (2048-bit key) header.d=sakamocchi.jp header.i=@sakamocchi.jp header.b=fW6QzVKw; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=IaS1lKkl; arc=none smtp.client-ip=103.168.172.149 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=sakamocchi.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sakamocchi.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sakamocchi.jp header.i=@sakamocchi.jp header.b="fW6QzVKw"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="IaS1lKkl" Received: from phl-compute-03.internal (phl-compute-03.phl.internal [10.202.2.43]) by mailfout.phl.internal (Postfix) with ESMTP id F063EEC00DC; Sun, 27 Jul 2025 21:51:32 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-03.internal (MEProxy); Sun, 27 Jul 2025 21:51:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sakamocchi.jp; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm3; t=1753667492; x= 1753753892; bh=D0BMPfPajXGaC45vmNs+dIanSxJ+Y1IlpOlvP9lpPHg=; b=f W6QzVKwaobJ7GUPv3Bp9aaIhJD1rnAem5FFGu2NLmYSEIR3biPmDk+UHFXtkpwYI Y6DP+1ro+l4Ur7zF9YMxYCeNoMr8+5eYGPT6OQB+XF5hb5ibsCytJkJNDzO7c236 fciYzMa8SiGGqbMsltPpl+Xq4dOWxa0DaC4MFpFKwkVMFuAGMXzfTxbCoRRbsoxh 5goqytBsGHCylB+d/lgZtyKwI1bZyScYM4ixWog8iKFQ5XdTsCMeuTZL64DTQSJK 32Zz8Jcc5SRzjPHT+XwkBA8Cs+3u5vD2wDdBl4z3w8wF+OL2153v3+GHSF1TOTWl AunalhuLiUlsKAb7/sZfQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1753667492; x=1753753892; bh=D 0BMPfPajXGaC45vmNs+dIanSxJ+Y1IlpOlvP9lpPHg=; b=IaS1lKklM6lBm2WBJ hwQWhfHDqlgA2cfI5r+I+4NuSffHBbcypb6XENoy9LkbmLYVwf8arlWH50gcwUNA kLYKVM+YwMXLxxmUapwr+WbTblh148Z5+SiJe6yXNRvmwR+y0Deysz5iUh8N78yP zUAyA9jy9yM08lxi0nGoiBhf6WCOTRTTleUimsSIe5jxB2qfr4m9KgLVWcZ/KdtI gRxnNHdZNF0cZIf4C4iGiO1uRLHn99AAPyyfTfIvqwMpmaGaCDbOtphOvwxKt8J5 aesS4FgKjAS3KXMR7VgRjpsN4Cepv1AEy3PKpwxpsIk/FVdNMuHO6Yh0qhk4YsaK QyBfQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdeltdeltdcutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecunecujfgurhephffvvefufffkofgjfhgggfestdekredtre dttdenucfhrhhomhepvfgrkhgrshhhihcuufgrkhgrmhhothhouceoohdqthgrkhgrshhh ihesshgrkhgrmhhotggthhhirdhjpheqnecuggftrfgrthhtvghrnhepvdejgfejuedvgf duudekleevtefgtdevhfdtffefiefgveeuteffiedvffekvddtnecuvehluhhsthgvrhfu ihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepohdqthgrkhgrshhhihesshgrkh grmhhotggthhhirdhjphdpnhgspghrtghpthhtohepvddpmhhouggvpehsmhhtphhouhht pdhrtghpthhtoheplhhinhhugidufeelgedquggvvhgvlheslhhishhtshdrshhouhhrtg gvfhhorhhgvgdrnhgvthdprhgtphhtthhopehlihhnuhigqdhkvghrnhgvlhesvhhgvghr rdhkvghrnhgvlhdrohhrgh X-ME-Proxy: Feedback-ID: ie8e14432:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 27 Jul 2025 21:51:31 -0400 (EDT) From: Takashi Sakamoto To: linux1394-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org Subject: [PATCH 2/3] firewire: core: call handler for exclusive regions outside RCU read-side critical section Date: Mon, 28 Jul 2025 10:51:24 +0900 Message-ID: <20250728015125.17825-3-o-takashi@sakamocchi.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250728015125.17825-1-o-takashi@sakamocchi.jp> References: <20250728015125.17825-1-o-takashi@sakamocchi.jp> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The previous commit added reference counting to ensure safe invocations of address handlers. This commit moves the invocation of handlers for exclusive regins outside of the RCU read-side critical section. The address handler for the requested region is selected within the critical section, then invoked outside of it. Signed-off-by: Takashi Sakamoto --- drivers/firewire/core-transaction.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-tr= ansaction.c index 29ca9f3f14ce..a742971c65fa 100644 --- a/drivers/firewire/core-transaction.c +++ b/drivers/firewire/core-transaction.c @@ -935,17 +935,19 @@ static void handle_exclusive_region_request(struct fw= _card *card, scoped_guard(rcu) { handler =3D lookup_enclosing_address_handler(&address_handler_list, offs= et, request->length); - if (handler) { + if (handler) get_address_handler(handler); - handler->address_callback(card, request, tcode, destination, source, - p->generation, offset, request->data, - request->length, handler->callback_data); - put_address_handler(handler); - } } =20 - if (!handler) + if (!handler) { fw_send_response(card, request, RCODE_ADDRESS_ERROR); + return; + } + + // Outside the RCU read-side critical section. Without spinlock. With ref= erence count. + handler->address_callback(card, request, tcode, destination, source, p->g= eneration, offset, + request->data, request->length, handler->callback_data); + put_address_handler(handler); } =20 static void handle_fcp_region_request(struct fw_card *card, --=20 2.48.1 From nobody Sun Oct 5 23:57:03 2025 Received: from fhigh-a5-smtp.messagingengine.com (fhigh-a5-smtp.messagingengine.com [103.168.172.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 465A61CEAB2 for ; Mon, 28 Jul 2025 01:51:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.156 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753667497; cv=none; b=OeLic6GzC/KcH1gUJX2IQDr/pV3QTngbqASjIo0s+Oao2gYvc+QL+AyuBmtT8Tf6bmhS6qtHjGNXk+ro+R1lSEmDwVNWy0xEiojCBVin9H2PH/Cuq6WWaG1zO3bDE5gLicfZYx05sYit2MFFuti9/fHpxOCLIvPICAZdE0kpNVI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753667497; c=relaxed/simple; bh=C6q76Gzm2DqD6HRJKHqm4Ac926Hyh8QT5OZunvVP9WY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=I3EMRV5qPYeOOu/b+yDZXA0q47mN4thyBj7xFIhU1YQ+x9FBcNTosXq4t0WH4spaHhGD4RBK69BpHrVEYVH5nPndA2El7/aUoOUgUTV4xId7JIUmpTjLzDsQBNjhS4xmWdEQvakA0bS6CG//L86qzv0dC2sr8+g4oFrqSM7J3/c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=sakamocchi.jp; spf=pass smtp.mailfrom=sakamocchi.jp; dkim=pass (2048-bit key) header.d=sakamocchi.jp header.i=@sakamocchi.jp header.b=ePAANq2p; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=EEgAPSn5; arc=none smtp.client-ip=103.168.172.156 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=sakamocchi.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sakamocchi.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sakamocchi.jp header.i=@sakamocchi.jp header.b="ePAANq2p"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="EEgAPSn5" Received: from phl-compute-01.internal (phl-compute-01.phl.internal [10.202.2.41]) by mailfhigh.phl.internal (Postfix) with ESMTP id 3FDEC14000E3; Sun, 27 Jul 2025 21:51:34 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-01.internal (MEProxy); Sun, 27 Jul 2025 21:51:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sakamocchi.jp; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm3; t=1753667494; x= 1753753894; bh=T+KYmE/l+yGdl7UNyJzzt98jcLOcd4qLqrRVfYXoeUM=; b=e PAANq2py4DHrail2mkIieVSfGEEkvkDJ3dC//02HMEBCL0p93iairB+HFq/jUNog RkgkYC9SQmrxIW/5ROZheBTHbBY0++f/o7WA+bv7HOHS7IR2Od4ReaWdVDiqoRL6 mLjdPNX1AZ2DLbzAHjof+g1DlixAYbSynjZYMtkKzqYZFLhsCajVzbEmJJnFwvtm 3JDQDRh1AQtJvMy6OKyx63Zp6Iw0c0M66ntIcTsS07YaaIX//8n8IytF89n6IwFV M/mbviy3L5wErDGQFlLOh4iMh3eDSl2gByWNYtWQAcqPj1ZOMAhY/lvZhcGv/+uw 6/ktQA9MpWxNmahmIu5Ww== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1753667494; x=1753753894; bh=T +KYmE/l+yGdl7UNyJzzt98jcLOcd4qLqrRVfYXoeUM=; b=EEgAPSn5YsQuTs/2x AXUhSMT/17SVBszKPa1ILfrRdwlmYLZkYm7qo18JCUoLE4wBVFj1C0gZaMAJL2oE b14/9mpnN3Os8YLfbkJ4HbQfS5zSPnmr4WPZ8tjHpY9EesxppnbagyWz6+uCuks9 g+BQlBSunGQ70zaLNFTjRtxtm7Ej11K+vNuP7T5ImVN87WB6124mVunyoMkSTxD2 p2ru9cP3WNFk0sxxEG4/+P4SbJ3fs094zG742gVvOzooeZscA4CDw3Ro9j2kXP0L gmqGN0CCaTMW/Y+qcyPGdHCNRSPX/GQ959i6YlxRSl4s3bJfS7oeyHsh7RU4FJi+ pteKw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdeltdeltdcutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecunecujfgurhephffvvefufffkofgjfhgggfestdekredtre dttdenucfhrhhomhepvfgrkhgrshhhihcuufgrkhgrmhhothhouceoohdqthgrkhgrshhh ihesshgrkhgrmhhotggthhhirdhjpheqnecuggftrfgrthhtvghrnhepvdejgfejuedvgf duudekleevtefgtdevhfdtffefiefgveeuteffiedvffekvddtnecuvehluhhsthgvrhfu ihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepohdqthgrkhgrshhhihesshgrkh grmhhotggthhhirdhjphdpnhgspghrtghpthhtohepvddpmhhouggvpehsmhhtphhouhht pdhrtghpthhtoheplhhinhhugidufeelgedquggvvhgvlheslhhishhtshdrshhouhhrtg gvfhhorhhgvgdrnhgvthdprhgtphhtthhopehlihhnuhigqdhkvghrnhgvlhesvhhgvghr rdhkvghrnhgvlhdrohhrgh X-ME-Proxy: Feedback-ID: ie8e14432:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 27 Jul 2025 21:51:33 -0400 (EDT) From: Takashi Sakamoto To: linux1394-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org Subject: [PATCH 3/3] firewire: core: call FCP address handlers outside RCU read-side critical section Date: Mon, 28 Jul 2025 10:51:25 +0900 Message-ID: <20250728015125.17825-4-o-takashi@sakamocchi.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250728015125.17825-1-o-takashi@sakamocchi.jp> References: <20250728015125.17825-1-o-takashi@sakamocchi.jp> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The previous commit added reference counting to ensure safe invocations of address handlers. This commit moves the invocation of FCP address handlers outside of the RCU read critical section. Unlike the exclusive-region address handlers, all FCP address handlers should be called on receiving an FCP request. An XArray is used to collect the FCP address handlers during the RCU read-side critical section, after which they are invoked. Reference counting ensures that each FCP address handler is called safely. Signed-off-by: Takashi Sakamoto --- drivers/firewire/core-transaction.c | 30 +++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-tr= ansaction.c index a742971c65fa..c5408c83709c 100644 --- a/drivers/firewire/core-transaction.c +++ b/drivers/firewire/core-transaction.c @@ -956,13 +956,14 @@ static void handle_fcp_region_request(struct fw_card = *card, unsigned long long offset) { struct fw_address_handler *handler; + DEFINE_XARRAY_ALLOC(handlers); int tcode, destination, source; + unsigned long id; =20 if ((offset !=3D (CSR_REGISTER_BASE | CSR_FCP_COMMAND) && offset !=3D (CSR_REGISTER_BASE | CSR_FCP_RESPONSE)) || request->length > 0x200) { fw_send_response(card, request, RCODE_ADDRESS_ERROR); - return; } =20 @@ -973,22 +974,39 @@ static void handle_fcp_region_request(struct fw_card = *card, if (tcode !=3D TCODE_WRITE_QUADLET_REQUEST && tcode !=3D TCODE_WRITE_BLOCK_REQUEST) { fw_send_response(card, request, RCODE_TYPE_ERROR); + return; + } =20 + // Reserve an entry outside the RCU read-side critical section to cover m= ost cases. + id =3D 0; + if (xa_reserve(&handlers, id, GFP_KERNEL) < 0) { + fw_send_response(card, request, RCODE_CONFLICT_ERROR); return; } =20 scoped_guard(rcu) { list_for_each_entry_rcu(handler, &address_handler_list, link) { if (is_enclosing_handler(handler, offset, request->length)) { - get_address_handler(handler); - handler->address_callback(card, request, tcode, destination, source, - p->generation, offset, request->data, - request->length, handler->callback_data); - put_address_handler(handler); + // FCP is used for purposes unrelated to significant system + // resources (e.g. storage or networking), so allocation + // failures are not considered so critical. + void *ptr =3D xa_store(&handlers, id, handler, GFP_ATOMIC); + if (!xa_is_err(ptr)) { + ++id; + get_address_handler(handler); + } } } } =20 + xa_for_each(&handlers, id, handler) { + // Outside the RCU read-side critical section. Without spinlock. With re= ference count. + handler->address_callback(card, request, tcode, destination, source, p->= generation, + offset, request->data, request->length, handler->callback_data); + put_address_handler(handler); + } + + xa_destroy(&handlers); fw_send_response(card, request, RCODE_COMPLETE); } =20 --=20 2.48.1