From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id ABC43C7EE2A for ; Wed, 25 Jun 2025 23:19:24 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B631D6B0096; Wed, 25 Jun 2025 19:19:08 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B12646B00D8; Wed, 25 Jun 2025 19:19:08 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9DBD86B00DA; Wed, 25 Jun 2025 19:19:08 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 8DAC26B0096 for ; Wed, 25 Jun 2025 19:19:08 -0400 (EDT) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 5B45CB835F for ; Wed, 25 Jun 2025 23:19:08 +0000 (UTC) X-FDA: 83595490776.19.B5B803F Received: from mail-yb1-f182.google.com (mail-yb1-f182.google.com [209.85.219.182]) by imf27.hostedemail.com (Postfix) with ESMTP id 7F9394000B for ; Wed, 25 Jun 2025 23:19:06 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=soleen-com.20230601.gappssmtp.com header.s=20230601 header.b=t5Ih+ikh; spf=pass (imf27.hostedemail.com: domain of pasha.tatashin@soleen.com designates 209.85.219.182 as permitted sender) smtp.mailfrom=pasha.tatashin@soleen.com; dmarc=pass (policy=none) header.from=soleen.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1750893546; a=rsa-sha256; cv=none; b=Ww/yX+KUbVcbYsRJGVpsdTFFemyySAWWXIF651+9zerKCjkHBS9NTIC7OrlwyHDEpYsVPb AHYARznUh52Re+WOWAyreAkvpWODtVCXgxK3WNBgbOtr4UmVgS5BnVNl4O4jnlHWoMdosK mcyR+mzRDmWigcL0XoDlx741O3/m+Ms= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=soleen-com.20230601.gappssmtp.com header.s=20230601 header.b=t5Ih+ikh; spf=pass (imf27.hostedemail.com: domain of pasha.tatashin@soleen.com designates 209.85.219.182 as permitted sender) smtp.mailfrom=pasha.tatashin@soleen.com; dmarc=pass (policy=none) header.from=soleen.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1750893546; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=5UX19BNUcwB6TjSqCz6om7S5yVRpVe4SwKywfTR0ocE=; b=HIQRY5TIT4K5DLEkDbkXa4semu1xUjfqyPTbi4/lYRR4dr9iwzyk9NLc4Q0UHbW82HJ7RO anmsqzFoFAvOuFo2B9zCbwvdRk7rNw9aqjkViDvTVe+WeCJPDe3PUNb0gfSwRUzw10xrtJ YYugtm+K+u9+FTBoZ7K2lkJQoDnlPy8= Received: by mail-yb1-f182.google.com with SMTP id 3f1490d57ef6-e7387d4a336so312718276.2 for ; Wed, 25 Jun 2025 16:19:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=soleen-com.20230601.gappssmtp.com; s=20230601; t=1750893545; x=1751498345; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=5UX19BNUcwB6TjSqCz6om7S5yVRpVe4SwKywfTR0ocE=; b=t5Ih+ikhnnBV7bByGvxMX00Zj2JTfqZaDhBdusDkqiSP3CCOONVfuJDuasmAvDniE1 Jy7ut2RDtjjsbyJTEOLnF84cE16xBLS3t3T10U48Lga7B67XXbn4pZaE3jDhPQNPmcqC n9dFWy4cyRbA9t7MscEOkwApe86Foz+MWGk+jAIg4o4BEBpqoa3yRKn1JLtdMfjmiTNb O2MjbEUHYM+1exs/RNeK9g8QlPtwTbMiiwQt2gEUWJuWWD1n1bKbNZRUXyAoVPT5sCPd SiaHvJuU06o8dxFDphXU1rf0tUSlCr6gCmX+BWRmG3pO/UyqTdUNZJRdjgsnrFmT5RvR F8ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750893545; x=1751498345; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5UX19BNUcwB6TjSqCz6om7S5yVRpVe4SwKywfTR0ocE=; b=ulH/YDz2mo/sMQcKyp1HPkqNX5EZ+vD6GXNZmP6PdnEq69yVRzzppcVBhaFF8rWG9Z HGgUY/zjJM1Uila6GzgmUyHIwBqbfWXf76dPZtBFpdjPKhpFNbytShl88NL8Tx6pbx2G vs59i7oKCTQ/TYS7nJSE6VsTzItJ+uc7qQ3LSsUtVb2P6PcyJS7umDqOKfgShLfhJU26 p5w3ihfRnisQqV85rMg5fxfRrhAaXS6ixNFfEzmehAS9LBTs/GR0Htexv6BzB8qXe0/T VKbZgkC53ajjDfQhm3ZEUoem3jTbdGVam/v5JKuKibYo3uXPcOBYIy7pHf2I3/TBy0fa 1Uig== X-Forwarded-Encrypted: i=1; AJvYcCW+90mM70iFVHqccMRYkOc6J+6ZkYy8UgGhDaJxQ1BLD2Gn93eyZR5NsHn7cf2t6E56N7qF7pPWIA==@kvack.org X-Gm-Message-State: AOJu0YwBj7x9BlXLOmOM88GPzfqQ+WAjtx+1H2R7R8+GxpRqanLL0JRH xJ+svCR21YjgyjwO3kXRPnZSp0j+pJpacex4h6ZLQ7skPz5YlVnnpoW4aAiI+21rxLs= X-Gm-Gg: ASbGncsbfLcjFU4ueLejxCP5o2ZVRydU5KUNfofRFO8uJbKN0QmLwq2SpTANckdcSEV k3Fvas3oirAkY8ffSJSzjha5SVUipPGyeoCukc1c/NYkSdFRJJcYtLROru6rGTLNyjHjfwuITeS B9CdeV9TYGDm7rIeRHnyvlCeXhygdwWg5Kcs0quWYQOcesJlpKYMZv5Y8CgkmSVEFKdreNDG13S mtEaxsLmslCkvKBQsJdD71ssksaXcLWuAZnMx7/F/5c+zoyBbSgAwMQr5C0Uc0Ty6AWUICh0wi7 TU2V+DyPB4tIPY7C3KUkcybkOluZwNq/IWdPHT4cWpXb4Bnkhiprt5Yy48PEE6Uxqb8SZuTh3GL QUUrpY2oiZm68RJA8YeSockQwDmzgKxX2YirvFnkW4Uzz9vEBWkmVkmhQXvmMooo= X-Google-Smtp-Source: AGHT+IEUALELAR5NZDDDyivweXKXSv+YUONyeoj1fruSJbIWZ6q9777GsWvO1Or7ZMh1+hi6yBvkfg== X-Received: by 2002:a05:6902:4790:b0:e81:9da8:522d with SMTP id 3f1490d57ef6-e8601765df4mr6268713276.23.1750893545592; Wed, 25 Jun 2025 16:19:05 -0700 (PDT) Received: from soleen.c.googlers.com.com (64.167.245.35.bc.googleusercontent.com. [35.245.167.64]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e842ac5c538sm3942684276.33.2025.06.25.16.19.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Jun 2025 16:19:05 -0700 (PDT) From: Pasha Tatashin To: pratyush@kernel.org, jasonmiu@google.com, graf@amazon.com, changyuanl@google.com, pasha.tatashin@soleen.com, rppt@kernel.org, dmatlack@google.com, rientjes@google.com, corbet@lwn.net, rdunlap@infradead.org, ilpo.jarvinen@linux.intel.com, kanie@linux.alibaba.com, ojeda@kernel.org, aliceryhl@google.com, masahiroy@kernel.org, akpm@linux-foundation.org, tj@kernel.org, yoann.congal@smile.fr, mmaurer@google.com, roman.gushchin@linux.dev, chenridong@huawei.com, axboe@kernel.dk, mark.rutland@arm.com, jannh@google.com, vincent.guittot@linaro.org, hannes@cmpxchg.org, dan.j.williams@intel.com, david@redhat.com, joel.granados@kernel.org, rostedt@goodmis.org, anna.schumaker@oracle.com, song@kernel.org, zhangguopeng@kylinos.cn, linux@weissschuh.net, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-mm@kvack.org, gregkh@linuxfoundation.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, rafael@kernel.org, dakr@kernel.org, bartosz.golaszewski@linaro.org, cw00.choi@samsung.com, myungjoo.ham@samsung.com, yesanishhere@gmail.com, Jonathan.Cameron@huawei.com, quic_zijuhu@quicinc.com, aleksander.lobakin@intel.com, ira.weiny@intel.com, andriy.shevchenko@linux.intel.com, leon@kernel.org, lukas@wunner.de, bhelgaas@google.com, wagi@kernel.org, djeffery@redhat.com, stuart.w.hayes@gmail.com, ptyadav@amazon.de, lennart@poettering.net, brauner@kernel.org, linux-api@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v1 13/32] liveupdate: luo_subsystems: implement subsystem callbacks Date: Wed, 25 Jun 2025 23:18:00 +0000 Message-ID: <20250625231838.1897085-14-pasha.tatashin@soleen.com> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog In-Reply-To: <20250625231838.1897085-1-pasha.tatashin@soleen.com> References: <20250625231838.1897085-1-pasha.tatashin@soleen.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: i5ygw4bamm886o4jqr7tipijbhjwm6gm X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 7F9394000B X-Rspam-User: X-HE-Tag: 1750893546-436709 X-HE-Meta: U2FsdGVkX19pN4wx1gSes1gqUKzq5vIVSMeZj4M6E4U4KBhmJAWWhr2nY0uSVe/ABtd9ktF5/cnus+4CYAbbF6fdJFjyRLpsmO8A/ZlfFVet1LoVAIPzKoDV6n5A4eGFKaLdAo91Q5osbCpy1vIV4E5HfC/h7HFKyhvUMJ5ODGwBxwvzlgQezVQ32KlQcjTAIUW76Kaa4Z/ZUd0Atl3/BR944voNKC49S/10/u2zyWigIKqNFMtS/O8gBdFnq770JUXsRx+z/BLz1RD+o0utDvjC4GmlfhR3wRAu38lDayA3XyBOvhM1aCYWTAwJBlDbAf23PEwT4IIznA9hjf0ulTx8bAKDshpsIfFbIYa6l+AGz3GBax27LYLr+PhAUkFNKaBYDow3iIa/u5VjZzOCotdZBDIm8J/GJQ823ibfPO8sfhWdeXgJTOf1WTZaXk5vfADlamfmsQM6cCRAjaE6fbadms4oq95M5kbyX4dcgeTKf4jw4o7E9FPiPmdEckNiKLxqTrl+RAdJ4xJWzxjcnUEQAPEDLUzqFdY1JZQ2GEQTusGYIgzadNBbYtnUE8UpmSpTpNDLaU59fTNycEt0K52BL8bQlFx7F4wm6eZPuABUE9hx58gGBJuKdNxgrgg+r2qqdEW9+5iFaHqIBhnvaWVd83KsdGKrlMWcK63Kg/DVdbVtqKNUgebarXGlDRVX9+3KfKgrtwcXA9ySm/9r2Abfa4MOO4wrdx2hPANDPqQxZp2EIbv9k6BiVDfi9CbmFCFL3GFoAp2QFC9fFuPJaGUkQrOkv04Cg5/25XYYlGTkR8LJBE20S5+/ufLP1ZONkSFBflnz8NWivsx/NM8hnI47dSI8FZvgxm61walS0RDx39nIfJBag+Owro15rcO48gfxxmbIUD5lBazqYQMA/2FvUPZwplo+mCudVTB2n5BZCMhY0GdlFORvRk2RBd6TMnv8SynlJ1cmUR57sFt nr8HWSuc rAmLbf4PbAZkI6TvWkc+3GZVEPWDax6GSdCzizVlQF++WvJgS2hjNLX5InjU8K56cO77oTF2JJtGTqmYbgv3OKyF9n/oVKKXeGfnaf7CQ92kXiEndnEiEer+/3I7lZpNj8vsrVCQ38sYUjWyse17k21OjdR9rzSRZ6JfmG9PLCi9n0ZMzOppnYhQYy4lYXHj0EDt3EOnBtTAFf1ePax5vyv0xZYlqynnNtKuGlrnarFbsCwp7ORG7POTAX0hT6ZDRGxlRSnmI+z7GMgbRopn76D1OBC0m3ekEkQ+CIBqC8y6dOk8ExyQamayT+kMvOVtfyrPLWbStsutVwPGZoMwQUPgbXZ8fTHjDMd2RYQnBVY7W+4q0gwMZOjBWjP10KMxSoQ4d0+1W3vlqaq2Pj2KVmZSxnBJ24ab9tTZfmgLS0Vb7GsX4UF7ARCGcof2hdxqlbcsAjabs8r/PXAC3E+OWxlLTN9rWKifPGUr5jgPLygv80ifmP1wv/blaDWBT/8yTjQvuFTfW2z+IH0HKsB/n5nfBZGrktyRQxHq0DE6xHypkOcQ= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Implement the core logic within luo_subsystems.c to handle the invocation of registered subsystem callbacks and manage the persistence of their state via the LUO FDT. This replaces the stub implementations from the previous patch. This completes the core mechanism enabling subsystems to actively participate in the LUO state machine, execute phase-specific logic, and persist/restore a u64 state across the live update transition using the FDT. Signed-off-by: Pasha Tatashin --- kernel/liveupdate/luo_subsystems.c | 140 ++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 2 deletions(-) diff --git a/kernel/liveupdate/luo_subsystems.c b/kernel/liveupdate/luo_subsystems.c index 436929a17de0..0e0070d01584 100644 --- a/kernel/liveupdate/luo_subsystems.c +++ b/kernel/liveupdate/luo_subsystems.c @@ -99,6 +99,66 @@ void __init luo_subsystems_startup(void *fdt) luo_fdt_in = fdt; } +static void __luo_do_subsystems_cancel_calls(struct liveupdate_subsystem *boundary_subsystem) +{ + struct liveupdate_subsystem *subsystem; + + list_for_each_entry(subsystem, &luo_subsystems_list, list) { + if (subsystem == boundary_subsystem) + break; + + if (subsystem->ops->cancel) { + subsystem->ops->cancel(subsystem->arg, + subsystem->private_data); + } + subsystem->private_data = 0; + } +} + +static void luo_subsystems_retrieve_data_from_fdt(void) +{ + struct liveupdate_subsystem *subsystem; + int node_offset, prop_len; + const void *prop; + + if (!luo_fdt_in) + return; + + node_offset = fdt_subnode_offset(luo_fdt_in, 0, + LUO_SUBSYSTEMS_NODE_NAME); + list_for_each_entry(subsystem, &luo_subsystems_list, list) { + prop = fdt_getprop(luo_fdt_in, node_offset, + subsystem->name, &prop_len); + + if (!prop || prop_len != sizeof(u64)) { + panic("In FDT node '/%s' can't find property '%s': %s\n", + LUO_SUBSYSTEMS_NODE_NAME, subsystem->name, + fdt_strerror(node_offset)); + } + memcpy(&subsystem->private_data, prop, sizeof(u64)); + } +} + +static int luo_subsystems_commit_data_to_fdt(void) +{ + struct liveupdate_subsystem *subsystem; + int ret, node_offset; + + node_offset = fdt_subnode_offset(luo_fdt_out, 0, + LUO_SUBSYSTEMS_NODE_NAME); + list_for_each_entry(subsystem, &luo_subsystems_list, list) { + ret = fdt_setprop(luo_fdt_out, node_offset, subsystem->name, + &subsystem->private_data, sizeof(u64)); + if (ret < 0) { + pr_err("Failed to set FDT property for subsystem '%s' %s\n", + subsystem->name, fdt_strerror(ret)); + return -ENOENT; + } + } + + return 0; +} + /** * luo_do_subsystems_prepare_calls - Calls prepare callbacks and updates FDT * if all prepares succeed. Handles cancellation on failure. @@ -114,7 +174,29 @@ void __init luo_subsystems_startup(void *fdt) */ int luo_do_subsystems_prepare_calls(void) { - return 0; + struct liveupdate_subsystem *subsystem; + int ret; + + list_for_each_entry(subsystem, &luo_subsystems_list, list) { + if (!subsystem->ops->prepare) + continue; + + ret = subsystem->ops->prepare(subsystem->arg, + &subsystem->private_data); + if (ret < 0) { + pr_err("Subsystem '%s' prepare callback failed [%d]\n", + subsystem->name, ret); + __luo_do_subsystems_cancel_calls(subsystem); + + return ret; + } + } + + ret = luo_subsystems_commit_data_to_fdt(); + if (ret) + __luo_do_subsystems_cancel_calls(NULL); + + return ret; } /** @@ -132,7 +214,29 @@ int luo_do_subsystems_prepare_calls(void) */ int luo_do_subsystems_freeze_calls(void) { - return 0; + struct liveupdate_subsystem *subsystem; + int ret; + + list_for_each_entry(subsystem, &luo_subsystems_list, list) { + if (!subsystem->ops->freeze) + continue; + + ret = subsystem->ops->freeze(subsystem->arg, + &subsystem->private_data); + if (ret < 0) { + pr_err("Subsystem '%s' freeze callback failed [%d]\n", + subsystem->name, ret); + __luo_do_subsystems_cancel_calls(subsystem); + + return ret; + } + } + + ret = luo_subsystems_commit_data_to_fdt(); + if (ret) + __luo_do_subsystems_cancel_calls(NULL); + + return ret; } /** @@ -143,6 +247,17 @@ int luo_do_subsystems_freeze_calls(void) */ void luo_do_subsystems_finish_calls(void) { + struct liveupdate_subsystem *subsystem; + + luo_subsystems_retrieve_data_from_fdt(); + + list_for_each_entry(subsystem, &luo_subsystems_list, list) { + if (subsystem->ops->finish) { + subsystem->ops->finish(subsystem->arg, + subsystem->private_data); + } + subsystem->private_data = 0; + } } /** @@ -156,6 +271,8 @@ void luo_do_subsystems_finish_calls(void) */ void luo_do_subsystems_cancel_calls(void) { + __luo_do_subsystems_cancel_calls(NULL); + luo_subsystems_commit_data_to_fdt(); } /** @@ -279,6 +396,25 @@ EXPORT_SYMBOL_GPL(liveupdate_unregister_subsystem); */ int liveupdate_get_subsystem_data(struct liveupdate_subsystem *h, u64 *data) { + int node_offset, prop_len; + const void *prop; + + luo_state_read_enter(); + if (WARN_ON_ONCE(!luo_fdt_in || !liveupdate_state_updated())) { + luo_state_read_exit(); + return -ENOENT; + } + + node_offset = fdt_subnode_offset(luo_fdt_in, 0, + LUO_SUBSYSTEMS_NODE_NAME); + prop = fdt_getprop(luo_fdt_in, node_offset, h->name, &prop_len); + if (!prop || prop_len != sizeof(u64)) { + luo_state_read_exit(); + return -ENOENT; + } + memcpy(data, prop, sizeof(u64)); + luo_state_read_exit(); + return 0; } EXPORT_SYMBOL_GPL(liveupdate_get_subsystem_data); -- 2.50.0.727.gbf7dc18ff4-goog