From nobody Thu Oct 2 15:36:59 2025 Received: from fout-b5-smtp.messagingengine.com (fout-b5-smtp.messagingengine.com [202.12.124.148]) (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 F34822DCF62 for ; Mon, 15 Sep 2025 23:47:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=202.12.124.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757980079; cv=none; b=XDTtqBbX2K0o9s3LEH6HG9pKwBLFPqgHB5NJyZA6dHW3H+cpbMBNxMrtnhy1qR+fIRW4YH7hFW8UEELgVAMJubIcTmK3LFXPaL0cvDzMoq0F2PM5ljTjjcw5j9JUfE0FgAlG6Wyjkjnv+2B0+Z4fMvys5gCx5ONstJFfhIHxsM0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757980079; c=relaxed/simple; bh=K0UcjUZYEl+Kv8ubuBGOj04ZWNBPfcbzKPW+heC6t40=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=opAAwky6xk9mWqI7LxjzLjEp+pEqQrO2YuaD/5R5gSy9KdyCnA2GrAPvkhNDL0oZjxcBrDupBU36wgm6dahmkBeHoqqz+wWiYrM7wLm2EHXqHHFtexBpU8N7Asd+w2DldV2FEgI1GrozxugaTW5PHOmaz8/J1Tv5/VQBCn4S9qo= 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=RlJMaXh8; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=JIRyxcBF; arc=none smtp.client-ip=202.12.124.148 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="RlJMaXh8"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="JIRyxcBF" Received: from phl-compute-06.internal (phl-compute-06.internal [10.202.2.46]) by mailfout.stl.internal (Postfix) with ESMTP id 1BC8F1D001C9; Mon, 15 Sep 2025 19:47:56 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-06.internal (MEProxy); Mon, 15 Sep 2025 19:47:56 -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=fm1; t=1757980075; x= 1758066475; bh=Dol20McAHmsGe7jZI4Cf8OSI5NXIOjVDQY+keMjSiAg=; b=R lJMaXh86BW7g0l/TLxN/QBxVVUrOHTFGOfLoS0qWY8sEeizOatGqeyYtwOPEWaFc ecCQ5AnIKpi/e5d58mEg2bUlVh8CICRnQapCKkmkKGi/6tmunjwYiFh7RfjgMMlR hr6uyr+f76Dzj+HcTANFbUBUxHXXtuRCpVF0+/kuMI5ueGG7vNtGO0SJ9Vpan8TT 7ksxPzx/D1KjRcGLQu6PvsM61QuaOMQWEZPWox3hHeEPjWktfu8LibsRig0NxsZ+ MUt6gECzf0+Mq0EFCVxfFbKY5CAimvXeqBhmA1g2hj0G1HLAcM53BgdWqfdH/NTp M1cZV7OLWkuL6F7598nsA== 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=fm1; t=1757980075; x=1758066475; bh=D ol20McAHmsGe7jZI4Cf8OSI5NXIOjVDQY+keMjSiAg=; b=JIRyxcBFkpKooUjeH wYAS52CJbcSVp8H0INJzI6vYSvNzXDgkjtSfDqxll7IOSirdVpuMwhsByMHroD4p OyACMyXUNeGMovbyTs0kTQVxbZX058L22WXbpKyqOdHgAeF3SFoVHvxsUmYh6iYy dX0Nc5JlMnc1RWjzCj3tM+0TzVu6O48VcZ/sFmlJ7VTOvcMMy3mQvOfaQJazTR7X P92ILkB5p0a4xri8xVOkZl4o5rBUmAQAadCU0cyhMz4LQaSSOVxiT53deQ+R9odL 1fpxpi+L1uCyKP4e+xHd/GJT6Zh4jYB2/Yo4+N2ljuO84TUuerYjg5qqZE15NZ0F LnCKQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdefledthecutefuodetggdotefrod 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; Mon, 15 Sep 2025 19:47:54 -0400 (EDT) From: Takashi Sakamoto To: linux1394-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org Subject: [PATCH 3/6] firewire: core: use spin lock specific to topology map Date: Tue, 16 Sep 2025 08:47:44 +0900 Message-ID: <20250915234747.915922-4-o-takashi@sakamocchi.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250915234747.915922-1-o-takashi@sakamocchi.jp> References: <20250915234747.915922-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" At present, the operation for read transaction to topology map register is not protected by any kind of lock primitives. This causes a potential problem to result in the mixed content of topology map. This commit adds and uses spin lock specific to topology map. Signed-off-by: Takashi Sakamoto --- drivers/firewire/core-topology.c | 22 ++++++++++++++-------- drivers/firewire/core-transaction.c | 6 +++++- include/linux/firewire.h | 6 +++++- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/drivers/firewire/core-topology.c b/drivers/firewire/core-topol= ogy.c index 17aaf14cab0b..c62cf93f3f65 100644 --- a/drivers/firewire/core-topology.c +++ b/drivers/firewire/core-topology.c @@ -435,20 +435,22 @@ static void update_tree(struct fw_card *card, struct = fw_node *root) } } =20 -static void update_topology_map(struct fw_card *card, - u32 *self_ids, int self_id_count) +static void update_topology_map(__be32 *buffer, size_t buffer_size, int ro= ot_node_id, + const u32 *self_ids, int self_id_count) { - int node_count =3D (card->root_node->node_id & 0x3f) + 1; - __be32 *map =3D card->topology_map; + __be32 *map =3D buffer; + int node_count =3D (root_node_id & 0x3f) + 1; + + memset(map, 0, buffer_size); =20 *map++ =3D cpu_to_be32((self_id_count + 2) << 16); - *map++ =3D cpu_to_be32(be32_to_cpu(card->topology_map[1]) + 1); + *map++ =3D cpu_to_be32(be32_to_cpu(buffer[1]) + 1); *map++ =3D cpu_to_be32((node_count << 16) | self_id_count); =20 while (self_id_count--) *map++ =3D cpu_to_be32p(self_ids++); =20 - fw_compute_block_crc(card->topology_map); + fw_compute_block_crc(buffer); } =20 void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int gener= ation, @@ -479,8 +481,6 @@ void fw_core_handle_bus_reset(struct fw_card *card, int= node_id, int generation, =20 local_node =3D build_tree(card, self_ids, self_id_count, generation); =20 - update_topology_map(card, self_ids, self_id_count); - card->color++; =20 if (local_node =3D=3D NULL) { @@ -493,5 +493,11 @@ void fw_core_handle_bus_reset(struct fw_card *card, in= t node_id, int generation, update_tree(card, local_node); } } + + // Just used by transaction layer. + scoped_guard(spinlock, &card->topology_map.lock) { + update_topology_map(card->topology_map.buffer, sizeof(card->topology_map= .buffer), + card->root_node->node_id, self_ids, self_id_count); + } } EXPORT_SYMBOL(fw_core_handle_bus_reset); diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-tr= ansaction.c index 623e1d9bd107..8edffafd21c1 100644 --- a/drivers/firewire/core-transaction.c +++ b/drivers/firewire/core-transaction.c @@ -1196,7 +1196,11 @@ static void handle_topology_map(struct fw_card *card= , struct fw_request *request } =20 start =3D (offset - topology_map_region.start) / 4; - memcpy(payload, &card->topology_map[start], length); + + // NOTE: This can be without irqsave when we can guarantee that fw_send_r= equest() for local + // destination never runs in any type of IRQ context. + scoped_guard(spinlock_irqsave, &card->topology_map.lock) + memcpy(payload, &card->topology_map.buffer[start], length); =20 fw_send_response(card, request, RCODE_COMPLETE); } diff --git a/include/linux/firewire.h b/include/linux/firewire.h index f3260aacf730..aeb71c39e57e 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h @@ -129,7 +129,11 @@ struct fw_card { =20 bool broadcast_channel_allocated; u32 broadcast_channel; - __be32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4]; + + struct { + __be32 buffer[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4]; + spinlock_t lock; + } topology_map; =20 __be32 maint_utility_register; =20 --=20 2.48.1