From nobody Fri Dec 19 08:38:56 2025 Received: from mail-vk1-f181.google.com (mail-vk1-f181.google.com [209.85.221.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9166F7464 for ; Tue, 7 Oct 2025 03:31:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759807870; cv=none; b=iTLO1U2nkfL9hF0m2ypZwMu13Jb6dHIAM+2mZJ1M4nlCf8wLNCROqGd4h7mUIJWgtm7kxmZ8Tuw2oSWXlfXXPTdO9eF5Q+Sv6G4vvwoJJW8fUh90BFOqHG5aj/ZfA5avg36PPGIMxKv6nVehsXwl1tIkrs/bBQEfeRt5Z5gtb3c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759807870; c=relaxed/simple; bh=/fll/of95rQWwNDdp7em7nO/Y9F6lxz5T9wJPKWVKi0=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KDIOHRrOTOKx81dFpB87kyBqh7rT7oVtu7zhueFbPZc+RotubCC6meJPN6O78odG0QNC5lmQEcnAMy/swerTesR4osRVN4ipjdDKkCBiN0CskInvaWILJjUCUMi/BRw0oPEKFaFTDfaiXNT7f/4py967HnW0vkwneSTMC6L2r94= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=soleen.com; spf=pass smtp.mailfrom=soleen.com; dkim=pass (2048-bit key) header.d=soleen.com header.i=@soleen.com header.b=fK9CsyzM; arc=none smtp.client-ip=209.85.221.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=soleen.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=soleen.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=soleen.com header.i=@soleen.com header.b="fK9CsyzM" Received: by mail-vk1-f181.google.com with SMTP id 71dfb90a1353d-54bbf3329c1so5327881e0c.1 for ; Mon, 06 Oct 2025 20:31:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=soleen.com; s=google; t=1759807867; x=1760412667; darn=vger.kernel.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=pb2j8N8Az+uWt45nNFfEUmcYJA7/O93dKo/dsaUrS7Y=; b=fK9CsyzM/WiXFRmOL9nd20G0NhzsxKur5anC5bQTbNxTeWydxWXaRIBajBezvKsPmm PFQm5Nz97r/BTXWpLt+1S8OQ4NH7112W30C4pqVXBJxG+59/HAkHkgy8fDBby6go7HrE NclW6CKwV7N27GB+o44uh1TUF87Ut2yaynL9TC1LC59rJWeQ2pM1pg4MVCkYHXhziEcn klwR3Udv8t/A3wglxYZaTQuFyDhMubPZqjX0U/LOnuZpdvpSBvIagJP8qFR/w5yibZNi 9f8zwtKstG5CUj9j3B2Kgw6m2nwETkY6mHlnpaTOQBKgJ9PU1hrN6qUIC6bJUdPyVW9r G22Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759807867; x=1760412667; 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=pb2j8N8Az+uWt45nNFfEUmcYJA7/O93dKo/dsaUrS7Y=; b=xHO7mv4cRNaDP2PpBhxP6SCZK544fZU6WCH8/zNzKNjZ+tvrEe+iVCztNDsITqRzP5 5gtyesl1Haf5ef40e248ugH2ck4pg0lt5iiZiNNNb6YNSsC4GpEXyJJ5ITTciTQfvi+z I2yBsZmzENkJNxrIsSLIRFRpGnVRH2W4GhV+915O240j13oXUfsBqq8+SZE3kTKM/sPJ povf39vIabYxa8qkiUv30wUNQu6C+TlVWTa7WA5ZLzEuSi9pjisv0HQyk4hHvwIcEoQ8 fsl7ZfzxR+0xs5Et04xZX/E770DEmtSCGgBmVxWE9B003Wq9j2dJOfszMz/8vSrajHTt TvHA== X-Forwarded-Encrypted: i=1; AJvYcCUmFG0ZkidrFMNIuU6ECjIm8wyP4I7sOJcQ2dZgZiVqcHjisuOfMRjiS4WcIl/8jleqBnYR9NHG5n0sgHw=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9dkcj5Sy/IOeTrEqZi3e6OeRTuPeLnSkJwiIj67YQcpwPekNM zSpgczp/BSavCK+nPoWK/DexHZEtvT9rDv0DD5JoRkeiaenesZ0xAP6Hbrv6nLAtTdg= X-Gm-Gg: ASbGncuUZNb6So61nMM6zRgFzluwjYbreHNHzeKnbFTFU5NH2ZuUuZe9pqib4drcMY6 cdUfJe6+6+yBQo8AkCuBMRiGRMGjuhFHNSk9sMIhU/5jQUsNLvARCYxSsNSDq8YnOhVKSLW/qdz BilaCvDW7Sz7sEpIZuvVtnu8G4EEwd0G4eC7eW0AUrqD4crACyZo+Ibl/w8HJzAgSxO4Ewvkxe1 Y6X2GzyMCn9HcdjYMzFxoQmUG792FC/k63o1EzFU2P94HxIQpoUBvjjchCa/78FZVqJF25HzLOO NWeUkYVxShLeGWcNE+Q6xq427V6H7zVqiR7Kd6vlV+ZNPx/Bs+bpETPotkfLdZTfNJzmqA6k6UL sdah+l5l8FTLKoeM2rpvfjzp2sxbpMUVerUm7BKRl5ip9aHEQefGr1SR6NSWA0/Yr1LgWS6yXYy zTtZmuBUnAv8vL8XjXXxzo0HjaKY0D660= X-Google-Smtp-Source: AGHT+IHKWYvZiwypYwTwT1zKSJgyEU7e/SRkQV11sdxCZs7Hd6H9BMFs3IwoGAGyQxuhUHEh8cuY/A== X-Received: by 2002:a05:6122:8cd:b0:552:3366:e822 with SMTP id 71dfb90a1353d-554a8d1b310mr1055414e0c.1.1759807867441; Mon, 06 Oct 2025 20:31:07 -0700 (PDT) Received: from soleen.c.googlers.com.com (53.47.86.34.bc.googleusercontent.com. [34.86.47.53]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-552ea335f07sm2446030e0c.15.2025.10.06.20.31.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Oct 2025 20:31:06 -0700 (PDT) From: Pasha Tatashin To: akpm@linux-foundation.org, brauner@kernel.org, corbet@lwn.net, graf@amazon.com, jgg@ziepe.ca, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, masahiroy@kernel.org, ojeda@kernel.org, pasha.tatashin@soleen.com, pratyush@kernel.org, rdunlap@infradead.org, rppt@kernel.org, tj@kernel.org Subject: [PATCH v5 1/7] kho: allow to drive kho from within kernel Date: Tue, 7 Oct 2025 03:30:54 +0000 Message-ID: <20251007033100.836886-2-pasha.tatashin@soleen.com> X-Mailer: git-send-email 2.51.0.618.g983fd99d29-goog In-Reply-To: <20251007033100.836886-1-pasha.tatashin@soleen.com> References: <20251007033100.836886-1-pasha.tatashin@soleen.com> 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" Allow to do finalize and abort from kernel modules, so LUO could drive the KHO sequence via its own state machine. Signed-off-by: Pasha Tatashin Reviewed-by: Pratyush Yadav --- include/linux/kexec_handover.h | 15 +++++++ kernel/kexec_handover.c | 74 ++++++++++++++++++++-------------- 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/include/linux/kexec_handover.h b/include/linux/kexec_handover.h index 25042c1d8d54..04d0108db98e 100644 --- a/include/linux/kexec_handover.h +++ b/include/linux/kexec_handover.h @@ -67,6 +67,10 @@ void kho_memory_init(void); =20 void kho_populate(phys_addr_t fdt_phys, u64 fdt_len, phys_addr_t scratch_p= hys, u64 scratch_len); + +int kho_finalize(void); +int kho_abort(void); + #else static inline bool kho_is_enabled(void) { @@ -139,6 +143,17 @@ static inline void kho_populate(phys_addr_t fdt_phys, = u64 fdt_len, phys_addr_t scratch_phys, u64 scratch_len) { } + +static inline int kho_finalize(void) +{ + return -EOPNOTSUPP; +} + +static inline int kho_abort(void) +{ + return -EOPNOTSUPP; +} + #endif /* CONFIG_KEXEC_HANDOVER */ =20 #endif /* LINUX_KEXEC_HANDOVER_H */ diff --git a/kernel/kexec_handover.c b/kernel/kexec_handover.c index 76f0940fb485..76c34ea923f0 100644 --- a/kernel/kexec_handover.c +++ b/kernel/kexec_handover.c @@ -1067,7 +1067,7 @@ static int kho_out_update_debugfs_fdt(void) return err; } =20 -static int kho_abort(void) +static int __kho_abort(void) { int err; unsigned long order; @@ -1100,7 +1100,27 @@ static int kho_abort(void) return err; } =20 -static int kho_finalize(void) +int kho_abort(void) +{ + int ret =3D 0; + + if (!kho_enable) + return -EOPNOTSUPP; + + guard(mutex)(&kho_out.lock); + if (!kho_out.finalized) + return -ENOENT; + + ret =3D __kho_abort(); + if (ret) + return ret; + + kho_out.finalized =3D false; + + return kho_out_update_debugfs_fdt(); +} + +static int __kho_finalize(void) { int err =3D 0; u64 *preserved_mem_map; @@ -1143,12 +1163,32 @@ static int kho_finalize(void) abort: if (err) { pr_err("Failed to convert KHO state tree: %d\n", err); - kho_abort(); + __kho_abort(); } =20 return err; } =20 +int kho_finalize(void) +{ + int ret; + + if (!kho_enable) + return -EOPNOTSUPP; + + guard(mutex)(&kho_out.lock); + if (kho_out.finalized) + return -EEXIST; + + ret =3D __kho_finalize(); + if (ret) + return ret; + + kho_out.finalized =3D true; + + return kho_out_update_debugfs_fdt(); +} + static int kho_out_finalize_get(void *data, u64 *val) { mutex_lock(&kho_out.lock); @@ -1160,33 +1200,7 @@ static int kho_out_finalize_get(void *data, u64 *val) =20 static int kho_out_finalize_set(void *data, u64 _val) { - int ret =3D 0; - bool val =3D !!_val; - - mutex_lock(&kho_out.lock); - - if (val =3D=3D kho_out.finalized) { - if (kho_out.finalized) - ret =3D -EEXIST; - else - ret =3D -ENOENT; - goto unlock; - } - - if (val) - ret =3D kho_finalize(); - else - ret =3D kho_abort(); - - if (ret) - goto unlock; - - kho_out.finalized =3D val; - ret =3D kho_out_update_debugfs_fdt(); - -unlock: - mutex_unlock(&kho_out.lock); - return ret; + return (!!_val) ? kho_finalize() : kho_abort(); } =20 DEFINE_DEBUGFS_ATTRIBUTE(fops_kho_out_finalize, kho_out_finalize_get, --=20 2.51.0.618.g983fd99d29-goog