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] cmpxchg: implement cmpxchg64()
[S390] xchg/cmpxchg: move to own header file
[S390] ccwgroup_driver: remove duplicate members
[S390] ccw_bus_type: make it static
[S390] ccw_driver: remove duplicate members
[S390] qdio: prevent handling of buffers if count is zero
[S390] setup: register bss section as resource
[S390] setup: simplify setup_resources()
[S390] wire up sys_syncfs
[S390] wire up sys_clock_adjtime
[S390] wire up sys_open_by_handle_at
[S390] wire up sys_name_to_handle_at
[S390] oprofile: disable hw sampling for CONFIG_32BIT
[S390] early: limit savesys cmd string handling
[S390] early: Fix possible overlapping data buffer

+403 -306
-4
arch/s390/include/asm/ccwdev.h
··· 112 112 113 113 /** 114 114 * struct ccw driver - device driver for channel attached devices 115 - * @owner: owning module 116 115 * @ids: ids supported by this driver 117 116 * @probe: function called on probe 118 117 * @remove: function called on remove ··· 127 128 * @restore: callback for restoring after hibernation 128 129 * @uc_handler: callback for unit check handler 129 130 * @driver: embedded device driver structure 130 - * @name: device driver name 131 131 */ 132 132 struct ccw_driver { 133 - struct module *owner; 134 133 struct ccw_device_id *ids; 135 134 int (*probe) (struct ccw_device *); 136 135 void (*remove) (struct ccw_device *); ··· 144 147 int (*restore)(struct ccw_device *); 145 148 enum uc_todo (*uc_handler) (struct ccw_device *, struct irb *); 146 149 struct device_driver driver; 147 - char *name; 148 150 }; 149 151 150 152 extern struct ccw_device *get_ccwdev_by_busid(struct ccw_driver *cdrv,
-4
arch/s390/include/asm/ccwgroup.h
··· 29 29 30 30 /** 31 31 * struct ccwgroup_driver - driver for ccw group devices 32 - * @owner: driver owner 33 - * @name: driver name 34 32 * @max_slaves: maximum number of slave devices 35 33 * @driver_id: unique id 36 34 * @probe: function called on probe ··· 44 46 * @driver: embedded driver structure 45 47 */ 46 48 struct ccwgroup_driver { 47 - struct module *owner; 48 - char *name; 49 49 int max_slaves; 50 50 unsigned long driver_id; 51 51
+225
arch/s390/include/asm/cmpxchg.h
··· 1 + /* 2 + * Copyright IBM Corp. 1999, 2011 3 + * 4 + * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>, 5 + */ 6 + 7 + #ifndef __ASM_CMPXCHG_H 8 + #define __ASM_CMPXCHG_H 9 + 10 + #include <linux/types.h> 11 + 12 + extern void __xchg_called_with_bad_pointer(void); 13 + 14 + static inline unsigned long __xchg(unsigned long x, void *ptr, int size) 15 + { 16 + unsigned long addr, old; 17 + int shift; 18 + 19 + switch (size) { 20 + case 1: 21 + addr = (unsigned long) ptr; 22 + shift = (3 ^ (addr & 3)) << 3; 23 + addr ^= addr & 3; 24 + asm volatile( 25 + " l %0,%4\n" 26 + "0: lr 0,%0\n" 27 + " nr 0,%3\n" 28 + " or 0,%2\n" 29 + " cs %0,0,%4\n" 30 + " jl 0b\n" 31 + : "=&d" (old), "=Q" (*(int *) addr) 32 + : "d" (x << shift), "d" (~(255 << shift)), 33 + "Q" (*(int *) addr) : "memory", "cc", "0"); 34 + return old >> shift; 35 + case 2: 36 + addr = (unsigned long) ptr; 37 + shift = (2 ^ (addr & 2)) << 3; 38 + addr ^= addr & 2; 39 + asm volatile( 40 + " l %0,%4\n" 41 + "0: lr 0,%0\n" 42 + " nr 0,%3\n" 43 + " or 0,%2\n" 44 + " cs %0,0,%4\n" 45 + " jl 0b\n" 46 + : "=&d" (old), "=Q" (*(int *) addr) 47 + : "d" (x << shift), "d" (~(65535 << shift)), 48 + "Q" (*(int *) addr) : "memory", "cc", "0"); 49 + return old >> shift; 50 + case 4: 51 + asm volatile( 52 + " l %0,%3\n" 53 + "0: cs %0,%2,%3\n" 54 + " jl 0b\n" 55 + : "=&d" (old), "=Q" (*(int *) ptr) 56 + : "d" (x), "Q" (*(int *) ptr) 57 + : "memory", "cc"); 58 + return old; 59 + #ifdef CONFIG_64BIT 60 + case 8: 61 + asm volatile( 62 + " lg %0,%3\n" 63 + "0: csg %0,%2,%3\n" 64 + " jl 0b\n" 65 + : "=&d" (old), "=m" (*(long *) ptr) 66 + : "d" (x), "Q" (*(long *) ptr) 67 + : "memory", "cc"); 68 + return old; 69 + #endif /* CONFIG_64BIT */ 70 + } 71 + __xchg_called_with_bad_pointer(); 72 + return x; 73 + } 74 + 75 + #define xchg(ptr, x) \ 76 + ({ \ 77 + __typeof__(*(ptr)) __ret; \ 78 + __ret = (__typeof__(*(ptr))) \ 79 + __xchg((unsigned long)(x), (void *)(ptr), sizeof(*(ptr)));\ 80 + __ret; \ 81 + }) 82 + 83 + /* 84 + * Atomic compare and exchange. Compare OLD with MEM, if identical, 85 + * store NEW in MEM. Return the initial value in MEM. Success is 86 + * indicated by comparing RETURN with OLD. 87 + */ 88 + 89 + #define __HAVE_ARCH_CMPXCHG 90 + 91 + extern void __cmpxchg_called_with_bad_pointer(void); 92 + 93 + static inline unsigned long __cmpxchg(void *ptr, unsigned long old, 94 + unsigned long new, int size) 95 + { 96 + unsigned long addr, prev, tmp; 97 + int shift; 98 + 99 + switch (size) { 100 + case 1: 101 + addr = (unsigned long) ptr; 102 + shift = (3 ^ (addr & 3)) << 3; 103 + addr ^= addr & 3; 104 + asm volatile( 105 + " l %0,%2\n" 106 + "0: nr %0,%5\n" 107 + " lr %1,%0\n" 108 + " or %0,%3\n" 109 + " or %1,%4\n" 110 + " cs %0,%1,%2\n" 111 + " jnl 1f\n" 112 + " xr %1,%0\n" 113 + " nr %1,%5\n" 114 + " jnz 0b\n" 115 + "1:" 116 + : "=&d" (prev), "=&d" (tmp), "=Q" (*(int *) ptr) 117 + : "d" (old << shift), "d" (new << shift), 118 + "d" (~(255 << shift)), "Q" (*(int *) ptr) 119 + : "memory", "cc"); 120 + return prev >> shift; 121 + case 2: 122 + addr = (unsigned long) ptr; 123 + shift = (2 ^ (addr & 2)) << 3; 124 + addr ^= addr & 2; 125 + asm volatile( 126 + " l %0,%2\n" 127 + "0: nr %0,%5\n" 128 + " lr %1,%0\n" 129 + " or %0,%3\n" 130 + " or %1,%4\n" 131 + " cs %0,%1,%2\n" 132 + " jnl 1f\n" 133 + " xr %1,%0\n" 134 + " nr %1,%5\n" 135 + " jnz 0b\n" 136 + "1:" 137 + : "=&d" (prev), "=&d" (tmp), "=Q" (*(int *) ptr) 138 + : "d" (old << shift), "d" (new << shift), 139 + "d" (~(65535 << shift)), "Q" (*(int *) ptr) 140 + : "memory", "cc"); 141 + return prev >> shift; 142 + case 4: 143 + asm volatile( 144 + " cs %0,%3,%1\n" 145 + : "=&d" (prev), "=Q" (*(int *) ptr) 146 + : "0" (old), "d" (new), "Q" (*(int *) ptr) 147 + : "memory", "cc"); 148 + return prev; 149 + #ifdef CONFIG_64BIT 150 + case 8: 151 + asm volatile( 152 + " csg %0,%3,%1\n" 153 + : "=&d" (prev), "=Q" (*(long *) ptr) 154 + : "0" (old), "d" (new), "Q" (*(long *) ptr) 155 + : "memory", "cc"); 156 + return prev; 157 + #endif /* CONFIG_64BIT */ 158 + } 159 + __cmpxchg_called_with_bad_pointer(); 160 + return old; 161 + } 162 + 163 + #define cmpxchg(ptr, o, n) \ 164 + ((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \ 165 + (unsigned long)(n), sizeof(*(ptr)))) 166 + 167 + #ifdef CONFIG_64BIT 168 + #define cmpxchg64(ptr, o, n) \ 169 + ({ \ 170 + BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ 171 + cmpxchg((ptr), (o), (n)); \ 172 + }) 173 + #else /* CONFIG_64BIT */ 174 + static inline unsigned long long __cmpxchg64(void *ptr, 175 + unsigned long long old, 176 + unsigned long long new) 177 + { 178 + register_pair rp_old = {.pair = old}; 179 + register_pair rp_new = {.pair = new}; 180 + 181 + asm volatile( 182 + " cds %0,%2,%1" 183 + : "+&d" (rp_old), "=Q" (ptr) 184 + : "d" (rp_new), "Q" (ptr) 185 + : "cc"); 186 + return rp_old.pair; 187 + } 188 + #define cmpxchg64(ptr, o, n) \ 189 + ((__typeof__(*(ptr)))__cmpxchg64((ptr), \ 190 + (unsigned long long)(o), \ 191 + (unsigned long long)(n))) 192 + #endif /* CONFIG_64BIT */ 193 + 194 + #include <asm-generic/cmpxchg-local.h> 195 + 196 + static inline unsigned long __cmpxchg_local(void *ptr, 197 + unsigned long old, 198 + unsigned long new, int size) 199 + { 200 + switch (size) { 201 + case 1: 202 + case 2: 203 + case 4: 204 + #ifdef CONFIG_64BIT 205 + case 8: 206 + #endif 207 + return __cmpxchg(ptr, old, new, size); 208 + default: 209 + return __cmpxchg_local_generic(ptr, old, new, size); 210 + } 211 + 212 + return old; 213 + } 214 + 215 + /* 216 + * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make 217 + * them available. 218 + */ 219 + #define cmpxchg_local(ptr, o, n) \ 220 + ((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \ 221 + (unsigned long)(n), sizeof(*(ptr)))) 222 + 223 + #define cmpxchg64_local(ptr, o, n) cmpxchg64((ptr), (o), (n)) 224 + 225 + #endif /* __ASM_CMPXCHG_H */
+1 -195
arch/s390/include/asm/system.h
··· 14 14 #include <asm/setup.h> 15 15 #include <asm/processor.h> 16 16 #include <asm/lowcore.h> 17 + #include <asm/cmpxchg.h> 17 18 18 19 #ifdef __KERNEL__ 19 20 ··· 121 120 122 121 #define nop() asm volatile("nop") 123 122 124 - #define xchg(ptr,x) \ 125 - ({ \ 126 - __typeof__(*(ptr)) __ret; \ 127 - __ret = (__typeof__(*(ptr))) \ 128 - __xchg((unsigned long)(x), (void *)(ptr),sizeof(*(ptr))); \ 129 - __ret; \ 130 - }) 131 - 132 - extern void __xchg_called_with_bad_pointer(void); 133 - 134 - static inline unsigned long __xchg(unsigned long x, void * ptr, int size) 135 - { 136 - unsigned long addr, old; 137 - int shift; 138 - 139 - switch (size) { 140 - case 1: 141 - addr = (unsigned long) ptr; 142 - shift = (3 ^ (addr & 3)) << 3; 143 - addr ^= addr & 3; 144 - asm volatile( 145 - " l %0,%4\n" 146 - "0: lr 0,%0\n" 147 - " nr 0,%3\n" 148 - " or 0,%2\n" 149 - " cs %0,0,%4\n" 150 - " jl 0b\n" 151 - : "=&d" (old), "=Q" (*(int *) addr) 152 - : "d" (x << shift), "d" (~(255 << shift)), 153 - "Q" (*(int *) addr) : "memory", "cc", "0"); 154 - return old >> shift; 155 - case 2: 156 - addr = (unsigned long) ptr; 157 - shift = (2 ^ (addr & 2)) << 3; 158 - addr ^= addr & 2; 159 - asm volatile( 160 - " l %0,%4\n" 161 - "0: lr 0,%0\n" 162 - " nr 0,%3\n" 163 - " or 0,%2\n" 164 - " cs %0,0,%4\n" 165 - " jl 0b\n" 166 - : "=&d" (old), "=Q" (*(int *) addr) 167 - : "d" (x << shift), "d" (~(65535 << shift)), 168 - "Q" (*(int *) addr) : "memory", "cc", "0"); 169 - return old >> shift; 170 - case 4: 171 - asm volatile( 172 - " l %0,%3\n" 173 - "0: cs %0,%2,%3\n" 174 - " jl 0b\n" 175 - : "=&d" (old), "=Q" (*(int *) ptr) 176 - : "d" (x), "Q" (*(int *) ptr) 177 - : "memory", "cc"); 178 - return old; 179 - #ifdef __s390x__ 180 - case 8: 181 - asm volatile( 182 - " lg %0,%3\n" 183 - "0: csg %0,%2,%3\n" 184 - " jl 0b\n" 185 - : "=&d" (old), "=m" (*(long *) ptr) 186 - : "d" (x), "Q" (*(long *) ptr) 187 - : "memory", "cc"); 188 - return old; 189 - #endif /* __s390x__ */ 190 - } 191 - __xchg_called_with_bad_pointer(); 192 - return x; 193 - } 194 - 195 - /* 196 - * Atomic compare and exchange. Compare OLD with MEM, if identical, 197 - * store NEW in MEM. Return the initial value in MEM. Success is 198 - * indicated by comparing RETURN with OLD. 199 - */ 200 - 201 - #define __HAVE_ARCH_CMPXCHG 1 202 - 203 - #define cmpxchg(ptr, o, n) \ 204 - ((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \ 205 - (unsigned long)(n), sizeof(*(ptr)))) 206 - 207 - extern void __cmpxchg_called_with_bad_pointer(void); 208 - 209 - static inline unsigned long 210 - __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) 211 - { 212 - unsigned long addr, prev, tmp; 213 - int shift; 214 - 215 - switch (size) { 216 - case 1: 217 - addr = (unsigned long) ptr; 218 - shift = (3 ^ (addr & 3)) << 3; 219 - addr ^= addr & 3; 220 - asm volatile( 221 - " l %0,%2\n" 222 - "0: nr %0,%5\n" 223 - " lr %1,%0\n" 224 - " or %0,%3\n" 225 - " or %1,%4\n" 226 - " cs %0,%1,%2\n" 227 - " jnl 1f\n" 228 - " xr %1,%0\n" 229 - " nr %1,%5\n" 230 - " jnz 0b\n" 231 - "1:" 232 - : "=&d" (prev), "=&d" (tmp), "=Q" (*(int *) ptr) 233 - : "d" (old << shift), "d" (new << shift), 234 - "d" (~(255 << shift)), "Q" (*(int *) ptr) 235 - : "memory", "cc"); 236 - return prev >> shift; 237 - case 2: 238 - addr = (unsigned long) ptr; 239 - shift = (2 ^ (addr & 2)) << 3; 240 - addr ^= addr & 2; 241 - asm volatile( 242 - " l %0,%2\n" 243 - "0: nr %0,%5\n" 244 - " lr %1,%0\n" 245 - " or %0,%3\n" 246 - " or %1,%4\n" 247 - " cs %0,%1,%2\n" 248 - " jnl 1f\n" 249 - " xr %1,%0\n" 250 - " nr %1,%5\n" 251 - " jnz 0b\n" 252 - "1:" 253 - : "=&d" (prev), "=&d" (tmp), "=Q" (*(int *) ptr) 254 - : "d" (old << shift), "d" (new << shift), 255 - "d" (~(65535 << shift)), "Q" (*(int *) ptr) 256 - : "memory", "cc"); 257 - return prev >> shift; 258 - case 4: 259 - asm volatile( 260 - " cs %0,%3,%1\n" 261 - : "=&d" (prev), "=Q" (*(int *) ptr) 262 - : "0" (old), "d" (new), "Q" (*(int *) ptr) 263 - : "memory", "cc"); 264 - return prev; 265 - #ifdef __s390x__ 266 - case 8: 267 - asm volatile( 268 - " csg %0,%3,%1\n" 269 - : "=&d" (prev), "=Q" (*(long *) ptr) 270 - : "0" (old), "d" (new), "Q" (*(long *) ptr) 271 - : "memory", "cc"); 272 - return prev; 273 - #endif /* __s390x__ */ 274 - } 275 - __cmpxchg_called_with_bad_pointer(); 276 - return old; 277 - } 278 - 279 123 /* 280 124 * Force strict CPU ordering. 281 125 * And yes, this is required on UP too when we're talking ··· 198 352 __dummy &= ~(1UL << (bit)); \ 199 353 __ctl_load(__dummy, cr, cr); \ 200 354 }) 201 - 202 - #include <linux/irqflags.h> 203 - 204 - #include <asm-generic/cmpxchg-local.h> 205 - 206 - static inline unsigned long __cmpxchg_local(volatile void *ptr, 207 - unsigned long old, 208 - unsigned long new, int size) 209 - { 210 - switch (size) { 211 - case 1: 212 - case 2: 213 - case 4: 214 - #ifdef __s390x__ 215 - case 8: 216 - #endif 217 - return __cmpxchg(ptr, old, new, size); 218 - default: 219 - return __cmpxchg_local_generic(ptr, old, new, size); 220 - } 221 - 222 - return old; 223 - } 224 - 225 - /* 226 - * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make 227 - * them available. 228 - */ 229 - #define cmpxchg_local(ptr, o, n) \ 230 - ((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \ 231 - (unsigned long)(n), sizeof(*(ptr)))) 232 - #ifdef __s390x__ 233 - #define cmpxchg64_local(ptr, o, n) \ 234 - ({ \ 235 - BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ 236 - cmpxchg_local((ptr), (o), (n)); \ 237 - }) 238 - #else 239 - #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) 240 - #endif 241 355 242 356 /* 243 357 * Use to set psw mask except for the first byte which
+5 -1
arch/s390/include/asm/unistd.h
··· 272 272 #define __NR_fanotify_init 332 273 273 #define __NR_fanotify_mark 333 274 274 #define __NR_prlimit64 334 275 - #define NR_syscalls 335 275 + #define __NR_name_to_handle_at 335 276 + #define __NR_open_by_handle_at 336 277 + #define __NR_clock_adjtime 337 278 + #define __NR_syncfs 338 279 + #define NR_syscalls 339 276 280 277 281 /* 278 282 * There are some system calls that are not present on 64 bit, some
+27
arch/s390/kernel/compat_wrapper.S
··· 1877 1877 llgtr %r4,%r4 # const struct rlimit64 __user * 1878 1878 llgtr %r5,%r5 # struct rlimit64 __user * 1879 1879 jg sys_prlimit64 # branch to system call 1880 + 1881 + .globl sys_name_to_handle_at_wrapper 1882 + sys_name_to_handle_at_wrapper: 1883 + lgfr %r2,%r2 # int 1884 + llgtr %r3,%r3 # const char __user * 1885 + llgtr %r4,%r4 # struct file_handle __user * 1886 + llgtr %r5,%r5 # int __user * 1887 + lgfr %r6,%r6 # int 1888 + jg sys_name_to_handle_at 1889 + 1890 + .globl compat_sys_open_by_handle_at_wrapper 1891 + compat_sys_open_by_handle_at_wrapper: 1892 + lgfr %r2,%r2 # int 1893 + llgtr %r3,%r3 # struct file_handle __user * 1894 + lgfr %r4,%r4 # int 1895 + jg compat_sys_open_by_handle_at 1896 + 1897 + .globl compat_sys_clock_adjtime_wrapper 1898 + compat_sys_clock_adjtime_wrapper: 1899 + lgfr %r2,%r2 # clockid_t (int) 1900 + llgtr %r3,%r3 # struct compat_timex __user * 1901 + jg compat_sys_clock_adjtime 1902 + 1903 + .globl sys_syncfs_wrapper 1904 + sys_syncfs_wrapper: 1905 + lgfr %r2,%r2 # int 1906 + jg sys_syncfs
+13 -9
arch/s390/kernel/early.c
··· 94 94 unsigned int sinitrd_pfn, einitrd_pfn; 95 95 #endif 96 96 int response; 97 + int hlen; 97 98 size_t len; 98 99 char *savesys_ptr; 99 100 char defsys_cmd[DEFSYS_CMD_SIZE]; ··· 125 124 end_pfn = PFN_UP(__pa(&_end)); 126 125 min_size = end_pfn << 2; 127 126 128 - sprintf(defsys_cmd, "DEFSYS %s 00000-%.5X EW %.5X-%.5X SR %.5X-%.5X", 129 - kernel_nss_name, stext_pfn - 1, stext_pfn, eshared_pfn - 1, 130 - eshared_pfn, end_pfn); 127 + hlen = snprintf(defsys_cmd, DEFSYS_CMD_SIZE, 128 + "DEFSYS %s 00000-%.5X EW %.5X-%.5X SR %.5X-%.5X", 129 + kernel_nss_name, stext_pfn - 1, stext_pfn, 130 + eshared_pfn - 1, eshared_pfn, end_pfn); 131 131 132 132 #ifdef CONFIG_BLK_DEV_INITRD 133 133 if (INITRD_START && INITRD_SIZE) { 134 134 sinitrd_pfn = PFN_DOWN(__pa(INITRD_START)); 135 135 einitrd_pfn = PFN_UP(__pa(INITRD_START + INITRD_SIZE)); 136 136 min_size = einitrd_pfn << 2; 137 - sprintf(defsys_cmd, "%s EW %.5X-%.5X", defsys_cmd, 138 - sinitrd_pfn, einitrd_pfn); 137 + hlen += snprintf(defsys_cmd + hlen, DEFSYS_CMD_SIZE - hlen, 138 + " EW %.5X-%.5X", sinitrd_pfn, einitrd_pfn); 139 139 } 140 140 #endif 141 141 142 - sprintf(defsys_cmd, "%s EW MINSIZE=%.7iK PARMREGS=0-13", 143 - defsys_cmd, min_size); 144 - sprintf(savesys_cmd, "SAVESYS %s \n IPL %s", 145 - kernel_nss_name, kernel_nss_name); 142 + snprintf(defsys_cmd + hlen, DEFSYS_CMD_SIZE - hlen, 143 + " EW MINSIZE=%.7iK PARMREGS=0-13", min_size); 144 + defsys_cmd[DEFSYS_CMD_SIZE - 1] = '\0'; 145 + snprintf(savesys_cmd, SAVESYS_CMD_SIZE, "SAVESYS %s \n IPL %s", 146 + kernel_nss_name, kernel_nss_name); 147 + savesys_cmd[SAVESYS_CMD_SIZE - 1] = '\0'; 146 148 147 149 __cpcmd(defsys_cmd, NULL, 0, &response); 148 150
+42 -46
arch/s390/kernel/setup.c
··· 102 102 103 103 #include <asm/setup.h> 104 104 105 - static struct resource code_resource = { 106 - .name = "Kernel code", 107 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 108 - }; 109 - 110 - static struct resource data_resource = { 111 - .name = "Kernel data", 112 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 113 - }; 114 - 115 105 /* 116 106 * condev= and conmode= setup parameter. 117 107 */ ··· 426 436 lowcore_ptr[0] = lc; 427 437 } 428 438 429 - static void __init 430 - setup_resources(void) 439 + static struct resource code_resource = { 440 + .name = "Kernel code", 441 + .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 442 + }; 443 + 444 + static struct resource data_resource = { 445 + .name = "Kernel data", 446 + .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 447 + }; 448 + 449 + static struct resource bss_resource = { 450 + .name = "Kernel bss", 451 + .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 452 + }; 453 + 454 + static struct resource __initdata *standard_resources[] = { 455 + &code_resource, 456 + &data_resource, 457 + &bss_resource, 458 + }; 459 + 460 + static void __init setup_resources(void) 431 461 { 432 - struct resource *res, *sub_res; 433 - int i; 462 + struct resource *res, *std_res, *sub_res; 463 + int i, j; 434 464 435 465 code_resource.start = (unsigned long) &_text; 436 466 code_resource.end = (unsigned long) &_etext - 1; 437 467 data_resource.start = (unsigned long) &_etext; 438 468 data_resource.end = (unsigned long) &_edata - 1; 469 + bss_resource.start = (unsigned long) &__bss_start; 470 + bss_resource.end = (unsigned long) &__bss_stop - 1; 439 471 440 472 for (i = 0; i < MEMORY_CHUNKS; i++) { 441 473 if (!memory_chunk[i].size) 442 474 continue; 443 - res = alloc_bootmem_low(sizeof(struct resource)); 475 + res = alloc_bootmem_low(sizeof(*res)); 444 476 res->flags = IORESOURCE_BUSY | IORESOURCE_MEM; 445 477 switch (memory_chunk[i].type) { 446 478 case CHUNK_READ_WRITE: ··· 476 464 res->name = "reserved"; 477 465 } 478 466 res->start = memory_chunk[i].addr; 479 - res->end = memory_chunk[i].addr + memory_chunk[i].size - 1; 467 + res->end = res->start + memory_chunk[i].size - 1; 480 468 request_resource(&iomem_resource, res); 481 469 482 - if (code_resource.start >= res->start && 483 - code_resource.start <= res->end && 484 - code_resource.end > res->end) { 485 - sub_res = alloc_bootmem_low(sizeof(struct resource)); 486 - memcpy(sub_res, &code_resource, 487 - sizeof(struct resource)); 488 - sub_res->end = res->end; 489 - code_resource.start = res->end + 1; 490 - request_resource(res, sub_res); 470 + for (j = 0; j < ARRAY_SIZE(standard_resources); j++) { 471 + std_res = standard_resources[j]; 472 + if (std_res->start < res->start || 473 + std_res->start > res->end) 474 + continue; 475 + if (std_res->end > res->end) { 476 + sub_res = alloc_bootmem_low(sizeof(*sub_res)); 477 + *sub_res = *std_res; 478 + sub_res->end = res->end; 479 + std_res->start = res->end + 1; 480 + request_resource(res, sub_res); 481 + } else { 482 + request_resource(res, std_res); 483 + } 491 484 } 492 - 493 - if (code_resource.start >= res->start && 494 - code_resource.start <= res->end && 495 - code_resource.end <= res->end) 496 - request_resource(res, &code_resource); 497 - 498 - if (data_resource.start >= res->start && 499 - data_resource.start <= res->end && 500 - data_resource.end > res->end) { 501 - sub_res = alloc_bootmem_low(sizeof(struct resource)); 502 - memcpy(sub_res, &data_resource, 503 - sizeof(struct resource)); 504 - sub_res->end = res->end; 505 - data_resource.start = res->end + 1; 506 - request_resource(res, sub_res); 507 - } 508 - 509 - if (data_resource.start >= res->start && 510 - data_resource.start <= res->end && 511 - data_resource.end <= res->end) 512 - request_resource(res, &data_resource); 513 485 } 514 486 } 515 487
+4
arch/s390/kernel/syscalls.S
··· 343 343 SYSCALL(sys_fanotify_init,sys_fanotify_init,sys_fanotify_init_wrapper) 344 344 SYSCALL(sys_fanotify_mark,sys_fanotify_mark,sys_fanotify_mark_wrapper) 345 345 SYSCALL(sys_prlimit64,sys_prlimit64,sys_prlimit64_wrapper) 346 + SYSCALL(sys_name_to_handle_at,sys_name_to_handle_at,sys_name_to_handle_at_wrapper) /* 335 */ 347 + SYSCALL(sys_open_by_handle_at,sys_open_by_handle_at,compat_sys_open_by_handle_at_wrapper) 348 + SYSCALL(sys_clock_adjtime,sys_clock_adjtime,compat_sys_clock_adjtime_wrapper) 349 + SYSCALL(sys_syncfs,sys_syncfs,sys_syncfs_wrapper)
+2 -1
arch/s390/oprofile/Makefile
··· 6 6 oprofilefs.o oprofile_stats.o \ 7 7 timer_int.o ) 8 8 9 - oprofile-y := $(DRIVER_OBJS) init.o backtrace.o hwsampler.o 9 + oprofile-y := $(DRIVER_OBJS) init.o backtrace.o 10 + oprofile-$(CONFIG_64BIT) += hwsampler.o
+13 -2
arch/s390/oprofile/init.c
··· 18 18 #include <linux/fs.h> 19 19 20 20 #include "../../../drivers/oprofile/oprof.h" 21 + 22 + extern void s390_backtrace(struct pt_regs * const regs, unsigned int depth); 23 + 24 + #ifdef CONFIG_64BIT 25 + 21 26 #include "hwsampler.h" 22 27 23 28 #define DEFAULT_INTERVAL 4096 ··· 41 36 static int hwsampler_running; /* start_mutex must be held to change */ 42 37 43 38 static struct oprofile_operations timer_ops; 44 - 45 - extern void s390_backtrace(struct pt_regs * const regs, unsigned int depth); 46 39 47 40 static int oprofile_hwsampler_start(void) 48 41 { ··· 175 172 hwsampler_shutdown(); 176 173 } 177 174 175 + #endif /* CONFIG_64BIT */ 176 + 178 177 int __init oprofile_arch_init(struct oprofile_operations *ops) 179 178 { 180 179 ops->backtrace = s390_backtrace; 181 180 181 + #ifdef CONFIG_64BIT 182 182 return oprofile_hwsampler_init(ops); 183 + #else 184 + return -ENODEV; 185 + #endif 183 186 } 184 187 185 188 void oprofile_arch_exit(void) 186 189 { 190 + #ifdef CONFIG_64BIT 187 191 oprofile_hwsampler_exit(); 192 + #endif 188 193 }
+4 -2
drivers/s390/block/dasd_eckd.c
··· 3982 3982 } 3983 3983 3984 3984 static struct ccw_driver dasd_eckd_driver = { 3985 - .name = "dasd-eckd", 3986 - .owner = THIS_MODULE, 3985 + .driver = { 3986 + .name = "dasd-eckd", 3987 + .owner = THIS_MODULE, 3988 + }, 3987 3989 .ids = dasd_eckd_ids, 3988 3990 .probe = dasd_eckd_probe, 3989 3991 .remove = dasd_generic_remove,
+4 -2
drivers/s390/block/dasd_fba.c
··· 65 65 } 66 66 67 67 static struct ccw_driver dasd_fba_driver = { 68 - .name = "dasd-fba", 69 - .owner = THIS_MODULE, 68 + .driver = { 69 + .name = "dasd-fba", 70 + .owner = THIS_MODULE, 71 + }, 70 72 .ids = dasd_fba_ids, 71 73 .probe = dasd_fba_probe, 72 74 .remove = dasd_generic_remove,
+4 -2
drivers/s390/char/con3215.c
··· 764 764 }; 765 765 766 766 static struct ccw_driver raw3215_ccw_driver = { 767 - .name = "3215", 768 - .owner = THIS_MODULE, 767 + .driver = { 768 + .name = "3215", 769 + .owner = THIS_MODULE, 770 + }, 769 771 .ids = raw3215_id, 770 772 .probe = &raw3215_probe, 771 773 .remove = &raw3215_remove,
+4 -2
drivers/s390/char/raw3270.c
··· 1388 1388 }; 1389 1389 1390 1390 static struct ccw_driver raw3270_ccw_driver = { 1391 - .name = "3270", 1392 - .owner = THIS_MODULE, 1391 + .driver = { 1392 + .name = "3270", 1393 + .owner = THIS_MODULE, 1394 + }, 1393 1395 .ids = raw3270_id, 1394 1396 .probe = &raw3270_probe, 1395 1397 .remove = &raw3270_remove,
+4 -2
drivers/s390/char/tape_34xx.c
··· 1320 1320 } 1321 1321 1322 1322 static struct ccw_driver tape_34xx_driver = { 1323 - .name = "tape_34xx", 1324 - .owner = THIS_MODULE, 1323 + .driver = { 1324 + .name = "tape_34xx", 1325 + .owner = THIS_MODULE, 1326 + }, 1325 1327 .ids = tape_34xx_ids, 1326 1328 .probe = tape_generic_probe, 1327 1329 .remove = tape_generic_remove,
+4 -2
drivers/s390/char/tape_3590.c
··· 1761 1761 } 1762 1762 1763 1763 static struct ccw_driver tape_3590_driver = { 1764 - .name = "tape_3590", 1765 - .owner = THIS_MODULE, 1764 + .driver = { 1765 + .name = "tape_3590", 1766 + .owner = THIS_MODULE, 1767 + }, 1766 1768 .ids = tape_3590_ids, 1767 1769 .probe = tape_generic_probe, 1768 1770 .remove = tape_generic_remove,
+4 -2
drivers/s390/char/vmur.c
··· 64 64 static int ur_pm_suspend(struct ccw_device *cdev); 65 65 66 66 static struct ccw_driver ur_driver = { 67 - .name = "vmur", 68 - .owner = THIS_MODULE, 67 + .driver = { 68 + .name = "vmur", 69 + .owner = THIS_MODULE, 70 + }, 69 71 .ids = ur_ids, 70 72 .probe = ur_probe, 71 73 .remove = ur_remove,
+2 -4
drivers/s390/cio/ccwgroup.c
··· 428 428 gdev = to_ccwgroupdev(dev); 429 429 gdrv = to_ccwgroupdrv(dev->driver); 430 430 431 - if (!try_module_get(gdrv->owner)) 431 + if (!try_module_get(gdrv->driver.owner)) 432 432 return -EINVAL; 433 433 434 434 ret = strict_strtoul(buf, 0, &value); ··· 442 442 else 443 443 ret = -EINVAL; 444 444 out: 445 - module_put(gdrv->owner); 445 + module_put(gdrv->driver.owner); 446 446 return (ret == 0) ? count : ret; 447 447 } 448 448 ··· 616 616 { 617 617 /* register our new driver with the core */ 618 618 cdriver->driver.bus = &ccwgroup_bus_type; 619 - cdriver->driver.name = cdriver->name; 620 - cdriver->driver.owner = cdriver->owner; 621 619 622 620 return driver_register(&cdriver->driver); 623 621 }
+4 -7
drivers/s390/cio/device.c
··· 127 127 return ret; 128 128 } 129 129 130 - struct bus_type ccw_bus_type; 130 + static struct bus_type ccw_bus_type; 131 131 132 132 static void io_subchannel_irq(struct subchannel *); 133 133 static int io_subchannel_probe(struct subchannel *); ··· 547 547 if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0) 548 548 return -EAGAIN; 549 549 550 - if (cdev->drv && !try_module_get(cdev->drv->owner)) { 550 + if (cdev->drv && !try_module_get(cdev->drv->driver.owner)) { 551 551 atomic_set(&cdev->private->onoff, 0); 552 552 return -EINVAL; 553 553 } ··· 573 573 } 574 574 out: 575 575 if (cdev->drv) 576 - module_put(cdev->drv->owner); 576 + module_put(cdev->drv->driver.owner); 577 577 atomic_set(&cdev->private->onoff, 0); 578 578 return (ret < 0) ? ret : count; 579 579 } ··· 1970 1970 .restore = ccw_device_pm_restore, 1971 1971 }; 1972 1972 1973 - struct bus_type ccw_bus_type = { 1973 + static struct bus_type ccw_bus_type = { 1974 1974 .name = "ccw", 1975 1975 .match = ccw_bus_match, 1976 1976 .uevent = ccw_uevent, ··· 1993 1993 struct device_driver *drv = &cdriver->driver; 1994 1994 1995 1995 drv->bus = &ccw_bus_type; 1996 - drv->name = cdriver->name; 1997 - drv->owner = cdriver->owner; 1998 1996 1999 1997 return driver_register(drv); 2000 1998 } ··· 2110 2112 EXPORT_SYMBOL(ccw_driver_register); 2111 2113 EXPORT_SYMBOL(ccw_driver_unregister); 2112 2114 EXPORT_SYMBOL(get_ccwdev_by_busid); 2113 - EXPORT_SYMBOL(ccw_bus_type); 2114 2115 EXPORT_SYMBOL_GPL(ccw_device_get_subchannel_id);
-1
drivers/s390/cio/device.h
··· 133 133 /* qdio needs this. */ 134 134 void ccw_device_set_timeout(struct ccw_device *, int); 135 135 extern struct subchannel_id ccw_device_get_subchannel_id(struct ccw_device *); 136 - extern struct bus_type ccw_bus_type; 137 136 138 137 /* Channel measurement facility related */ 139 138 void retry_set_schib(struct ccw_device *cdev);
+2 -1
drivers/s390/cio/qdio_main.c
··· 1508 1508 1509 1509 if (irq_ptr->state != QDIO_IRQ_STATE_ACTIVE) 1510 1510 return -EBUSY; 1511 - 1511 + if (!count) 1512 + return 0; 1512 1513 if (callflags & QDIO_FLAG_SYNC_INPUT) 1513 1514 return handle_inbound(irq_ptr->input_qs[q_nr], 1514 1515 callflags, bufnr, count);
+8 -4
drivers/s390/net/claw.c
··· 264 264 /* ccwgroup table */ 265 265 266 266 static struct ccwgroup_driver claw_group_driver = { 267 - .owner = THIS_MODULE, 268 - .name = "claw", 267 + .driver = { 268 + .owner = THIS_MODULE, 269 + .name = "claw", 270 + }, 269 271 .max_slaves = 2, 270 272 .driver_id = 0xC3D3C1E6, 271 273 .probe = claw_probe, ··· 284 282 MODULE_DEVICE_TABLE(ccw, claw_ids); 285 283 286 284 static struct ccw_driver claw_ccw_driver = { 287 - .owner = THIS_MODULE, 288 - .name = "claw", 285 + .driver = { 286 + .owner = THIS_MODULE, 287 + .name = "claw", 288 + }, 289 289 .ids = claw_ids, 290 290 .probe = ccwgroup_probe_ccwdev, 291 291 .remove = ccwgroup_remove_ccwdev,
+8 -4
drivers/s390/net/ctcm_main.c
··· 1764 1764 MODULE_DEVICE_TABLE(ccw, ctcm_ids); 1765 1765 1766 1766 static struct ccw_driver ctcm_ccw_driver = { 1767 - .owner = THIS_MODULE, 1768 - .name = "ctcm", 1767 + .driver = { 1768 + .owner = THIS_MODULE, 1769 + .name = "ctcm", 1770 + }, 1769 1771 .ids = ctcm_ids, 1770 1772 .probe = ccwgroup_probe_ccwdev, 1771 1773 .remove = ccwgroup_remove_ccwdev, 1772 1774 }; 1773 1775 1774 1776 static struct ccwgroup_driver ctcm_group_driver = { 1775 - .owner = THIS_MODULE, 1776 - .name = CTC_DRIVER_NAME, 1777 + .driver = { 1778 + .owner = THIS_MODULE, 1779 + .name = CTC_DRIVER_NAME, 1780 + }, 1777 1781 .max_slaves = 2, 1778 1782 .driver_id = 0xC3E3C3D4, /* CTCM */ 1779 1783 .probe = ctcm_probe_device,
+8 -4
drivers/s390/net/lcs.c
··· 2396 2396 MODULE_DEVICE_TABLE(ccw, lcs_ids); 2397 2397 2398 2398 static struct ccw_driver lcs_ccw_driver = { 2399 - .owner = THIS_MODULE, 2400 - .name = "lcs", 2399 + .driver = { 2400 + .owner = THIS_MODULE, 2401 + .name = "lcs", 2402 + }, 2401 2403 .ids = lcs_ids, 2402 2404 .probe = ccwgroup_probe_ccwdev, 2403 2405 .remove = ccwgroup_remove_ccwdev, ··· 2409 2407 * LCS ccwgroup driver registration 2410 2408 */ 2411 2409 static struct ccwgroup_driver lcs_group_driver = { 2412 - .owner = THIS_MODULE, 2413 - .name = "lcs", 2410 + .driver = { 2411 + .owner = THIS_MODULE, 2412 + .name = "lcs", 2413 + }, 2414 2414 .max_slaves = 2, 2415 2415 .driver_id = 0xD3C3E2, 2416 2416 .probe = lcs_probe_device,
+7 -3
drivers/s390/net/qeth_core_main.c
··· 3902 3902 MODULE_DEVICE_TABLE(ccw, qeth_ids); 3903 3903 3904 3904 static struct ccw_driver qeth_ccw_driver = { 3905 - .name = "qeth", 3905 + .driver = { 3906 + .name = "qeth", 3907 + }, 3906 3908 .ids = qeth_ids, 3907 3909 .probe = ccwgroup_probe_ccwdev, 3908 3910 .remove = ccwgroup_remove_ccwdev, ··· 4430 4428 } 4431 4429 4432 4430 static struct ccwgroup_driver qeth_core_ccwgroup_driver = { 4433 - .owner = THIS_MODULE, 4434 - .name = "qeth", 4431 + .driver = { 4432 + .owner = THIS_MODULE, 4433 + .name = "qeth", 4434 + }, 4435 4435 .driver_id = 0xD8C5E3C8, 4436 4436 .probe = qeth_core_probe_device, 4437 4437 .remove = qeth_core_remove_device,
+4 -2
drivers/s390/scsi/zfcp_ccw.c
··· 251 251 } 252 252 253 253 struct ccw_driver zfcp_ccw_driver = { 254 - .owner = THIS_MODULE, 255 - .name = "zfcp", 254 + .driver = { 255 + .owner = THIS_MODULE, 256 + .name = "zfcp", 257 + }, 256 258 .ids = zfcp_ccw_device_id, 257 259 .probe = zfcp_ccw_probe, 258 260 .remove = zfcp_ccw_remove,