s390: remove named saved segment support
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Thu, 2 Nov 2017 11:51:45 +0000 (12:51 +0100)
committerHeiko Carstens <heiko.carstens@de.ibm.com>
Wed, 8 Nov 2017 08:47:54 +0000 (09:47 +0100)
Remove the support to create a z/VM named saved segment (NSS). This
feature is not supported since quite a while in favour of jump labels,
function tracing and (now) CPU alternatives. All of these features
require to write to the kernel text section which is not possible if
the kernel is contained within an NSS.

Given that memory savings are minimal if kernel images are shared and
in addition updates of shared images are painful, the NSS feature can
be removed.

Reviewed-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
arch/s390/Kconfig
arch/s390/include/asm/ipl.h
arch/s390/include/asm/sections.h
arch/s390/include/asm/setup.h
arch/s390/kernel/early.c
arch/s390/kernel/ipl.c
arch/s390/kernel/machine_kexec.c
arch/s390/kernel/suspend.c
arch/s390/kernel/vmlinux.lds.S
arch/s390/mm/vmem.c

index 080a3fcc3cb88116d19cc9993e37ad3da7d66ff3..9fe2fd57bba960ecaba28e7ea0e9189eed3456f3 100644 (file)
@@ -824,19 +824,6 @@ config PFAULT
          Everybody who wants to run Linux under VM != VM4.2 should select
          this option.
 
-config SHARED_KERNEL
-       bool "VM shared kernel support"
-       depends on !JUMP_LABEL
-       depends on !ALTERNATIVES
-       help
-         Select this option, if you want to share the text segment of the
-         Linux kernel between different VM guests. This reduces memory
-         usage with lots of guests but greatly increases kernel size.
-         Also if a kernel was IPL'ed from a shared segment the kexec system
-         call will not work.
-         You should only select this option if you know what you are
-         doing and want to exploit this feature.
-
 config CMM
        def_tristate n
        prompt "Cooperative memory management"
index 6810bd75731288b74acf11ea3c8c0a709141af4c..c40cb348dd79f7f7eb5f342450ea8620805b7efb 100644 (file)
@@ -12,6 +12,8 @@
 #include <asm/cio.h>
 #include <asm/setup.h>
 
+#define NSS_NAME_SIZE  8
+
 #define IPL_PARMBLOCK_ORIGIN   0x2000
 
 #define IPL_PARM_BLK_FCP_LEN (sizeof(struct ipl_list_hdr) + \
@@ -105,7 +107,6 @@ extern size_t append_ipl_scpdata(char *, size_t);
 enum {
        IPL_DEVNO_VALID         = 1,
        IPL_PARMBLOCK_VALID     = 2,
-       IPL_NSS_VALID           = 4,
 };
 
 enum ipl_type {
index fbd9116eb17bf2c73d80952af2108eecdf4db1ed..cd68bf11588974466e2a4d4521494cdcc6e8d6c6 100644 (file)
@@ -3,6 +3,6 @@
 
 #include <asm-generic/sections.h>
 
-extern char _eshared[], _ehead[];
+extern char _ehead[];
 
 #endif
index 490e035b371690f5817200504990f57520f65d6b..fb3c4a138ae39163bff3bd13f2ffbe87f97fc4b3 100644 (file)
@@ -97,9 +97,6 @@ extern char vmpoff_cmd[];
 #define SET_CONSOLE_VT220      do { console_mode = 4; } while (0)
 #define SET_CONSOLE_HVC                do { console_mode = 5; } while (0)
 
-#define NSS_NAME_SIZE  8
-extern char kernel_nss_name[];
-
 #ifdef CONFIG_PFAULT
 extern int pfault_init(void);
 extern void pfault_fini(void);
index 60181caf8e8ad332029212e82b07c561cb44395a..389e9f61c76f8a13bb1bb97e4731353bc4c48f43 100644 (file)
 #include <asm/facility.h>
 #include "entry.h"
 
-/*
- * Create a Kernel NSS if the SAVESYS= parameter is defined
- */
-#define DEFSYS_CMD_SIZE                128
-#define SAVESYS_CMD_SIZE       32
-
-char kernel_nss_name[NSS_NAME_SIZE + 1];
-
 static void __init setup_boot_command_line(void);
 
 /*
@@ -58,134 +50,6 @@ static void __init reset_tod_clock(void)
        S390_lowcore.last_update_clock = TOD_UNIX_EPOCH;
 }
 
-#ifdef CONFIG_SHARED_KERNEL
-int __init savesys_ipl_nss(char *cmd, const int cmdlen);
-
-asm(
-       "       .section .init.text,\"ax\",@progbits\n"
-       "       .align  4\n"
-       "       .type   savesys_ipl_nss, @function\n"
-       "savesys_ipl_nss:\n"
-       "       stmg    6,15,48(15)\n"
-       "       lgr     14,3\n"
-       "       sam31\n"
-       "       diag    2,14,0x8\n"
-       "       sam64\n"
-       "       lgr     2,14\n"
-       "       lmg     6,15,48(15)\n"
-       "       br      14\n"
-       "       .size   savesys_ipl_nss, .-savesys_ipl_nss\n"
-       "       .previous\n");
-
-static __initdata char upper_command_line[COMMAND_LINE_SIZE];
-
-static noinline __init void create_kernel_nss(void)
-{
-       unsigned int i, stext_pfn, eshared_pfn, end_pfn, min_size;
-#ifdef CONFIG_BLK_DEV_INITRD
-       unsigned int sinitrd_pfn, einitrd_pfn;
-#endif
-       int response;
-       int hlen;
-       size_t len;
-       char *savesys_ptr;
-       char defsys_cmd[DEFSYS_CMD_SIZE];
-       char savesys_cmd[SAVESYS_CMD_SIZE];
-
-       /* Do nothing if we are not running under VM */
-       if (!MACHINE_IS_VM)
-               return;
-
-       /* Convert COMMAND_LINE to upper case */
-       for (i = 0; i < strlen(boot_command_line); i++)
-               upper_command_line[i] = toupper(boot_command_line[i]);
-
-       savesys_ptr = strstr(upper_command_line, "SAVESYS=");
-
-       if (!savesys_ptr)
-               return;
-
-       savesys_ptr += 8;    /* Point to the beginning of the NSS name */
-       for (i = 0; i < NSS_NAME_SIZE; i++) {
-               if (savesys_ptr[i] == ' ' || savesys_ptr[i] == '\0')
-                       break;
-               kernel_nss_name[i] = savesys_ptr[i];
-       }
-
-       stext_pfn = PFN_DOWN(__pa(&_stext));
-       eshared_pfn = PFN_DOWN(__pa(&_eshared));
-       end_pfn = PFN_UP(__pa(&_end));
-       min_size = end_pfn << 2;
-
-       hlen = snprintf(defsys_cmd, DEFSYS_CMD_SIZE,
-                       "DEFSYS %s 00000-%.5X EW %.5X-%.5X SR %.5X-%.5X",
-                       kernel_nss_name, stext_pfn - 1, stext_pfn,
-                       eshared_pfn - 1, eshared_pfn, end_pfn);
-
-#ifdef CONFIG_BLK_DEV_INITRD
-       if (INITRD_START && INITRD_SIZE) {
-               sinitrd_pfn = PFN_DOWN(__pa(INITRD_START));
-               einitrd_pfn = PFN_UP(__pa(INITRD_START + INITRD_SIZE));
-               min_size = einitrd_pfn << 2;
-               hlen += snprintf(defsys_cmd + hlen, DEFSYS_CMD_SIZE - hlen,
-                                " EW %.5X-%.5X", sinitrd_pfn, einitrd_pfn);
-       }
-#endif
-
-       snprintf(defsys_cmd + hlen, DEFSYS_CMD_SIZE - hlen,
-                " EW MINSIZE=%.7iK PARMREGS=0-13", min_size);
-       defsys_cmd[DEFSYS_CMD_SIZE - 1] = '\0';
-       snprintf(savesys_cmd, SAVESYS_CMD_SIZE, "SAVESYS %s \n IPL %s",
-                kernel_nss_name, kernel_nss_name);
-       savesys_cmd[SAVESYS_CMD_SIZE - 1] = '\0';
-
-       __cpcmd(defsys_cmd, NULL, 0, &response);
-
-       if (response != 0) {
-               pr_err("Defining the Linux kernel NSS failed with rc=%d\n",
-                       response);
-               kernel_nss_name[0] = '\0';
-               return;
-       }
-
-       len = strlen(savesys_cmd);
-       ASCEBC(savesys_cmd, len);
-       response = savesys_ipl_nss(savesys_cmd, len);
-
-       /* On success: response is equal to the command size,
-        *             max SAVESYS_CMD_SIZE
-        * On error: response contains the numeric portion of cp error message.
-        *           for SAVESYS it will be >= 263
-        *           for missing privilege class, it will be 1
-        */
-       if (response > SAVESYS_CMD_SIZE || response == 1) {
-               pr_err("Saving the Linux kernel NSS failed with rc=%d\n",
-                       response);
-               kernel_nss_name[0] = '\0';
-               return;
-       }
-
-       /* re-initialize cputime accounting. */
-       get_tod_clock_ext(tod_clock_base);
-       S390_lowcore.last_update_clock = *(__u64 *) &tod_clock_base[1];
-       S390_lowcore.last_update_timer = 0x7fffffffffffffffULL;
-       S390_lowcore.user_timer = 0;
-       S390_lowcore.system_timer = 0;
-       asm volatile("SPT 0(%0)" : : "a" (&S390_lowcore.last_update_timer));
-
-       /* re-setup boot command line with new ipl vm parms */
-       ipl_update_parameters();
-       setup_boot_command_line();
-
-       ipl_flags = IPL_NSS_VALID;
-}
-
-#else /* CONFIG_SHARED_KERNEL */
-
-static inline void create_kernel_nss(void) { }
-
-#endif /* CONFIG_SHARED_KERNEL */
-
 /*
  * Clear bss memory
  */
@@ -548,10 +412,6 @@ static void __init setup_boot_command_line(void)
        append_to_cmdline(append_ipl_scpdata);
 }
 
-/*
- * Save ipl parameters, clear bss memory, initialize storage keys
- * and create a kernel NSS at startup if the SAVESYS= parm is defined
- */
 void __init startup_init(void)
 {
        reset_tod_clock();
@@ -568,7 +428,6 @@ void __init startup_init(void)
        setup_arch_string();
        ipl_update_parameters();
        setup_boot_command_line();
-       create_kernel_nss();
        detect_diag9c();
        detect_diag44();
        detect_machine_facilities();
index 8e622bb52f7a95fd59c2f89aec95f04c616633cf..310e59e6eb4b20bb7f17debb8ec412546289baf8 100644 (file)
@@ -279,8 +279,6 @@ static __init enum ipl_type get_ipl_type(void)
 {
        struct ipl_parameter_block *ipl = IPL_PARMBLOCK_START;
 
-       if (ipl_flags & IPL_NSS_VALID)
-               return IPL_TYPE_NSS;
        if (!(ipl_flags & IPL_DEVNO_VALID))
                return IPL_TYPE_UNKNOWN;
        if (!(ipl_flags & IPL_PARMBLOCK_VALID))
@@ -533,22 +531,6 @@ static struct attribute_group ipl_ccw_attr_group_lpar = {
        .attrs = ipl_ccw_attrs_lpar
 };
 
-/* NSS ipl device attributes */
-
-DEFINE_IPL_ATTR_RO(ipl_nss, name, "%s\n", kernel_nss_name);
-
-static struct attribute *ipl_nss_attrs[] = {
-       &sys_ipl_type_attr.attr,
-       &sys_ipl_nss_name_attr.attr,
-       &sys_ipl_ccw_loadparm_attr.attr,
-       &sys_ipl_vm_parm_attr.attr,
-       NULL,
-};
-
-static struct attribute_group ipl_nss_attr_group = {
-       .attrs = ipl_nss_attrs,
-};
-
 /* UNKNOWN ipl device attributes */
 
 static struct attribute *ipl_unknown_attrs[] = {
@@ -598,9 +580,6 @@ static int __init ipl_init(void)
        case IPL_TYPE_FCP_DUMP:
                rc = sysfs_create_group(&ipl_kset->kobj, &ipl_fcp_attr_group);
                break;
-       case IPL_TYPE_NSS:
-               rc = sysfs_create_group(&ipl_kset->kobj, &ipl_nss_attr_group);
-               break;
        default:
                rc = sysfs_create_group(&ipl_kset->kobj,
                                        &ipl_unknown_attr_group);
@@ -1172,18 +1151,6 @@ static int __init reipl_nss_init(void)
                return rc;
 
        reipl_block_ccw_init(reipl_block_nss);
-       if (ipl_info.type == IPL_TYPE_NSS) {
-               memset(reipl_block_nss->ipl_info.ccw.nss_name,
-                       ' ', NSS_NAME_SIZE);
-               memcpy(reipl_block_nss->ipl_info.ccw.nss_name,
-                       kernel_nss_name, strlen(kernel_nss_name));
-               ASCEBC(reipl_block_nss->ipl_info.ccw.nss_name, NSS_NAME_SIZE);
-               reipl_block_nss->ipl_info.ccw.vm_flags |=
-                       DIAG308_VM_FLAGS_NSS_VALID;
-
-               reipl_block_ccw_fill_parms(reipl_block_nss);
-       }
-
        reipl_capabilities |= IPL_TYPE_NSS;
        return 0;
 }
@@ -1971,9 +1938,6 @@ void __init setup_ipl(void)
                ipl_info.data.fcp.lun = IPL_PARMBLOCK_START->ipl_info.fcp.lun;
                break;
        case IPL_TYPE_NSS:
-               strncpy(ipl_info.data.nss.name, kernel_nss_name,
-                       sizeof(ipl_info.data.nss.name));
-               break;
        case IPL_TYPE_UNKNOWN:
                /* We have no info to copy */
                break;
index e94421678b13f82af6e5dd53b17c8f15d368a1a2..c72e551e5951dd486e4a9dd3f83c936dd87ffb0c 100644 (file)
@@ -219,10 +219,6 @@ int machine_kexec_prepare(struct kimage *image)
 {
        void *reboot_code_buffer;
 
-       /* Can't replace kernel image since it is read-only. */
-       if (ipl_flags & IPL_NSS_VALID)
-               return -EOPNOTSUPP;
-
        if (image->type == KEXEC_TYPE_CRASH)
                return machine_kexec_prepare_kdump();
 
index c8ea715bfe101d43cf6d7ccac6ac17eb8bc6be1b..af0553111be8f0fddaf1801e19c2150195d788f6 100644 (file)
@@ -152,7 +152,7 @@ int pfn_is_nosave(unsigned long pfn)
 {
        unsigned long nosave_begin_pfn = PFN_DOWN(__pa(&__nosave_begin));
        unsigned long nosave_end_pfn = PFN_DOWN(__pa(&__nosave_end));
-       unsigned long eshared_pfn = PFN_DOWN(__pa(&_eshared)) - 1;
+       unsigned long end_rodata_pfn = PFN_DOWN(__pa(&__end_rodata)) - 1;
        unsigned long stext_pfn = PFN_DOWN(__pa(&_stext));
 
        /* Always save lowcore pages (LC protection might be enabled). */
@@ -160,9 +160,9 @@ int pfn_is_nosave(unsigned long pfn)
                return 0;
        if (pfn >= nosave_begin_pfn && pfn < nosave_end_pfn)
                return 1;
-       /* Skip memory holes and read-only pages (NSS, DCSS, ...). */
-       if (pfn >= stext_pfn && pfn <= eshared_pfn)
-               return ipl_info.type == IPL_TYPE_NSS ? 1 : 0;
+       /* Skip memory holes and read-only pages (DCSS, ...). */
+       if (pfn >= stext_pfn && pfn <= end_rodata_pfn)
+               return 0;
        if (tprot(PFN_PHYS(pfn)))
                return 1;
        return 0;
index 7c9fcf7cb43d8aa5823626d57f81ed78d65c5c3c..a609d65afc56d32905ef50924552fe3caba16daf 100644 (file)
@@ -59,12 +59,7 @@ SECTIONS
 
        RO_DATA_SECTION(PAGE_SIZE)
 
-#ifdef CONFIG_SHARED_KERNEL
-       . = ALIGN(0x100000);    /* VM shared segments are 1MB aligned */
-#endif
-
        . = ALIGN(PAGE_SIZE);
-       _eshared = .;           /* End of shareable data */
        _sdata = .;             /* Start of data section */
 
        . = ALIGN(PAGE_SIZE);
index 2e84977796a2afd4b0a103fe04edbb82de31ff14..f890f2ad951b5a60acd6490ccc6ec165bfee5ca1 100644 (file)
@@ -406,13 +406,13 @@ void __init vmem_map_init(void)
                     (_etext - _stext) >> PAGE_SHIFT,
                     SET_MEMORY_RO | SET_MEMORY_X);
        __set_memory((unsigned long) _etext,
-                    (_eshared - _etext) >> PAGE_SHIFT,
+                    (__end_rodata - _etext) >> PAGE_SHIFT,
                     SET_MEMORY_RO);
        __set_memory((unsigned long) _sinittext,
                     (_einittext - _sinittext) >> PAGE_SHIFT,
                     SET_MEMORY_RO | SET_MEMORY_X);
        pr_info("Write protected kernel read-only data: %luk\n",
-               (_eshared - _stext) >> 10);
+               (__end_rodata - _stext) >> 10);
 }
 
 /*