Commit 83ff1af9 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6

* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6:
  [S390] fix "mem=" handling in case of standby memory
  [S390] Fix timeval regression on s390
  [S390] sclp: handle empty event buffers
parents a1342d3b 23d75d9c
...@@ -145,7 +145,7 @@ cputime_to_timeval(const cputime_t cputime, struct timeval *value) ...@@ -145,7 +145,7 @@ cputime_to_timeval(const cputime_t cputime, struct timeval *value)
value->tv_usec = rp.subreg.even / 4096; value->tv_usec = rp.subreg.even / 4096;
value->tv_sec = rp.subreg.odd; value->tv_sec = rp.subreg.odd;
#else #else
value->tv_usec = cputime % 4096000000ULL; value->tv_usec = (cputime % 4096000000ULL) / 4096;
value->tv_sec = cputime / 4096000000ULL; value->tv_sec = cputime / 4096000000ULL;
#endif #endif
} }
......
...@@ -43,6 +43,8 @@ struct mem_chunk { ...@@ -43,6 +43,8 @@ struct mem_chunk {
extern struct mem_chunk memory_chunk[]; extern struct mem_chunk memory_chunk[];
extern unsigned long real_memory_size; extern unsigned long real_memory_size;
extern int memory_end_set;
extern unsigned long memory_end;
void detect_memory_layout(struct mem_chunk chunk[]); void detect_memory_layout(struct mem_chunk chunk[]);
......
...@@ -82,7 +82,9 @@ char elf_platform[ELF_PLATFORM_SIZE]; ...@@ -82,7 +82,9 @@ char elf_platform[ELF_PLATFORM_SIZE];
struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS]; struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS];
volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */ volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
static unsigned long __initdata memory_end;
int __initdata memory_end_set;
unsigned long __initdata memory_end;
/* /*
* This is set up by the setup-routine at boot-time * This is set up by the setup-routine at boot-time
...@@ -281,6 +283,7 @@ void (*pm_power_off)(void) = machine_power_off; ...@@ -281,6 +283,7 @@ void (*pm_power_off)(void) = machine_power_off;
static int __init early_parse_mem(char *p) static int __init early_parse_mem(char *p)
{ {
memory_end = memparse(p, &p); memory_end = memparse(p, &p);
memory_end_set = 1;
return 0; return 0;
} }
early_param("mem", early_parse_mem); early_param("mem", early_parse_mem);
...@@ -508,8 +511,10 @@ static void __init setup_memory_end(void) ...@@ -508,8 +511,10 @@ static void __init setup_memory_end(void)
int i; int i;
#if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE) #if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE)
if (ipl_info.type == IPL_TYPE_FCP_DUMP) if (ipl_info.type == IPL_TYPE_FCP_DUMP) {
memory_end = ZFCPDUMP_HSA_SIZE; memory_end = ZFCPDUMP_HSA_SIZE;
memory_end_set = 1;
}
#endif #endif
memory_size = 0; memory_size = 0;
memory_end &= PAGE_MASK; memory_end &= PAGE_MASK;
......
...@@ -280,8 +280,11 @@ sclp_dispatch_evbufs(struct sccb_header *sccb) ...@@ -280,8 +280,11 @@ sclp_dispatch_evbufs(struct sccb_header *sccb)
rc = 0; rc = 0;
for (offset = sizeof(struct sccb_header); offset < sccb->length; for (offset = sizeof(struct sccb_header); offset < sccb->length;
offset += evbuf->length) { offset += evbuf->length) {
/* Search for event handler */
evbuf = (struct evbuf_header *) ((addr_t) sccb + offset); evbuf = (struct evbuf_header *) ((addr_t) sccb + offset);
/* Check for malformed hardware response */
if (evbuf->length == 0)
break;
/* Search for event handler */
reg = NULL; reg = NULL;
list_for_each(l, &sclp_reg_list) { list_for_each(l, &sclp_reg_list) {
reg = list_entry(l, struct sclp_register, list); reg = list_entry(l, struct sclp_register, list);
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/memory.h> #include <linux/memory.h>
#include <asm/chpid.h> #include <asm/chpid.h>
#include <asm/sclp.h> #include <asm/sclp.h>
#include <asm/setup.h>
#include "sclp.h" #include "sclp.h"
...@@ -474,6 +475,10 @@ static void __init add_memory_merged(u16 rn) ...@@ -474,6 +475,10 @@ static void __init add_memory_merged(u16 rn)
goto skip_add; goto skip_add;
if (start + size > VMEM_MAX_PHYS) if (start + size > VMEM_MAX_PHYS)
size = VMEM_MAX_PHYS - start; size = VMEM_MAX_PHYS - start;
if (memory_end_set && (start >= memory_end))
goto skip_add;
if (memory_end_set && (start + size > memory_end))
size = memory_end - start;
add_memory(0, start, size); add_memory(0, start, size);
skip_add: skip_add:
first_rn = rn; first_rn = rn;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment