From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-qt1-f170.google.com (mail-qt1-f170.google.com [209.85.160.170]) (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 AEE6937CD46 for ; Thu, 21 May 2026 23:46:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.170 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779407193; cv=none; b=GruLrntJ+xQs5UauEV0tfFupRigAo6iebh647TKg5R6xWk8JrlJevYOda6EgozJwKgvOQUcl6EuRhI6cI+NvyQIBsZEwwTejnUsgIf28rvK1ktOqmEXvhhLteD97vYHc8feat6Ilp5okhX9bJ0LsdmVTW0m6KRRSKwa6b75iEmY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779407193; c=relaxed/simple; bh=tP7nDRqYKOsLxLwd7x1ieYmu7t53PVbguJDrX7952M4=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=rmKCiEPYXLAdYh2z+E5PUxg0ixol9UpVcGpHCc9UjvBW+qUgvEN5qimn7podZa/GmYXygIF6RhJRQoEEJ2LX5KoUG4Ul4/9Fdhxn9VcDVL23hMAQ8WfWReOhdTSK8T1DDfFGBq/cdGraez5tq6kLnSWUDRgoclcZCetXh7wKI7M= 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=Qmn/easi; arc=none smtp.client-ip=209.85.160.170 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="Qmn/easi" Received: by mail-qt1-f170.google.com with SMTP id d75a77b69052e-5165195c8b0so74835911cf.0 for ; Thu, 21 May 2026 16:46:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=soleen.com; s=google; t=1779407185; x=1780011985; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=ALlc+rSkkMdtbljNag13qxzB8Q5Vali1I2lgtUdeRqk=; b=Qmn/easiuwhw/gr/tRcf72nPHecwAHusN9DjsW9YiHAk2OYfxpDw7EHqFgzlrlQG3/ n8UjAmlYnRiN/a39Bw+x9F8S3/DvHPoFK6rz6DHb3CU5C+RfqWR0KojGW8AX/2rTQMXR GtEebXK0ol0DCPbr279vaNKkyYu5MV4LnG/MBShEFEVJmIHjAeZJLFKCo4mH+UAsm0dI hSDSXV/+WUK9GEzj11frUXwhzy44Q2eG6SQoPr2Qu6Cv6kkmCBefFx415v9SD7OEGGzx Y/hzrusSgCO1/V1Lo0tGclk4RNPHMKGx9TZq5UYa7R8CYmXpRwpzWsbGtMrfmMdHL7E/ V1IQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779407185; x=1780011985; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ALlc+rSkkMdtbljNag13qxzB8Q5Vali1I2lgtUdeRqk=; b=psq8sRU5pNM26HTkCCCK8+pLcqK7SZghR34q1iySvwANHr1O8fXAxFGUPqlexl0CCy cQDZ8F8GqH5Arnnhszb9qm45H3I44PBE76DkJhoTjLvgYIVFlC64CdTnp7yjQW8KOltl 2jntXOmjqODiuOaHDrvV8ne4WyuQdzmk9XjwY6KzcvOYOD0xGfnmmZPVlTGf1tqjaOtm BBX6k5bQD+8lSp8zGqd/GDktaXoKB9+E2tuejI9eZiTSQ+I9AGcB2NMaf+ufRSORu302 SBq38mnGwlvWHljRKh2LWXS3M0032rmS0uun2Sor8fkFmW45L/a/gbpZVHEw4sMRt4Rm oZQg== X-Forwarded-Encrypted: i=1; AFNElJ+sz22Z1BVrvUzbFvupT6X+OXcixmkvux1bI+3/7T3oCDPd3ThbTeePPfM+qo6Lhmngq9SP0CoUmwxSTl0=@vger.kernel.org X-Gm-Message-State: AOJu0YxRW9gNYUIvlT4PCfdAQsYc4tQd+psAWivq+i6OL1u7w+dR5SPI 6gnKkc3oMKT/7fCXB5NNxoD7qQVrez9nPo2QpNL9zrvjjw5ERap4eklyCId+PV2NaB0= X-Gm-Gg: Acq92OFJCUcE8Hw+6Yry5paCvfzZxTHsJ+bwKI5sMaCOyErvRp1WblxYzvIfupw9jLo vMdDsaSJh5gEdc501hU5sCZCT+0KVrdSSdBKJ9jq0F/37owxZNEdOOTCxyVpOyTIW8nsrN45MXS EjOUI6R7Yf/bt85l0hhPih4Ih23cq/3n06AkgvqQfUf+5b3ibZOVpbjI8moV4CBYEVsOyigG4dd eHyoYQzkZXbdS6zYv6PO6W2YTVXW7UjbUtb+ea3/7UdjN3s42OCgNJjvHB9f5jO5XzibPVwsGEU o6BxSW/Odp/hbJT2so8hwqG3zrCTUwXM9UrwDiiss35vk5tyIz8MNtzdACsASHo1cKZXfV0lFMe Y7JhoHufBjO3EmRkg5ekXueseVbLgBAq11Jq8xthG4QIxHjRBVCP5OKE6enL5KePcKV+BMa4z7k /DsAYrHLDaggktjhyQ/tDOybe13a5fwSDukygHmHzwV8jk5xyS2Q1KF2Z+J4rg0w== X-Received: by 2002:ac8:5749:0:b0:516:d191:f006 with SMTP id d75a77b69052e-516d45c9215mr21944911cf.42.1779407184872; Thu, 21 May 2026 16:46:24 -0700 (PDT) Received: from plex ([71.181.43.54]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-516d6438635sm4789871cf.17.2026.05.21.16.46.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 May 2026 16:46:24 -0700 (PDT) Date: Thu, 21 May 2026 23:46:23 +0000 From: Pasha Tatashin To: Pratyush Yadav Cc: Mike Rapoport , Pasha Tatashin , Alexander Graf , Muchun Song , Oscar Salvador , David Hildenbrand , Andrew Morton , Jason Miu , kexec@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 07/12] kho: allow destroying KHO radix tree Message-ID: References: <20260429133928.850721-1-pratyush@kernel.org> <20260429133928.850721-8-pratyush@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20260429133928.850721-8-pratyush@kernel.org> On 04-29 15:39, Pratyush Yadav wrote: > From: "Pratyush Yadav (Google)" > > Add kho_radix_destroy_tree() which allows destroying the radix tree and > freeing all its pages. > > Signed-off-by: Pratyush Yadav (Google) > --- > include/linux/kho_radix_tree.h | 3 +++ > kernel/liveupdate/kexec_handover.c | 34 ++++++++++++++++++++++++++++++ > 2 files changed, 37 insertions(+) Generally, in Linux, recursion is avoided due to statically sized kernel stacks. However, here we are bound by a relatively shallow KHO tree, and kho_radix_walk_tree() is already recursive, so I think it is alright. We just need to be mindful of local variable usage (frame sizes) within these recursive functions. Reviewed-by: Pasha Tatashin > > diff --git a/include/linux/kho_radix_tree.h b/include/linux/kho_radix_tree.h > index 6c0f7d82716b..617395a6647a 100644 > --- a/include/linux/kho_radix_tree.h > +++ b/include/linux/kho_radix_tree.h > @@ -54,6 +54,7 @@ int kho_radix_add_key(struct kho_radix_tree *tree, unsigned long key); > void kho_radix_del_key(struct kho_radix_tree *tree, unsigned long key); > int kho_radix_walk_tree(struct kho_radix_tree *tree, > const struct kho_radix_walk_cb *cb, void *data); > +void kho_radix_destroy_tree(struct kho_radix_tree *tree); > > #else /* #ifdef CONFIG_KEXEC_HANDOVER */ > > @@ -71,6 +72,8 @@ static inline int kho_radix_walk_tree(struct kho_radix_tree *tree, > return -EOPNOTSUPP; > } > > +static inline void kho_radix_destroy_tree(struct kho_radix_tree *tree) { } > + > #endif /* #ifdef CONFIG_KEXEC_HANDOVER */ > > #endif /* _LINUX_KHO_RADIX_TREE_H */ > diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c > index 47f7c4a2865e..29479534f65d 100644 > --- a/kernel/liveupdate/kexec_handover.c > +++ b/kernel/liveupdate/kexec_handover.c > @@ -286,6 +286,40 @@ void kho_radix_del_key(struct kho_radix_tree *tree, unsigned long key) > } > EXPORT_SYMBOL_GPL(kho_radix_del_key); > > +static void __kho_radix_destroy_tree(struct kho_radix_node *root, > + unsigned int level) > +{ > + unsigned long i; > + > + if (level == 0) { > + kho_radix_free_node(root); > + return; > + } > + > + for (i = 0; i < PAGE_SIZE / sizeof(phys_addr_t); i++) { > + if (root->table[i]) > + __kho_radix_destroy_tree(phys_to_virt(root->table[i]), > + level - 1); > + } > + > + kho_radix_free_node(root); > +} > + > +/** > + * kho_radix_destroy_tree - Destroy the radix tree > + * @tree: The radix tree to destroy > + * > + * Walk @tree and free all its nodes. > + */ > +void kho_radix_destroy_tree(struct kho_radix_tree *tree) > +{ > + if (!tree->root) > + return; > + > + __kho_radix_destroy_tree(tree->root, KHO_TREE_MAX_DEPTH - 1); > +} > +EXPORT_SYMBOL_GPL(kho_radix_destroy_tree); > + > static int kho_radix_walk_leaf(struct kho_radix_leaf *leaf, unsigned long key, > const struct kho_radix_walk_cb *cb, void *data) > { > -- > 2.54.0.545.g6539524ca2-goog >