From patchwork Mon Mar 10 12:03:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Ryabinin X-Patchwork-Id: 14009706 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 BF7CFC28B2E for ; Mon, 10 Mar 2025 12:04:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3629C280006; Mon, 10 Mar 2025 08:04:10 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2F050280001; Mon, 10 Mar 2025 08:04:10 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 16679280006; Mon, 10 Mar 2025 08:04:10 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id ECD8F280001 for ; Mon, 10 Mar 2025 08:04:09 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id A2275140411 for ; Mon, 10 Mar 2025 12:04:11 +0000 (UTC) X-FDA: 83205508302.28.3C48078 Received: from forwardcorp1a.mail.yandex.net (forwardcorp1a.mail.yandex.net [178.154.239.72]) by imf19.hostedemail.com (Postfix) with ESMTP id B54071A0009 for ; Mon, 10 Mar 2025 12:04:09 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=yandex-team.com header.s=default header.b="Zt+/vVXD"; dmarc=pass (policy=none) header.from=yandex-team.com; spf=pass (imf19.hostedemail.com: domain of arbn@yandex-team.com designates 178.154.239.72 as permitted sender) smtp.mailfrom=arbn@yandex-team.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741608250; a=rsa-sha256; cv=none; b=yZ2bHlrMrqNHd97GOyxrhj9SED1I7TOJeqadL7WZEj4k63ZnEtF+fgYwtitrhrjlGASjC0 rQ1zPmYyEC8qr1nn+4G1vuiZNYOvcgylwKIvfGKXBpGk6JvTzzteAeeaIFMdBGX8FUpo2g OBUJ61YPzGNDSAvnGMdmaXNdLFbCaqw= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=pass header.d=yandex-team.com header.s=default header.b="Zt+/vVXD"; dmarc=pass (policy=none) header.from=yandex-team.com; spf=pass (imf19.hostedemail.com: domain of arbn@yandex-team.com designates 178.154.239.72 as permitted sender) smtp.mailfrom=arbn@yandex-team.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741608250; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=dCfHmi7JSqwfRn9hK0doUgOfig37g7tF5ZyIee0j3QQ=; b=XK3jXFUAytgpN3Fv8k/kHGQOC2B+CK9x7vScDo3rGPbZv+3J/yEHySUO3tR/1xzTkmGhpa PvShfva9SxbyunnhGsJaD44CXeUjdtoDWY4M+gJwCZYtNAiwJouQA4AgxJDJvbk3D8zXiE 5JZw3GFCzWrwUrsFLSU2dxaQzTwXHDM= Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c1f:600c:0:640:a431:0]) by forwardcorp1a.mail.yandex.net (Yandex) with ESMTPS id 5958960DCE; Mon, 10 Mar 2025 15:04:08 +0300 (MSK) Received: from dellarbn.yandex.net (unknown [10.214.35.248]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id s3o0lL2FT0U0-61iTaEl4; Mon, 10 Mar 2025 15:04:07 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.com; s=default; t=1741608247; bh=dCfHmi7JSqwfRn9hK0doUgOfig37g7tF5ZyIee0j3QQ=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=Zt+/vVXDKpSCu8KDQZJ8u8uEpxL5R4fTTyn3U+HF42BdMdqDXozWrf/zuiX14bZkH oTU0E2qHEUTnKlbABGK7W3Ny4IiGns9mKIZhLDvhYoLMNrAZ/l3Mgu8cIFmpSlrxFX CW2cOcIjkxXIsVbLsjrUPNEkV+dqhsmZyuQeWDOQ= From: Andrey Ryabinin To: linux-kernel@vger.kernel.org Cc: Alexander Graf , James Gowans , Mike Rapoport , Andrew Morton , linux-mm@kvack.org, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H . Peter Anvin" , Eric Biederman , kexec@lists.infradead.org, Pratyush Yadav , Jason Gunthorpe , Pasha Tatashin , David Rientjes , Andrey Ryabinin Subject: [PATCH v2 3/7] kexec: exclude control pages from the destination addresses Date: Mon, 10 Mar 2025 13:03:14 +0100 Message-ID: <20250310120318.2124-4-arbn@yandex-team.com> X-Mailer: git-send-email 2.45.3 In-Reply-To: <20250310120318.2124-1-arbn@yandex-team.com> References: <20250310120318.2124-1-arbn@yandex-team.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: B54071A0009 X-Rspamd-Server: rspam11 X-Stat-Signature: psck33okw99abzea93dw55zouq5ebqew X-Rspam-User: X-HE-Tag: 1741608249-715414 X-HE-Meta: U2FsdGVkX18H64H+TGEMODIEFR+Vggd05YtMDR0da6FjhqmW0CH7sbTFr+09/L7J3n20bJOy2TGmnCtVXz5rAVOoyzSW/9qvU44VgsQ6aeC203nhTlH5I7ufMm9q5J2HbgX3Kb9XY9ganfSM2PSi61FiR4cY1JIOFuFe9IYwqk8OTbGErvw6WujIQyazKMt1gelFPmf7G3zdR3ff2KCpcvl/sIUzJG7W0IA6t5FF0+XzyZ6v340Ja0AElijkgGafFE4E/bBFmoLSEPqamLchSf7DJ/L4NIhvQuc9dYVoVIf5qI6IiRjEk3BiejrQWV3NxuHVHltJnbD/sObmIe58YtI3WCzi48l3An3Sd4cvVfku/hn9+gk/IPjt8ReRYFIWV89xjeDaO6MAU1wovMcw0zQAwrapY4VgaHFZ1eQQBRv7m3Y2+v39YCYCAz5ik4nUU97uMB0oA7h+NpdIt+dtaz7bMPRrimdk7NQ3+5F4zn9syJucbQGA7cv/yDxqkauFI4OEKiG8cmr6y+rG9phTjZCwHnII2HYJZxmuHqHV8sysioDatEkDEmEGsU+ftwCuyL6hfFddb5ExcsDVJbZsL2epgPe/Hdaz74Rtq0v9mpBcNgFxEBiI0wua128Y0IuK44DR/NW1WUrF+O2LuYnHu2oDV59EupKlTP0hSoZsYvZYn2epFs8TN0BVrotDfNoHKmgXzu2fjyjqIpVuR+7EO4JYEYgUtgyPIufHoDsjk1kxMgQ7WlgHus/ukTLqwvElPoYTn9Na3yOQ/K3mHl2PSF0rOiD1EzaPJph5fVG2NjFKOILNduXvolHdBD2A6dWfxFIfofkmurIkYuD9TTG/hzqIAZChGqt8xI/3WlrzW8vvcmbZKtdHc71THH9+ztsTU0mkAMxXH4D7ObeYbVcMzulBC3CZKi+4vf6Mr0UXtlEYNJrEuJmGiCHpK56gDrd4dj94HBalk3vwiXr2Zyv mikpKx/2 KL9x93KfTzmXXjYfJLsleVs3YMwfbTmDEYnTBeWdCIS1GobK/LVLkNWtgGCnbSBgOZBaH6EA1i/wJ5btRuoO8d7D4ccUpGTycXK7ULI9LrmH8xqITu/W2ifgKlf6XRwyoUh/FIDuw6N3MFQIkzA2Q82QAy1WEWLNP/seRO3QWg8PdmT7Xd3qRs4OaVi8UdCN62xnkJ3iJs0xp+cm2AWYFQ8WspOxl0qVlkhIwYsdg76c6X1qipDWl/KNsYoDlPnombD6X8JsQlra2C/P2t/dbE+KP1avC3P1X6o27E4a4cApUHjX6m5+6psHRa0oytiHiyGRBFRMwXSmpeoV+u79aZteFgvAgezr0EZ17 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: Kexec relies on control pages allocated after all destination ranges have been chosen. To be able to preserve memory across kexec we need to be able to pick destination ranges after the control pages allocated. Add check for control pages to locate_mem_hole() callbacks so it excludes control pages, hence we can allocate them in any order. Signed-off-by: Andrey Ryabinin --- kernel/kexec_core.c | 18 ++++++++++++++++++ kernel/kexec_file.c | 18 ++++-------------- kernel/kexec_internal.h | 3 +++ 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c index c0bdc1686154..647ab5705c37 100644 --- a/kernel/kexec_core.c +++ b/kernel/kexec_core.c @@ -264,6 +264,24 @@ int kimage_is_destination_range(struct kimage *image, return 0; } +int kimage_is_control_page(struct kimage *image, + unsigned long start, + unsigned long end) +{ + + struct page *page; + + list_for_each_entry(page, &image->control_pages, lru) { + unsigned long pstart, pend; + pstart = page_to_boot_pfn(page) << PAGE_SHIFT; + pend = pstart + PAGE_SIZE * (1 << page_private(page)) - 1; + if ((end >= pstart) && (start <= pend)) + return 1; + } + + return 0; +} + static struct page *kimage_alloc_pages(gfp_t gfp_mask, unsigned int order) { struct page *pages; diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index a024ff379133..8ecd34071bfa 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -464,7 +464,8 @@ static int locate_mem_hole_top_down(unsigned long start, unsigned long end, * Make sure this does not conflict with any of existing * segments */ - if (kimage_is_destination_range(image, temp_start, temp_end)) { + if (kimage_is_destination_range(image, temp_start, temp_end) || + kimage_is_control_page(image, temp_start, temp_end)) { temp_start = temp_start - PAGE_SIZE; continue; } @@ -498,7 +499,8 @@ static int locate_mem_hole_bottom_up(unsigned long start, unsigned long end, * Make sure this does not conflict with any of existing * segments */ - if (kimage_is_destination_range(image, temp_start, temp_end)) { + if (kimage_is_destination_range(image, temp_start, temp_end) || + kimage_is_control_page(image, temp_start, temp_end)) { temp_start = temp_start + PAGE_SIZE; continue; } @@ -671,18 +673,6 @@ int kexec_add_buffer(struct kexec_buf *kbuf) if (kbuf->image->nr_segments >= KEXEC_SEGMENT_MAX) return -EINVAL; - /* - * Make sure we are not trying to add buffer after allocating - * control pages. All segments need to be placed first before - * any control pages are allocated. As control page allocation - * logic goes through list of segments to make sure there are - * no destination overlaps. - */ - if (!list_empty(&kbuf->image->control_pages)) { - WARN_ON(1); - return -EINVAL; - } - /* Ensure minimum alignment needed for segments. */ kbuf->memsz = ALIGN(kbuf->memsz, PAGE_SIZE); kbuf->buf_align = max(kbuf->buf_align, PAGE_SIZE); diff --git a/kernel/kexec_internal.h b/kernel/kexec_internal.h index d35d9792402d..12e655a70e25 100644 --- a/kernel/kexec_internal.h +++ b/kernel/kexec_internal.h @@ -14,6 +14,9 @@ int kimage_load_segment(struct kimage *image, struct kexec_segment *segment); void kimage_terminate(struct kimage *image); int kimage_is_destination_range(struct kimage *image, unsigned long start, unsigned long end); +int kimage_is_control_page(struct kimage *image, + unsigned long start, + unsigned long end); /* * Whatever is used to serialize accesses to the kexec_crash_image needs to be