From nobody Sun Oct 5 14:45:20 2025 Received: from fout-b6-smtp.messagingengine.com (fout-b6-smtp.messagingengine.com [202.12.124.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 33448223DDA for ; Sun, 3 Aug 2025 12:20:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=202.12.124.149 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754223625; cv=none; b=OPHSFpJSZLlrIephUAyyOtpPwENWEAhgZnCbd8NJxBnGHG3PyJDOlSZ9ci18JaNH72al8mb3eGkn5U/VvcsikHJxkRYtPxg1oPYkpSu1Q8lvzxjRO5UpJCm4bNdZNPU4WCU0rmsPNmlkO9fhgtteZtxtg9GxWLcJ7ePXcv3To0I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754223625; c=relaxed/simple; bh=vCtpcf9wAnIGcpwLMOhPlHW12IOrK3my2L75fundcPs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vh0G1miKJR5g0871q5DUrt+WDaCydiFkACooLq9OQrYF0azuDV3sPiDXFAT2Fk+9dquac2rKCPrXWFlbltli4mTryeDUaifD9DiPM7iMLjIHChvGnK5jcomAavbLOAkNfju2gkzBaw2u0gR1djxvSvhBhL0yxVo1FDCVXmbIaIM= 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=EFjJa2WK; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=UloJUCq1; arc=none smtp.client-ip=202.12.124.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="EFjJa2WK"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="UloJUCq1" Received: from phl-compute-07.internal (phl-compute-07.phl.internal [10.202.2.47]) by mailfout.stl.internal (Postfix) with ESMTP id 1F3B61D0004C; Sun, 3 Aug 2025 08:20:22 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-07.internal (MEProxy); Sun, 03 Aug 2025 08:20:22 -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=1754223621; x= 1754310021; bh=+8FHm5cpc8lKA672iypagCkCcR1rLrfb6Rvi70Ol9DI=; b=E FjJa2WKC2efYXAsmUbJpRK1PHDrnQEHbEv5Mul2lZsGasTbJEwElpWagTqULd9B3 JdCR7QmLotJyMLtguCCsxWBweoj87llVV3NMHl+tsZpp8QcaXp/CqFIOCAdXJq1P hGUeCgmCF9WA/NHinsJF6/SAhxRdQ/vz7EYjpM20BNF2p9/3lEVmCgvD95a38oZK 3Bm9AkASeD6omywJZYK5xUmaHEn1quNm+bdD1/a76BhPji0qAiDB3EeUec6ORFN1 HmkYGcGNx1wCnrxamM/iNeQmOGzlaRc/kiwmUon/n9nBTvYMLS5aMjVI/yHMkgJ2 RiRJJx/bXhkEfK8fsDshg== 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=1754223621; x=1754310021; bh=+ 8FHm5cpc8lKA672iypagCkCcR1rLrfb6Rvi70Ol9DI=; b=UloJUCq12LQQy46f5 nhHhgaAiQ/fy5dMsZIae1FbI3nyhGA1uLv3rs73L3hDi4qsl+juzo/9njanVaWf0 qKFEViQag0b+bYIBr84At4tJbNFnCz5CVq+5q46W6EPZ80XfTZp+KLNEdC6b3RB4 alsHFVaSpkm/sqUVzVvYgk3x0MdJr4+nNHlclKWrx3MVzSrLelobnLkHA+dQhHRS +6JVmY3jwyxRG2AxkWlwd4iK5H3hod666/CxXiASUWb75GXyUee5Gab6QJgsl2CY 1POtQvDwTDu13DGRaQrUDT/hgZZJ2TFCidPM4XhGrcjG86TB/ruKkJ0No+/yOxmi 3zcTQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgddutdelgeegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtkeertd ertddtnecuhfhrohhmpefvrghkrghshhhiucfurghkrghmohhtohcuoehoqdhtrghkrghs hhhisehsrghkrghmohgttghhihdrjhhpqeenucggtffrrghtthgvrhhnpedvjefgjeeuvd fguddukeelveetgfdtvefhtdfffeeigfevueetffeivdffkedvtdenucevlhhushhtvghr ufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehoqdhtrghkrghshhhisehsrg hkrghmohgttghhihdrjhhppdhnsggprhgtphhtthhopedvpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopehlihhnuhigudefleegqdguvghvvghlsehlihhsthhsrdhsohhurh gtvghfohhrghgvrdhnvghtpdhrtghpthhtoheplhhinhhugidqkhgvrhhnvghlsehvghgv rhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: ie8e14432:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 3 Aug 2025 08:20:20 -0400 (EDT) From: Takashi Sakamoto To: linux1394-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org Subject: [PATCH v2 1/4] firewire: core: use reference counting to invoke address handlers safely Date: Sun, 3 Aug 2025 21:20:12 +0900 Message-ID: <20250803122015.236493-2-o-takashi@sakamocchi.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250803122015.236493-1-o-takashi@sakamocchi.jp> References: <20250803122015.236493-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 14:45:20 2025 Received: from fout-b6-smtp.messagingengine.com (fout-b6-smtp.messagingengine.com [202.12.124.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 8922823817D for ; Sun, 3 Aug 2025 12:20:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=202.12.124.149 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754223626; cv=none; b=Wv1r35CJiv2FZRClJoX3MZsytIKNqi/LtlIfX8pGxlbn6CPp3xQ+MZs5mpXvEh/keVVvpRPA17tILWryEDHFH34zi9U8UqIZQeWYp7OqmQgRZWtZ7H6oI86RotRG8SpGUhfrsDpvHJQd3Crs7bsIGodtE/SDZsR0p/Tj+98Ghp4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754223626; c=relaxed/simple; bh=Crow//sR4jZMyLwRLIxXSbgM7Qxpr2ZEaEHMdpqjOEg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ad8lZiu31gVbquTeAQVsinFO7+lU+gD6SHyyJTRWNPGiLudVptsTwuZLZ8hoDlUVZQVzX2qToii0VhAZaHRdPh4lIumrvfCBnVDjoOw24WWeSu8GOAO77txyvX/gBD9K8IhAeBRhZK0N2L998HyQqYOsnaF0AbIJKmkiUKkOFKg= 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=SqJN1Ovc; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=SUvDXZI9; arc=none smtp.client-ip=202.12.124.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="SqJN1Ovc"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="SUvDXZI9" Received: from phl-compute-01.internal (phl-compute-01.phl.internal [10.202.2.41]) by mailfout.stl.internal (Postfix) with ESMTP id A35F01D0004E; Sun, 3 Aug 2025 08:20:23 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Sun, 03 Aug 2025 08:20:23 -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=1754223623; x= 1754310023; bh=b2fyZFzRWVmgOWs4mun/1WkdQS/q7qojuVcYuOgaoDg=; b=S qJN1OvcFMlMwBV21lwkixIW4D1GSXL44Wqlmlq1OfHMCJUSZFbD08m71Oe+CYwPX SFVVyitY1OVVJiZ3tUoJ+wbMls+bywvT3o1XIzLDAZs14T5L/kkF/d4GcU0UJkgG w7lTsTapRHFzYpSArIy/Cl+SH0mEtzdTVmlz//MkJZhtJTHuhOH2l7NWQsT1Exo+ 1lJ8tEb/b2iQqXLuwQUjSmP/vS0nwiFyrRxVLgVW6v0LlEuhOcBuIR6YzoHW1vW/ 1Uyv3uOtBN07fQHw8L4MwT6DdKty1ydYHdsR0yish7BaLJnuJVVm0FUc/edO7ivS 5NE3SFF32nKQ+4dFVxgiQ== 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=1754223623; x=1754310023; bh=b 2fyZFzRWVmgOWs4mun/1WkdQS/q7qojuVcYuOgaoDg=; b=SUvDXZI9IT9kzXlJc G2e0QapDA08pKPXriDP3wjgr4+tlHC+QZhByvuU6dlcPfIOTh4tdrk2sjWLzralB nRj24BDPkHxvhl2TXnpAkf1X98hssSIOO28kyW9xC8cConKE+OaXspv9NyGjiRj4 6Jzt9OCsMNDe9gGQLRtUTEyT1r2AxyORxbvgQ1FBG/I+GmB4m05kE7+56baHP/4K B7nEbGFgCfa5aiSGKpJijyjPlSaMeHoE2G8SIHlexiGDL7bTYa9vGME8yKxzuuu6 K1zUiN0+o8H3HS/F52EMhsmfmZGf8tb0A0qEqXUivIbFg7vDunnxmS3S4aVQAXfg vTIIw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgddutdelgeegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtkeertd ertddtnecuhfhrohhmpefvrghkrghshhhiucfurghkrghmohhtohcuoehoqdhtrghkrghs hhhisehsrghkrghmohgttghhihdrjhhpqeenucggtffrrghtthgvrhhnpedvjefgjeeuvd fguddukeelveetgfdtvefhtdfffeeigfevueetffeivdffkedvtdenucevlhhushhtvghr ufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehoqdhtrghkrghshhhisehsrg hkrghmohgttghhihdrjhhppdhnsggprhgtphhtthhopedvpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopehlihhnuhigudefleegqdguvghvvghlsehlihhsthhsrdhsohhurh gtvghfohhrghgvrdhnvghtpdhrtghpthhtoheplhhinhhugidqkhgvrhhnvghlsehvghgv rhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: ie8e14432:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 3 Aug 2025 08:20:22 -0400 (EDT) From: Takashi Sakamoto To: linux1394-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org Subject: [PATCH v2 2/4] firewire: core: call handler for exclusive regions outside RCU read-side critical section Date: Sun, 3 Aug 2025 21:20:13 +0900 Message-ID: <20250803122015.236493-3-o-takashi@sakamocchi.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250803122015.236493-1-o-takashi@sakamocchi.jp> References: <20250803122015.236493-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 regions 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 14:45:20 2025 Received: from fhigh-b3-smtp.messagingengine.com (fhigh-b3-smtp.messagingengine.com [202.12.124.154]) (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 3353A25EFB6 for ; Sun, 3 Aug 2025 12:20:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=202.12.124.154 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754223628; cv=none; b=TDY5cm597GHGENeV2HG96aSD96RY+nL3SslGP32CxZcOs0buezeIIeJAJ+liAXo5l99jciaDF+oFPQ77kqsCdFjmt3YuuI+Qxrl87bFvk1zfMO6LRWxrUgGjirdwPpGJvmdhhBtJ1hF/2Frj3HfIDdgy5oD23fZmSkiiFPwjE7k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754223628; c=relaxed/simple; bh=N5GNr3BSkDRhNbjGVD7LY6BlO/NfsKqkpiVTw1h9o5c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uXtkZYlmQIWYSZn6z0Ug1R60RbXmr5KCvaM8AJh4JjwNNT4Wdq+SxYULFN2n3kINUaF/qqL+n/Ql01yl/yoquSmgi6tNBe7CkH/8jDkZ9kAqb1lHwzo+SJzo2QdFlY4x6obn2pWO1jhbTw6fTOuK2x2KWpHNdtCE9rZ72Hd2fyY= 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=kxWMbMr4; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=NOsdxfbR; arc=none smtp.client-ip=202.12.124.154 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="kxWMbMr4"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="NOsdxfbR" Received: from phl-compute-06.internal (phl-compute-06.phl.internal [10.202.2.46]) by mailfhigh.stl.internal (Postfix) with ESMTP id 2DEE27A0065; Sun, 3 Aug 2025 08:20:25 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-06.internal (MEProxy); Sun, 03 Aug 2025 08:20:25 -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=1754223625; x= 1754310025; bh=pp+pwOmICXcqQR9UclsW6KRuxHBE1pvoqo0FGtllvWg=; b=k xWMbMr4WmqTmxbR+Qjd0fPSNzL52yXGFwkcd09RULOkrxFycZ/8mUvODcrEAiCHu W7rNOPR4dLDiHPe3TBMBXmSJCcxhIExTzY9PN7X0Sq/Lnn3EINZ4t71w+2UfJ4qs i123x1i3nG7liUbwzqBZvi2RcgTYnOlvIBovcZwUkehgKXhysWvPPDWPHtkgME6h ZRdiUm3m/FGa97x4I7P+6T5bXBP8hT+OmuKevP7P3drMss6zZI1mnPyughWwhhrG eBFi1ax5wAAUSUAJEhRmIdm+7YAVz6PVEJtUk5CMZcUkzEuInP/gxbZnAo9F2hEG e5+w1ZvLvfuTAAX1rW2fA== 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=1754223625; x=1754310025; bh=p p+pwOmICXcqQR9UclsW6KRuxHBE1pvoqo0FGtllvWg=; b=NOsdxfbRuHiHu0Jhp 4slm2ARVjwwhDzA/SvZ29z720tH4s7r2uBtawORftzWKlK6NlWfP1cs7muUwRw8I g+4Cf21XyPZoavKqPBgQl08gn2RIyg4hatTFdn2qecNJ6CN9d4Kzzt1fks0g03Zu ZUqyzEq73S4F+AQnWmaYwNAQJquwYjOtYi3XPLLmzLAGfixTPREpISp2K0CyjNLU NG1x41X8+eOuDHrdfRWf3Hnxls5oWJZ3vXWw0LknlBYmje3SBT7GMoEVvBOoqsr9 bk+/eGeO2Rw4pNqfX3iMH1YodfU/fi/7uqnapH8/WnWDhjnpnae4rLIHq960K96E W+8aQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgddutdelgeegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtkeertd ertddtnecuhfhrohhmpefvrghkrghshhhiucfurghkrghmohhtohcuoehoqdhtrghkrghs hhhisehsrghkrghmohgttghhihdrjhhpqeenucggtffrrghtthgvrhhnpedvjefgjeeuvd fguddukeelveetgfdtvefhtdfffeeigfevueetffeivdffkedvtdenucevlhhushhtvghr ufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehoqdhtrghkrghshhhisehsrg hkrghmohgttghhihdrjhhppdhnsggprhgtphhtthhopedvpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopehlihhnuhigudefleegqdguvghvvghlsehlihhsthhsrdhsohhurh gtvghfohhrghgvrdhnvghtpdhrtghpthhtoheplhhinhhugidqkhgvrhhnvghlsehvghgv rhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: ie8e14432:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 3 Aug 2025 08:20:23 -0400 (EDT) From: Takashi Sakamoto To: linux1394-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org Subject: [PATCH v2 3/4] firewire: core: call FCP address handlers outside RCU read-side critical section Date: Sun, 3 Aug 2025 21:20:14 +0900 Message-ID: <20250803122015.236493-4-o-takashi@sakamocchi.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250803122015.236493-1-o-takashi@sakamocchi.jp> References: <20250803122015.236493-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 former commit added reference counting to ensure safe invocations of address handlers. Unlike the exclusive-region address handlers, all FCP address handlers should be called on receiving an FCP request. This commit uses the part of kernel stack to collect address handlers up to 4 within the section, then invoke them outside of the section. Reference counting ensures that each handler remains valid and safe to call. Lifting the limitation of supporting only 4 handlers is left for future work. Signed-off-by: Takashi Sakamoto --- drivers/firewire/core-transaction.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-tr= ansaction.c index a742971c65fa..7a62c660e912 100644 --- a/drivers/firewire/core-transaction.c +++ b/drivers/firewire/core-transaction.c @@ -950,13 +950,17 @@ static void handle_exclusive_region_request(struct fw= _card *card, put_address_handler(handler); } =20 +// To use kmalloc allocator efficiently, this should be power of two. +#define BUFFER_ON_KERNEL_STACK_SIZE 4 + static void handle_fcp_region_request(struct fw_card *card, struct fw_packet *p, struct fw_request *request, unsigned long long offset) { - struct fw_address_handler *handler; - int tcode, destination, source; + struct fw_address_handler *buffer_on_kernel_stack[BUFFER_ON_KERNEL_STACK_= SIZE]; + struct fw_address_handler *handler, **handlers; + int tcode, destination, source, i, count; =20 if ((offset !=3D (CSR_REGISTER_BASE | CSR_FCP_COMMAND) && offset !=3D (CSR_REGISTER_BASE | CSR_FCP_RESPONSE)) || @@ -977,18 +981,27 @@ static void handle_fcp_region_request(struct fw_card = *card, return; } =20 + count =3D 0; + handlers =3D buffer_on_kernel_stack; 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); + handlers[count] =3D handler; + if (++count >=3D ARRAY_SIZE(buffer_on_kernel_stack)) + break; } } } =20 + for (i =3D 0; i < count; ++i) { + handler =3D handlers[i]; + handler->address_callback(card, request, tcode, destination, source, + p->generation, offset, request->data, + request->length, handler->callback_data); + put_address_handler(handler); + } + fw_send_response(card, request, RCODE_COMPLETE); } =20 --=20 2.48.1 From nobody Sun Oct 5 14:45:20 2025 Received: from fout-b6-smtp.messagingengine.com (fout-b6-smtp.messagingengine.com [202.12.124.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 8896E2641C6 for ; Sun, 3 Aug 2025 12:20:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=202.12.124.149 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754223629; cv=none; b=eKo1ozhXFgnLdRIXrn6VjmnOUjtRdvDjsMFY+ldOFz/0vHgWmgpWX5dm8IHMBdU7LgSic0DZq7f/uIIyjrZWnoI7QezPhOIA1IMzm4aY1o8UH7DYUKKo1Ipfl3t/AXYEYCu2WMpqppo+J/EyDuuO1h4M8rKgq7fwKPRhqmWzavY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754223629; c=relaxed/simple; bh=4Mjl2grO/2bl1y5sh2vtEhDDO1Bj2z8wDS98ah5dKCo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BUFdS5RRNCXb4VkS8gPzQZnXSPxk2r4WBPYho5/RnNvXepk3+1J26yhjmXkQNEngAvqPOBZcpNEyRY7x/MzLWPsGJUrfncauTyJBMKkuq4duofre9zI8rT1HpX7s5/2jGx/i+jy/tZYhzpzec50wyFWZSTKLEHAt+NG3jy0mrEs= 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=SXZBtoE2; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=nc665JG+; arc=none smtp.client-ip=202.12.124.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="SXZBtoE2"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="nc665JG+" Received: from phl-compute-05.internal (phl-compute-05.phl.internal [10.202.2.45]) by mailfout.stl.internal (Postfix) with ESMTP id C70DD1D00051; Sun, 3 Aug 2025 08:20:26 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-05.internal (MEProxy); Sun, 03 Aug 2025 08:20:26 -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=1754223626; x= 1754310026; bh=0wTs9lEFAXHwGLgW5F3fT9Ue6CFiDVXylrQSLEDJF5Q=; b=S XZBtoE2P06n5pul5xgkbVgKzh346tEB0dNZwnU2gZXpBM4zKcolo+kAp0fW8rXuC L+iu+wBFYzHxRebM3kEqCa0necdFU6q+X+7uz7kpGR4b9RTkKZeAh14z1BLNNAWa stTacs/tBO1SMRLnYLNyS2RUoVtne7kidDSWqH6yYNGH9syKZF2N+gyGXmunnsac SfFCPUFEEX+BuFn3fhEjFKwv4hsdfbWKrzPuJZRiFELCD0avUP7MkrhJ1VShCi8u 9bN/iK38oqs2Nf9fFsUafwKjFiEW52Zyj81Z1pQ0WgXlCcE2RDd2+r0gTwa/Rgz+ 3B+9xX32pi0LwohDacxZg== 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=1754223626; x=1754310026; bh=0 wTs9lEFAXHwGLgW5F3fT9Ue6CFiDVXylrQSLEDJF5Q=; b=nc665JG+ObNYJmP0m rilqml+2lwXXx0RrPNn/lJZHvWwc6+glGBcnbAJnyPQoSZGCNHV0/dXPmdup/r5W gHKywlzqRMVBq+YyUUSpDN5BjivrFS/i9x+tWlvxITF0ZzkeuFPvzM+yjTI9/3Lc JgBix7SaZXIFgCnuhDCMXd1DQ5Gdr2wlBqtQtMo2QMLFjx0QimvFH/jK+Jl8BJHg s/7OqnUI7BQecrFBANmU9zkjJFKmVEFBELme/I3CBOtZkeBoDLzDX4+ffWHQMXGJ bWaQqr1dMwf7xysmQAVe8NCy1xbZXS/ZaTI2pj6c1qZv/4Mid0iv3AQmm1ZUoM3R ZkVqA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgddutdelgeegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtkeertd ertddtnecuhfhrohhmpefvrghkrghshhhiucfurghkrghmohhtohcuoehoqdhtrghkrghs hhhisehsrghkrghmohgttghhihdrjhhpqeenucggtffrrghtthgvrhhnpedvjefgjeeuvd fguddukeelveetgfdtvefhtdfffeeigfevueetffeivdffkedvtdenucevlhhushhtvghr ufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehoqdhtrghkrghshhhisehsrg hkrghmohgttghhihdrjhhppdhnsggprhgtphhtthhopedvpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopehlihhnuhigudefleegqdguvghvvghlsehlihhsthhsrdhsohhurh gtvghfohhrghgvrdhnvghtpdhrtghpthhtoheplhhinhhugidqkhgvrhhnvghlsehvghgv rhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: ie8e14432:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 3 Aug 2025 08:20:25 -0400 (EDT) From: Takashi Sakamoto To: linux1394-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org Subject: [PATCH v2 4/4] firewire: core: reallocate buffer for FCP address handlers when more than 4 are registered Date: Sun, 3 Aug 2025 21:20:15 +0900 Message-ID: <20250803122015.236493-5-o-takashi@sakamocchi.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250803122015.236493-1-o-takashi@sakamocchi.jp> References: <20250803122015.236493-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 former commit has a limitation that only up to 4 FCP address handlers could be processed per request. Although it suffices for most use cases, it is technically a regression. This commit lifts the restriction by reallocating the buffer from kernel heap when more than 4 handlers are registered. The allocation is performed within RCU read-side critical section, thus it uses GCP_ATOMIC flag. The buffer size is rounded up to the next power of two to align with kmalloc allocation units. Signed-off-by: Takashi Sakamoto --- drivers/firewire/core-transaction.c | 36 +++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-tr= ansaction.c index 7a62c660e912..1d1c2d8f85ae 100644 --- a/drivers/firewire/core-transaction.c +++ b/drivers/firewire/core-transaction.c @@ -960,7 +960,7 @@ static void handle_fcp_region_request(struct fw_card *c= ard, { struct fw_address_handler *buffer_on_kernel_stack[BUFFER_ON_KERNEL_STACK_= SIZE]; struct fw_address_handler *handler, **handlers; - int tcode, destination, source, i, count; + int tcode, destination, source, i, count, buffer_size; =20 if ((offset !=3D (CSR_REGISTER_BASE | CSR_FCP_COMMAND) && offset !=3D (CSR_REGISTER_BASE | CSR_FCP_RESPONSE)) || @@ -983,13 +983,38 @@ static void handle_fcp_region_request(struct fw_card = *card, =20 count =3D 0; handlers =3D buffer_on_kernel_stack; + buffer_size =3D ARRAY_SIZE(buffer_on_kernel_stack); scoped_guard(rcu) { list_for_each_entry_rcu(handler, &address_handler_list, link) { if (is_enclosing_handler(handler, offset, request->length)) { + if (count >=3D buffer_size) { + int next_size =3D buffer_size * 2; + struct fw_address_handler **buffer_on_kernel_heap; + + if (handlers =3D=3D buffer_on_kernel_stack) + buffer_on_kernel_heap =3D NULL; + else + buffer_on_kernel_heap =3D handlers; + + buffer_on_kernel_heap =3D + krealloc_array(buffer_on_kernel_heap, next_size, + sizeof(*buffer_on_kernel_heap), GFP_ATOMIC); + // FCP is used for purposes unrelated to significant system + // resources (e.g. storage or networking), so allocation + // failures are not considered so critical. + if (!buffer_on_kernel_heap) + break; + + if (handlers =3D=3D buffer_on_kernel_stack) { + memcpy(buffer_on_kernel_heap, buffer_on_kernel_stack, + sizeof(buffer_on_kernel_stack)); + } + + handlers =3D buffer_on_kernel_heap; + buffer_size =3D next_size; + } get_address_handler(handler); - handlers[count] =3D handler; - if (++count >=3D ARRAY_SIZE(buffer_on_kernel_stack)) - break; + handlers[count++] =3D handler; } } } @@ -1002,6 +1027,9 @@ static void handle_fcp_region_request(struct fw_card = *card, put_address_handler(handler); } =20 + if (handlers !=3D buffer_on_kernel_stack) + kfree(handlers); + fw_send_response(card, request, RCODE_COMPLETE); } =20 --=20 2.48.1