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 080a3fc..9fe2fd5 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 6810bd7..c40cb34 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 fbd9116..cd68bf1 100644 (file)
@@ -3,6 +3,6 @@
 
 #include <asm-generic/sections.h>
 
-extern char _eshared[], _ehead[];
+extern char _ehead[];
 
 #endif
index 490e035..fb3c4a1 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 60181ca..389e9f6 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 8e622bb..310e59e 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 e944216..c72e551 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 c8ea715..af05531 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 7c9fcf7..a609d65 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 2e84977..f890f2a 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);
 }
 
 /*