From patchwork Thu Sep 30 14:31:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pasha Tatashin X-Patchwork-Id: 12528497 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 64D6EC433F5 for ; Thu, 30 Sep 2021 14:34:04 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 33E4860FC2 for ; Thu, 30 Sep 2021 14:34:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 33E4860FC2 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=soleen.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Cc:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=igwy2fkadwzASFWCd3+gfrD/W3MsNsdzBqjRbIzwRdY=; b=j5C2rZHc4Z1kqr P8e6hFdSxPQVrYUT9MzYgOKmmPd2lmDHiLTedi2oqdDbl0p13+FBg5c5J+V1QpQbCcJHGHtNFU0AC SjU+oq2yBQ9gFb2JtZ+KjjMQUv6sXaP6AwVNXgMVDM/UAVlGOj7RZLrTjAudJM36A8+HErFMbIe2w R4+9BfagM8V9YSDfdtkPAn4bJGhqf6Xz0xROg26k0unXV8/XI3Ez173zPSXIdexK9jU8SCheymXdu Omj54+nGvv1cjUd2uwQM/vlnV0Ni0CK7+ARJVXZ9+6CgDROoOL8AblnLfBSi5/f2kkLZdyNU/y+zg TNytNTfVzHw9VDOD3OjQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mVx6r-00EhrF-As; Thu, 30 Sep 2021 14:32:30 +0000 Received: from mail-qv1-xf36.google.com ([2607:f8b0:4864:20::f36]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mVx5l-00EhPT-Ex for linux-arm-kernel@lists.infradead.org; Thu, 30 Sep 2021 14:31:24 +0000 Received: by mail-qv1-xf36.google.com with SMTP id v14so2326494qvl.9 for ; Thu, 30 Sep 2021 07:31:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=soleen.com; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=wvhp7Shwzj2V1AcHSUNo3T+jO//upg214s/8JF7+8X4=; b=WzTIvObi8BmW8NTQjOqb0FOv0H/1NPIY+oIISBMpm8fDw4WooAALyuQ8nS0FbKt/SD oG484TyexjpEF9PLSUf6FoVGHUmJa7wCuNbtCA+2gWYOBP7IMxuKsxo2SB2qce1734pU xsEoWg7TnfyCy6fwEslgvv5G4WPjSmJb/ebM1dBbO3PAOPhAMBgXqHNADEKlZZw80hfB UHXFu0nSxEI896qgpyWWYjO5i4k8yAw4Zdf5kcNiCy9l3kfnM4g1YbizWJfXBfT0X1pO i58tA/zr32BfcRs2J3R6EKHkuX/khIa1jSiNc1733FUETlk2PlBrtbTQuqXUQUOrPrxJ 0vIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wvhp7Shwzj2V1AcHSUNo3T+jO//upg214s/8JF7+8X4=; b=HODBZzBIqKU8skthwQFMSwFVPDlpi+X4jBR3BSPFshB/sDyYOE9vizCbbQKAbQMq/v msUMmq3SEE+KQphRUbgJ2Kt1Eqmeg6i7FdckOvzzkwpZXpZCMtTaXHoR8RzFju4Jfu4j 9FwMK7RcLwOeE+FBsDB9idNAA5jQfOfQuUpcckaoRuuGvAQiJR9JfmIbSCjt+CE7Ur8Y MlawnZtiBDGm6kALareCK8GBRKEKPibWzRKYL7+xJLc4Oxh9Jgi3kt0lMSh/2kDoGwXp j3ps1tpjFl36yeXXKpp6GqKZmwZ3k6K9z9k3PruzAnF41EhPqYDfRYkhdo5zhSXF6N8y ccYA== X-Gm-Message-State: AOAM533wYxrecPdAw01cf8TCel7YIS7qKfxmhNBYcPjdQXOLbGfRJCrv yuxmhwkQ+U8R2Np6P6m1mUoOjw== X-Google-Smtp-Source: ABdhPJyRpe+0jXAcRshmB05WHMM4GvLP/u4h4SOYX1etnyUhK8wl9VzQ7qbqdCBBQWvQ1rXkOCyYsA== X-Received: by 2002:a05:6214:90:: with SMTP id n16mr4150225qvr.1.1633012279941; Thu, 30 Sep 2021 07:31:19 -0700 (PDT) Received: from soleen.c.googlers.com.com (189.216.85.34.bc.googleusercontent.com. [34.85.216.189]) by smtp.gmail.com with ESMTPSA id l195sm1528731qke.98.2021.09.30.07.31.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Sep 2021 07:31:19 -0700 (PDT) From: Pasha Tatashin To: pasha.tatashin@soleen.com, sashal@kernel.org, ebiederm@xmission.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, corbet@lwn.net, catalin.marinas@arm.com, will@kernel.org, linux-arm-kernel@lists.infradead.org, maz@kernel.org, james.morse@arm.com, vladimir.murzin@arm.com, matthias.bgg@gmail.com, linux-mm@kvack.org, mark.rutland@arm.com, steve.capper@arm.com, rfontana@redhat.com, tglx@linutronix.de, selindag@gmail.com, kernelfans@gmail.com, akpm@linux-foundation.org Subject: [PATCH v18 04/15] arm64: kexec: flush image and lists during kexec load time Date: Thu, 30 Sep 2021 14:31:02 +0000 Message-Id: <20210930143113.1502553-5-pasha.tatashin@soleen.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog In-Reply-To: <20210930143113.1502553-1-pasha.tatashin@soleen.com> References: <20210930143113.1502553-1-pasha.tatashin@soleen.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210930_073121_529006_0D6C5204 X-CRM114-Status: GOOD ( 16.83 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Currently, during kexec load we are copying relocation function and flushing it. However, we can also flush kexec relocation buffers and if new kernel image is already in place (i.e. crash kernel), we can also flush the new kernel image itself. Signed-off-by: Pasha Tatashin Acked-by: Catalin Marinas --- arch/arm64/kernel/machine_kexec.c | 58 ++++++++++++++----------------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/arch/arm64/kernel/machine_kexec.c b/arch/arm64/kernel/machine_kexec.c index 213d56c14f60..b6d5a02cba2e 100644 --- a/arch/arm64/kernel/machine_kexec.c +++ b/arch/arm64/kernel/machine_kexec.c @@ -60,29 +60,6 @@ void machine_kexec_cleanup(struct kimage *kimage) /* Empty routine needed to avoid build errors. */ } -int machine_kexec_post_load(struct kimage *kimage) -{ - void *reloc_code = page_to_virt(kimage->control_code_page); - - memcpy(reloc_code, arm64_relocate_new_kernel, - arm64_relocate_new_kernel_size); - kimage->arch.kern_reloc = __pa(reloc_code); - kexec_image_info(kimage); - - /* - * For execution with the MMU off, reloc_code needs to be cleaned to the - * PoC and invalidated from the I-cache. - */ - dcache_clean_inval_poc((unsigned long)reloc_code, - (unsigned long)reloc_code + - arm64_relocate_new_kernel_size); - icache_inval_pou((uintptr_t)reloc_code, - (uintptr_t)reloc_code + - arm64_relocate_new_kernel_size); - - return 0; -} - /** * machine_kexec_prepare - Prepare for a kexec reboot. * @@ -163,6 +140,32 @@ static void kexec_segment_flush(const struct kimage *kimage) } } +int machine_kexec_post_load(struct kimage *kimage) +{ + void *reloc_code = page_to_virt(kimage->control_code_page); + + /* If in place flush new kernel image, else flush lists and buffers */ + if (kimage->head & IND_DONE) + kexec_segment_flush(kimage); + else + kexec_list_flush(kimage); + + memcpy(reloc_code, arm64_relocate_new_kernel, + arm64_relocate_new_kernel_size); + kimage->arch.kern_reloc = __pa(reloc_code); + kexec_image_info(kimage); + + /* Flush the reloc_code in preparation for its execution. */ + dcache_clean_inval_poc((unsigned long)reloc_code, + (unsigned long)reloc_code + + arm64_relocate_new_kernel_size); + icache_inval_pou((uintptr_t)reloc_code, + (uintptr_t)reloc_code + + arm64_relocate_new_kernel_size); + + return 0; +} + /** * machine_kexec - Do the kexec reboot. * @@ -180,13 +183,6 @@ void machine_kexec(struct kimage *kimage) WARN(in_kexec_crash && (stuck_cpus || smp_crash_stop_failed()), "Some CPUs may be stale, kdump will be unreliable.\n"); - /* Flush the kimage list and its buffers. */ - kexec_list_flush(kimage); - - /* Flush the new image if already in place. */ - if ((kimage != kexec_crash_image) && (kimage->head & IND_DONE)) - kexec_segment_flush(kimage); - pr_info("Bye!\n"); local_daif_mask(); @@ -261,8 +257,6 @@ void arch_kexec_protect_crashkres(void) { int i; - kexec_segment_flush(kexec_crash_image); - for (i = 0; i < kexec_crash_image->nr_segments; i++) set_memory_valid( __phys_to_virt(kexec_crash_image->segment[i].mem),