Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e657d8fe authored by Michael Holzheu's avatar Michael Holzheu Committed by Martin Schwidefsky
Browse files

s390/sclp: Determine HSA size dynamically for zfcpdump



Currently we have hardcoded the HSA size to 32 MiB. With this patch the
HSA size is determined dynamically via SCLP in early.c.

Reviewed-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMichael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent f8049e3e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -57,5 +57,7 @@ bool sclp_has_vt220(void);
int sclp_pci_configure(u32 fid);
int sclp_pci_deconfigure(u32 fid);
int memcpy_hsa(void *dest, unsigned long src, size_t count, int mode);
void sclp_hsa_size_detect(void);
unsigned long sclp_get_hsa_size(void);

#endif /* _ASM_S390_SCLP_H */
+0 −3
Original line number Diff line number Diff line
@@ -107,9 +107,6 @@ void create_mem_hole(struct mem_chunk mem_chunk[], unsigned long addr,
#define MACHINE_HAS_RRBM	(S390_lowcore.machine_flags & MACHINE_FLAG_RRBM)
#endif /* CONFIG_64BIT */

#define ZFCPDUMP_HSA_SIZE	(32UL<<20)
#define ZFCPDUMP_HSA_SIZE_MAX	(64UL<<20)

/*
 * Console mode. Override with conmode=
 */
+13 −9
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ static void *elfcorehdr_newmem;
/*
 * Copy one page from zfcpdump "oldmem"
 *
 * For pages below ZFCPDUMP_HSA_SIZE memory from the HSA is copied. Otherwise
 * For pages below HSA size memory from the HSA is copied. Otherwise
 * real memory copy is used.
 */
static ssize_t copy_oldmem_page_zfcpdump(char *buf, size_t csize,
@@ -103,7 +103,7 @@ static ssize_t copy_oldmem_page_zfcpdump(char *buf, size_t csize,
{
	int rc;

	if (src < ZFCPDUMP_HSA_SIZE) {
	if (src < sclp_get_hsa_size()) {
		rc = memcpy_hsa(buf, src, csize, userbuf);
	} else {
		if (userbuf)
@@ -188,18 +188,19 @@ static int remap_oldmem_pfn_range_kdump(struct vm_area_struct *vma,
/*
 * Remap "oldmem" for zfcpdump
 *
 * We only map available memory above ZFCPDUMP_HSA_SIZE. Memory below
 * ZFCPDUMP_HSA_SIZE is read on demand using the copy_oldmem_page() function.
 * We only map available memory above HSA size. Memory below HSA size
 * is read on demand using the copy_oldmem_page() function.
 */
static int remap_oldmem_pfn_range_zfcpdump(struct vm_area_struct *vma,
					   unsigned long from,
					   unsigned long pfn,
					   unsigned long size, pgprot_t prot)
{
	unsigned long hsa_end = sclp_get_hsa_size();
	unsigned long size_hsa;

	if (pfn < ZFCPDUMP_HSA_SIZE >> PAGE_SHIFT) {
		size_hsa = min(size, ZFCPDUMP_HSA_SIZE - (pfn << PAGE_SHIFT));
	if (pfn < hsa_end >> PAGE_SHIFT) {
		size_hsa = min(size, hsa_end - (pfn << PAGE_SHIFT));
		if (size == size_hsa)
			return 0;
		size -= size_hsa;
@@ -238,9 +239,9 @@ int copy_from_oldmem(void *dest, void *src, size_t count)
				return rc;
		}
	} else {
		if ((unsigned long) src < ZFCPDUMP_HSA_SIZE) {
			copied = min(count,
				     ZFCPDUMP_HSA_SIZE - (unsigned long) src);
		unsigned long hsa_end = sclp_get_hsa_size();
		if ((unsigned long) src < hsa_end) {
			copied = min(count, hsa_end - (unsigned long) src);
			rc = memcpy_hsa(dest, (unsigned long) src, copied, 0);
			if (rc)
				return rc;
@@ -580,6 +581,9 @@ int elfcorehdr_alloc(unsigned long long *addr, unsigned long long *size)
	/* If elfcorehdr= has been passed via cmdline, we use that one */
	if (elfcorehdr_addr != ELFCORE_ADDR_MAX)
		return 0;
	/* If we cannot get HSA size for zfcpdump return error */
	if (ipl_info.type == IPL_TYPE_FCP_DUMP && !sclp_get_hsa_size())
		return -ENODEV;
	mem_chunk_cnt = get_mem_chunk_cnt();

	alloc_size = 0x1000 + get_cpu_cnt() * 0x300 +
+1 −0
Original line number Diff line number Diff line
@@ -484,6 +484,7 @@ void __init startup_init(void)
	detect_machine_facilities();
	setup_topology();
	sclp_facilities_detect();
	sclp_hsa_size_detect();
#ifdef CONFIG_DYNAMIC_FTRACE
	S390_lowcore.ftrace_func = (unsigned long)ftrace_caller;
#endif
+4 −3
Original line number Diff line number Diff line
@@ -471,8 +471,9 @@ static void __init setup_memory_end(void)


#ifdef CONFIG_ZFCPDUMP
	if (ipl_info.type == IPL_TYPE_FCP_DUMP && !OLDMEM_BASE) {
		memory_end = ZFCPDUMP_HSA_SIZE;
	if (ipl_info.type == IPL_TYPE_FCP_DUMP &&
	    !OLDMEM_BASE && sclp_get_hsa_size()) {
		memory_end = sclp_get_hsa_size();
		memory_end_set = 1;
	}
#endif
@@ -586,7 +587,7 @@ static unsigned long __init find_crash_base(unsigned long crash_size,
		crash_base = (chunk->addr + chunk->size) - crash_size;
		if (crash_base < crash_size)
			continue;
		if (crash_base < ZFCPDUMP_HSA_SIZE_MAX)
		if (crash_base < sclp_get_hsa_size())
			continue;
		if (crash_base < (unsigned long) INITRD_START + INITRD_SIZE)
			continue;
Loading