Unified · Split
| @@ -10195,7 +10195,6 @@ F: drivers/media/tuners/qt1010* · 10194 unmodified lines | ||
| 10195 | 10195 | QUALCOMM ATHEROS ATH9K WIRELESS DRIVER |
| 10196 | 10196 | M: QCA ath9k Development <ath9k-devel@qca.qualcomm.com> |
| 10197 | 10197 | L: linux-wireless@vger.kernel.org |
| 10198 | −L: ath9k-devel@lists.ath9k.org | |
| 10199 | 10198 | W: http://wireless.kernel.org/en/users/Drivers/ath9k |
| 10200 | 10199 | S: Supported |
| 10201 | 10200 | F: drivers/net/wireless/ath/ath9k/ |
| @@ -13066,7 +13065,7 @@ F: drivers/input/serio/userio.c · 2864 unmodified lines | ||
| 13066 | 13065 | F: include/uapi/linux/userio.h |
| 13067 | 13066 | |
| 13068 | 13067 | VIRTIO CONSOLE DRIVER |
| 13069 | −M: Amit Shah <amit.shah@redhat.com> | |
| 13068 | +M: Amit Shah <amit@kernel.org> | |
| 13070 | 13069 | L: virtualization@lists.linux-foundation.org |
| 13071 | 13070 | S: Maintained |
| 13072 | 13071 | F: drivers/char/virtio_console.c |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | VERSION = 4 |
| 2 | 2 | PATCHLEVEL = 10 |
| 3 | 3 | SUBLEVEL = 0 |
| 4 | −EXTRAVERSION = -rc6 | |
| 4 | +EXTRAVERSION = -rc7 | |
| 5 | 5 | NAME = Fearless Coyote |
| 6 | 6 | |
| 7 | 7 | # *DOCUMENTATION* |
| @@ -797,7 +797,7 @@ KBUILD_CFLAGS += $(call cc-option,-Werror=incompatible-pointer-types) · 789 unmodified lines | ||
| 797 | 797 | KBUILD_ARFLAGS := $(call ar-option,D) |
| 798 | 798 | |
| 799 | 799 | # check for 'asm goto' |
| 800 | −ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC)), y) | |
| 800 | +ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLAGS)), y) | |
| 801 | 801 | KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTO |
| 802 | 802 | KBUILD_AFLAGS += -DCC_HAVE_ASM_GOTO |
| 803 | 803 | endif |
| @@ -193,15 +193,16 @@ AES_ENTRY(aes_cbc_encrypt) · 192 unmodified lines | ||
| 193 | 193 | cbz w6, .Lcbcencloop |
| 194 | 194 | |
| 195 | 195 | ld1 {v0.16b}, [x5] /* get iv */ |
| 196 | − enc_prepare w3, x2, x5 | |
| 196 | + enc_prepare w3, x2, x6 | |
| 197 | 197 | |
| 198 | 198 | .Lcbcencloop: |
| 199 | 199 | ld1 {v1.16b}, [x1], #16 /* get next pt block */ |
| 200 | 200 | eor v0.16b, v0.16b, v1.16b /* ..and xor with iv */ |
| 201 | − encrypt_block v0, w3, x2, x5, w6 | |
| 201 | + encrypt_block v0, w3, x2, x6, w7 | |
| 202 | 202 | st1 {v0.16b}, [x0], #16 |
| 203 | 203 | subs w4, w4, #1 |
| 204 | 204 | bne .Lcbcencloop |
| 205 | + st1 {v0.16b}, [x5] /* return iv */ | |
| 205 | 206 | ret |
| 206 | 207 | AES_ENDPROC(aes_cbc_encrypt) |
| 207 | 208 | |
| @@ -211,7 +212,7 @@ AES_ENTRY(aes_cbc_decrypt) · 3 unmodified lines | ||
| 211 | 212 | cbz w6, .LcbcdecloopNx |
| 212 | 213 | |
| 213 | 214 | ld1 {v7.16b}, [x5] /* get iv */ |
| 214 | − dec_prepare w3, x2, x5 | |
| 215 | + dec_prepare w3, x2, x6 | |
| 215 | 216 | |
| 216 | 217 | .LcbcdecloopNx: |
| 217 | 218 | #if INTERLEAVE >= 2 |
| @@ -248,7 +249,7 @@ AES_ENTRY(aes_cbc_decrypt) · 30 unmodified lines | ||
| 248 | 249 | .Lcbcdecloop: |
| 249 | 250 | ld1 {v1.16b}, [x1], #16 /* get next ct block */ |
| 250 | 251 | mov v0.16b, v1.16b /* ...and copy to v0 */ |
| 251 | − decrypt_block v0, w3, x2, x5, w6 | |
| 252 | + decrypt_block v0, w3, x2, x6, w7 | |
| 252 | 253 | eor v0.16b, v0.16b, v7.16b /* xor with iv => pt */ |
| 253 | 254 | mov v7.16b, v1.16b /* ct is next iv */ |
| 254 | 255 | st1 {v0.16b}, [x0], #16 |
| @@ -256,6 +257,7 @@ AES_ENTRY(aes_cbc_decrypt) · 1 unmodified line | ||
| 256 | 257 | bne .Lcbcdecloop |
| 257 | 258 | .Lcbcdecout: |
| 258 | 259 | FRAME_POP |
| 260 | + st1 {v7.16b}, [x5] /* return iv */ | |
| 259 | 261 | ret |
| 260 | 262 | AES_ENDPROC(aes_cbc_decrypt) |
| 261 | 263 | |
| @@ -267,24 +269,15 @@ AES_ENDPROC(aes_cbc_decrypt) · 5 unmodified lines | ||
| 267 | 269 | |
| 268 | 270 | AES_ENTRY(aes_ctr_encrypt) |
| 269 | 271 | FRAME_PUSH |
| 270 | − cbnz w6, .Lctrfirst /* 1st time around? */ | |
| 271 | − umov x5, v4.d[1] /* keep swabbed ctr in reg */ | |
| 272 | − rev x5, x5 | |
| 273 | −#if INTERLEAVE >= 2 | |
| 274 | − cmn w5, w4 /* 32 bit overflow? */ | |
| 275 | − bcs .Lctrinc | |
| 276 | − add x5, x5, #1 /* increment BE ctr */ | |
| 277 | − b .LctrincNx | |
| 278 | −#else | |
| 279 | − b .Lctrinc | |
| 280 | −#endif | |
| 281 | −.Lctrfirst: | |
| 272 | + cbz w6, .Lctrnotfirst /* 1st time around? */ | |
| 282 | 273 | enc_prepare w3, x2, x6 |
| 283 | 274 | ld1 {v4.16b}, [x5] |
| 284 | − umov x5, v4.d[1] /* keep swabbed ctr in reg */ | |
| 285 | − rev x5, x5 | |
| 275 | + | |
| 276 | +.Lctrnotfirst: | |
| 277 | + umov x8, v4.d[1] /* keep swabbed ctr in reg */ | |
| 278 | + rev x8, x8 | |
| 286 | 279 | #if INTERLEAVE >= 2 |
| 287 | − cmn w5, w4 /* 32 bit overflow? */ | |
| 280 | + cmn w8, w4 /* 32 bit overflow? */ | |
| 288 | 281 | bcs .Lctrloop |
| 289 | 282 | .LctrloopNx: |
| 290 | 283 | subs w4, w4, #INTERLEAVE |
| @@ -292,11 +285,11 @@ AES_ENTRY(aes_ctr_encrypt) · 1 unmodified line | ||
| 292 | 285 | #if INTERLEAVE == 2 |
| 293 | 286 | mov v0.8b, v4.8b |
| 294 | 287 | mov v1.8b, v4.8b |
| 295 | − rev x7, x5 | |
| 296 | − add x5, x5, #1 | |
| 288 | + rev x7, x8 | |
| 289 | + add x8, x8, #1 | |
| 297 | 290 | ins v0.d[1], x7 |
| 298 | − rev x7, x5 | |
| 299 | − add x5, x5, #1 | |
| 291 | + rev x7, x8 | |
| 292 | + add x8, x8, #1 | |
| 300 | 293 | ins v1.d[1], x7 |
| 301 | 294 | ld1 {v2.16b-v3.16b}, [x1], #32 /* get 2 input blocks */ |
| 302 | 295 | do_encrypt_block2x |
| @@ -305,7 +298,7 @@ AES_ENTRY(aes_ctr_encrypt) · 2 unmodified lines | ||
| 305 | 298 | st1 {v0.16b-v1.16b}, [x0], #32 |
| 306 | 299 | #else |
| 307 | 300 | ldr q8, =0x30000000200000001 /* addends 1,2,3[,0] */ |
| 308 | − dup v7.4s, w5 | |
| 301 | + dup v7.4s, w8 | |
| 309 | 302 | mov v0.16b, v4.16b |
| 310 | 303 | add v7.4s, v7.4s, v8.4s |
| 311 | 304 | mov v1.16b, v4.16b |
| @@ -323,18 +316,12 @@ AES_ENTRY(aes_ctr_encrypt) · 11 unmodified lines | ||
| 323 | 316 | eor v2.16b, v7.16b, v2.16b |
| 324 | 317 | eor v3.16b, v5.16b, v3.16b |
| 325 | 318 | st1 {v0.16b-v3.16b}, [x0], #64 |
| 326 | − add x5, x5, #INTERLEAVE | |
| 319 | + add x8, x8, #INTERLEAVE | |
| 327 | 320 | #endif |
| 328 | − cbz w4, .LctroutNx | |
| 329 | −.LctrincNx: | |
| 330 | − rev x7, x5 | |
| 321 | + rev x7, x8 | |
| 331 | 322 | ins v4.d[1], x7 |
| 323 | + cbz w4, .Lctrout | |
| 332 | 324 | b .LctrloopNx |
| 333 | −.LctroutNx: | |
| 334 | − sub x5, x5, #1 | |
| 335 | − rev x7, x5 | |
| 336 | − ins v4.d[1], x7 | |
| 337 | − b .Lctrout | |
| 338 | 325 | .Lctr1x: |
| 339 | 326 | adds w4, w4, #INTERLEAVE |
| 340 | 327 | beq .Lctrout |
| @@ -342,30 +329,39 @@ AES_ENTRY(aes_ctr_encrypt) · 1 unmodified line | ||
| 342 | 329 | .Lctrloop: |
| 343 | 330 | mov v0.16b, v4.16b |
| 344 | 331 | encrypt_block v0, w3, x2, x6, w7 |
| 332 | + | |
| 333 | + adds x8, x8, #1 /* increment BE ctr */ | |
| 334 | + rev x7, x8 | |
| 335 | + ins v4.d[1], x7 | |
| 336 | + bcs .Lctrcarry /* overflow? */ | |
| 337 | + | |
| 338 | +.Lctrcarrydone: | |
| 345 | 339 | subs w4, w4, #1 |
| 346 | 340 | bmi .Lctrhalfblock /* blocks < 0 means 1/2 block */ |
| 347 | 341 | ld1 {v3.16b}, [x1], #16 |
| 348 | 342 | eor v3.16b, v0.16b, v3.16b |
| 349 | 343 | st1 {v3.16b}, [x0], #16 |
| 350 | − beq .Lctrout | |
| 351 | −.Lctrinc: | |
| 352 | − adds x5, x5, #1 /* increment BE ctr */ | |
| 353 | − rev x7, x5 | |
| 354 | − ins v4.d[1], x7 | |
| 355 | − bcc .Lctrloop /* no overflow? */ | |
| 356 | − umov x7, v4.d[0] /* load upper word of ctr */ | |
| 357 | − rev x7, x7 /* ... to handle the carry */ | |
| 358 | − add x7, x7, #1 | |
| 359 | − rev x7, x7 | |
| 360 | − ins v4.d[0], x7 | |
| 361 | − b .Lctrloop | |
| 344 | + bne .Lctrloop | |
| 345 | + | |
| 346 | +.Lctrout: | |
| 347 | + st1 {v4.16b}, [x5] /* return next CTR value */ | |
| 348 | + FRAME_POP | |
| 349 | + ret | |
| 350 | + | |
| 362 | 351 | .Lctrhalfblock: |
| 363 | 352 | ld1 {v3.8b}, [x1] |
| 364 | 353 | eor v3.8b, v0.8b, v3.8b |
| 365 | 354 | st1 {v3.8b}, [x0] |
| 366 | −.Lctrout: | |
| 367 | 355 | FRAME_POP |
| 368 | 356 | ret |
| 357 | + | |
| 358 | +.Lctrcarry: | |
| 359 | + umov x7, v4.d[0] /* load upper word of ctr */ | |
| 360 | + rev x7, x7 /* ... to handle the carry */ | |
| 361 | + add x7, x7, #1 | |
| 362 | + rev x7, x7 | |
| 363 | + ins v4.d[0], x7 | |
| 364 | + b .Lctrcarrydone | |
| 369 | 365 | AES_ENDPROC(aes_ctr_encrypt) |
| 370 | 366 | .ltorg |
| 371 | 367 | |
| @@ -164,7 +164,6 @@ config PPC · 163 unmodified lines | ||
| 164 | 164 | select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE |
| 165 | 165 | select HAVE_ARCH_HARDENED_USERCOPY |
| 166 | 166 | select HAVE_KERNEL_GZIP |
| 167 | − select HAVE_CC_STACKPROTECTOR | |
| 168 | 167 | |
| 169 | 168 | config GENERIC_CSUM |
| 170 | 169 | def_bool CPU_LITTLE_ENDIAN |
| @@ -484,6 +483,7 @@ config RELOCATABLE · 313 unmodified lines | ||
| 484 | 483 | bool "Build a relocatable kernel" |
| 485 | 484 | depends on (PPC64 && !COMPILE_TEST) || (FLATMEM && (44x || FSL_BOOKE)) |
| 486 | 485 | select NONSTATIC_KERNEL |
| 486 | + select MODULE_REL_CRCS if MODVERSIONS | |
| 487 | 487 | help |
| 488 | 488 | This builds a kernel image that is capable of running at the |
| 489 | 489 | location the kernel is loaded at. For ppc32, there is no any |
| @@ -23,7 +23,9 @@ static __always_inline bool cpu_has_feature(unsigned long feature) · 22 unmodified lines | ||
| 23 | 23 | { |
| 24 | 24 | int i; |
| 25 | 25 | |
| 26 | +#ifndef __clang__ /* clang can't cope with this */ | |
| 26 | 27 | BUILD_BUG_ON(!__builtin_constant_p(feature)); |
| 28 | +#endif | |
| 27 | 29 | |
| 28 | 30 | #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG |
| 29 | 31 | if (!static_key_initialized) { |
| @@ -160,7 +160,9 @@ static __always_inline bool mmu_has_feature(unsigned long feature) · 159 unmodified lines | ||
| 160 | 160 | { |
| 161 | 161 | int i; |
| 162 | 162 | |
| 163 | +#ifndef __clang__ /* clang can't cope with this */ | |
| 163 | 164 | BUILD_BUG_ON(!__builtin_constant_p(feature)); |
| 165 | +#endif | |
| 164 | 166 | |
| 165 | 167 | #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG |
| 166 | 168 | if (!static_key_initialized) { |
| @@ -90,9 +90,5 @@ static inline int module_finalize_ftrace(struct module *mod, const Elf_Shdr *sec · 89 unmodified lines | ||
| 90 | 90 | } |
| 91 | 91 | #endif |
| 92 | 92 | |
| 93 | −#if defined(CONFIG_MODVERSIONS) && defined(CONFIG_PPC64) | |
| 94 | −#define ARCH_RELOCATES_KCRCTAB | |
| 95 | −#define reloc_start PHYSICAL_START | |
| 96 | −#endif | |
| 97 | 93 | #endif /* __KERNEL__ */ |
| 98 | 94 | #endif /* _ASM_POWERPC_MODULE_H */ |
| @@ -1,40 +0,0 @@ | ||
| 1 | −/* | |
| 2 | − * GCC stack protector support. | |
| 3 | − * | |
| 4 | − * Stack protector works by putting predefined pattern at the start of | |
| 5 | − * the stack frame and verifying that it hasn't been overwritten when | |
| 6 | − * returning from the function. The pattern is called stack canary | |
| 7 | − * and gcc expects it to be defined by a global variable called | |
| 8 | − * "__stack_chk_guard" on PPC. This unfortunately means that on SMP | |
| 9 | − * we cannot have a different canary value per task. | |
| 10 | − */ | |
| 11 | − | |
| 12 | −#ifndef _ASM_STACKPROTECTOR_H | |
| 13 | −#define _ASM_STACKPROTECTOR_H | |
| 14 | − | |
| 15 | −#include <linux/random.h> | |
| 16 | −#include <linux/version.h> | |
| 17 | −#include <asm/reg.h> | |
| 18 | − | |
| 19 | −extern unsigned long __stack_chk_guard; | |
| 20 | − | |
| 21 | −/* | |
| 22 | − * Initialize the stackprotector canary value. | |
| 23 | − * | |
| 24 | − * NOTE: this must only be called from functions that never return, | |
| 25 | − * and it must always be inlined. | |
| 26 | − */ | |
| 27 | −static __always_inline void boot_init_stack_canary(void) | |
| 28 | −{ | |
| 29 | − unsigned long canary; | |
| 30 | − | |
| 31 | − /* Try to get a semi random initial value. */ | |
| 32 | − get_random_bytes(&canary, sizeof(canary)); | |
| 33 | − canary ^= mftb(); | |
| 34 | − canary ^= LINUX_VERSION_CODE; | |
| 35 | − | |
| 36 | − current->stack_canary = canary; | |
| 37 | − __stack_chk_guard = current->stack_canary; | |
| 38 | −} | |
| 39 | − | |
| 40 | −#endif /* _ASM_STACKPROTECTOR_H */ | |
| @@ -19,10 +19,6 @@ CFLAGS_init.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) · 18 unmodified lines | ||
| 19 | 19 | CFLAGS_btext.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) |
| 20 | 20 | CFLAGS_prom.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) |
| 21 | 21 | |
| 22 | −# -fstack-protector triggers protection checks in this code, | |
| 23 | −# but it is being used too early to link to meaningful stack_chk logic. | |
| 24 | −CFLAGS_prom_init.o += $(call cc-option, -fno-stack-protector) | |
| 25 | − | |
| 26 | 22 | ifdef CONFIG_FUNCTION_TRACER |
| 27 | 23 | # Do not trace early boot code |
| 28 | 24 | CFLAGS_REMOVE_cputable.o = -mno-sched-epilog $(CC_FLAGS_FTRACE) |
| @@ -91,9 +91,6 @@ int main(void) · 90 unmodified lines | ||
| 91 | 91 | DEFINE(TI_livepatch_sp, offsetof(struct thread_info, livepatch_sp)); |
| 92 | 92 | #endif |
| 93 | 93 | |
| 94 | −#ifdef CONFIG_CC_STACKPROTECTOR | |
| 95 | − DEFINE(TSK_STACK_CANARY, offsetof(struct task_struct, stack_canary)); | |
| 96 | −#endif | |
| 97 | 94 | DEFINE(KSP, offsetof(struct thread_struct, ksp)); |
| 98 | 95 | DEFINE(PT_REGS, offsetof(struct thread_struct, regs)); |
| 99 | 96 | #ifdef CONFIG_BOOKE |
| @@ -545,7 +545,7 @@ static void *eeh_pe_detach_dev(void *data, void *userdata) · 544 unmodified lines | ||
| 545 | 545 | static void *__eeh_clear_pe_frozen_state(void *data, void *flag) |
| 546 | 546 | { |
| 547 | 547 | struct eeh_pe *pe = (struct eeh_pe *)data; |
| 548 | − bool *clear_sw_state = flag; | |
| 548 | + bool clear_sw_state = *(bool *)flag; | |
| 549 | 549 | int i, rc = 1; |
| 550 | 550 | |
| 551 | 551 | for (i = 0; rc && i < 3; i++) |
| @@ -674,11 +674,7 @@ BEGIN_FTR_SECTION · 673 unmodified lines | ||
| 674 | 674 | mtspr SPRN_SPEFSCR,r0 /* restore SPEFSCR reg */ |
| 675 | 675 | END_FTR_SECTION_IFSET(CPU_FTR_SPE) |
| 676 | 676 | #endif /* CONFIG_SPE */ |
| 677 | −#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP) | |
| 678 | − lwz r0,TSK_STACK_CANARY(r2) | |
| 679 | − lis r4,__stack_chk_guard@ha | |
| 680 | − stw r0,__stack_chk_guard@l(r4) | |
| 681 | −#endif | |
| 677 | + | |
| 682 | 678 | lwz r0,_CCR(r1) |
| 683 | 679 | mtcrf 0xFF,r0 |
| 684 | 680 | /* r3-r12 are destroyed -- Cort */ |
| @@ -286,14 +286,6 @@ static void dedotify_versions(struct modversion_info *vers, · 285 unmodified lines | ||
| 286 | 286 | for (end = (void *)vers + size; vers < end; vers++) |
| 287 | 287 | if (vers->name[0] == '.') { |
| 288 | 288 | memmove(vers->name, vers->name+1, strlen(vers->name)); |
| 289 | −#ifdef ARCH_RELOCATES_KCRCTAB | |
| 290 | − /* The TOC symbol has no CRC computed. To avoid CRC | |
| 291 | − * check failing, we must force it to the expected | |
| 292 | − * value (see CRC check in module.c). | |
| 293 | − */ | |
| 294 | − if (!strcmp(vers->name, "TOC.")) | |
| 295 | − vers->crc = -(unsigned long)reloc_start; | |
| 296 | −#endif | |
| 297 | 289 | } |
| 298 | 290 | } |
| 299 | 291 | |
| @@ -64,12 +64,6 @@ · 63 unmodified lines | ||
| 64 | 64 | #include <linux/kprobes.h> |
| 65 | 65 | #include <linux/kdebug.h> |
| 66 | 66 | |
| 67 | −#ifdef CONFIG_CC_STACKPROTECTOR | |
| 68 | −#include <linux/stackprotector.h> | |
| 69 | −unsigned long __stack_chk_guard __read_mostly; | |
| 70 | −EXPORT_SYMBOL(__stack_chk_guard); | |
| 71 | −#endif | |
| 72 | − | |
| 73 | 67 | /* Transactional Memory debug */ |
| 74 | 68 | #ifdef TM_DEBUG_SW |
| 75 | 69 | #define TM_DEBUG(x...) printk(KERN_INFO x) |
| @@ -2834,6 +2834,9 @@ static void __init prom_find_boot_cpu(void) · 2833 unmodified lines | ||
| 2834 | 2834 | |
| 2835 | 2835 | cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu); |
| 2836 | 2836 | |
| 2837 | + if (!PHANDLE_VALID(cpu_pkg)) | |
| 2838 | + return; | |
| 2839 | + | |
| 2837 | 2840 | prom_getprop(cpu_pkg, "reg", &rval, sizeof(rval)); |
| 2838 | 2841 | prom.cpu = be32_to_cpu(rval); |
| 2839 | 2842 | |
| @@ -65,7 +65,7 @@ int radix__map_kernel_page(unsigned long ea, unsigned long pa, · 64 unmodified lines | ||
| 65 | 65 | if (!pmdp) |
| 66 | 66 | return -ENOMEM; |
| 67 | 67 | if (map_page_size == PMD_SIZE) { |
| 68 | − ptep = (pte_t *)pudp; | |
| 68 | + ptep = pmdp_ptep(pmdp); | |
| 69 | 69 | goto set_the_pte; |
| 70 | 70 | } |
| 71 | 71 | ptep = pte_alloc_kernel(pmdp, ea); |
| @@ -90,7 +90,7 @@ int radix__map_kernel_page(unsigned long ea, unsigned long pa, · 18 unmodified lines | ||
| 90 | 90 | } |
| 91 | 91 | pmdp = pmd_offset(pudp, ea); |
| 92 | 92 | if (map_page_size == PMD_SIZE) { |
| 93 | − ptep = (pte_t *)pudp; | |
| 93 | + ptep = pmdp_ptep(pmdp); | |
| 94 | 94 | goto set_the_pte; |
| 95 | 95 | } |
| 96 | 96 | if (!pmd_present(*pmdp)) { |
| @@ -35,15 +35,15 @@ void __tsb_context_switch(unsigned long pgd_pa, · 34 unmodified lines | ||
| 35 | 35 | static inline void tsb_context_switch(struct mm_struct *mm) |
| 36 | 36 | { |
| 37 | 37 | __tsb_context_switch(__pa(mm->pgd), |
| 38 | − &mm->context.tsb_block[0], | |
| 38 | + &mm->context.tsb_block[MM_TSB_BASE], | |
| 39 | 39 | #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) |
| 40 | − (mm->context.tsb_block[1].tsb ? | |
| 41 | − &mm->context.tsb_block[1] : | |
| 40 | + (mm->context.tsb_block[MM_TSB_HUGE].tsb ? | |
| 41 | + &mm->context.tsb_block[MM_TSB_HUGE] : | |
| 42 | 42 | NULL) |
| 43 | 43 | #else |
| 44 | 44 | NULL |
| 45 | 45 | #endif |
| 46 | − , __pa(&mm->context.tsb_descr[0])); | |
| 46 | + , __pa(&mm->context.tsb_descr[MM_TSB_BASE])); | |
| 47 | 47 | } |
| 48 | 48 | |
| 49 | 49 | void tsb_grow(struct mm_struct *mm, |
| @@ -1021,7 +1021,7 @@ static void __init alloc_one_queue(unsigned long *pa_ptr, unsigned long qmask) · 1020 unmodified lines | ||
| 1021 | 1021 | unsigned long order = get_order(size); |
| 1022 | 1022 | unsigned long p; |
| 1023 | 1023 | |
| 1024 | − p = __get_free_pages(GFP_KERNEL, order); | |
| 1024 | + p = __get_free_pages(GFP_KERNEL | __GFP_ZERO, order); | |
| 1025 | 1025 | if (!p) { |
| 1026 | 1026 | prom_printf("SUN4V: Error, cannot allocate queue.\n"); |
| 1027 | 1027 | prom_halt(); |
| @@ -43,8 +43,8 @@ static const char poweroff_msg[32] __attribute__((aligned(32))) = · 42 unmodified lines | ||
| 43 | 43 | "Linux powering off"; |
| 44 | 44 | static const char rebooting_msg[32] __attribute__((aligned(32))) = |
| 45 | 45 | "Linux rebooting"; |
| 46 | −static const char panicing_msg[32] __attribute__((aligned(32))) = | |
| 47 | − "Linux panicing"; | |
| 46 | +static const char panicking_msg[32] __attribute__((aligned(32))) = | |
| 47 | + "Linux panicking"; | |
| 48 | 48 | |
| 49 | 49 | static int sstate_reboot_call(struct notifier_block *np, unsigned long type, void *_unused) |
| 50 | 50 | { |
| @@ -76,7 +76,7 @@ static struct notifier_block sstate_reboot_notifier = { · 25 unmodified lines | ||
| 76 | 76 | |
| 77 | 77 | static int sstate_panic_event(struct notifier_block *n, unsigned long event, void *ptr) |
| 78 | 78 | { |
| 79 | − do_set_sstate(HV_SOFT_STATE_TRANSITION, panicing_msg); | |
| 79 | + do_set_sstate(HV_SOFT_STATE_TRANSITION, panicking_msg); | |
| 80 | 80 | |
| 81 | 81 | return NOTIFY_DONE; |
| 82 | 82 | } |
| @@ -2051,6 +2051,73 @@ void sun4v_resum_overflow(struct pt_regs *regs) · 2050 unmodified lines | ||
| 2051 | 2051 | atomic_inc(&sun4v_resum_oflow_cnt); |
| 2052 | 2052 | } |
| 2053 | 2053 | |
| 2054 | +/* Given a set of registers, get the virtual addressi that was being accessed | |
| 2055 | + * by the faulting instructions at tpc. | |
| 2056 | + */ | |
| 2057 | +static unsigned long sun4v_get_vaddr(struct pt_regs *regs) | |
| 2058 | +{ | |
| 2059 | + unsigned int insn; | |
| 2060 | + | |
| 2061 | + if (!copy_from_user(&insn, (void __user *)regs->tpc, 4)) { | |
| 2062 | + return compute_effective_address(regs, insn, | |
| 2063 | + (insn >> 25) & 0x1f); | |
| 2064 | + } | |
| 2065 | + return 0; | |
| 2066 | +} | |
| 2067 | + | |
| 2068 | +/* Attempt to handle non-resumable errors generated from userspace. | |
| 2069 | + * Returns true if the signal was handled, false otherwise. | |
| 2070 | + */ | |
| 2071 | +bool sun4v_nonresum_error_user_handled(struct pt_regs *regs, | |
| 2072 | + struct sun4v_error_entry *ent) { | |
| 2073 | + | |
| 2074 | + unsigned int attrs = ent->err_attrs; | |
| 2075 | + | |
| 2076 | + if (attrs & SUN4V_ERR_ATTRS_MEMORY) { | |
| 2077 | + unsigned long addr = ent->err_raddr; | |
| 2078 | + siginfo_t info; | |
| 2079 | + | |
| 2080 | + if (addr == ~(u64)0) { | |
| 2081 | + /* This seems highly unlikely to ever occur */ | |
| 2082 | + pr_emerg("SUN4V NON-RECOVERABLE ERROR: Memory error detected in unknown location!\n"); | |
| 2083 | + } else { | |
| 2084 | + unsigned long page_cnt = DIV_ROUND_UP(ent->err_size, | |
| 2085 | + PAGE_SIZE); | |
| 2086 | + | |
| 2087 | + /* Break the unfortunate news. */ | |
| 2088 | + pr_emerg("SUN4V NON-RECOVERABLE ERROR: Memory failed at %016lX\n", | |
| 2089 | + addr); | |
| 2090 | + pr_emerg("SUN4V NON-RECOVERABLE ERROR: Claiming %lu ages.\n", | |
| 2091 | + page_cnt); | |
| 2092 | + | |
| 2093 | + while (page_cnt-- > 0) { | |
| 2094 | + if (pfn_valid(addr >> PAGE_SHIFT)) | |
| 2095 | + get_page(pfn_to_page(addr >> PAGE_SHIFT)); | |
| 2096 | + addr += PAGE_SIZE; | |
| 2097 | + } | |
| 2098 | + } | |
| 2099 | + info.si_signo = SIGKILL; | |
| 2100 | + info.si_errno = 0; | |
| 2101 | + info.si_trapno = 0; | |
| 2102 | + force_sig_info(info.si_signo, &info, current); | |
| 2103 | + | |
| 2104 | + return true; | |
| 2105 | + } | |
| 2106 | + if (attrs & SUN4V_ERR_ATTRS_PIO) { | |
| 2107 | + siginfo_t info; | |
| 2108 | + | |
| 2109 | + info.si_signo = SIGBUS; | |
| 2110 | + info.si_code = BUS_ADRERR; | |
| 2111 | + info.si_addr = (void __user *)sun4v_get_vaddr(regs); | |
| 2112 | + force_sig_info(info.si_signo, &info, current); | |
| 2113 | + | |
| 2114 | + return true; | |
| 2115 | + } | |
| 2116 | + | |
| 2117 | + /* Default to doing nothing */ | |
| 2118 | + return false; | |
| 2119 | +} | |
| 2120 | + | |
| 2054 | 2121 | /* We run with %pil set to PIL_NORMAL_MAX and PSTATE_IE enabled in %pstate. |
| 2055 | 2122 | * Log the event, clear the first word of the entry, and die. |
| 2056 | 2123 | */ |
| @@ -2075,6 +2142,12 @@ void sun4v_nonresum_error(struct pt_regs *regs, unsigned long offset) · 18 unmodified lines | ||
| 2075 | 2142 | |
| 2076 | 2143 | put_cpu(); |
| 2077 | 2144 | |
| 2145 | + if (!(regs->tstate & TSTATE_PRIV) && | |
| 2146 | + sun4v_nonresum_error_user_handled(regs, &local_copy)) { | |
| 2147 | + /* DON'T PANIC: This userspace error was handled. */ | |
| 2148 | + return; | |
| 2149 | + } | |
| 2150 | + | |
| 2078 | 2151 | #ifdef CONFIG_PCI |
| 2079 | 2152 | /* Check for the special PCI poke sequence. */ |
| 2080 | 2153 | if (pci_poke_in_progress && pci_poke_cpu == cpu) { |
| @@ -161,7 +161,13 @@ static u64 rapl_timer_ms; · 160 unmodified lines | ||
| 161 | 161 | |
| 162 | 162 | static inline struct rapl_pmu *cpu_to_rapl_pmu(unsigned int cpu) |
| 163 | 163 | { |
| 164 | − return rapl_pmus->pmus[topology_logical_package_id(cpu)]; | |
| 164 | + unsigned int pkgid = topology_logical_package_id(cpu); | |
| 165 | + | |
| 166 | + /* | |
| 167 | + * The unsigned check also catches the '-1' return value for non | |
| 168 | + * existent mappings in the topology map. | |
| 169 | + */ | |
| 170 | + return pkgid < rapl_pmus->maxpkg ? rapl_pmus->pmus[pkgid] : NULL; | |
| 165 | 171 | } |
| 166 | 172 | |
| 167 | 173 | static inline u64 rapl_read_counter(struct perf_event *event) |
| @@ -402,6 +408,8 @@ static int rapl_pmu_event_init(struct perf_event *event) · 234 unmodified lines | ||
| 402 | 408 | |
| 403 | 409 | /* must be done before validate_group */ |
| 404 | 410 | pmu = cpu_to_rapl_pmu(event->cpu); |
| 411 | + if (!pmu) | |
| 412 | + return -EINVAL; | |
| 405 | 413 | event->cpu = pmu->cpu; |
| 406 | 414 | event->pmu_private = pmu; |
| 407 | 415 | event->hw.event_base = msr; |
| @@ -585,6 +593,20 @@ static int rapl_cpu_online(unsigned int cpu) · 177 unmodified lines | ||
| 585 | 593 | struct rapl_pmu *pmu = cpu_to_rapl_pmu(cpu); |
| 586 | 594 | int target; |
| 587 | 595 | |
| 596 | + if (!pmu) { | |
| 597 | + pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu)); | |
| 598 | + if (!pmu) | |
| 599 | + return -ENOMEM; | |
| 600 | + | |
| 601 | + raw_spin_lock_init(&pmu->lock); | |
| 602 | + INIT_LIST_HEAD(&pmu->active_list); | |
| 603 | + pmu->pmu = &rapl_pmus->pmu; | |
| 604 | + pmu->timer_interval = ms_to_ktime(rapl_timer_ms); | |
| 605 | + rapl_hrtimer_init(pmu); | |
| 606 | + | |
| 607 | + rapl_pmus->pmus[topology_logical_package_id(cpu)] = pmu; | |
| 608 | + } | |
| 609 | + | |
| 588 | 610 | /* |
| 589 | 611 | * Check if there is an online cpu in the package which collects rapl |
| 590 | 612 | * events already. |
| @@ -598,27 +620,6 @@ static int rapl_cpu_online(unsigned int cpu) · 7 unmodified lines | ||
| 598 | 620 | return 0; |
| 599 | 621 | } |
| 600 | 622 | |
| 601 | −static int rapl_cpu_prepare(unsigned int cpu) | |
| 602 | −{ | |
| 603 | − struct rapl_pmu *pmu = cpu_to_rapl_pmu(cpu); | |
| 604 | − | |
| 605 | − if (pmu) | |
| 606 | − return 0; | |
| 607 | − | |
| 608 | − pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu)); | |
| 609 | − if (!pmu) | |
| 610 | − return -ENOMEM; | |
| 611 | − | |
| 612 | − raw_spin_lock_init(&pmu->lock); | |
| 613 | − INIT_LIST_HEAD(&pmu->active_list); | |
| 614 | − pmu->pmu = &rapl_pmus->pmu; | |
| 615 | − pmu->timer_interval = ms_to_ktime(rapl_timer_ms); | |
| 616 | − pmu->cpu = -1; | |
| 617 | − rapl_hrtimer_init(pmu); | |
| 618 | − rapl_pmus->pmus[topology_logical_package_id(cpu)] = pmu; | |
| 619 | − return 0; | |
| 620 | −} | |
| 621 | − | |
| 622 | 623 | static int rapl_check_hw_unit(bool apply_quirk) |
| 623 | 624 | { |
| 624 | 625 | u64 msr_rapl_power_unit_bits; |
| @@ -803,29 +804,21 @@ static int __init rapl_pmu_init(void) · 178 unmodified lines | ||
| 803 | 804 | /* |
| 804 | 805 | * Install callbacks. Core will call them for each online cpu. |
| 805 | 806 | */ |
| 806 | − | |
| 807 | − ret = cpuhp_setup_state(CPUHP_PERF_X86_RAPL_PREP, "perf/x86/rapl:prepare", | |
| 808 | − rapl_cpu_prepare, NULL); | |
| 809 | − if (ret) | |
| 810 | − goto out; | |
| 811 | − | |
| 812 | 807 | ret = cpuhp_setup_state(CPUHP_AP_PERF_X86_RAPL_ONLINE, |
| 813 | 808 | "perf/x86/rapl:online", |
| 814 | 809 | rapl_cpu_online, rapl_cpu_offline); |
| 815 | 810 | if (ret) |
| 816 | − goto out1; | |
| 811 | + goto out; | |
| 817 | 812 | |
| 818 | 813 | ret = perf_pmu_register(&rapl_pmus->pmu, "power", -1); |
| 819 | 814 | if (ret) |
| 820 | − goto out2; | |
| 815 | + goto out1; | |
| 821 | 816 | |
| 822 | 817 | rapl_advertise(); |
| 823 | 818 | return 0; |
| 824 | 819 | |
| 825 | −out2: | |
| 826 | − cpuhp_remove_state(CPUHP_AP_PERF_X86_RAPL_ONLINE); | |
| 827 | 820 | out1: |
| 828 | − cpuhp_remove_state(CPUHP_PERF_X86_RAPL_PREP); | |
| 821 | + cpuhp_remove_state(CPUHP_AP_PERF_X86_RAPL_ONLINE); | |
| 829 | 822 | out: |
| 830 | 823 | pr_warn("Initialization failed (%d), disabled\n", ret); |
| 831 | 824 | cleanup_rapl_pmus(); |
| @@ -836,7 +829,6 @@ module_init(rapl_pmu_init); · 4 unmodified lines | ||
| 836 | 829 | static void __exit intel_rapl_exit(void) |
| 837 | 830 | { |
| 838 | 831 | cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_RAPL_ONLINE); |
| 839 | − cpuhp_remove_state_nocalls(CPUHP_PERF_X86_RAPL_PREP); | |
| 840 | 832 | perf_pmu_unregister(&rapl_pmus->pmu); |
| 841 | 833 | cleanup_rapl_pmus(); |
| 842 | 834 | } |
| @@ -100,7 +100,13 @@ ssize_t uncore_event_show(struct kobject *kobj, · 99 unmodified lines | ||
| 100 | 100 | |
| 101 | 101 | struct intel_uncore_box *uncore_pmu_to_box(struct intel_uncore_pmu *pmu, int cpu) |
| 102 | 102 | { |
| 103 | − return pmu->boxes[topology_logical_package_id(cpu)]; | |
| 103 | + unsigned int pkgid = topology_logical_package_id(cpu); | |
| 104 | + | |
| 105 | + /* | |
| 106 | + * The unsigned check also catches the '-1' return value for non | |
| 107 | + * existent mappings in the topology map. | |
| 108 | + */ | |
| 109 | + return pkgid < max_packages ? pmu->boxes[pkgid] : NULL; | |
| 104 | 110 | } |
| 105 | 111 | |
| 106 | 112 | u64 uncore_msr_read_counter(struct intel_uncore_box *box, struct perf_event *event) |
| @@ -764,30 +770,6 @@ static void uncore_pmu_unregister(struct intel_uncore_pmu *pmu) · 657 unmodified lines | ||
| 764 | 770 | pmu->registered = false; |
| 765 | 771 | } |
| 766 | 772 | |
| 767 | −static void __uncore_exit_boxes(struct intel_uncore_type *type, int cpu) | |
| 768 | −{ | |
| 769 | − struct intel_uncore_pmu *pmu = type->pmus; | |
| 770 | − struct intel_uncore_box *box; | |
| 771 | − int i, pkg; | |
| 772 | − | |
| 773 | − if (pmu) { | |
| 774 | − pkg = topology_physical_package_id(cpu); | |
| 775 | − for (i = 0; i < type->num_boxes; i++, pmu++) { | |
| 776 | − box = pmu->boxes[pkg]; | |
| 777 | − if (box) | |
| 778 | − uncore_box_exit(box); | |
| 779 | − } | |
| 780 | − } | |
| 781 | −} | |
| 782 | − | |
| 783 | −static void uncore_exit_boxes(void *dummy) | |
| 784 | −{ | |
| 785 | − struct intel_uncore_type **types; | |
| 786 | − | |
| 787 | − for (types = uncore_msr_uncores; *types; types++) | |
| 788 | − __uncore_exit_boxes(*types++, smp_processor_id()); | |
| 789 | −} | |
| 790 | − | |
| 791 | 773 | static void uncore_free_boxes(struct intel_uncore_pmu *pmu) |
| 792 | 774 | { |
| 793 | 775 | int pkg; |
| @@ -1058,86 +1040,6 @@ static void uncore_pci_exit(void) · 264 unmodified lines | ||
| 1058 | 1040 | } |
| 1059 | 1041 | } |
| 1060 | 1042 | |
| 1061 | −static int uncore_cpu_dying(unsigned int cpu) | |
| 1062 | −{ | |
| 1063 | − struct intel_uncore_type *type, **types = uncore_msr_uncores; | |
| 1064 | − struct intel_uncore_pmu *pmu; | |
| 1065 | − struct intel_uncore_box *box; | |
| 1066 | − int i, pkg; | |
| 1067 | − | |
| 1068 | − pkg = topology_logical_package_id(cpu); | |
| 1069 | − for (; *types; types++) { | |
| 1070 | − type = *types; | |
| 1071 | − pmu = type->pmus; | |
| 1072 | − for (i = 0; i < type->num_boxes; i++, pmu++) { | |
| 1073 | − box = pmu->boxes[pkg]; | |
| 1074 | − if (box && atomic_dec_return(&box->refcnt) == 0) | |
| 1075 | − uncore_box_exit(box); | |
| 1076 | − } | |
| 1077 | − } | |
| 1078 | − return 0; | |
| 1079 | −} | |
| 1080 | − | |
| 1081 | −static int first_init; | |
| 1082 | − | |
| 1083 | −static int uncore_cpu_starting(unsigned int cpu) | |
| 1084 | −{ | |
| 1085 | − struct intel_uncore_type *type, **types = uncore_msr_uncores; | |
| 1086 | − struct intel_uncore_pmu *pmu; | |
| 1087 | − struct intel_uncore_box *box; | |
| 1088 | − int i, pkg, ncpus = 1; | |
| 1089 | − | |
| 1090 | − if (first_init) { | |
| 1091 | − /* | |
| 1092 | − * On init we get the number of online cpus in the package | |
| 1093 | − * and set refcount for all of them. | |
| 1094 | − */ | |
| 1095 | − ncpus = cpumask_weight(topology_core_cpumask(cpu)); | |
| 1096 | − } | |
| 1097 | − | |
| 1098 | − pkg = topology_logical_package_id(cpu); | |
| 1099 | − for (; *types; types++) { | |
| 1100 | − type = *types; | |
| 1101 | − pmu = type->pmus; | |
| 1102 | − for (i = 0; i < type->num_boxes; i++, pmu++) { | |
| 1103 | − box = pmu->boxes[pkg]; | |
| 1104 | − if (!box) | |
| 1105 | − continue; | |
| 1106 | − /* The first cpu on a package activates the box */ | |
| 1107 | − if (atomic_add_return(ncpus, &box->refcnt) == ncpus) | |
| 1108 | − uncore_box_init(box); | |
| 1109 | − } | |
| 1110 | − } | |
| 1111 | − | |
| 1112 | − return 0; | |
| 1113 | −} | |
| 1114 | − | |
| 1115 | −static int uncore_cpu_prepare(unsigned int cpu) | |
| 1116 | −{ | |
| 1117 | − struct intel_uncore_type *type, **types = uncore_msr_uncores; | |
| 1118 | − struct intel_uncore_pmu *pmu; | |
| 1119 | − struct intel_uncore_box *box; | |
| 1120 | − int i, pkg; | |
| 1121 | − | |
| 1122 | − pkg = topology_logical_package_id(cpu); | |
| 1123 | − for (; *types; types++) { | |
| 1124 | − type = *types; | |
| 1125 | − pmu = type->pmus; | |
| 1126 | − for (i = 0; i < type->num_boxes; i++, pmu++) { | |
| 1127 | − if (pmu->boxes[pkg]) | |
| 1128 | − continue; | |
| 1129 | − /* First cpu of a package allocates the box */ | |
| 1130 | − box = uncore_alloc_box(type, cpu_to_node(cpu)); | |
| 1131 | − if (!box) | |
| 1132 | − return -ENOMEM; | |
| 1133 | − box->pmu = pmu; | |
| 1134 | − box->pkgid = pkg; | |
| 1135 | − pmu->boxes[pkg] = box; | |
| 1136 | − } | |
| 1137 | − } | |
| 1138 | − return 0; | |
| 1139 | −} | |
| 1140 | − | |
| 1141 | 1043 | static void uncore_change_type_ctx(struct intel_uncore_type *type, int old_cpu, |
| 1142 | 1044 | int new_cpu) |
| 1143 | 1045 | { |
| @@ -1177,12 +1079,14 @@ static void uncore_change_context(struct intel_uncore_type **uncores, · 33 unmodified lines | ||
| 1177 | 1079 | |
| 1178 | 1080 | static int uncore_event_cpu_offline(unsigned int cpu) |
| 1179 | 1081 | { |
| 1180 | − int target; | |
| 1082 | + struct intel_uncore_type *type, **types = uncore_msr_uncores; | |
| 1083 | + struct intel_uncore_pmu *pmu; | |
| 1084 | + struct intel_uncore_box *box; | |
| 1085 | + int i, pkg, target; | |
| 1181 | 1086 | |
| 1182 | 1087 | /* Check if exiting cpu is used for collecting uncore events */ |
| 1183 | 1088 | if (!cpumask_test_and_clear_cpu(cpu, &uncore_cpu_mask)) |
| 1184 | − return 0; | |
| 1185 | − | |
| 1089 | + goto unref; | |
| 1186 | 1090 | /* Find a new cpu to collect uncore events */ |
| 1187 | 1091 | target = cpumask_any_but(topology_core_cpumask(cpu), cpu); |
| 1188 | 1092 | |
| @@ -1194,12 +1098,82 @@ static int uncore_event_cpu_offline(unsigned int cpu) · 5 unmodified lines | ||
| 1194 | 1098 | |
| 1195 | 1099 | uncore_change_context(uncore_msr_uncores, cpu, target); |
| 1196 | 1100 | uncore_change_context(uncore_pci_uncores, cpu, target); |
| 1101 | + | |
| 1102 | +unref: | |
| 1103 | + /* Clear the references */ | |
| 1104 | + pkg = topology_logical_package_id(cpu); | |
| 1105 | + for (; *types; types++) { | |
| 1106 | + type = *types; | |
| 1107 | + pmu = type->pmus; | |
| 1108 | + for (i = 0; i < type->num_boxes; i++, pmu++) { | |
| 1109 | + box = pmu->boxes[pkg]; | |
| 1110 | + if (box && atomic_dec_return(&box->refcnt) == 0) | |
| 1111 | + uncore_box_exit(box); | |
| 1112 | + } | |
| 1113 | + } | |
| 1197 | 1114 | return 0; |
| 1198 | 1115 | } |
| 1199 | 1116 | |
| 1117 | +static int allocate_boxes(struct intel_uncore_type **types, | |
| 1118 | + unsigned int pkg, unsigned int cpu) | |
| 1119 | +{ | |
| 1120 | + struct intel_uncore_box *box, *tmp; | |
| 1121 | + struct intel_uncore_type *type; | |
| 1122 | + struct intel_uncore_pmu *pmu; | |
| 1123 | + LIST_HEAD(allocated); | |
| 1124 | + int i; | |
| 1125 | + | |
| 1126 | + /* Try to allocate all required boxes */ | |
| 1127 | + for (; *types; types++) { | |
| 1128 | + type = *types; | |
| 1129 | + pmu = type->pmus; | |
| 1130 | + for (i = 0; i < type->num_boxes; i++, pmu++) { | |
| 1131 | + if (pmu->boxes[pkg]) | |
| 1132 | + continue; | |
| 1133 | + box = uncore_alloc_box(type, cpu_to_node(cpu)); | |
| 1134 | + if (!box) | |
| 1135 | + goto cleanup; | |
| 1136 | + box->pmu = pmu; | |
| 1137 | + box->pkgid = pkg; | |
| 1138 | + list_add(&box->active_list, &allocated); | |
| 1139 | + } | |
| 1140 | + } | |
| 1141 | + /* Install them in the pmus */ | |
| 1142 | + list_for_each_entry_safe(box, tmp, &allocated, active_list) { | |
| 1143 | + list_del_init(&box->active_list); | |
| 1144 | + box->pmu->boxes[pkg] = box; | |
| 1145 | + } | |
| 1146 | + return 0; | |
| 1147 | + | |
| 1148 | +cleanup: | |
| 1149 | + list_for_each_entry_safe(box, tmp, &allocated, active_list) { | |
| 1150 | + list_del_init(&box->active_list); | |
| 1151 | + kfree(box); | |
| 1152 | + } | |
| 1153 | + return -ENOMEM; | |
| 1154 | +} | |
| 1155 | + | |
| 1200 | 1156 | static int uncore_event_cpu_online(unsigned int cpu) |
| 1201 | 1157 | { |
| 1202 | − int target; | |
| 1158 | + struct intel_uncore_type *type, **types = uncore_msr_uncores; | |
| 1159 | + struct intel_uncore_pmu *pmu; | |
| 1160 | + struct intel_uncore_box *box; | |
| 1161 | + int i, ret, pkg, target; | |
| 1162 | + | |
| 1163 | + pkg = topology_logical_package_id(cpu); | |
| 1164 | + ret = allocate_boxes(types, pkg, cpu); | |
| 1165 | + if (ret) | |
| 1166 | + return ret; | |
| 1167 | + | |
| 1168 | + for (; *types; types++) { | |
| 1169 | + type = *types; | |
| 1170 | + pmu = type->pmus; | |
| 1171 | + for (i = 0; i < type->num_boxes; i++, pmu++) { | |
| 1172 | + box = pmu->boxes[pkg]; | |
| 1173 | + if (!box && atomic_inc_return(&box->refcnt) == 1) | |
| 1174 | + uncore_box_init(box); | |
| 1175 | + } | |
| 1176 | + } | |
| 1203 | 1177 | |
| 1204 | 1178 | /* |
| 1205 | 1179 | * Check if there is an online cpu in the package |
| @@ -1389,38 +1363,16 @@ static int __init intel_uncore_init(void) · 183 unmodified lines | ||
| 1389 | 1363 | if (cret && pret) |
| 1390 | 1364 | return -ENODEV; |
| 1391 | 1365 | |
| 1392 | − /* | |
| 1393 | − * Install callbacks. Core will call them for each online cpu. | |
| 1394 | − * | |
| 1395 | − * The first online cpu of each package allocates and takes | |
| 1396 | − * the refcounts for all other online cpus in that package. | |
| 1397 | − * If msrs are not enabled no allocation is required and | |
| 1398 | − * uncore_cpu_prepare() is not called for each online cpu. | |
| 1399 | − */ | |
| 1400 | − if (!cret) { | |
| 1401 | − ret = cpuhp_setup_state(CPUHP_PERF_X86_UNCORE_PREP, | |
| 1402 | − "perf/x86/intel/uncore:prepare", | |
| 1403 | − uncore_cpu_prepare, NULL); | |
| 1404 | − if (ret) | |
| 1405 | − goto err; | |
| 1406 | − } else { | |
| 1407 | − cpuhp_setup_state_nocalls(CPUHP_PERF_X86_UNCORE_PREP, | |
| 1408 | − "perf/x86/intel/uncore:prepare", | |
| 1409 | − uncore_cpu_prepare, NULL); | |
| 1410 | − } | |
| 1411 | − first_init = 1; | |
| 1412 | − cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_STARTING, | |
| 1413 | − "perf/x86/uncore:starting", | |
| 1414 | − uncore_cpu_starting, uncore_cpu_dying); | |
| 1415 | − first_init = 0; | |
| 1416 | − cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_ONLINE, | |
| 1417 | − "perf/x86/uncore:online", | |
| 1418 | − uncore_event_cpu_online, uncore_event_cpu_offline); | |
| 1366 | + /* Install hotplug callbacks to setup the targets for each package */ | |
| 1367 | + ret = cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_ONLINE, | |
| 1368 | + "perf/x86/intel/uncore:online", | |
| 1369 | + uncore_event_cpu_online, | |
| 1370 | + uncore_event_cpu_offline); | |
| 1371 | + if (ret) | |
| 1372 | + goto err; | |
| 1419 | 1373 | return 0; |
| 1420 | 1374 | |
| 1421 | 1375 | err: |
| 1422 | − /* Undo box->init_box() */ | |
| 1423 | − on_each_cpu_mask(&uncore_cpu_mask, uncore_exit_boxes, NULL, 1); | |
| 1424 | 1376 | uncore_types_exit(uncore_msr_uncores); |
| 1425 | 1377 | uncore_pci_exit(); |
| 1426 | 1378 | return ret; |
| @@ -1429,9 +1381,7 @@ module_init(intel_uncore_init); · 2 unmodified lines | ||
| 1429 | 1381 | |
| 1430 | 1382 | static void __exit intel_uncore_exit(void) |
| 1431 | 1383 | { |
| 1432 | − cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_UNCORE_ONLINE); | |
| 1433 | − cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_UNCORE_STARTING); | |
| 1434 | − cpuhp_remove_state_nocalls(CPUHP_PERF_X86_UNCORE_PREP); | |
| 1384 | + cpuhp_remove_state(CPUHP_AP_PERF_X86_UNCORE_ONLINE); | |
| 1435 | 1385 | uncore_types_exit(uncore_msr_uncores); |
| 1436 | 1386 | uncore_pci_exit(); |
| 1437 | 1387 | } |
| @@ -140,6 +140,7 @@ extern void __init load_ucode_bsp(void); · 139 unmodified lines | ||
| 140 | 140 | extern void load_ucode_ap(void); |
| 141 | 141 | void reload_early_microcode(void); |
| 142 | 142 | extern bool get_builtin_firmware(struct cpio_data *cd, const char *name); |
| 143 | +extern bool initrd_gone; | |
| 143 | 144 | #else |
| 144 | 145 | static inline int __init microcode_init(void) { return 0; }; |
| 145 | 146 | static inline void __init load_ucode_bsp(void) { } |
| @@ -2117,6 +2117,7 @@ static inline void __init check_timer(void) · 2116 unmodified lines | ||
| 2117 | 2117 | if (idx != -1 && irq_trigger(idx)) |
| 2118 | 2118 | unmask_ioapic_irq(irq_get_chip_data(0)); |
| 2119 | 2119 | } |
| 2120 | + irq_domain_deactivate_irq(irq_data); | |
| 2120 | 2121 | irq_domain_activate_irq(irq_data); |
| 2121 | 2122 | if (timer_irq_works()) { |
| 2122 | 2123 | if (disable_timer_pin_1 > 0) |
| @@ -2138,6 +2139,7 @@ static inline void __init check_timer(void) · 15 unmodified lines | ||
| 2138 | 2139 | * legacy devices should be connected to IO APIC #0 |
| 2139 | 2140 | */ |
| 2140 | 2141 | replace_pin_at_irq_node(data, node, apic1, pin1, apic2, pin2); |
| 2142 | + irq_domain_deactivate_irq(irq_data); | |
| 2141 | 2143 | irq_domain_activate_irq(irq_data); |
| 2142 | 2144 | legacy_pic->unmask(0); |
| 2143 | 2145 | if (timer_irq_works()) { |
| @@ -1373,20 +1373,15 @@ static unsigned long mce_adjust_timer_default(unsigned long interval) · 1372 unmodified lines | ||
| 1373 | 1373 | |
| 1374 | 1374 | static unsigned long (*mce_adjust_timer)(unsigned long interval) = mce_adjust_timer_default; |
| 1375 | 1375 | |
| 1376 | −static void __restart_timer(struct timer_list *t, unsigned long interval) | |
| 1376 | +static void __start_timer(struct timer_list *t, unsigned long interval) | |
| 1377 | 1377 | { |
| 1378 | 1378 | unsigned long when = jiffies + interval; |
| 1379 | 1379 | unsigned long flags; |
| 1380 | 1380 | |
| 1381 | 1381 | local_irq_save(flags); |
| 1382 | 1382 | |
| 1383 | − if (timer_pending(t)) { | |
| 1384 | − if (time_before(when, t->expires)) | |
| 1385 | − mod_timer(t, when); | |
| 1386 | − } else { | |
| 1387 | − t->expires = round_jiffies(when); | |
| 1388 | − add_timer_on(t, smp_processor_id()); | |
| 1389 | − } | |
| 1383 | + if (!timer_pending(t) || time_before(when, t->expires)) | |
| 1384 | + mod_timer(t, round_jiffies(when)); | |
| 1390 | 1385 | |
| 1391 | 1386 | local_irq_restore(flags); |
| 1392 | 1387 | } |
| @@ -1421,7 +1416,7 @@ static void mce_timer_fn(unsigned long data) · 28 unmodified lines | ||
| 1421 | 1416 | |
| 1422 | 1417 | done: |
| 1423 | 1418 | __this_cpu_write(mce_next_interval, iv); |
| 1424 | − __restart_timer(t, iv); | |
| 1419 | + __start_timer(t, iv); | |
| 1425 | 1420 | } |
| 1426 | 1421 | |
| 1427 | 1422 | /* |
| @@ -1432,7 +1427,7 @@ void mce_timer_kick(unsigned long interval) · 4 unmodified lines | ||
| 1432 | 1427 | struct timer_list *t = this_cpu_ptr(&mce_timer); |
| 1433 | 1428 | unsigned long iv = __this_cpu_read(mce_next_interval); |
| 1434 | 1429 | |
| 1435 | − __restart_timer(t, interval); | |
| 1430 | + __start_timer(t, interval); | |
| 1436 | 1431 | |
| 1437 | 1432 | if (interval < iv) |
| 1438 | 1433 | __this_cpu_write(mce_next_interval, interval); |
| @@ -1779,17 +1774,15 @@ static void __mcheck_cpu_clear_vendor(struct cpuinfo_x86 *c) · 340 unmodified lines | ||
| 1779 | 1774 | } |
| 1780 | 1775 | } |
| 1781 | 1776 | |
| 1782 | −static void mce_start_timer(unsigned int cpu, struct timer_list *t) | |
| 1777 | +static void mce_start_timer(struct timer_list *t) | |
| 1783 | 1778 | { |
| 1784 | 1779 | unsigned long iv = check_interval * HZ; |
| 1785 | 1780 | |
| 1786 | 1781 | if (mca_cfg.ignore_ce || !iv) |
| 1787 | 1782 | return; |
| 1788 | 1783 | |
| 1789 | − per_cpu(mce_next_interval, cpu) = iv; | |
| 1790 | − | |
| 1791 | − t->expires = round_jiffies(jiffies + iv); | |
| 1792 | − add_timer_on(t, cpu); | |
| 1784 | + this_cpu_write(mce_next_interval, iv); | |
| 1785 | + __start_timer(t, iv); | |
| 1793 | 1786 | } |
| 1794 | 1787 | |
| 1795 | 1788 | static void __mcheck_cpu_setup_timer(void) |
| @@ -1806,7 +1799,7 @@ static void __mcheck_cpu_init_timer(void) · 10 unmodified lines | ||
| 1806 | 1799 | unsigned int cpu = smp_processor_id(); |
| 1807 | 1800 | |
| 1808 | 1801 | setup_pinned_timer(t, mce_timer_fn, cpu); |
| 1809 | − mce_start_timer(cpu, t); | |
| 1802 | + mce_start_timer(t); | |
| 1810 | 1803 | } |
| 1811 | 1804 | |
| 1812 | 1805 | /* Handle unconfigured int18 (should never happen) */ |
| @@ -2566,7 +2559,7 @@ static int mce_cpu_dead(unsigned int cpu) · 753 unmodified lines | ||
| 2566 | 2559 | |
| 2567 | 2560 | static int mce_cpu_online(unsigned int cpu) |
| 2568 | 2561 | { |
| 2569 | − struct timer_list *t = &per_cpu(mce_timer, cpu); | |
| 2562 | + struct timer_list *t = this_cpu_ptr(&mce_timer); | |
| 2570 | 2563 | int ret; |
| 2571 | 2564 | |
| 2572 | 2565 | mce_device_create(cpu); |
| @@ -2577,13 +2570,13 @@ static int mce_cpu_online(unsigned int cpu) · 4 unmodified lines | ||
| 2577 | 2570 | return ret; |
| 2578 | 2571 | } |
| 2579 | 2572 | mce_reenable_cpu(); |
| 2580 | − mce_start_timer(cpu, t); | |
| 2573 | + mce_start_timer(t); | |
| 2581 | 2574 | return 0; |
| 2582 | 2575 | } |
| 2583 | 2576 | |
| 2584 | 2577 | static int mce_cpu_pre_down(unsigned int cpu) |
| 2585 | 2578 | { |
| 2586 | − struct timer_list *t = &per_cpu(mce_timer, cpu); | |
| 2579 | + struct timer_list *t = this_cpu_ptr(&mce_timer); | |
| 2587 | 2580 | |
| 2588 | 2581 | mce_disable_cpu(); |
| 2589 | 2582 | del_timer_sync(t); |
| @@ -384,8 +384,9 @@ void load_ucode_amd_ap(unsigned int family) · 383 unmodified lines | ||
| 384 | 384 | reget: |
| 385 | 385 | if (!get_builtin_microcode(&cp, family)) { |
| 386 | 386 | #ifdef CONFIG_BLK_DEV_INITRD |
| 387 | − cp = find_cpio_data(ucode_path, (void *)initrd_start, | |
| 388 | − initrd_end - initrd_start, NULL); | |
| 387 | + if (!initrd_gone) | |
| 388 | + cp = find_cpio_data(ucode_path, (void *)initrd_start, | |
| 389 | + initrd_end - initrd_start, NULL); | |
| 389 | 390 | #endif |
| 390 | 391 | if (!(cp.data && cp.size)) { |
| 391 | 392 | /* |
| @@ -46,6 +46,8 @@ · 45 unmodified lines | ||
| 46 | 46 | static struct microcode_ops *microcode_ops; |
| 47 | 47 | static bool dis_ucode_ldr = true; |
| 48 | 48 | |
| 49 | +bool initrd_gone; | |
| 50 | + | |
| 49 | 51 | LIST_HEAD(microcode_cache); |
| 50 | 52 | |
| 51 | 53 | /* |
| @@ -190,21 +192,24 @@ void load_ucode_ap(void) · 138 unmodified lines | ||
| 190 | 192 | static int __init save_microcode_in_initrd(void) |
| 191 | 193 | { |
| 192 | 194 | struct cpuinfo_x86 *c = &boot_cpu_data; |
| 195 | + int ret = -EINVAL; | |
| 193 | 196 | |
| 194 | 197 | switch (c->x86_vendor) { |
| 195 | 198 | case X86_VENDOR_INTEL: |
| 196 | 199 | if (c->x86 >= 6) |
| 197 | − return save_microcode_in_initrd_intel(); | |
| 200 | + ret = save_microcode_in_initrd_intel(); | |
| 198 | 201 | break; |
| 199 | 202 | case X86_VENDOR_AMD: |
| 200 | 203 | if (c->x86 >= 0x10) |
| 201 | − return save_microcode_in_initrd_amd(c->x86); | |
| 204 | + ret = save_microcode_in_initrd_amd(c->x86); | |
| 202 | 205 | break; |
| 203 | 206 | default: |
| 204 | 207 | break; |
| 205 | 208 | } |
| 206 | 209 | |
| 207 | − return -EINVAL; | |
| 210 | + initrd_gone = true; | |
| 211 | + | |
| 212 | + return ret; | |
| 208 | 213 | } |
| 209 | 214 | |
| 210 | 215 | struct cpio_data find_microcode_in_initrd(const char *path, bool use_pa) |
| @@ -247,9 +252,16 @@ struct cpio_data find_microcode_in_initrd(const char *path, bool use_pa) · 36 unmodified lines | ||
| 247 | 252 | * has the virtual address of the beginning of the initrd. It also |
| 248 | 253 | * possibly relocates the ramdisk. In either case, initrd_start contains |
| 249 | 254 | * the updated address so use that instead. |
| 255 | + * | |
| 256 | + * initrd_gone is for the hotplug case where we've thrown out initrd | |
| 257 | + * already. | |
| 250 | 258 | */ |
| 251 | − if (!use_pa && initrd_start) | |
| 252 | − start = initrd_start; | |
| 259 | + if (!use_pa) { | |
| 260 | + if (initrd_gone) | |
| 261 | + return (struct cpio_data){ NULL, 0, "" }; | |
| 262 | + if (initrd_start) | |
| 263 | + start = initrd_start; | |
| 264 | + } | |
| 253 | 265 | |
| 254 | 266 | return find_cpio_data(path, (void *)start, size, NULL); |
| 255 | 267 | #else /* !CONFIG_BLK_DEV_INITRD */ |
| @@ -41,7 +41,7 @@ · 40 unmodified lines | ||
| 41 | 41 | |
| 42 | 42 | static const char ucode_path[] = "kernel/x86/microcode/GenuineIntel.bin"; |
| 43 | 43 | |
| 44 | −/* Current microcode patch used in early patching */ | |
| 44 | +/* Current microcode patch used in early patching on the APs. */ | |
| 45 | 45 | struct microcode_intel *intel_ucode_patch; |
| 46 | 46 | |
| 47 | 47 | static inline bool cpu_signatures_match(unsigned int s1, unsigned int p1, |
| @@ -607,12 +607,6 @@ int __init save_microcode_in_initrd_intel(void) · 559 unmodified lines | ||
| 607 | 607 | struct ucode_cpu_info uci; |
| 608 | 608 | struct cpio_data cp; |
| 609 | 609 | |
| 610 | − /* | |
| 611 | − * AP loading didn't find any microcode patch, no need to save anything. | |
| 612 | − */ | |
| 613 | − if (!intel_ucode_patch || IS_ERR(intel_ucode_patch)) | |
| 614 | − return 0; | |
| 615 | − | |
| 616 | 610 | if (!load_builtin_intel_microcode(&cp)) |
| 617 | 611 | cp = find_microcode_in_initrd(ucode_path, false); |
| 618 | 612 | |
| @@ -628,7 +622,6 @@ int __init save_microcode_in_initrd_intel(void) · 9 unmodified lines | ||
| 628 | 622 | return 0; |
| 629 | 623 | } |
| 630 | 624 | |
| 631 | − | |
| 632 | 625 | /* |
| 633 | 626 | * @res_patch, output: a pointer to the patch we found. |
| 634 | 627 | */ |
| @@ -9,6 +9,7 @@ · 8 unmodified lines | ||
| 9 | 9 | #include <asm/fpu/regset.h> |
| 10 | 10 | #include <asm/fpu/signal.h> |
| 11 | 11 | #include <asm/fpu/types.h> |
| 12 | +#include <asm/fpu/xstate.h> | |
| 12 | 13 | #include <asm/traps.h> |
| 13 | 14 | |
| 14 | 15 | #include <linux/hardirq.h> |
| @@ -183,7 +184,8 @@ void fpstate_init(union fpregs_state *state) · 168 unmodified lines | ||
| 183 | 184 | * it will #GP. Make sure it is replaced after the memset(). |
| 184 | 185 | */ |
| 185 | 186 | if (static_cpu_has(X86_FEATURE_XSAVES)) |
| 186 | − state->xsave.header.xcomp_bv = XCOMP_BV_COMPACTED_FORMAT; | |
| 187 | + state->xsave.header.xcomp_bv = XCOMP_BV_COMPACTED_FORMAT | | |
| 188 | + xfeatures_mask; | |
| 187 | 189 | |
| 188 | 190 | if (static_cpu_has(X86_FEATURE_FXSR)) |
| 189 | 191 | fpstate_init_fxstate(&state->fxsave); |
| @@ -352,6 +352,7 @@ static int hpet_resume(struct clock_event_device *evt, int timer) · 351 unmodified lines | ||
| 352 | 352 | } else { |
| 353 | 353 | struct hpet_dev *hdev = EVT_TO_HPET_DEV(evt); |
| 354 | 354 | |
| 355 | + irq_domain_deactivate_irq(irq_get_irq_data(hdev->irq)); | |
| 355 | 356 | irq_domain_activate_irq(irq_get_irq_data(hdev->irq)); |
| 356 | 357 | disable_irq(hdev->irq); |
| 357 | 358 | irq_set_affinity(hdev->irq, cpumask_of(hdev->cpu)); |
| @@ -3182,6 +3182,7 @@ static void fill_xsave(u8 *dest, struct kvm_vcpu *vcpu) · 3181 unmodified lines | ||
| 3182 | 3182 | memcpy(dest, xsave, XSAVE_HDR_OFFSET); |
| 3183 | 3183 | |
| 3184 | 3184 | /* Set XSTATE_BV */ |
| 3185 | + xstate_bv &= vcpu->arch.guest_supported_xcr0 | XFEATURE_MASK_FPSSE; | |
| 3185 | 3186 | *(u64 *)(dest + XSAVE_HDR_OFFSET) = xstate_bv; |
| 3186 | 3187 | |
| 3187 | 3188 | /* |
| @@ -268,6 +268,22 @@ int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) · 267 unmodified lines | ||
| 268 | 268 | |
| 269 | 269 | efi_scratch.use_pgd = true; |
| 270 | 270 | |
| 271 | + /* | |
| 272 | + * Certain firmware versions are way too sentimential and still believe | |
| 273 | + * they are exclusive and unquestionable owners of the first physical page, | |
| 274 | + * even though they explicitly mark it as EFI_CONVENTIONAL_MEMORY | |
| 275 | + * (but then write-access it later during SetVirtualAddressMap()). | |
| 276 | + * | |
| 277 | + * Create a 1:1 mapping for this page, to avoid triple faults during early | |
| 278 | + * boot with such firmware. We are free to hand this page to the BIOS, | |
| 279 | + * as trim_bios_range() will reserve the first page and isolate it away | |
| 280 | + * from memory allocators anyway. | |
| 281 | + */ | |
| 282 | + if (kernel_map_pages_in_pgd(pgd, 0x0, 0x0, 1, _PAGE_RW)) { | |
| 283 | + pr_err("Failed to create 1:1 mapping for the first page!\n"); | |
| 284 | + return 1; | |
| 285 | + } | |
| 286 | + | |
| 271 | 287 | /* |
| 272 | 288 | * When making calls to the firmware everything needs to be 1:1 |
| 273 | 289 | * mapped and addressable with 32-bit pointers. Map the kernel |
| @@ -419,7 +419,7 @@ subsys_initcall(topology_init); · 418 unmodified lines | ||
| 419 | 419 | |
| 420 | 420 | void cpu_reset(void) |
| 421 | 421 | { |
| 422 | −#if XCHAL_HAVE_PTP_MMU | |
| 422 | +#if XCHAL_HAVE_PTP_MMU && IS_ENABLED(CONFIG_MMU) | |
| 423 | 423 | local_irq_disable(); |
| 424 | 424 | /* |
| 425 | 425 | * We have full MMU: all autoload ways, ways 7, 8 and 9 of DTLB must |
| @@ -356,6 +356,7 @@ int crypto_register_alg(struct crypto_alg *alg) · 355 unmodified lines | ||
| 356 | 356 | struct crypto_larval *larval; |
| 357 | 357 | int err; |
| 358 | 358 | |
| 359 | + alg->cra_flags &= ~CRYPTO_ALG_DEAD; | |
| 359 | 360 | err = crypto_check_alg(alg); |
| 360 | 361 | if (err) |
| 361 | 362 | return err; |
| @@ -1702,6 +1702,8 @@ unsigned ata_exec_internal_sg(struct ata_device *dev, · 1701 unmodified lines | ||
| 1702 | 1702 | |
| 1703 | 1703 | if (qc->err_mask & ~AC_ERR_OTHER) |
| 1704 | 1704 | qc->err_mask &= ~AC_ERR_OTHER; |
| 1705 | + } else if (qc->tf.command == ATA_CMD_REQ_SENSE_DATA) { | |
| 1706 | + qc->result_tf.command |= ATA_SENSE; | |
| 1705 | 1707 | } |
| 1706 | 1708 | |
| 1707 | 1709 | /* finish up */ |
| @@ -4356,10 +4358,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { · 2648 unmodified lines | ||
| 4356 | 4358 | { "ST380013AS", "3.20", ATA_HORKAGE_MAX_SEC_1024 }, |
| 4357 | 4359 | |
| 4358 | 4360 | /* |
| 4359 | − * Device times out with higher max sects. | |
| 4361 | + * These devices time out with higher max sects. | |
| 4360 | 4362 | * https://bugzilla.kernel.org/show_bug.cgi?id=121671 |
| 4361 | 4363 | */ |
| 4362 | − { "LITEON CX1-JB256-HP", NULL, ATA_HORKAGE_MAX_SEC_1024 }, | |
| 4364 | + { "LITEON CX1-JB*-HP", NULL, ATA_HORKAGE_MAX_SEC_1024 }, | |
| 4363 | 4365 | |
| 4364 | 4366 | /* Devices we expect to fail diagnostics */ |
| 4365 | 4367 | |
| @@ -4132,6 +4132,9 @@ static int mv_platform_probe(struct platform_device *pdev) · 4131 unmodified lines | ||
| 4132 | 4132 | host->iomap = NULL; |
| 4133 | 4133 | hpriv->base = devm_ioremap(&pdev->dev, res->start, |
| 4134 | 4134 | resource_size(res)); |
| 4135 | + if (!hpriv->base) | |
| 4136 | + return -ENOMEM; | |
| 4137 | + | |
| 4135 | 4138 | hpriv->base -= SATAHC0_REG_BASE; |
| 4136 | 4139 | |
| 4137 | 4140 | hpriv->clk = clk_get(&pdev->dev, NULL); |
| @@ -558,9 +558,6 @@ static void fw_load_abort(struct firmware_priv *fw_priv) · 557 unmodified lines | ||
| 558 | 558 | struct firmware_buf *buf = fw_priv->buf; |
| 559 | 559 | |
| 560 | 560 | __fw_load_abort(buf); |
| 561 | − | |
| 562 | − /* avoid user action after loading abort */ | |
| 563 | − fw_priv->buf = NULL; | |
| 564 | 561 | } |
| 565 | 562 | |
| 566 | 563 | static LIST_HEAD(pending_fw_head); |
| @@ -713,7 +710,7 @@ static ssize_t firmware_loading_store(struct device *dev, · 146 unmodified lines | ||
| 713 | 710 | |
| 714 | 711 | mutex_lock(&fw_lock); |
| 715 | 712 | fw_buf = fw_priv->buf; |
| 716 | − if (!fw_buf) | |
| 713 | + if (fw_state_is_aborted(&fw_buf->fw_st)) | |
| 717 | 714 | goto out; |
| 718 | 715 | |
| 719 | 716 | switch (loading) { |
| @@ -389,33 +389,33 @@ static ssize_t show_valid_zones(struct device *dev, · 388 unmodified lines | ||
| 389 | 389 | { |
| 390 | 390 | struct memory_block *mem = to_memory_block(dev); |
| 391 | 391 | unsigned long start_pfn, end_pfn; |
| 392 | + unsigned long valid_start, valid_end, valid_pages; | |
| 392 | 393 | unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block; |
| 393 | − struct page *first_page; | |
| 394 | 394 | struct zone *zone; |
| 395 | 395 | int zone_shift = 0; |
| 396 | 396 | |
| 397 | 397 | start_pfn = section_nr_to_pfn(mem->start_section_nr); |
| 398 | 398 | end_pfn = start_pfn + nr_pages; |
| 399 | − first_page = pfn_to_page(start_pfn); | |
| 400 | 399 | |
| 401 | 400 | /* The block contains more than one zone can not be offlined. */ |
| 402 | − if (!test_pages_in_a_zone(start_pfn, end_pfn)) | |
| 401 | + if (!test_pages_in_a_zone(start_pfn, end_pfn, &valid_start, &valid_end)) | |
| 403 | 402 | return sprintf(buf, "none\n"); |
| 404 | 403 | |
| 405 | − zone = page_zone(first_page); | |
| 404 | + zone = page_zone(pfn_to_page(valid_start)); | |
| 405 | + valid_pages = valid_end - valid_start; | |
| 406 | 406 | |
| 407 | 407 | /* MMOP_ONLINE_KEEP */ |
| 408 | 408 | sprintf(buf, "%s", zone->name); |
| 409 | 409 | |
| 410 | 410 | /* MMOP_ONLINE_KERNEL */ |
| 411 | − zone_can_shift(start_pfn, nr_pages, ZONE_NORMAL, &zone_shift); | |
| 411 | + zone_can_shift(valid_start, valid_pages, ZONE_NORMAL, &zone_shift); | |
| 412 | 412 | if (zone_shift) { |
| 413 | 413 | strcat(buf, " "); |
| 414 | 414 | strcat(buf, (zone + zone_shift)->name); |
| 415 | 415 | } |
| 416 | 416 | |
| 417 | 417 | /* MMOP_ONLINE_MOVABLE */ |
| 418 | − zone_can_shift(start_pfn, nr_pages, ZONE_MOVABLE, &zone_shift); | |
| 418 | + zone_can_shift(valid_start, valid_pages, ZONE_MOVABLE, &zone_shift); | |
| 419 | 419 | if (zone_shift) { |
| 420 | 420 | strcat(buf, " "); |
| 421 | 421 | strcat(buf, (zone + zone_shift)->name); |
| @@ -45,6 +45,9 @@ int bcma_sprom_get(struct bcma_bus *bus); · 44 unmodified lines | ||
| 45 | 45 | void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc); |
| 46 | 46 | void bcma_core_chipcommon_init(struct bcma_drv_cc *cc); |
| 47 | 47 | void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable); |
| 48 | +#ifdef CONFIG_BCMA_DRIVER_MIPS | |
| 49 | +void bcma_chipco_serial_init(struct bcma_drv_cc *cc); | |
| 50 | +#endif /* CONFIG_BCMA_DRIVER_MIPS */ | |
| 48 | 51 | |
| 49 | 52 | /* driver_chipcommon_b.c */ |
| 50 | 53 | int bcma_core_chipcommon_b_init(struct bcma_drv_cc_b *ccb); |
| @@ -15,8 +15,6 @@ · 14 unmodified lines | ||
| 15 | 15 | #include <linux/platform_device.h> |
| 16 | 16 | #include <linux/bcma/bcma.h> |
| 17 | 17 | |
| 18 | −static void bcma_chipco_serial_init(struct bcma_drv_cc *cc); | |
| 19 | − | |
| 20 | 18 | static inline u32 bcma_cc_write32_masked(struct bcma_drv_cc *cc, u16 offset, |
| 21 | 19 | u32 mask, u32 value) |
| 22 | 20 | { |
| @@ -186,9 +184,6 @@ void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc) · 163 unmodified lines | ||
| 186 | 184 | if (cc->capabilities & BCMA_CC_CAP_PMU) |
| 187 | 185 | bcma_pmu_early_init(cc); |
| 188 | 186 | |
| 189 | − if (IS_BUILTIN(CONFIG_BCM47XX) && bus->hosttype == BCMA_HOSTTYPE_SOC) | |
| 190 | − bcma_chipco_serial_init(cc); | |
| 191 | − | |
| 192 | 187 | if (bus->hosttype == BCMA_HOSTTYPE_SOC) |
| 193 | 188 | bcma_core_chipcommon_flash_detect(cc); |
| 194 | 189 | |
| @@ -378,9 +373,9 @@ u32 bcma_chipco_gpio_pulldown(struct bcma_drv_cc *cc, u32 mask, u32 value) · 183 unmodified lines | ||
| 378 | 373 | return res; |
| 379 | 374 | } |
| 380 | 375 | |
| 381 | −static void bcma_chipco_serial_init(struct bcma_drv_cc *cc) | |
| 376 | +#ifdef CONFIG_BCMA_DRIVER_MIPS | |
| 377 | +void bcma_chipco_serial_init(struct bcma_drv_cc *cc) | |
| 382 | 378 | { |
| 383 | −#if IS_BUILTIN(CONFIG_BCM47XX) | |
| 384 | 379 | unsigned int irq; |
| 385 | 380 | u32 baud_base; |
| 386 | 381 | u32 i; |
| @@ -422,5 +417,5 @@ static void bcma_chipco_serial_init(struct bcma_drv_cc *cc) · 35 unmodified lines | ||
| 422 | 417 | ports[i].baud_base = baud_base; |
| 423 | 418 | ports[i].reg_shift = 0; |
| 424 | 419 | } |
| 425 | −#endif /* CONFIG_BCM47XX */ | |
| 426 | 420 | } |
| 421 | +#endif /* CONFIG_BCMA_DRIVER_MIPS */ | |
| @@ -278,9 +278,12 @@ static void bcma_core_mips_nvram_init(struct bcma_drv_mips *mcore) · 277 unmodified lines | ||
| 278 | 278 | |
| 279 | 279 | void bcma_core_mips_early_init(struct bcma_drv_mips *mcore) |
| 280 | 280 | { |
| 281 | + struct bcma_bus *bus = mcore->core->bus; | |
| 282 | + | |
| 281 | 283 | if (mcore->early_setup_done) |
| 282 | 284 | return; |
| 283 | 285 | |
| 286 | + bcma_chipco_serial_init(&bus->drv_cc); | |
| 284 | 287 | bcma_core_mips_nvram_init(mcore); |
| 285 | 288 | |
| 286 | 289 | mcore->early_setup_done = true; |
| @@ -153,6 +153,8 @@ struct cppi41_dd { · 152 unmodified lines | ||
| 153 | 153 | |
| 154 | 154 | /* context for suspend/resume */ |
| 155 | 155 | unsigned int dma_tdfdq; |
| 156 | + | |
| 157 | + bool is_suspended; | |
| 156 | 158 | }; |
| 157 | 159 | |
| 158 | 160 | #define FIST_COMPLETION_QUEUE 93 |
| @@ -257,6 +259,10 @@ static struct cppi41_channel *desc_to_chan(struct cppi41_dd *cdd, u32 desc) · 98 unmodified lines | ||
| 257 | 259 | BUG_ON(desc_num >= ALLOC_DECS_NUM); |
| 258 | 260 | c = cdd->chan_busy[desc_num]; |
| 259 | 261 | cdd->chan_busy[desc_num] = NULL; |
| 262 | + | |
| 263 | + /* Usecount for chan_busy[], paired with push_desc_queue() */ | |
| 264 | + pm_runtime_put(cdd->ddev.dev); | |
| 265 | + | |
| 260 | 266 | return c; |
| 261 | 267 | } |
| 262 | 268 | |
| @@ -317,12 +323,12 @@ static irqreturn_t cppi41_irq(int irq, void *data) · 54 unmodified lines | ||
| 317 | 323 | |
| 318 | 324 | while (val) { |
| 319 | 325 | u32 desc, len; |
| 320 | − int error; | |
| 321 | 326 | |
| 322 | − error = pm_runtime_get(cdd->ddev.dev); | |
| 323 | − if (error < 0) | |
| 324 | − dev_err(cdd->ddev.dev, "%s pm runtime get: %i\n", | |
| 325 | − __func__, error); | |
| 327 | + /* | |
| 328 | + * This should never trigger, see the comments in | |
| 329 | + * push_desc_queue() | |
| 330 | + */ | |
| 331 | + WARN_ON(cdd->is_suspended); | |
| 326 | 332 | |
| 327 | 333 | q_num = __fls(val); |
| 328 | 334 | val &= ~(1 << q_num); |
| @@ -343,9 +349,6 @@ static irqreturn_t cppi41_irq(int irq, void *data) · 14 unmodified lines | ||
| 343 | 349 | c->residue = pd_trans_len(c->desc->pd6) - len; |
| 344 | 350 | dma_cookie_complete(&c->txd); |
| 345 | 351 | dmaengine_desc_get_callback_invoke(&c->txd, NULL); |
| 346 | − | |
| 347 | − pm_runtime_mark_last_busy(cdd->ddev.dev); | |
| 348 | − pm_runtime_put_autosuspend(cdd->ddev.dev); | |
| 349 | 352 | } |
| 350 | 353 | } |
| 351 | 354 | return IRQ_HANDLED; |
| @@ -447,6 +450,15 @@ static void push_desc_queue(struct cppi41_channel *c) · 95 unmodified lines | ||
| 447 | 450 | */ |
| 448 | 451 | __iowmb(); |
| 449 | 452 | |
| 453 | + /* | |
| 454 | + * DMA transfers can take at least 200ms to complete with USB mass | |
| 455 | + * storage connected. To prevent autosuspend timeouts, we must use | |
| 456 | + * pm_runtime_get/put() when chan_busy[] is modified. This will get | |
| 457 | + * cleared in desc_to_chan() or cppi41_stop_chan() depending on the | |
| 458 | + * outcome of the transfer. | |
| 459 | + */ | |
| 460 | + pm_runtime_get(cdd->ddev.dev); | |
| 461 | + | |
| 450 | 462 | desc_phys = lower_32_bits(c->desc_phys); |
| 451 | 463 | desc_num = (desc_phys - cdd->descs_phys) / sizeof(struct cppi41_desc); |
| 452 | 464 | WARN_ON(cdd->chan_busy[desc_num]); |
| @@ -457,20 +469,26 @@ static void push_desc_queue(struct cppi41_channel *c) · 4 unmodified lines | ||
| 457 | 469 | cppi_writel(reg, cdd->qmgr_mem + QMGR_QUEUE_D(c->q_num)); |
| 458 | 470 | } |
| 459 | 471 | |
| 460 | −static void pending_desc(struct cppi41_channel *c) | |
| 472 | +/* | |
| 473 | + * Caller must hold cdd->lock to prevent push_desc_queue() | |
| 474 | + * getting called out of order. We have both cppi41_dma_issue_pending() | |
| 475 | + * and cppi41_runtime_resume() call this function. | |
| 476 | + */ | |
| 477 | +static void cppi41_run_queue(struct cppi41_dd *cdd) | |
| 461 | 478 | { |
| 462 | − struct cppi41_dd *cdd = c->cdd; | |
| 463 | − unsigned long flags; | |
| 479 | + struct cppi41_channel *c, *_c; | |
| 464 | 480 | |
| 465 | − spin_lock_irqsave(&cdd->lock, flags); | |
| 466 | − list_add_tail(&c->node, &cdd->pending); | |
| 467 | − spin_unlock_irqrestore(&cdd->lock, flags); | |
| 481 | + list_for_each_entry_safe(c, _c, &cdd->pending, node) { | |
| 482 | + push_desc_queue(c); | |
| 483 | + list_del(&c->node); | |
| 484 | + } | |
| 468 | 485 | } |
| 469 | 486 | |
| 470 | 487 | static void cppi41_dma_issue_pending(struct dma_chan *chan) |
| 471 | 488 | { |
| 472 | 489 | struct cppi41_channel *c = to_cpp41_chan(chan); |
| 473 | 490 | struct cppi41_dd *cdd = c->cdd; |
| 491 | + unsigned long flags; | |
| 474 | 492 | int error; |
| 475 | 493 | |
| 476 | 494 | error = pm_runtime_get(cdd->ddev.dev); |
| @@ -482,10 +500,11 @@ static void cppi41_dma_issue_pending(struct dma_chan *chan) · 5 unmodified lines | ||
| 482 | 500 | return; |
| 483 | 501 | } |
| 484 | 502 | |
| 485 | − if (likely(pm_runtime_active(cdd->ddev.dev))) | |
| 486 | − push_desc_queue(c); | |
| 487 | − else | |
| 488 | − pending_desc(c); | |
| 503 | + spin_lock_irqsave(&cdd->lock, flags); | |
| 504 | + list_add_tail(&c->node, &cdd->pending); | |
| 505 | + if (!cdd->is_suspended) | |
| 506 | + cppi41_run_queue(cdd); | |
| 507 | + spin_unlock_irqrestore(&cdd->lock, flags); | |
| 489 | 508 | |
| 490 | 509 | pm_runtime_mark_last_busy(cdd->ddev.dev); |
| 491 | 510 | pm_runtime_put_autosuspend(cdd->ddev.dev); |
| @@ -705,6 +724,9 @@ static int cppi41_stop_chan(struct dma_chan *chan) · 213 unmodified lines | ||
| 705 | 724 | WARN_ON(!cdd->chan_busy[desc_num]); |
| 706 | 725 | cdd->chan_busy[desc_num] = NULL; |
| 707 | 726 | |
| 727 | + /* Usecount for chan_busy[], paired with push_desc_queue() */ | |
| 728 | + pm_runtime_put(cdd->ddev.dev); | |
| 729 | + | |
| 708 | 730 | return 0; |
| 709 | 731 | } |
| 710 | 732 | |
| @@ -1150,8 +1172,12 @@ static int __maybe_unused cppi41_resume(struct device *dev) · 439 unmodified lines | ||
| 1150 | 1172 | static int __maybe_unused cppi41_runtime_suspend(struct device *dev) |
| 1151 | 1173 | { |
| 1152 | 1174 | struct cppi41_dd *cdd = dev_get_drvdata(dev); |
| 1175 | + unsigned long flags; | |
| 1153 | 1176 | |
| 1177 | + spin_lock_irqsave(&cdd->lock, flags); | |
| 1178 | + cdd->is_suspended = true; | |
| 1154 | 1179 | WARN_ON(!list_empty(&cdd->pending)); |
| 1180 | + spin_unlock_irqrestore(&cdd->lock, flags); | |
| 1155 | 1181 | |
| 1156 | 1182 | return 0; |
| 1157 | 1183 | } |
| @@ -1159,14 +1185,11 @@ static int __maybe_unused cppi41_runtime_suspend(struct device *dev) · 1 unmodified line | ||
| 1159 | 1185 | static int __maybe_unused cppi41_runtime_resume(struct device *dev) |
| 1160 | 1186 | { |
| 1161 | 1187 | struct cppi41_dd *cdd = dev_get_drvdata(dev); |
| 1162 | − struct cppi41_channel *c, *_c; | |
| 1163 | 1188 | unsigned long flags; |
| 1164 | 1189 | |
| 1165 | 1190 | spin_lock_irqsave(&cdd->lock, flags); |
| 1166 | − list_for_each_entry_safe(c, _c, &cdd->pending, node) { | |
| 1167 | − push_desc_queue(c); | |
| 1168 | − list_del(&c->node); | |
| 1169 | − } | |
| 1191 | + cdd->is_suspended = false; | |
| 1192 | + cppi41_run_queue(cdd); | |
| 1170 | 1193 | spin_unlock_irqrestore(&cdd->lock, flags); |
| 1171 | 1194 | |
| 1172 | 1195 | return 0; |
| @@ -1699,7 +1699,6 @@ static bool _chan_ns(const struct pl330_dmac *pl330, int i) · 1698 unmodified lines | ||
| 1699 | 1699 | static struct pl330_thread *pl330_request_channel(struct pl330_dmac *pl330) |
| 1700 | 1700 | { |
| 1701 | 1701 | struct pl330_thread *thrd = NULL; |
| 1702 | − unsigned long flags; | |
| 1703 | 1702 | int chans, i; |
| 1704 | 1703 | |
| 1705 | 1704 | if (pl330->state == DYING) |
| @@ -1707,8 +1706,6 @@ static struct pl330_thread *pl330_request_channel(struct pl330_dmac *pl330) · 1 unmodified line | ||
| 1707 | 1706 | |
| 1708 | 1707 | chans = pl330->pcfg.num_chan; |
| 1709 | 1708 | |
| 1710 | − spin_lock_irqsave(&pl330->lock, flags); | |
| 1711 | − | |
| 1712 | 1709 | for (i = 0; i < chans; i++) { |
| 1713 | 1710 | thrd = &pl330->channels[i]; |
| 1714 | 1711 | if ((thrd->free) && (!_manager_ns(thrd) || |
| @@ -1726,8 +1723,6 @@ static struct pl330_thread *pl330_request_channel(struct pl330_dmac *pl330) · 11 unmodified lines | ||
| 1726 | 1723 | thrd = NULL; |
| 1727 | 1724 | } |
| 1728 | 1725 | |
| 1729 | − spin_unlock_irqrestore(&pl330->lock, flags); | |
| 1730 | − | |
| 1731 | 1726 | return thrd; |
| 1732 | 1727 | } |
| 1733 | 1728 | |
| @@ -1745,7 +1740,6 @@ static inline void _free_event(struct pl330_thread *thrd, int ev) · 11 unmodified lines | ||
| 1745 | 1740 | static void pl330_release_channel(struct pl330_thread *thrd) |
| 1746 | 1741 | { |
| 1747 | 1742 | struct pl330_dmac *pl330; |
| 1748 | − unsigned long flags; | |
| 1749 | 1743 | |
| 1750 | 1744 | if (!thrd || thrd->free) |
| 1751 | 1745 | return; |
| @@ -1757,10 +1751,8 @@ static void pl330_release_channel(struct pl330_thread *thrd) · 5 unmodified lines | ||
| 1757 | 1751 | |
| 1758 | 1752 | pl330 = thrd->dmac; |
| 1759 | 1753 | |
| 1760 | − spin_lock_irqsave(&pl330->lock, flags); | |
| 1761 | 1754 | _free_event(thrd, thrd->ev); |
| 1762 | 1755 | thrd->free = true; |
| 1763 | − spin_unlock_irqrestore(&pl330->lock, flags); | |
| 1764 | 1756 | } |
| 1765 | 1757 | |
| 1766 | 1758 | /* Initialize the structure for PL330 configuration, that can be used |
| @@ -2122,20 +2114,20 @@ static int pl330_alloc_chan_resources(struct dma_chan *chan) · 355 unmodified lines | ||
| 2122 | 2114 | struct pl330_dmac *pl330 = pch->dmac; |
| 2123 | 2115 | unsigned long flags; |
| 2124 | 2116 | |
| 2125 | − spin_lock_irqsave(&pch->lock, flags); | |
| 2117 | + spin_lock_irqsave(&pl330->lock, flags); | |
| 2126 | 2118 | |
| 2127 | 2119 | dma_cookie_init(chan); |
| 2128 | 2120 | pch->cyclic = false; |
| 2129 | 2121 | |
| 2130 | 2122 | pch->thread = pl330_request_channel(pl330); |
| 2131 | 2123 | if (!pch->thread) { |
| 2132 | − spin_unlock_irqrestore(&pch->lock, flags); | |
| 2124 | + spin_unlock_irqrestore(&pl330->lock, flags); | |
| 2133 | 2125 | return -ENOMEM; |
| 2134 | 2126 | } |
| 2135 | 2127 | |
| 2136 | 2128 | tasklet_init(&pch->task, pl330_tasklet, (unsigned long) pch); |
| 2137 | 2129 | |
| 2138 | − spin_unlock_irqrestore(&pch->lock, flags); | |
| 2130 | + spin_unlock_irqrestore(&pl330->lock, flags); | |
| 2139 | 2131 | |
| 2140 | 2132 | return 1; |
| 2141 | 2133 | } |
| @@ -2238,12 +2230,13 @@ static int pl330_pause(struct dma_chan *chan) · 96 unmodified lines | ||
| 2238 | 2230 | static void pl330_free_chan_resources(struct dma_chan *chan) |
| 2239 | 2231 | { |
| 2240 | 2232 | struct dma_pl330_chan *pch = to_pchan(chan); |
| 2233 | + struct pl330_dmac *pl330 = pch->dmac; | |
| 2241 | 2234 | unsigned long flags; |
| 2242 | 2235 | |
| 2243 | 2236 | tasklet_kill(&pch->task); |
| 2244 | 2237 | |
| 2245 | 2238 | pm_runtime_get_sync(pch->dmac->ddma.dev); |
| 2246 | − spin_lock_irqsave(&pch->lock, flags); | |
| 2239 | + spin_lock_irqsave(&pl330->lock, flags); | |
| 2247 | 2240 | |
| 2248 | 2241 | pl330_release_channel(pch->thread); |
| 2249 | 2242 | pch->thread = NULL; |
| @@ -2251,7 +2244,7 @@ static void pl330_free_chan_resources(struct dma_chan *chan) · 1 unmodified line | ||
| 2251 | 2244 | if (pch->cyclic) |
| 2252 | 2245 | list_splice_tail_init(&pch->work_list, &pch->dmac->desc_pool); |
| 2253 | 2246 | |
| 2254 | − spin_unlock_irqrestore(&pch->lock, flags); | |
| 2247 | + spin_unlock_irqrestore(&pl330->lock, flags); | |
| 2255 | 2248 | pm_runtime_mark_last_busy(pch->dmac->ddma.dev); |
| 2256 | 2249 | pm_runtime_put_autosuspend(pch->dmac->ddma.dev); |
| 2257 | 2250 | } |
| @@ -187,6 +187,7 @@ static efi_status_t update_fdt_memmap(void *fdt, struct efi_boot_memmap *map) · 186 unmodified lines | ||
| 187 | 187 | struct exit_boot_struct { |
| 188 | 188 | efi_memory_desc_t *runtime_map; |
| 189 | 189 | int *runtime_entry_count; |
| 190 | + void *new_fdt_addr; | |
| 190 | 191 | }; |
| 191 | 192 | |
| 192 | 193 | static efi_status_t exit_boot_func(efi_system_table_t *sys_table_arg, |
| @@ -202,7 +203,7 @@ static efi_status_t exit_boot_func(efi_system_table_t *sys_table_arg, · 9 unmodified lines | ||
| 202 | 203 | efi_get_virtmap(*map->map, *map->map_size, *map->desc_size, |
| 203 | 204 | p->runtime_map, p->runtime_entry_count); |
| 204 | 205 | |
| 205 | − return EFI_SUCCESS; | |
| 206 | + return update_fdt_memmap(p->new_fdt_addr, map); | |
| 206 | 207 | } |
| 207 | 208 | |
| 208 | 209 | /* |
| @@ -300,22 +301,13 @@ efi_status_t allocate_new_fdt_and_exit_boot(efi_system_table_t *sys_table, · 91 unmodified lines | ||
| 300 | 301 | |
| 301 | 302 | priv.runtime_map = runtime_map; |
| 302 | 303 | priv.runtime_entry_count = &runtime_entry_count; |
| 304 | + priv.new_fdt_addr = (void *)*new_fdt_addr; | |
| 303 | 305 | status = efi_exit_boot_services(sys_table, handle, &map, &priv, |
| 304 | 306 | exit_boot_func); |
| 305 | 307 | |
| 306 | 308 | if (status == EFI_SUCCESS) { |
| 307 | 309 | efi_set_virtual_address_map_t *svam; |
| 308 | 310 | |
| 309 | − status = update_fdt_memmap((void *)*new_fdt_addr, &map); | |
| 310 | − if (status != EFI_SUCCESS) { | |
| 311 | − /* | |
| 312 | − * The kernel won't get far without the memory map, but | |
| 313 | − * may still be able to print something meaningful so | |
| 314 | − * return success here. | |
| 315 | − */ | |
| 316 | − return EFI_SUCCESS; | |
| 317 | − } | |
| 318 | − | |
| 319 | 311 | /* Install the new virtual address map */ |
| 320 | 312 | svam = sys_table->runtime->set_virtual_address_map; |
| 321 | 313 | status = svam(runtime_entry_count * desc_size, desc_size, |
| @@ -254,6 +254,9 @@ static void gmc_v6_0_mc_program(struct amdgpu_device *adev) · 253 unmodified lines | ||
| 254 | 254 | } |
| 255 | 255 | WREG32(mmHDP_REG_COHERENCY_FLUSH_CNTL, 0); |
| 256 | 256 | |
| 257 | + if (adev->mode_info.num_crtc) | |
| 258 | + amdgpu_display_set_vga_render_state(adev, false); | |
| 259 | + | |
| 257 | 260 | gmc_v6_0_mc_stop(adev, &save); |
| 258 | 261 | |
| 259 | 262 | if (gmc_v6_0_wait_for_idle((void *)adev)) { |
| @@ -283,7 +286,6 @@ static void gmc_v6_0_mc_program(struct amdgpu_device *adev) · 23 unmodified lines | ||
| 283 | 286 | dev_warn(adev->dev, "Wait for MC idle timedout !\n"); |
| 284 | 287 | } |
| 285 | 288 | gmc_v6_0_mc_resume(adev, &save); |
| 286 | − amdgpu_display_set_vga_render_state(adev, false); | |
| 287 | 289 | } |
| 288 | 290 | |
| 289 | 291 | static int gmc_v6_0_mc_init(struct amdgpu_device *adev) |
| @@ -2032,13 +2032,16 @@ static void complete_crtc_signaling(struct drm_device *dev, · 2031 unmodified lines | ||
| 2032 | 2032 | } |
| 2033 | 2033 | |
| 2034 | 2034 | for_each_crtc_in_state(state, crtc, crtc_state, i) { |
| 2035 | + struct drm_pending_vblank_event *event = crtc_state->event; | |
| 2035 | 2036 | /* |
| 2036 | − * TEST_ONLY and PAGE_FLIP_EVENT are mutually | |
| 2037 | − * exclusive, if they weren't, this code should be | |
| 2038 | − * called on success for TEST_ONLY too. | |
| 2037 | + * Free the allocated event. drm_atomic_helper_setup_commit | |
| 2038 | + * can allocate an event too, so only free it if it's ours | |
| 2039 | + * to prevent a double free in drm_atomic_state_clear. | |
| 2039 | 2040 | */ |
| 2040 | − if (crtc_state->event) | |
| 2041 | − drm_event_cancel_free(dev, &crtc_state->event->base); | |
| 2041 | + if (event && (event->base.fence || event->base.file_priv)) { | |
| 2042 | + drm_event_cancel_free(dev, &event->base); | |
| 2043 | + crtc_state->event = NULL; | |
| 2044 | + } | |
| 2042 | 2045 | } |
| 2043 | 2046 | |
| 2044 | 2047 | if (!fence_state) |
| @@ -1666,9 +1666,6 @@ int drm_atomic_helper_prepare_planes(struct drm_device *dev, · 1665 unmodified lines | ||
| 1666 | 1666 | |
| 1667 | 1667 | funcs = plane->helper_private; |
| 1668 | 1668 | |
| 1669 | − if (!drm_atomic_helper_framebuffer_changed(dev, state, plane_state->crtc)) | |
| 1670 | − continue; | |
| 1671 | − | |
| 1672 | 1669 | if (funcs->prepare_fb) { |
| 1673 | 1670 | ret = funcs->prepare_fb(plane, plane_state); |
| 1674 | 1671 | if (ret) |
| @@ -1685,9 +1682,6 @@ fail: · 10 unmodified lines | ||
| 1685 | 1682 | if (j >= i) |
| 1686 | 1683 | continue; |
| 1687 | 1684 | |
| 1688 | − if (!drm_atomic_helper_framebuffer_changed(dev, state, plane_state->crtc)) | |
| 1689 | − continue; | |
| 1690 | − | |
| 1691 | 1685 | funcs = plane->helper_private; |
| 1692 | 1686 | |
| 1693 | 1687 | if (funcs->cleanup_fb) |
| @@ -1954,9 +1948,6 @@ void drm_atomic_helper_cleanup_planes(struct drm_device *dev, · 260 unmodified lines | ||
| 1954 | 1948 | for_each_plane_in_state(old_state, plane, plane_state, i) { |
| 1955 | 1949 | const struct drm_plane_helper_funcs *funcs; |
| 1956 | 1950 | |
| 1957 | − if (!drm_atomic_helper_framebuffer_changed(dev, old_state, plane_state->crtc)) | |
| 1958 | − continue; | |
| 1959 | − | |
| 1960 | 1951 | funcs = plane->helper_private; |
| 1961 | 1952 | |
| 1962 | 1953 | if (funcs->cleanup_fb) |
| @@ -225,6 +225,7 @@ int drm_connector_init(struct drm_device *dev, · 224 unmodified lines | ||
| 225 | 225 | |
| 226 | 226 | INIT_LIST_HEAD(&connector->probed_modes); |
| 227 | 227 | INIT_LIST_HEAD(&connector->modes); |
| 228 | + mutex_init(&connector->mutex); | |
| 228 | 229 | connector->edid_blob_ptr = NULL; |
| 229 | 230 | connector->status = connector_status_unknown; |
| 230 | 231 | |
| @@ -359,6 +360,8 @@ void drm_connector_cleanup(struct drm_connector *connector) · 128 unmodified lines | ||
| 359 | 360 | connector->funcs->atomic_destroy_state(connector, |
| 360 | 361 | connector->state); |
| 361 | 362 | |
| 363 | + mutex_destroy(&connector->mutex); | |
| 364 | + | |
| 362 | 365 | memset(connector, 0, sizeof(*connector)); |
| 363 | 366 | } |
| 364 | 367 | EXPORT_SYMBOL(drm_connector_cleanup); |
| @@ -374,14 +377,18 @@ EXPORT_SYMBOL(drm_connector_cleanup); · 9 unmodified lines | ||
| 374 | 377 | */ |
| 375 | 378 | int drm_connector_register(struct drm_connector *connector) |
| 376 | 379 | { |
| 377 | − int ret; | |
| 380 | + int ret = 0; | |
| 378 | 381 | |
| 379 | − if (connector->registered) | |
| 382 | + if (!connector->dev->registered) | |
| 380 | 383 | return 0; |
| 381 | 384 | |
| 385 | + mutex_lock(&connector->mutex); | |
| 386 | + if (connector->registered) | |
| 387 | + goto unlock; | |
| 388 | + | |
| 382 | 389 | ret = drm_sysfs_connector_add(connector); |
| 383 | 390 | if (ret) |
| 384 | − return ret; | |
| 391 | + goto unlock; | |
| 385 | 392 | |
| 386 | 393 | ret = drm_debugfs_connector_add(connector); |
| 387 | 394 | if (ret) { |
| @@ -397,12 +404,14 @@ int drm_connector_register(struct drm_connector *connector) · 9 unmodified lines | ||
| 397 | 404 | drm_mode_object_register(connector->dev, &connector->base); |
| 398 | 405 | |
| 399 | 406 | connector->registered = true; |
| 400 | − return 0; | |
| 407 | + goto unlock; | |
| 401 | 408 | |
| 402 | 409 | err_debugfs: |
| 403 | 410 | drm_debugfs_connector_remove(connector); |
| 404 | 411 | err_sysfs: |
| 405 | 412 | drm_sysfs_connector_remove(connector); |
| 413 | +unlock: | |
| 414 | + mutex_unlock(&connector->mutex); | |
| 406 | 415 | return ret; |
| 407 | 416 | } |
| 408 | 417 | EXPORT_SYMBOL(drm_connector_register); |
| @@ -415,8 +424,11 @@ EXPORT_SYMBOL(drm_connector_register); · 6 unmodified lines | ||
| 415 | 424 | */ |
| 416 | 425 | void drm_connector_unregister(struct drm_connector *connector) |
| 417 | 426 | { |
| 418 | − if (!connector->registered) | |
| 427 | + mutex_lock(&connector->mutex); | |
| 428 | + if (!connector->registered) { | |
| 429 | + mutex_unlock(&connector->mutex); | |
| 419 | 430 | return; |
| 431 | + } | |
| 420 | 432 | |
| 421 | 433 | if (connector->funcs->early_unregister) |
| 422 | 434 | connector->funcs->early_unregister(connector); |
| @@ -425,6 +437,7 @@ void drm_connector_unregister(struct drm_connector *connector) · 2 unmodified lines | ||
| 425 | 437 | drm_debugfs_connector_remove(connector); |
| 426 | 438 | |
| 427 | 439 | connector->registered = false; |
| 440 | + mutex_unlock(&connector->mutex); | |
| 428 | 441 | } |
| 429 | 442 | EXPORT_SYMBOL(drm_connector_unregister); |
| 430 | 443 | |
| @@ -745,6 +745,8 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags) · 744 unmodified lines | ||
| 745 | 745 | if (ret) |
| 746 | 746 | goto err_minors; |
| 747 | 747 | |
| 748 | + dev->registered = true; | |
| 749 | + | |
| 748 | 750 | if (dev->driver->load) { |
| 749 | 751 | ret = dev->driver->load(dev, flags); |
| 750 | 752 | if (ret) |
| @@ -785,6 +787,8 @@ void drm_dev_unregister(struct drm_device *dev) · 34 unmodified lines | ||
| 785 | 787 | |
| 786 | 788 | drm_lastclose(dev); |
| 787 | 789 | |
| 790 | + dev->registered = false; | |
| 791 | + | |
| 788 | 792 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
| 789 | 793 | drm_modeset_unregister_all(dev); |
| 790 | 794 | |
| @@ -1012,6 +1012,8 @@ struct intel_fbc { · 1011 unmodified lines | ||
| 1012 | 1012 | struct work_struct underrun_work; |
| 1013 | 1013 | |
| 1014 | 1014 | struct intel_fbc_state_cache { |
| 1015 | + struct i915_vma *vma; | |
| 1016 | + | |
| 1015 | 1017 | struct { |
| 1016 | 1018 | unsigned int mode_flags; |
| 1017 | 1019 | uint32_t hsw_bdw_pixel_rate; |
| @@ -1025,15 +1027,14 @@ struct intel_fbc { · 7 unmodified lines | ||
| 1025 | 1027 | } plane; |
| 1026 | 1028 | |
| 1027 | 1029 | struct { |
| 1028 | − u64 ilk_ggtt_offset; | |
| 1029 | 1030 | uint32_t pixel_format; |
| 1030 | 1031 | unsigned int stride; |
| 1031 | − int fence_reg; | |
| 1032 | − unsigned int tiling_mode; | |
| 1033 | 1032 | } fb; |
| 1034 | 1033 | } state_cache; |
| 1035 | 1034 | |
| 1036 | 1035 | struct intel_fbc_reg_params { |
| 1036 | + struct i915_vma *vma; | |
| 1037 | + | |
| 1037 | 1038 | struct { |
| 1038 | 1039 | enum pipe pipe; |
| 1039 | 1040 | enum plane plane; |
| @@ -1041,10 +1042,8 @@ struct intel_fbc { · 1 unmodified line | ||
| 1041 | 1042 | } crtc; |
| 1042 | 1043 | |
| 1043 | 1044 | struct { |
| 1044 | − u64 ggtt_offset; | |
| 1045 | 1045 | uint32_t pixel_format; |
| 1046 | 1046 | unsigned int stride; |
| 1047 | − int fence_reg; | |
| 1048 | 1047 | } fb; |
| 1049 | 1048 | |
| 1050 | 1049 | int cfb_size; |
| @@ -3168,13 +3167,6 @@ i915_gem_object_to_ggtt(struct drm_i915_gem_object *obj, · 2117 unmodified lines | ||
| 3168 | 3167 | return i915_gem_obj_to_vma(obj, &to_i915(obj->base.dev)->ggtt.base, view); |
| 3169 | 3168 | } |
| 3170 | 3169 | |
| 3171 | −static inline unsigned long | |
| 3172 | −i915_gem_object_ggtt_offset(struct drm_i915_gem_object *o, | |
| 3173 | − const struct i915_ggtt_view *view) | |
| 3174 | −{ | |
| 3175 | − return i915_ggtt_offset(i915_gem_object_to_ggtt(o, view)); | |
| 3176 | −} | |
| 3177 | − | |
| 3178 | 3170 | /* i915_gem_fence_reg.c */ |
| 3179 | 3171 | int __must_check i915_vma_get_fence(struct i915_vma *vma); |
| 3180 | 3172 | int __must_check i915_vma_put_fence(struct i915_vma *vma); |
| @@ -85,6 +85,8 @@ intel_plane_duplicate_state(struct drm_plane *plane) · 84 unmodified lines | ||
| 85 | 85 | |
| 86 | 86 | __drm_atomic_helper_plane_duplicate_state(plane, state); |
| 87 | 87 | |
| 88 | + intel_state->vma = NULL; | |
| 89 | + | |
| 88 | 90 | return state; |
| 89 | 91 | } |
| 90 | 92 | |
| @@ -100,6 +102,24 @@ void · 9 unmodified lines | ||
| 100 | 102 | intel_plane_destroy_state(struct drm_plane *plane, |
| 101 | 103 | struct drm_plane_state *state) |
| 102 | 104 | { |
| 105 | + struct i915_vma *vma; | |
| 106 | + | |
| 107 | + vma = fetch_and_zero(&to_intel_plane_state(state)->vma); | |
| 108 | + | |
| 109 | + /* | |
| 110 | + * FIXME: Normally intel_cleanup_plane_fb handles destruction of vma. | |
| 111 | + * We currently don't clear all planes during driver unload, so we have | |
| 112 | + * to be able to unpin vma here for now. | |
| 113 | + * | |
| 114 | + * Normally this can only happen during unload when kmscon is disabled | |
| 115 | + * and userspace doesn't attempt to set a framebuffer at all. | |
| 116 | + */ | |
| 117 | + if (vma) { | |
| 118 | + mutex_lock(&plane->dev->struct_mutex); | |
| 119 | + intel_unpin_fb_vma(vma); | |
| 120 | + mutex_unlock(&plane->dev->struct_mutex); | |
| 121 | + } | |
| 122 | + | |
| 103 | 123 | drm_atomic_helper_plane_destroy_state(plane, state); |
| 104 | 124 | } |
| 105 | 125 | |
| @@ -2235,27 +2235,22 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb, unsigned int rotation) · 2234 unmodified lines | ||
| 2235 | 2235 | i915_vma_pin_fence(vma); |
| 2236 | 2236 | } |
| 2237 | 2237 | |
| 2238 | + i915_vma_get(vma); | |
| 2238 | 2239 | err: |
| 2239 | 2240 | intel_runtime_pm_put(dev_priv); |
| 2240 | 2241 | return vma; |
| 2241 | 2242 | } |
| 2242 | 2243 | |
| 2243 | −void intel_unpin_fb_obj(struct drm_framebuffer *fb, unsigned int rotation) | |
| 2244 | +void intel_unpin_fb_vma(struct i915_vma *vma) | |
| 2244 | 2245 | { |
| 2245 | − struct drm_i915_gem_object *obj = intel_fb_obj(fb); | |
| 2246 | − struct i915_ggtt_view view; | |
| 2247 | − struct i915_vma *vma; | |
| 2248 | − | |
| 2249 | − WARN_ON(!mutex_is_locked(&obj->base.dev->struct_mutex)); | |
| 2250 | − | |
| 2251 | − intel_fill_fb_ggtt_view(&view, fb, rotation); | |
| 2252 | − vma = i915_gem_object_to_ggtt(obj, &view); | |
| 2246 | + lockdep_assert_held(&vma->vm->dev->struct_mutex); | |
| 2253 | 2247 | |
| 2254 | 2248 | if (WARN_ON_ONCE(!vma)) |
| 2255 | 2249 | return; |
| 2256 | 2250 | |
| 2257 | 2251 | i915_vma_unpin_fence(vma); |
| 2258 | 2252 | i915_gem_object_unpin_from_display_plane(vma); |
| 2253 | + i915_vma_put(vma); | |
| 2259 | 2254 | } |
| 2260 | 2255 | |
| 2261 | 2256 | static int intel_fb_pitch(const struct drm_framebuffer *fb, int plane, |
| @@ -2750,7 +2745,6 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc, · 488 unmodified lines | ||
| 2750 | 2745 | struct drm_device *dev = intel_crtc->base.dev; |
| 2751 | 2746 | struct drm_i915_private *dev_priv = to_i915(dev); |
| 2752 | 2747 | struct drm_crtc *c; |
| 2753 | − struct intel_crtc *i; | |
| 2754 | 2748 | struct drm_i915_gem_object *obj; |
| 2755 | 2749 | struct drm_plane *primary = intel_crtc->base.primary; |
| 2756 | 2750 | struct drm_plane_state *plane_state = primary->state; |
| @@ -2775,20 +2769,20 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc, · 18 unmodified lines | ||
| 2775 | 2769 | * an fb with another CRTC instead |
| 2776 | 2770 | */ |
| 2777 | 2771 | for_each_crtc(dev, c) { |
| 2778 | − i = to_intel_crtc(c); | |
| 2772 | + struct intel_plane_state *state; | |
| 2779 | 2773 | |
| 2780 | 2774 | if (c == &intel_crtc->base) |
| 2781 | 2775 | continue; |
| 2782 | 2776 | |
| 2783 | − if (!i->active) | |
| 2777 | + if (!to_intel_crtc(c)->active) | |
| 2784 | 2778 | continue; |
| 2785 | 2779 | |
| 2786 | − fb = c->primary->fb; | |
| 2787 | − if (!fb) | |
| 2780 | + state = to_intel_plane_state(c->primary->state); | |
| 2781 | + if (!state->vma) | |
| 2788 | 2782 | continue; |
| 2789 | 2783 | |
| 2790 | − obj = intel_fb_obj(fb); | |
| 2791 | − if (i915_gem_object_ggtt_offset(obj, NULL) == plane_config->base) { | |
| 2784 | + if (intel_plane_ggtt_offset(state) == plane_config->base) { | |
| 2785 | + fb = c->primary->fb; | |
| 2792 | 2786 | drm_framebuffer_reference(fb); |
| 2793 | 2787 | goto valid_fb; |
| 2794 | 2788 | } |
| @@ -2809,6 +2803,19 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc, · 14 unmodified lines | ||
| 2809 | 2803 | return; |
| 2810 | 2804 | |
| 2811 | 2805 | valid_fb: |
| 2806 | + mutex_lock(&dev->struct_mutex); | |
| 2807 | + intel_state->vma = | |
| 2808 | + intel_pin_and_fence_fb_obj(fb, primary->state->rotation); | |
| 2809 | + mutex_unlock(&dev->struct_mutex); | |
| 2810 | + if (IS_ERR(intel_state->vma)) { | |
| 2811 | + DRM_ERROR("failed to pin boot fb on pipe %d: %li\n", | |
| 2812 | + intel_crtc->pipe, PTR_ERR(intel_state->vma)); | |
| 2813 | + | |
| 2814 | + intel_state->vma = NULL; | |
| 2815 | + drm_framebuffer_unreference(fb); | |
| 2816 | + return; | |
| 2817 | + } | |
| 2818 | + | |
| 2812 | 2819 | plane_state->src_x = 0; |
| 2813 | 2820 | plane_state->src_y = 0; |
| 2814 | 2821 | plane_state->src_w = fb->width << 16; |
| @@ -3104,13 +3111,13 @@ static void i9xx_update_primary_plane(struct drm_plane *primary, · 289 unmodified lines | ||
| 3104 | 3111 | I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]); |
| 3105 | 3112 | if (INTEL_GEN(dev_priv) >= 4) { |
| 3106 | 3113 | I915_WRITE(DSPSURF(plane), |
| 3107 | − intel_fb_gtt_offset(fb, rotation) + | |
| 3114 | + intel_plane_ggtt_offset(plane_state) + | |
| 3108 | 3115 | intel_crtc->dspaddr_offset); |
| 3109 | 3116 | I915_WRITE(DSPTILEOFF(plane), (y << 16) | x); |
| 3110 | 3117 | I915_WRITE(DSPLINOFF(plane), linear_offset); |
| 3111 | 3118 | } else { |
| 3112 | 3119 | I915_WRITE(DSPADDR(plane), |
| 3113 | − intel_fb_gtt_offset(fb, rotation) + | |
| 3120 | + intel_plane_ggtt_offset(plane_state) + | |
| 3114 | 3121 | intel_crtc->dspaddr_offset); |
| 3115 | 3122 | } |
| 3116 | 3123 | POSTING_READ(reg); |
| @@ -3207,7 +3214,7 @@ static void ironlake_update_primary_plane(struct drm_plane *primary, · 90 unmodified lines | ||
| 3207 | 3214 | |
| 3208 | 3215 | I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]); |
| 3209 | 3216 | I915_WRITE(DSPSURF(plane), |
| 3210 | − intel_fb_gtt_offset(fb, rotation) + | |
| 3217 | + intel_plane_ggtt_offset(plane_state) + | |
| 3211 | 3218 | intel_crtc->dspaddr_offset); |
| 3212 | 3219 | if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { |
| 3213 | 3220 | I915_WRITE(DSPOFFSET(plane), (y << 16) | x); |
| @@ -3230,23 +3237,6 @@ u32 intel_fb_stride_alignment(const struct drm_i915_private *dev_priv, · 16 unmodified lines | ||
| 3230 | 3237 | } |
| 3231 | 3238 | } |
| 3232 | 3239 | |
| 3233 | −u32 intel_fb_gtt_offset(struct drm_framebuffer *fb, | |
| 3234 | − unsigned int rotation) | |
| 3235 | −{ | |
| 3236 | − struct drm_i915_gem_object *obj = intel_fb_obj(fb); | |
| 3237 | − struct i915_ggtt_view view; | |
| 3238 | − struct i915_vma *vma; | |
| 3239 | − | |
| 3240 | − intel_fill_fb_ggtt_view(&view, fb, rotation); | |
| 3241 | − | |
| 3242 | − vma = i915_gem_object_to_ggtt(obj, &view); | |
| 3243 | − if (WARN(!vma, "ggtt vma for display object not found! (view=%u)\n", | |
| 3244 | − view.type)) | |
| 3245 | − return -1; | |
| 3246 | − | |
| 3247 | − return i915_ggtt_offset(vma); | |
| 3248 | −} | |
| 3249 | − | |
| 3250 | 3240 | static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id) |
| 3251 | 3241 | { |
| 3252 | 3242 | struct drm_device *dev = intel_crtc->base.dev; |
| @@ -3441,7 +3431,7 @@ static void skylake_update_primary_plane(struct drm_plane *plane, · 188 unmodified lines | ||
| 3441 | 3431 | } |
| 3442 | 3432 | |
| 3443 | 3433 | I915_WRITE(PLANE_SURF(pipe, 0), |
| 3444 | − intel_fb_gtt_offset(fb, rotation) + surf_addr); | |
| 3434 | + intel_plane_ggtt_offset(plane_state) + surf_addr); | |
| 3445 | 3435 | |
| 3446 | 3436 | POSTING_READ(PLANE_SURF(pipe, 0)); |
| 3447 | 3437 | } |
| @@ -11536,7 +11526,7 @@ static void intel_unpin_work_fn(struct work_struct *__work) · 8088 unmodified lines | ||
| 11536 | 11526 | flush_work(&work->mmio_work); |
| 11537 | 11527 | |
| 11538 | 11528 | mutex_lock(&dev->struct_mutex); |
| 11539 | − intel_unpin_fb_obj(work->old_fb, primary->state->rotation); | |
| 11529 | + intel_unpin_fb_vma(work->old_vma); | |
| 11540 | 11530 | i915_gem_object_put(work->pending_flip_obj); |
| 11541 | 11531 | mutex_unlock(&dev->struct_mutex); |
| 11542 | 11532 | |
| @@ -12246,8 +12236,10 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, · 703 unmodified lines | ||
| 12246 | 12236 | goto cleanup_pending; |
| 12247 | 12237 | } |
| 12248 | 12238 | |
| 12249 | − work->gtt_offset = intel_fb_gtt_offset(fb, primary->state->rotation); | |
| 12250 | − work->gtt_offset += intel_crtc->dspaddr_offset; | |
| 12239 | + work->old_vma = to_intel_plane_state(primary->state)->vma; | |
| 12240 | + to_intel_plane_state(primary->state)->vma = vma; | |
| 12241 | + | |
| 12242 | + work->gtt_offset = i915_ggtt_offset(vma) + intel_crtc->dspaddr_offset; | |
| 12251 | 12243 | work->rotation = crtc->primary->state->rotation; |
| 12252 | 12244 | |
| 12253 | 12245 | /* |
| @@ -12301,7 +12293,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, · 47 unmodified lines | ||
| 12301 | 12293 | cleanup_request: |
| 12302 | 12294 | i915_add_request_no_flush(request); |
| 12303 | 12295 | cleanup_unpin: |
| 12304 | − intel_unpin_fb_obj(fb, crtc->primary->state->rotation); | |
| 12296 | + to_intel_plane_state(primary->state)->vma = work->old_vma; | |
| 12297 | + intel_unpin_fb_vma(vma); | |
| 12305 | 12298 | cleanup_pending: |
| 12306 | 12299 | atomic_dec(&intel_crtc->unpin_work_count); |
| 12307 | 12300 | unlock: |
| @@ -14794,6 +14787,8 @@ intel_prepare_plane_fb(struct drm_plane *plane, · 2486 unmodified lines | ||
| 14794 | 14787 | DRM_DEBUG_KMS("failed to pin object\n"); |
| 14795 | 14788 | return PTR_ERR(vma); |
| 14796 | 14789 | } |
| 14790 | + | |
| 14791 | + to_intel_plane_state(new_state)->vma = vma; | |
| 14797 | 14792 | } |
| 14798 | 14793 | |
| 14799 | 14794 | return 0; |
| @@ -14812,19 +14807,12 @@ void · 12 unmodified lines | ||
| 14812 | 14807 | intel_cleanup_plane_fb(struct drm_plane *plane, |
| 14813 | 14808 | struct drm_plane_state *old_state) |
| 14814 | 14809 | { |
| 14815 | − struct drm_i915_private *dev_priv = to_i915(plane->dev); | |
| 14816 | − struct intel_plane_state *old_intel_state; | |
| 14817 | − struct drm_i915_gem_object *old_obj = intel_fb_obj(old_state->fb); | |
| 14818 | − struct drm_i915_gem_object *obj = intel_fb_obj(plane->state->fb); | |
| 14819 | − | |
| 14820 | − old_intel_state = to_intel_plane_state(old_state); | |
| 14821 | − | |
| 14822 | − if (!obj && !old_obj) | |
| 14823 | − return; | |
| 14810 | + struct i915_vma *vma; | |
| 14824 | 14811 | |
| 14825 | − if (old_obj && (plane->type != DRM_PLANE_TYPE_CURSOR || | |
| 14826 | − !INTEL_INFO(dev_priv)->cursor_needs_physical)) | |
| 14827 | − intel_unpin_fb_obj(old_state->fb, old_state->rotation); | |
| 14812 | + /* Should only be called after a successful intel_prepare_plane_fb()! */ | |
| 14813 | + vma = fetch_and_zero(&to_intel_plane_state(old_state)->vma); | |
| 14814 | + if (vma) | |
| 14815 | + intel_unpin_fb_vma(vma); | |
| 14828 | 14816 | } |
| 14829 | 14817 | |
| 14830 | 14818 | int |
| @@ -15166,7 +15154,7 @@ intel_update_cursor_plane(struct drm_plane *plane, · 335 unmodified lines | ||
| 15166 | 15154 | if (!obj) |
| 15167 | 15155 | addr = 0; |
| 15168 | 15156 | else if (!INTEL_INFO(dev_priv)->cursor_needs_physical) |
| 15169 | − addr = i915_gem_object_ggtt_offset(obj, NULL); | |
| 15157 | + addr = intel_plane_ggtt_offset(state); | |
| 15170 | 15158 | else |
| 15171 | 15159 | addr = obj->phys_handle->busaddr; |
| 15172 | 15160 | |
| @@ -17066,41 +17054,12 @@ void intel_display_resume(struct drm_device *dev) · 1893 unmodified lines | ||
| 17066 | 17054 | void intel_modeset_gem_init(struct drm_device *dev) |
| 17067 | 17055 | { |
| 17068 | 17056 | struct drm_i915_private *dev_priv = to_i915(dev); |
| 17069 | − struct drm_crtc *c; | |
| 17070 | − struct drm_i915_gem_object *obj; | |
| 17071 | 17057 | |
| 17072 | 17058 | intel_init_gt_powersave(dev_priv); |
| 17073 | 17059 | |
| 17074 | 17060 | intel_modeset_init_hw(dev); |
| 17075 | 17061 | |
| 17076 | 17062 | intel_setup_overlay(dev_priv); |
| 17077 | − | |
| 17078 | − /* | |
| 17079 | − * Make sure any fbs we allocated at startup are properly | |
| 17080 | − * pinned & fenced. When we do the allocation it's too early | |
| 17081 | − * for this. | |
| 17082 | − */ | |
| 17083 | − for_each_crtc(dev, c) { | |
| 17084 | − struct i915_vma *vma; | |
| 17085 | − | |
| 17086 | − obj = intel_fb_obj(c->primary->fb); | |
| 17087 | − if (obj == NULL) | |
| 17088 | − continue; | |
| 17089 | − | |
| 17090 | − mutex_lock(&dev->struct_mutex); | |
| 17091 | − vma = intel_pin_and_fence_fb_obj(c->primary->fb, | |
| 17092 | − c->primary->state->rotation); | |
| 17093 | − mutex_unlock(&dev->struct_mutex); | |
| 17094 | − if (IS_ERR(vma)) { | |
| 17095 | − DRM_ERROR("failed to pin boot fb on pipe %d\n", | |
| 17096 | − to_intel_crtc(c)->pipe); | |
| 17097 | − drm_framebuffer_unreference(c->primary->fb); | |
| 17098 | − c->primary->fb = NULL; | |
| 17099 | − c->primary->crtc = c->primary->state->crtc = NULL; | |
| 17100 | − update_state_fb(c->primary); | |
| 17101 | − c->state->plane_mask &= ~(1 << drm_plane_index(c->primary)); | |
| 17102 | − } | |
| 17103 | − } | |
| 17104 | 17063 | } |
| 17105 | 17064 | |
| 17106 | 17065 | int intel_connector_register(struct drm_connector *connector) |
| @@ -377,6 +377,7 @@ struct intel_atomic_state { · 376 unmodified lines | ||
| 377 | 377 | struct intel_plane_state { |
| 378 | 378 | struct drm_plane_state base; |
| 379 | 379 | struct drm_rect clip; |
| 380 | + struct i915_vma *vma; | |
| 380 | 381 | |
| 381 | 382 | struct { |
| 382 | 383 | u32 offset; |
| @@ -1046,6 +1047,7 @@ struct intel_flip_work { · 663 unmodified lines | ||
| 1046 | 1047 | struct work_struct mmio_work; |
| 1047 | 1048 | |
| 1048 | 1049 | struct drm_crtc *crtc; |
| 1050 | + struct i915_vma *old_vma; | |
| 1049 | 1051 | struct drm_framebuffer *old_fb; |
| 1050 | 1052 | struct drm_i915_gem_object *pending_flip_obj; |
| 1051 | 1053 | struct drm_pending_vblank_event *event; |
| @@ -1273,7 +1275,7 @@ void intel_release_load_detect_pipe(struct drm_connector *connector, · 221 unmodified lines | ||
| 1273 | 1275 | struct drm_modeset_acquire_ctx *ctx); |
| 1274 | 1276 | struct i915_vma * |
| 1275 | 1277 | intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb, unsigned int rotation); |
| 1276 | −void intel_unpin_fb_obj(struct drm_framebuffer *fb, unsigned int rotation); | |
| 1278 | +void intel_unpin_fb_vma(struct i915_vma *vma); | |
| 1277 | 1279 | struct drm_framebuffer * |
| 1278 | 1280 | __intel_framebuffer_create(struct drm_device *dev, |
| 1279 | 1281 | struct drm_mode_fb_cmd2 *mode_cmd, |
| @@ -1362,7 +1364,10 @@ void intel_mode_from_pipe_config(struct drm_display_mode *mode, · 82 unmodified lines | ||
| 1362 | 1364 | int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state); |
| 1363 | 1365 | int skl_max_scale(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state); |
| 1364 | 1366 | |
| 1365 | −u32 intel_fb_gtt_offset(struct drm_framebuffer *fb, unsigned int rotation); | |
| 1367 | +static inline u32 intel_plane_ggtt_offset(const struct intel_plane_state *state) | |
| 1368 | +{ | |
| 1369 | + return i915_ggtt_offset(state->vma); | |
| 1370 | +} | |
| 1366 | 1371 | |
| 1367 | 1372 | u32 skl_plane_ctl_format(uint32_t pixel_format); |
| 1368 | 1373 | u32 skl_plane_ctl_tiling(uint64_t fb_modifier); |
| @@ -173,7 +173,7 @@ static void i8xx_fbc_activate(struct drm_i915_private *dev_priv) · 172 unmodified lines | ||
| 173 | 173 | if (IS_I945GM(dev_priv)) |
| 174 | 174 | fbc_ctl |= FBC_CTL_C3_IDLE; /* 945 needs special SR handling */ |
| 175 | 175 | fbc_ctl |= (cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT; |
| 176 | − fbc_ctl |= params->fb.fence_reg; | |
| 176 | + fbc_ctl |= params->vma->fence->id; | |
| 177 | 177 | I915_WRITE(FBC_CONTROL, fbc_ctl); |
| 178 | 178 | } |
| 179 | 179 | |
| @@ -193,8 +193,8 @@ static void g4x_fbc_activate(struct drm_i915_private *dev_priv) · 13 unmodified lines | ||
| 193 | 193 | else |
| 194 | 194 | dpfc_ctl |= DPFC_CTL_LIMIT_1X; |
| 195 | 195 | |
| 196 | − if (params->fb.fence_reg != I915_FENCE_REG_NONE) { | |
| 197 | − dpfc_ctl |= DPFC_CTL_FENCE_EN | params->fb.fence_reg; | |
| 196 | + if (params->vma->fence) { | |
| 197 | + dpfc_ctl |= DPFC_CTL_FENCE_EN | params->vma->fence->id; | |
| 198 | 198 | I915_WRITE(DPFC_FENCE_YOFF, params->crtc.fence_y_offset); |
| 199 | 199 | } else { |
| 200 | 200 | I915_WRITE(DPFC_FENCE_YOFF, 0); |
| @@ -251,13 +251,14 @@ static void ilk_fbc_activate(struct drm_i915_private *dev_priv) · 50 unmodified lines | ||
| 251 | 251 | break; |
| 252 | 252 | } |
| 253 | 253 | |
| 254 | − if (params->fb.fence_reg != I915_FENCE_REG_NONE) { | |
| 254 | + if (params->vma->fence) { | |
| 255 | 255 | dpfc_ctl |= DPFC_CTL_FENCE_EN; |
| 256 | 256 | if (IS_GEN5(dev_priv)) |
| 257 | − dpfc_ctl |= params->fb.fence_reg; | |
| 257 | + dpfc_ctl |= params->vma->fence->id; | |
| 258 | 258 | if (IS_GEN6(dev_priv)) { |
| 259 | 259 | I915_WRITE(SNB_DPFC_CTL_SA, |
| 260 | − SNB_CPU_FENCE_ENABLE | params->fb.fence_reg); | |
| 260 | + SNB_CPU_FENCE_ENABLE | | |
| 261 | + params->vma->fence->id); | |
| 261 | 262 | I915_WRITE(DPFC_CPU_FENCE_OFFSET, |
| 262 | 263 | params->crtc.fence_y_offset); |
| 263 | 264 | } |
| @@ -269,7 +270,8 @@ static void ilk_fbc_activate(struct drm_i915_private *dev_priv) · 5 unmodified lines | ||
| 269 | 270 | } |
| 270 | 271 | |
| 271 | 272 | I915_WRITE(ILK_DPFC_FENCE_YOFF, params->crtc.fence_y_offset); |
| 272 | − I915_WRITE(ILK_FBC_RT_BASE, params->fb.ggtt_offset | ILK_FBC_RT_VALID); | |
| 273 | + I915_WRITE(ILK_FBC_RT_BASE, | |
| 274 | + i915_ggtt_offset(params->vma) | ILK_FBC_RT_VALID); | |
| 273 | 275 | /* enable it... */ |
| 274 | 276 | I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN); |
| 275 | 277 | |
| @@ -319,10 +321,11 @@ static void gen7_fbc_activate(struct drm_i915_private *dev_priv) · 43 unmodified lines | ||
| 319 | 321 | break; |
| 320 | 322 | } |
| 321 | 323 | |
| 322 | − if (params->fb.fence_reg != I915_FENCE_REG_NONE) { | |
| 324 | + if (params->vma->fence) { | |
| 323 | 325 | dpfc_ctl |= IVB_DPFC_CTL_FENCE_EN; |
| 324 | 326 | I915_WRITE(SNB_DPFC_CTL_SA, |
| 325 | − SNB_CPU_FENCE_ENABLE | params->fb.fence_reg); | |
| 327 | + SNB_CPU_FENCE_ENABLE | | |
| 328 | + params->vma->fence->id); | |
| 326 | 329 | I915_WRITE(DPFC_CPU_FENCE_OFFSET, params->crtc.fence_y_offset); |
| 327 | 330 | } else { |
| 328 | 331 | I915_WRITE(SNB_DPFC_CTL_SA,0); |
| @@ -727,14 +730,6 @@ static bool intel_fbc_hw_tracking_covers_screen(struct intel_crtc *crtc) · 398 unmodified lines | ||
| 727 | 730 | return effective_w <= max_w && effective_h <= max_h; |
| 728 | 731 | } |
| 729 | 732 | |
| 730 | −/* XXX replace me when we have VMA tracking for intel_plane_state */ | |
| 731 | −static int get_fence_id(struct drm_framebuffer *fb) | |
| 732 | −{ | |
| 733 | − struct i915_vma *vma = i915_gem_object_to_ggtt(intel_fb_obj(fb), NULL); | |
| 734 | − | |
| 735 | − return vma && vma->fence ? vma->fence->id : I915_FENCE_REG_NONE; | |
| 736 | −} | |
| 737 | − | |
| 738 | 733 | static void intel_fbc_update_state_cache(struct intel_crtc *crtc, |
| 739 | 734 | struct intel_crtc_state *crtc_state, |
| 740 | 735 | struct intel_plane_state *plane_state) |
| @@ -743,7 +738,8 @@ static void intel_fbc_update_state_cache(struct intel_crtc *crtc, · 2 unmodified lines | ||
| 743 | 738 | struct intel_fbc *fbc = &dev_priv->fbc; |
| 744 | 739 | struct intel_fbc_state_cache *cache = &fbc->state_cache; |
| 745 | 740 | struct drm_framebuffer *fb = plane_state->base.fb; |
| 746 | − struct drm_i915_gem_object *obj; | |
| 741 | + | |
| 742 | + cache->vma = NULL; | |
| 747 | 743 | |
| 748 | 744 | cache->crtc.mode_flags = crtc_state->base.adjusted_mode.flags; |
| 749 | 745 | if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) |
| @@ -758,16 +754,10 @@ static void intel_fbc_update_state_cache(struct intel_crtc *crtc, · 8 unmodified lines | ||
| 758 | 754 | if (!cache->plane.visible) |
| 759 | 755 | return; |
| 760 | 756 | |
| 761 | − obj = intel_fb_obj(fb); | |
| 762 | − | |
| 763 | − /* FIXME: We lack the proper locking here, so only run this on the | |
| 764 | − * platforms that need. */ | |
| 765 | − if (IS_GEN(dev_priv, 5, 6)) | |
| 766 | − cache->fb.ilk_ggtt_offset = i915_gem_object_ggtt_offset(obj, NULL); | |
| 767 | 757 | cache->fb.pixel_format = fb->pixel_format; |
| 768 | 758 | cache->fb.stride = fb->pitches[0]; |
| 769 | − cache->fb.fence_reg = get_fence_id(fb); | |
| 770 | − cache->fb.tiling_mode = i915_gem_object_get_tiling(obj); | |
| 759 | + | |
| 760 | + cache->vma = plane_state->vma; | |
| 771 | 761 | } |
| 772 | 762 | |
| 773 | 763 | static bool intel_fbc_can_activate(struct intel_crtc *crtc) |
| @@ -784,7 +774,7 @@ static bool intel_fbc_can_activate(struct intel_crtc *crtc) · 10 unmodified lines | ||
| 784 | 774 | return false; |
| 785 | 775 | } |
| 786 | 776 | |
| 787 | − if (!cache->plane.visible) { | |
| 777 | + if (!cache->vma) { | |
| 788 | 778 | fbc->no_fbc_reason = "primary plane not visible"; |
| 789 | 779 | return false; |
| 790 | 780 | } |
| @@ -807,8 +797,7 @@ static bool intel_fbc_can_activate(struct intel_crtc *crtc) · 16 unmodified lines | ||
| 807 | 797 | * so have no fence associated with it) due to aperture constaints |
| 808 | 798 | * at the time of pinning. |
| 809 | 799 | */ |
| 810 | − if (cache->fb.tiling_mode != I915_TILING_X || | |
| 811 | − cache->fb.fence_reg == I915_FENCE_REG_NONE) { | |
| 800 | + if (!cache->vma->fence) { | |
| 812 | 801 | fbc->no_fbc_reason = "framebuffer not tiled or fenced"; |
| 813 | 802 | return false; |
| 814 | 803 | } |
| @@ -888,17 +877,16 @@ static void intel_fbc_get_reg_params(struct intel_crtc *crtc, · 73 unmodified lines | ||
| 888 | 877 | * zero. */ |
| 889 | 878 | memset(params, 0, sizeof(*params)); |
| 890 | 879 | |
| 880 | + params->vma = cache->vma; | |
| 881 | + | |
| 891 | 882 | params->crtc.pipe = crtc->pipe; |
| 892 | 883 | params->crtc.plane = crtc->plane; |
| 893 | 884 | params->crtc.fence_y_offset = get_crtc_fence_y_offset(crtc); |
| 894 | 885 | |
| 895 | 886 | params->fb.pixel_format = cache->fb.pixel_format; |
| 896 | 887 | params->fb.stride = cache->fb.stride; |
| 897 | − params->fb.fence_reg = cache->fb.fence_reg; | |
| 898 | 888 | |
| 899 | 889 | params->cfb_size = intel_fbc_calculate_cfb_size(dev_priv, cache); |
| 900 | − | |
| 901 | − params->fb.ggtt_offset = cache->fb.ilk_ggtt_offset; | |
| 902 | 890 | } |
| 903 | 891 | |
| 904 | 892 | static bool intel_fbc_reg_params_equal(struct intel_fbc_reg_params *params1, |
| @@ -284,7 +284,7 @@ static int intelfb_create(struct drm_fb_helper *helper, · 283 unmodified lines | ||
| 284 | 284 | out_destroy_fbi: |
| 285 | 285 | drm_fb_helper_release_fbi(helper); |
| 286 | 286 | out_unpin: |
| 287 | − intel_unpin_fb_obj(&ifbdev->fb->base, DRM_ROTATE_0); | |
| 287 | + intel_unpin_fb_vma(vma); | |
| 288 | 288 | out_unlock: |
| 289 | 289 | mutex_unlock(&dev->struct_mutex); |
| 290 | 290 | return ret; |
| @@ -549,7 +549,7 @@ static void intel_fbdev_destroy(struct intel_fbdev *ifbdev) · 258 unmodified lines | ||
| 549 | 549 | |
| 550 | 550 | if (ifbdev->fb) { |
| 551 | 551 | mutex_lock(&ifbdev->helper.dev->struct_mutex); |
| 552 | − intel_unpin_fb_obj(&ifbdev->fb->base, DRM_ROTATE_0); | |
| 552 | + intel_unpin_fb_vma(ifbdev->vma); | |
| 553 | 553 | mutex_unlock(&ifbdev->helper.dev->struct_mutex); |
| 554 | 554 | |
| 555 | 555 | drm_framebuffer_remove(&ifbdev->fb->base); |
| @@ -273,7 +273,7 @@ skl_update_plane(struct drm_plane *drm_plane, · 272 unmodified lines | ||
| 273 | 273 | |
| 274 | 274 | I915_WRITE(PLANE_CTL(pipe, plane), plane_ctl); |
| 275 | 275 | I915_WRITE(PLANE_SURF(pipe, plane), |
| 276 | − intel_fb_gtt_offset(fb, rotation) + surf_addr); | |
| 276 | + intel_plane_ggtt_offset(plane_state) + surf_addr); | |
| 277 | 277 | POSTING_READ(PLANE_SURF(pipe, plane)); |
| 278 | 278 | } |
| 279 | 279 | |
| @@ -458,7 +458,7 @@ vlv_update_plane(struct drm_plane *dplane, · 178 unmodified lines | ||
| 458 | 458 | I915_WRITE(SPSIZE(pipe, plane), (crtc_h << 16) | crtc_w); |
| 459 | 459 | I915_WRITE(SPCNTR(pipe, plane), sprctl); |
| 460 | 460 | I915_WRITE(SPSURF(pipe, plane), |
| 461 | − intel_fb_gtt_offset(fb, rotation) + sprsurf_offset); | |
| 461 | + intel_plane_ggtt_offset(plane_state) + sprsurf_offset); | |
| 462 | 462 | POSTING_READ(SPSURF(pipe, plane)); |
| 463 | 463 | } |
| 464 | 464 | |
| @@ -594,7 +594,7 @@ ivb_update_plane(struct drm_plane *plane, · 129 unmodified lines | ||
| 594 | 594 | I915_WRITE(SPRSCALE(pipe), sprscale); |
| 595 | 595 | I915_WRITE(SPRCTL(pipe), sprctl); |
| 596 | 596 | I915_WRITE(SPRSURF(pipe), |
| 597 | − intel_fb_gtt_offset(fb, rotation) + sprsurf_offset); | |
| 597 | + intel_plane_ggtt_offset(plane_state) + sprsurf_offset); | |
| 598 | 598 | POSTING_READ(SPRSURF(pipe)); |
| 599 | 599 | } |
| 600 | 600 | |
| @@ -721,7 +721,7 @@ ilk_update_plane(struct drm_plane *plane, · 120 unmodified lines | ||
| 721 | 721 | I915_WRITE(DVSSCALE(pipe), dvsscale); |
| 722 | 722 | I915_WRITE(DVSCNTR(pipe), dvscntr); |
| 723 | 723 | I915_WRITE(DVSSURF(pipe), |
| 724 | − intel_fb_gtt_offset(fb, rotation) + dvssurf_offset); | |
| 724 | + intel_plane_ggtt_offset(plane_state) + dvssurf_offset); | |
| 725 | 725 | POSTING_READ(DVSSURF(pipe)); |
| 726 | 726 | } |
| 727 | 727 | |
| @@ -222,6 +222,7 @@ nouveau_hw_get_clock(struct drm_device *dev, enum nvbios_pll_type plltype) · 221 unmodified lines | ||
| 222 | 222 | uint32_t mpllP; |
| 223 | 223 | |
| 224 | 224 | pci_read_config_dword(pci_get_bus_and_slot(0, 3), 0x6c, &mpllP); |
| 225 | + mpllP = (mpllP >> 8) & 0xf; | |
| 225 | 226 | if (!mpllP) |
| 226 | 227 | mpllP = 4; |
| 227 | 228 | |
| @@ -232,7 +233,7 @@ nouveau_hw_get_clock(struct drm_device *dev, enum nvbios_pll_type plltype) · 4 unmodified lines | ||
| 232 | 233 | uint32_t clock; |
| 233 | 234 | |
| 234 | 235 | pci_read_config_dword(pci_get_bus_and_slot(0, 5), 0x4c, &clock); |
| 235 | − return clock; | |
| 236 | + return clock / 1000; | |
| 236 | 237 | } |
| 237 | 238 | |
| 238 | 239 | ret = nouveau_hw_get_pllvals(dev, plltype, &pllvals); |
| @@ -99,6 +99,7 @@ struct nv84_fence_priv { · 98 unmodified lines | ||
| 99 | 99 | struct nouveau_bo *bo; |
| 100 | 100 | struct nouveau_bo *bo_gart; |
| 101 | 101 | u32 *suspend; |
| 102 | + struct mutex mutex; | |
| 102 | 103 | }; |
| 103 | 104 | |
| 104 | 105 | int nv84_fence_context_new(struct nouveau_channel *); |
| @@ -42,7 +42,7 @@ nouveau_led(struct drm_device *dev) · 41 unmodified lines | ||
| 42 | 42 | } |
| 43 | 43 | |
| 44 | 44 | /* nouveau_led.c */ |
| 45 | −#if IS_ENABLED(CONFIG_LEDS_CLASS) | |
| 45 | +#if IS_REACHABLE(CONFIG_LEDS_CLASS) | |
| 46 | 46 | int nouveau_led_init(struct drm_device *dev); |
| 47 | 47 | void nouveau_led_suspend(struct drm_device *dev); |
| 48 | 48 | void nouveau_led_resume(struct drm_device *dev); |
| @@ -313,7 +313,8 @@ usif_ioctl(struct drm_file *filp, void __user *user, u32 argc) · 312 unmodified lines | ||
| 313 | 313 | if (!(ret = nvif_unpack(-ENOSYS, &data, &size, argv->v0, 0, 0, true))) { |
| 314 | 314 | /* block access to objects not created via this interface */ |
| 315 | 315 | owner = argv->v0.owner; |
| 316 | − if (argv->v0.object == 0ULL) | |
| 316 | + if (argv->v0.object == 0ULL && | |
| 317 | + argv->v0.type != NVIF_IOCTL_V0_DEL) | |
| 317 | 318 | argv->v0.owner = NVDRM_OBJECT_ANY; /* except client */ |
| 318 | 319 | else |
| 319 | 320 | argv->v0.owner = NVDRM_OBJECT_USIF; |
| @@ -4052,6 +4052,11 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) · 4051 unmodified lines | ||
| 4052 | 4052 | } |
| 4053 | 4053 | } |
| 4054 | 4054 | |
| 4055 | + for_each_crtc_in_state(state, crtc, crtc_state, i) { | |
| 4056 | + if (crtc->state->event) | |
| 4057 | + drm_crtc_vblank_get(crtc); | |
| 4058 | + } | |
| 4059 | + | |
| 4055 | 4060 | /* Update plane(s). */ |
| 4056 | 4061 | for_each_plane_in_state(state, plane, plane_state, i) { |
| 4057 | 4062 | struct nv50_wndw_atom *asyw = nv50_wndw_atom(plane->state); |
| @@ -4101,6 +4106,7 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) · 43 unmodified lines | ||
| 4101 | 4106 | drm_crtc_send_vblank_event(crtc, crtc->state->event); |
| 4102 | 4107 | spin_unlock_irqrestore(&crtc->dev->event_lock, flags); |
| 4103 | 4108 | crtc->state->event = NULL; |
| 4109 | + drm_crtc_vblank_put(crtc); | |
| 4104 | 4110 | } |
| 4105 | 4111 | } |
| 4106 | 4112 | |
| @@ -107,8 +107,10 @@ nv84_fence_context_del(struct nouveau_channel *chan) · 106 unmodified lines | ||
| 107 | 107 | struct nv84_fence_chan *fctx = chan->fence; |
| 108 | 108 | |
| 109 | 109 | nouveau_bo_wr32(priv->bo, chan->chid * 16 / 4, fctx->base.sequence); |
| 110 | + mutex_lock(&priv->mutex); | |
| 110 | 111 | nouveau_bo_vma_del(priv->bo, &fctx->vma_gart); |
| 111 | 112 | nouveau_bo_vma_del(priv->bo, &fctx->vma); |
| 113 | + mutex_unlock(&priv->mutex); | |
| 112 | 114 | nouveau_fence_context_del(&fctx->base); |
| 113 | 115 | chan->fence = NULL; |
| 114 | 116 | nouveau_fence_context_free(&fctx->base); |
| @@ -134,11 +136,13 @@ nv84_fence_context_new(struct nouveau_channel *chan) · 19 unmodified lines | ||
| 134 | 136 | fctx->base.sync32 = nv84_fence_sync32; |
| 135 | 137 | fctx->base.sequence = nv84_fence_read(chan); |
| 136 | 138 | |
| 139 | + mutex_lock(&priv->mutex); | |
| 137 | 140 | ret = nouveau_bo_vma_add(priv->bo, cli->vm, &fctx->vma); |
| 138 | 141 | if (ret == 0) { |
| 139 | 142 | ret = nouveau_bo_vma_add(priv->bo_gart, cli->vm, |
| 140 | 143 | &fctx->vma_gart); |
| 141 | 144 | } |
| 145 | + mutex_unlock(&priv->mutex); | |
| 142 | 146 | |
| 143 | 147 | if (ret) |
| 144 | 148 | nv84_fence_context_del(chan); |
| @@ -212,6 +216,8 @@ nv84_fence_create(struct nouveau_drm *drm) · 67 unmodified lines | ||
| 212 | 216 | priv->base.context_base = dma_fence_context_alloc(priv->base.contexts); |
| 213 | 217 | priv->base.uevent = true; |
| 214 | 218 | |
| 219 | + mutex_init(&priv->mutex); | |
| 220 | + | |
| 215 | 221 | /* Use VRAM if there is any ; otherwise fallback to system memory */ |
| 216 | 222 | domain = drm->device.info.ram_size != 0 ? TTM_PL_FLAG_VRAM : |
| 217 | 223 | /* |
| @@ -59,7 +59,7 @@ gt215_hda_eld(NV50_DISP_MTHD_V1) · 58 unmodified lines | ||
| 59 | 59 | ); |
| 60 | 60 | } |
| 61 | 61 | for (i = 0; i < size; i++) |
| 62 | − nvkm_wr32(device, 0x61c440 + soff, (i << 8) | args->v0.data[0]); | |
| 62 | + nvkm_wr32(device, 0x61c440 + soff, (i << 8) | args->v0.data[i]); | |
| 63 | 63 | for (; i < 0x60; i++) |
| 64 | 64 | nvkm_wr32(device, 0x61c440 + soff, (i << 8)); |
| 65 | 65 | nvkm_mask(device, 0x61c448 + soff, 0x80000003, 0x80000003); |
| @@ -433,8 +433,6 @@ nv50_disp_dptmds_war(struct nvkm_device *device) · 432 unmodified lines | ||
| 433 | 433 | case 0x94: |
| 434 | 434 | case 0x96: |
| 435 | 435 | case 0x98: |
| 436 | − case 0xaa: | |
| 437 | − case 0xac: | |
| 438 | 436 | return true; |
| 439 | 437 | default: |
| 440 | 438 | break; |
| @@ -97,9 +97,10 @@ · 96 unmodified lines | ||
| 97 | 97 | * 2.46.0 - Add PFP_SYNC_ME support on evergreen |
| 98 | 98 | * 2.47.0 - Add UVD_NO_OP register support |
| 99 | 99 | * 2.48.0 - TA_CS_BC_BASE_ADDR allowed on SI |
| 100 | + * 2.49.0 - DRM_RADEON_GEM_INFO ioctl returns correct vram_size/visible values | |
| 100 | 101 | */ |
| 101 | 102 | #define KMS_DRIVER_MAJOR 2 |
| 102 | −#define KMS_DRIVER_MINOR 48 | |
| 103 | +#define KMS_DRIVER_MINOR 49 | |
| 103 | 104 | #define KMS_DRIVER_PATCHLEVEL 0 |
| 104 | 105 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); |
| 105 | 106 | int radeon_driver_unload_kms(struct drm_device *dev); |
| @@ -220,8 +220,8 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data, · 219 unmodified lines | ||
| 220 | 220 | |
| 221 | 221 | man = &rdev->mman.bdev.man[TTM_PL_VRAM]; |
| 222 | 222 | |
| 223 | − args->vram_size = rdev->mc.real_vram_size; | |
| 224 | − args->vram_visible = (u64)man->size << PAGE_SHIFT; | |
| 223 | + args->vram_size = (u64)man->size << PAGE_SHIFT; | |
| 224 | + args->vram_visible = rdev->mc.visible_vram_size; | |
| 225 | 225 | args->vram_visible -= rdev->vram_pin_size; |
| 226 | 226 | args->gart_size = rdev->mc.gtt_size; |
| 227 | 227 | args->gart_size -= rdev->gart_pin_size; |
| @@ -168,7 +168,7 @@ struct cp2112_device { · 167 unmodified lines | ||
| 168 | 168 | atomic_t xfer_avail; |
| 169 | 169 | struct gpio_chip gc; |
| 170 | 170 | u8 *in_out_buffer; |
| 171 | − spinlock_t lock; | |
| 171 | + struct mutex lock; | |
| 172 | 172 | |
| 173 | 173 | struct gpio_desc *desc[8]; |
| 174 | 174 | bool gpio_poll; |
| @@ -186,10 +186,9 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset) · 11 unmodified lines | ||
| 186 | 186 | struct cp2112_device *dev = gpiochip_get_data(chip); |
| 187 | 187 | struct hid_device *hdev = dev->hdev; |
| 188 | 188 | u8 *buf = dev->in_out_buffer; |
| 189 | − unsigned long flags; | |
| 190 | 189 | int ret; |
| 191 | 190 | |
| 192 | − spin_lock_irqsave(&dev->lock, flags); | |
| 191 | + mutex_lock(&dev->lock); | |
| 193 | 192 | |
| 194 | 193 | ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, |
| 195 | 194 | CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT, |
| @@ -213,8 +212,8 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset) · 17 unmodified lines | ||
| 213 | 212 | ret = 0; |
| 214 | 213 | |
| 215 | 214 | exit: |
| 216 | − spin_unlock_irqrestore(&dev->lock, flags); | |
| 217 | − return ret <= 0 ? ret : -EIO; | |
| 215 | + mutex_unlock(&dev->lock); | |
| 216 | + return ret < 0 ? ret : -EIO; | |
| 218 | 217 | } |
| 219 | 218 | |
| 220 | 219 | static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value) |
| @@ -222,10 +221,9 @@ static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value) · 1 unmodified line | ||
| 222 | 221 | struct cp2112_device *dev = gpiochip_get_data(chip); |
| 223 | 222 | struct hid_device *hdev = dev->hdev; |
| 224 | 223 | u8 *buf = dev->in_out_buffer; |
| 225 | − unsigned long flags; | |
| 226 | 224 | int ret; |
| 227 | 225 | |
| 228 | − spin_lock_irqsave(&dev->lock, flags); | |
| 226 | + mutex_lock(&dev->lock); | |
| 229 | 227 | |
| 230 | 228 | buf[0] = CP2112_GPIO_SET; |
| 231 | 229 | buf[1] = value ? 0xff : 0; |
| @@ -237,7 +235,7 @@ static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value) · 5 unmodified lines | ||
| 237 | 235 | if (ret < 0) |
| 238 | 236 | hid_err(hdev, "error setting GPIO values: %d\n", ret); |
| 239 | 237 | |
| 240 | − spin_unlock_irqrestore(&dev->lock, flags); | |
| 238 | + mutex_unlock(&dev->lock); | |
| 241 | 239 | } |
| 242 | 240 | |
| 243 | 241 | static int cp2112_gpio_get_all(struct gpio_chip *chip) |
| @@ -245,10 +243,9 @@ static int cp2112_gpio_get_all(struct gpio_chip *chip) · 1 unmodified line | ||
| 245 | 243 | struct cp2112_device *dev = gpiochip_get_data(chip); |
| 246 | 244 | struct hid_device *hdev = dev->hdev; |
| 247 | 245 | u8 *buf = dev->in_out_buffer; |
| 248 | − unsigned long flags; | |
| 249 | 246 | int ret; |
| 250 | 247 | |
| 251 | − spin_lock_irqsave(&dev->lock, flags); | |
| 248 | + mutex_lock(&dev->lock); | |
| 252 | 249 | |
| 253 | 250 | ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf, |
| 254 | 251 | CP2112_GPIO_GET_LENGTH, HID_FEATURE_REPORT, |
| @@ -262,7 +259,7 @@ static int cp2112_gpio_get_all(struct gpio_chip *chip) · 7 unmodified lines | ||
| 262 | 259 | ret = buf[1]; |
| 263 | 260 | |
| 264 | 261 | exit: |
| 265 | − spin_unlock_irqrestore(&dev->lock, flags); | |
| 262 | + mutex_unlock(&dev->lock); | |
| 266 | 263 | |
| 267 | 264 | return ret; |
| 268 | 265 | } |
| @@ -284,10 +281,9 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip, · 15 unmodified lines | ||
| 284 | 281 | struct cp2112_device *dev = gpiochip_get_data(chip); |
| 285 | 282 | struct hid_device *hdev = dev->hdev; |
| 286 | 283 | u8 *buf = dev->in_out_buffer; |
| 287 | − unsigned long flags; | |
| 288 | 284 | int ret; |
| 289 | 285 | |
| 290 | − spin_lock_irqsave(&dev->lock, flags); | |
| 286 | + mutex_lock(&dev->lock); | |
| 291 | 287 | |
| 292 | 288 | ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, |
| 293 | 289 | CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT, |
| @@ -308,7 +304,7 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip, · 14 unmodified lines | ||
| 308 | 304 | goto fail; |
| 309 | 305 | } |
| 310 | 306 | |
| 311 | − spin_unlock_irqrestore(&dev->lock, flags); | |
| 307 | + mutex_unlock(&dev->lock); | |
| 312 | 308 | |
| 313 | 309 | /* |
| 314 | 310 | * Set gpio value when output direction is already set, |
| @@ -319,7 +315,7 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip, · 4 unmodified lines | ||
| 319 | 315 | return 0; |
| 320 | 316 | |
| 321 | 317 | fail: |
| 322 | − spin_unlock_irqrestore(&dev->lock, flags); | |
| 318 | + mutex_unlock(&dev->lock); | |
| 323 | 319 | return ret < 0 ? ret : -EIO; |
| 324 | 320 | } |
| 325 | 321 | |
| @@ -1235,7 +1231,7 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id) · 909 unmodified lines | ||
| 1235 | 1231 | if (!dev->in_out_buffer) |
| 1236 | 1232 | return -ENOMEM; |
| 1237 | 1233 | |
| 1238 | − spin_lock_init(&dev->lock); | |
| 1234 | + mutex_init(&dev->lock); | |
| 1239 | 1235 | |
| 1240 | 1236 | ret = hid_parse(hdev); |
| 1241 | 1237 | if (ret) { |
| @@ -76,6 +76,9 @@ · 75 unmodified lines | ||
| 76 | 76 | #define USB_VENDOR_ID_ALPS_JP 0x044E |
| 77 | 77 | #define HID_DEVICE_ID_ALPS_U1_DUAL 0x120B |
| 78 | 78 | |
| 79 | +#define USB_VENDOR_ID_AMI 0x046b | |
| 80 | +#define USB_DEVICE_ID_AMI_VIRT_KEYBOARD_AND_MOUSE 0xff10 | |
| 81 | + | |
| 79 | 82 | #define USB_VENDOR_ID_ANTON 0x1130 |
| 80 | 83 | #define USB_DEVICE_ID_ANTON_TOUCH_PAD 0x3101 |
| 81 | 84 | |
| @@ -872,7 +872,7 @@ static const struct hid_device_id lg_devices[] = { · 871 unmodified lines | ||
| 872 | 872 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG), |
| 873 | 873 | .driver_data = LG_NOGET | LG_FF4 }, |
| 874 | 874 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2), |
| 875 | − .driver_data = LG_FF2 }, | |
| 875 | + .driver_data = LG_NOGET | LG_FF2 }, | |
| 876 | 876 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940), |
| 877 | 877 | .driver_data = LG_FF3 }, |
| 878 | 878 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR), |
| @@ -57,6 +57,7 @@ static const struct hid_blacklist { · 56 unmodified lines | ||
| 57 | 57 | { USB_VENDOR_ID_AIREN, USB_DEVICE_ID_AIREN_SLIMPLUS, HID_QUIRK_NOGET }, |
| 58 | 58 | { USB_VENDOR_ID_AKAI, USB_DEVICE_ID_AKAI_MPKMINI2, HID_QUIRK_NO_INIT_REPORTS }, |
| 59 | 59 | { USB_VENDOR_ID_AKAI_09E8, USB_DEVICE_ID_AKAI_09E8_MIDIMIX, HID_QUIRK_NO_INIT_REPORTS }, |
| 60 | + { USB_VENDOR_ID_AMI, USB_DEVICE_ID_AMI_VIRT_KEYBOARD_AND_MOUSE, HID_QUIRK_ALWAYS_POLL }, | |
| 60 | 61 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET }, |
| 61 | 62 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET }, |
| 62 | 63 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET }, |
| @@ -166,19 +166,21 @@ static int wacom_pl_irq(struct wacom_wac *wacom) · 165 unmodified lines | ||
| 166 | 166 | wacom->id[0] = STYLUS_DEVICE_ID; |
| 167 | 167 | } |
| 168 | 168 | |
| 169 | − pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); | |
| 170 | − if (features->pressure_max > 255) | |
| 171 | − pressure = (pressure << 1) | ((data[4] >> 6) & 1); | |
| 172 | − pressure += (features->pressure_max + 1) / 2; | |
| 173 | − | |
| 174 | − input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); | |
| 175 | − input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); | |
| 176 | − input_report_abs(input, ABS_PRESSURE, pressure); | |
| 177 | − | |
| 178 | − input_report_key(input, BTN_TOUCH, data[4] & 0x08); | |
| 179 | − input_report_key(input, BTN_STYLUS, data[4] & 0x10); | |
| 180 | − /* Only allow the stylus2 button to be reported for the pen tool. */ | |
| 181 | − input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20)); | |
| 169 | + if (prox) { | |
| 170 | + pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); | |
| 171 | + if (features->pressure_max > 255) | |
| 172 | + pressure = (pressure << 1) | ((data[4] >> 6) & 1); | |
| 173 | + pressure += (features->pressure_max + 1) / 2; | |
| 174 | + | |
| 175 | + input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); | |
| 176 | + input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); | |
| 177 | + input_report_abs(input, ABS_PRESSURE, pressure); | |
| 178 | + | |
| 179 | + input_report_key(input, BTN_TOUCH, data[4] & 0x08); | |
| 180 | + input_report_key(input, BTN_STYLUS, data[4] & 0x10); | |
| 181 | + /* Only allow the stylus2 button to be reported for the pen tool. */ | |
| 182 | + input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20)); | |
| 183 | + } | |
| 182 | 184 | |
| 183 | 185 | if (!prox) |
| 184 | 186 | wacom->id[0] = 0; |
| @@ -383,6 +383,7 @@ int hv_ringbuffer_read(struct vmbus_channel *channel, · 382 unmodified lines | ||
| 383 | 383 | return ret; |
| 384 | 384 | } |
| 385 | 385 | |
| 386 | + init_cached_read_index(channel); | |
| 386 | 387 | next_read_location = hv_get_next_read_location(inring_info); |
| 387 | 388 | next_read_location = hv_copyfrom_ringbuffer(inring_info, &desc, |
| 388 | 389 | sizeof(desc), |
| @@ -775,7 +775,7 @@ static int palmas_adc_wakeup_reset(struct palmas_gpadc *adc) · 774 unmodified lines | ||
| 775 | 775 | |
| 776 | 776 | static int palmas_gpadc_suspend(struct device *dev) |
| 777 | 777 | { |
| 778 | − struct iio_dev *indio_dev = dev_to_iio_dev(dev); | |
| 778 | + struct iio_dev *indio_dev = dev_get_drvdata(dev); | |
| 779 | 779 | struct palmas_gpadc *adc = iio_priv(indio_dev); |
| 780 | 780 | int wakeup = adc->wakeup1_enable || adc->wakeup2_enable; |
| 781 | 781 | int ret; |
| @@ -798,7 +798,7 @@ static int palmas_gpadc_suspend(struct device *dev) · 16 unmodified lines | ||
| 798 | 798 | |
| 799 | 799 | static int palmas_gpadc_resume(struct device *dev) |
| 800 | 800 | { |
| 801 | − struct iio_dev *indio_dev = dev_to_iio_dev(dev); | |
| 801 | + struct iio_dev *indio_dev = dev_get_drvdata(dev); | |
| 802 | 802 | struct palmas_gpadc *adc = iio_priv(indio_dev); |
| 803 | 803 | int wakeup = adc->wakeup1_enable || adc->wakeup2_enable; |
| 804 | 804 | int ret; |
| @@ -422,7 +422,7 @@ MODULE_DEVICE_TABLE(of, afe4403_of_match); · 421 unmodified lines | ||
| 422 | 422 | |
| 423 | 423 | static int __maybe_unused afe4403_suspend(struct device *dev) |
| 424 | 424 | { |
| 425 | − struct iio_dev *indio_dev = dev_to_iio_dev(dev); | |
| 425 | + struct iio_dev *indio_dev = spi_get_drvdata(to_spi_device(dev)); | |
| 426 | 426 | struct afe4403_data *afe = iio_priv(indio_dev); |
| 427 | 427 | int ret; |
| 428 | 428 | |
| @@ -443,7 +443,7 @@ static int __maybe_unused afe4403_suspend(struct device *dev) · 14 unmodified lines | ||
| 443 | 443 | |
| 444 | 444 | static int __maybe_unused afe4403_resume(struct device *dev) |
| 445 | 445 | { |
| 446 | − struct iio_dev *indio_dev = dev_to_iio_dev(dev); | |
| 446 | + struct iio_dev *indio_dev = spi_get_drvdata(to_spi_device(dev)); | |
| 447 | 447 | struct afe4403_data *afe = iio_priv(indio_dev); |
| 448 | 448 | int ret; |
| 449 | 449 | |
| @@ -428,7 +428,7 @@ MODULE_DEVICE_TABLE(of, afe4404_of_match); · 427 unmodified lines | ||
| 428 | 428 | |
| 429 | 429 | static int __maybe_unused afe4404_suspend(struct device *dev) |
| 430 | 430 | { |
| 431 | − struct iio_dev *indio_dev = dev_to_iio_dev(dev); | |
| 431 | + struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | |
| 432 | 432 | struct afe4404_data *afe = iio_priv(indio_dev); |
| 433 | 433 | int ret; |
| 434 | 434 | |
| @@ -449,7 +449,7 @@ static int __maybe_unused afe4404_suspend(struct device *dev) · 14 unmodified lines | ||
| 449 | 449 | |
| 450 | 450 | static int __maybe_unused afe4404_resume(struct device *dev) |
| 451 | 451 | { |
| 452 | − struct iio_dev *indio_dev = dev_to_iio_dev(dev); | |
| 452 | + struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | |
| 453 | 453 | struct afe4404_data *afe = iio_priv(indio_dev); |
| 454 | 454 | int ret; |
| 455 | 455 | |
| @@ -238,7 +238,7 @@ static irqreturn_t max30100_interrupt_handler(int irq, void *private) · 237 unmodified lines | ||
| 238 | 238 | |
| 239 | 239 | mutex_lock(&data->lock); |
| 240 | 240 | |
| 241 | − while (cnt || (cnt = max30100_fifo_count(data) > 0)) { | |
| 241 | + while (cnt || (cnt = max30100_fifo_count(data)) > 0) { | |
| 242 | 242 | ret = max30100_read_measurement(data); |
| 243 | 243 | if (ret) |
| 244 | 244 | break; |
| @@ -71,7 +71,8 @@ · 70 unmodified lines | ||
| 71 | 71 | * a) select an implementation using busy loop polling on those systems |
| 72 | 72 | * b) use the checksum to do some probabilistic decoding |
| 73 | 73 | */ |
| 74 | −#define DHT11_START_TRANSMISSION 18 /* ms */ | |
| 74 | +#define DHT11_START_TRANSMISSION_MIN 18000 /* us */ | |
| 75 | +#define DHT11_START_TRANSMISSION_MAX 20000 /* us */ | |
| 75 | 76 | #define DHT11_MIN_TIMERES 34000 /* ns */ |
| 76 | 77 | #define DHT11_THRESHOLD 49000 /* ns */ |
| 77 | 78 | #define DHT11_AMBIG_LOW 23000 /* ns */ |
| @@ -228,7 +229,8 @@ static int dht11_read_raw(struct iio_dev *iio_dev, · 150 unmodified lines | ||
| 228 | 229 | ret = gpio_direction_output(dht11->gpio, 0); |
| 229 | 230 | if (ret) |
| 230 | 231 | goto err; |
| 231 | − msleep(DHT11_START_TRANSMISSION); | |
| 232 | + usleep_range(DHT11_START_TRANSMISSION_MIN, | |
| 233 | + DHT11_START_TRANSMISSION_MAX); | |
| 232 | 234 | ret = gpio_direction_input(dht11->gpio); |
| 233 | 235 | if (ret) |
| 234 | 236 | goto err; |
| @@ -901,7 +901,7 @@ void rmi_enable_irq(struct rmi_device *rmi_dev, bool clear_wake) · 900 unmodified lines | ||
| 901 | 901 | data->enabled = true; |
| 902 | 902 | if (clear_wake && device_may_wakeup(rmi_dev->xport->dev)) { |
| 903 | 903 | retval = disable_irq_wake(irq); |
| 904 | − if (!retval) | |
| 904 | + if (retval) | |
| 905 | 905 | dev_warn(&rmi_dev->dev, |
| 906 | 906 | "Failed to disable irq for wake: %d\n", |
| 907 | 907 | retval); |
| @@ -936,7 +936,7 @@ void rmi_disable_irq(struct rmi_device *rmi_dev, bool enable_wake) · 28 unmodified lines | ||
| 936 | 936 | disable_irq(irq); |
| 937 | 937 | if (enable_wake && device_may_wakeup(rmi_dev->xport->dev)) { |
| 938 | 938 | retval = enable_irq_wake(irq); |
| 939 | − if (!retval) | |
| 939 | + if (retval) | |
| 940 | 940 | dev_warn(&rmi_dev->dev, |
| 941 | 941 | "Failed to enable irq for wake: %d\n", |
| 942 | 942 | retval); |
| @@ -682,7 +682,7 @@ static int wm97xx_probe(struct device *dev) · 681 unmodified lines | ||
| 682 | 682 | } |
| 683 | 683 | platform_set_drvdata(wm->battery_dev, wm); |
| 684 | 684 | wm->battery_dev->dev.parent = dev; |
| 685 | − wm->battery_dev->dev.platform_data = pdata->batt_pdata; | |
| 685 | + wm->battery_dev->dev.platform_data = pdata ? pdata->batt_pdata : NULL; | |
| 686 | 686 | ret = platform_device_add(wm->battery_dev); |
| 687 | 687 | if (ret < 0) |
| 688 | 688 | goto batt_reg_err; |
| @@ -2733,7 +2733,8 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) · 2732 unmodified lines | ||
| 2733 | 2733 | if (intmask & SDHCI_INT_RETUNE) |
| 2734 | 2734 | mmc_retune_needed(host->mmc); |
| 2735 | 2735 | |
| 2736 | − if (intmask & SDHCI_INT_CARD_INT) { | |
| 2736 | + if ((intmask & SDHCI_INT_CARD_INT) && | |
| 2737 | + (host->ier & SDHCI_INT_CARD_INT)) { | |
| 2737 | 2738 | sdhci_enable_sdio_irq_nolock(host, false); |
| 2738 | 2739 | host->thread_isr |= SDHCI_INT_CARD_INT; |
| 2739 | 2740 | result = IRQ_WAKE_THREAD; |
| @@ -1152,6 +1152,12 @@ static void init_ring(struct net_device *dev) · 1151 unmodified lines | ||
| 1152 | 1152 | if (skb == NULL) |
| 1153 | 1153 | break; |
| 1154 | 1154 | np->rx_info[i].mapping = pci_map_single(np->pci_dev, skb->data, np->rx_buf_sz, PCI_DMA_FROMDEVICE); |
| 1155 | + if (pci_dma_mapping_error(np->pci_dev, | |
| 1156 | + np->rx_info[i].mapping)) { | |
| 1157 | + dev_kfree_skb(skb); | |
| 1158 | + np->rx_info[i].skb = NULL; | |
| 1159 | + break; | |
| 1160 | + } | |
| 1155 | 1161 | /* Grrr, we cannot offset to correctly align the IP header. */ |
| 1156 | 1162 | np->rx_ring[i].rxaddr = cpu_to_dma(np->rx_info[i].mapping | RxDescValid); |
| 1157 | 1163 | } |
| @@ -1182,8 +1188,9 @@ static netdev_tx_t start_tx(struct sk_buff *skb, struct net_device *dev) · 24 unmodified lines | ||
| 1182 | 1188 | { |
| 1183 | 1189 | struct netdev_private *np = netdev_priv(dev); |
| 1184 | 1190 | unsigned int entry; |
| 1191 | + unsigned int prev_tx; | |
| 1185 | 1192 | u32 status; |
| 1186 | − int i; | |
| 1193 | + int i, j; | |
| 1187 | 1194 | |
| 1188 | 1195 | /* |
| 1189 | 1196 | * be cautious here, wrapping the queue has weird semantics |
| @@ -1201,6 +1208,7 @@ static netdev_tx_t start_tx(struct sk_buff *skb, struct net_device *dev) · 11 unmodified lines | ||
| 1201 | 1208 | } |
| 1202 | 1209 | #endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */ |
| 1203 | 1210 | |
| 1211 | + prev_tx = np->cur_tx; | |
| 1204 | 1212 | entry = np->cur_tx % TX_RING_SIZE; |
| 1205 | 1213 | for (i = 0; i < skb_num_frags(skb); i++) { |
| 1206 | 1214 | int wrap_ring = 0; |
| @@ -1234,6 +1242,11 @@ static netdev_tx_t start_tx(struct sk_buff *skb, struct net_device *dev) · 27 unmodified lines | ||
| 1234 | 1242 | skb_frag_size(this_frag), |
| 1235 | 1243 | PCI_DMA_TODEVICE); |
| 1236 | 1244 | } |
| 1245 | + if (pci_dma_mapping_error(np->pci_dev, | |
| 1246 | + np->tx_info[entry].mapping)) { | |
| 1247 | + dev->stats.tx_dropped++; | |
| 1248 | + goto err_out; | |
| 1249 | + } | |
| 1237 | 1250 | |
| 1238 | 1251 | np->tx_ring[entry].addr = cpu_to_dma(np->tx_info[entry].mapping); |
| 1239 | 1252 | np->tx_ring[entry].status = cpu_to_le32(status); |
| @@ -1268,8 +1281,30 @@ static netdev_tx_t start_tx(struct sk_buff *skb, struct net_device *dev) · 28 unmodified lines | ||
| 1268 | 1281 | netif_stop_queue(dev); |
| 1269 | 1282 | |
| 1270 | 1283 | return NETDEV_TX_OK; |
| 1271 | −} | |
| 1272 | 1284 | |
| 1285 | +err_out: | |
| 1286 | + entry = prev_tx % TX_RING_SIZE; | |
| 1287 | + np->tx_info[entry].skb = NULL; | |
| 1288 | + if (i > 0) { | |
| 1289 | + pci_unmap_single(np->pci_dev, | |
| 1290 | + np->tx_info[entry].mapping, | |
| 1291 | + skb_first_frag_len(skb), | |
| 1292 | + PCI_DMA_TODEVICE); | |
| 1293 | + np->tx_info[entry].mapping = 0; | |
| 1294 | + entry = (entry + np->tx_info[entry].used_slots) % TX_RING_SIZE; | |
| 1295 | + for (j = 1; j < i; j++) { | |
| 1296 | + pci_unmap_single(np->pci_dev, | |
| 1297 | + np->tx_info[entry].mapping, | |
| 1298 | + skb_frag_size( | |
| 1299 | + &skb_shinfo(skb)->frags[j-1]), | |
| 1300 | + PCI_DMA_TODEVICE); | |
| 1301 | + entry++; | |
| 1302 | + } | |
| 1303 | + } | |
| 1304 | + dev_kfree_skb_any(skb); | |
| 1305 | + np->cur_tx = prev_tx; | |
| 1306 | + return NETDEV_TX_OK; | |
| 1307 | +} | |
| 1273 | 1308 | |
| 1274 | 1309 | /* The interrupt handler does all of the Rx thread work and cleans up |
| 1275 | 1310 | after the Tx thread. */ |
| @@ -1569,6 +1604,12 @@ static void refill_rx_ring(struct net_device *dev) · 293 unmodified lines | ||
| 1569 | 1604 | break; /* Better luck next round. */ |
| 1570 | 1605 | np->rx_info[entry].mapping = |
| 1571 | 1606 | pci_map_single(np->pci_dev, skb->data, np->rx_buf_sz, PCI_DMA_FROMDEVICE); |
| 1607 | + if (pci_dma_mapping_error(np->pci_dev, | |
| 1608 | + np->rx_info[entry].mapping)) { | |
| 1609 | + dev_kfree_skb(skb); | |
| 1610 | + np->rx_info[entry].skb = NULL; | |
| 1611 | + break; | |
| 1612 | + } | |
| 1572 | 1613 | np->rx_ring[entry].rxaddr = |
| 1573 | 1614 | cpu_to_dma(np->rx_info[entry].mapping | RxDescValid); |
| 1574 | 1615 | } |
| @@ -43,13 +43,13 @@ · 42 unmodified lines | ||
| 43 | 43 | #define DEFAULT_RX_RING_SIZE 512 /* must be power of 2 */ |
| 44 | 44 | #define MIN_RX_RING_SIZE 64 |
| 45 | 45 | #define MAX_RX_RING_SIZE 8192 |
| 46 | −#define RX_RING_BYTES(bp) (sizeof(struct macb_dma_desc) \ | |
| 46 | +#define RX_RING_BYTES(bp) (macb_dma_desc_get_size(bp) \ | |
| 47 | 47 | * (bp)->rx_ring_size) |
| 48 | 48 | |
| 49 | 49 | #define DEFAULT_TX_RING_SIZE 512 /* must be power of 2 */ |
| 50 | 50 | #define MIN_TX_RING_SIZE 64 |
| 51 | 51 | #define MAX_TX_RING_SIZE 4096 |
| 52 | −#define TX_RING_BYTES(bp) (sizeof(struct macb_dma_desc) \ | |
| 52 | +#define TX_RING_BYTES(bp) (macb_dma_desc_get_size(bp) \ | |
| 53 | 53 | * (bp)->tx_ring_size) |
| 54 | 54 | |
| 55 | 55 | /* level of occupied TX descriptors under which we wake up TX process */ |
| @@ -78,6 +78,37 @@ · 22 unmodified lines | ||
| 78 | 78 | */ |
| 79 | 79 | #define MACB_HALT_TIMEOUT 1230 |
| 80 | 80 | |
| 81 | +/* DMA buffer descriptor might be different size | |
| 82 | + * depends on hardware configuration. | |
| 83 | + */ | |
| 84 | +static unsigned int macb_dma_desc_get_size(struct macb *bp) | |
| 85 | +{ | |
| 86 | +#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | |
| 87 | + if (bp->hw_dma_cap == HW_DMA_CAP_64B) | |
| 88 | + return sizeof(struct macb_dma_desc) + sizeof(struct macb_dma_desc_64); | |
| 89 | +#endif | |
| 90 | + return sizeof(struct macb_dma_desc); | |
| 91 | +} | |
| 92 | + | |
| 93 | +static unsigned int macb_adj_dma_desc_idx(struct macb *bp, unsigned int idx) | |
| 94 | +{ | |
| 95 | +#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | |
| 96 | + /* Dma buffer descriptor is 4 words length (instead of 2 words) | |
| 97 | + * for 64b GEM. | |
| 98 | + */ | |
| 99 | + if (bp->hw_dma_cap == HW_DMA_CAP_64B) | |
| 100 | + idx <<= 1; | |
| 101 | +#endif | |
| 102 | + return idx; | |
| 103 | +} | |
| 104 | + | |
| 105 | +#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | |
| 106 | +static struct macb_dma_desc_64 *macb_64b_desc(struct macb *bp, struct macb_dma_desc *desc) | |
| 107 | +{ | |
| 108 | + return (struct macb_dma_desc_64 *)((void *)desc + sizeof(struct macb_dma_desc)); | |
| 109 | +} | |
| 110 | +#endif | |
| 111 | + | |
| 81 | 112 | /* Ring buffer accessors */ |
| 82 | 113 | static unsigned int macb_tx_ring_wrap(struct macb *bp, unsigned int index) |
| 83 | 114 | { |
| @@ -87,7 +118,9 @@ static unsigned int macb_tx_ring_wrap(struct macb *bp, unsigned int index) · 3 unmodified lines | ||
| 87 | 118 | static struct macb_dma_desc *macb_tx_desc(struct macb_queue *queue, |
| 88 | 119 | unsigned int index) |
| 89 | 120 | { |
| 90 | − return &queue->tx_ring[macb_tx_ring_wrap(queue->bp, index)]; | |
| 121 | + index = macb_tx_ring_wrap(queue->bp, index); | |
| 122 | + index = macb_adj_dma_desc_idx(queue->bp, index); | |
| 123 | + return &queue->tx_ring[index]; | |
| 91 | 124 | } |
| 92 | 125 | |
| 93 | 126 | static struct macb_tx_skb *macb_tx_skb(struct macb_queue *queue, |
| @@ -101,7 +134,7 @@ static dma_addr_t macb_tx_dma(struct macb_queue *queue, unsigned int index) · 7 unmodified lines | ||
| 101 | 134 | dma_addr_t offset; |
| 102 | 135 | |
| 103 | 136 | offset = macb_tx_ring_wrap(queue->bp, index) * |
| 104 | − sizeof(struct macb_dma_desc); | |
| 137 | + macb_dma_desc_get_size(queue->bp); | |
| 105 | 138 | |
| 106 | 139 | return queue->tx_ring_dma + offset; |
| 107 | 140 | } |
| @@ -113,7 +146,9 @@ static unsigned int macb_rx_ring_wrap(struct macb *bp, unsigned int index) · 5 unmodified lines | ||
| 113 | 146 | |
| 114 | 147 | static struct macb_dma_desc *macb_rx_desc(struct macb *bp, unsigned int index) |
| 115 | 148 | { |
| 116 | − return &bp->rx_ring[macb_rx_ring_wrap(bp, index)]; | |
| 149 | + index = macb_rx_ring_wrap(bp, index); | |
| 150 | + index = macb_adj_dma_desc_idx(bp, index); | |
| 151 | + return &bp->rx_ring[index]; | |
| 117 | 152 | } |
| 118 | 153 | |
| 119 | 154 | static void *macb_rx_buffer(struct macb *bp, unsigned int index) |
| @@ -560,12 +595,32 @@ static void macb_tx_unmap(struct macb *bp, struct macb_tx_skb *tx_skb) · 440 unmodified lines | ||
| 560 | 595 | } |
| 561 | 596 | } |
| 562 | 597 | |
| 563 | −static inline void macb_set_addr(struct macb_dma_desc *desc, dma_addr_t addr) | |
| 598 | +static void macb_set_addr(struct macb *bp, struct macb_dma_desc *desc, dma_addr_t addr) | |
| 564 | 599 | { |
| 565 | − desc->addr = (u32)addr; | |
| 566 | 600 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
| 567 | − desc->addrh = (u32)(addr >> 32); | |
| 601 | + struct macb_dma_desc_64 *desc_64; | |
| 602 | + | |
| 603 | + if (bp->hw_dma_cap == HW_DMA_CAP_64B) { | |
| 604 | + desc_64 = macb_64b_desc(bp, desc); | |
| 605 | + desc_64->addrh = upper_32_bits(addr); | |
| 606 | + } | |
| 568 | 607 | #endif |
| 608 | + desc->addr = lower_32_bits(addr); | |
| 609 | +} | |
| 610 | + | |
| 611 | +static dma_addr_t macb_get_addr(struct macb *bp, struct macb_dma_desc *desc) | |
| 612 | +{ | |
| 613 | + dma_addr_t addr = 0; | |
| 614 | +#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | |
| 615 | + struct macb_dma_desc_64 *desc_64; | |
| 616 | + | |
| 617 | + if (bp->hw_dma_cap == HW_DMA_CAP_64B) { | |
| 618 | + desc_64 = macb_64b_desc(bp, desc); | |
| 619 | + addr = ((u64)(desc_64->addrh) << 32); | |
| 620 | + } | |
| 621 | +#endif | |
| 622 | + addr |= MACB_BF(RX_WADDR, MACB_BFEXT(RX_WADDR, desc->addr)); | |
| 623 | + return addr; | |
| 569 | 624 | } |
| 570 | 625 | |
| 571 | 626 | static void macb_tx_error_task(struct work_struct *work) |
| @@ -649,16 +704,17 @@ static void macb_tx_error_task(struct work_struct *work) · 77 unmodified lines | ||
| 649 | 704 | |
| 650 | 705 | /* Set end of TX queue */ |
| 651 | 706 | desc = macb_tx_desc(queue, 0); |
| 652 | − macb_set_addr(desc, 0); | |
| 707 | + macb_set_addr(bp, desc, 0); | |
| 653 | 708 | desc->ctrl = MACB_BIT(TX_USED); |
| 654 | 709 | |
| 655 | 710 | /* Make descriptor updates visible to hardware */ |
| 656 | 711 | wmb(); |
| 657 | 712 | |
| 658 | 713 | /* Reinitialize the TX desc queue */ |
| 659 | − queue_writel(queue, TBQP, (u32)(queue->tx_ring_dma)); | |
| 714 | + queue_writel(queue, TBQP, lower_32_bits(queue->tx_ring_dma)); | |
| 660 | 715 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
| 661 | − queue_writel(queue, TBQPH, (u32)(queue->tx_ring_dma >> 32)); | |
| 716 | + if (bp->hw_dma_cap == HW_DMA_CAP_64B) | |
| 717 | + queue_writel(queue, TBQPH, upper_32_bits(queue->tx_ring_dma)); | |
| 662 | 718 | #endif |
| 663 | 719 | /* Make TX ring reflect state of hardware */ |
| 664 | 720 | queue->tx_head = 0; |
| @@ -750,6 +806,7 @@ static void gem_rx_refill(struct macb *bp) · 85 unmodified lines | ||
| 750 | 806 | unsigned int entry; |
| 751 | 807 | struct sk_buff *skb; |
| 752 | 808 | dma_addr_t paddr; |
| 809 | + struct macb_dma_desc *desc; | |
| 753 | 810 | |
| 754 | 811 | while (CIRC_SPACE(bp->rx_prepared_head, bp->rx_tail, |
| 755 | 812 | bp->rx_ring_size) > 0) { |
| @@ -759,6 +816,7 @@ static void gem_rx_refill(struct macb *bp) · 3 unmodified lines | ||
| 759 | 816 | rmb(); |
| 760 | 817 | |
| 761 | 818 | bp->rx_prepared_head++; |
| 819 | + desc = macb_rx_desc(bp, entry); | |
| 762 | 820 | |
| 763 | 821 | if (!bp->rx_skbuff[entry]) { |
| 764 | 822 | /* allocate sk_buff for this free entry in ring */ |
| @@ -782,14 +840,14 @@ static void gem_rx_refill(struct macb *bp) · 17 unmodified lines | ||
| 782 | 840 | |
| 783 | 841 | if (entry == bp->rx_ring_size - 1) |
| 784 | 842 | paddr |= MACB_BIT(RX_WRAP); |
| 785 | − macb_set_addr(&(bp->rx_ring[entry]), paddr); | |
| 786 | − bp->rx_ring[entry].ctrl = 0; | |
| 843 | + macb_set_addr(bp, desc, paddr); | |
| 844 | + desc->ctrl = 0; | |
| 787 | 845 | |
| 788 | 846 | /* properly align Ethernet header */ |
| 789 | 847 | skb_reserve(skb, NET_IP_ALIGN); |
| 790 | 848 | } else { |
| 791 | − bp->rx_ring[entry].addr &= ~MACB_BIT(RX_USED); | |
| 792 | − bp->rx_ring[entry].ctrl = 0; | |
| 849 | + desc->addr &= ~MACB_BIT(RX_USED); | |
| 850 | + desc->ctrl = 0; | |
| 793 | 851 | } |
| 794 | 852 | } |
| 795 | 853 | |
| @@ -835,16 +893,13 @@ static int gem_rx(struct macb *bp, int budget) · 39 unmodified lines | ||
| 835 | 893 | bool rxused; |
| 836 | 894 | |
| 837 | 895 | entry = macb_rx_ring_wrap(bp, bp->rx_tail); |
| 838 | − desc = &bp->rx_ring[entry]; | |
| 896 | + desc = macb_rx_desc(bp, entry); | |
| 839 | 897 | |
| 840 | 898 | /* Make hw descriptor updates visible to CPU */ |
| 841 | 899 | rmb(); |
| 842 | 900 | |
| 843 | 901 | rxused = (desc->addr & MACB_BIT(RX_USED)) ? true : false; |
| 844 | − addr = MACB_BF(RX_WADDR, MACB_BFEXT(RX_WADDR, desc->addr)); | |
| 845 | −#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | |
| 846 | − addr |= ((u64)(desc->addrh) << 32); | |
| 847 | −#endif | |
| 902 | + addr = macb_get_addr(bp, desc); | |
| 848 | 903 | ctrl = desc->ctrl; |
| 849 | 904 | |
| 850 | 905 | if (!rxused) |
| @@ -987,15 +1042,17 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag, · 136 unmodified lines | ||
| 987 | 1042 | static inline void macb_init_rx_ring(struct macb *bp) |
| 988 | 1043 | { |
| 989 | 1044 | dma_addr_t addr; |
| 1045 | + struct macb_dma_desc *desc = NULL; | |
| 990 | 1046 | int i; |
| 991 | 1047 | |
| 992 | 1048 | addr = bp->rx_buffers_dma; |
| 993 | 1049 | for (i = 0; i < bp->rx_ring_size; i++) { |
| 994 | − bp->rx_ring[i].addr = addr; | |
| 995 | − bp->rx_ring[i].ctrl = 0; | |
| 1050 | + desc = macb_rx_desc(bp, i); | |
| 1051 | + macb_set_addr(bp, desc, addr); | |
| 1052 | + desc->ctrl = 0; | |
| 996 | 1053 | addr += bp->rx_buffer_size; |
| 997 | 1054 | } |
| 998 | − bp->rx_ring[bp->rx_ring_size - 1].addr |= MACB_BIT(RX_WRAP); | |
| 1055 | + desc->addr |= MACB_BIT(RX_WRAP); | |
| 999 | 1056 | bp->rx_tail = 0; |
| 1000 | 1057 | } |
| 1001 | 1058 | |
| @@ -1008,15 +1065,14 @@ static int macb_rx(struct macb *bp, int budget) · 6 unmodified lines | ||
| 1008 | 1065 | |
| 1009 | 1066 | for (tail = bp->rx_tail; budget > 0; tail++) { |
| 1010 | 1067 | struct macb_dma_desc *desc = macb_rx_desc(bp, tail); |
| 1011 | − u32 addr, ctrl; | |
| 1068 | + u32 ctrl; | |
| 1012 | 1069 | |
| 1013 | 1070 | /* Make hw descriptor updates visible to CPU */ |
| 1014 | 1071 | rmb(); |
| 1015 | 1072 | |
| 1016 | − addr = desc->addr; | |
| 1017 | 1073 | ctrl = desc->ctrl; |
| 1018 | 1074 | |
| 1019 | − if (!(addr & MACB_BIT(RX_USED))) | |
| 1075 | + if (!(desc->addr & MACB_BIT(RX_USED))) | |
| 1020 | 1076 | break; |
| 1021 | 1077 | |
| 1022 | 1078 | if (ctrl & MACB_BIT(RX_SOF)) { |
| @@ -1336,7 +1392,7 @@ static unsigned int macb_tx_map(struct macb *bp, · 313 unmodified lines | ||
| 1336 | 1392 | i = tx_head; |
| 1337 | 1393 | entry = macb_tx_ring_wrap(bp, i); |
| 1338 | 1394 | ctrl = MACB_BIT(TX_USED); |
| 1339 | − desc = &queue->tx_ring[entry]; | |
| 1395 | + desc = macb_tx_desc(queue, entry); | |
| 1340 | 1396 | desc->ctrl = ctrl; |
| 1341 | 1397 | |
| 1342 | 1398 | if (lso_ctrl) { |
| @@ -1358,7 +1414,7 @@ static unsigned int macb_tx_map(struct macb *bp, · 15 unmodified lines | ||
| 1358 | 1414 | i--; |
| 1359 | 1415 | entry = macb_tx_ring_wrap(bp, i); |
| 1360 | 1416 | tx_skb = &queue->tx_skb[entry]; |
| 1361 | − desc = &queue->tx_ring[entry]; | |
| 1417 | + desc = macb_tx_desc(queue, entry); | |
| 1362 | 1418 | |
| 1363 | 1419 | ctrl = (u32)tx_skb->size; |
| 1364 | 1420 | if (eof) { |
| @@ -1379,7 +1435,7 @@ static unsigned int macb_tx_map(struct macb *bp, · 14 unmodified lines | ||
| 1379 | 1435 | ctrl |= MACB_BF(MSS_MFS, mss_mfs); |
| 1380 | 1436 | |
| 1381 | 1437 | /* Set TX buffer descriptor */ |
| 1382 | − macb_set_addr(desc, tx_skb->mapping); | |
| 1438 | + macb_set_addr(bp, desc, tx_skb->mapping); | |
| 1383 | 1439 | /* desc->addr must be visible to hardware before clearing |
| 1384 | 1440 | * 'TX_USED' bit in desc->ctrl. |
| 1385 | 1441 | */ |
| @@ -1586,11 +1642,9 @@ static void gem_free_rx_buffers(struct macb *bp) · 200 unmodified lines | ||
| 1586 | 1642 | if (!skb) |
| 1587 | 1643 | continue; |
| 1588 | 1644 | |
| 1589 | − desc = &bp->rx_ring[i]; | |
| 1590 | − addr = MACB_BF(RX_WADDR, MACB_BFEXT(RX_WADDR, desc->addr)); | |
| 1591 | −#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | |
| 1592 | − addr |= ((u64)(desc->addrh) << 32); | |
| 1593 | −#endif | |
| 1645 | + desc = macb_rx_desc(bp, i); | |
| 1646 | + addr = macb_get_addr(bp, desc); | |
| 1647 | + | |
| 1594 | 1648 | dma_unmap_single(&bp->pdev->dev, addr, bp->rx_buffer_size, |
| 1595 | 1649 | DMA_FROM_DEVICE); |
| 1596 | 1650 | dev_kfree_skb_any(skb); |
| @@ -1711,15 +1765,17 @@ out_err: · 114 unmodified lines | ||
| 1711 | 1765 | static void gem_init_rings(struct macb *bp) |
| 1712 | 1766 | { |
| 1713 | 1767 | struct macb_queue *queue; |
| 1768 | + struct macb_dma_desc *desc = NULL; | |
| 1714 | 1769 | unsigned int q; |
| 1715 | 1770 | int i; |
| 1716 | 1771 | |
| 1717 | 1772 | for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) { |
| 1718 | 1773 | for (i = 0; i < bp->tx_ring_size; i++) { |
| 1719 | − queue->tx_ring[i].addr = 0; | |
| 1720 | − queue->tx_ring[i].ctrl = MACB_BIT(TX_USED); | |
| 1774 | + desc = macb_tx_desc(queue, i); | |
| 1775 | + macb_set_addr(bp, desc, 0); | |
| 1776 | + desc->ctrl = MACB_BIT(TX_USED); | |
| 1721 | 1777 | } |
| 1722 | − queue->tx_ring[bp->tx_ring_size - 1].ctrl |= MACB_BIT(TX_WRAP); | |
| 1778 | + desc->ctrl |= MACB_BIT(TX_WRAP); | |
| 1723 | 1779 | queue->tx_head = 0; |
| 1724 | 1780 | queue->tx_tail = 0; |
| 1725 | 1781 | } |
| @@ -1733,16 +1789,18 @@ static void gem_init_rings(struct macb *bp) · 7 unmodified lines | ||
| 1733 | 1789 | static void macb_init_rings(struct macb *bp) |
| 1734 | 1790 | { |
| 1735 | 1791 | int i; |
| 1792 | + struct macb_dma_desc *desc = NULL; | |
| 1736 | 1793 | |
| 1737 | 1794 | macb_init_rx_ring(bp); |
| 1738 | 1795 | |
| 1739 | 1796 | for (i = 0; i < bp->tx_ring_size; i++) { |
| 1740 | − bp->queues[0].tx_ring[i].addr = 0; | |
| 1741 | − bp->queues[0].tx_ring[i].ctrl = MACB_BIT(TX_USED); | |
| 1797 | + desc = macb_tx_desc(&bp->queues[0], i); | |
| 1798 | + macb_set_addr(bp, desc, 0); | |
| 1799 | + desc->ctrl = MACB_BIT(TX_USED); | |
| 1742 | 1800 | } |
| 1743 | 1801 | bp->queues[0].tx_head = 0; |
| 1744 | 1802 | bp->queues[0].tx_tail = 0; |
| 1745 | − bp->queues[0].tx_ring[bp->tx_ring_size - 1].ctrl |= MACB_BIT(TX_WRAP); | |
| 1803 | + desc->ctrl |= MACB_BIT(TX_WRAP); | |
| 1746 | 1804 | } |
| 1747 | 1805 | |
| 1748 | 1806 | static void macb_reset_hw(struct macb *bp) |
| @@ -1863,7 +1921,8 @@ static void macb_configure_dma(struct macb *bp) · 114 unmodified lines | ||
| 1863 | 1921 | dmacfg &= ~GEM_BIT(TXCOEN); |
| 1864 | 1922 | |
| 1865 | 1923 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
| 1866 | − dmacfg |= GEM_BIT(ADDR64); | |
| 1924 | + if (bp->hw_dma_cap == HW_DMA_CAP_64B) | |
| 1925 | + dmacfg |= GEM_BIT(ADDR64); | |
| 1867 | 1926 | #endif |
| 1868 | 1927 | netdev_dbg(bp->dev, "Cadence configure DMA with 0x%08x\n", |
| 1869 | 1928 | dmacfg); |
| @@ -1910,14 +1969,16 @@ static void macb_init_hw(struct macb *bp) · 40 unmodified lines | ||
| 1910 | 1969 | macb_configure_dma(bp); |
| 1911 | 1970 | |
| 1912 | 1971 | /* Initialize TX and RX buffers */ |
| 1913 | − macb_writel(bp, RBQP, (u32)(bp->rx_ring_dma)); | |
| 1972 | + macb_writel(bp, RBQP, lower_32_bits(bp->rx_ring_dma)); | |
| 1914 | 1973 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
| 1915 | − macb_writel(bp, RBQPH, (u32)(bp->rx_ring_dma >> 32)); | |
| 1974 | + if (bp->hw_dma_cap == HW_DMA_CAP_64B) | |
| 1975 | + macb_writel(bp, RBQPH, upper_32_bits(bp->rx_ring_dma)); | |
| 1916 | 1976 | #endif |
| 1917 | 1977 | for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) { |
| 1918 | − queue_writel(queue, TBQP, (u32)(queue->tx_ring_dma)); | |
| 1978 | + queue_writel(queue, TBQP, lower_32_bits(queue->tx_ring_dma)); | |
| 1919 | 1979 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
| 1920 | − queue_writel(queue, TBQPH, (u32)(queue->tx_ring_dma >> 32)); | |
| 1980 | + if (bp->hw_dma_cap == HW_DMA_CAP_64B) | |
| 1981 | + queue_writel(queue, TBQPH, upper_32_bits(queue->tx_ring_dma)); | |
| 1921 | 1982 | #endif |
| 1922 | 1983 | |
| 1923 | 1984 | /* Enable interrupts */ |
| @@ -2627,7 +2688,8 @@ static int macb_init(struct platform_device *pdev) · 703 unmodified lines | ||
| 2627 | 2688 | queue->IMR = GEM_IMR(hw_q - 1); |
| 2628 | 2689 | queue->TBQP = GEM_TBQP(hw_q - 1); |
| 2629 | 2690 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
| 2630 | − queue->TBQPH = GEM_TBQPH(hw_q -1); | |
| 2691 | + if (bp->hw_dma_cap == HW_DMA_CAP_64B) | |
| 2692 | + queue->TBQPH = GEM_TBQPH(hw_q - 1); | |
| 2631 | 2693 | #endif |
| 2632 | 2694 | } else { |
| 2633 | 2695 | /* queue0 uses legacy registers */ |
| @@ -2637,7 +2699,8 @@ static int macb_init(struct platform_device *pdev) · 3 unmodified lines | ||
| 2637 | 2699 | queue->IMR = MACB_IMR; |
| 2638 | 2700 | queue->TBQP = MACB_TBQP; |
| 2639 | 2701 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
| 2640 | − queue->TBQPH = MACB_TBQPH; | |
| 2702 | + if (bp->hw_dma_cap == HW_DMA_CAP_64B) | |
| 2703 | + queue->TBQPH = MACB_TBQPH; | |
| 2641 | 2704 | #endif |
| 2642 | 2705 | } |
| 2643 | 2706 | |
| @@ -2730,13 +2793,14 @@ static int macb_init(struct platform_device *pdev) · 86 unmodified lines | ||
| 2730 | 2793 | static int at91ether_start(struct net_device *dev) |
| 2731 | 2794 | { |
| 2732 | 2795 | struct macb *lp = netdev_priv(dev); |
| 2796 | + struct macb_dma_desc *desc; | |
| 2733 | 2797 | dma_addr_t addr; |
| 2734 | 2798 | u32 ctl; |
| 2735 | 2799 | int i; |
| 2736 | 2800 | |
| 2737 | 2801 | lp->rx_ring = dma_alloc_coherent(&lp->pdev->dev, |
| 2738 | 2802 | (AT91ETHER_MAX_RX_DESCR * |
| 2739 | − sizeof(struct macb_dma_desc)), | |
| 2803 | + macb_dma_desc_get_size(lp)), | |
| 2740 | 2804 | &lp->rx_ring_dma, GFP_KERNEL); |
| 2741 | 2805 | if (!lp->rx_ring) |
| 2742 | 2806 | return -ENOMEM; |
| @@ -2748,7 +2812,7 @@ static int at91ether_start(struct net_device *dev) · 5 unmodified lines | ||
| 2748 | 2812 | if (!lp->rx_buffers) { |
| 2749 | 2813 | dma_free_coherent(&lp->pdev->dev, |
| 2750 | 2814 | AT91ETHER_MAX_RX_DESCR * |
| 2751 | − sizeof(struct macb_dma_desc), | |
| 2815 | + macb_dma_desc_get_size(lp), | |
| 2752 | 2816 | lp->rx_ring, lp->rx_ring_dma); |
| 2753 | 2817 | lp->rx_ring = NULL; |
| 2754 | 2818 | return -ENOMEM; |
| @@ -2756,13 +2820,14 @@ static int at91ether_start(struct net_device *dev) · 1 unmodified line | ||
| 2756 | 2820 | |
| 2757 | 2821 | addr = lp->rx_buffers_dma; |
| 2758 | 2822 | for (i = 0; i < AT91ETHER_MAX_RX_DESCR; i++) { |
| 2759 | − lp->rx_ring[i].addr = addr; | |
| 2760 | − lp->rx_ring[i].ctrl = 0; | |
| 2823 | + desc = macb_rx_desc(lp, i); | |
| 2824 | + macb_set_addr(lp, desc, addr); | |
| 2825 | + desc->ctrl = 0; | |
| 2761 | 2826 | addr += AT91ETHER_MAX_RBUFF_SZ; |
| 2762 | 2827 | } |
| 2763 | 2828 | |
| 2764 | 2829 | /* Set the Wrap bit on the last descriptor */ |
| 2765 | − lp->rx_ring[AT91ETHER_MAX_RX_DESCR - 1].addr |= MACB_BIT(RX_WRAP); | |
| 2830 | + desc->addr |= MACB_BIT(RX_WRAP); | |
| 2766 | 2831 | |
| 2767 | 2832 | /* Reset buffer index */ |
| 2768 | 2833 | lp->rx_tail = 0; |
| @@ -2834,7 +2899,7 @@ static int at91ether_close(struct net_device *dev) · 65 unmodified lines | ||
| 2834 | 2899 | |
| 2835 | 2900 | dma_free_coherent(&lp->pdev->dev, |
| 2836 | 2901 | AT91ETHER_MAX_RX_DESCR * |
| 2837 | − sizeof(struct macb_dma_desc), | |
| 2902 | + macb_dma_desc_get_size(lp), | |
| 2838 | 2903 | lp->rx_ring, lp->rx_ring_dma); |
| 2839 | 2904 | lp->rx_ring = NULL; |
| 2840 | 2905 | |
| @@ -2885,13 +2950,15 @@ static int at91ether_start_xmit(struct sk_buff *skb, struct net_device *dev) · 44 unmodified lines | ||
| 2885 | 2950 | static void at91ether_rx(struct net_device *dev) |
| 2886 | 2951 | { |
| 2887 | 2952 | struct macb *lp = netdev_priv(dev); |
| 2953 | + struct macb_dma_desc *desc; | |
| 2888 | 2954 | unsigned char *p_recv; |
| 2889 | 2955 | struct sk_buff *skb; |
| 2890 | 2956 | unsigned int pktlen; |
| 2891 | 2957 | |
| 2892 | − while (lp->rx_ring[lp->rx_tail].addr & MACB_BIT(RX_USED)) { | |
| 2958 | + desc = macb_rx_desc(lp, lp->rx_tail); | |
| 2959 | + while (desc->addr & MACB_BIT(RX_USED)) { | |
| 2893 | 2960 | p_recv = lp->rx_buffers + lp->rx_tail * AT91ETHER_MAX_RBUFF_SZ; |
| 2894 | − pktlen = MACB_BF(RX_FRMLEN, lp->rx_ring[lp->rx_tail].ctrl); | |
| 2961 | + pktlen = MACB_BF(RX_FRMLEN, desc->ctrl); | |
| 2895 | 2962 | skb = netdev_alloc_skb(dev, pktlen + 2); |
| 2896 | 2963 | if (skb) { |
| 2897 | 2964 | skb_reserve(skb, 2); |
| @@ -2905,17 +2972,19 @@ static void at91ether_rx(struct net_device *dev) · 7 unmodified lines | ||
| 2905 | 2972 | lp->stats.rx_dropped++; |
| 2906 | 2973 | } |
| 2907 | 2974 | |
| 2908 | − if (lp->rx_ring[lp->rx_tail].ctrl & MACB_BIT(RX_MHASH_MATCH)) | |
| 2975 | + if (desc->ctrl & MACB_BIT(RX_MHASH_MATCH)) | |
| 2909 | 2976 | lp->stats.multicast++; |
| 2910 | 2977 | |
| 2911 | 2978 | /* reset ownership bit */ |
| 2912 | − lp->rx_ring[lp->rx_tail].addr &= ~MACB_BIT(RX_USED); | |
| 2979 | + desc->addr &= ~MACB_BIT(RX_USED); | |
| 2913 | 2980 | |
| 2914 | 2981 | /* wrap after last buffer */ |
| 2915 | 2982 | if (lp->rx_tail == AT91ETHER_MAX_RX_DESCR - 1) |
| 2916 | 2983 | lp->rx_tail = 0; |
| 2917 | 2984 | else |
| 2918 | 2985 | lp->rx_tail++; |
| 2986 | + | |
| 2987 | + desc = macb_rx_desc(lp, lp->rx_tail); | |
| 2919 | 2988 | } |
| 2920 | 2989 | } |
| 2921 | 2990 | |
| @@ -3211,8 +3280,11 @@ static int macb_probe(struct platform_device *pdev) · 289 unmodified lines | ||
| 3211 | 3280 | device_init_wakeup(&pdev->dev, bp->wol & MACB_WOL_HAS_MAGIC_PACKET); |
| 3212 | 3281 | |
| 3213 | 3282 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
| 3214 | − if (GEM_BFEXT(DBWDEF, gem_readl(bp, DCFG1)) > GEM_DBW32) | |
| 3283 | + if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) { | |
| 3215 | 3284 | dma_set_mask(&pdev->dev, DMA_BIT_MASK(44)); |
| 3285 | + bp->hw_dma_cap = HW_DMA_CAP_64B; | |
| 3286 | + } else | |
| 3287 | + bp->hw_dma_cap = HW_DMA_CAP_32B; | |
| 3216 | 3288 | #endif |
| 3217 | 3289 | |
| 3218 | 3290 | spin_lock_init(&bp->lock); |
| @@ -385,6 +385,8 @@ · 384 unmodified lines | ||
| 385 | 385 | /* Bitfields in DCFG6. */ |
| 386 | 386 | #define GEM_PBUF_LSO_OFFSET 27 |
| 387 | 387 | #define GEM_PBUF_LSO_SIZE 1 |
| 388 | +#define GEM_DAW64_OFFSET 23 | |
| 389 | +#define GEM_DAW64_SIZE 1 | |
| 388 | 390 | |
| 389 | 391 | /* Constants for CLK */ |
| 390 | 392 | #define MACB_CLK_DIV8 0 |
| @@ -487,12 +489,20 @@ · 96 unmodified lines | ||
| 487 | 489 | struct macb_dma_desc { |
| 488 | 490 | u32 addr; |
| 489 | 491 | u32 ctrl; |
| 492 | +}; | |
| 493 | + | |
| 490 | 494 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
| 491 | − u32 addrh; | |
| 492 | − u32 resvd; | |
| 493 | −#endif | |
| 495 | +enum macb_hw_dma_cap { | |
| 496 | + HW_DMA_CAP_32B, | |
| 497 | + HW_DMA_CAP_64B, | |
| 494 | 498 | }; |
| 495 | 499 | |
| 500 | +struct macb_dma_desc_64 { | |
| 501 | + u32 addrh; | |
| 502 | + u32 resvd; | |
| 503 | +}; | |
| 504 | +#endif | |
| 505 | + | |
| 496 | 506 | /* DMA descriptor bitfields */ |
| 497 | 507 | #define MACB_RX_USED_OFFSET 0 |
| 498 | 508 | #define MACB_RX_USED_SIZE 1 |
| @@ -874,6 +884,10 @@ struct macb { · 375 unmodified lines | ||
| 874 | 884 | unsigned int jumbo_max_len; |
| 875 | 885 | |
| 876 | 886 | u32 wol; |
| 887 | + | |
| 888 | +#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | |
| 889 | + enum macb_hw_dma_cap hw_dma_cap; | |
| 890 | +#endif | |
| 877 | 891 | }; |
| 878 | 892 | |
| 879 | 893 | static inline bool macb_is_gem(struct macb *bp) |
| @@ -116,8 +116,7 @@ void xcv_setup_link(bool link_up, int link_speed) · 115 unmodified lines | ||
| 116 | 116 | int speed = 2; |
| 117 | 117 | |
| 118 | 118 | if (!xcv) { |
| 119 | − dev_err(&xcv->pdev->dev, | |
| 120 | − "XCV init not done, probe may have failed\n"); | |
| 119 | + pr_err("XCV init not done, probe may have failed\n"); | |
| 121 | 120 | return; |
| 122 | 121 | } |
| 123 | 122 | |
| @@ -362,8 +362,10 @@ static int be_mac_addr_set(struct net_device *netdev, void *p) · 361 unmodified lines | ||
| 362 | 362 | status = -EPERM; |
| 363 | 363 | goto err; |
| 364 | 364 | } |
| 365 | −done: | |
| 365 | + | |
| 366 | + /* Remember currently programmed MAC */ | |
| 366 | 367 | ether_addr_copy(adapter->dev_mac, addr->sa_data); |
| 368 | +done: | |
| 367 | 369 | ether_addr_copy(netdev->dev_addr, addr->sa_data); |
| 368 | 370 | dev_info(dev, "MAC address changed to %pM\n", addr->sa_data); |
| 369 | 371 | return 0; |
| @@ -3618,8 +3620,10 @@ static void be_disable_if_filters(struct be_adapter *adapter) · 3248 unmodified lines | ||
| 3618 | 3620 | { |
| 3619 | 3621 | /* Don't delete MAC on BE3 VFs without FILTMGMT privilege */ |
| 3620 | 3622 | if (!BEx_chip(adapter) || !be_virtfn(adapter) || |
| 3621 | − check_privilege(adapter, BE_PRIV_FILTMGMT)) | |
| 3623 | + check_privilege(adapter, BE_PRIV_FILTMGMT)) { | |
| 3622 | 3624 | be_dev_mac_del(adapter, adapter->pmac_id[0]); |
| 3625 | + eth_zero_addr(adapter->dev_mac); | |
| 3626 | + } | |
| 3623 | 3627 | |
| 3624 | 3628 | be_clear_uc_list(adapter); |
| 3625 | 3629 | be_clear_mc_list(adapter); |
| @@ -3773,12 +3777,27 @@ static int be_enable_if_filters(struct be_adapter *adapter) · 147 unmodified lines | ||
| 3773 | 3777 | if (status) |
| 3774 | 3778 | return status; |
| 3775 | 3779 | |
| 3776 | − /* Don't add MAC on BE3 VFs without FILTMGMT privilege */ | |
| 3777 | − if (!BEx_chip(adapter) || !be_virtfn(adapter) || | |
| 3778 | − check_privilege(adapter, BE_PRIV_FILTMGMT)) { | |
| 3780 | + /* Normally this condition usually true as the ->dev_mac is zeroed. | |
| 3781 | + * But on BE3 VFs the initial MAC is pre-programmed by PF and | |
| 3782 | + * subsequent be_dev_mac_add() can fail (after fresh boot) | |
| 3783 | + */ | |
| 3784 | + if (!ether_addr_equal(adapter->dev_mac, adapter->netdev->dev_addr)) { | |
| 3785 | + int old_pmac_id = -1; | |
| 3786 | + | |
| 3787 | + /* Remember old programmed MAC if any - can happen on BE3 VF */ | |
| 3788 | + if (!is_zero_ether_addr(adapter->dev_mac)) | |
| 3789 | + old_pmac_id = adapter->pmac_id[0]; | |
| 3790 | + | |
| 3779 | 3791 | status = be_dev_mac_add(adapter, adapter->netdev->dev_addr); |
| 3780 | 3792 | if (status) |
| 3781 | 3793 | return status; |
| 3794 | + | |
| 3795 | + /* Delete the old programmed MAC as we successfully programmed | |
| 3796 | + * a new MAC | |
| 3797 | + */ | |
| 3798 | + if (old_pmac_id >= 0 && old_pmac_id != adapter->pmac_id[0]) | |
| 3799 | + be_dev_mac_del(adapter, old_pmac_id); | |
| 3800 | + | |
| 3782 | 3801 | ether_addr_copy(adapter->dev_mac, adapter->netdev->dev_addr); |
| 3783 | 3802 | } |
| 3784 | 3803 | |
| @@ -4552,6 +4571,10 @@ static int be_mac_setup(struct be_adapter *adapter) · 767 unmodified lines | ||
| 4552 | 4571 | |
| 4553 | 4572 | memcpy(adapter->netdev->dev_addr, mac, ETH_ALEN); |
| 4554 | 4573 | memcpy(adapter->netdev->perm_addr, mac, ETH_ALEN); |
| 4574 | + | |
| 4575 | + /* Initial MAC for BE3 VFs is already programmed by PF */ | |
| 4576 | + if (BEx_chip(adapter) && be_virtfn(adapter)) | |
| 4577 | + memcpy(adapter->dev_mac, mac, ETH_ALEN); | |
| 4555 | 4578 | } |
| 4556 | 4579 | |
| 4557 | 4580 | return 0; |
| @@ -2010,8 +2010,8 @@ static void free_skb_rx_queue(struct gfar_priv_rx_q *rx_queue) · 2009 unmodified lines | ||
| 2010 | 2010 | if (!rxb->page) |
| 2011 | 2011 | continue; |
| 2012 | 2012 | |
| 2013 | − dma_unmap_single(rx_queue->dev, rxb->dma, | |
| 2014 | − PAGE_SIZE, DMA_FROM_DEVICE); | |
| 2013 | + dma_unmap_page(rx_queue->dev, rxb->dma, | |
| 2014 | + PAGE_SIZE, DMA_FROM_DEVICE); | |
| 2015 | 2015 | __free_page(rxb->page); |
| 2016 | 2016 | |
| 2017 | 2017 | rxb->page = NULL; |
| @@ -158,7 +158,7 @@ static int mlx4_reset_slave(struct mlx4_dev *dev) · 157 unmodified lines | ||
| 158 | 158 | return -ETIMEDOUT; |
| 159 | 159 | } |
| 160 | 160 | |
| 161 | −static int mlx4_comm_internal_err(u32 slave_read) | |
| 161 | +int mlx4_comm_internal_err(u32 slave_read) | |
| 162 | 162 | { |
| 163 | 163 | return (u32)COMM_CHAN_EVENT_INTERNAL_ERR == |
| 164 | 164 | (slave_read & (u32)COMM_CHAN_EVENT_INTERNAL_ERR) ? 1 : 0; |
| @@ -222,6 +222,18 @@ void mlx4_unregister_device(struct mlx4_dev *dev) · 221 unmodified lines | ||
| 222 | 222 | return; |
| 223 | 223 | |
| 224 | 224 | mlx4_stop_catas_poll(dev); |
| 225 | + if (dev->persist->interface_state & MLX4_INTERFACE_STATE_DELETION && | |
| 226 | + mlx4_is_slave(dev)) { | |
| 227 | + /* In mlx4_remove_one on a VF */ | |
| 228 | + u32 slave_read = | |
| 229 | + swab32(readl(&mlx4_priv(dev)->mfunc.comm->slave_read)); | |
| 230 | + | |
| 231 | + if (mlx4_comm_internal_err(slave_read)) { | |
| 232 | + mlx4_dbg(dev, "%s: comm channel is down, entering error state.\n", | |
| 233 | + __func__); | |
| 234 | + mlx4_enter_error_state(dev->persist); | |
| 235 | + } | |
| 236 | + } | |
| 225 | 237 | mutex_lock(&intf_mutex); |
| 226 | 238 | |
| 227 | 239 | list_for_each_entry(intf, &intf_list, list) |
| @@ -1220,6 +1220,7 @@ void mlx4_qp_event(struct mlx4_dev *dev, u32 qpn, int event_type); · 1219 unmodified lines | ||
| 1220 | 1220 | void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type); |
| 1221 | 1221 | |
| 1222 | 1222 | void mlx4_enter_error_state(struct mlx4_dev_persistent *persist); |
| 1223 | +int mlx4_comm_internal_err(u32 slave_read); | |
| 1223 | 1224 | |
| 1224 | 1225 | int mlx4_SENSE_PORT(struct mlx4_dev *dev, int port, |
| 1225 | 1226 | enum mlx4_port_type *type); |
| @@ -1728,7 +1728,7 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev) · 1727 unmodified lines | ||
| 1728 | 1728 | if (cmd->cmdif_rev > CMD_IF_REV) { |
| 1729 | 1729 | dev_err(&dev->pdev->dev, "driver does not support command interface version. driver %d, firmware %d\n", |
| 1730 | 1730 | CMD_IF_REV, cmd->cmdif_rev); |
| 1731 | − err = -ENOTSUPP; | |
| 1731 | + err = -EOPNOTSUPP; | |
| 1732 | 1732 | goto err_free_page; |
| 1733 | 1733 | } |
| 1734 | 1734 | |
| @@ -791,7 +791,8 @@ void mlx5e_disable_vlan_filter(struct mlx5e_priv *priv); · 790 unmodified lines | ||
| 791 | 791 | int mlx5e_modify_rqs_vsd(struct mlx5e_priv *priv, bool vsd); |
| 792 | 792 | |
| 793 | 793 | int mlx5e_redirect_rqt(struct mlx5e_priv *priv, u32 rqtn, int sz, int ix); |
| 794 | −void mlx5e_build_tir_ctx_hash(void *tirc, struct mlx5e_priv *priv); | |
| 794 | +void mlx5e_build_indir_tir_ctx_hash(struct mlx5e_priv *priv, void *tirc, | |
| 795 | + enum mlx5e_traffic_types tt); | |
| 795 | 796 | |
| 796 | 797 | int mlx5e_open_locked(struct net_device *netdev); |
| 797 | 798 | int mlx5e_close_locked(struct net_device *netdev); |
| @@ -863,12 +864,12 @@ static inline void mlx5e_arfs_destroy_tables(struct mlx5e_priv *priv) {} · 65 unmodified lines | ||
| 863 | 864 | |
| 864 | 865 | static inline int mlx5e_arfs_enable(struct mlx5e_priv *priv) |
| 865 | 866 | { |
| 866 | − return -ENOTSUPP; | |
| 867 | + return -EOPNOTSUPP; | |
| 867 | 868 | } |
| 868 | 869 | |
| 869 | 870 | static inline int mlx5e_arfs_disable(struct mlx5e_priv *priv) |
| 870 | 871 | { |
| 871 | − return -ENOTSUPP; | |
| 872 | + return -EOPNOTSUPP; | |
| 872 | 873 | } |
| 873 | 874 | #else |
| 874 | 875 | int mlx5e_arfs_create_tables(struct mlx5e_priv *priv); |
| @@ -89,7 +89,7 @@ static int mlx5e_dcbnl_ieee_getets(struct net_device *netdev, · 88 unmodified lines | ||
| 89 | 89 | int i; |
| 90 | 90 | |
| 91 | 91 | if (!MLX5_CAP_GEN(priv->mdev, ets)) |
| 92 | − return -ENOTSUPP; | |
| 92 | + return -EOPNOTSUPP; | |
| 93 | 93 | |
| 94 | 94 | ets->ets_cap = mlx5_max_tc(priv->mdev) + 1; |
| 95 | 95 | for (i = 0; i < ets->ets_cap; i++) { |
| @@ -236,7 +236,7 @@ static int mlx5e_dcbnl_ieee_setets(struct net_device *netdev, · 140 unmodified lines | ||
| 236 | 236 | int err; |
| 237 | 237 | |
| 238 | 238 | if (!MLX5_CAP_GEN(priv->mdev, ets)) |
| 239 | − return -ENOTSUPP; | |
| 239 | + return -EOPNOTSUPP; | |
| 240 | 240 | |
| 241 | 241 | err = mlx5e_dbcnl_validate_ets(netdev, ets); |
| 242 | 242 | if (err) |
| @@ -402,7 +402,7 @@ static u8 mlx5e_dcbnl_setall(struct net_device *netdev) · 159 unmodified lines | ||
| 402 | 402 | struct mlx5_core_dev *mdev = priv->mdev; |
| 403 | 403 | struct ieee_ets ets; |
| 404 | 404 | struct ieee_pfc pfc; |
| 405 | − int err = -ENOTSUPP; | |
| 405 | + int err = -EOPNOTSUPP; | |
| 406 | 406 | int i; |
| 407 | 407 | |
| 408 | 408 | if (!MLX5_CAP_GEN(mdev, ets)) |
| @@ -511,6 +511,11 @@ static void mlx5e_dcbnl_getpgtccfgtx(struct net_device *netdev, · 102 unmodified lines | ||
| 511 | 511 | struct mlx5e_priv *priv = netdev_priv(netdev); |
| 512 | 512 | struct mlx5_core_dev *mdev = priv->mdev; |
| 513 | 513 | |
| 514 | + if (!MLX5_CAP_GEN(priv->mdev, ets)) { | |
| 515 | + netdev_err(netdev, "%s, ets is not supported\n", __func__); | |
| 516 | + return; | |
| 517 | + } | |
| 518 | + | |
| 514 | 519 | if (priority >= CEE_DCBX_MAX_PRIO) { |
| 515 | 520 | netdev_err(netdev, |
| 516 | 521 | "%s, priority is out of range\n", __func__); |
| @@ -595,7 +595,7 @@ static int mlx5e_get_coalesce(struct net_device *netdev, · 594 unmodified lines | ||
| 595 | 595 | struct mlx5e_priv *priv = netdev_priv(netdev); |
| 596 | 596 | |
| 597 | 597 | if (!MLX5_CAP_GEN(priv->mdev, cq_moderation)) |
| 598 | − return -ENOTSUPP; | |
| 598 | + return -EOPNOTSUPP; | |
| 599 | 599 | |
| 600 | 600 | coal->rx_coalesce_usecs = priv->params.rx_cq_moderation.usec; |
| 601 | 601 | coal->rx_max_coalesced_frames = priv->params.rx_cq_moderation.pkts; |
| @@ -620,7 +620,7 @@ static int mlx5e_set_coalesce(struct net_device *netdev, · 18 unmodified lines | ||
| 620 | 620 | int i; |
| 621 | 621 | |
| 622 | 622 | if (!MLX5_CAP_GEN(mdev, cq_moderation)) |
| 623 | − return -ENOTSUPP; | |
| 623 | + return -EOPNOTSUPP; | |
| 624 | 624 | |
| 625 | 625 | mutex_lock(&priv->state_lock); |
| 626 | 626 | |
| @@ -980,15 +980,18 @@ static int mlx5e_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, · 353 unmodified lines | ||
| 980 | 980 | |
| 981 | 981 | static void mlx5e_modify_tirs_hash(struct mlx5e_priv *priv, void *in, int inlen) |
| 982 | 982 | { |
| 983 | − struct mlx5_core_dev *mdev = priv->mdev; | |
| 984 | 983 | void *tirc = MLX5_ADDR_OF(modify_tir_in, in, ctx); |
| 985 | − int i; | |
| 984 | + struct mlx5_core_dev *mdev = priv->mdev; | |
| 985 | + int ctxlen = MLX5_ST_SZ_BYTES(tirc); | |
| 986 | + int tt; | |
| 986 | 987 | |
| 987 | 988 | MLX5_SET(modify_tir_in, in, bitmask.hash, 1); |
| 988 | − mlx5e_build_tir_ctx_hash(tirc, priv); | |
| 989 | 989 | |
| 990 | − for (i = 0; i < MLX5E_NUM_INDIR_TIRS; i++) | |
| 991 | − mlx5_core_modify_tir(mdev, priv->indir_tir[i].tirn, in, inlen); | |
| 990 | + for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++) { | |
| 991 | + memset(tirc, 0, ctxlen); | |
| 992 | + mlx5e_build_indir_tir_ctx_hash(priv, tirc, tt); | |
| 993 | + mlx5_core_modify_tir(mdev, priv->indir_tir[tt].tirn, in, inlen); | |
| 994 | + } | |
| 992 | 995 | } |
| 993 | 996 | |
| 994 | 997 | static int mlx5e_set_rxfh(struct net_device *dev, const u32 *indir, |
| @@ -996,6 +999,7 @@ static int mlx5e_set_rxfh(struct net_device *dev, const u32 *indir, · 1 unmodified line | ||
| 996 | 999 | { |
| 997 | 1000 | struct mlx5e_priv *priv = netdev_priv(dev); |
| 998 | 1001 | int inlen = MLX5_ST_SZ_BYTES(modify_tir_in); |
| 1002 | + bool hash_changed = false; | |
| 999 | 1003 | void *in; |
| 1000 | 1004 | |
| 1001 | 1005 | if ((hfunc != ETH_RSS_HASH_NO_CHANGE) && |
| @@ -1017,14 +1021,21 @@ static int mlx5e_set_rxfh(struct net_device *dev, const u32 *indir, · 15 unmodified lines | ||
| 1017 | 1021 | mlx5e_redirect_rqt(priv, rqtn, MLX5E_INDIR_RQT_SIZE, 0); |
| 1018 | 1022 | } |
| 1019 | 1023 | |
| 1020 | − if (key) | |
| 1024 | + if (hfunc != ETH_RSS_HASH_NO_CHANGE && | |
| 1025 | + hfunc != priv->params.rss_hfunc) { | |
| 1026 | + priv->params.rss_hfunc = hfunc; | |
| 1027 | + hash_changed = true; | |
| 1028 | + } | |
| 1029 | + | |
| 1030 | + if (key) { | |
| 1021 | 1031 | memcpy(priv->params.toeplitz_hash_key, key, |
| 1022 | 1032 | sizeof(priv->params.toeplitz_hash_key)); |
| 1033 | + hash_changed = hash_changed || | |
| 1034 | + priv->params.rss_hfunc == ETH_RSS_HASH_TOP; | |
| 1035 | + } | |
| 1023 | 1036 | |
| 1024 | − if (hfunc != ETH_RSS_HASH_NO_CHANGE) | |
| 1025 | − priv->params.rss_hfunc = hfunc; | |
| 1026 | − | |
| 1027 | − mlx5e_modify_tirs_hash(priv, in, inlen); | |
| 1037 | + if (hash_changed) | |
| 1038 | + mlx5e_modify_tirs_hash(priv, in, inlen); | |
| 1028 | 1039 | |
| 1029 | 1040 | mutex_unlock(&priv->state_lock); |
| 1030 | 1041 | |
| @@ -1296,7 +1307,7 @@ static int mlx5e_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) · 265 unmodified lines | ||
| 1296 | 1307 | u32 mlx5_wol_mode; |
| 1297 | 1308 | |
| 1298 | 1309 | if (!wol_supported) |
| 1299 | − return -ENOTSUPP; | |
| 1310 | + return -EOPNOTSUPP; | |
| 1300 | 1311 | |
| 1301 | 1312 | if (wol->wolopts & ~wol_supported) |
| 1302 | 1313 | return -EINVAL; |
| @@ -1426,7 +1437,7 @@ static int set_pflag_rx_cqe_based_moder(struct net_device *netdev, bool enable) · 123 unmodified lines | ||
| 1426 | 1437 | |
| 1427 | 1438 | if (rx_cq_period_mode == MLX5_CQ_PERIOD_MODE_START_FROM_CQE && |
| 1428 | 1439 | !MLX5_CAP_GEN(mdev, cq_period_start_from_cqe)) |
| 1429 | − return -ENOTSUPP; | |
| 1440 | + return -EOPNOTSUPP; | |
| 1430 | 1441 | |
| 1431 | 1442 | if (!rx_mode_changed) |
| 1432 | 1443 | return 0; |
| @@ -1452,7 +1463,7 @@ static int set_pflag_rx_cqe_compress(struct net_device *netdev, · 19 unmodified lines | ||
| 1452 | 1463 | bool reset; |
| 1453 | 1464 | |
| 1454 | 1465 | if (!MLX5_CAP_GEN(mdev, cqe_compression)) |
| 1455 | − return -ENOTSUPP; | |
| 1466 | + return -EOPNOTSUPP; | |
| 1456 | 1467 | |
| 1457 | 1468 | if (enable && priv->tstamp.hwtstamp_config.rx_filter != HWTSTAMP_FILTER_NONE) { |
| 1458 | 1469 | netdev_err(netdev, "Can't enable cqe compression while timestamping is enabled.\n"); |
| @@ -1089,7 +1089,7 @@ int mlx5e_create_flow_steering(struct mlx5e_priv *priv) · 1088 unmodified lines | ||
| 1089 | 1089 | MLX5_FLOW_NAMESPACE_KERNEL); |
| 1090 | 1090 | |
| 1091 | 1091 | if (!priv->fs.ns) |
| 1092 | − return -EINVAL; | |
| 1092 | + return -EOPNOTSUPP; | |
| 1093 | 1093 | |
| 1094 | 1094 | err = mlx5e_arfs_create_tables(priv); |
| 1095 | 1095 | if (err) { |
| @@ -92,7 +92,7 @@ static struct mlx5e_ethtool_table *get_flow_table(struct mlx5e_priv *priv, · 91 unmodified lines | ||
| 92 | 92 | ns = mlx5_get_flow_namespace(priv->mdev, |
| 93 | 93 | MLX5_FLOW_NAMESPACE_ETHTOOL); |
| 94 | 94 | if (!ns) |
| 95 | − return ERR_PTR(-ENOTSUPP); | |
| 95 | + return ERR_PTR(-EOPNOTSUPP); | |
| 96 | 96 | |
| 97 | 97 | table_size = min_t(u32, BIT(MLX5_CAP_FLOWTABLE(priv->mdev, |
| 98 | 98 | flow_table_properties_nic_receive.log_max_ft_size)), |
| @@ -2022,8 +2022,23 @@ static void mlx5e_build_tir_ctx_lro(void *tirc, struct mlx5e_priv *priv) · 2021 unmodified lines | ||
| 2022 | 2022 | MLX5_SET(tirc, tirc, lro_timeout_period_usecs, priv->params.lro_timeout); |
| 2023 | 2023 | } |
| 2024 | 2024 | |
| 2025 | −void mlx5e_build_tir_ctx_hash(void *tirc, struct mlx5e_priv *priv) | |
| 2025 | +void mlx5e_build_indir_tir_ctx_hash(struct mlx5e_priv *priv, void *tirc, | |
| 2026 | + enum mlx5e_traffic_types tt) | |
| 2026 | 2027 | { |
| 2028 | + void *hfso = MLX5_ADDR_OF(tirc, tirc, rx_hash_field_selector_outer); | |
| 2029 | + | |
| 2030 | +#define MLX5_HASH_IP (MLX5_HASH_FIELD_SEL_SRC_IP |\ | |
| 2031 | + MLX5_HASH_FIELD_SEL_DST_IP) | |
| 2032 | + | |
| 2033 | +#define MLX5_HASH_IP_L4PORTS (MLX5_HASH_FIELD_SEL_SRC_IP |\ | |
| 2034 | + MLX5_HASH_FIELD_SEL_DST_IP |\ | |
| 2035 | + MLX5_HASH_FIELD_SEL_L4_SPORT |\ | |
| 2036 | + MLX5_HASH_FIELD_SEL_L4_DPORT) | |
| 2037 | + | |
| 2038 | +#define MLX5_HASH_IP_IPSEC_SPI (MLX5_HASH_FIELD_SEL_SRC_IP |\ | |
| 2039 | + MLX5_HASH_FIELD_SEL_DST_IP |\ | |
| 2040 | + MLX5_HASH_FIELD_SEL_IPSEC_SPI) | |
| 2041 | + | |
| 2027 | 2042 | MLX5_SET(tirc, tirc, rx_hash_fn, |
| 2028 | 2043 | mlx5e_rx_hash_fn(priv->params.rss_hfunc)); |
| 2029 | 2044 | if (priv->params.rss_hfunc == ETH_RSS_HASH_TOP) { |
| @@ -2035,6 +2050,88 @@ void mlx5e_build_tir_ctx_hash(void *tirc, struct mlx5e_priv *priv) · 5 unmodified lines | ||
| 2035 | 2050 | MLX5_SET(tirc, tirc, rx_hash_symmetric, 1); |
| 2036 | 2051 | memcpy(rss_key, priv->params.toeplitz_hash_key, len); |
| 2037 | 2052 | } |
| 2053 | + | |
| 2054 | + switch (tt) { | |
| 2055 | + case MLX5E_TT_IPV4_TCP: | |
| 2056 | + MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2057 | + MLX5_L3_PROT_TYPE_IPV4); | |
| 2058 | + MLX5_SET(rx_hash_field_select, hfso, l4_prot_type, | |
| 2059 | + MLX5_L4_PROT_TYPE_TCP); | |
| 2060 | + MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2061 | + MLX5_HASH_IP_L4PORTS); | |
| 2062 | + break; | |
| 2063 | + | |
| 2064 | + case MLX5E_TT_IPV6_TCP: | |
| 2065 | + MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2066 | + MLX5_L3_PROT_TYPE_IPV6); | |
| 2067 | + MLX5_SET(rx_hash_field_select, hfso, l4_prot_type, | |
| 2068 | + MLX5_L4_PROT_TYPE_TCP); | |
| 2069 | + MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2070 | + MLX5_HASH_IP_L4PORTS); | |
| 2071 | + break; | |
| 2072 | + | |
| 2073 | + case MLX5E_TT_IPV4_UDP: | |
| 2074 | + MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2075 | + MLX5_L3_PROT_TYPE_IPV4); | |
| 2076 | + MLX5_SET(rx_hash_field_select, hfso, l4_prot_type, | |
| 2077 | + MLX5_L4_PROT_TYPE_UDP); | |
| 2078 | + MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2079 | + MLX5_HASH_IP_L4PORTS); | |
| 2080 | + break; | |
| 2081 | + | |
| 2082 | + case MLX5E_TT_IPV6_UDP: | |
| 2083 | + MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2084 | + MLX5_L3_PROT_TYPE_IPV6); | |
| 2085 | + MLX5_SET(rx_hash_field_select, hfso, l4_prot_type, | |
| 2086 | + MLX5_L4_PROT_TYPE_UDP); | |
| 2087 | + MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2088 | + MLX5_HASH_IP_L4PORTS); | |
| 2089 | + break; | |
| 2090 | + | |
| 2091 | + case MLX5E_TT_IPV4_IPSEC_AH: | |
| 2092 | + MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2093 | + MLX5_L3_PROT_TYPE_IPV4); | |
| 2094 | + MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2095 | + MLX5_HASH_IP_IPSEC_SPI); | |
| 2096 | + break; | |
| 2097 | + | |
| 2098 | + case MLX5E_TT_IPV6_IPSEC_AH: | |
| 2099 | + MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2100 | + MLX5_L3_PROT_TYPE_IPV6); | |
| 2101 | + MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2102 | + MLX5_HASH_IP_IPSEC_SPI); | |
| 2103 | + break; | |
| 2104 | + | |
| 2105 | + case MLX5E_TT_IPV4_IPSEC_ESP: | |
| 2106 | + MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2107 | + MLX5_L3_PROT_TYPE_IPV4); | |
| 2108 | + MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2109 | + MLX5_HASH_IP_IPSEC_SPI); | |
| 2110 | + break; | |
| 2111 | + | |
| 2112 | + case MLX5E_TT_IPV6_IPSEC_ESP: | |
| 2113 | + MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2114 | + MLX5_L3_PROT_TYPE_IPV6); | |
| 2115 | + MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2116 | + MLX5_HASH_IP_IPSEC_SPI); | |
| 2117 | + break; | |
| 2118 | + | |
| 2119 | + case MLX5E_TT_IPV4: | |
| 2120 | + MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2121 | + MLX5_L3_PROT_TYPE_IPV4); | |
| 2122 | + MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2123 | + MLX5_HASH_IP); | |
| 2124 | + break; | |
| 2125 | + | |
| 2126 | + case MLX5E_TT_IPV6: | |
| 2127 | + MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2128 | + MLX5_L3_PROT_TYPE_IPV6); | |
| 2129 | + MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2130 | + MLX5_HASH_IP); | |
| 2131 | + break; | |
| 2132 | + default: | |
| 2133 | + WARN_ONCE(true, "%s: bad traffic type!\n", __func__); | |
| 2134 | + } | |
| 2038 | 2135 | } |
| 2039 | 2136 | |
| 2040 | 2137 | static int mlx5e_modify_tirs_lro(struct mlx5e_priv *priv) |
| @@ -2404,110 +2501,13 @@ void mlx5e_cleanup_nic_tx(struct mlx5e_priv *priv) · 363 unmodified lines | ||
| 2404 | 2501 | static void mlx5e_build_indir_tir_ctx(struct mlx5e_priv *priv, u32 *tirc, |
| 2405 | 2502 | enum mlx5e_traffic_types tt) |
| 2406 | 2503 | { |
| 2407 | − void *hfso = MLX5_ADDR_OF(tirc, tirc, rx_hash_field_selector_outer); | |
| 2408 | − | |
| 2409 | 2504 | MLX5_SET(tirc, tirc, transport_domain, priv->mdev->mlx5e_res.td.tdn); |
| 2410 | 2505 | |
| 2411 | −#define MLX5_HASH_IP (MLX5_HASH_FIELD_SEL_SRC_IP |\ | |
| 2412 | − MLX5_HASH_FIELD_SEL_DST_IP) | |
| 2413 | − | |
| 2414 | −#define MLX5_HASH_IP_L4PORTS (MLX5_HASH_FIELD_SEL_SRC_IP |\ | |
| 2415 | − MLX5_HASH_FIELD_SEL_DST_IP |\ | |
| 2416 | − MLX5_HASH_FIELD_SEL_L4_SPORT |\ | |
| 2417 | − MLX5_HASH_FIELD_SEL_L4_DPORT) | |
| 2418 | − | |
| 2419 | −#define MLX5_HASH_IP_IPSEC_SPI (MLX5_HASH_FIELD_SEL_SRC_IP |\ | |
| 2420 | − MLX5_HASH_FIELD_SEL_DST_IP |\ | |
| 2421 | − MLX5_HASH_FIELD_SEL_IPSEC_SPI) | |
| 2422 | − | |
| 2423 | 2506 | mlx5e_build_tir_ctx_lro(tirc, priv); |
| 2424 | 2507 | |
| 2425 | 2508 | MLX5_SET(tirc, tirc, disp_type, MLX5_TIRC_DISP_TYPE_INDIRECT); |
| 2426 | 2509 | MLX5_SET(tirc, tirc, indirect_table, priv->indir_rqt.rqtn); |
| 2427 | − mlx5e_build_tir_ctx_hash(tirc, priv); | |
| 2428 | − | |
| 2429 | − switch (tt) { | |
| 2430 | − case MLX5E_TT_IPV4_TCP: | |
| 2431 | − MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2432 | − MLX5_L3_PROT_TYPE_IPV4); | |
| 2433 | − MLX5_SET(rx_hash_field_select, hfso, l4_prot_type, | |
| 2434 | − MLX5_L4_PROT_TYPE_TCP); | |
| 2435 | − MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2436 | − MLX5_HASH_IP_L4PORTS); | |
| 2437 | − break; | |
| 2438 | − | |
| 2439 | − case MLX5E_TT_IPV6_TCP: | |
| 2440 | − MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2441 | − MLX5_L3_PROT_TYPE_IPV6); | |
| 2442 | − MLX5_SET(rx_hash_field_select, hfso, l4_prot_type, | |
| 2443 | − MLX5_L4_PROT_TYPE_TCP); | |
| 2444 | − MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2445 | − MLX5_HASH_IP_L4PORTS); | |
| 2446 | − break; | |
| 2447 | − | |
| 2448 | − case MLX5E_TT_IPV4_UDP: | |
| 2449 | − MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2450 | − MLX5_L3_PROT_TYPE_IPV4); | |
| 2451 | − MLX5_SET(rx_hash_field_select, hfso, l4_prot_type, | |
| 2452 | − MLX5_L4_PROT_TYPE_UDP); | |
| 2453 | − MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2454 | − MLX5_HASH_IP_L4PORTS); | |
| 2455 | − break; | |
| 2456 | − | |
| 2457 | − case MLX5E_TT_IPV6_UDP: | |
| 2458 | − MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2459 | − MLX5_L3_PROT_TYPE_IPV6); | |
| 2460 | − MLX5_SET(rx_hash_field_select, hfso, l4_prot_type, | |
| 2461 | − MLX5_L4_PROT_TYPE_UDP); | |
| 2462 | − MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2463 | − MLX5_HASH_IP_L4PORTS); | |
| 2464 | − break; | |
| 2465 | − | |
| 2466 | − case MLX5E_TT_IPV4_IPSEC_AH: | |
| 2467 | − MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2468 | − MLX5_L3_PROT_TYPE_IPV4); | |
| 2469 | − MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2470 | − MLX5_HASH_IP_IPSEC_SPI); | |
| 2471 | − break; | |
| 2472 | − | |
| 2473 | − case MLX5E_TT_IPV6_IPSEC_AH: | |
| 2474 | − MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2475 | − MLX5_L3_PROT_TYPE_IPV6); | |
| 2476 | − MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2477 | − MLX5_HASH_IP_IPSEC_SPI); | |
| 2478 | − break; | |
| 2479 | − | |
| 2480 | − case MLX5E_TT_IPV4_IPSEC_ESP: | |
| 2481 | − MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2482 | − MLX5_L3_PROT_TYPE_IPV4); | |
| 2483 | − MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2484 | − MLX5_HASH_IP_IPSEC_SPI); | |
| 2485 | − break; | |
| 2486 | − | |
| 2487 | − case MLX5E_TT_IPV6_IPSEC_ESP: | |
| 2488 | − MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2489 | − MLX5_L3_PROT_TYPE_IPV6); | |
| 2490 | − MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2491 | − MLX5_HASH_IP_IPSEC_SPI); | |
| 2492 | − break; | |
| 2493 | − | |
| 2494 | − case MLX5E_TT_IPV4: | |
| 2495 | − MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2496 | − MLX5_L3_PROT_TYPE_IPV4); | |
| 2497 | − MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2498 | − MLX5_HASH_IP); | |
| 2499 | − break; | |
| 2500 | − | |
| 2501 | − case MLX5E_TT_IPV6: | |
| 2502 | − MLX5_SET(rx_hash_field_select, hfso, l3_prot_type, | |
| 2503 | − MLX5_L3_PROT_TYPE_IPV6); | |
| 2504 | − MLX5_SET(rx_hash_field_select, hfso, selected_fields, | |
| 2505 | − MLX5_HASH_IP); | |
| 2506 | − break; | |
| 2507 | − default: | |
| 2508 | − WARN_ONCE(true, | |
| 2509 | − "mlx5e_build_indir_tir_ctx: bad traffic type!\n"); | |
| 2510 | − } | |
| 2510 | + mlx5e_build_indir_tir_ctx_hash(priv, tirc, tt); | |
| 2511 | 2511 | } |
| 2512 | 2512 | |
| 2513 | 2513 | static void mlx5e_build_direct_tir_ctx(struct mlx5e_priv *priv, u32 *tirc, |
| @@ -3331,7 +3331,7 @@ static const struct net_device_ops mlx5e_netdev_ops_sriov = { · 817 unmodified lines | ||
| 3331 | 3331 | static int mlx5e_check_required_hca_cap(struct mlx5_core_dev *mdev) |
| 3332 | 3332 | { |
| 3333 | 3333 | if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) |
| 3334 | − return -ENOTSUPP; | |
| 3334 | + return -EOPNOTSUPP; | |
| 3335 | 3335 | if (!MLX5_CAP_GEN(mdev, eth_net_offloads) || |
| 3336 | 3336 | !MLX5_CAP_GEN(mdev, nic_flow_table) || |
| 3337 | 3337 | !MLX5_CAP_ETH(mdev, csum_cap) || |
| @@ -3343,7 +3343,7 @@ static int mlx5e_check_required_hca_cap(struct mlx5_core_dev *mdev) · 5 unmodified lines | ||
| 3343 | 3343 | < 3) { |
| 3344 | 3344 | mlx5_core_warn(mdev, |
| 3345 | 3345 | "Not creating net device, some required device capabilities are missing\n"); |
| 3346 | − return -ENOTSUPP; | |
| 3346 | + return -EOPNOTSUPP; | |
| 3347 | 3347 | } |
| 3348 | 3348 | if (!MLX5_CAP_ETH(mdev, self_lb_en_modifiable)) |
| 3349 | 3349 | mlx5_core_warn(mdev, "Self loop back prevention is not supported\n"); |
| @@ -663,6 +663,7 @@ static int mlx5e_route_lookup_ipv4(struct mlx5e_priv *priv, · 662 unmodified lines | ||
| 663 | 663 | __be32 *saddr, |
| 664 | 664 | int *out_ttl) |
| 665 | 665 | { |
| 666 | + struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; | |
| 666 | 667 | struct rtable *rt; |
| 667 | 668 | struct neighbour *n = NULL; |
| 668 | 669 | int ttl; |
| @@ -677,12 +678,11 @@ static int mlx5e_route_lookup_ipv4(struct mlx5e_priv *priv, · 8 unmodified lines | ||
| 677 | 678 | #else |
| 678 | 679 | return -EOPNOTSUPP; |
| 679 | 680 | #endif |
| 680 | − | |
| 681 | − if (!switchdev_port_same_parent_id(priv->netdev, rt->dst.dev)) { | |
| 682 | − pr_warn("%s: can't offload, devices not on same HW e-switch\n", __func__); | |
| 683 | − ip_rt_put(rt); | |
| 684 | − return -EOPNOTSUPP; | |
| 685 | − } | |
| 681 | + /* if the egress device isn't on the same HW e-switch, we use the uplink */ | |
| 682 | + if (!switchdev_port_same_parent_id(priv->netdev, rt->dst.dev)) | |
| 683 | + *out_dev = mlx5_eswitch_get_uplink_netdev(esw); | |
| 684 | + else | |
| 685 | + *out_dev = rt->dst.dev; | |
| 686 | 686 | |
| 687 | 687 | ttl = ip4_dst_hoplimit(&rt->dst); |
| 688 | 688 | n = dst_neigh_lookup(&rt->dst, &fl4->daddr); |
| @@ -693,7 +693,6 @@ static int mlx5e_route_lookup_ipv4(struct mlx5e_priv *priv, · 4 unmodified lines | ||
| 693 | 693 | *out_n = n; |
| 694 | 694 | *saddr = fl4->saddr; |
| 695 | 695 | *out_ttl = ttl; |
| 696 | − *out_dev = rt->dst.dev; | |
| 697 | 696 | |
| 698 | 697 | return 0; |
| 699 | 698 | } |
| @@ -133,7 +133,7 @@ static int modify_esw_vport_cvlan(struct mlx5_core_dev *dev, u32 vport, · 132 unmodified lines | ||
| 133 | 133 | |
| 134 | 134 | if (!MLX5_CAP_ESW(dev, vport_cvlan_strip) || |
| 135 | 135 | !MLX5_CAP_ESW(dev, vport_cvlan_insert_if_not_exist)) |
| 136 | − return -ENOTSUPP; | |
| 136 | + return -EOPNOTSUPP; | |
| 137 | 137 | |
| 138 | 138 | esw_debug(dev, "Set Vport[%d] VLAN %d qos %d set=%x\n", |
| 139 | 139 | vport, vlan, qos, set_flags); |
| @@ -353,7 +353,7 @@ static int esw_create_legacy_fdb_table(struct mlx5_eswitch *esw, int nvports) · 213 unmodified lines | ||
| 353 | 353 | root_ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_FDB); |
| 354 | 354 | if (!root_ns) { |
| 355 | 355 | esw_warn(dev, "Failed to get FDB flow namespace\n"); |
| 356 | − return -ENOMEM; | |
| 356 | + return -EOPNOTSUPP; | |
| 357 | 357 | } |
| 358 | 358 | |
| 359 | 359 | flow_group_in = mlx5_vzalloc(inlen); |
| @@ -962,7 +962,7 @@ static int esw_vport_enable_egress_acl(struct mlx5_eswitch *esw, · 602 unmodified lines | ||
| 962 | 962 | root_ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_ESW_EGRESS); |
| 963 | 963 | if (!root_ns) { |
| 964 | 964 | esw_warn(dev, "Failed to get E-Switch egress flow namespace\n"); |
| 965 | − return -EIO; | |
| 965 | + return -EOPNOTSUPP; | |
| 966 | 966 | } |
| 967 | 967 | |
| 968 | 968 | flow_group_in = mlx5_vzalloc(inlen); |
| @@ -1079,7 +1079,7 @@ static int esw_vport_enable_ingress_acl(struct mlx5_eswitch *esw, · 110 unmodified lines | ||
| 1079 | 1079 | root_ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_ESW_INGRESS); |
| 1080 | 1080 | if (!root_ns) { |
| 1081 | 1081 | esw_warn(dev, "Failed to get E-Switch ingress flow namespace\n"); |
| 1082 | − return -EIO; | |
| 1082 | + return -EOPNOTSUPP; | |
| 1083 | 1083 | } |
| 1084 | 1084 | |
| 1085 | 1085 | flow_group_in = mlx5_vzalloc(inlen); |
| @@ -1630,7 +1630,7 @@ int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode) · 544 unmodified lines | ||
| 1630 | 1630 | if (!MLX5_CAP_GEN(esw->dev, eswitch_flow_table) || |
| 1631 | 1631 | !MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, ft_support)) { |
| 1632 | 1632 | esw_warn(esw->dev, "E-Switch FDB is not supported, aborting ...\n"); |
| 1633 | − return -ENOTSUPP; | |
| 1633 | + return -EOPNOTSUPP; | |
| 1634 | 1634 | } |
| 1635 | 1635 | |
| 1636 | 1636 | if (!MLX5_CAP_ESW_INGRESS_ACL(esw->dev, ft_support)) |
| @@ -166,7 +166,7 @@ static int esw_add_vlan_action_check(struct mlx5_esw_flow_attr *attr, · 165 unmodified lines | ||
| 166 | 166 | return 0; |
| 167 | 167 | |
| 168 | 168 | out_notsupp: |
| 169 | − return -ENOTSUPP; | |
| 169 | + return -EOPNOTSUPP; | |
| 170 | 170 | } |
| 171 | 171 | |
| 172 | 172 | int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw, |
| @@ -424,6 +424,7 @@ static int esw_create_offloads_fdb_table(struct mlx5_eswitch *esw, int nvports) · 251 unmodified lines | ||
| 424 | 424 | root_ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_FDB); |
| 425 | 425 | if (!root_ns) { |
| 426 | 426 | esw_warn(dev, "Failed to get FDB flow namespace\n"); |
| 427 | + err = -EOPNOTSUPP; | |
| 427 | 428 | goto ns_err; |
| 428 | 429 | } |
| 429 | 430 | |
| @@ -535,7 +536,7 @@ static int esw_create_offloads_table(struct mlx5_eswitch *esw) · 105 unmodified lines | ||
| 535 | 536 | ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_OFFLOADS); |
| 536 | 537 | if (!ns) { |
| 537 | 538 | esw_warn(esw->dev, "Failed to get offloads flow namespace\n"); |
| 538 | − return -ENOMEM; | |
| 539 | + return -EOPNOTSUPP; | |
| 539 | 540 | } |
| 540 | 541 | |
| 541 | 542 | ft_offloads = mlx5_create_flow_table(ns, 0, dev->priv.sriov.num_vfs + 2, 0, 0); |
| @@ -655,7 +656,7 @@ static int esw_offloads_start(struct mlx5_eswitch *esw) · 113 unmodified lines | ||
| 655 | 656 | esw_warn(esw->dev, "Failed setting eswitch to offloads, err %d\n", err); |
| 656 | 657 | err1 = mlx5_eswitch_enable_sriov(esw, num_vfs, SRIOV_LEGACY); |
| 657 | 658 | if (err1) |
| 658 | − esw_warn(esw->dev, "Failed setting eswitch back to legacy, err %d\n", err); | |
| 659 | + esw_warn(esw->dev, "Failed setting eswitch back to legacy, err %d\n", err1); | |
| 659 | 660 | } |
| 660 | 661 | if (esw->offloads.inline_mode == MLX5_INLINE_MODE_NONE) { |
| 661 | 662 | if (mlx5_eswitch_inline_mode_get(esw, |
| @@ -674,9 +675,14 @@ int esw_offloads_init(struct mlx5_eswitch *esw, int nvports) · 12 unmodified lines | ||
| 674 | 675 | int vport; |
| 675 | 676 | int err; |
| 676 | 677 | |
| 678 | + /* disable PF RoCE so missed packets don't go through RoCE steering */ | |
| 679 | + mlx5_dev_list_lock(); | |
| 680 | + mlx5_remove_dev_by_protocol(esw->dev, MLX5_INTERFACE_PROTOCOL_IB); | |
| 681 | + mlx5_dev_list_unlock(); | |
| 682 | + | |
| 677 | 683 | err = esw_create_offloads_fdb_table(esw, nvports); |
| 678 | 684 | if (err) |
| 679 | − return err; | |
| 685 | + goto create_fdb_err; | |
| 680 | 686 | |
| 681 | 687 | err = esw_create_offloads_table(esw); |
| 682 | 688 | if (err) |
| @@ -696,11 +702,6 @@ int esw_offloads_init(struct mlx5_eswitch *esw, int nvports) · 13 unmodified lines | ||
| 696 | 702 | goto err_reps; |
| 697 | 703 | } |
| 698 | 704 | |
| 699 | − /* disable PF RoCE so missed packets don't go through RoCE steering */ | |
| 700 | − mlx5_dev_list_lock(); | |
| 701 | − mlx5_remove_dev_by_protocol(esw->dev, MLX5_INTERFACE_PROTOCOL_IB); | |
| 702 | − mlx5_dev_list_unlock(); | |
| 703 | − | |
| 704 | 705 | return 0; |
| 705 | 706 | |
| 706 | 707 | err_reps: |
| @@ -717,6 +718,13 @@ create_fg_err: · 10 unmodified lines | ||
| 717 | 718 | |
| 718 | 719 | create_ft_err: |
| 719 | 720 | esw_destroy_offloads_fdb_table(esw); |
| 721 | + | |
| 722 | +create_fdb_err: | |
| 723 | + /* enable back PF RoCE */ | |
| 724 | + mlx5_dev_list_lock(); | |
| 725 | + mlx5_add_dev_by_protocol(esw->dev, MLX5_INTERFACE_PROTOCOL_IB); | |
| 726 | + mlx5_dev_list_unlock(); | |
| 727 | + | |
| 720 | 728 | return err; |
| 721 | 729 | } |
| 722 | 730 | |
| @@ -724,11 +732,6 @@ static int esw_offloads_stop(struct mlx5_eswitch *esw) · 1 unmodified line | ||
| 724 | 732 | { |
| 725 | 733 | int err, err1, num_vfs = esw->dev->priv.sriov.num_vfs; |
| 726 | 734 | |
| 727 | − /* enable back PF RoCE */ | |
| 728 | − mlx5_dev_list_lock(); | |
| 729 | − mlx5_add_dev_by_protocol(esw->dev, MLX5_INTERFACE_PROTOCOL_IB); | |
| 730 | − mlx5_dev_list_unlock(); | |
| 731 | − | |
| 732 | 735 | mlx5_eswitch_disable_sriov(esw); |
| 733 | 736 | err = mlx5_eswitch_enable_sriov(esw, num_vfs, SRIOV_LEGACY); |
| 734 | 737 | if (err) { |
| @@ -738,6 +741,11 @@ static int esw_offloads_stop(struct mlx5_eswitch *esw) · 3 unmodified lines | ||
| 738 | 741 | esw_warn(esw->dev, "Failed setting eswitch back to offloads, err %d\n", err); |
| 739 | 742 | } |
| 740 | 743 | |
| 744 | + /* enable back PF RoCE */ | |
| 745 | + mlx5_dev_list_lock(); | |
| 746 | + mlx5_add_dev_by_protocol(esw->dev, MLX5_INTERFACE_PROTOCOL_IB); | |
| 747 | + mlx5_dev_list_unlock(); | |
| 748 | + | |
| 741 | 749 | return err; |
| 742 | 750 | } |
| 743 | 751 | |
| @@ -322,7 +322,7 @@ int mlx5_cmd_update_fte(struct mlx5_core_dev *dev, · 321 unmodified lines | ||
| 322 | 322 | flow_table_properties_nic_receive. |
| 323 | 323 | flow_modify_en); |
| 324 | 324 | if (!atomic_mod_cap) |
| 325 | − return -ENOTSUPP; | |
| 325 | + return -EOPNOTSUPP; | |
| 326 | 326 | opmod = 1; |
| 327 | 327 | |
| 328 | 328 | return mlx5_cmd_set_fte(dev, opmod, modify_mask, ft, group_id, fte); |
| @@ -1822,7 +1822,7 @@ static int create_anchor_flow_table(struct mlx5_flow_steering *steering) · 1821 unmodified lines | ||
| 1822 | 1822 | struct mlx5_flow_table *ft; |
| 1823 | 1823 | |
| 1824 | 1824 | ns = mlx5_get_flow_namespace(steering->dev, MLX5_FLOW_NAMESPACE_ANCHOR); |
| 1825 | − if (!ns) | |
| 1825 | + if (WARN_ON(!ns)) | |
| 1826 | 1826 | return -EINVAL; |
| 1827 | 1827 | ft = mlx5_create_flow_table(ns, ANCHOR_PRIO, ANCHOR_SIZE, ANCHOR_LEVEL, 0); |
| 1828 | 1828 | if (IS_ERR(ft)) { |
| @@ -807,7 +807,7 @@ static int mlx5_core_set_issi(struct mlx5_core_dev *dev) · 806 unmodified lines | ||
| 807 | 807 | return 0; |
| 808 | 808 | } |
| 809 | 809 | |
| 810 | − return -ENOTSUPP; | |
| 810 | + return -EOPNOTSUPP; | |
| 811 | 811 | } |
| 812 | 812 | |
| 813 | 813 | |
| @@ -620,7 +620,7 @@ static int mlx5_set_port_qetcr_reg(struct mlx5_core_dev *mdev, u32 *in, · 619 unmodified lines | ||
| 620 | 620 | u32 out[MLX5_ST_SZ_DW(qtct_reg)]; |
| 621 | 621 | |
| 622 | 622 | if (!MLX5_CAP_GEN(mdev, ets)) |
| 623 | − return -ENOTSUPP; | |
| 623 | + return -EOPNOTSUPP; | |
| 624 | 624 | |
| 625 | 625 | return mlx5_core_access_reg(mdev, in, inlen, out, sizeof(out), |
| 626 | 626 | MLX5_REG_QETCR, 0, 1); |
| @@ -632,7 +632,7 @@ static int mlx5_query_port_qetcr_reg(struct mlx5_core_dev *mdev, u32 *out, · 5 unmodified lines | ||
| 632 | 632 | u32 in[MLX5_ST_SZ_DW(qtct_reg)]; |
| 633 | 633 | |
| 634 | 634 | if (!MLX5_CAP_GEN(mdev, ets)) |
| 635 | − return -ENOTSUPP; | |
| 635 | + return -EOPNOTSUPP; | |
| 636 | 636 | |
| 637 | 637 | memset(in, 0, sizeof(in)); |
| 638 | 638 | return mlx5_core_access_reg(mdev, in, sizeof(in), out, outlen, |
| @@ -532,7 +532,7 @@ int mlx5_modify_nic_vport_node_guid(struct mlx5_core_dev *mdev, · 531 unmodified lines | ||
| 532 | 532 | if (!MLX5_CAP_GEN(mdev, vport_group_manager)) |
| 533 | 533 | return -EACCES; |
| 534 | 534 | if (!MLX5_CAP_ESW(mdev, nic_vport_node_guid_modify)) |
| 535 | − return -ENOTSUPP; | |
| 535 | + return -EOPNOTSUPP; | |
| 536 | 536 | |
| 537 | 537 | in = mlx5_vzalloc(inlen); |
| 538 | 538 | if (!in) |
| @@ -305,8 +305,12 @@ static int dwmac1000_irq_status(struct mac_device_info *hw, · 304 unmodified lines | ||
| 305 | 305 | { |
| 306 | 306 | void __iomem *ioaddr = hw->pcsr; |
| 307 | 307 | u32 intr_status = readl(ioaddr + GMAC_INT_STATUS); |
| 308 | + u32 intr_mask = readl(ioaddr + GMAC_INT_MASK); | |
| 308 | 309 | int ret = 0; |
| 309 | 310 | |
| 311 | + /* Discard masked bits */ | |
| 312 | + intr_status &= ~intr_mask; | |
| 313 | + | |
| 310 | 314 | /* Not used events (e.g. MMC interrupts) are not handled. */ |
| 311 | 315 | if ((intr_status & GMAC_INT_STATUS_MMCTIS)) |
| 312 | 316 | x->mmc_tx_irq_n++; |
| @@ -1295,6 +1295,9 @@ void netvsc_channel_cb(void *context) · 1294 unmodified lines | ||
| 1295 | 1295 | ndev = hv_get_drvdata(device); |
| 1296 | 1296 | buffer = get_per_channel_state(channel); |
| 1297 | 1297 | |
| 1298 | + /* commit_rd_index() -> hv_signal_on_read() needs this. */ | |
| 1299 | + init_cached_read_index(channel); | |
| 1300 | + | |
| 1298 | 1301 | do { |
| 1299 | 1302 | desc = get_next_pkt_raw(channel); |
| 1300 | 1303 | if (desc != NULL) { |
| @@ -1347,6 +1350,9 @@ void netvsc_channel_cb(void *context) · 46 unmodified lines | ||
| 1347 | 1350 | |
| 1348 | 1351 | bufferlen = bytes_recvd; |
| 1349 | 1352 | } |
| 1353 | + | |
| 1354 | + init_cached_read_index(channel); | |
| 1355 | + | |
| 1350 | 1356 | } while (1); |
| 1351 | 1357 | |
| 1352 | 1358 | if (bufferlen > NETVSC_PACKET_SIZE) |
| @@ -1012,7 +1012,7 @@ static struct phy_driver ksphy_driver[] = { · 1011 unmodified lines | ||
| 1012 | 1012 | .phy_id = PHY_ID_KSZ8795, |
| 1013 | 1013 | .phy_id_mask = MICREL_PHY_ID_MASK, |
| 1014 | 1014 | .name = "Micrel KSZ8795", |
| 1015 | − .features = (SUPPORTED_Pause | SUPPORTED_Asym_Pause), | |
| 1015 | + .features = PHY_BASIC_FEATURES, | |
| 1016 | 1016 | .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| 1017 | 1017 | .config_init = kszphy_config_init, |
| 1018 | 1018 | .config_aneg = ksz8873mll_config_aneg, |
| @@ -91,7 +91,7 @@ · 90 unmodified lines | ||
| 91 | 91 | |
| 92 | 92 | #define IWL8000_FW_PRE "iwlwifi-8000C-" |
| 93 | 93 | #define IWL8000_MODULE_FIRMWARE(api) \ |
| 94 | − IWL8000_FW_PRE "-" __stringify(api) ".ucode" | |
| 94 | + IWL8000_FW_PRE __stringify(api) ".ucode" | |
| 95 | 95 | |
| 96 | 96 | #define IWL8265_FW_PRE "iwlwifi-8265-" |
| 97 | 97 | #define IWL8265_MODULE_FIRMWARE(api) \ |
| @@ -1164,9 +1164,10 @@ static void iwl_mvm_realloc_queues_after_restart(struct iwl_mvm *mvm, · 1163 unmodified lines | ||
| 1164 | 1164 | .frame_limit = IWL_FRAME_LIMIT, |
| 1165 | 1165 | }; |
| 1166 | 1166 | |
| 1167 | − /* Make sure reserved queue is still marked as such (or allocated) */ | |
| 1168 | − mvm->queue_info[mvm_sta->reserved_queue].status = | |
| 1169 | − IWL_MVM_QUEUE_RESERVED; | |
| 1167 | + /* Make sure reserved queue is still marked as such (if allocated) */ | |
| 1168 | + if (mvm_sta->reserved_queue != IEEE80211_INVAL_HW_QUEUE) | |
| 1169 | + mvm->queue_info[mvm_sta->reserved_queue].status = | |
| 1170 | + IWL_MVM_QUEUE_RESERVED; | |
| 1170 | 1171 | |
| 1171 | 1172 | for (i = 0; i <= IWL_MAX_TID_COUNT; i++) { |
| 1172 | 1173 | struct iwl_mvm_tid_data *tid_data = &mvm_sta->tid_data[i]; |
| @@ -843,8 +843,10 @@ static void iwl_mvm_thermal_zone_unregister(struct iwl_mvm *mvm) · 842 unmodified lines | ||
| 843 | 843 | return; |
| 844 | 844 | |
| 845 | 845 | IWL_DEBUG_TEMP(mvm, "Thermal zone device unregister\n"); |
| 846 | − thermal_zone_device_unregister(mvm->tz_device.tzone); | |
| 847 | − mvm->tz_device.tzone = NULL; | |
| 846 | + if (mvm->tz_device.tzone) { | |
| 847 | + thermal_zone_device_unregister(mvm->tz_device.tzone); | |
| 848 | + mvm->tz_device.tzone = NULL; | |
| 849 | + } | |
| 848 | 850 | } |
| 849 | 851 | |
| 850 | 852 | static void iwl_mvm_cooling_device_unregister(struct iwl_mvm *mvm) |
| @@ -853,8 +855,10 @@ static void iwl_mvm_cooling_device_unregister(struct iwl_mvm *mvm) · 2 unmodified lines | ||
| 853 | 855 | return; |
| 854 | 856 | |
| 855 | 857 | IWL_DEBUG_TEMP(mvm, "Cooling device unregister\n"); |
| 856 | − thermal_cooling_device_unregister(mvm->cooling_dev.cdev); | |
| 857 | − mvm->cooling_dev.cdev = NULL; | |
| 858 | + if (mvm->cooling_dev.cdev) { | |
| 859 | + thermal_cooling_device_unregister(mvm->cooling_dev.cdev); | |
| 860 | + mvm->cooling_dev.cdev = NULL; | |
| 861 | + } | |
| 858 | 862 | } |
| 859 | 863 | #endif /* CONFIG_THERMAL */ |
| 860 | 864 | |
| @@ -532,25 +532,32 @@ static struct pcie_link_state *alloc_pcie_link_state(struct pci_dev *pdev) · 531 unmodified lines | ||
| 532 | 532 | link = kzalloc(sizeof(*link), GFP_KERNEL); |
| 533 | 533 | if (!link) |
| 534 | 534 | return NULL; |
| 535 | + | |
| 535 | 536 | INIT_LIST_HEAD(&link->sibling); |
| 536 | 537 | INIT_LIST_HEAD(&link->children); |
| 537 | 538 | INIT_LIST_HEAD(&link->link); |
| 538 | 539 | link->pdev = pdev; |
| 539 | − if (pci_pcie_type(pdev) != PCI_EXP_TYPE_ROOT_PORT) { | |
| 540 | + | |
| 541 | + /* | |
| 542 | + * Root Ports and PCI/PCI-X to PCIe Bridges are roots of PCIe | |
| 543 | + * hierarchies. | |
| 544 | + */ | |
| 545 | + if (pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT || | |
| 546 | + pci_pcie_type(pdev) == PCI_EXP_TYPE_PCIE_BRIDGE) { | |
| 547 | + link->root = link; | |
| 548 | + } else { | |
| 540 | 549 | struct pcie_link_state *parent; |
| 550 | + | |
| 541 | 551 | parent = pdev->bus->parent->self->link_state; |
| 542 | 552 | if (!parent) { |
| 543 | 553 | kfree(link); |
| 544 | 554 | return NULL; |
| 545 | 555 | } |
| 556 | + | |
| 546 | 557 | link->parent = parent; |
| 558 | + link->root = link->parent->root; | |
| 547 | 559 | list_add(&link->link, &parent->children); |
| 548 | 560 | } |
| 549 | − /* Setup a pointer to the root port link */ | |
| 550 | − if (!link->parent) | |
| 551 | − link->root = link; | |
| 552 | − else | |
| 553 | − link->root = link->parent->root; | |
| 554 | 561 | |
| 555 | 562 | list_add(&link->sibling, &link_list); |
| 556 | 563 | pdev->link_state = link; |
| @@ -217,7 +217,7 @@ static const struct berlin_desc_group berlin4ct_soc_pinctrl_groups[] = { · 216 unmodified lines | ||
| 217 | 217 | BERLIN_PINCTRL_GROUP("SCRD0_CRD_PRES", 0xc, 0x3, 0x15, |
| 218 | 218 | BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO20 */ |
| 219 | 219 | BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* crd pres */ |
| 220 | − BERLIN_PINCTRL_FUNCTION(0x1, "sd1a")), /* DAT3 */ | |
| 220 | + BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* DAT3 */ | |
| 221 | 221 | BERLIN_PINCTRL_GROUP("SPI1_SS0n", 0xc, 0x3, 0x18, |
| 222 | 222 | BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n */ |
| 223 | 223 | BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO37 */ |
| @@ -731,16 +731,23 @@ static void __iomem *byt_gpio_reg(struct byt_gpio *vg, unsigned int offset, · 730 unmodified lines | ||
| 731 | 731 | int reg) |
| 732 | 732 | { |
| 733 | 733 | struct byt_community *comm = byt_get_community(vg, offset); |
| 734 | − u32 reg_offset = 0; | |
| 734 | + u32 reg_offset; | |
| 735 | 735 | |
| 736 | 736 | if (!comm) |
| 737 | 737 | return NULL; |
| 738 | 738 | |
| 739 | 739 | offset -= comm->pin_base; |
| 740 | − if (reg == BYT_INT_STAT_REG) | |
| 740 | + switch (reg) { | |
| 741 | + case BYT_INT_STAT_REG: | |
| 741 | 742 | reg_offset = (offset / 32) * 4; |
| 742 | − else | |
| 743 | + break; | |
| 744 | + case BYT_DEBOUNCE_REG: | |
| 745 | + reg_offset = 0; | |
| 746 | + break; | |
| 747 | + default: | |
| 743 | 748 | reg_offset = comm->pad_map[offset] * 16; |
| 749 | + break; | |
| 750 | + } | |
| 744 | 751 | |
| 745 | 752 | return comm->reg_base + reg_offset + reg; |
| 746 | 753 | } |
| @@ -1243,10 +1250,12 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev, · 496 unmodified lines | ||
| 1243 | 1250 | debounce = readl(db_reg); |
| 1244 | 1251 | debounce &= ~BYT_DEBOUNCE_PULSE_MASK; |
| 1245 | 1252 | |
| 1253 | + if (arg) | |
| 1254 | + conf |= BYT_DEBOUNCE_EN; | |
| 1255 | + else | |
| 1256 | + conf &= ~BYT_DEBOUNCE_EN; | |
| 1257 | + | |
| 1246 | 1258 | switch (arg) { |
| 1247 | − case 0: | |
| 1248 | − conf &= BYT_DEBOUNCE_EN; | |
| 1249 | − break; | |
| 1250 | 1259 | case 375: |
| 1251 | 1260 | debounce |= BYT_DEBOUNCE_PULSE_375US; |
| 1252 | 1261 | break; |
| @@ -1269,7 +1278,9 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev, · 16 unmodified lines | ||
| 1269 | 1278 | debounce |= BYT_DEBOUNCE_PULSE_24MS; |
| 1270 | 1279 | break; |
| 1271 | 1280 | default: |
| 1272 | − ret = -EINVAL; | |
| 1281 | + if (arg) | |
| 1282 | + ret = -EINVAL; | |
| 1283 | + break; | |
| 1273 | 1284 | } |
| 1274 | 1285 | |
| 1275 | 1286 | if (!ret) |
| @@ -1612,7 +1623,9 @@ static void byt_gpio_irq_handler(struct irq_desc *desc) · 336 unmodified lines | ||
| 1612 | 1623 | continue; |
| 1613 | 1624 | } |
| 1614 | 1625 | |
| 1626 | + raw_spin_lock(&vg->lock); | |
| 1615 | 1627 | pending = readl(reg); |
| 1628 | + raw_spin_unlock(&vg->lock); | |
| 1616 | 1629 | for_each_set_bit(pin, &pending, 32) { |
| 1617 | 1630 | virq = irq_find_mapping(vg->chip.irqdomain, base + pin); |
| 1618 | 1631 | generic_handle_irq(virq); |
| @@ -794,6 +794,9 @@ static int mrfld_config_set(struct pinctrl_dev *pctldev, unsigned int pin, · 793 unmodified lines | ||
| 794 | 794 | unsigned int i; |
| 795 | 795 | int ret; |
| 796 | 796 | |
| 797 | + if (!mrfld_buf_available(mp, pin)) | |
| 798 | + return -ENOTSUPP; | |
| 799 | + | |
| 797 | 800 | for (i = 0; i < nconfigs; i++) { |
| 798 | 801 | switch (pinconf_to_config_param(configs[i])) { |
| 799 | 802 | case PIN_CONFIG_BIAS_DISABLE: |
| @@ -564,8 +564,7 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev, · 563 unmodified lines | ||
| 564 | 564 | val = arg / 10 - 1; |
| 565 | 565 | break; |
| 566 | 566 | case PIN_CONFIG_BIAS_DISABLE: |
| 567 | − val = 0; | |
| 568 | − break; | |
| 567 | + continue; | |
| 569 | 568 | case PIN_CONFIG_BIAS_PULL_UP: |
| 570 | 569 | if (arg == 0) |
| 571 | 570 | return -EINVAL; |
| @@ -272,7 +272,7 @@ static const struct regulator_desc axp806_regulators[] = { · 271 unmodified lines | ||
| 272 | 272 | 64, AXP806_DCDCD_V_CTRL, 0x3f, AXP806_PWR_OUT_CTRL1, |
| 273 | 273 | BIT(3)), |
| 274 | 274 | AXP_DESC(AXP806, DCDCE, "dcdce", "vine", 1100, 3400, 100, |
| 275 | − AXP806_DCDCB_V_CTRL, 0x1f, AXP806_PWR_OUT_CTRL1, BIT(4)), | |
| 275 | + AXP806_DCDCE_V_CTRL, 0x1f, AXP806_PWR_OUT_CTRL1, BIT(4)), | |
| 276 | 276 | AXP_DESC(AXP806, ALDO1, "aldo1", "aldoin", 700, 3300, 100, |
| 277 | 277 | AXP806_ALDO1_V_CTRL, 0x1f, AXP806_PWR_OUT_CTRL1, BIT(5)), |
| 278 | 278 | AXP_DESC(AXP806, ALDO2, "aldo2", "aldoin", 700, 3400, 100, |
| @@ -30,9 +30,6 @@ · 29 unmodified lines | ||
| 30 | 30 | #include <linux/of_gpio.h> |
| 31 | 31 | #include <linux/regulator/of_regulator.h> |
| 32 | 32 | #include <linux/regulator/machine.h> |
| 33 | −#include <linux/acpi.h> | |
| 34 | −#include <linux/property.h> | |
| 35 | −#include <linux/gpio/consumer.h> | |
| 36 | 33 | |
| 37 | 34 | struct fixed_voltage_data { |
| 38 | 35 | struct regulator_desc desc; |
| @@ -97,44 +94,6 @@ of_get_fixed_voltage_config(struct device *dev, · 58 unmodified lines | ||
| 97 | 94 | return config; |
| 98 | 95 | } |
| 99 | 96 | |
| 100 | −/** | |
| 101 | − * acpi_get_fixed_voltage_config - extract fixed_voltage_config structure info | |
| 102 | − * @dev: device requesting for fixed_voltage_config | |
| 103 | − * @desc: regulator description | |
| 104 | − * | |
| 105 | − * Populates fixed_voltage_config structure by extracting data through ACPI | |
| 106 | − * interface, returns a pointer to the populated structure of NULL if memory | |
| 107 | − * alloc fails. | |
| 108 | − */ | |
| 109 | −static struct fixed_voltage_config * | |
| 110 | −acpi_get_fixed_voltage_config(struct device *dev, | |
| 111 | − const struct regulator_desc *desc) | |
| 112 | −{ | |
| 113 | − struct fixed_voltage_config *config; | |
| 114 | − const char *supply_name; | |
| 115 | − struct gpio_desc *gpiod; | |
| 116 | − int ret; | |
| 117 | − | |
| 118 | − config = devm_kzalloc(dev, sizeof(*config), GFP_KERNEL); | |
| 119 | − if (!config) | |
| 120 | − return ERR_PTR(-ENOMEM); | |
| 121 | − | |
| 122 | − ret = device_property_read_string(dev, "supply-name", &supply_name); | |
| 123 | − if (!ret) | |
| 124 | − config->supply_name = supply_name; | |
| 125 | − | |
| 126 | − gpiod = gpiod_get(dev, "gpio", GPIOD_ASIS); | |
| 127 | − if (IS_ERR(gpiod)) | |
| 128 | − return ERR_PTR(-ENODEV); | |
| 129 | − | |
| 130 | − config->gpio = desc_to_gpio(gpiod); | |
| 131 | − config->enable_high = device_property_read_bool(dev, | |
| 132 | − "enable-active-high"); | |
| 133 | − gpiod_put(gpiod); | |
| 134 | − | |
| 135 | − return config; | |
| 136 | −} | |
| 137 | − | |
| 138 | 97 | static struct regulator_ops fixed_voltage_ops = { |
| 139 | 98 | }; |
| 140 | 99 | |
| @@ -155,11 +114,6 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) · 14 unmodified lines | ||
| 155 | 114 | &drvdata->desc); |
| 156 | 115 | if (IS_ERR(config)) |
| 157 | 116 | return PTR_ERR(config); |
| 158 | − } else if (ACPI_HANDLE(&pdev->dev)) { | |
| 159 | − config = acpi_get_fixed_voltage_config(&pdev->dev, | |
| 160 | − &drvdata->desc); | |
| 161 | − if (IS_ERR(config)) | |
| 162 | − return PTR_ERR(config); | |
| 163 | 117 | } else { |
| 164 | 118 | config = dev_get_platdata(&pdev->dev); |
| 165 | 119 | } |
| @@ -452,7 +452,7 @@ static int twl6030smps_map_voltage(struct regulator_dev *rdev, int min_uV, · 451 unmodified lines | ||
| 452 | 452 | vsel = 62; |
| 453 | 453 | else if ((min_uV > 1800000) && (min_uV <= 1900000)) |
| 454 | 454 | vsel = 61; |
| 455 | − else if ((min_uV > 1350000) && (min_uV <= 1800000)) | |
| 455 | + else if ((min_uV > 1500000) && (min_uV <= 1800000)) | |
| 456 | 456 | vsel = 60; |
| 457 | 457 | else if ((min_uV > 1350000) && (min_uV <= 1500000)) |
| 458 | 458 | vsel = 59; |
| @@ -1551,12 +1551,15 @@ config RTC_DRV_MPC5121 · 1550 unmodified lines | ||
| 1551 | 1551 | will be called rtc-mpc5121. |
| 1552 | 1552 | |
| 1553 | 1553 | config RTC_DRV_JZ4740 |
| 1554 | − bool "Ingenic JZ4740 SoC" | |
| 1554 | + tristate "Ingenic JZ4740 SoC" | |
| 1555 | 1555 | depends on MACH_INGENIC || COMPILE_TEST |
| 1556 | 1556 | help |
| 1557 | 1557 | If you say yes here you get support for the Ingenic JZ47xx SoCs RTC |
| 1558 | 1558 | controllers. |
| 1559 | 1559 | |
| 1560 | + This driver can also be buillt as a module. If so, the module | |
| 1561 | + will be called rtc-jz4740. | |
| 1562 | + | |
| 1560 | 1563 | config RTC_DRV_LPC24XX |
| 1561 | 1564 | tristate "NXP RTC for LPC178x/18xx/408x/43xx" |
| 1562 | 1565 | depends on ARCH_LPC18XX || COMPILE_TEST |
| @@ -17,6 +17,7 @@ · 16 unmodified lines | ||
| 17 | 17 | #include <linux/clk.h> |
| 18 | 18 | #include <linux/io.h> |
| 19 | 19 | #include <linux/kernel.h> |
| 20 | +#include <linux/module.h> | |
| 20 | 21 | #include <linux/of_device.h> |
| 21 | 22 | #include <linux/platform_device.h> |
| 22 | 23 | #include <linux/reboot.h> |
| @@ -294,7 +295,7 @@ static void jz4740_rtc_power_off(void) · 271 unmodified lines | ||
| 294 | 295 | JZ_REG_RTC_RESET_COUNTER, reset_counter_ticks); |
| 295 | 296 | |
| 296 | 297 | jz4740_rtc_poweroff(dev_for_power_off); |
| 297 | − machine_halt(); | |
| 298 | + kernel_halt(); | |
| 298 | 299 | } |
| 299 | 300 | |
| 300 | 301 | static const struct of_device_id jz4740_rtc_of_match[] = { |
| @@ -302,6 +303,7 @@ static const struct of_device_id jz4740_rtc_of_match[] = { · 1 unmodified line | ||
| 302 | 303 | { .compatible = "ingenic,jz4780-rtc", .data = (void *)ID_JZ4780 }, |
| 303 | 304 | {}, |
| 304 | 305 | }; |
| 306 | +MODULE_DEVICE_TABLE(of, jz4740_rtc_of_match); | |
| 305 | 307 | |
| 306 | 308 | static int jz4740_rtc_probe(struct platform_device *pdev) |
| 307 | 309 | { |
| @@ -429,6 +431,7 @@ static const struct platform_device_id jz4740_rtc_ids[] = { · 121 unmodified lines | ||
| 429 | 431 | { "jz4780-rtc", ID_JZ4780 }, |
| 430 | 432 | {} |
| 431 | 433 | }; |
| 434 | +MODULE_DEVICE_TABLE(platform, jz4740_rtc_ids); | |
| 432 | 435 | |
| 433 | 436 | static struct platform_driver jz4740_rtc_driver = { |
| 434 | 437 | .probe = jz4740_rtc_probe, |
| @@ -440,4 +443,9 @@ static struct platform_driver jz4740_rtc_driver = { · 5 unmodified lines | ||
| 440 | 443 | .id_table = jz4740_rtc_ids, |
| 441 | 444 | }; |
| 442 | 445 | |
| 443 | −builtin_platform_driver(jz4740_rtc_driver); | |
| 446 | +module_platform_driver(jz4740_rtc_driver); | |
| 447 | + | |
| 448 | +MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); | |
| 449 | +MODULE_LICENSE("GPL"); | |
| 450 | +MODULE_DESCRIPTION("RTC driver for the JZ4740 SoC\n"); | |
| 451 | +MODULE_ALIAS("platform:jz4740-rtc"); | |
| @@ -534,7 +534,9 @@ static int virtscsi_queuecommand(struct virtio_scsi *vscsi, · 533 unmodified lines | ||
| 534 | 534 | { |
| 535 | 535 | struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); |
| 536 | 536 | struct virtio_scsi_cmd *cmd = scsi_cmd_priv(sc); |
| 537 | + unsigned long flags; | |
| 537 | 538 | int req_size; |
| 539 | + int ret; | |
| 538 | 540 | |
| 539 | 541 | BUG_ON(scsi_sg_count(sc) > shost->sg_tablesize); |
| 540 | 542 | |
| @@ -562,8 +564,15 @@ static int virtscsi_queuecommand(struct virtio_scsi *vscsi, · 21 unmodified lines | ||
| 562 | 564 | req_size = sizeof(cmd->req.cmd); |
| 563 | 565 | } |
| 564 | 566 | |
| 565 | − if (virtscsi_kick_cmd(req_vq, cmd, req_size, sizeof(cmd->resp.cmd)) != 0) | |
| 567 | + ret = virtscsi_kick_cmd(req_vq, cmd, req_size, sizeof(cmd->resp.cmd)); | |
| 568 | + if (ret == -EIO) { | |
| 569 | + cmd->resp.cmd.response = VIRTIO_SCSI_S_BAD_TARGET; | |
| 570 | + spin_lock_irqsave(&req_vq->vq_lock, flags); | |
| 571 | + virtscsi_complete_cmd(vscsi, cmd); | |
| 572 | + spin_unlock_irqrestore(&req_vq->vq_lock, flags); | |
| 573 | + } else if (ret != 0) { | |
| 566 | 574 | return SCSI_MLQUEUE_HOST_BUSY; |
| 575 | + } | |
| 567 | 576 | return 0; |
| 568 | 577 | } |
| 569 | 578 | |
| @@ -45,12 +45,18 @@ u32 gb_timesync_platform_get_clock_rate(void) · 44 unmodified lines | ||
| 45 | 45 | |
| 46 | 46 | int gb_timesync_platform_lock_bus(struct gb_timesync_svc *pdata) |
| 47 | 47 | { |
| 48 | + if (!arche_platform_change_state_cb) | |
| 49 | + return 0; | |
| 50 | + | |
| 48 | 51 | return arche_platform_change_state_cb(ARCHE_PLATFORM_STATE_TIME_SYNC, |
| 49 | 52 | pdata); |
| 50 | 53 | } |
| 51 | 54 | |
| 52 | 55 | void gb_timesync_platform_unlock_bus(void) |
| 53 | 56 | { |
| 57 | + if (!arche_platform_change_state_cb) | |
| 58 | + return; | |
| 59 | + | |
| 54 | 60 | arche_platform_change_state_cb(ARCHE_PLATFORM_STATE_ACTIVE, NULL); |
| 55 | 61 | } |
| 56 | 62 | |
| @@ -37,6 +37,10 @@ static const struct usb_device_id usb_quirk_list[] = { · 36 unmodified lines | ||
| 37 | 37 | /* CBM - Flash disk */ |
| 38 | 38 | { USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME }, |
| 39 | 39 | |
| 40 | + /* WORLDE easy key (easykey.25) MIDI controller */ | |
| 41 | + { USB_DEVICE(0x0218, 0x0401), .driver_info = | |
| 42 | + USB_QUIRK_CONFIG_INTF_STRINGS }, | |
| 43 | + | |
| 40 | 44 | /* HP 5300/5370C scanner */ |
| 41 | 45 | { USB_DEVICE(0x03f0, 0x0701), .driver_info = |
| 42 | 46 | USB_QUIRK_STRING_FETCH_255 }, |
| @@ -2269,6 +2269,8 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type, · 2268 unmodified lines | ||
| 2269 | 2269 | if (len < sizeof(*d) || h->interface >= ffs->interfaces_count) |
| 2270 | 2270 | return -EINVAL; |
| 2271 | 2271 | length = le32_to_cpu(d->dwSize); |
| 2272 | + if (len < length) | |
| 2273 | + return -EINVAL; | |
| 2272 | 2274 | type = le32_to_cpu(d->dwPropertyDataType); |
| 2273 | 2275 | if (type < USB_EXT_PROP_UNICODE || |
| 2274 | 2276 | type > USB_EXT_PROP_UNICODE_MULTI) { |
| @@ -2277,6 +2279,11 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type, · 2 unmodified lines | ||
| 2277 | 2279 | return -EINVAL; |
| 2278 | 2280 | } |
| 2279 | 2281 | pnl = le16_to_cpu(d->wPropertyNameLength); |
| 2282 | + if (length < 14 + pnl) { | |
| 2283 | + pr_vdebug("invalid os descriptor length: %d pnl:%d (descriptor %d)\n", | |
| 2284 | + length, pnl, type); | |
| 2285 | + return -EINVAL; | |
| 2286 | + } | |
| 2280 | 2287 | pdl = le32_to_cpu(*(u32 *)((u8 *)data + 10 + pnl)); |
| 2281 | 2288 | if (length != 14 + pnl + pdl) { |
| 2282 | 2289 | pr_vdebug("invalid os descriptor length: %d pnl:%d pdl:%d (descriptor %d)\n", |
| @@ -2363,6 +2370,9 @@ static int __ffs_data_got_descs(struct ffs_data *ffs, · 80 unmodified lines | ||
| 2363 | 2370 | } |
| 2364 | 2371 | } |
| 2365 | 2372 | if (flags & (1 << i)) { |
| 2373 | + if (len < 4) { | |
| 2374 | + goto error; | |
| 2375 | + } | |
| 2366 | 2376 | os_descs_count = get_unaligned_le32(data); |
| 2367 | 2377 | data += 4; |
| 2368 | 2378 | len -= 4; |
| @@ -2435,7 +2445,8 @@ static int __ffs_data_got_strings(struct ffs_data *ffs, · 66 unmodified lines | ||
| 2435 | 2445 | |
| 2436 | 2446 | ENTER(); |
| 2437 | 2447 | |
| 2438 | − if (unlikely(get_unaligned_le32(data) != FUNCTIONFS_STRINGS_MAGIC || | |
| 2448 | + if (unlikely(len < 16 || | |
| 2449 | + get_unaligned_le32(data) != FUNCTIONFS_STRINGS_MAGIC || | |
| 2439 | 2450 | get_unaligned_le32(data + 4) != len)) |
| 2440 | 2451 | goto error; |
| 2441 | 2452 | str_count = get_unaligned_le32(data + 8); |
| @@ -594,11 +594,11 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, · 593 unmodified lines | ||
| 594 | 594 | | MUSB_PORT_STAT_RESUME; |
| 595 | 595 | musb->rh_timer = jiffies |
| 596 | 596 | + msecs_to_jiffies(USB_RESUME_TIMEOUT); |
| 597 | − musb->need_finish_resume = 1; | |
| 598 | − | |
| 599 | 597 | musb->xceiv->otg->state = OTG_STATE_A_HOST; |
| 600 | 598 | musb->is_active = 1; |
| 601 | 599 | musb_host_resume_root_hub(musb); |
| 600 | + schedule_delayed_work(&musb->finish_resume_work, | |
| 601 | + msecs_to_jiffies(USB_RESUME_TIMEOUT)); | |
| 602 | 602 | break; |
| 603 | 603 | case OTG_STATE_B_WAIT_ACON: |
| 604 | 604 | musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; |
| @@ -1925,6 +1925,14 @@ static void musb_pm_runtime_check_session(struct musb *musb) · 1320 unmodified lines | ||
| 1925 | 1925 | static void musb_irq_work(struct work_struct *data) |
| 1926 | 1926 | { |
| 1927 | 1927 | struct musb *musb = container_of(data, struct musb, irq_work.work); |
| 1928 | + int error; | |
| 1929 | + | |
| 1930 | + error = pm_runtime_get_sync(musb->controller); | |
| 1931 | + if (error < 0) { | |
| 1932 | + dev_err(musb->controller, "Could not enable: %i\n", error); | |
| 1933 | + | |
| 1934 | + return; | |
| 1935 | + } | |
| 1928 | 1936 | |
| 1929 | 1937 | musb_pm_runtime_check_session(musb); |
| 1930 | 1938 | |
| @@ -1932,6 +1940,9 @@ static void musb_irq_work(struct work_struct *data) · 1 unmodified line | ||
| 1932 | 1940 | musb->xceiv_old_state = musb->xceiv->otg->state; |
| 1933 | 1941 | sysfs_notify(&musb->controller->kobj, NULL, "mode"); |
| 1934 | 1942 | } |
| 1943 | + | |
| 1944 | + pm_runtime_mark_last_busy(musb->controller); | |
| 1945 | + pm_runtime_put_autosuspend(musb->controller); | |
| 1935 | 1946 | } |
| 1936 | 1947 | |
| 1937 | 1948 | static void musb_recover_from_babble(struct musb *musb) |
| @@ -2710,11 +2721,6 @@ static int musb_resume(struct device *dev) · 772 unmodified lines | ||
| 2710 | 2721 | mask = MUSB_DEVCTL_BDEVICE | MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV; |
| 2711 | 2722 | if ((devctl & mask) != (musb->context.devctl & mask)) |
| 2712 | 2723 | musb->port1_status = 0; |
| 2713 | − if (musb->need_finish_resume) { | |
| 2714 | − musb->need_finish_resume = 0; | |
| 2715 | − schedule_delayed_work(&musb->finish_resume_work, | |
| 2716 | − msecs_to_jiffies(USB_RESUME_TIMEOUT)); | |
| 2717 | − } | |
| 2718 | 2724 | |
| 2719 | 2725 | /* |
| 2720 | 2726 | * The USB HUB code expects the device to be in RPM_ACTIVE once it came |
| @@ -2766,12 +2772,6 @@ static int musb_runtime_resume(struct device *dev) · 45 unmodified lines | ||
| 2766 | 2772 | |
| 2767 | 2773 | musb_restore_context(musb); |
| 2768 | 2774 | |
| 2769 | − if (musb->need_finish_resume) { | |
| 2770 | − musb->need_finish_resume = 0; | |
| 2771 | − schedule_delayed_work(&musb->finish_resume_work, | |
| 2772 | − msecs_to_jiffies(USB_RESUME_TIMEOUT)); | |
| 2773 | − } | |
| 2774 | − | |
| 2775 | 2775 | spin_lock_irqsave(&musb->lock, flags); |
| 2776 | 2776 | error = musb_run_resume_work(musb); |
| 2777 | 2777 | if (error) |
| @@ -410,7 +410,6 @@ struct musb { · 409 unmodified lines | ||
| 410 | 410 | |
| 411 | 411 | /* is_suspended means USB B_PERIPHERAL suspend */ |
| 412 | 412 | unsigned is_suspended:1; |
| 413 | − unsigned need_finish_resume :1; | |
| 414 | 413 | |
| 415 | 414 | /* may_wakeup means remote wakeup is enabled */ |
| 416 | 415 | unsigned may_wakeup:1; |
| @@ -2007,6 +2007,7 @@ static const struct usb_device_id option_ids[] = { · 2006 unmodified lines | ||
| 2007 | 2007 | { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD200, 0xff, 0xff, 0xff) }, |
| 2008 | 2008 | { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_6802, 0xff, 0xff, 0xff) }, |
| 2009 | 2009 | { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD300, 0xff, 0xff, 0xff) }, |
| 2010 | + { USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0x421d, 0xff, 0xff, 0xff) }, /* HP lt2523 (Novatel E371) */ | |
| 2010 | 2011 | { } /* Terminating entry */ |
| 2011 | 2012 | }; |
| 2012 | 2013 | MODULE_DEVICE_TABLE(usb, option_ids); |
| @@ -49,6 +49,7 @@ static const struct usb_device_id id_table[] = { · 48 unmodified lines | ||
| 49 | 49 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, |
| 50 | 50 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, |
| 51 | 51 | { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) }, |
| 52 | + { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID2) }, | |
| 52 | 53 | { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) }, |
| 53 | 54 | { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) }, |
| 54 | 55 | { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) }, |
| @@ -27,6 +27,7 @@ · 26 unmodified lines | ||
| 27 | 27 | #define ATEN_VENDOR_ID 0x0557 |
| 28 | 28 | #define ATEN_VENDOR_ID2 0x0547 |
| 29 | 29 | #define ATEN_PRODUCT_ID 0x2008 |
| 30 | +#define ATEN_PRODUCT_ID2 0x2118 | |
| 30 | 31 | |
| 31 | 32 | #define IODATA_VENDOR_ID 0x04bb |
| 32 | 33 | #define IODATA_PRODUCT_ID 0x0a03 |
| @@ -124,6 +124,7 @@ static const struct usb_device_id id_table[] = { · 123 unmodified lines | ||
| 124 | 124 | {USB_DEVICE(0x1410, 0xa021)}, /* Novatel Gobi 3000 Composite */ |
| 125 | 125 | {USB_DEVICE(0x413c, 0x8193)}, /* Dell Gobi 3000 QDL */ |
| 126 | 126 | {USB_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */ |
| 127 | + {USB_DEVICE(0x413c, 0x81a6)}, /* Dell DW5570 QDL (MC8805) */ | |
| 127 | 128 | {USB_DEVICE(0x1199, 0x68a4)}, /* Sierra Wireless QDL */ |
| 128 | 129 | {USB_DEVICE(0x1199, 0x68a5)}, /* Sierra Wireless Modem */ |
| 129 | 130 | {USB_DEVICE(0x1199, 0x68a8)}, /* Sierra Wireless QDL */ |
| @@ -1123,12 +1123,11 @@ static long tce_iommu_ioctl(void *iommu_data, · 1122 unmodified lines | ||
| 1123 | 1123 | mutex_lock(&container->lock); |
| 1124 | 1124 | |
| 1125 | 1125 | ret = tce_iommu_create_default_window(container); |
| 1126 | − if (ret) | |
| 1127 | − return ret; | |
| 1128 | − | |
| 1129 | − ret = tce_iommu_create_window(container, create.page_shift, | |
| 1130 | − create.window_size, create.levels, | |
| 1131 | − &create.start_addr); | |
| 1126 | + if (!ret) | |
| 1127 | + ret = tce_iommu_create_window(container, | |
| 1128 | + create.page_shift, | |
| 1129 | + create.window_size, create.levels, | |
| 1130 | + &create.start_addr); | |
| 1132 | 1131 | |
| 1133 | 1132 | mutex_unlock(&container->lock); |
| 1134 | 1133 | |
| @@ -130,14 +130,14 @@ static long vhost_get_vring_endian(struct vhost_virtqueue *vq, u32 idx, · 129 unmodified lines | ||
| 130 | 130 | |
| 131 | 131 | static void vhost_init_is_le(struct vhost_virtqueue *vq) |
| 132 | 132 | { |
| 133 | − if (vhost_has_feature(vq, VIRTIO_F_VERSION_1)) | |
| 134 | − vq->is_le = true; | |
| 133 | + vq->is_le = vhost_has_feature(vq, VIRTIO_F_VERSION_1) | |
| 134 | + || virtio_legacy_is_little_endian(); | |
| 135 | 135 | } |
| 136 | 136 | #endif /* CONFIG_VHOST_CROSS_ENDIAN_LEGACY */ |
| 137 | 137 | |
| 138 | 138 | static void vhost_reset_is_le(struct vhost_virtqueue *vq) |
| 139 | 139 | { |
| 140 | − vq->is_le = virtio_legacy_is_little_endian(); | |
| 140 | + vhost_init_is_le(vq); | |
| 141 | 141 | } |
| 142 | 142 | |
| 143 | 143 | struct vhost_flush_struct { |
| @@ -1714,10 +1714,8 @@ int vhost_vq_init_access(struct vhost_virtqueue *vq) · 1570 unmodified lines | ||
| 1714 | 1714 | int r; |
| 1715 | 1715 | bool is_le = vq->is_le; |
| 1716 | 1716 | |
| 1717 | − if (!vq->private_data) { | |
| 1718 | − vhost_reset_is_le(vq); | |
| 1717 | + if (!vq->private_data) | |
| 1719 | 1718 | return 0; |
| 1720 | − } | |
| 1721 | 1719 | |
| 1722 | 1720 | vhost_init_is_le(vq); |
| 1723 | 1721 | |
| @@ -159,13 +159,6 @@ static bool vring_use_dma_api(struct virtio_device *vdev) · 158 unmodified lines | ||
| 159 | 159 | if (xen_domain()) |
| 160 | 160 | return true; |
| 161 | 161 | |
| 162 | − /* | |
| 163 | − * On ARM-based machines, the DMA ops will do the right thing, | |
| 164 | − * so always use them with legacy devices. | |
| 165 | − */ | |
| 166 | − if (IS_ENABLED(CONFIG_ARM) || IS_ENABLED(CONFIG_ARM64)) | |
| 167 | − return !virtio_has_feature(vdev, VIRTIO_F_VERSION_1); | |
| 168 | − | |
| 169 | 162 | return false; |
| 170 | 163 | } |
| 171 | 164 | |
| @@ -285,6 +285,7 @@ initiate_cifs_search(const unsigned int xid, struct file *file) · 284 unmodified lines | ||
| 285 | 285 | rc = -ENOMEM; |
| 286 | 286 | goto error_exit; |
| 287 | 287 | } |
| 288 | + spin_lock_init(&cifsFile->file_info_lock); | |
| 288 | 289 | file->private_data = cifsFile; |
| 289 | 290 | cifsFile->tlink = cifs_get_tlink(tlink); |
| 290 | 291 | tcon = tlink_tcon(tlink); |
| @@ -1031,6 +1031,11 @@ dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data, · 1030 unmodified lines | ||
| 1031 | 1031 | struct blk_dax_ctl dax = { 0 }; |
| 1032 | 1032 | ssize_t map_len; |
| 1033 | 1033 | |
| 1034 | + if (fatal_signal_pending(current)) { | |
| 1035 | + ret = -EINTR; | |
| 1036 | + break; | |
| 1037 | + } | |
| 1038 | + | |
| 1034 | 1039 | dax.sector = dax_iomap_sector(iomap, pos); |
| 1035 | 1040 | dax.size = (length + offset + PAGE_SIZE - 1) & PAGE_MASK; |
| 1036 | 1041 | map_len = dax_map_atomic(iomap->bdev, &dax); |
| @@ -542,6 +542,7 @@ void __fscache_disable_cookie(struct fscache_cookie *cookie, bool invalidate) · 541 unmodified lines | ||
| 542 | 542 | hlist_for_each_entry(object, &cookie->backing_objects, cookie_link) { |
| 543 | 543 | if (invalidate) |
| 544 | 544 | set_bit(FSCACHE_OBJECT_RETIRED, &object->flags); |
| 545 | + clear_bit(FSCACHE_OBJECT_PENDING_WRITE, &object->flags); | |
| 545 | 546 | fscache_raise_event(object, FSCACHE_OBJECT_EV_KILL); |
| 546 | 547 | } |
| 547 | 548 | } else { |
| @@ -560,6 +561,10 @@ void __fscache_disable_cookie(struct fscache_cookie *cookie, bool invalidate) · 12 unmodified lines | ||
| 560 | 561 | wait_on_atomic_t(&cookie->n_active, fscache_wait_atomic_t, |
| 561 | 562 | TASK_UNINTERRUPTIBLE); |
| 562 | 563 | |
| 564 | + /* Make sure any pending writes are cancelled. */ | |
| 565 | + if (cookie->def->type != FSCACHE_COOKIE_TYPE_INDEX) | |
| 566 | + fscache_invalidate_writes(cookie); | |
| 567 | + | |
| 563 | 568 | /* Reset the cookie state if it wasn't relinquished */ |
| 564 | 569 | if (!test_bit(FSCACHE_COOKIE_RELINQUISHED, &cookie->flags)) { |
| 565 | 570 | atomic_inc(&cookie->n_active); |
| @@ -48,6 +48,7 @@ int __fscache_register_netfs(struct fscache_netfs *netfs) · 47 unmodified lines | ||
| 48 | 48 | cookie->flags = 1 << FSCACHE_COOKIE_ENABLED; |
| 49 | 49 | |
| 50 | 50 | spin_lock_init(&cookie->lock); |
| 51 | + spin_lock_init(&cookie->stores_lock); | |
| 51 | 52 | INIT_HLIST_HEAD(&cookie->backing_objects); |
| 52 | 53 | |
| 53 | 54 | /* check the netfs type is not already present */ |
| @@ -30,6 +30,7 @@ static const struct fscache_state *fscache_look_up_object(struct fscache_object · 29 unmodified lines | ||
| 30 | 30 | static const struct fscache_state *fscache_object_available(struct fscache_object *, int); |
| 31 | 31 | static const struct fscache_state *fscache_parent_ready(struct fscache_object *, int); |
| 32 | 32 | static const struct fscache_state *fscache_update_object(struct fscache_object *, int); |
| 33 | +static const struct fscache_state *fscache_object_dead(struct fscache_object *, int); | |
| 33 | 34 | |
| 34 | 35 | #define __STATE_NAME(n) fscache_osm_##n |
| 35 | 36 | #define STATE(n) (&__STATE_NAME(n)) |
| @@ -91,7 +92,7 @@ static WORK_STATE(LOOKUP_FAILURE, "LCFL", fscache_lookup_failure); · 55 unmodified lines | ||
| 91 | 92 | static WORK_STATE(KILL_OBJECT, "KILL", fscache_kill_object); |
| 92 | 93 | static WORK_STATE(KILL_DEPENDENTS, "KDEP", fscache_kill_dependents); |
| 93 | 94 | static WORK_STATE(DROP_OBJECT, "DROP", fscache_drop_object); |
| 94 | −static WORK_STATE(OBJECT_DEAD, "DEAD", (void*)2UL); | |
| 95 | +static WORK_STATE(OBJECT_DEAD, "DEAD", fscache_object_dead); | |
| 95 | 96 | |
| 96 | 97 | static WAIT_STATE(WAIT_FOR_INIT, "?INI", |
| 97 | 98 | TRANSIT_TO(INIT_OBJECT, 1 << FSCACHE_OBJECT_EV_NEW_CHILD)); |
| @@ -229,6 +230,10 @@ execute_work_state: · 131 unmodified lines | ||
| 229 | 230 | event = -1; |
| 230 | 231 | if (new_state == NO_TRANSIT) { |
| 231 | 232 | _debug("{OBJ%x} %s notrans", object->debug_id, state->name); |
| 233 | + if (unlikely(state == STATE(OBJECT_DEAD))) { | |
| 234 | + _leave(" [dead]"); | |
| 235 | + return; | |
| 236 | + } | |
| 232 | 237 | fscache_enqueue_object(object); |
| 233 | 238 | event_mask = object->oob_event_mask; |
| 234 | 239 | goto unmask_events; |
| @@ -239,7 +244,7 @@ execute_work_state: · 4 unmodified lines | ||
| 239 | 244 | object->state = state = new_state; |
| 240 | 245 | |
| 241 | 246 | if (state->work) { |
| 242 | − if (unlikely(state->work == ((void *)2UL))) { | |
| 247 | + if (unlikely(state == STATE(OBJECT_DEAD))) { | |
| 243 | 248 | _leave(" [dead]"); |
| 244 | 249 | return; |
| 245 | 250 | } |
| @@ -645,6 +650,12 @@ static const struct fscache_state *fscache_kill_object(struct fscache_object *ob · 399 unmodified lines | ||
| 645 | 650 | fscache_mark_object_dead(object); |
| 646 | 651 | object->oob_event_mask = 0; |
| 647 | 652 | |
| 653 | + if (test_bit(FSCACHE_OBJECT_RETIRED, &object->flags)) { | |
| 654 | + /* Reject any new read/write ops and abort any that are pending. */ | |
| 655 | + clear_bit(FSCACHE_OBJECT_PENDING_WRITE, &object->flags); | |
| 656 | + fscache_cancel_all_ops(object); | |
| 657 | + } | |
| 658 | + | |
| 648 | 659 | if (list_empty(&object->dependents) && |
| 649 | 660 | object->n_ops == 0 && |
| 650 | 661 | object->n_children == 0) |
| @@ -1077,3 +1088,20 @@ void fscache_object_mark_killed(struct fscache_object *object, · 426 unmodified lines | ||
| 1077 | 1088 | } |
| 1078 | 1089 | } |
| 1079 | 1090 | EXPORT_SYMBOL(fscache_object_mark_killed); |
| 1091 | + | |
| 1092 | +/* | |
| 1093 | + * The object is dead. We can get here if an object gets queued by an event | |
| 1094 | + * that would lead to its death (such as EV_KILL) when the dispatcher is | |
| 1095 | + * already running (and so can be requeued) but hasn't yet cleared the event | |
| 1096 | + * mask. | |
| 1097 | + */ | |
| 1098 | +static const struct fscache_state *fscache_object_dead(struct fscache_object *object, | |
| 1099 | + int event) | |
| 1100 | +{ | |
| 1101 | + if (!test_and_set_bit(FSCACHE_OBJECT_RUN_AFTER_DEAD, | |
| 1102 | + &object->flags)) | |
| 1103 | + return NO_TRANSIT; | |
| 1104 | + | |
| 1105 | + WARN(true, "FS-Cache object redispatched after death"); | |
| 1106 | + return NO_TRANSIT; | |
| 1107 | +} | |
| @@ -114,6 +114,9 @@ iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags, · 113 unmodified lines | ||
| 114 | 114 | |
| 115 | 115 | BUG_ON(pos + len > iomap->offset + iomap->length); |
| 116 | 116 | |
| 117 | + if (fatal_signal_pending(current)) | |
| 118 | + return -EINTR; | |
| 119 | + | |
| 117 | 120 | page = grab_cache_page_write_begin(inode->i_mapping, index, flags); |
| 118 | 121 | if (!page) |
| 119 | 122 | return -ENOMEM; |
| @@ -332,6 +332,37 @@ nfsd_sanitize_attrs(struct inode *inode, struct iattr *iap) · 331 unmodified lines | ||
| 332 | 332 | } |
| 333 | 333 | } |
| 334 | 334 | |
| 335 | +static __be32 | |
| 336 | +nfsd_get_write_access(struct svc_rqst *rqstp, struct svc_fh *fhp, | |
| 337 | + struct iattr *iap) | |
| 338 | +{ | |
| 339 | + struct inode *inode = d_inode(fhp->fh_dentry); | |
| 340 | + int host_err; | |
| 341 | + | |
| 342 | + if (iap->ia_size < inode->i_size) { | |
| 343 | + __be32 err; | |
| 344 | + | |
| 345 | + err = nfsd_permission(rqstp, fhp->fh_export, fhp->fh_dentry, | |
| 346 | + NFSD_MAY_TRUNC | NFSD_MAY_OWNER_OVERRIDE); | |
| 347 | + if (err) | |
| 348 | + return err; | |
| 349 | + } | |
| 350 | + | |
| 351 | + host_err = get_write_access(inode); | |
| 352 | + if (host_err) | |
| 353 | + goto out_nfserrno; | |
| 354 | + | |
| 355 | + host_err = locks_verify_truncate(inode, NULL, iap->ia_size); | |
| 356 | + if (host_err) | |
| 357 | + goto out_put_write_access; | |
| 358 | + return 0; | |
| 359 | + | |
| 360 | +out_put_write_access: | |
| 361 | + put_write_access(inode); | |
| 362 | +out_nfserrno: | |
| 363 | + return nfserrno(host_err); | |
| 364 | +} | |
| 365 | + | |
| 335 | 366 | /* |
| 336 | 367 | * Set various file attributes. After this call fhp needs an fh_put. |
| 337 | 368 | */ |
| @@ -346,6 +377,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, · 8 unmodified lines | ||
| 346 | 377 | __be32 err; |
| 347 | 378 | int host_err; |
| 348 | 379 | bool get_write_count; |
| 380 | + int size_change = 0; | |
| 349 | 381 | |
| 350 | 382 | if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE)) |
| 351 | 383 | accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE; |
| @@ -358,11 +390,11 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, · 6 unmodified lines | ||
| 358 | 390 | /* Get inode */ |
| 359 | 391 | err = fh_verify(rqstp, fhp, ftype, accmode); |
| 360 | 392 | if (err) |
| 361 | − return err; | |
| 393 | + goto out; | |
| 362 | 394 | if (get_write_count) { |
| 363 | 395 | host_err = fh_want_write(fhp); |
| 364 | 396 | if (host_err) |
| 365 | − goto out_host_err; | |
| 397 | + return nfserrno(host_err); | |
| 366 | 398 | } |
| 367 | 399 | |
| 368 | 400 | dentry = fhp->fh_dentry; |
| @@ -373,59 +405,50 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, · 4 unmodified lines | ||
| 373 | 405 | iap->ia_valid &= ~ATTR_MODE; |
| 374 | 406 | |
| 375 | 407 | if (!iap->ia_valid) |
| 376 | − return 0; | |
| 408 | + goto out; | |
| 377 | 409 | |
| 378 | 410 | nfsd_sanitize_attrs(inode, iap); |
| 379 | 411 | |
| 380 | − if (check_guard && guardtime != inode->i_ctime.tv_sec) | |
| 381 | − return nfserr_notsync; | |
| 382 | − | |
| 383 | 412 | /* |
| 384 | 413 | * The size case is special, it changes the file in addition to the |
| 385 | − * attributes, and file systems don't expect it to be mixed with | |
| 386 | − * "random" attribute changes. We thus split out the size change | |
| 387 | − * into a separate call for vfs_truncate, and do the rest as a | |
| 388 | − * a separate setattr call. | |
| 414 | + * attributes. | |
| 389 | 415 | */ |
| 390 | 416 | if (iap->ia_valid & ATTR_SIZE) { |
| 391 | − struct path path = { | |
| 392 | − .mnt = fhp->fh_export->ex_path.mnt, | |
| 393 | − .dentry = dentry, | |
| 394 | − }; | |
| 395 | − bool implicit_mtime = false; | |
| 417 | + err = nfsd_get_write_access(rqstp, fhp, iap); | |
| 418 | + if (err) | |
| 419 | + goto out; | |
| 420 | + size_change = 1; | |
| 396 | 421 | |
| 397 | 422 | /* |
| 398 | − * vfs_truncate implicity updates the mtime IFF the file size | |
| 399 | − * actually changes. Avoid the additional seattr call below if | |
| 400 | − * the only other attribute that the client sends is the mtime. | |
| 423 | + * RFC5661, Section 18.30.4: | |
| 424 | + * Changing the size of a file with SETATTR indirectly | |
| 425 | + * changes the time_modify and change attributes. | |
| 426 | + * | |
| 427 | + * (and similar for the older RFCs) | |
| 401 | 428 | */ |
| 402 | − if (iap->ia_size != i_size_read(inode) && | |
| 403 | − ((iap->ia_valid & ~(ATTR_SIZE | ATTR_MTIME)) == 0)) | |
| 404 | − implicit_mtime = true; | |
| 405 | − | |
| 406 | − host_err = vfs_truncate(&path, iap->ia_size); | |
| 407 | − if (host_err) | |
| 408 | − goto out_host_err; | |
| 409 | − | |
| 410 | − iap->ia_valid &= ~ATTR_SIZE; | |
| 411 | − if (implicit_mtime) | |
| 412 | − iap->ia_valid &= ~ATTR_MTIME; | |
| 413 | − if (!iap->ia_valid) | |
| 414 | − goto done; | |
| 429 | + if (iap->ia_size != i_size_read(inode)) | |
| 430 | + iap->ia_valid |= ATTR_MTIME; | |
| 415 | 431 | } |
| 416 | 432 | |
| 417 | 433 | iap->ia_valid |= ATTR_CTIME; |
| 418 | 434 | |
| 435 | + if (check_guard && guardtime != inode->i_ctime.tv_sec) { | |
| 436 | + err = nfserr_notsync; | |
| 437 | + goto out_put_write_access; | |
| 438 | + } | |
| 439 | + | |
| 419 | 440 | fh_lock(fhp); |
| 420 | 441 | host_err = notify_change(dentry, iap, NULL); |
| 421 | 442 | fh_unlock(fhp); |
| 422 | − if (host_err) | |
| 423 | − goto out_host_err; | |
| 443 | + err = nfserrno(host_err); | |
| 424 | 444 | |
| 425 | −done: | |
| 426 | − host_err = commit_metadata(fhp); | |
| 427 | −out_host_err: | |
| 428 | − return nfserrno(host_err); | |
| 445 | +out_put_write_access: | |
| 446 | + if (size_change) | |
| 447 | + put_write_access(inode); | |
| 448 | + if (!err) | |
| 449 | + err = nfserrno(commit_metadata(fhp)); | |
| 450 | +out: | |
| 451 | + return err; | |
| 429 | 452 | } |
| 430 | 453 | |
| 431 | 454 | #if defined(CONFIG_NFSD_V4) |
| @@ -9,18 +9,15 @@ · 8 unmodified lines | ||
| 9 | 9 | #ifndef KSYM_ALIGN |
| 10 | 10 | #define KSYM_ALIGN 8 |
| 11 | 11 | #endif |
| 12 | −#ifndef KCRC_ALIGN | |
| 13 | −#define KCRC_ALIGN 8 | |
| 14 | −#endif | |
| 15 | 12 | #else |
| 16 | 13 | #define __put .long |
| 17 | 14 | #ifndef KSYM_ALIGN |
| 18 | 15 | #define KSYM_ALIGN 4 |
| 19 | 16 | #endif |
| 17 | +#endif | |
| 20 | 18 | #ifndef KCRC_ALIGN |
| 21 | 19 | #define KCRC_ALIGN 4 |
| 22 | 20 | #endif |
| 23 | −#endif | |
| 24 | 21 | |
| 25 | 22 | #ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX |
| 26 | 23 | #define KSYM(name) _##name |
| @@ -52,7 +49,11 @@ KSYM(__kstrtab_\name): · 25 unmodified lines | ||
| 52 | 49 | .section ___kcrctab\sec+\name,"a" |
| 53 | 50 | .balign KCRC_ALIGN |
| 54 | 51 | KSYM(__kcrctab_\name): |
| 55 | − __put KSYM(__crc_\name) | |
| 52 | +#if defined(CONFIG_MODULE_REL_CRCS) | |
| 53 | + .long KSYM(__crc_\name) - . | |
| 54 | +#else | |
| 55 | + .long KSYM(__crc_\name) | |
| 56 | +#endif | |
| 56 | 57 | .weak KSYM(__crc_\name) |
| 57 | 58 | .previous |
| 58 | 59 | #endif |
| @@ -517,6 +517,7 @@ struct drm_device { · 516 unmodified lines | ||
| 517 | 517 | struct drm_minor *control; /**< Control node */ |
| 518 | 518 | struct drm_minor *primary; /**< Primary node */ |
| 519 | 519 | struct drm_minor *render; /**< Render node */ |
| 520 | + bool registered; | |
| 520 | 521 | |
| 521 | 522 | /* currently active master for this device. Protected by master_mutex */ |
| 522 | 523 | struct drm_master *master; |
| @@ -381,6 +381,8 @@ struct drm_connector_funcs { · 380 unmodified lines | ||
| 381 | 381 | * core drm connector interfaces. Everything added from this callback |
| 382 | 382 | * should be unregistered in the early_unregister callback. |
| 383 | 383 | * |
| 384 | + * This is called while holding drm_connector->mutex. | |
| 385 | + * | |
| 384 | 386 | * Returns: |
| 385 | 387 | * |
| 386 | 388 | * 0 on success, or a negative error code on failure. |
| @@ -395,6 +397,8 @@ struct drm_connector_funcs { · 8 unmodified lines | ||
| 395 | 397 | * late_register(). It is called from drm_connector_unregister(), |
| 396 | 398 | * early in the driver unload sequence to disable userspace access |
| 397 | 399 | * before data structures are torndown. |
| 400 | + * | |
| 401 | + * This is called while holding drm_connector->mutex. | |
| 398 | 402 | */ |
| 399 | 403 | void (*early_unregister)(struct drm_connector *connector); |
| 400 | 404 | |
| @@ -559,7 +563,6 @@ struct drm_cmdline_mode { · 158 unmodified lines | ||
| 559 | 563 | * @interlace_allowed: can this connector handle interlaced modes? |
| 560 | 564 | * @doublescan_allowed: can this connector handle doublescan? |
| 561 | 565 | * @stereo_allowed: can this connector handle stereo modes? |
| 562 | − * @registered: is this connector exposed (registered) with userspace? | |
| 563 | 566 | * @modes: modes available on this connector (from fill_modes() + user) |
| 564 | 567 | * @status: one of the drm_connector_status enums (connected, not, or unknown) |
| 565 | 568 | * @probed_modes: list of modes derived directly from the display |
| @@ -607,6 +610,13 @@ struct drm_connector { · 41 unmodified lines | ||
| 607 | 610 | |
| 608 | 611 | char *name; |
| 609 | 612 | |
| 613 | + /** | |
| 614 | + * @mutex: Lock for general connector state, but currently only protects | |
| 615 | + * @registered. Most of the connector state is still protected by the | |
| 616 | + * mutex in &drm_mode_config. | |
| 617 | + */ | |
| 618 | + struct mutex mutex; | |
| 619 | + | |
| 610 | 620 | /** |
| 611 | 621 | * @index: Compacted connector index, which matches the position inside |
| 612 | 622 | * the mode_config.list for drivers not supporting hot-add/removing. Can |
| @@ -620,6 +630,10 @@ struct drm_connector { · 7 unmodified lines | ||
| 620 | 630 | bool interlace_allowed; |
| 621 | 631 | bool doublescan_allowed; |
| 622 | 632 | bool stereo_allowed; |
| 633 | + /** | |
| 634 | + * @registered: Is this connector exposed (registered) with userspace? | |
| 635 | + * Protected by @mutex. | |
| 636 | + */ | |
| 623 | 637 | bool registered; |
| 624 | 638 | struct list_head modes; /* list of modes on this connector */ |
| 625 | 639 | |
| @@ -45,10 +45,9 @@ struct can_proto { · 44 unmodified lines | ||
| 45 | 45 | extern int can_proto_register(const struct can_proto *cp); |
| 46 | 46 | extern void can_proto_unregister(const struct can_proto *cp); |
| 47 | 47 | |
| 48 | −extern int can_rx_register(struct net_device *dev, canid_t can_id, | |
| 49 | − canid_t mask, | |
| 50 | − void (*func)(struct sk_buff *, void *), | |
| 51 | − void *data, char *ident); | |
| 48 | +int can_rx_register(struct net_device *dev, canid_t can_id, canid_t mask, | |
| 49 | + void (*func)(struct sk_buff *, void *), | |
| 50 | + void *data, char *ident, struct sock *sk); | |
| 52 | 51 | |
| 53 | 52 | extern void can_rx_unregister(struct net_device *dev, canid_t can_id, |
| 54 | 53 | canid_t mask, |
| @@ -8,9 +8,7 @@ enum cpuhp_state { · 7 unmodified lines | ||
| 8 | 8 | CPUHP_CREATE_THREADS, |
| 9 | 9 | CPUHP_PERF_PREPARE, |
| 10 | 10 | CPUHP_PERF_X86_PREPARE, |
| 11 | − CPUHP_PERF_X86_UNCORE_PREP, | |
| 12 | 11 | CPUHP_PERF_X86_AMD_UNCORE_PREP, |
| 13 | − CPUHP_PERF_X86_RAPL_PREP, | |
| 14 | 12 | CPUHP_PERF_BFIN, |
| 15 | 13 | CPUHP_PERF_POWER, |
| 16 | 14 | CPUHP_PERF_SUPERH, |
| @@ -86,7 +84,6 @@ enum cpuhp_state { · 69 unmodified lines | ||
| 86 | 84 | CPUHP_AP_IRQ_ARMADA_XP_STARTING, |
| 87 | 85 | CPUHP_AP_IRQ_BCM2836_STARTING, |
| 88 | 86 | CPUHP_AP_ARM_MVEBU_COHERENCY, |
| 89 | − CPUHP_AP_PERF_X86_UNCORE_STARTING, | |
| 90 | 87 | CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING, |
| 91 | 88 | CPUHP_AP_PERF_X86_STARTING, |
| 92 | 89 | CPUHP_AP_PERF_X86_AMD_IBS_STARTING, |
| @@ -43,12 +43,19 @@ extern struct module __this_module; · 42 unmodified lines | ||
| 43 | 43 | #ifdef CONFIG_MODVERSIONS |
| 44 | 44 | /* Mark the CRC weak since genksyms apparently decides not to |
| 45 | 45 | * generate a checksums for some symbols */ |
| 46 | +#if defined(CONFIG_MODULE_REL_CRCS) | |
| 46 | 47 | #define __CRC_SYMBOL(sym, sec) \ |
| 47 | − extern __visible void *__crc_##sym __attribute__((weak)); \ | |
| 48 | − static const unsigned long __kcrctab_##sym \ | |
| 49 | − __used \ | |
| 50 | − __attribute__((section("___kcrctab" sec "+" #sym), used)) \ | |
| 51 | − = (unsigned long) &__crc_##sym; | |
| 48 | + asm(" .section \"___kcrctab" sec "+" #sym "\", \"a\" \n" \ | |
| 49 | + " .weak " VMLINUX_SYMBOL_STR(__crc_##sym) " \n" \ | |
| 50 | + " .long " VMLINUX_SYMBOL_STR(__crc_##sym) " - . \n" \ | |
| 51 | + " .previous \n"); | |
| 52 | +#else | |
| 53 | +#define __CRC_SYMBOL(sym, sec) \ | |
| 54 | + asm(" .section \"___kcrctab" sec "+" #sym "\", \"a\" \n" \ | |
| 55 | + " .weak " VMLINUX_SYMBOL_STR(__crc_##sym) " \n" \ | |
| 56 | + " .long " VMLINUX_SYMBOL_STR(__crc_##sym) " \n" \ | |
| 57 | + " .previous \n"); | |
| 58 | +#endif | |
| 52 | 59 | #else |
| 53 | 60 | #define __CRC_SYMBOL(sym, sec) |
| 54 | 61 | #endif |
| @@ -360,6 +360,7 @@ struct fscache_object { · 359 unmodified lines | ||
| 360 | 360 | #define FSCACHE_OBJECT_IS_AVAILABLE 5 /* T if object has become active */ |
| 361 | 361 | #define FSCACHE_OBJECT_RETIRED 6 /* T if object was retired on relinquishment */ |
| 362 | 362 | #define FSCACHE_OBJECT_KILLED_BY_CACHE 7 /* T if object was killed by the cache */ |
| 363 | +#define FSCACHE_OBJECT_RUN_AFTER_DEAD 8 /* T if object has been dispatched after death */ | |
| 363 | 364 | |
| 364 | 365 | struct list_head cache_link; /* link in cache->object_list */ |
| 365 | 366 | struct hlist_node cookie_link; /* link in cookie->backing_objects */ |
| @@ -128,6 +128,7 @@ struct hv_ring_buffer_info { · 127 unmodified lines | ||
| 128 | 128 | u32 ring_data_startoffset; |
| 129 | 129 | u32 priv_write_index; |
| 130 | 130 | u32 priv_read_index; |
| 131 | + u32 cached_read_index; | |
| 131 | 132 | }; |
| 132 | 133 | |
| 133 | 134 | /* |
| @@ -180,6 +181,19 @@ static inline u32 hv_get_bytes_to_write(struct hv_ring_buffer_info *rbi) · 46 unmodified lines | ||
| 180 | 181 | return write; |
| 181 | 182 | } |
| 182 | 183 | |
| 184 | +static inline u32 hv_get_cached_bytes_to_write( | |
| 185 | + const struct hv_ring_buffer_info *rbi) | |
| 186 | +{ | |
| 187 | + u32 read_loc, write_loc, dsize, write; | |
| 188 | + | |
| 189 | + dsize = rbi->ring_datasize; | |
| 190 | + read_loc = rbi->cached_read_index; | |
| 191 | + write_loc = rbi->ring_buffer->write_index; | |
| 192 | + | |
| 193 | + write = write_loc >= read_loc ? dsize - (write_loc - read_loc) : | |
| 194 | + read_loc - write_loc; | |
| 195 | + return write; | |
| 196 | +} | |
| 183 | 197 | /* |
| 184 | 198 | * VMBUS version is 32 bit entity broken up into |
| 185 | 199 | * two 16 bit quantities: major_number. minor_number. |
| @@ -1488,7 +1502,7 @@ hv_get_ring_buffer(struct hv_ring_buffer_info *ring_info) · 1302 unmodified lines | ||
| 1488 | 1502 | |
| 1489 | 1503 | static inline void hv_signal_on_read(struct vmbus_channel *channel) |
| 1490 | 1504 | { |
| 1491 | − u32 cur_write_sz; | |
| 1505 | + u32 cur_write_sz, cached_write_sz; | |
| 1492 | 1506 | u32 pending_sz; |
| 1493 | 1507 | struct hv_ring_buffer_info *rbi = &channel->inbound; |
| 1494 | 1508 | |
| @@ -1512,12 +1526,24 @@ static inline void hv_signal_on_read(struct vmbus_channel *channel) · 17 unmodified lines | ||
| 1512 | 1526 | |
| 1513 | 1527 | cur_write_sz = hv_get_bytes_to_write(rbi); |
| 1514 | 1528 | |
| 1515 | − if (cur_write_sz >= pending_sz) | |
| 1529 | + if (cur_write_sz < pending_sz) | |
| 1530 | + return; | |
| 1531 | + | |
| 1532 | + cached_write_sz = hv_get_cached_bytes_to_write(rbi); | |
| 1533 | + if (cached_write_sz < pending_sz) | |
| 1516 | 1534 | vmbus_setevent(channel); |
| 1517 | 1535 | |
| 1518 | 1536 | return; |
| 1519 | 1537 | } |
| 1520 | 1538 | |
| 1539 | +static inline void | |
| 1540 | +init_cached_read_index(struct vmbus_channel *channel) | |
| 1541 | +{ | |
| 1542 | + struct hv_ring_buffer_info *rbi = &channel->inbound; | |
| 1543 | + | |
| 1544 | + rbi->cached_read_index = rbi->ring_buffer->read_index; | |
| 1545 | +} | |
| 1546 | + | |
| 1521 | 1547 | /* |
| 1522 | 1548 | * An API to support in-place processing of incoming VMBUS packets. |
| 1523 | 1549 | */ |
| @@ -1569,6 +1595,8 @@ static inline void put_pkt_raw(struct vmbus_channel *channel, · 45 unmodified lines | ||
| 1569 | 1595 | * This call commits the read index and potentially signals the host. |
| 1570 | 1596 | * Here is the pattern for using the "in-place" consumption APIs: |
| 1571 | 1597 | * |
| 1598 | + * init_cached_read_index(); | |
| 1599 | + * | |
| 1572 | 1600 | * while (get_next_pkt_raw() { |
| 1573 | 1601 | * process the packet "in-place"; |
| 1574 | 1602 | * put_pkt_raw(); |
| @@ -184,6 +184,7 @@ struct irq_data { · 183 unmodified lines | ||
| 184 | 184 | * |
| 185 | 185 | * IRQD_TRIGGER_MASK - Mask for the trigger type bits |
| 186 | 186 | * IRQD_SETAFFINITY_PENDING - Affinity setting is pending |
| 187 | + * IRQD_ACTIVATED - Interrupt has already been activated | |
| 187 | 188 | * IRQD_NO_BALANCING - Balancing disabled for this IRQ |
| 188 | 189 | * IRQD_PER_CPU - Interrupt is per cpu |
| 189 | 190 | * IRQD_AFFINITY_SET - Interrupt affinity was set |
| @@ -202,6 +203,7 @@ struct irq_data { · 12 unmodified lines | ||
| 202 | 203 | enum { |
| 203 | 204 | IRQD_TRIGGER_MASK = 0xf, |
| 204 | 205 | IRQD_SETAFFINITY_PENDING = (1 << 8), |
| 206 | + IRQD_ACTIVATED = (1 << 9), | |
| 205 | 207 | IRQD_NO_BALANCING = (1 << 10), |
| 206 | 208 | IRQD_PER_CPU = (1 << 11), |
| 207 | 209 | IRQD_AFFINITY_SET = (1 << 12), |
| @@ -312,6 +314,21 @@ static inline bool irqd_affinity_is_managed(struct irq_data *d) · 104 unmodified lines | ||
| 312 | 314 | return __irqd_to_state(d) & IRQD_AFFINITY_MANAGED; |
| 313 | 315 | } |
| 314 | 316 | |
| 317 | +static inline bool irqd_is_activated(struct irq_data *d) | |
| 318 | +{ | |
| 319 | + return __irqd_to_state(d) & IRQD_ACTIVATED; | |
| 320 | +} | |
| 321 | + | |
| 322 | +static inline void irqd_set_activated(struct irq_data *d) | |
| 323 | +{ | |
| 324 | + __irqd_to_state(d) |= IRQD_ACTIVATED; | |
| 325 | +} | |
| 326 | + | |
| 327 | +static inline void irqd_clr_activated(struct irq_data *d) | |
| 328 | +{ | |
| 329 | + __irqd_to_state(d) &= ~IRQD_ACTIVATED; | |
| 330 | +} | |
| 331 | + | |
| 315 | 332 | #undef __irqd_to_state |
| 316 | 333 | |
| 317 | 334 | static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) |
| @@ -203,6 +203,17 @@ unsigned long __rounddown_pow_of_two(unsigned long n) · 202 unmodified lines | ||
| 203 | 203 | * ... and so on. |
| 204 | 204 | */ |
| 205 | 205 | |
| 206 | −#define order_base_2(n) ilog2(roundup_pow_of_two(n)) | |
| 206 | +static inline __attribute_const__ | |
| 207 | +int __order_base_2(unsigned long n) | |
| 208 | +{ | |
| 209 | + return n > 1 ? ilog2(n - 1) + 1 : 0; | |
| 210 | +} | |
| 207 | 211 | |
| 212 | +#define order_base_2(n) \ | |
| 213 | +( \ | |
| 214 | + __builtin_constant_p(n) ? ( \ | |
| 215 | + ((n) == 0 || (n) == 1) ? 0 : \ | |
| 216 | + ilog2((n) - 1) + 1) : \ | |
| 217 | + __order_base_2(n) \ | |
| 218 | +) | |
| 208 | 219 | #endif /* _LINUX_LOG2_H */ |
| @@ -85,7 +85,8 @@ extern int zone_grow_waitqueues(struct zone *zone, unsigned long nr_pages); · 84 unmodified lines | ||
| 85 | 85 | extern int add_one_highpage(struct page *page, int pfn, int bad_ppro); |
| 86 | 86 | /* VM interface that may be used by firmware interface */ |
| 87 | 87 | extern int online_pages(unsigned long, unsigned long, int); |
| 88 | −extern int test_pages_in_a_zone(unsigned long, unsigned long); | |
| 88 | +extern int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, | |
| 89 | + unsigned long *valid_start, unsigned long *valid_end); | |
| 89 | 90 | extern void __offline_isolated_pages(unsigned long, unsigned long); |
| 90 | 91 | |
| 91 | 92 | typedef void (*online_page_callback_t)(struct page *page); |
| @@ -346,7 +346,7 @@ struct module { · 345 unmodified lines | ||
| 346 | 346 | |
| 347 | 347 | /* Exported symbols */ |
| 348 | 348 | const struct kernel_symbol *syms; |
| 349 | − const unsigned long *crcs; | |
| 349 | + const s32 *crcs; | |
| 350 | 350 | unsigned int num_syms; |
| 351 | 351 | |
| 352 | 352 | /* Kernel parameters. */ |
| @@ -359,18 +359,18 @@ struct module { · 6 unmodified lines | ||
| 359 | 359 | /* GPL-only exported symbols. */ |
| 360 | 360 | unsigned int num_gpl_syms; |
| 361 | 361 | const struct kernel_symbol *gpl_syms; |
| 362 | − const unsigned long *gpl_crcs; | |
| 362 | + const s32 *gpl_crcs; | |
| 363 | 363 | |
| 364 | 364 | #ifdef CONFIG_UNUSED_SYMBOLS |
| 365 | 365 | /* unused exported symbols. */ |
| 366 | 366 | const struct kernel_symbol *unused_syms; |
| 367 | − const unsigned long *unused_crcs; | |
| 367 | + const s32 *unused_crcs; | |
| 368 | 368 | unsigned int num_unused_syms; |
| 369 | 369 | |
| 370 | 370 | /* GPL-only, unused exported symbols. */ |
| 371 | 371 | unsigned int num_unused_gpl_syms; |
| 372 | 372 | const struct kernel_symbol *unused_gpl_syms; |
| 373 | − const unsigned long *unused_gpl_crcs; | |
| 373 | + const s32 *unused_gpl_crcs; | |
| 374 | 374 | #endif |
| 375 | 375 | |
| 376 | 376 | #ifdef CONFIG_MODULE_SIG |
| @@ -382,7 +382,7 @@ struct module { · 5 unmodified lines | ||
| 382 | 382 | |
| 383 | 383 | /* symbols that will be GPL-only in the near future. */ |
| 384 | 384 | const struct kernel_symbol *gpl_future_syms; |
| 385 | − const unsigned long *gpl_future_crcs; | |
| 385 | + const s32 *gpl_future_crcs; | |
| 386 | 386 | unsigned int num_gpl_future_syms; |
| 387 | 387 | |
| 388 | 388 | /* Exception table */ |
| @@ -523,7 +523,7 @@ struct module *find_module(const char *name); · 134 unmodified lines | ||
| 523 | 523 | |
| 524 | 524 | struct symsearch { |
| 525 | 525 | const struct kernel_symbol *start, *stop; |
| 526 | − const unsigned long *crcs; | |
| 526 | + const s32 *crcs; | |
| 527 | 527 | enum { |
| 528 | 528 | NOT_GPL_ONLY, |
| 529 | 529 | GPL_ONLY, |
| @@ -539,7 +539,7 @@ struct symsearch { · 9 unmodified lines | ||
| 539 | 539 | */ |
| 540 | 540 | const struct kernel_symbol *find_symbol(const char *name, |
| 541 | 541 | struct module **owner, |
| 542 | − const unsigned long **crc, | |
| 542 | + const s32 **crc, | |
| 543 | 543 | bool gplok, |
| 544 | 544 | bool warn); |
| 545 | 545 | |
| @@ -866,11 +866,15 @@ struct netdev_xdp { · 865 unmodified lines | ||
| 866 | 866 | * of useless work if you return NETDEV_TX_BUSY. |
| 867 | 867 | * Required; cannot be NULL. |
| 868 | 868 | * |
| 869 | − * netdev_features_t (*ndo_fix_features)(struct net_device *dev, | |
| 870 | − * netdev_features_t features); | |
| 871 | − * Adjusts the requested feature flags according to device-specific | |
| 872 | − * constraints, and returns the resulting flags. Must not modify | |
| 873 | − * the device state. | |
| 869 | + * netdev_features_t (*ndo_features_check)(struct sk_buff *skb, | |
| 870 | + * struct net_device *dev | |
| 871 | + * netdev_features_t features); | |
| 872 | + * Called by core transmit path to determine if device is capable of | |
| 873 | + * performing offload operations on a given packet. This is to give | |
| 874 | + * the device an opportunity to implement any restrictions that cannot | |
| 875 | + * be otherwise expressed by feature flags. The check is called with | |
| 876 | + * the set of features that the stack has calculated and it returns | |
| 877 | + * those the driver believes to be appropriate. | |
| 874 | 878 | * |
| 875 | 879 | * u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb, |
| 876 | 880 | * void *accel_priv, select_queue_fallback_t fallback); |
| @@ -1028,6 +1032,12 @@ struct netdev_xdp { · 151 unmodified lines | ||
| 1028 | 1032 | * Called to release previously enslaved netdev. |
| 1029 | 1033 | * |
| 1030 | 1034 | * Feature/offload setting functions. |
| 1035 | + * netdev_features_t (*ndo_fix_features)(struct net_device *dev, | |
| 1036 | + * netdev_features_t features); | |
| 1037 | + * Adjusts the requested feature flags according to device-specific | |
| 1038 | + * constraints, and returns the resulting flags. Must not modify | |
| 1039 | + * the device state. | |
| 1040 | + * | |
| 1031 | 1041 | * int (*ndo_set_features)(struct net_device *dev, netdev_features_t features); |
| 1032 | 1042 | * Called to update device configuration to new features. Passed |
| 1033 | 1043 | * feature set might be less than what was returned by ndo_fix_features()). |
| @@ -1100,15 +1110,6 @@ struct netdev_xdp { · 66 unmodified lines | ||
| 1100 | 1110 | * Callback to use for xmit over the accelerated station. This |
| 1101 | 1111 | * is used in place of ndo_start_xmit on accelerated net |
| 1102 | 1112 | * devices. |
| 1103 | − * netdev_features_t (*ndo_features_check)(struct sk_buff *skb, | |
| 1104 | − * struct net_device *dev | |
| 1105 | − * netdev_features_t features); | |
| 1106 | − * Called by core transmit path to determine if device is capable of | |
| 1107 | − * performing offload operations on a given packet. This is to give | |
| 1108 | − * the device an opportunity to implement any restrictions that cannot | |
| 1109 | − * be otherwise expressed by feature flags. The check is called with | |
| 1110 | − * the set of features that the stack has calculated and it returns | |
| 1111 | − * those the driver believes to be appropriate. | |
| 1112 | 1113 | * int (*ndo_set_tx_maxrate)(struct net_device *dev, |
| 1113 | 1114 | * int queue_index, u32 maxrate); |
| 1114 | 1115 | * Called when a user wants to set a max-rate limitation of specific |
| @@ -204,7 +204,7 @@ static inline void percpu_ref_get(struct percpu_ref *ref) · 203 unmodified lines | ||
| 204 | 204 | static inline bool percpu_ref_tryget(struct percpu_ref *ref) |
| 205 | 205 | { |
| 206 | 206 | unsigned long __percpu *percpu_count; |
| 207 | − int ret; | |
| 207 | + bool ret; | |
| 208 | 208 | |
| 209 | 209 | rcu_read_lock_sched(); |
| 210 | 210 | |
| @@ -238,7 +238,7 @@ static inline bool percpu_ref_tryget(struct percpu_ref *ref) · 27 unmodified lines | ||
| 238 | 238 | static inline bool percpu_ref_tryget_live(struct percpu_ref *ref) |
| 239 | 239 | { |
| 240 | 240 | unsigned long __percpu *percpu_count; |
| 241 | − int ret = false; | |
| 241 | + bool ret = false; | |
| 242 | 242 | |
| 243 | 243 | rcu_read_lock_sched(); |
| 244 | 244 | |
| @@ -776,6 +776,11 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, · 775 unmodified lines | ||
| 776 | 776 | { |
| 777 | 777 | u32 hash; |
| 778 | 778 | |
| 779 | + /* @flowlabel may include more than a flow label, eg, the traffic class. | |
| 780 | + * Here we want only the flow label value. | |
| 781 | + */ | |
| 782 | + flowlabel &= IPV6_FLOWLABEL_MASK; | |
| 783 | + | |
| 779 | 784 | if (flowlabel || |
| 780 | 785 | net->ipv6.sysctl.auto_flowlabels == IP6_AUTO_FLOW_LABEL_OFF || |
| 781 | 786 | (!autolabel && |
| @@ -1384,6 +1384,8 @@ enum ethtool_link_mode_bit_indices { · 1383 unmodified lines | ||
| 1384 | 1384 | ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, |
| 1385 | 1385 | ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, |
| 1386 | 1386 | ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, |
| 1387 | + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, | |
| 1388 | + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, | |
| 1387 | 1389 | |
| 1388 | 1390 | |
| 1389 | 1391 | /* Last allowed bit for __ETHTOOL_LINK_MODE_LEGACY_MASK is bit |
| @@ -1393,7 +1395,7 @@ enum ethtool_link_mode_bit_indices { · 3 unmodified lines | ||
| 1393 | 1395 | */ |
| 1394 | 1396 | |
| 1395 | 1397 | __ETHTOOL_LINK_MODE_LAST |
| 1396 | − = ETHTOOL_LINK_MODE_10000baseER_Full_BIT, | |
| 1398 | + = ETHTOOL_LINK_MODE_5000baseT_Full_BIT, | |
| 1397 | 1399 | }; |
| 1398 | 1400 | |
| 1399 | 1401 | #define __ETHTOOL_LINK_MODE_LEGACY_MASK(base_name) \ |
| @@ -1987,6 +1987,10 @@ config MODVERSIONS · 1986 unmodified lines | ||
| 1987 | 1987 | make them incompatible with the kernel you are running. If |
| 1988 | 1988 | unsure, say N. |
| 1989 | 1989 | |
| 1990 | +config MODULE_REL_CRCS | |
| 1991 | + bool | |
| 1992 | + depends on MODVERSIONS | |
| 1993 | + | |
| 1990 | 1994 | config MODULE_SRCVERSION_ALL |
| 1991 | 1995 | bool "Source checksum for all modules" |
| 1992 | 1996 | help |
| @@ -5221,6 +5221,11 @@ err_free_css: · 5220 unmodified lines | ||
| 5221 | 5221 | return ERR_PTR(err); |
| 5222 | 5222 | } |
| 5223 | 5223 | |
| 5224 | +/* | |
| 5225 | + * The returned cgroup is fully initialized including its control mask, but | |
| 5226 | + * it isn't associated with its kernfs_node and doesn't have the control | |
| 5227 | + * mask applied. | |
| 5228 | + */ | |
| 5224 | 5229 | static struct cgroup *cgroup_create(struct cgroup *parent) |
| 5225 | 5230 | { |
| 5226 | 5231 | struct cgroup_root *root = parent->root; |
| @@ -5288,11 +5293,6 @@ static struct cgroup *cgroup_create(struct cgroup *parent) · 61 unmodified lines | ||
| 5288 | 5293 | |
| 5289 | 5294 | cgroup_propagate_control(cgrp); |
| 5290 | 5295 | |
| 5291 | − /* @cgrp doesn't have dir yet so the following will only create csses */ | |
| 5292 | − ret = cgroup_apply_control_enable(cgrp); | |
| 5293 | − if (ret) | |
| 5294 | − goto out_destroy; | |
| 5295 | − | |
| 5296 | 5296 | return cgrp; |
| 5297 | 5297 | |
| 5298 | 5298 | out_cancel_ref: |
| @@ -5300,9 +5300,6 @@ out_cancel_ref: · 1 unmodified line | ||
| 5300 | 5300 | out_free_cgrp: |
| 5301 | 5301 | kfree(cgrp); |
| 5302 | 5302 | return ERR_PTR(ret); |
| 5303 | −out_destroy: | |
| 5304 | − cgroup_destroy_locked(cgrp); | |
| 5305 | − return ERR_PTR(ret); | |
| 5306 | 5303 | } |
| 5307 | 5304 | |
| 5308 | 5305 | static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name, |
| @@ -1469,7 +1469,6 @@ ctx_group_list(struct perf_event *event, struct perf_event_context *ctx) · 1468 unmodified lines | ||
| 1469 | 1469 | static void |
| 1470 | 1470 | list_add_event(struct perf_event *event, struct perf_event_context *ctx) |
| 1471 | 1471 | { |
| 1472 | − | |
| 1473 | 1472 | lockdep_assert_held(&ctx->lock); |
| 1474 | 1473 | |
| 1475 | 1474 | WARN_ON_ONCE(event->attach_state & PERF_ATTACH_CONTEXT); |
| @@ -1624,6 +1623,8 @@ static void perf_group_attach(struct perf_event *event) · 148 unmodified lines | ||
| 1624 | 1623 | { |
| 1625 | 1624 | struct perf_event *group_leader = event->group_leader, *pos; |
| 1626 | 1625 | |
| 1626 | + lockdep_assert_held(&event->ctx->lock); | |
| 1627 | + | |
| 1627 | 1628 | /* |
| 1628 | 1629 | * We can have double attach due to group movement in perf_event_open. |
| 1629 | 1630 | */ |
| @@ -1697,6 +1698,8 @@ static void perf_group_detach(struct perf_event *event) · 67 unmodified lines | ||
| 1697 | 1698 | struct perf_event *sibling, *tmp; |
| 1698 | 1699 | struct list_head *list = NULL; |
| 1699 | 1700 | |
| 1701 | + lockdep_assert_held(&event->ctx->lock); | |
| 1702 | + | |
| 1700 | 1703 | /* |
| 1701 | 1704 | * We can have double detach due to exit/hot-unplug + close. |
| 1702 | 1705 | */ |
| @@ -1895,9 +1898,29 @@ __perf_remove_from_context(struct perf_event *event, · 192 unmodified lines | ||
| 1895 | 1898 | */ |
| 1896 | 1899 | static void perf_remove_from_context(struct perf_event *event, unsigned long flags) |
| 1897 | 1900 | { |
| 1898 | − lockdep_assert_held(&event->ctx->mutex); | |
| 1901 | + struct perf_event_context *ctx = event->ctx; | |
| 1902 | + | |
| 1903 | + lockdep_assert_held(&ctx->mutex); | |
| 1899 | 1904 | |
| 1900 | 1905 | event_function_call(event, __perf_remove_from_context, (void *)flags); |
| 1906 | + | |
| 1907 | + /* | |
| 1908 | + * The above event_function_call() can NO-OP when it hits | |
| 1909 | + * TASK_TOMBSTONE. In that case we must already have been detached | |
| 1910 | + * from the context (by perf_event_exit_event()) but the grouping | |
| 1911 | + * might still be in-tact. | |
| 1912 | + */ | |
| 1913 | + WARN_ON_ONCE(event->attach_state & PERF_ATTACH_CONTEXT); | |
| 1914 | + if ((flags & DETACH_GROUP) && | |
| 1915 | + (event->attach_state & PERF_ATTACH_GROUP)) { | |
| 1916 | + /* | |
| 1917 | + * Since in that case we cannot possibly be scheduled, simply | |
| 1918 | + * detach now. | |
| 1919 | + */ | |
| 1920 | + raw_spin_lock_irq(&ctx->lock); | |
| 1921 | + perf_group_detach(event); | |
| 1922 | + raw_spin_unlock_irq(&ctx->lock); | |
| 1923 | + } | |
| 1901 | 1924 | } |
| 1902 | 1925 | |
| 1903 | 1926 | /* |
| @@ -6609,6 +6632,27 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) · 4705 unmodified lines | ||
| 6609 | 6632 | char *buf = NULL; |
| 6610 | 6633 | char *name; |
| 6611 | 6634 | |
| 6635 | + if (vma->vm_flags & VM_READ) | |
| 6636 | + prot |= PROT_READ; | |
| 6637 | + if (vma->vm_flags & VM_WRITE) | |
| 6638 | + prot |= PROT_WRITE; | |
| 6639 | + if (vma->vm_flags & VM_EXEC) | |
| 6640 | + prot |= PROT_EXEC; | |
| 6641 | + | |
| 6642 | + if (vma->vm_flags & VM_MAYSHARE) | |
| 6643 | + flags = MAP_SHARED; | |
| 6644 | + else | |
| 6645 | + flags = MAP_PRIVATE; | |
| 6646 | + | |
| 6647 | + if (vma->vm_flags & VM_DENYWRITE) | |
| 6648 | + flags |= MAP_DENYWRITE; | |
| 6649 | + if (vma->vm_flags & VM_MAYEXEC) | |
| 6650 | + flags |= MAP_EXECUTABLE; | |
| 6651 | + if (vma->vm_flags & VM_LOCKED) | |
| 6652 | + flags |= MAP_LOCKED; | |
| 6653 | + if (vma->vm_flags & VM_HUGETLB) | |
| 6654 | + flags |= MAP_HUGETLB; | |
| 6655 | + | |
| 6612 | 6656 | if (file) { |
| 6613 | 6657 | struct inode *inode; |
| 6614 | 6658 | dev_t dev; |
| @@ -6635,27 +6679,6 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) · 20 unmodified lines | ||
| 6635 | 6679 | maj = MAJOR(dev); |
| 6636 | 6680 | min = MINOR(dev); |
| 6637 | 6681 | |
| 6638 | − if (vma->vm_flags & VM_READ) | |
| 6639 | − prot |= PROT_READ; | |
| 6640 | − if (vma->vm_flags & VM_WRITE) | |
| 6641 | − prot |= PROT_WRITE; | |
| 6642 | − if (vma->vm_flags & VM_EXEC) | |
| 6643 | − prot |= PROT_EXEC; | |
| 6644 | − | |
| 6645 | − if (vma->vm_flags & VM_MAYSHARE) | |
| 6646 | − flags = MAP_SHARED; | |
| 6647 | − else | |
| 6648 | − flags = MAP_PRIVATE; | |
| 6649 | − | |
| 6650 | − if (vma->vm_flags & VM_DENYWRITE) | |
| 6651 | − flags |= MAP_DENYWRITE; | |
| 6652 | − if (vma->vm_flags & VM_MAYEXEC) | |
| 6653 | − flags |= MAP_EXECUTABLE; | |
| 6654 | − if (vma->vm_flags & VM_LOCKED) | |
| 6655 | − flags |= MAP_LOCKED; | |
| 6656 | − if (vma->vm_flags & VM_HUGETLB) | |
| 6657 | − flags |= MAP_HUGETLB; | |
| 6658 | − | |
| 6659 | 6682 | goto got_name; |
| 6660 | 6683 | } else { |
| 6661 | 6684 | if (vma->vm_ops && vma->vm_ops->name) { |
| @@ -1346,6 +1346,30 @@ void irq_domain_free_irqs_parent(struct irq_domain *domain, · 1345 unmodified lines | ||
| 1346 | 1346 | } |
| 1347 | 1347 | EXPORT_SYMBOL_GPL(irq_domain_free_irqs_parent); |
| 1348 | 1348 | |
| 1349 | +static void __irq_domain_activate_irq(struct irq_data *irq_data) | |
| 1350 | +{ | |
| 1351 | + if (irq_data && irq_data->domain) { | |
| 1352 | + struct irq_domain *domain = irq_data->domain; | |
| 1353 | + | |
| 1354 | + if (irq_data->parent_data) | |
| 1355 | + __irq_domain_activate_irq(irq_data->parent_data); | |
| 1356 | + if (domain->ops->activate) | |
| 1357 | + domain->ops->activate(domain, irq_data); | |
| 1358 | + } | |
| 1359 | +} | |
| 1360 | + | |
| 1361 | +static void __irq_domain_deactivate_irq(struct irq_data *irq_data) | |
| 1362 | +{ | |
| 1363 | + if (irq_data && irq_data->domain) { | |
| 1364 | + struct irq_domain *domain = irq_data->domain; | |
| 1365 | + | |
| 1366 | + if (domain->ops->deactivate) | |
| 1367 | + domain->ops->deactivate(domain, irq_data); | |
| 1368 | + if (irq_data->parent_data) | |
| 1369 | + __irq_domain_deactivate_irq(irq_data->parent_data); | |
| 1370 | + } | |
| 1371 | +} | |
| 1372 | + | |
| 1349 | 1373 | /** |
| 1350 | 1374 | * irq_domain_activate_irq - Call domain_ops->activate recursively to activate |
| 1351 | 1375 | * interrupt |
| @@ -1356,13 +1380,9 @@ EXPORT_SYMBOL_GPL(irq_domain_free_irqs_parent); · 4 unmodified lines | ||
| 1356 | 1380 | */ |
| 1357 | 1381 | void irq_domain_activate_irq(struct irq_data *irq_data) |
| 1358 | 1382 | { |
| 1359 | − if (irq_data && irq_data->domain) { | |
| 1360 | − struct irq_domain *domain = irq_data->domain; | |
| 1361 | − | |
| 1362 | − if (irq_data->parent_data) | |
| 1363 | − irq_domain_activate_irq(irq_data->parent_data); | |
| 1364 | − if (domain->ops->activate) | |
| 1365 | − domain->ops->activate(domain, irq_data); | |
| 1383 | + if (!irqd_is_activated(irq_data)) { | |
| 1384 | + __irq_domain_activate_irq(irq_data); | |
| 1385 | + irqd_set_activated(irq_data); | |
| 1366 | 1386 | } |
| 1367 | 1387 | } |
| 1368 | 1388 | |
| @@ -1376,13 +1396,9 @@ void irq_domain_activate_irq(struct irq_data *irq_data) · 7 unmodified lines | ||
| 1376 | 1396 | */ |
| 1377 | 1397 | void irq_domain_deactivate_irq(struct irq_data *irq_data) |
| 1378 | 1398 | { |
| 1379 | − if (irq_data && irq_data->domain) { | |
| 1380 | − struct irq_domain *domain = irq_data->domain; | |
| 1381 | − | |
| 1382 | − if (domain->ops->deactivate) | |
| 1383 | − domain->ops->deactivate(domain, irq_data); | |
| 1384 | − if (irq_data->parent_data) | |
| 1385 | − irq_domain_deactivate_irq(irq_data->parent_data); | |
| 1399 | + if (irqd_is_activated(irq_data)) { | |
| 1400 | + __irq_domain_deactivate_irq(irq_data); | |
| 1401 | + irqd_clr_activated(irq_data); | |
| 1386 | 1402 | } |
| 1387 | 1403 | } |
| 1388 | 1404 | |
| @@ -389,16 +389,16 @@ extern const struct kernel_symbol __start___ksymtab_gpl[]; · 388 unmodified lines | ||
| 389 | 389 | extern const struct kernel_symbol __stop___ksymtab_gpl[]; |
| 390 | 390 | extern const struct kernel_symbol __start___ksymtab_gpl_future[]; |
| 391 | 391 | extern const struct kernel_symbol __stop___ksymtab_gpl_future[]; |
| 392 | −extern const unsigned long __start___kcrctab[]; | |
| 393 | −extern const unsigned long __start___kcrctab_gpl[]; | |
| 394 | −extern const unsigned long __start___kcrctab_gpl_future[]; | |
| 392 | +extern const s32 __start___kcrctab[]; | |
| 393 | +extern const s32 __start___kcrctab_gpl[]; | |
| 394 | +extern const s32 __start___kcrctab_gpl_future[]; | |
| 395 | 395 | #ifdef CONFIG_UNUSED_SYMBOLS |
| 396 | 396 | extern const struct kernel_symbol __start___ksymtab_unused[]; |
| 397 | 397 | extern const struct kernel_symbol __stop___ksymtab_unused[]; |
| 398 | 398 | extern const struct kernel_symbol __start___ksymtab_unused_gpl[]; |
| 399 | 399 | extern const struct kernel_symbol __stop___ksymtab_unused_gpl[]; |
| 400 | −extern const unsigned long __start___kcrctab_unused[]; | |
| 401 | −extern const unsigned long __start___kcrctab_unused_gpl[]; | |
| 400 | +extern const s32 __start___kcrctab_unused[]; | |
| 401 | +extern const s32 __start___kcrctab_unused_gpl[]; | |
| 402 | 402 | #endif |
| 403 | 403 | |
| 404 | 404 | #ifndef CONFIG_MODVERSIONS |
| @@ -497,7 +497,7 @@ struct find_symbol_arg { · 92 unmodified lines | ||
| 497 | 497 | |
| 498 | 498 | /* Output */ |
| 499 | 499 | struct module *owner; |
| 500 | − const unsigned long *crc; | |
| 500 | + const s32 *crc; | |
| 501 | 501 | const struct kernel_symbol *sym; |
| 502 | 502 | }; |
| 503 | 503 | |
| @@ -563,7 +563,7 @@ static bool find_symbol_in_section(const struct symsearch *syms, · 59 unmodified lines | ||
| 563 | 563 | * (optional) module which owns it. Needs preempt disabled or module_mutex. */ |
| 564 | 564 | const struct kernel_symbol *find_symbol(const char *name, |
| 565 | 565 | struct module **owner, |
| 566 | − const unsigned long **crc, | |
| 566 | + const s32 **crc, | |
| 567 | 567 | bool gplok, |
| 568 | 568 | bool warn) |
| 569 | 569 | { |
| @@ -1249,23 +1249,17 @@ static int try_to_force_load(struct module *mod, const char *reason) · 679 unmodified lines | ||
| 1249 | 1249 | } |
| 1250 | 1250 | |
| 1251 | 1251 | #ifdef CONFIG_MODVERSIONS |
| 1252 | −/* If the arch applies (non-zero) relocations to kernel kcrctab, unapply it. */ | |
| 1253 | −static unsigned long maybe_relocated(unsigned long crc, | |
| 1254 | − const struct module *crc_owner) | |
| 1252 | + | |
| 1253 | +static u32 resolve_rel_crc(const s32 *crc) | |
| 1255 | 1254 | { |
| 1256 | −#ifdef ARCH_RELOCATES_KCRCTAB | |
| 1257 | − if (crc_owner == NULL) | |
| 1258 | − return crc - (unsigned long)reloc_start; | |
| 1259 | −#endif | |
| 1260 | − return crc; | |
| 1255 | + return *(u32 *)((void *)crc + *crc); | |
| 1261 | 1256 | } |
| 1262 | 1257 | |
| 1263 | 1258 | static int check_version(Elf_Shdr *sechdrs, |
| 1264 | 1259 | unsigned int versindex, |
| 1265 | 1260 | const char *symname, |
| 1266 | 1261 | struct module *mod, |
| 1267 | − const unsigned long *crc, | |
| 1268 | − const struct module *crc_owner) | |
| 1262 | + const s32 *crc) | |
| 1269 | 1263 | { |
| 1270 | 1264 | unsigned int i, num_versions; |
| 1271 | 1265 | struct modversion_info *versions; |
| @@ -1283,13 +1277,19 @@ static int check_version(Elf_Shdr *sechdrs, · 11 unmodified lines | ||
| 1283 | 1277 | / sizeof(struct modversion_info); |
| 1284 | 1278 | |
| 1285 | 1279 | for (i = 0; i < num_versions; i++) { |
| 1280 | + u32 crcval; | |
| 1281 | + | |
| 1286 | 1282 | if (strcmp(versions[i].name, symname) != 0) |
| 1287 | 1283 | continue; |
| 1288 | 1284 | |
| 1289 | − if (versions[i].crc == maybe_relocated(*crc, crc_owner)) | |
| 1285 | + if (IS_ENABLED(CONFIG_MODULE_REL_CRCS)) | |
| 1286 | + crcval = resolve_rel_crc(crc); | |
| 1287 | + else | |
| 1288 | + crcval = *crc; | |
| 1289 | + if (versions[i].crc == crcval) | |
| 1290 | 1290 | return 1; |
| 1291 | − pr_debug("Found checksum %lX vs module %lX\n", | |
| 1292 | − maybe_relocated(*crc, crc_owner), versions[i].crc); | |
| 1291 | + pr_debug("Found checksum %X vs module %lX\n", | |
| 1292 | + crcval, versions[i].crc); | |
| 1293 | 1293 | goto bad_version; |
| 1294 | 1294 | } |
| 1295 | 1295 | |
| @@ -1307,7 +1307,7 @@ static inline int check_modstruct_version(Elf_Shdr *sechdrs, · 11 unmodified lines | ||
| 1307 | 1307 | unsigned int versindex, |
| 1308 | 1308 | struct module *mod) |
| 1309 | 1309 | { |
| 1310 | − const unsigned long *crc; | |
| 1310 | + const s32 *crc; | |
| 1311 | 1311 | |
| 1312 | 1312 | /* |
| 1313 | 1313 | * Since this should be found in kernel (which can't be removed), no |
| @@ -1321,8 +1321,7 @@ static inline int check_modstruct_version(Elf_Shdr *sechdrs, · 7 unmodified lines | ||
| 1321 | 1321 | } |
| 1322 | 1322 | preempt_enable(); |
| 1323 | 1323 | return check_version(sechdrs, versindex, |
| 1324 | − VMLINUX_SYMBOL_STR(module_layout), mod, crc, | |
| 1325 | − NULL); | |
| 1324 | + VMLINUX_SYMBOL_STR(module_layout), mod, crc); | |
| 1326 | 1325 | } |
| 1327 | 1326 | |
| 1328 | 1327 | /* First part is kernel version, which we ignore if module has crcs. */ |
| @@ -1340,8 +1339,7 @@ static inline int check_version(Elf_Shdr *sechdrs, · 11 unmodified lines | ||
| 1340 | 1339 | unsigned int versindex, |
| 1341 | 1340 | const char *symname, |
| 1342 | 1341 | struct module *mod, |
| 1343 | − const unsigned long *crc, | |
| 1344 | − const struct module *crc_owner) | |
| 1342 | + const s32 *crc) | |
| 1345 | 1343 | { |
| 1346 | 1344 | return 1; |
| 1347 | 1345 | } |
| @@ -1368,7 +1366,7 @@ static const struct kernel_symbol *resolve_symbol(struct module *mod, · 20 unmodified lines | ||
| 1368 | 1366 | { |
| 1369 | 1367 | struct module *owner; |
| 1370 | 1368 | const struct kernel_symbol *sym; |
| 1371 | − const unsigned long *crc; | |
| 1369 | + const s32 *crc; | |
| 1372 | 1370 | int err; |
| 1373 | 1371 | |
| 1374 | 1372 | /* |
| @@ -1383,8 +1381,7 @@ static const struct kernel_symbol *resolve_symbol(struct module *mod, · 8 unmodified lines | ||
| 1383 | 1381 | if (!sym) |
| 1384 | 1382 | goto unlock; |
| 1385 | 1383 | |
| 1386 | − if (!check_version(info->sechdrs, info->index.vers, name, mod, crc, | |
| 1387 | − owner)) { | |
| 1384 | + if (!check_version(info->sechdrs, info->index.vers, name, mod, crc)) { | |
| 1388 | 1385 | sym = ERR_PTR(-EINVAL); |
| 1389 | 1386 | goto getname; |
| 1390 | 1387 | } |
| @@ -266,7 +266,7 @@ out: · 265 unmodified lines | ||
| 266 | 266 | static struct cpumask save_cpumask; |
| 267 | 267 | static bool disable_migrate; |
| 268 | 268 | |
| 269 | −static void move_to_next_cpu(void) | |
| 269 | +static void move_to_next_cpu(bool initmask) | |
| 270 | 270 | { |
| 271 | 271 | static struct cpumask *current_mask; |
| 272 | 272 | int next_cpu; |
| @@ -275,7 +275,7 @@ static void move_to_next_cpu(void) · 2 unmodified lines | ||
| 275 | 275 | return; |
| 276 | 276 | |
| 277 | 277 | /* Just pick the first CPU on first iteration */ |
| 278 | − if (!current_mask) { | |
| 278 | + if (initmask) { | |
| 279 | 279 | current_mask = &save_cpumask; |
| 280 | 280 | get_online_cpus(); |
| 281 | 281 | cpumask_and(current_mask, cpu_online_mask, tracing_buffer_mask); |
| @@ -330,10 +330,12 @@ static void move_to_next_cpu(void) · 48 unmodified lines | ||
| 330 | 330 | static int kthread_fn(void *data) |
| 331 | 331 | { |
| 332 | 332 | u64 interval; |
| 333 | + bool initmask = true; | |
| 333 | 334 | |
| 334 | 335 | while (!kthread_should_stop()) { |
| 335 | 336 | |
| 336 | − move_to_next_cpu(); | |
| 337 | + move_to_next_cpu(initmask); | |
| 338 | + initmask = false; | |
| 337 | 339 | |
| 338 | 340 | local_irq_disable(); |
| 339 | 341 | get_sample(); |
| @@ -1372,7 +1372,7 @@ kprobe_trace_selftest_target(int a1, int a2, int a3, int a4, int a5, int a6) · 1371 unmodified lines | ||
| 1372 | 1372 | return a1 + a2 + a3 + a4 + a5 + a6; |
| 1373 | 1373 | } |
| 1374 | 1374 | |
| 1375 | −static struct __init trace_event_file * | |
| 1375 | +static __init struct trace_event_file * | |
| 1376 | 1376 | find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr) |
| 1377 | 1377 | { |
| 1378 | 1378 | struct trace_event_file *file; |
| @@ -1791,6 +1791,11 @@ static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos, · 1790 unmodified lines | ||
| 1791 | 1791 | |
| 1792 | 1792 | cond_resched(); |
| 1793 | 1793 | find_page: |
| 1794 | + if (fatal_signal_pending(current)) { | |
| 1795 | + error = -EINTR; | |
| 1796 | + goto out; | |
| 1797 | + } | |
| 1798 | + | |
| 1794 | 1799 | page = find_get_page(mapping, index); |
| 1795 | 1800 | if (!page) { |
| 1796 | 1801 | page_cache_sync_readahead(mapping, |
| @@ -13,6 +13,7 @@ · 12 unmodified lines | ||
| 13 | 13 | * |
| 14 | 14 | */ |
| 15 | 15 | |
| 16 | +#include <linux/ftrace.h> | |
| 16 | 17 | #include <linux/kernel.h> |
| 17 | 18 | #include <linux/mm.h> |
| 18 | 19 | #include <linux/printk.h> |
| @@ -300,6 +301,8 @@ void kasan_report(unsigned long addr, size_t size, · 281 unmodified lines | ||
| 300 | 301 | if (likely(!kasan_report_enabled())) |
| 301 | 302 | return; |
| 302 | 303 | |
| 304 | + disable_trace_on_warning(); | |
| 305 | + | |
| 303 | 306 | info.access_addr = (void *)addr; |
| 304 | 307 | info.access_size = size; |
| 305 | 308 | info.is_write = is_write; |
| @@ -1483,17 +1483,20 @@ bool is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages) · 1482 unmodified lines | ||
| 1483 | 1483 | } |
| 1484 | 1484 | |
| 1485 | 1485 | /* |
| 1486 | − * Confirm all pages in a range [start, end) is belongs to the same zone. | |
| 1486 | + * Confirm all pages in a range [start, end) belong to the same zone. | |
| 1487 | + * When true, return its valid [start, end). | |
| 1487 | 1488 | */ |
| 1488 | −int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn) | |
| 1489 | +int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, | |
| 1490 | + unsigned long *valid_start, unsigned long *valid_end) | |
| 1489 | 1491 | { |
| 1490 | 1492 | unsigned long pfn, sec_end_pfn; |
| 1493 | + unsigned long start, end; | |
| 1491 | 1494 | struct zone *zone = NULL; |
| 1492 | 1495 | struct page *page; |
| 1493 | 1496 | int i; |
| 1494 | − for (pfn = start_pfn, sec_end_pfn = SECTION_ALIGN_UP(start_pfn); | |
| 1497 | + for (pfn = start_pfn, sec_end_pfn = SECTION_ALIGN_UP(start_pfn + 1); | |
| 1495 | 1498 | pfn < end_pfn; |
| 1496 | − pfn = sec_end_pfn + 1, sec_end_pfn += PAGES_PER_SECTION) { | |
| 1499 | + pfn = sec_end_pfn, sec_end_pfn += PAGES_PER_SECTION) { | |
| 1497 | 1500 | /* Make sure the memory section is present first */ |
| 1498 | 1501 | if (!present_section_nr(pfn_to_section_nr(pfn))) |
| 1499 | 1502 | continue; |
| @@ -1509,10 +1512,20 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn) · 9 unmodified lines | ||
| 1509 | 1512 | page = pfn_to_page(pfn + i); |
| 1510 | 1513 | if (zone && page_zone(page) != zone) |
| 1511 | 1514 | return 0; |
| 1515 | + if (!zone) | |
| 1516 | + start = pfn + i; | |
| 1512 | 1517 | zone = page_zone(page); |
| 1518 | + end = pfn + MAX_ORDER_NR_PAGES; | |
| 1513 | 1519 | } |
| 1514 | 1520 | } |
| 1515 | − return 1; | |
| 1521 | + | |
| 1522 | + if (zone) { | |
| 1523 | + *valid_start = start; | |
| 1524 | + *valid_end = end; | |
| 1525 | + return 1; | |
| 1526 | + } else { | |
| 1527 | + return 0; | |
| 1528 | + } | |
| 1516 | 1529 | } |
| 1517 | 1530 | |
| 1518 | 1531 | /* |
| @@ -1839,6 +1852,7 @@ static int __ref __offline_pages(unsigned long start_pfn, · 320 unmodified lines | ||
| 1839 | 1852 | long offlined_pages; |
| 1840 | 1853 | int ret, drain, retry_max, node; |
| 1841 | 1854 | unsigned long flags; |
| 1855 | + unsigned long valid_start, valid_end; | |
| 1842 | 1856 | struct zone *zone; |
| 1843 | 1857 | struct memory_notify arg; |
| 1844 | 1858 | |
| @@ -1849,10 +1863,10 @@ static int __ref __offline_pages(unsigned long start_pfn, · 4 unmodified lines | ||
| 1849 | 1863 | return -EINVAL; |
| 1850 | 1864 | /* This makes hotplug much easier...and readable. |
| 1851 | 1865 | we assume this for now. .*/ |
| 1852 | − if (!test_pages_in_a_zone(start_pfn, end_pfn)) | |
| 1866 | + if (!test_pages_in_a_zone(start_pfn, end_pfn, &valid_start, &valid_end)) | |
| 1853 | 1867 | return -EINVAL; |
| 1854 | 1868 | |
| 1855 | − zone = page_zone(pfn_to_page(start_pfn)); | |
| 1869 | + zone = page_zone(pfn_to_page(valid_start)); | |
| 1856 | 1870 | node = zone_to_nid(zone); |
| 1857 | 1871 | nr_pages = end_pfn - start_pfn; |
| 1858 | 1872 | |
| @@ -415,6 +415,7 @@ static unsigned long shmem_unused_huge_shrink(struct shmem_sb_info *sbinfo, · 414 unmodified lines | ||
| 415 | 415 | struct shrink_control *sc, unsigned long nr_to_split) |
| 416 | 416 | { |
| 417 | 417 | LIST_HEAD(list), *pos, *next; |
| 418 | + LIST_HEAD(to_remove); | |
| 418 | 419 | struct inode *inode; |
| 419 | 420 | struct shmem_inode_info *info; |
| 420 | 421 | struct page *page; |
| @@ -441,9 +442,8 @@ static unsigned long shmem_unused_huge_shrink(struct shmem_sb_info *sbinfo, · 20 unmodified lines | ||
| 441 | 442 | /* Check if there's anything to gain */ |
| 442 | 443 | if (round_up(inode->i_size, PAGE_SIZE) == |
| 443 | 444 | round_up(inode->i_size, HPAGE_PMD_SIZE)) { |
| 444 | − list_del_init(&info->shrinklist); | |
| 445 | + list_move(&info->shrinklist, &to_remove); | |
| 445 | 446 | removed++; |
| 446 | − iput(inode); | |
| 447 | 447 | goto next; |
| 448 | 448 | } |
| 449 | 449 | |
| @@ -454,6 +454,13 @@ next: · 4 unmodified lines | ||
| 454 | 454 | } |
| 455 | 455 | spin_unlock(&sbinfo->shrinklist_lock); |
| 456 | 456 | |
| 457 | + list_for_each_safe(pos, next, &to_remove) { | |
| 458 | + info = list_entry(pos, struct shmem_inode_info, shrinklist); | |
| 459 | + inode = &info->vfs_inode; | |
| 460 | + list_del_init(&info->shrinklist); | |
| 461 | + iput(inode); | |
| 462 | + } | |
| 463 | + | |
| 457 | 464 | list_for_each_safe(pos, next, &list) { |
| 458 | 465 | int ret; |
| 459 | 466 | |
| @@ -78,7 +78,13 @@ static u64 zswap_duplicate_entry; · 77 unmodified lines | ||
| 78 | 78 | |
| 79 | 79 | /* Enable/disable zswap (disabled by default) */ |
| 80 | 80 | static bool zswap_enabled; |
| 81 | −module_param_named(enabled, zswap_enabled, bool, 0644); | |
| 81 | +static int zswap_enabled_param_set(const char *, | |
| 82 | + const struct kernel_param *); | |
| 83 | +static struct kernel_param_ops zswap_enabled_param_ops = { | |
| 84 | + .set = zswap_enabled_param_set, | |
| 85 | + .get = param_get_bool, | |
| 86 | +}; | |
| 87 | +module_param_cb(enabled, &zswap_enabled_param_ops, &zswap_enabled, 0644); | |
| 82 | 88 | |
| 83 | 89 | /* Crypto compressor to use */ |
| 84 | 90 | #define ZSWAP_COMPRESSOR_DEFAULT "lzo" |
| @@ -176,6 +182,9 @@ static atomic_t zswap_pools_count = ATOMIC_INIT(0); · 91 unmodified lines | ||
| 176 | 182 | /* used by param callback function */ |
| 177 | 183 | static bool zswap_init_started; |
| 178 | 184 | |
| 185 | +/* fatal error during init */ | |
| 186 | +static bool zswap_init_failed; | |
| 187 | + | |
| 179 | 188 | /********************************* |
| 180 | 189 | * helpers and fwd declarations |
| 181 | 190 | **********************************/ |
| @@ -624,6 +633,11 @@ static int __zswap_param_set(const char *val, const struct kernel_param *kp, · 442 unmodified lines | ||
| 624 | 633 | char *s = strstrip((char *)val); |
| 625 | 634 | int ret; |
| 626 | 635 | |
| 636 | + if (zswap_init_failed) { | |
| 637 | + pr_err("can't set param, initialization failed\n"); | |
| 638 | + return -ENODEV; | |
| 639 | + } | |
| 640 | + | |
| 627 | 641 | /* no change required */ |
| 628 | 642 | if (!strcmp(s, *(char **)kp->arg)) |
| 629 | 643 | return 0; |
| @@ -703,6 +717,17 @@ static int zswap_zpool_param_set(const char *val, · 73 unmodified lines | ||
| 703 | 717 | return __zswap_param_set(val, kp, NULL, zswap_compressor); |
| 704 | 718 | } |
| 705 | 719 | |
| 720 | +static int zswap_enabled_param_set(const char *val, | |
| 721 | + const struct kernel_param *kp) | |
| 722 | +{ | |
| 723 | + if (zswap_init_failed) { | |
| 724 | + pr_err("can't enable, initialization failed\n"); | |
| 725 | + return -ENODEV; | |
| 726 | + } | |
| 727 | + | |
| 728 | + return param_set_bool(val, kp); | |
| 729 | +} | |
| 730 | + | |
| 706 | 731 | /********************************* |
| 707 | 732 | * writeback code |
| 708 | 733 | **********************************/ |
| @@ -1201,6 +1226,9 @@ hp_fail: · 492 unmodified lines | ||
| 1201 | 1226 | dstmem_fail: |
| 1202 | 1227 | zswap_entry_cache_destroy(); |
| 1203 | 1228 | cache_fail: |
| 1229 | + /* if built-in, we aren't unloaded on failure; don't allow use */ | |
| 1230 | + zswap_init_failed = true; | |
| 1231 | + zswap_enabled = false; | |
| 1204 | 1232 | return -ENOMEM; |
| 1205 | 1233 | } |
| 1206 | 1234 | /* must be late so crypto has time to come up */ |
| @@ -445,6 +445,7 @@ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask, · 444 unmodified lines | ||
| 445 | 445 | * @func: callback function on filter match |
| 446 | 446 | * @data: returned parameter for callback function |
| 447 | 447 | * @ident: string for calling module identification |
| 448 | + * @sk: socket pointer (might be NULL) | |
| 448 | 449 | * |
| 449 | 450 | * Description: |
| 450 | 451 | * Invokes the callback function with the received sk_buff and the given |
| @@ -468,7 +469,7 @@ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask, · 17 unmodified lines | ||
| 468 | 469 | */ |
| 469 | 470 | int can_rx_register(struct net_device *dev, canid_t can_id, canid_t mask, |
| 470 | 471 | void (*func)(struct sk_buff *, void *), void *data, |
| 471 | − char *ident) | |
| 472 | + char *ident, struct sock *sk) | |
| 472 | 473 | { |
| 473 | 474 | struct receiver *r; |
| 474 | 475 | struct hlist_head *rl; |
| @@ -496,6 +497,7 @@ int can_rx_register(struct net_device *dev, canid_t can_id, canid_t mask, · 21 unmodified lines | ||
| 496 | 497 | r->func = func; |
| 497 | 498 | r->data = data; |
| 498 | 499 | r->ident = ident; |
| 500 | + r->sk = sk; | |
| 499 | 501 | |
| 500 | 502 | hlist_add_head_rcu(&r->list, rl); |
| 501 | 503 | d->entries++; |
| @@ -520,8 +522,11 @@ EXPORT_SYMBOL(can_rx_register); · 18 unmodified lines | ||
| 520 | 522 | static void can_rx_delete_receiver(struct rcu_head *rp) |
| 521 | 523 | { |
| 522 | 524 | struct receiver *r = container_of(rp, struct receiver, rcu); |
| 525 | + struct sock *sk = r->sk; | |
| 523 | 526 | |
| 524 | 527 | kmem_cache_free(rcv_cache, r); |
| 528 | + if (sk) | |
| 529 | + sock_put(sk); | |
| 525 | 530 | } |
| 526 | 531 | |
| 527 | 532 | /** |
| @@ -596,8 +601,11 @@ void can_rx_unregister(struct net_device *dev, canid_t can_id, canid_t mask, · 68 unmodified lines | ||
| 596 | 601 | spin_unlock(&can_rcvlists_lock); |
| 597 | 602 | |
| 598 | 603 | /* schedule the receiver item for deletion */ |
| 599 | − if (r) | |
| 604 | + if (r) { | |
| 605 | + if (r->sk) | |
| 606 | + sock_hold(r->sk); | |
| 600 | 607 | call_rcu(&r->rcu, can_rx_delete_receiver); |
| 608 | + } | |
| 601 | 609 | } |
| 602 | 610 | EXPORT_SYMBOL(can_rx_unregister); |
| 603 | 611 | |
| @@ -50,13 +50,14 @@ · 49 unmodified lines | ||
| 50 | 50 | |
| 51 | 51 | struct receiver { |
| 52 | 52 | struct hlist_node list; |
| 53 | − struct rcu_head rcu; | |
| 54 | 53 | canid_t can_id; |
| 55 | 54 | canid_t mask; |
| 56 | 55 | unsigned long matches; |
| 57 | 56 | void (*func)(struct sk_buff *, void *); |
| 58 | 57 | void *data; |
| 59 | 58 | char *ident; |
| 59 | + struct sock *sk; | |
| 60 | + struct rcu_head rcu; | |
| 60 | 61 | }; |
| 61 | 62 | |
| 62 | 63 | #define CAN_SFF_RCV_ARRAY_SZ (1 << CAN_SFF_ID_BITS) |
| @@ -734,14 +734,23 @@ static struct bcm_op *bcm_find_op(struct list_head *ops, · 733 unmodified lines | ||
| 734 | 734 | |
| 735 | 735 | static void bcm_remove_op(struct bcm_op *op) |
| 736 | 736 | { |
| 737 | − hrtimer_cancel(&op->timer); | |
| 738 | − hrtimer_cancel(&op->thrtimer); | |
| 739 | − | |
| 740 | − if (op->tsklet.func) | |
| 741 | − tasklet_kill(&op->tsklet); | |
| 737 | + if (op->tsklet.func) { | |
| 738 | + while (test_bit(TASKLET_STATE_SCHED, &op->tsklet.state) || | |
| 739 | + test_bit(TASKLET_STATE_RUN, &op->tsklet.state) || | |
| 740 | + hrtimer_active(&op->timer)) { | |
| 741 | + hrtimer_cancel(&op->timer); | |
| 742 | + tasklet_kill(&op->tsklet); | |
| 743 | + } | |
| 744 | + } | |
| 742 | 745 | |
| 743 | − if (op->thrtsklet.func) | |
| 744 | − tasklet_kill(&op->thrtsklet); | |
| 746 | + if (op->thrtsklet.func) { | |
| 747 | + while (test_bit(TASKLET_STATE_SCHED, &op->thrtsklet.state) || | |
| 748 | + test_bit(TASKLET_STATE_RUN, &op->thrtsklet.state) || | |
| 749 | + hrtimer_active(&op->thrtimer)) { | |
| 750 | + hrtimer_cancel(&op->thrtimer); | |
| 751 | + tasklet_kill(&op->thrtsklet); | |
| 752 | + } | |
| 753 | + } | |
| 745 | 754 | |
| 746 | 755 | if ((op->frames) && (op->frames != &op->sframe)) |
| 747 | 756 | kfree(op->frames); |
| @@ -1216,7 +1225,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, · 468 unmodified lines | ||
| 1216 | 1225 | err = can_rx_register(dev, op->can_id, |
| 1217 | 1226 | REGMASK(op->can_id), |
| 1218 | 1227 | bcm_rx_handler, op, |
| 1219 | − "bcm"); | |
| 1228 | + "bcm", sk); | |
| 1220 | 1229 | |
| 1221 | 1230 | op->rx_reg_dev = dev; |
| 1222 | 1231 | dev_put(dev); |
| @@ -1225,7 +1234,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, · 2 unmodified lines | ||
| 1225 | 1234 | } else |
| 1226 | 1235 | err = can_rx_register(NULL, op->can_id, |
| 1227 | 1236 | REGMASK(op->can_id), |
| 1228 | − bcm_rx_handler, op, "bcm"); | |
| 1237 | + bcm_rx_handler, op, "bcm", sk); | |
| 1229 | 1238 | if (err) { |
| 1230 | 1239 | /* this bcm rx op is broken -> remove it */ |
| 1231 | 1240 | list_del(&op->list); |
| @@ -442,7 +442,7 @@ static inline int cgw_register_filter(struct cgw_job *gwj) · 441 unmodified lines | ||
| 442 | 442 | { |
| 443 | 443 | return can_rx_register(gwj->src.dev, gwj->ccgw.filter.can_id, |
| 444 | 444 | gwj->ccgw.filter.can_mask, can_can_gw_rcv, |
| 445 | − gwj, "gw"); | |
| 445 | + gwj, "gw", NULL); | |
| 446 | 446 | } |
| 447 | 447 | |
| 448 | 448 | static inline void cgw_unregister_filter(struct cgw_job *gwj) |
| @@ -190,7 +190,7 @@ static int raw_enable_filters(struct net_device *dev, struct sock *sk, · 189 unmodified lines | ||
| 190 | 190 | for (i = 0; i < count; i++) { |
| 191 | 191 | err = can_rx_register(dev, filter[i].can_id, |
| 192 | 192 | filter[i].can_mask, |
| 193 | − raw_rcv, sk, "raw"); | |
| 193 | + raw_rcv, sk, "raw", sk); | |
| 194 | 194 | if (err) { |
| 195 | 195 | /* clean up successfully registered filters */ |
| 196 | 196 | while (--i >= 0) |
| @@ -211,7 +211,7 @@ static int raw_enable_errfilter(struct net_device *dev, struct sock *sk, · 14 unmodified lines | ||
| 211 | 211 | |
| 212 | 212 | if (err_mask) |
| 213 | 213 | err = can_rx_register(dev, 0, err_mask | CAN_ERR_FLAG, |
| 214 | − raw_rcv, sk, "raw"); | |
| 214 | + raw_rcv, sk, "raw", sk); | |
| 215 | 215 | |
| 216 | 216 | return err; |
| 217 | 217 | } |
| @@ -2518,9 +2518,11 @@ u32 __tcp_select_window(struct sock *sk) · 2517 unmodified lines | ||
| 2518 | 2518 | int full_space = min_t(int, tp->window_clamp, allowed_space); |
| 2519 | 2519 | int window; |
| 2520 | 2520 | |
| 2521 | − if (mss > full_space) | |
| 2521 | + if (unlikely(mss > full_space)) { | |
| 2522 | 2522 | mss = full_space; |
| 2523 | − | |
| 2523 | + if (mss <= 0) | |
| 2524 | + return 0; | |
| 2525 | + } | |
| 2524 | 2526 | if (free_space < (full_space >> 1)) { |
| 2525 | 2527 | icsk->icsk_ack.quick = 0; |
| 2526 | 2528 | |
| @@ -1344,7 +1344,7 @@ emsgsize: · 1343 unmodified lines | ||
| 1344 | 1344 | */ |
| 1345 | 1345 | if (transhdrlen && sk->sk_protocol == IPPROTO_UDP && |
| 1346 | 1346 | headersize == sizeof(struct ipv6hdr) && |
| 1347 | − length < mtu - headersize && | |
| 1347 | + length <= mtu - headersize && | |
| 1348 | 1348 | !(flags & MSG_MORE) && |
| 1349 | 1349 | rt->dst.dev->features & (NETIF_F_IPV6_CSUM | NETIF_F_HW_CSUM)) |
| 1350 | 1350 | csummode = CHECKSUM_PARTIAL; |
| @@ -441,7 +441,7 @@ __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw) · 440 unmodified lines | ||
| 441 | 441 | if (i + sizeof(*tel) > optlen) |
| 442 | 442 | break; |
| 443 | 443 | |
| 444 | − tel = (struct ipv6_tlv_tnl_enc_lim *) skb->data + off + i; | |
| 444 | + tel = (struct ipv6_tlv_tnl_enc_lim *)(skb->data + off + i); | |
| 445 | 445 | /* return index of option if found and valid */ |
| 446 | 446 | if (tel->type == IPV6_TLV_TNL_ENCAP_LIMIT && |
| 447 | 447 | tel->length == 1) |
| @@ -568,9 +568,9 @@ static int fl_set_key(struct net *net, struct nlattr **tb, · 567 unmodified lines | ||
| 568 | 568 | &mask->icmp.type, |
| 569 | 569 | TCA_FLOWER_KEY_ICMPV6_TYPE_MASK, |
| 570 | 570 | sizeof(key->icmp.type)); |
| 571 | − fl_set_key_val(tb, &key->icmp.code, TCA_FLOWER_KEY_ICMPV4_CODE, | |
| 571 | + fl_set_key_val(tb, &key->icmp.code, TCA_FLOWER_KEY_ICMPV6_CODE, | |
| 572 | 572 | &mask->icmp.code, |
| 573 | − TCA_FLOWER_KEY_ICMPV4_CODE_MASK, | |
| 573 | + TCA_FLOWER_KEY_ICMPV6_CODE_MASK, | |
| 574 | 574 | sizeof(key->icmp.code)); |
| 575 | 575 | } |
| 576 | 576 | |
| @@ -16,16 +16,11 @@ · 15 unmodified lines | ||
| 16 | 16 | #include <net/sch_generic.h> |
| 17 | 17 | #include <net/pkt_cls.h> |
| 18 | 18 | |
| 19 | −struct cls_mall_filter { | |
| 19 | +struct cls_mall_head { | |
| 20 | 20 | struct tcf_exts exts; |
| 21 | 21 | struct tcf_result res; |
| 22 | 22 | u32 handle; |
| 23 | − struct rcu_head rcu; | |
| 24 | 23 | u32 flags; |
| 25 | −}; | |
| 26 | − | |
| 27 | −struct cls_mall_head { | |
| 28 | − struct cls_mall_filter *filter; | |
| 29 | 24 | struct rcu_head rcu; |
| 30 | 25 | }; |
| 31 | 26 | |
| @@ -33,38 +28,29 @@ static int mall_classify(struct sk_buff *skb, const struct tcf_proto *tp, · 1 unmodified line | ||
| 33 | 28 | struct tcf_result *res) |
| 34 | 29 | { |
| 35 | 30 | struct cls_mall_head *head = rcu_dereference_bh(tp->root); |
| 36 | − struct cls_mall_filter *f = head->filter; | |
| 37 | 31 | |
| 38 | − if (tc_skip_sw(f->flags)) | |
| 32 | + if (tc_skip_sw(head->flags)) | |
| 39 | 33 | return -1; |
| 40 | 34 | |
| 41 | − return tcf_exts_exec(skb, &f->exts, res); | |
| 35 | + return tcf_exts_exec(skb, &head->exts, res); | |
| 42 | 36 | } |
| 43 | 37 | |
| 44 | 38 | static int mall_init(struct tcf_proto *tp) |
| 45 | 39 | { |
| 46 | − struct cls_mall_head *head; | |
| 47 | − | |
| 48 | − head = kzalloc(sizeof(*head), GFP_KERNEL); | |
| 49 | − if (!head) | |
| 50 | − return -ENOBUFS; | |
| 51 | − | |
| 52 | − rcu_assign_pointer(tp->root, head); | |
| 53 | − | |
| 54 | 40 | return 0; |
| 55 | 41 | } |
| 56 | 42 | |
| 57 | −static void mall_destroy_filter(struct rcu_head *head) | |
| 43 | +static void mall_destroy_rcu(struct rcu_head *rcu) | |
| 58 | 44 | { |
| 59 | − struct cls_mall_filter *f = container_of(head, struct cls_mall_filter, rcu); | |
| 45 | + struct cls_mall_head *head = container_of(rcu, struct cls_mall_head, | |
| 46 | + rcu); | |
| 60 | 47 | |
| 61 | − tcf_exts_destroy(&f->exts); | |
| 62 | − | |
| 63 | − kfree(f); | |
| 48 | + tcf_exts_destroy(&head->exts); | |
| 49 | + kfree(head); | |
| 64 | 50 | } |
| 65 | 51 | |
| 66 | 52 | static int mall_replace_hw_filter(struct tcf_proto *tp, |
| 67 | − struct cls_mall_filter *f, | |
| 53 | + struct cls_mall_head *head, | |
| 68 | 54 | unsigned long cookie) |
| 69 | 55 | { |
| 70 | 56 | struct net_device *dev = tp->q->dev_queue->dev; |
| @@ -74,7 +60,7 @@ static int mall_replace_hw_filter(struct tcf_proto *tp, · 3 unmodified lines | ||
| 74 | 60 | offload.type = TC_SETUP_MATCHALL; |
| 75 | 61 | offload.cls_mall = &mall_offload; |
| 76 | 62 | offload.cls_mall->command = TC_CLSMATCHALL_REPLACE; |
| 77 | − offload.cls_mall->exts = &f->exts; | |
| 63 | + offload.cls_mall->exts = &head->exts; | |
| 78 | 64 | offload.cls_mall->cookie = cookie; |
| 79 | 65 | |
| 80 | 66 | return dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol, |
| @@ -82,7 +68,7 @@ static int mall_replace_hw_filter(struct tcf_proto *tp, · 1 unmodified line | ||
| 82 | 68 | } |
| 83 | 69 | |
| 84 | 70 | static void mall_destroy_hw_filter(struct tcf_proto *tp, |
| 85 | − struct cls_mall_filter *f, | |
| 71 | + struct cls_mall_head *head, | |
| 86 | 72 | unsigned long cookie) |
| 87 | 73 | { |
| 88 | 74 | struct net_device *dev = tp->q->dev_queue->dev; |
| @@ -103,29 +89,20 @@ static bool mall_destroy(struct tcf_proto *tp, bool force) · 14 unmodified lines | ||
| 103 | 89 | { |
| 104 | 90 | struct cls_mall_head *head = rtnl_dereference(tp->root); |
| 105 | 91 | struct net_device *dev = tp->q->dev_queue->dev; |
| 106 | − struct cls_mall_filter *f = head->filter; | |
| 107 | 92 | |
| 108 | − if (!force && f) | |
| 109 | − return false; | |
| 93 | + if (!head) | |
| 94 | + return true; | |
| 110 | 95 | |
| 111 | − if (f) { | |
| 112 | − if (tc_should_offload(dev, tp, f->flags)) | |
| 113 | − mall_destroy_hw_filter(tp, f, (unsigned long) f); | |
| 96 | + if (tc_should_offload(dev, tp, head->flags)) | |
| 97 | + mall_destroy_hw_filter(tp, head, (unsigned long) head); | |
| 114 | 98 | |
| 115 | − call_rcu(&f->rcu, mall_destroy_filter); | |
| 116 | − } | |
| 117 | − kfree_rcu(head, rcu); | |
| 99 | + call_rcu(&head->rcu, mall_destroy_rcu); | |
| 118 | 100 | return true; |
| 119 | 101 | } |
| 120 | 102 | |
| 121 | 103 | static unsigned long mall_get(struct tcf_proto *tp, u32 handle) |
| 122 | 104 | { |
| 123 | − struct cls_mall_head *head = rtnl_dereference(tp->root); | |
| 124 | − struct cls_mall_filter *f = head->filter; | |
| 125 | − | |
| 126 | − if (f && f->handle == handle) | |
| 127 | − return (unsigned long) f; | |
| 128 | − return 0; | |
| 105 | + return 0UL; | |
| 129 | 106 | } |
| 130 | 107 | |
| 131 | 108 | static const struct nla_policy mall_policy[TCA_MATCHALL_MAX + 1] = { |
| @@ -134,7 +111,7 @@ static const struct nla_policy mall_policy[TCA_MATCHALL_MAX + 1] = { · 2 unmodified lines | ||
| 134 | 111 | }; |
| 135 | 112 | |
| 136 | 113 | static int mall_set_parms(struct net *net, struct tcf_proto *tp, |
| 137 | − struct cls_mall_filter *f, | |
| 114 | + struct cls_mall_head *head, | |
| 138 | 115 | unsigned long base, struct nlattr **tb, |
| 139 | 116 | struct nlattr *est, bool ovr) |
| 140 | 117 | { |
| @@ -147,11 +124,11 @@ static int mall_set_parms(struct net *net, struct tcf_proto *tp, · 6 unmodified lines | ||
| 147 | 124 | return err; |
| 148 | 125 | |
| 149 | 126 | if (tb[TCA_MATCHALL_CLASSID]) { |
| 150 | − f->res.classid = nla_get_u32(tb[TCA_MATCHALL_CLASSID]); | |
| 151 | − tcf_bind_filter(tp, &f->res, base); | |
| 127 | + head->res.classid = nla_get_u32(tb[TCA_MATCHALL_CLASSID]); | |
| 128 | + tcf_bind_filter(tp, &head->res, base); | |
| 152 | 129 | } |
| 153 | 130 | |
| 154 | − tcf_exts_change(tp, &f->exts, &e); | |
| 131 | + tcf_exts_change(tp, &head->exts, &e); | |
| 155 | 132 | |
| 156 | 133 | return 0; |
| 157 | 134 | } |
| @@ -162,21 +139,17 @@ static int mall_change(struct net *net, struct sk_buff *in_skb, · 4 unmodified lines | ||
| 162 | 139 | unsigned long *arg, bool ovr) |
| 163 | 140 | { |
| 164 | 141 | struct cls_mall_head *head = rtnl_dereference(tp->root); |
| 165 | − struct cls_mall_filter *fold = (struct cls_mall_filter *) *arg; | |
| 166 | 142 | struct net_device *dev = tp->q->dev_queue->dev; |
| 167 | − struct cls_mall_filter *f; | |
| 168 | 143 | struct nlattr *tb[TCA_MATCHALL_MAX + 1]; |
| 144 | + struct cls_mall_head *new; | |
| 169 | 145 | u32 flags = 0; |
| 170 | 146 | int err; |
| 171 | 147 | |
| 172 | 148 | if (!tca[TCA_OPTIONS]) |
| 173 | 149 | return -EINVAL; |
| 174 | 150 | |
| 175 | − if (head->filter) | |
| 176 | − return -EBUSY; | |
| 177 | − | |
| 178 | − if (fold) | |
| 179 | − return -EINVAL; | |
| 151 | + if (head) | |
| 152 | + return -EEXIST; | |
| 180 | 153 | |
| 181 | 154 | err = nla_parse_nested(tb, TCA_MATCHALL_MAX, |
| 182 | 155 | tca[TCA_OPTIONS], mall_policy); |
| @@ -189,23 +162,23 @@ static int mall_change(struct net *net, struct sk_buff *in_skb, · 6 unmodified lines | ||
| 189 | 162 | return -EINVAL; |
| 190 | 163 | } |
| 191 | 164 | |
| 192 | − f = kzalloc(sizeof(*f), GFP_KERNEL); | |
| 193 | − if (!f) | |
| 165 | + new = kzalloc(sizeof(*new), GFP_KERNEL); | |
| 166 | + if (!new) | |
| 194 | 167 | return -ENOBUFS; |
| 195 | 168 | |
| 196 | − tcf_exts_init(&f->exts, TCA_MATCHALL_ACT, 0); | |
| 169 | + tcf_exts_init(&new->exts, TCA_MATCHALL_ACT, 0); | |
| 197 | 170 | |
| 198 | 171 | if (!handle) |
| 199 | 172 | handle = 1; |
| 200 | − f->handle = handle; | |
| 201 | − f->flags = flags; | |
| 173 | + new->handle = handle; | |
| 174 | + new->flags = flags; | |
| 202 | 175 | |
| 203 | − err = mall_set_parms(net, tp, f, base, tb, tca[TCA_RATE], ovr); | |
| 176 | + err = mall_set_parms(net, tp, new, base, tb, tca[TCA_RATE], ovr); | |
| 204 | 177 | if (err) |
| 205 | 178 | goto errout; |
| 206 | 179 | |
| 207 | 180 | if (tc_should_offload(dev, tp, flags)) { |
| 208 | − err = mall_replace_hw_filter(tp, f, (unsigned long) f); | |
| 181 | + err = mall_replace_hw_filter(tp, new, (unsigned long) new); | |
| 209 | 182 | if (err) { |
| 210 | 183 | if (tc_skip_sw(flags)) |
| 211 | 184 | goto errout; |
| @@ -214,39 +187,29 @@ static int mall_change(struct net *net, struct sk_buff *in_skb, · 2 unmodified lines | ||
| 214 | 187 | } |
| 215 | 188 | } |
| 216 | 189 | |
| 217 | − *arg = (unsigned long) f; | |
| 218 | − rcu_assign_pointer(head->filter, f); | |
| 219 | − | |
| 190 | + *arg = (unsigned long) head; | |
| 191 | + rcu_assign_pointer(tp->root, new); | |
| 192 | + if (head) | |
| 193 | + call_rcu(&head->rcu, mall_destroy_rcu); | |
| 220 | 194 | return 0; |
| 221 | 195 | |
| 222 | 196 | errout: |
| 223 | − kfree(f); | |
| 197 | + kfree(new); | |
| 224 | 198 | return err; |
| 225 | 199 | } |
| 226 | 200 | |
| 227 | 201 | static int mall_delete(struct tcf_proto *tp, unsigned long arg) |
| 228 | 202 | { |
| 229 | − struct cls_mall_head *head = rtnl_dereference(tp->root); | |
| 230 | − struct cls_mall_filter *f = (struct cls_mall_filter *) arg; | |
| 231 | − struct net_device *dev = tp->q->dev_queue->dev; | |
| 232 | − | |
| 233 | − if (tc_should_offload(dev, tp, f->flags)) | |
| 234 | − mall_destroy_hw_filter(tp, f, (unsigned long) f); | |
| 235 | − | |
| 236 | − RCU_INIT_POINTER(head->filter, NULL); | |
| 237 | − tcf_unbind_filter(tp, &f->res); | |
| 238 | − call_rcu(&f->rcu, mall_destroy_filter); | |
| 239 | − return 0; | |
| 203 | + return -EOPNOTSUPP; | |
| 240 | 204 | } |
| 241 | 205 | |
| 242 | 206 | static void mall_walk(struct tcf_proto *tp, struct tcf_walker *arg) |
| 243 | 207 | { |
| 244 | 208 | struct cls_mall_head *head = rtnl_dereference(tp->root); |
| 245 | − struct cls_mall_filter *f = head->filter; | |
| 246 | 209 | |
| 247 | 210 | if (arg->count < arg->skip) |
| 248 | 211 | goto skip; |
| 249 | − if (arg->fn(tp, (unsigned long) f, arg) < 0) | |
| 212 | + if (arg->fn(tp, (unsigned long) head, arg) < 0) | |
| 250 | 213 | arg->stop = 1; |
| 251 | 214 | skip: |
| 252 | 215 | arg->count++; |
| @@ -255,28 +218,28 @@ skip: · 2 unmodified lines | ||
| 255 | 218 | static int mall_dump(struct net *net, struct tcf_proto *tp, unsigned long fh, |
| 256 | 219 | struct sk_buff *skb, struct tcmsg *t) |
| 257 | 220 | { |
| 258 | − struct cls_mall_filter *f = (struct cls_mall_filter *) fh; | |
| 221 | + struct cls_mall_head *head = (struct cls_mall_head *) fh; | |
| 259 | 222 | struct nlattr *nest; |
| 260 | 223 | |
| 261 | − if (!f) | |
| 224 | + if (!head) | |
| 262 | 225 | return skb->len; |
| 263 | 226 | |
| 264 | − t->tcm_handle = f->handle; | |
| 227 | + t->tcm_handle = head->handle; | |
| 265 | 228 | |
| 266 | 229 | nest = nla_nest_start(skb, TCA_OPTIONS); |
| 267 | 230 | if (!nest) |
| 268 | 231 | goto nla_put_failure; |
| 269 | 232 | |
| 270 | − if (f->res.classid && | |
| 271 | − nla_put_u32(skb, TCA_MATCHALL_CLASSID, f->res.classid)) | |
| 233 | + if (head->res.classid && | |
| 234 | + nla_put_u32(skb, TCA_MATCHALL_CLASSID, head->res.classid)) | |
| 272 | 235 | goto nla_put_failure; |
| 273 | 236 | |
| 274 | − if (tcf_exts_dump(skb, &f->exts)) | |
| 237 | + if (tcf_exts_dump(skb, &head->exts)) | |
| 275 | 238 | goto nla_put_failure; |
| 276 | 239 | |
| 277 | 240 | nla_nest_end(skb, nest); |
| 278 | 241 | |
| 279 | − if (tcf_exts_dump_stats(skb, &f->exts) < 0) | |
| 242 | + if (tcf_exts_dump_stats(skb, &head->exts) < 0) | |
| 280 | 243 | goto nla_put_failure; |
| 281 | 244 | |
| 282 | 245 | return skb->len; |
| @@ -164,6 +164,7 @@ cmd_gensymtypes_c = \ · 163 unmodified lines | ||
| 164 | 164 | $(CPP) -D__GENKSYMS__ $(c_flags) $< | \ |
| 165 | 165 | $(GENKSYMS) $(if $(1), -T $(2)) \ |
| 166 | 166 | $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \ |
| 167 | + $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \ | |
| 167 | 168 | $(if $(KBUILD_PRESERVE),-p) \ |
| 168 | 169 | -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) |
| 169 | 170 | |
| @@ -337,6 +338,7 @@ cmd_gensymtypes_S = \ · 167 unmodified lines | ||
| 337 | 338 | $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \ |
| 338 | 339 | $(GENKSYMS) $(if $(1), -T $(2)) \ |
| 339 | 340 | $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \ |
| 341 | + $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \ | |
| 340 | 342 | $(if $(KBUILD_PRESERVE),-p) \ |
| 341 | 343 | -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) |
| 342 | 344 | |
| @@ -44,7 +44,7 @@ char *cur_filename, *source_file; · 43 unmodified lines | ||
| 44 | 44 | int in_source_file; |
| 45 | 45 | |
| 46 | 46 | static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types, |
| 47 | − flag_preserve, flag_warnings; | |
| 47 | + flag_preserve, flag_warnings, flag_rel_crcs; | |
| 48 | 48 | static const char *mod_prefix = ""; |
| 49 | 49 | |
| 50 | 50 | static int errors; |
| @@ -693,7 +693,10 @@ void export_symbol(const char *name) · 642 unmodified lines | ||
| 693 | 693 | fputs(">\n", debugfile); |
| 694 | 694 | |
| 695 | 695 | /* Used as a linker script. */ |
| 696 | − printf("%s__crc_%s = 0x%08lx ;\n", mod_prefix, name, crc); | |
| 696 | + printf(!flag_rel_crcs ? "%s__crc_%s = 0x%08lx;\n" : | |
| 697 | + "SECTIONS { .rodata : ALIGN(4) { " | |
| 698 | + "%s__crc_%s = .; LONG(0x%08lx); } }\n", | |
| 699 | + mod_prefix, name, crc); | |
| 697 | 700 | } |
| 698 | 701 | } |
| 699 | 702 | |
| @@ -730,7 +733,7 @@ void error_with_pos(const char *fmt, ...) · 30 unmodified lines | ||
| 730 | 733 | |
| 731 | 734 | static void genksyms_usage(void) |
| 732 | 735 | { |
| 733 | − fputs("Usage:\n" "genksyms [-adDTwqhV] > /path/to/.tmp_obj.ver\n" "\n" | |
| 736 | + fputs("Usage:\n" "genksyms [-adDTwqhVR] > /path/to/.tmp_obj.ver\n" "\n" | |
| 734 | 737 | #ifdef __GNU_LIBRARY__ |
| 735 | 738 | " -s, --symbol-prefix Select symbol prefix\n" |
| 736 | 739 | " -d, --debug Increment the debug level (repeatable)\n" |
| @@ -742,6 +745,7 @@ static void genksyms_usage(void) · 5 unmodified lines | ||
| 742 | 745 | " -q, --quiet Disable warnings (default)\n" |
| 743 | 746 | " -h, --help Print this message\n" |
| 744 | 747 | " -V, --version Print the release version\n" |
| 748 | + " -R, --relative-crc Emit section relative symbol CRCs\n" | |
| 745 | 749 | #else /* __GNU_LIBRARY__ */ |
| 746 | 750 | " -s Select symbol prefix\n" |
| 747 | 751 | " -d Increment the debug level (repeatable)\n" |
| @@ -753,6 +757,7 @@ static void genksyms_usage(void) · 5 unmodified lines | ||
| 753 | 757 | " -q Disable warnings (default)\n" |
| 754 | 758 | " -h Print this message\n" |
| 755 | 759 | " -V Print the release version\n" |
| 760 | + " -R Emit section relative symbol CRCs\n" | |
| 756 | 761 | #endif /* __GNU_LIBRARY__ */ |
| 757 | 762 | , stderr); |
| 758 | 763 | } |
| @@ -774,13 +779,14 @@ int main(int argc, char **argv) · 15 unmodified lines | ||
| 774 | 779 | {"preserve", 0, 0, 'p'}, |
| 775 | 780 | {"version", 0, 0, 'V'}, |
| 776 | 781 | {"help", 0, 0, 'h'}, |
| 782 | + {"relative-crc", 0, 0, 'R'}, | |
| 777 | 783 | {0, 0, 0, 0} |
| 778 | 784 | }; |
| 779 | 785 | |
| 780 | − while ((o = getopt_long(argc, argv, "s:dwqVDr:T:ph", | |
| 786 | + while ((o = getopt_long(argc, argv, "s:dwqVDr:T:phR", | |
| 781 | 787 | &long_opts[0], NULL)) != EOF) |
| 782 | 788 | #else /* __GNU_LIBRARY__ */ |
| 783 | − while ((o = getopt(argc, argv, "s:dwqVDr:T:ph")) != EOF) | |
| 789 | + while ((o = getopt(argc, argv, "s:dwqVDr:T:phR")) != EOF) | |
| 784 | 790 | #endif /* __GNU_LIBRARY__ */ |
| 785 | 791 | switch (o) { |
| 786 | 792 | case 's': |
| @@ -823,6 +829,9 @@ int main(int argc, char **argv) · 36 unmodified lines | ||
| 823 | 829 | case 'h': |
| 824 | 830 | genksyms_usage(); |
| 825 | 831 | return 0; |
| 832 | + case 'R': | |
| 833 | + flag_rel_crcs = 1; | |
| 834 | + break; | |
| 826 | 835 | default: |
| 827 | 836 | genksyms_usage(); |
| 828 | 837 | return 1; |
| @@ -219,6 +219,10 @@ static int symbol_valid(struct sym_entry *s) · 218 unmodified lines | ||
| 219 | 219 | "_SDA2_BASE_", /* ppc */ |
| 220 | 220 | NULL }; |
| 221 | 221 | |
| 222 | + static char *special_prefixes[] = { | |
| 223 | + "__crc_", /* modversions */ | |
| 224 | + NULL }; | |
| 225 | + | |
| 222 | 226 | static char *special_suffixes[] = { |
| 223 | 227 | "_veneer", /* arm */ |
| 224 | 228 | "_from_arm", /* arm */ |
| @@ -259,6 +263,14 @@ static int symbol_valid(struct sym_entry *s) · 34 unmodified lines | ||
| 259 | 263 | if (strcmp(sym_name, special_symbols[i]) == 0) |
| 260 | 264 | return 0; |
| 261 | 265 | |
| 266 | + for (i = 0; special_prefixes[i]; i++) { | |
| 267 | + int l = strlen(special_prefixes[i]); | |
| 268 | + | |
| 269 | + if (l <= strlen(sym_name) && | |
| 270 | + strncmp(sym_name, special_prefixes[i], l) == 0) | |
| 271 | + return 0; | |
| 272 | + } | |
| 273 | + | |
| 262 | 274 | for (i = 0; special_suffixes[i]; i++) { |
| 263 | 275 | int l = strlen(sym_name) - strlen(special_suffixes[i]); |
| 264 | 276 | |
| @@ -621,6 +621,16 @@ static void handle_modversions(struct module *mod, struct elf_info *info, · 620 unmodified lines | ||
| 621 | 621 | if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) { |
| 622 | 622 | is_crc = true; |
| 623 | 623 | crc = (unsigned int) sym->st_value; |
| 624 | + if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS) { | |
| 625 | + unsigned int *crcp; | |
| 626 | + | |
| 627 | + /* symbol points to the CRC in the ELF object */ | |
| 628 | + crcp = (void *)info->hdr + sym->st_value + | |
| 629 | + info->sechdrs[sym->st_shndx].sh_offset - | |
| 630 | + (info->hdr->e_type != ET_REL ? | |
| 631 | + info->sechdrs[sym->st_shndx].sh_addr : 0); | |
| 632 | + crc = *crcp; | |
| 633 | + } | |
| 624 | 634 | sym_update_crc(symname + strlen(CRC_PFX), mod, crc, |
| 625 | 635 | export); |
| 626 | 636 | } |
| @@ -150,9 +150,9 @@ int arch_decode_instruction(struct elf *elf, struct section *sec, · 149 unmodified lines | ||
| 150 | 150 | *type = INSN_RETURN; |
| 151 | 151 | break; |
| 152 | 152 | |
| 153 | − case 0xc5: /* iret */ | |
| 154 | 153 | case 0xca: /* retf */ |
| 155 | 154 | case 0xcb: /* retf */ |
| 155 | + case 0xcf: /* iret */ | |
| 156 | 156 | *type = INSN_CONTEXT_SWITCH; |
| 157 | 157 | break; |
| 158 | 158 | |