diff options
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/appldata/appldata_base.c | 4 | ||||
-rw-r--r-- | arch/s390/appldata/appldata_net_sum.c | 8 | ||||
-rw-r--r-- | arch/s390/crypto/prng.c | 2 | ||||
-rw-r--r-- | arch/s390/include/asm/cacheflush.h | 1 | ||||
-rw-r--r-- | arch/s390/include/asm/cputime.h | 8 | ||||
-rw-r--r-- | arch/s390/include/asm/kvm.h | 3 | ||||
-rw-r--r-- | arch/s390/include/asm/socket.h | 2 | ||||
-rw-r--r-- | arch/s390/kernel/compat_linux.c | 53 | ||||
-rw-r--r-- | arch/s390/kernel/compat_linux.h | 2 | ||||
-rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 6 | ||||
-rw-r--r-- | arch/s390/kernel/debug.c | 13 | ||||
-rw-r--r-- | arch/s390/kernel/s390_ext.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/time.c | 3 | ||||
-rw-r--r-- | arch/s390/kernel/vtime.c | 2 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 30 | ||||
-rw-r--r-- | arch/s390/kvm/sigp.c | 6 | ||||
-rw-r--r-- | arch/s390/mm/cmm.c | 11 |
17 files changed, 60 insertions, 96 deletions
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index b55fd7ed1c31..495589950dc7 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -61,12 +61,12 @@ static struct ctl_table appldata_table[] = { | |||
61 | { | 61 | { |
62 | .procname = "timer", | 62 | .procname = "timer", |
63 | .mode = S_IRUGO | S_IWUSR, | 63 | .mode = S_IRUGO | S_IWUSR, |
64 | .proc_handler = &appldata_timer_handler, | 64 | .proc_handler = appldata_timer_handler, |
65 | }, | 65 | }, |
66 | { | 66 | { |
67 | .procname = "interval", | 67 | .procname = "interval", |
68 | .mode = S_IRUGO | S_IWUSR, | 68 | .mode = S_IRUGO | S_IWUSR, |
69 | .proc_handler = &appldata_interval_handler, | 69 | .proc_handler = appldata_interval_handler, |
70 | }, | 70 | }, |
71 | { }, | 71 | { }, |
72 | }; | 72 | }; |
diff --git a/arch/s390/appldata/appldata_net_sum.c b/arch/s390/appldata/appldata_net_sum.c index fa741f84c5b9..4ce7fa95880f 100644 --- a/arch/s390/appldata/appldata_net_sum.c +++ b/arch/s390/appldata/appldata_net_sum.c | |||
@@ -83,8 +83,9 @@ static void appldata_get_net_sum_data(void *data) | |||
83 | rx_dropped = 0; | 83 | rx_dropped = 0; |
84 | tx_dropped = 0; | 84 | tx_dropped = 0; |
85 | collisions = 0; | 85 | collisions = 0; |
86 | read_lock(&dev_base_lock); | 86 | |
87 | for_each_netdev(&init_net, dev) { | 87 | rcu_read_lock(); |
88 | for_each_netdev_rcu(&init_net, dev) { | ||
88 | const struct net_device_stats *stats = dev_get_stats(dev); | 89 | const struct net_device_stats *stats = dev_get_stats(dev); |
89 | 90 | ||
90 | rx_packets += stats->rx_packets; | 91 | rx_packets += stats->rx_packets; |
@@ -98,7 +99,8 @@ static void appldata_get_net_sum_data(void *data) | |||
98 | collisions += stats->collisions; | 99 | collisions += stats->collisions; |
99 | i++; | 100 | i++; |
100 | } | 101 | } |
101 | read_unlock(&dev_base_lock); | 102 | rcu_read_unlock(); |
103 | |||
102 | net_data->nr_interfaces = i; | 104 | net_data->nr_interfaces = i; |
103 | net_data->rx_packets = rx_packets; | 105 | net_data->rx_packets = rx_packets; |
104 | net_data->tx_packets = tx_packets; | 106 | net_data->tx_packets = tx_packets; |
diff --git a/arch/s390/crypto/prng.c b/arch/s390/crypto/prng.c index b49c00ce65e9..a3209906739e 100644 --- a/arch/s390/crypto/prng.c +++ b/arch/s390/crypto/prng.c | |||
@@ -6,7 +6,6 @@ | |||
6 | #include <linux/fs.h> | 6 | #include <linux/fs.h> |
7 | #include <linux/init.h> | 7 | #include <linux/init.h> |
8 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
9 | #include <linux/smp_lock.h> | ||
10 | #include <linux/miscdevice.h> | 9 | #include <linux/miscdevice.h> |
11 | #include <linux/module.h> | 10 | #include <linux/module.h> |
12 | #include <linux/moduleparam.h> | 11 | #include <linux/moduleparam.h> |
@@ -49,7 +48,6 @@ static unsigned char parm_block[32] = { | |||
49 | 48 | ||
50 | static int prng_open(struct inode *inode, struct file *file) | 49 | static int prng_open(struct inode *inode, struct file *file) |
51 | { | 50 | { |
52 | cycle_kernel_lock(); | ||
53 | return nonseekable_open(inode, file); | 51 | return nonseekable_open(inode, file); |
54 | } | 52 | } |
55 | 53 | ||
diff --git a/arch/s390/include/asm/cacheflush.h b/arch/s390/include/asm/cacheflush.h index 49d5af916d01..405cc97c6249 100644 --- a/arch/s390/include/asm/cacheflush.h +++ b/arch/s390/include/asm/cacheflush.h | |||
@@ -10,6 +10,7 @@ | |||
10 | #define flush_cache_dup_mm(mm) do { } while (0) | 10 | #define flush_cache_dup_mm(mm) do { } while (0) |
11 | #define flush_cache_range(vma, start, end) do { } while (0) | 11 | #define flush_cache_range(vma, start, end) do { } while (0) |
12 | #define flush_cache_page(vma, vmaddr, pfn) do { } while (0) | 12 | #define flush_cache_page(vma, vmaddr, pfn) do { } while (0) |
13 | #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 | ||
13 | #define flush_dcache_page(page) do { } while (0) | 14 | #define flush_dcache_page(page) do { } while (0) |
14 | #define flush_dcache_mmap_lock(mapping) do { } while (0) | 15 | #define flush_dcache_mmap_lock(mapping) do { } while (0) |
15 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) | 16 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) |
diff --git a/arch/s390/include/asm/cputime.h b/arch/s390/include/asm/cputime.h index f23961ada7fb..258ba88b7b50 100644 --- a/arch/s390/include/asm/cputime.h +++ b/arch/s390/include/asm/cputime.h | |||
@@ -183,6 +183,7 @@ struct s390_idle_data { | |||
183 | unsigned long long idle_count; | 183 | unsigned long long idle_count; |
184 | unsigned long long idle_enter; | 184 | unsigned long long idle_enter; |
185 | unsigned long long idle_time; | 185 | unsigned long long idle_time; |
186 | int nohz_delay; | ||
186 | }; | 187 | }; |
187 | 188 | ||
188 | DECLARE_PER_CPU(struct s390_idle_data, s390_idle); | 189 | DECLARE_PER_CPU(struct s390_idle_data, s390_idle); |
@@ -198,4 +199,11 @@ static inline void s390_idle_check(void) | |||
198 | vtime_start_cpu(); | 199 | vtime_start_cpu(); |
199 | } | 200 | } |
200 | 201 | ||
202 | static inline int s390_nohz_delay(int cpu) | ||
203 | { | ||
204 | return per_cpu(s390_idle, cpu).nohz_delay != 0; | ||
205 | } | ||
206 | |||
207 | #define arch_needs_cpu(cpu) s390_nohz_delay(cpu) | ||
208 | |||
201 | #endif /* _S390_CPUTIME_H */ | 209 | #endif /* _S390_CPUTIME_H */ |
diff --git a/arch/s390/include/asm/kvm.h b/arch/s390/include/asm/kvm.h index 3dfcaeb5d7f4..82b32a100c7d 100644 --- a/arch/s390/include/asm/kvm.h +++ b/arch/s390/include/asm/kvm.h | |||
@@ -1,6 +1,5 @@ | |||
1 | #ifndef __LINUX_KVM_S390_H | 1 | #ifndef __LINUX_KVM_S390_H |
2 | #define __LINUX_KVM_S390_H | 2 | #define __LINUX_KVM_S390_H |
3 | |||
4 | /* | 3 | /* |
5 | * asm-s390/kvm.h - KVM s390 specific structures and definitions | 4 | * asm-s390/kvm.h - KVM s390 specific structures and definitions |
6 | * | 5 | * |
@@ -15,6 +14,8 @@ | |||
15 | */ | 14 | */ |
16 | #include <linux/types.h> | 15 | #include <linux/types.h> |
17 | 16 | ||
17 | #define __KVM_S390 | ||
18 | |||
18 | /* for KVM_GET_REGS and KVM_SET_REGS */ | 19 | /* for KVM_GET_REGS and KVM_SET_REGS */ |
19 | struct kvm_regs { | 20 | struct kvm_regs { |
20 | /* general purpose regs for s390 */ | 21 | /* general purpose regs for s390 */ |
diff --git a/arch/s390/include/asm/socket.h b/arch/s390/include/asm/socket.h index e42df89a0b85..fdff1e995c73 100644 --- a/arch/s390/include/asm/socket.h +++ b/arch/s390/include/asm/socket.h | |||
@@ -68,4 +68,6 @@ | |||
68 | #define SO_PROTOCOL 38 | 68 | #define SO_PROTOCOL 38 |
69 | #define SO_DOMAIN 39 | 69 | #define SO_DOMAIN 39 |
70 | 70 | ||
71 | #define SO_RXQ_OVFL 40 | ||
72 | |||
71 | #endif /* _ASM_SOCKET_H */ | 73 | #endif /* _ASM_SOCKET_H */ |
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 29a2f34b9555..25c31d681402 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c | |||
@@ -521,59 +521,6 @@ asmlinkage long sys32_sendfile64(int out_fd, int in_fd, | |||
521 | return ret; | 521 | return ret; |
522 | } | 522 | } |
523 | 523 | ||
524 | #ifdef CONFIG_SYSCTL_SYSCALL | ||
525 | struct __sysctl_args32 { | ||
526 | u32 name; | ||
527 | int nlen; | ||
528 | u32 oldval; | ||
529 | u32 oldlenp; | ||
530 | u32 newval; | ||
531 | u32 newlen; | ||
532 | u32 __unused[4]; | ||
533 | }; | ||
534 | |||
535 | asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args) | ||
536 | { | ||
537 | struct __sysctl_args32 tmp; | ||
538 | int error; | ||
539 | size_t oldlen; | ||
540 | size_t __user *oldlenp = NULL; | ||
541 | unsigned long addr = (((unsigned long)&args->__unused[0]) + 7) & ~7; | ||
542 | |||
543 | if (copy_from_user(&tmp, args, sizeof(tmp))) | ||
544 | return -EFAULT; | ||
545 | |||
546 | if (tmp.oldval && tmp.oldlenp) { | ||
547 | /* Duh, this is ugly and might not work if sysctl_args | ||
548 | is in read-only memory, but do_sysctl does indirectly | ||
549 | a lot of uaccess in both directions and we'd have to | ||
550 | basically copy the whole sysctl.c here, and | ||
551 | glibc's __sysctl uses rw memory for the structure | ||
552 | anyway. */ | ||
553 | if (get_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp)) || | ||
554 | put_user(oldlen, (size_t __user *)addr)) | ||
555 | return -EFAULT; | ||
556 | oldlenp = (size_t __user *)addr; | ||
557 | } | ||
558 | |||
559 | lock_kernel(); | ||
560 | error = do_sysctl(compat_ptr(tmp.name), tmp.nlen, compat_ptr(tmp.oldval), | ||
561 | oldlenp, compat_ptr(tmp.newval), tmp.newlen); | ||
562 | unlock_kernel(); | ||
563 | if (oldlenp) { | ||
564 | if (!error) { | ||
565 | if (get_user(oldlen, (size_t __user *)addr) || | ||
566 | put_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp))) | ||
567 | error = -EFAULT; | ||
568 | } | ||
569 | if (copy_to_user(args->__unused, tmp.__unused, | ||
570 | sizeof(tmp.__unused))) | ||
571 | error = -EFAULT; | ||
572 | } | ||
573 | return error; | ||
574 | } | ||
575 | #endif | ||
576 | |||
577 | struct stat64_emu31 { | 524 | struct stat64_emu31 { |
578 | unsigned long long st_dev; | 525 | unsigned long long st_dev; |
579 | unsigned int __pad1; | 526 | unsigned int __pad1; |
diff --git a/arch/s390/kernel/compat_linux.h b/arch/s390/kernel/compat_linux.h index 81d6ee826ff3..cb97afc85c94 100644 --- a/arch/s390/kernel/compat_linux.h +++ b/arch/s390/kernel/compat_linux.h | |||
@@ -158,7 +158,6 @@ struct ucontext32 { | |||
158 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ | 158 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ |
159 | }; | 159 | }; |
160 | 160 | ||
161 | struct __sysctl_args32; | ||
162 | struct stat64_emu31; | 161 | struct stat64_emu31; |
163 | struct mmap_arg_struct_emu31; | 162 | struct mmap_arg_struct_emu31; |
164 | struct fadvise64_64_args; | 163 | struct fadvise64_64_args; |
@@ -208,7 +207,6 @@ long sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, | |||
208 | size_t count); | 207 | size_t count); |
209 | long sys32_sendfile64(int out_fd, int in_fd, compat_loff_t __user *offset, | 208 | long sys32_sendfile64(int out_fd, int in_fd, compat_loff_t __user *offset, |
210 | s32 count); | 209 | s32 count); |
211 | long sys32_sysctl(struct __sysctl_args32 __user *args); | ||
212 | long sys32_stat64(char __user * filename, struct stat64_emu31 __user * statbuf); | 210 | long sys32_stat64(char __user * filename, struct stat64_emu31 __user * statbuf); |
213 | long sys32_lstat64(char __user * filename, | 211 | long sys32_lstat64(char __user * filename, |
214 | struct stat64_emu31 __user * statbuf); | 212 | struct stat64_emu31 __user * statbuf); |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index cbd9901dc0f8..30de2d0e52bb 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
@@ -689,8 +689,6 @@ sys32_fdatasync_wrapper: | |||
689 | llgfr %r2,%r2 # unsigned int | 689 | llgfr %r2,%r2 # unsigned int |
690 | jg sys_fdatasync # branch to system call | 690 | jg sys_fdatasync # branch to system call |
691 | 691 | ||
692 | #sys32_sysctl_wrapper # tbd | ||
693 | |||
694 | .globl sys32_mlock_wrapper | 692 | .globl sys32_mlock_wrapper |
695 | sys32_mlock_wrapper: | 693 | sys32_mlock_wrapper: |
696 | llgfr %r2,%r2 # unsigned long | 694 | llgfr %r2,%r2 # unsigned long |
@@ -1087,8 +1085,8 @@ sys32_stime_wrapper: | |||
1087 | 1085 | ||
1088 | .globl sys32_sysctl_wrapper | 1086 | .globl sys32_sysctl_wrapper |
1089 | sys32_sysctl_wrapper: | 1087 | sys32_sysctl_wrapper: |
1090 | llgtr %r2,%r2 # struct __sysctl_args32 * | 1088 | llgtr %r2,%r2 # struct compat_sysctl_args * |
1091 | jg sys32_sysctl | 1089 | jg compat_sys_sysctl |
1092 | 1090 | ||
1093 | .globl sys32_fstat64_wrapper | 1091 | .globl sys32_fstat64_wrapper |
1094 | sys32_fstat64_wrapper: | 1092 | sys32_fstat64_wrapper: |
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index 20f282c911c2..071c81f179ef 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c | |||
@@ -893,35 +893,30 @@ s390dbf_procactive(ctl_table *table, int write, | |||
893 | 893 | ||
894 | static struct ctl_table s390dbf_table[] = { | 894 | static struct ctl_table s390dbf_table[] = { |
895 | { | 895 | { |
896 | .ctl_name = CTL_S390DBF_STOPPABLE, | ||
897 | .procname = "debug_stoppable", | 896 | .procname = "debug_stoppable", |
898 | .data = &debug_stoppable, | 897 | .data = &debug_stoppable, |
899 | .maxlen = sizeof(int), | 898 | .maxlen = sizeof(int), |
900 | .mode = S_IRUGO | S_IWUSR, | 899 | .mode = S_IRUGO | S_IWUSR, |
901 | .proc_handler = &proc_dointvec, | 900 | .proc_handler = proc_dointvec, |
902 | .strategy = &sysctl_intvec, | ||
903 | }, | 901 | }, |
904 | { | 902 | { |
905 | .ctl_name = CTL_S390DBF_ACTIVE, | ||
906 | .procname = "debug_active", | 903 | .procname = "debug_active", |
907 | .data = &debug_active, | 904 | .data = &debug_active, |
908 | .maxlen = sizeof(int), | 905 | .maxlen = sizeof(int), |
909 | .mode = S_IRUGO | S_IWUSR, | 906 | .mode = S_IRUGO | S_IWUSR, |
910 | .proc_handler = &s390dbf_procactive, | 907 | .proc_handler = s390dbf_procactive, |
911 | .strategy = &sysctl_intvec, | ||
912 | }, | 908 | }, |
913 | { .ctl_name = 0 } | 909 | { } |
914 | }; | 910 | }; |
915 | 911 | ||
916 | static struct ctl_table s390dbf_dir_table[] = { | 912 | static struct ctl_table s390dbf_dir_table[] = { |
917 | { | 913 | { |
918 | .ctl_name = CTL_S390DBF, | ||
919 | .procname = "s390dbf", | 914 | .procname = "s390dbf", |
920 | .maxlen = 0, | 915 | .maxlen = 0, |
921 | .mode = S_IRUGO | S_IXUGO, | 916 | .mode = S_IRUGO | S_IXUGO, |
922 | .child = s390dbf_table, | 917 | .child = s390dbf_table, |
923 | }, | 918 | }, |
924 | { .ctl_name = 0 } | 919 | { } |
925 | }; | 920 | }; |
926 | 921 | ||
927 | static struct ctl_table_header *s390dbf_sysctl_header; | 922 | static struct ctl_table_header *s390dbf_sysctl_header; |
diff --git a/arch/s390/kernel/s390_ext.c b/arch/s390/kernel/s390_ext.c index 0de305b598ce..59618bcd99b7 100644 --- a/arch/s390/kernel/s390_ext.c +++ b/arch/s390/kernel/s390_ext.c | |||
@@ -126,6 +126,8 @@ void __irq_entry do_extint(struct pt_regs *regs, unsigned short code) | |||
126 | /* Serve timer interrupts first. */ | 126 | /* Serve timer interrupts first. */ |
127 | clock_comparator_work(); | 127 | clock_comparator_work(); |
128 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; | 128 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; |
129 | if (code != 0x1004) | ||
130 | __get_cpu_var(s390_idle).nohz_delay = 1; | ||
129 | index = ext_hash(code); | 131 | index = ext_hash(code); |
130 | for (p = ext_int_hash[index]; p; p = p->next) { | 132 | for (p = ext_int_hash[index]; p; p = p->next) { |
131 | if (likely(p->code == code)) | 133 | if (likely(p->code == code)) |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 75cdc0d02415..65065ac48ed3 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -214,7 +214,8 @@ struct clocksource * __init clocksource_default_clock(void) | |||
214 | return &clocksource_tod; | 214 | return &clocksource_tod; |
215 | } | 215 | } |
216 | 216 | ||
217 | void update_vsyscall(struct timespec *wall_time, struct clocksource *clock) | 217 | void update_vsyscall(struct timespec *wall_time, struct clocksource *clock, |
218 | u32 mult) | ||
218 | { | 219 | { |
219 | if (clock != &clocksource_tod) | 220 | if (clock != &clocksource_tod) |
220 | return; | 221 | return; |
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index c41bb0d416e1..b59a812a010e 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
@@ -167,6 +167,8 @@ void vtime_stop_cpu(void) | |||
167 | /* Wait for external, I/O or machine check interrupt. */ | 167 | /* Wait for external, I/O or machine check interrupt. */ |
168 | psw.mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_IO | PSW_MASK_EXT; | 168 | psw.mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_IO | PSW_MASK_EXT; |
169 | 169 | ||
170 | idle->nohz_delay = 0; | ||
171 | |||
170 | /* Check if the CPU timer needs to be reprogrammed. */ | 172 | /* Check if the CPU timer needs to be reprogrammed. */ |
171 | if (vq->do_spt) { | 173 | if (vq->do_spt) { |
172 | __u64 vmax = VTIMER_MAX_SLICE; | 174 | __u64 vmax = VTIMER_MAX_SLICE; |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 07ced89740d7..f8bcaefd7d34 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -74,9 +74,10 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { | |||
74 | static unsigned long long *facilities; | 74 | static unsigned long long *facilities; |
75 | 75 | ||
76 | /* Section: not file related */ | 76 | /* Section: not file related */ |
77 | void kvm_arch_hardware_enable(void *garbage) | 77 | int kvm_arch_hardware_enable(void *garbage) |
78 | { | 78 | { |
79 | /* every s390 is virtualization enabled ;-) */ | 79 | /* every s390 is virtualization enabled ;-) */ |
80 | return 0; | ||
80 | } | 81 | } |
81 | 82 | ||
82 | void kvm_arch_hardware_disable(void *garbage) | 83 | void kvm_arch_hardware_disable(void *garbage) |
@@ -116,10 +117,16 @@ long kvm_arch_dev_ioctl(struct file *filp, | |||
116 | 117 | ||
117 | int kvm_dev_ioctl_check_extension(long ext) | 118 | int kvm_dev_ioctl_check_extension(long ext) |
118 | { | 119 | { |
120 | int r; | ||
121 | |||
119 | switch (ext) { | 122 | switch (ext) { |
123 | case KVM_CAP_S390_PSW: | ||
124 | r = 1; | ||
125 | break; | ||
120 | default: | 126 | default: |
121 | return 0; | 127 | r = 0; |
122 | } | 128 | } |
129 | return r; | ||
123 | } | 130 | } |
124 | 131 | ||
125 | /* Section: vm related */ | 132 | /* Section: vm related */ |
@@ -150,7 +157,7 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
150 | break; | 157 | break; |
151 | } | 158 | } |
152 | default: | 159 | default: |
153 | r = -EINVAL; | 160 | r = -ENOTTY; |
154 | } | 161 | } |
155 | 162 | ||
156 | return r; | 163 | return r; |
@@ -419,8 +426,10 @@ static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw) | |||
419 | vcpu_load(vcpu); | 426 | vcpu_load(vcpu); |
420 | if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING) | 427 | if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING) |
421 | rc = -EBUSY; | 428 | rc = -EBUSY; |
422 | else | 429 | else { |
423 | vcpu->arch.sie_block->gpsw = psw; | 430 | vcpu->run->psw_mask = psw.mask; |
431 | vcpu->run->psw_addr = psw.addr; | ||
432 | } | ||
424 | vcpu_put(vcpu); | 433 | vcpu_put(vcpu); |
425 | return rc; | 434 | return rc; |
426 | } | 435 | } |
@@ -508,9 +517,6 @@ rerun_vcpu: | |||
508 | 517 | ||
509 | switch (kvm_run->exit_reason) { | 518 | switch (kvm_run->exit_reason) { |
510 | case KVM_EXIT_S390_SIEIC: | 519 | case KVM_EXIT_S390_SIEIC: |
511 | vcpu->arch.sie_block->gpsw.mask = kvm_run->s390_sieic.mask; | ||
512 | vcpu->arch.sie_block->gpsw.addr = kvm_run->s390_sieic.addr; | ||
513 | break; | ||
514 | case KVM_EXIT_UNKNOWN: | 520 | case KVM_EXIT_UNKNOWN: |
515 | case KVM_EXIT_INTR: | 521 | case KVM_EXIT_INTR: |
516 | case KVM_EXIT_S390_RESET: | 522 | case KVM_EXIT_S390_RESET: |
@@ -519,6 +525,9 @@ rerun_vcpu: | |||
519 | BUG(); | 525 | BUG(); |
520 | } | 526 | } |
521 | 527 | ||
528 | vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask; | ||
529 | vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr; | ||
530 | |||
522 | might_fault(); | 531 | might_fault(); |
523 | 532 | ||
524 | do { | 533 | do { |
@@ -538,8 +547,6 @@ rerun_vcpu: | |||
538 | /* intercept cannot be handled in-kernel, prepare kvm-run */ | 547 | /* intercept cannot be handled in-kernel, prepare kvm-run */ |
539 | kvm_run->exit_reason = KVM_EXIT_S390_SIEIC; | 548 | kvm_run->exit_reason = KVM_EXIT_S390_SIEIC; |
540 | kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode; | 549 | kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode; |
541 | kvm_run->s390_sieic.mask = vcpu->arch.sie_block->gpsw.mask; | ||
542 | kvm_run->s390_sieic.addr = vcpu->arch.sie_block->gpsw.addr; | ||
543 | kvm_run->s390_sieic.ipa = vcpu->arch.sie_block->ipa; | 550 | kvm_run->s390_sieic.ipa = vcpu->arch.sie_block->ipa; |
544 | kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb; | 551 | kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb; |
545 | rc = 0; | 552 | rc = 0; |
@@ -551,6 +558,9 @@ rerun_vcpu: | |||
551 | rc = 0; | 558 | rc = 0; |
552 | } | 559 | } |
553 | 560 | ||
561 | kvm_run->psw_mask = vcpu->arch.sie_block->gpsw.mask; | ||
562 | kvm_run->psw_addr = vcpu->arch.sie_block->gpsw.addr; | ||
563 | |||
554 | if (vcpu->sigset_active) | 564 | if (vcpu->sigset_active) |
555 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | 565 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); |
556 | 566 | ||
diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c index 40c8c6748cfe..15ee1111de58 100644 --- a/arch/s390/kvm/sigp.c +++ b/arch/s390/kvm/sigp.c | |||
@@ -188,9 +188,9 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address, | |||
188 | 188 | ||
189 | /* make sure that the new value is valid memory */ | 189 | /* make sure that the new value is valid memory */ |
190 | address = address & 0x7fffe000u; | 190 | address = address & 0x7fffe000u; |
191 | if ((copy_from_guest(vcpu, &tmp, | 191 | if ((copy_from_user(&tmp, (void __user *) |
192 | (u64) (address + vcpu->arch.sie_block->gmsor) , 1)) || | 192 | (address + vcpu->arch.sie_block->gmsor) , 1)) || |
193 | (copy_from_guest(vcpu, &tmp, (u64) (address + | 193 | (copy_from_user(&tmp, (void __user *)(address + |
194 | vcpu->arch.sie_block->gmsor + PAGE_SIZE), 1))) { | 194 | vcpu->arch.sie_block->gmsor + PAGE_SIZE), 1))) { |
195 | *reg |= SIGP_STAT_INVALID_PARAMETER; | 195 | *reg |= SIGP_STAT_INVALID_PARAMETER; |
196 | return 1; /* invalid parameter */ | 196 | return 1; /* invalid parameter */ |
diff --git a/arch/s390/mm/cmm.c b/arch/s390/mm/cmm.c index 5e5f3849660f..76a3637b88e0 100644 --- a/arch/s390/mm/cmm.c +++ b/arch/s390/mm/cmm.c | |||
@@ -345,30 +345,29 @@ static struct ctl_table cmm_table[] = { | |||
345 | { | 345 | { |
346 | .procname = "cmm_pages", | 346 | .procname = "cmm_pages", |
347 | .mode = 0644, | 347 | .mode = 0644, |
348 | .proc_handler = &cmm_pages_handler, | 348 | .proc_handler = cmm_pages_handler, |
349 | }, | 349 | }, |
350 | { | 350 | { |
351 | .procname = "cmm_timed_pages", | 351 | .procname = "cmm_timed_pages", |
352 | .mode = 0644, | 352 | .mode = 0644, |
353 | .proc_handler = &cmm_pages_handler, | 353 | .proc_handler = cmm_pages_handler, |
354 | }, | 354 | }, |
355 | { | 355 | { |
356 | .procname = "cmm_timeout", | 356 | .procname = "cmm_timeout", |
357 | .mode = 0644, | 357 | .mode = 0644, |
358 | .proc_handler = &cmm_timeout_handler, | 358 | .proc_handler = cmm_timeout_handler, |
359 | }, | 359 | }, |
360 | { .ctl_name = 0 } | 360 | { } |
361 | }; | 361 | }; |
362 | 362 | ||
363 | static struct ctl_table cmm_dir_table[] = { | 363 | static struct ctl_table cmm_dir_table[] = { |
364 | { | 364 | { |
365 | .ctl_name = CTL_VM, | ||
366 | .procname = "vm", | 365 | .procname = "vm", |
367 | .maxlen = 0, | 366 | .maxlen = 0, |
368 | .mode = 0555, | 367 | .mode = 0555, |
369 | .child = cmm_table, | 368 | .child = cmm_table, |
370 | }, | 369 | }, |
371 | { .ctl_name = 0 } | 370 | { } |
372 | }; | 371 | }; |
373 | #endif | 372 | #endif |
374 | 373 | ||