Received: by 2002:a25:ca44:0:0:0:0:0 with SMTP id a65csp1050128ybg; Wed, 29 Jul 2020 04:39:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxzIBe4X9j0Olq7FztkUhvrx8T3OgKefBZNT3kDpwg7Y/bXlPUcFnencALtkLS729XykPgx X-Received: by 2002:a17:907:72c6:: with SMTP id du6mr27426522ejc.362.1596022792791; Wed, 29 Jul 2020 04:39:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596022792; cv=none; d=google.com; s=arc-20160816; b=yuUJAdw/3tTZ3Kr/r6dWDXfFKfWmhkU5T50fVBzV5ikGYMYcqpdutsv22Adh5WBdC9 ylqEzOdQcO9JXu4ipZekH8hcqrXx8JGUbELI1PcUpPPTICENNOUiNww+Nyx+1c49j2Aq tpIYlZDKgNBdkYksWDFr/AT5argV0cJlYA8OFS+UFOP8enBdfCBLs3iHvBfSzz2tVw/k KgSVz+4afvnJwu4IZv5ALCYhv0w7MJbbh9MK/H5CB23t52ZqQQfjfOWMHYZF/cBH55es g9nx3oOmRTbhVY1jRB0DUaRM0SBJVxRfyRCHW0WMrlVe+fZwTw2SghLG62TmZ9QVqZ4C dFgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:message-id:date:cc:to:from:subject; bh=AMzy9ZkEztFGa64cHRAoI3aV9flF0dyKShkbtUs6Oww=; b=yPPfCxzenba/hfM8IcgrZQvli0w70iWbM9wivI2Rc/vG/6ZcXegNF+cvNtFcwkkwRE dZxK/syZzVZCKRkZZH+haun35EfkCilHhTn2qshVt1Yg1Pds6QemvHxUrvc0BOBWexBP Sn5ccot/PLm9JzppIaUk6CMkxPVi9lXI+hYv9ElttgsXGeLAN+bx0uuZQWcY43Xt+Jy5 FHQ+ftKBHcSd0OzORw6r0qNMJihlDdDRYJpnzuD4vaAtlMQx2+fgj2D7XAhx6V28dsJT a8QLZelmm9+L5i6q68oA8FVkwAxSkao82hEp+lgp5JPqGH9wKwF1yGFOmrOMWLQwyrmU w8Hw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a9si695082ejd.356.2020.07.29.04.39.30; Wed, 29 Jul 2020 04:39:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726872AbgG2LjK (ORCPT + 99 others); Wed, 29 Jul 2020 07:39:10 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:23990 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726858AbgG2LjJ (ORCPT ); Wed, 29 Jul 2020 07:39:09 -0400 Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 06TBWiuw131703; Wed, 29 Jul 2020 07:38:57 -0400 Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 32jp1mq05d-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 29 Jul 2020 07:38:57 -0400 Received: from m0098399.ppops.net (m0098399.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 06TBXSHI134334; Wed, 29 Jul 2020 07:38:57 -0400 Received: from ppma06fra.de.ibm.com (48.49.7a9f.ip4.static.sl-reverse.com [159.122.73.72]) by mx0a-001b2d01.pphosted.com with ESMTP id 32jp1mq04m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 29 Jul 2020 07:38:56 -0400 Received: from pps.filterd (ppma06fra.de.ibm.com [127.0.0.1]) by ppma06fra.de.ibm.com (8.16.0.42/8.16.0.42) with SMTP id 06TBWup2022392; Wed, 29 Jul 2020 11:38:54 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma06fra.de.ibm.com with ESMTP id 32jgvps2sd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 29 Jul 2020 11:38:54 +0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 06TBco0458458270 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 29 Jul 2020 11:38:50 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B919E4C04A; Wed, 29 Jul 2020 11:38:50 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1017F4C046; Wed, 29 Jul 2020 11:38:47 +0000 (GMT) Received: from [192.168.0.8] (unknown [9.79.217.86]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 29 Jul 2020 11:38:46 +0000 (GMT) Subject: [PATCH v6 00/11] ppc64: enable kdump support for kexec_file_load syscall From: Hari Bathini To: Michael Ellerman Cc: Dave Young , Pingfan Liu , Thiago Jung Bauermann , kernel test robot , Laurent Dufour , Mahesh J Salgaonkar , Sourabh Jain , Vivek Goyal , Dave Young , Petr Tesarik , Pingfan Liu , linuxppc-dev , Kexec-ml , lkml , Pingfan Liu , Eric Biederman , Thiago Jung Bauermann , Mimi Zohar , Nayna Jain , Andrew Morton Date: Wed, 29 Jul 2020 17:08:44 +0530 Message-ID: <159602259854.575379.16910915605574571585.stgit@hbathini> User-Agent: StGit/0.21 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.235,18.0.687 definitions=2020-07-29_04:2020-07-29,2020-07-29 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 clxscore=1015 priorityscore=1501 phishscore=0 mlxlogscore=999 bulkscore=0 impostorscore=0 suspectscore=0 lowpriorityscore=0 mlxscore=0 spamscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2006250000 definitions=main-2007290071 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Sorry! There was a gateway issue on my system while posting v5, due to which some patches did not make it through. Resending... This patch series enables kdump support for kexec_file_load system call (kexec -s -p) on PPC64. The changes are inspired from kexec-tools code but heavily modified for kernel consumption. The first patch adds a weak arch_kexec_locate_mem_hole() function to override locate memory hole logic suiting arch needs. There are some special regions in ppc64 which should be avoided while loading buffer & there are multiple callers to kexec_add_buffer making it complicated to maintain range sanity and using generic lookup at the same time. The second patch marks ppc64 specific code within arch/powerpc/kexec and arch/powerpc/purgatory to make the subsequent code changes easy to understand. The next patch adds helper function to setup different memory ranges needed for loading kdump kernel, booting into it and exporting the crashing kernel's elfcore. The fourth patch overrides arch_kexec_locate_mem_hole() function to locate memory hole for kdump segments by accounting for the special memory regions, referred to as excluded memory ranges, and sets kbuf->mem when a suitable memory region is found. The fifth patch moves walk_drmem_lmbs() out of .init section with a few changes to reuse it for setting up kdump kernel's usable memory ranges. The next patch uses walk_drmem_lmbs() to look up the LMBs and set linux,drconf-usable-memory & linux,usable-memory properties in order to restrict kdump kernel's memory usage. The next patch setups up backup region as a kexec segment while loading kdump kernel and teaches purgatory to copy data from source to destination. Patch 09 builds the elfcore header for the running kernel & passes the info to kdump kernel via "elfcorehdr=" parameter to export as /proc/vmcore file. The next patch sets up the memory reserve map for the kexec kernel and also claims kdump support for kdump as all the necessary changes are added. The next patch fixes a lookup issue for `kexec -l -s` case when memory is reserved for crashkernel. The last patch updates purgatory to setup r8 & r9 with opal base and opal entry addresses respectively to aid kernels built with CONFIG_PPC_EARLY_DEBUG_OPAL enabled. Tested the changes successfully on P8, P9 lpars, couple of OpenPOWER boxes, one with secureboot enabled, KVM guest and a simulator. v5 -> v6: * Fixed reference count leak in add_tce_mem_ranges() function and also updated error handling in reading tce table base & sizes. * Instead of trying to reinvent the wheel with get_node_path() & get_node_path_size() functions, used %pOF format as suggested by mpe. * Moved patch 07/11 to end of the series for mpe to take a call on whether to have it or not. v4 -> v5: * Dropped patches 07/12 & 08/12 and updated purgatory to do everything in assembly. * Added a new patch (which was part of patch 08/12 in v4) to update r8 & r9 registers with opal base & opal entry addresses as it is expected on kernels built with CONFIG_PPC_EARLY_DEBUG_OPAL enabled. * Fixed kexec load issue on KVM guest. v3 -> v4: * Updated get_node_path() function to be iterative instead of a recursive one. * Added comment explaining why low memory is added to kdump kernel's usable memory ranges though it doesn't fall in crashkernel region. * Fixed stack_buf to be quadword aligned in accordance with ABI. * Added missing of_node_put() in setup_purgatory_ppc64(). * Added a FIXME tag to indicate issue in adding opal/rtas regions to core image. v2 -> v3: * Fixed TOC pointer calculation for purgatory by using section info that has relocations applied. * Fixed arch_kexec_locate_mem_hole() function to fallback to generic kexec_locate_mem_hole() lookup if exclude ranges list is empty. * Dropped check for backup_start in trampoline_64.S as purgatory() function takes care of it anyway. v1 -> v2: * Introduced arch_kexec_locate_mem_hole() for override and dropped weak arch_kexec_add_buffer(). * Addressed warnings reported by lkp. * Added patch to address kexec load issue when memory is reserved for crashkernel. * Used the appropriate license header for the new files added. * Added an option to merge ranges to minimize reallocations while adding memory ranges. * Dropped within_crashkernel parameter for add_opal_mem_range() & add_rtas_mem_range() functions as it is not really needed. --- Hari Bathini (11): kexec_file: allow archs to handle special regions while locating memory hole powerpc/kexec_file: mark PPC64 specific code powerpc/kexec_file: add helper functions for getting memory ranges ppc64/kexec_file: avoid stomping memory used by special regions powerpc/drmem: make lmb walk a bit more flexible ppc64/kexec_file: restrict memory usage of kdump kernel ppc64/kexec_file: setup backup region for kdump kernel ppc64/kexec_file: prepare elfcore header for crashing kernel ppc64/kexec_file: add appropriate regions for memory reserve map ppc64/kexec_file: fix kexec load failure with lack of memory hole ppc64/kexec_file: enable early kernel's OPAL calls arch/powerpc/include/asm/crashdump-ppc64.h | 19 arch/powerpc/include/asm/drmem.h | 9 arch/powerpc/include/asm/kexec.h | 29 + arch/powerpc/include/asm/kexec_ranges.h | 25 + arch/powerpc/kernel/prom.c | 13 arch/powerpc/kexec/Makefile | 2 arch/powerpc/kexec/elf_64.c | 36 + arch/powerpc/kexec/file_load.c | 60 +- arch/powerpc/kexec/file_load_64.c | 1119 ++++++++++++++++++++++++++++ arch/powerpc/kexec/ranges.c | 412 ++++++++++ arch/powerpc/mm/drmem.c | 87 +- arch/powerpc/mm/numa.c | 13 arch/powerpc/purgatory/Makefile | 4 arch/powerpc/purgatory/trampoline.S | 117 --- arch/powerpc/purgatory/trampoline_64.S | 163 ++++ include/linux/kexec.h | 29 - kernel/kexec_file.c | 16 17 files changed, 1958 insertions(+), 195 deletions(-) create mode 100644 arch/powerpc/include/asm/crashdump-ppc64.h create mode 100644 arch/powerpc/include/asm/kexec_ranges.h create mode 100644 arch/powerpc/kexec/file_load_64.c create mode 100644 arch/powerpc/kexec/ranges.c delete mode 100644 arch/powerpc/purgatory/trampoline.S create mode 100644 arch/powerpc/purgatory/trampoline_64.S