mirror of https://gitee.com/openkylin/linux.git
s390: remove named saved segment support
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>
This commit is contained in:
parent
f44fa88745
commit
978fa72e82
|
@ -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"
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -3,6 +3,6 @@
|
|||
|
||||
#include <asm-generic/sections.h>
|
||||
|
||||
extern char _eshared[], _ehead[];
|
||||
extern char _ehead[];
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -30,14 +30,6 @@
|
|||
#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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue