Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net

No conflicts.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+4082 -1730
+2
Documentation/arm64/silicon-errata.rst
··· 100 100 +----------------+-----------------+-----------------+-----------------------------+ 101 101 | ARM | Cortex-A510 | #2051678 | ARM64_ERRATUM_2051678 | 102 102 +----------------+-----------------+-----------------+-----------------------------+ 103 + | ARM | Cortex-A510 | #2077057 | ARM64_ERRATUM_2077057 | 104 + +----------------+-----------------+-----------------+-----------------------------+ 103 105 | ARM | Cortex-A710 | #2119858 | ARM64_ERRATUM_2119858 | 104 106 +----------------+-----------------+-----------------+-----------------------------+ 105 107 | ARM | Cortex-A710 | #2054223 | ARM64_ERRATUM_2054223 |
+1 -1
Documentation/dev-tools/kunit/usage.rst
··· 242 242 243 243 int rectangle_area(struct shape *this) 244 244 { 245 - struct rectangle *self = container_of(this, struct shape, parent); 245 + struct rectangle *self = container_of(this, struct rectangle, parent); 246 246 247 247 return self->length * self->width; 248 248 };
+16
Documentation/filesystems/netfs_library.rst
··· 462 462 struct iov_iter *iter, 463 463 netfs_io_terminated_t term_func, 464 464 void *term_func_priv); 465 + 466 + int (*query_occupancy)(struct netfs_cache_resources *cres, 467 + loff_t start, size_t len, size_t granularity, 468 + loff_t *_data_start, size_t *_data_len); 465 469 }; 466 470 467 471 With a termination handler function pointer:: ··· 539 535 with the number of bytes transferred or an error code, plus a flag 540 536 indicating whether the termination is definitely happening in the caller's 541 537 context. 538 + 539 + * ``query_occupancy()`` 540 + 541 + [Required] Called to find out where the next piece of data is within a 542 + particular region of the cache. The start and length of the region to be 543 + queried are passed in, along with the granularity to which the answer needs 544 + to be aligned. The function passes back the start and length of the data, 545 + if any, available within that region. Note that there may be a hole at the 546 + front. 547 + 548 + It returns 0 if some data was found, -ENODATA if there was no usable data 549 + within the region or -ENOBUFS if there is no caching on this file. 542 550 543 551 Note that these methods are passed a pointer to the cache resource structure, 544 552 not the read request structure as they could be used in other situations where
-24
Documentation/gpu/todo.rst
··· 300 300 301 301 Level: Advanced 302 302 303 - Garbage collect fbdev scrolling acceleration 304 - -------------------------------------------- 305 - 306 - Scroll acceleration has been disabled in fbcon. Now it works as the old 307 - SCROLL_REDRAW mode. A ton of code was removed in fbcon.c and the hook bmove was 308 - removed from fbcon_ops. 309 - Remaining tasks: 310 - 311 - - a bunch of the hooks in fbcon_ops could be removed or simplified by calling 312 - directly instead of the function table (with a switch on p->rotate) 313 - 314 - - fb_copyarea is unused after this, and can be deleted from all drivers 315 - 316 - - after that, fb_copyarea can be deleted from fb_ops in include/linux/fb.h as 317 - well as cfb_copyarea 318 - 319 - Note that not all acceleration code can be deleted, since clearing and cursor 320 - support is still accelerated, which might be good candidates for further 321 - deletion projects. 322 - 323 - Contact: Daniel Vetter 324 - 325 - Level: Intermediate 326 - 327 303 idr_init_base() 328 304 --------------- 329 305
+3
Documentation/userspace-api/ioctl/ioctl-number.rst
··· 115 115 'B' 00-1F linux/cciss_ioctl.h conflict! 116 116 'B' 00-0F include/linux/pmu.h conflict! 117 117 'B' C0-FF advanced bbus <mailto:maassen@uni-freiburg.de> 118 + 'B' 00-0F xen/xenbus_dev.h conflict! 118 119 'C' all linux/soundcard.h conflict! 119 120 'C' 01-2F linux/capi.h conflict! 120 121 'C' F0-FF drivers/net/wan/cosa.h conflict! ··· 135 134 'F' 80-8F linux/arcfb.h conflict! 136 135 'F' DD video/sstfb.h conflict! 137 136 'G' 00-3F drivers/misc/sgi-gru/grulib.h conflict! 137 + 'G' 00-0F xen/gntalloc.h, xen/gntdev.h conflict! 138 138 'H' 00-7F linux/hiddev.h conflict! 139 139 'H' 00-0F linux/hidraw.h conflict! 140 140 'H' 01 linux/mei.h conflict! ··· 178 176 'P' 60-6F sound/sscape_ioctl.h conflict! 179 177 'P' 00-0F drivers/usb/class/usblp.c conflict! 180 178 'P' 01-09 drivers/misc/pci_endpoint_test.c conflict! 179 + 'P' 00-0F xen/privcmd.h conflict! 181 180 'Q' all linux/soundcard.h 182 181 'R' 00-1F linux/random.h conflict! 183 182 'R' 01 linux/rfkill.h conflict!
+18 -4
MAINTAINERS
··· 10881 10881 F: drivers/ata/pata_arasan_cf.c 10882 10882 F: include/linux/pata_arasan_cf_data.h 10883 10883 10884 + LIBATA PATA DRIVERS 10885 + R: Sergey Shtylyov <s.shtylyov@omp.ru> 10886 + L: linux-ide@vger.kernel.org 10887 + F: drivers/ata/ata_*.c 10888 + F: drivers/ata/pata_*.c 10889 + 10884 10890 LIBATA PATA FARADAY FTIDE010 AND GEMINI SATA BRIDGE DRIVERS 10885 10891 M: Linus Walleij <linus.walleij@linaro.org> 10886 10892 L: linux-ide@vger.kernel.org ··· 12407 12401 F: kernel/sched/membarrier.c 12408 12402 12409 12403 MEMBLOCK 12410 - M: Mike Rapoport <rppt@linux.ibm.com> 12404 + M: Mike Rapoport <rppt@kernel.org> 12411 12405 L: linux-mm@kvack.org 12412 12406 S: Maintained 12413 12407 F: Documentation/core-api/boot-time-mm.rst ··· 13305 13299 W: http://www.nftables.org/ 13306 13300 Q: http://patchwork.ozlabs.org/project/netfilter-devel/list/ 13307 13301 C: irc://irc.libera.chat/netfilter 13308 - T: git git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git 13309 - T: git git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next.git 13302 + T: git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git 13303 + T: git git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-next.git 13310 13304 F: include/linux/netfilter* 13311 13305 F: include/linux/netfilter/ 13312 13306 F: include/net/netfilter/ ··· 13573 13567 13574 13568 NFS, SUNRPC, AND LOCKD CLIENTS 13575 13569 M: Trond Myklebust <trond.myklebust@hammerspace.com> 13576 - M: Anna Schumaker <anna.schumaker@netapp.com> 13570 + M: Anna Schumaker <anna@kernel.org> 13577 13571 L: linux-nfs@vger.kernel.org 13578 13572 S: Maintained 13579 13573 W: http://client.linux-nfs.org ··· 16474 16468 F: Documentation/devicetree/bindings/i2c/renesas,rmobile-iic.yaml 16475 16469 F: drivers/i2c/busses/i2c-rcar.c 16476 16470 F: drivers/i2c/busses/i2c-sh_mobile.c 16471 + 16472 + RENESAS R-CAR SATA DRIVER 16473 + R: Sergey Shtylyov <s.shtylyov@omp.ru> 16474 + S: Supported 16475 + L: linux-ide@vger.kernel.org 16476 + L: linux-renesas-soc@vger.kernel.org 16477 + F: Documentation/devicetree/bindings/ata/renesas,rcar-sata.yaml 16478 + F: drivers/ata/sata_rcar.c 16477 16479 16478 16480 RENESAS R-CAR THERMAL DRIVERS 16479 16481 M: Niklas Söderlund <niklas.soderlund@ragnatech.se>
+1 -1
Makefile
··· 2 2 VERSION = 5 3 3 PATCHLEVEL = 17 4 4 SUBLEVEL = 0 5 - EXTRAVERSION = -rc2 5 + EXTRAVERSION = -rc3 6 6 NAME = Gobble Gobble 7 7 8 8 # *DOCUMENTATION*
+2 -2
arch/arm/crypto/blake2s-shash.c
··· 13 13 static int crypto_blake2s_update_arm(struct shash_desc *desc, 14 14 const u8 *in, unsigned int inlen) 15 15 { 16 - return crypto_blake2s_update(desc, in, inlen, blake2s_compress); 16 + return crypto_blake2s_update(desc, in, inlen, false); 17 17 } 18 18 19 19 static int crypto_blake2s_final_arm(struct shash_desc *desc, u8 *out) 20 20 { 21 - return crypto_blake2s_final(desc, out, blake2s_compress); 21 + return crypto_blake2s_final(desc, out, false); 22 22 } 23 23 24 24 #define BLAKE2S_ALG(name, driver_name, digest_size) \
+16
arch/arm64/Kconfig
··· 680 680 681 681 If unsure, say Y. 682 682 683 + config ARM64_ERRATUM_2077057 684 + bool "Cortex-A510: 2077057: workaround software-step corrupting SPSR_EL2" 685 + help 686 + This option adds the workaround for ARM Cortex-A510 erratum 2077057. 687 + Affected Cortex-A510 may corrupt SPSR_EL2 when the a step exception is 688 + expected, but a Pointer Authentication trap is taken instead. The 689 + erratum causes SPSR_EL1 to be copied to SPSR_EL2, which could allow 690 + EL1 to cause a return to EL2 with a guest controlled ELR_EL2. 691 + 692 + This can only happen when EL2 is stepping EL1. 693 + 694 + When these conditions occur, the SPSR_EL2 value is unchanged from the 695 + previous guest entry, and can be restored from the in-memory copy. 696 + 697 + If unsure, say Y. 698 + 683 699 config ARM64_ERRATUM_2119858 684 700 bool "Cortex-A710/X2: 2119858: workaround TRBE overwriting trace data in FILL mode" 685 701 default y
+8
arch/arm64/kernel/cpu_errata.c
··· 600 600 CAP_MIDR_RANGE_LIST(trbe_write_out_of_range_cpus), 601 601 }, 602 602 #endif 603 + #ifdef CONFIG_ARM64_ERRATUM_2077057 604 + { 605 + .desc = "ARM erratum 2077057", 606 + .capability = ARM64_WORKAROUND_2077057, 607 + .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM, 608 + ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A510, 0, 0, 2), 609 + }, 610 + #endif 603 611 #ifdef CONFIG_ARM64_ERRATUM_2064142 604 612 { 605 613 .desc = "ARM erratum 2064142",
+33 -18
arch/arm64/kvm/arm.c
··· 797 797 xfer_to_guest_mode_work_pending(); 798 798 } 799 799 800 + /* 801 + * Actually run the vCPU, entering an RCU extended quiescent state (EQS) while 802 + * the vCPU is running. 803 + * 804 + * This must be noinstr as instrumentation may make use of RCU, and this is not 805 + * safe during the EQS. 806 + */ 807 + static int noinstr kvm_arm_vcpu_enter_exit(struct kvm_vcpu *vcpu) 808 + { 809 + int ret; 810 + 811 + guest_state_enter_irqoff(); 812 + ret = kvm_call_hyp_ret(__kvm_vcpu_run, vcpu); 813 + guest_state_exit_irqoff(); 814 + 815 + return ret; 816 + } 817 + 800 818 /** 801 819 * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code 802 820 * @vcpu: The VCPU pointer ··· 899 881 * Enter the guest 900 882 */ 901 883 trace_kvm_entry(*vcpu_pc(vcpu)); 902 - guest_enter_irqoff(); 884 + guest_timing_enter_irqoff(); 903 885 904 - ret = kvm_call_hyp_ret(__kvm_vcpu_run, vcpu); 886 + ret = kvm_arm_vcpu_enter_exit(vcpu); 905 887 906 888 vcpu->mode = OUTSIDE_GUEST_MODE; 907 889 vcpu->stat.exits++; ··· 936 918 kvm_arch_vcpu_ctxsync_fp(vcpu); 937 919 938 920 /* 939 - * We may have taken a host interrupt in HYP mode (ie 940 - * while executing the guest). This interrupt is still 941 - * pending, as we haven't serviced it yet! 921 + * We must ensure that any pending interrupts are taken before 922 + * we exit guest timing so that timer ticks are accounted as 923 + * guest time. Transiently unmask interrupts so that any 924 + * pending interrupts are taken. 942 925 * 943 - * We're now back in SVC mode, with interrupts 944 - * disabled. Enabling the interrupts now will have 945 - * the effect of taking the interrupt again, in SVC 946 - * mode this time. 926 + * Per ARM DDI 0487G.b section D1.13.4, an ISB (or other 927 + * context synchronization event) is necessary to ensure that 928 + * pending interrupts are taken. 947 929 */ 948 930 local_irq_enable(); 931 + isb(); 932 + local_irq_disable(); 949 933 950 - /* 951 - * We do local_irq_enable() before calling guest_exit() so 952 - * that if a timer interrupt hits while running the guest we 953 - * account that tick as being spent in the guest. We enable 954 - * preemption after calling guest_exit() so that if we get 955 - * preempted we make sure ticks after that is not counted as 956 - * guest time. 957 - */ 958 - guest_exit(); 934 + guest_timing_exit_irqoff(); 935 + 936 + local_irq_enable(); 937 + 959 938 trace_kvm_exit(ret, kvm_vcpu_trap_get_class(vcpu), *vcpu_pc(vcpu)); 960 939 961 940 /* Exit types that need handling before we can be preempted */
+8
arch/arm64/kvm/handle_exit.c
··· 228 228 { 229 229 struct kvm_run *run = vcpu->run; 230 230 231 + if (ARM_SERROR_PENDING(exception_index)) { 232 + /* 233 + * The SError is handled by handle_exit_early(). If the guest 234 + * survives it will re-execute the original instruction. 235 + */ 236 + return 1; 237 + } 238 + 231 239 exception_index = ARM_EXCEPTION_CODE(exception_index); 232 240 233 241 switch (exception_index) {
+21 -2
arch/arm64/kvm/hyp/include/hyp/switch.h
··· 402 402 return false; 403 403 } 404 404 405 + static inline void synchronize_vcpu_pstate(struct kvm_vcpu *vcpu, u64 *exit_code) 406 + { 407 + /* 408 + * Check for the conditions of Cortex-A510's #2077057. When these occur 409 + * SPSR_EL2 can't be trusted, but isn't needed either as it is 410 + * unchanged from the value in vcpu_gp_regs(vcpu)->pstate. 411 + * Are we single-stepping the guest, and took a PAC exception from the 412 + * active-not-pending state? 413 + */ 414 + if (cpus_have_final_cap(ARM64_WORKAROUND_2077057) && 415 + vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP && 416 + *vcpu_cpsr(vcpu) & DBG_SPSR_SS && 417 + ESR_ELx_EC(read_sysreg_el2(SYS_ESR)) == ESR_ELx_EC_PAC) 418 + write_sysreg_el2(*vcpu_cpsr(vcpu), SYS_SPSR); 419 + 420 + vcpu->arch.ctxt.regs.pstate = read_sysreg_el2(SYS_SPSR); 421 + } 422 + 405 423 /* 406 424 * Return true when we were able to fixup the guest exit and should return to 407 425 * the guest, false when we should restore the host state and return to the ··· 431 413 * Save PSTATE early so that we can evaluate the vcpu mode 432 414 * early on. 433 415 */ 434 - vcpu->arch.ctxt.regs.pstate = read_sysreg_el2(SYS_SPSR); 416 + synchronize_vcpu_pstate(vcpu, exit_code); 435 417 436 418 /* 437 419 * Check whether we want to repaint the state one way or ··· 442 424 if (ARM_EXCEPTION_CODE(*exit_code) != ARM_EXCEPTION_IRQ) 443 425 vcpu->arch.fault.esr_el2 = read_sysreg_el2(SYS_ESR); 444 426 445 - if (ARM_SERROR_PENDING(*exit_code)) { 427 + if (ARM_SERROR_PENDING(*exit_code) && 428 + ARM_EXCEPTION_CODE(*exit_code) != ARM_EXCEPTION_IRQ) { 446 429 u8 esr_ec = kvm_vcpu_trap_get_class(vcpu); 447 430 448 431 /*
+3 -2
arch/arm64/tools/cpucaps
··· 55 55 WORKAROUND_1463225 56 56 WORKAROUND_1508412 57 57 WORKAROUND_1542419 58 - WORKAROUND_2064142 59 - WORKAROUND_2038923 60 58 WORKAROUND_1902691 59 + WORKAROUND_2038923 60 + WORKAROUND_2064142 61 + WORKAROUND_2077057 61 62 WORKAROUND_TRBE_OVERWRITE_FILL_MODE 62 63 WORKAROUND_TSB_FLUSH_FAILURE 63 64 WORKAROUND_TRBE_WRITE_OUT_OF_RANGE
+2 -13
arch/mips/boot/dts/ingenic/ci20.dts
··· 83 83 label = "HDMI OUT"; 84 84 type = "a"; 85 85 86 + ddc-en-gpios = <&gpa 25 GPIO_ACTIVE_HIGH>; 87 + 86 88 port { 87 89 hdmi_con: endpoint { 88 90 remote-endpoint = <&dw_hdmi_out>; ··· 114 112 regulator-max-microvolt = <5000000>; 115 113 116 114 gpio = <&gpf 14 GPIO_ACTIVE_LOW>; 117 - enable-active-high; 118 - }; 119 - 120 - hdmi_power: fixedregulator@3 { 121 - compatible = "regulator-fixed"; 122 - 123 - regulator-name = "hdmi_power"; 124 - regulator-min-microvolt = <5000000>; 125 - regulator-max-microvolt = <5000000>; 126 - 127 - gpio = <&gpa 25 0>; 128 115 enable-active-high; 129 116 }; 130 117 }; ··· 566 575 567 576 pinctrl-names = "default"; 568 577 pinctrl-0 = <&pins_hdmi_ddc>; 569 - 570 - hdmi-5v-supply = <&hdmi_power>; 571 578 572 579 ports { 573 580 #address-cells = <1>;
+46 -4
arch/mips/kvm/mips.c
··· 414 414 return -ENOIOCTLCMD; 415 415 } 416 416 417 + /* 418 + * Actually run the vCPU, entering an RCU extended quiescent state (EQS) while 419 + * the vCPU is running. 420 + * 421 + * This must be noinstr as instrumentation may make use of RCU, and this is not 422 + * safe during the EQS. 423 + */ 424 + static int noinstr kvm_mips_vcpu_enter_exit(struct kvm_vcpu *vcpu) 425 + { 426 + int ret; 427 + 428 + guest_state_enter_irqoff(); 429 + ret = kvm_mips_callbacks->vcpu_run(vcpu); 430 + guest_state_exit_irqoff(); 431 + 432 + return ret; 433 + } 434 + 417 435 int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu) 418 436 { 419 437 int r = -EINTR; ··· 452 434 lose_fpu(1); 453 435 454 436 local_irq_disable(); 455 - guest_enter_irqoff(); 437 + guest_timing_enter_irqoff(); 456 438 trace_kvm_enter(vcpu); 457 439 458 440 /* ··· 463 445 */ 464 446 smp_store_mb(vcpu->mode, IN_GUEST_MODE); 465 447 466 - r = kvm_mips_callbacks->vcpu_run(vcpu); 448 + r = kvm_mips_vcpu_enter_exit(vcpu); 449 + 450 + /* 451 + * We must ensure that any pending interrupts are taken before 452 + * we exit guest timing so that timer ticks are accounted as 453 + * guest time. Transiently unmask interrupts so that any 454 + * pending interrupts are taken. 455 + * 456 + * TODO: is there a barrier which ensures that pending interrupts are 457 + * recognised? Currently this just hopes that the CPU takes any pending 458 + * interrupts between the enable and disable. 459 + */ 460 + local_irq_enable(); 461 + local_irq_disable(); 467 462 468 463 trace_kvm_out(vcpu); 469 - guest_exit_irqoff(); 464 + guest_timing_exit_irqoff(); 470 465 local_irq_enable(); 471 466 472 467 out: ··· 1199 1168 /* 1200 1169 * Return value is in the form (errcode<<2 | RESUME_FLAG_HOST | RESUME_FLAG_NV) 1201 1170 */ 1202 - int kvm_mips_handle_exit(struct kvm_vcpu *vcpu) 1171 + static int __kvm_mips_handle_exit(struct kvm_vcpu *vcpu) 1203 1172 { 1204 1173 struct kvm_run *run = vcpu->run; 1205 1174 u32 cause = vcpu->arch.host_cp0_cause; ··· 1385 1354 read_c0_config5() & MIPS_CONF5_MSAEN) 1386 1355 __kvm_restore_msacsr(&vcpu->arch); 1387 1356 } 1357 + return ret; 1358 + } 1359 + 1360 + int noinstr kvm_mips_handle_exit(struct kvm_vcpu *vcpu) 1361 + { 1362 + int ret; 1363 + 1364 + guest_state_exit_irqoff(); 1365 + ret = __kvm_mips_handle_exit(vcpu); 1366 + guest_state_enter_irqoff(); 1367 + 1388 1368 return ret; 1389 1369 } 1390 1370
+31 -17
arch/riscv/kvm/vcpu.c
··· 90 90 int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) 91 91 { 92 92 struct kvm_cpu_context *cntx; 93 + struct kvm_vcpu_csr *reset_csr = &vcpu->arch.guest_reset_csr; 93 94 94 95 /* Mark this VCPU never ran */ 95 96 vcpu->arch.ran_atleast_once = false; ··· 106 105 cntx->hstatus |= HSTATUS_VTW; 107 106 cntx->hstatus |= HSTATUS_SPVP; 108 107 cntx->hstatus |= HSTATUS_SPV; 108 + 109 + /* By default, make CY, TM, and IR counters accessible in VU mode */ 110 + reset_csr->scounteren = 0x7; 109 111 110 112 /* Setup VCPU timer */ 111 113 kvm_riscv_vcpu_timer_init(vcpu); ··· 703 699 csr_write(CSR_HVIP, csr->hvip); 704 700 } 705 701 702 + /* 703 + * Actually run the vCPU, entering an RCU extended quiescent state (EQS) while 704 + * the vCPU is running. 705 + * 706 + * This must be noinstr as instrumentation may make use of RCU, and this is not 707 + * safe during the EQS. 708 + */ 709 + static void noinstr kvm_riscv_vcpu_enter_exit(struct kvm_vcpu *vcpu) 710 + { 711 + guest_state_enter_irqoff(); 712 + __kvm_riscv_switch_to(&vcpu->arch); 713 + guest_state_exit_irqoff(); 714 + } 715 + 706 716 int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu) 707 717 { 708 718 int ret; ··· 808 790 continue; 809 791 } 810 792 811 - guest_enter_irqoff(); 793 + guest_timing_enter_irqoff(); 812 794 813 - __kvm_riscv_switch_to(&vcpu->arch); 795 + kvm_riscv_vcpu_enter_exit(vcpu); 814 796 815 797 vcpu->mode = OUTSIDE_GUEST_MODE; 816 798 vcpu->stat.exits++; ··· 830 812 kvm_riscv_vcpu_sync_interrupts(vcpu); 831 813 832 814 /* 833 - * We may have taken a host interrupt in VS/VU-mode (i.e. 834 - * while executing the guest). This interrupt is still 835 - * pending, as we haven't serviced it yet! 815 + * We must ensure that any pending interrupts are taken before 816 + * we exit guest timing so that timer ticks are accounted as 817 + * guest time. Transiently unmask interrupts so that any 818 + * pending interrupts are taken. 836 819 * 837 - * We're now back in HS-mode with interrupts disabled 838 - * so enabling the interrupts now will have the effect 839 - * of taking the interrupt again, in HS-mode this time. 820 + * There's no barrier which ensures that pending interrupts are 821 + * recognised, so we just hope that the CPU takes any pending 822 + * interrupts between the enable and disable. 840 823 */ 841 824 local_irq_enable(); 825 + local_irq_disable(); 842 826 843 - /* 844 - * We do local_irq_enable() before calling guest_exit() so 845 - * that if a timer interrupt hits while running the guest 846 - * we account that tick as being spent in the guest. We 847 - * enable preemption after calling guest_exit() so that if 848 - * we get preempted we make sure ticks after that is not 849 - * counted as guest time. 850 - */ 851 - guest_exit(); 827 + guest_timing_exit_irqoff(); 828 + 829 + local_irq_enable(); 852 830 853 831 preempt_enable(); 854 832
+2 -1
arch/riscv/kvm/vcpu_sbi_base.c
··· 9 9 #include <linux/errno.h> 10 10 #include <linux/err.h> 11 11 #include <linux/kvm_host.h> 12 + #include <linux/version.h> 12 13 #include <asm/csr.h> 13 14 #include <asm/sbi.h> 14 15 #include <asm/kvm_vcpu_timer.h> ··· 33 32 *out_val = KVM_SBI_IMPID; 34 33 break; 35 34 case SBI_EXT_BASE_GET_IMP_VERSION: 36 - *out_val = 0; 35 + *out_val = LINUX_VERSION_CODE; 37 36 break; 38 37 case SBI_EXT_BASE_PROBE_EXT: 39 38 if ((cp->a0 >= SBI_EXT_EXPERIMENTAL_START &&
+2
arch/s390/kvm/kvm-s390.c
··· 4667 4667 return -EINVAL; 4668 4668 if (mop->size + mop->sida_offset > sida_size(vcpu->arch.sie_block)) 4669 4669 return -E2BIG; 4670 + if (!kvm_s390_pv_cpu_is_protected(vcpu)) 4671 + return -EINVAL; 4670 4672 4671 4673 switch (mop->op) { 4672 4674 case KVM_S390_MEMOP_SIDA_READ:
+2 -2
arch/x86/crypto/blake2s-shash.c
··· 18 18 static int crypto_blake2s_update_x86(struct shash_desc *desc, 19 19 const u8 *in, unsigned int inlen) 20 20 { 21 - return crypto_blake2s_update(desc, in, inlen, blake2s_compress); 21 + return crypto_blake2s_update(desc, in, inlen, false); 22 22 } 23 23 24 24 static int crypto_blake2s_final_x86(struct shash_desc *desc, u8 *out) 25 25 { 26 - return crypto_blake2s_final(desc, out, blake2s_compress); 26 + return crypto_blake2s_final(desc, out, false); 27 27 } 28 28 29 29 #define BLAKE2S_ALG(name, driver_name, digest_size) \
+13
arch/x86/events/intel/core.c
··· 4703 4703 .lbr_read = intel_pmu_lbr_read_64, 4704 4704 .lbr_save = intel_pmu_lbr_save, 4705 4705 .lbr_restore = intel_pmu_lbr_restore, 4706 + 4707 + /* 4708 + * SMM has access to all 4 rings and while traditionally SMM code only 4709 + * ran in CPL0, 2021-era firmware is starting to make use of CPL3 in SMM. 4710 + * 4711 + * Since the EVENTSEL.{USR,OS} CPL filtering makes no distinction 4712 + * between SMM or not, this results in what should be pure userspace 4713 + * counters including SMM data. 4714 + * 4715 + * This is a clear privilege issue, therefore globally disable 4716 + * counting SMM by default. 4717 + */ 4718 + .attr_freeze_on_smi = 1, 4706 4719 }; 4707 4720 4708 4721 static __init void intel_clovertown_quirk(void)
+3 -2
arch/x86/events/intel/pt.c
··· 897 897 * means we are already losing data; need to let the decoder 898 898 * know. 899 899 */ 900 - if (!intel_pt_validate_hw_cap(PT_CAP_topa_multiple_entries) || 901 - buf->output_off == pt_buffer_region_size(buf)) { 900 + if (!buf->single && 901 + (!intel_pt_validate_hw_cap(PT_CAP_topa_multiple_entries) || 902 + buf->output_off == pt_buffer_region_size(buf))) { 902 903 perf_aux_output_flag(&pt->handle, 903 904 PERF_AUX_FLAG_TRUNCATED); 904 905 advance++;
+1 -1
arch/x86/include/asm/kvm-x86-ops.h
··· 82 82 KVM_X86_OP(load_eoi_exitmap) 83 83 KVM_X86_OP(set_virtual_apic_mode) 84 84 KVM_X86_OP_NULL(set_apic_access_page_addr) 85 - KVM_X86_OP(deliver_posted_interrupt) 85 + KVM_X86_OP(deliver_interrupt) 86 86 KVM_X86_OP_NULL(sync_pir_to_irr) 87 87 KVM_X86_OP(set_tss_addr) 88 88 KVM_X86_OP(set_identity_map_addr)
+2 -1
arch/x86/include/asm/kvm_host.h
··· 1410 1410 void (*load_eoi_exitmap)(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap); 1411 1411 void (*set_virtual_apic_mode)(struct kvm_vcpu *vcpu); 1412 1412 void (*set_apic_access_page_addr)(struct kvm_vcpu *vcpu); 1413 - int (*deliver_posted_interrupt)(struct kvm_vcpu *vcpu, int vector); 1413 + void (*deliver_interrupt)(struct kvm_lapic *apic, int delivery_mode, 1414 + int trig_mode, int vector); 1414 1415 int (*sync_pir_to_irr)(struct kvm_vcpu *vcpu); 1415 1416 int (*set_tss_addr)(struct kvm *kvm, unsigned int addr); 1416 1417 int (*set_identity_map_addr)(struct kvm *kvm, u64 ident_addr);
-14
arch/x86/include/asm/xen/hypervisor.h
··· 43 43 return hypervisor_cpuid_base("XenVMMXenVMM", 2); 44 44 } 45 45 46 - #ifdef CONFIG_XEN 47 - extern bool __init xen_hvm_need_lapic(void); 48 - 49 - static inline bool __init xen_x2apic_para_available(void) 50 - { 51 - return xen_hvm_need_lapic(); 52 - } 53 - #else 54 - static inline bool __init xen_x2apic_para_available(void) 55 - { 56 - return (xen_cpuid_base() != 0); 57 - } 58 - #endif 59 - 60 46 struct pci_dev; 61 47 62 48 #ifdef CONFIG_XEN_PV_DOM0
+7 -6
arch/x86/kvm/cpuid.c
··· 554 554 ); 555 555 556 556 kvm_cpu_cap_mask(CPUID_7_0_EBX, 557 - F(FSGSBASE) | F(SGX) | F(BMI1) | F(HLE) | F(AVX2) | F(SMEP) | 558 - F(BMI2) | F(ERMS) | F(INVPCID) | F(RTM) | 0 /*MPX*/ | F(RDSEED) | 559 - F(ADX) | F(SMAP) | F(AVX512IFMA) | F(AVX512F) | F(AVX512PF) | 560 - F(AVX512ER) | F(AVX512CD) | F(CLFLUSHOPT) | F(CLWB) | F(AVX512DQ) | 561 - F(SHA_NI) | F(AVX512BW) | F(AVX512VL) | 0 /*INTEL_PT*/ 562 - ); 557 + F(FSGSBASE) | F(SGX) | F(BMI1) | F(HLE) | F(AVX2) | 558 + F(FDP_EXCPTN_ONLY) | F(SMEP) | F(BMI2) | F(ERMS) | F(INVPCID) | 559 + F(RTM) | F(ZERO_FCS_FDS) | 0 /*MPX*/ | F(AVX512F) | 560 + F(AVX512DQ) | F(RDSEED) | F(ADX) | F(SMAP) | F(AVX512IFMA) | 561 + F(CLFLUSHOPT) | F(CLWB) | 0 /*INTEL_PT*/ | F(AVX512PF) | 562 + F(AVX512ER) | F(AVX512CD) | F(SHA_NI) | F(AVX512BW) | 563 + F(AVX512VL)); 563 564 564 565 kvm_cpu_cap_mask(CPUID_7_ECX, 565 566 F(AVX512VBMI) | F(LA57) | F(PKU) | 0 /*OSPKE*/ | F(RDPID) |
+2 -8
arch/x86/kvm/lapic.c
··· 1096 1096 apic->regs + APIC_TMR); 1097 1097 } 1098 1098 1099 - if (static_call(kvm_x86_deliver_posted_interrupt)(vcpu, vector)) { 1100 - kvm_lapic_set_irr(vector, apic); 1101 - kvm_make_request(KVM_REQ_EVENT, vcpu); 1102 - kvm_vcpu_kick(vcpu); 1103 - } else { 1104 - trace_kvm_apicv_accept_irq(vcpu->vcpu_id, delivery_mode, 1105 - trig_mode, vector); 1106 - } 1099 + static_call(kvm_x86_deliver_interrupt)(apic, delivery_mode, 1100 + trig_mode, vector); 1107 1101 break; 1108 1102 1109 1103 case APIC_DM_REMRD:
+18 -3
arch/x86/kvm/svm/svm.c
··· 3291 3291 SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_INTR; 3292 3292 } 3293 3293 3294 + static void svm_deliver_interrupt(struct kvm_lapic *apic, int delivery_mode, 3295 + int trig_mode, int vector) 3296 + { 3297 + struct kvm_vcpu *vcpu = apic->vcpu; 3298 + 3299 + if (svm_deliver_avic_intr(vcpu, vector)) { 3300 + kvm_lapic_set_irr(vector, apic); 3301 + kvm_make_request(KVM_REQ_EVENT, vcpu); 3302 + kvm_vcpu_kick(vcpu); 3303 + } else { 3304 + trace_kvm_apicv_accept_irq(vcpu->vcpu_id, delivery_mode, 3305 + trig_mode, vector); 3306 + } 3307 + } 3308 + 3294 3309 static void svm_update_cr8_intercept(struct kvm_vcpu *vcpu, int tpr, int irr) 3295 3310 { 3296 3311 struct vcpu_svm *svm = to_svm(vcpu); ··· 3630 3615 struct vcpu_svm *svm = to_svm(vcpu); 3631 3616 unsigned long vmcb_pa = svm->current_vmcb->pa; 3632 3617 3633 - kvm_guest_enter_irqoff(); 3618 + guest_state_enter_irqoff(); 3634 3619 3635 3620 if (sev_es_guest(vcpu->kvm)) { 3636 3621 __svm_sev_es_vcpu_run(vmcb_pa); ··· 3650 3635 vmload(__sme_page_pa(sd->save_area)); 3651 3636 } 3652 3637 3653 - kvm_guest_exit_irqoff(); 3638 + guest_state_exit_irqoff(); 3654 3639 } 3655 3640 3656 3641 static __no_kcsan fastpath_t svm_vcpu_run(struct kvm_vcpu *vcpu) ··· 4560 4545 .pmu_ops = &amd_pmu_ops, 4561 4546 .nested_ops = &svm_nested_ops, 4562 4547 4563 - .deliver_posted_interrupt = svm_deliver_avic_intr, 4548 + .deliver_interrupt = svm_deliver_interrupt, 4564 4549 .dy_apicv_has_pending_interrupt = svm_dy_apicv_has_pending_interrupt, 4565 4550 .update_pi_irte = svm_update_pi_irte, 4566 4551 .setup_mce = svm_setup_mce,
+18 -3
arch/x86/kvm/vmx/vmx.c
··· 4041 4041 return 0; 4042 4042 } 4043 4043 4044 + static void vmx_deliver_interrupt(struct kvm_lapic *apic, int delivery_mode, 4045 + int trig_mode, int vector) 4046 + { 4047 + struct kvm_vcpu *vcpu = apic->vcpu; 4048 + 4049 + if (vmx_deliver_posted_interrupt(vcpu, vector)) { 4050 + kvm_lapic_set_irr(vector, apic); 4051 + kvm_make_request(KVM_REQ_EVENT, vcpu); 4052 + kvm_vcpu_kick(vcpu); 4053 + } else { 4054 + trace_kvm_apicv_accept_irq(vcpu->vcpu_id, delivery_mode, 4055 + trig_mode, vector); 4056 + } 4057 + } 4058 + 4044 4059 /* 4045 4060 * Set up the vmcs's constant host-state fields, i.e., host-state fields that 4046 4061 * will not change in the lifetime of the guest. ··· 6769 6754 static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu, 6770 6755 struct vcpu_vmx *vmx) 6771 6756 { 6772 - kvm_guest_enter_irqoff(); 6757 + guest_state_enter_irqoff(); 6773 6758 6774 6759 /* L1D Flush includes CPU buffer clear to mitigate MDS */ 6775 6760 if (static_branch_unlikely(&vmx_l1d_should_flush)) ··· 6785 6770 6786 6771 vcpu->arch.cr2 = native_read_cr2(); 6787 6772 6788 - kvm_guest_exit_irqoff(); 6773 + guest_state_exit_irqoff(); 6789 6774 } 6790 6775 6791 6776 static fastpath_t vmx_vcpu_run(struct kvm_vcpu *vcpu) ··· 7783 7768 .hwapic_isr_update = vmx_hwapic_isr_update, 7784 7769 .guest_apic_has_interrupt = vmx_guest_apic_has_interrupt, 7785 7770 .sync_pir_to_irr = vmx_sync_pir_to_irr, 7786 - .deliver_posted_interrupt = vmx_deliver_posted_interrupt, 7771 + .deliver_interrupt = vmx_deliver_interrupt, 7787 7772 .dy_apicv_has_pending_interrupt = pi_has_pending_interrupt, 7788 7773 7789 7774 .set_tss_addr = vmx_set_tss_addr,
+6 -4
arch/x86/kvm/x86.c
··· 90 90 u64 __read_mostly kvm_mce_cap_supported = MCG_CTL_P | MCG_SER_P; 91 91 EXPORT_SYMBOL_GPL(kvm_mce_cap_supported); 92 92 93 + #define ERR_PTR_USR(e) ((void __user *)ERR_PTR(e)) 94 + 93 95 #define emul_to_vcpu(ctxt) \ 94 96 ((struct kvm_vcpu *)(ctxt)->vcpu) 95 97 ··· 4342 4340 void __user *uaddr = (void __user*)(unsigned long)attr->addr; 4343 4341 4344 4342 if ((u64)(unsigned long)uaddr != attr->addr) 4345 - return ERR_PTR(-EFAULT); 4343 + return ERR_PTR_USR(-EFAULT); 4346 4344 return uaddr; 4347 4345 } 4348 4346 ··· 10043 10041 set_debugreg(0, 7); 10044 10042 } 10045 10043 10044 + guest_timing_enter_irqoff(); 10045 + 10046 10046 for (;;) { 10047 10047 /* 10048 10048 * Assert that vCPU vs. VM APICv state is consistent. An APICv ··· 10129 10125 * of accounting via context tracking, but the loss of accuracy is 10130 10126 * acceptable for all known use cases. 10131 10127 */ 10132 - vtime_account_guest_exit(); 10128 + guest_timing_exit_irqoff(); 10133 10129 10134 10130 if (lapic_in_kernel(vcpu)) { 10135 10131 s64 delta = vcpu->arch.apic->lapic_timer.advance_expire_delta; ··· 11642 11638 cancel_delayed_work_sync(&kvm->arch.kvmclock_update_work); 11643 11639 kvm_free_pit(kvm); 11644 11640 } 11645 - 11646 - #define ERR_PTR_USR(e) ((void __user *)ERR_PTR(e)) 11647 11641 11648 11642 /** 11649 11643 * __x86_set_memory_region: Setup KVM internal memory slot
-45
arch/x86/kvm/x86.h
··· 10 10 11 11 void kvm_spurious_fault(void); 12 12 13 - static __always_inline void kvm_guest_enter_irqoff(void) 14 - { 15 - /* 16 - * VMENTER enables interrupts (host state), but the kernel state is 17 - * interrupts disabled when this is invoked. Also tell RCU about 18 - * it. This is the same logic as for exit_to_user_mode(). 19 - * 20 - * This ensures that e.g. latency analysis on the host observes 21 - * guest mode as interrupt enabled. 22 - * 23 - * guest_enter_irqoff() informs context tracking about the 24 - * transition to guest mode and if enabled adjusts RCU state 25 - * accordingly. 26 - */ 27 - instrumentation_begin(); 28 - trace_hardirqs_on_prepare(); 29 - lockdep_hardirqs_on_prepare(CALLER_ADDR0); 30 - instrumentation_end(); 31 - 32 - guest_enter_irqoff(); 33 - lockdep_hardirqs_on(CALLER_ADDR0); 34 - } 35 - 36 - static __always_inline void kvm_guest_exit_irqoff(void) 37 - { 38 - /* 39 - * VMEXIT disables interrupts (host state), but tracing and lockdep 40 - * have them in state 'on' as recorded before entering guest mode. 41 - * Same as enter_from_user_mode(). 42 - * 43 - * context_tracking_guest_exit() restores host context and reinstates 44 - * RCU if enabled and required. 45 - * 46 - * This needs to be done immediately after VM-Exit, before any code 47 - * that might contain tracepoints or call out to the greater world, 48 - * e.g. before x86_spec_ctrl_restore_host(). 49 - */ 50 - lockdep_hardirqs_off(CALLER_ADDR0); 51 - context_tracking_guest_exit(); 52 - 53 - instrumentation_begin(); 54 - trace_hardirqs_off_finish(); 55 - instrumentation_end(); 56 - } 57 - 58 13 #define KVM_NESTED_VMENTER_CONSISTENCY_CHECK(consistency_check) \ 59 14 ({ \ 60 15 bool failed = (consistency_check); \
+4 -9
arch/x86/xen/enlighten_hvm.c
··· 9 9 #include <xen/events.h> 10 10 #include <xen/interface/memory.h> 11 11 12 + #include <asm/apic.h> 12 13 #include <asm/cpu.h> 13 14 #include <asm/smp.h> 14 15 #include <asm/io_apic.h> ··· 243 242 } 244 243 early_param("xen_no_vector_callback", xen_parse_no_vector_callback); 245 244 246 - bool __init xen_hvm_need_lapic(void) 245 + static __init bool xen_x2apic_available(void) 247 246 { 248 - if (xen_pv_domain()) 249 - return false; 250 - if (!xen_hvm_domain()) 251 - return false; 252 - if (xen_feature(XENFEAT_hvm_pirqs) && xen_have_vector_callback) 253 - return false; 254 - return true; 247 + return x2apic_supported(); 255 248 } 256 249 257 250 static __init void xen_hvm_guest_late_init(void) ··· 307 312 .detect = xen_platform_hvm, 308 313 .type = X86_HYPER_XEN_HVM, 309 314 .init.init_platform = xen_hvm_guest_init, 310 - .init.x2apic_available = xen_x2apic_para_available, 315 + .init.x2apic_available = xen_x2apic_available, 311 316 .init.init_mem_mapping = xen_hvm_init_mem_mapping, 312 317 .init.guest_late_init = xen_hvm_guest_late_init, 313 318 .runtime.pin_vcpu = xen_pin_vcpu,
-4
arch/x86/xen/enlighten_pv.c
··· 1341 1341 1342 1342 xen_acpi_sleep_register(); 1343 1343 1344 - /* Avoid searching for BIOS MP tables */ 1345 - x86_init.mpparse.find_smp_config = x86_init_noop; 1346 - x86_init.mpparse.get_smp_config = x86_init_uint_noop; 1347 - 1348 1344 xen_boot_params_init_edd(); 1349 1345 1350 1346 #ifdef CONFIG_ACPI
+6 -20
arch/x86/xen/smp_pv.c
··· 148 148 return rc; 149 149 } 150 150 151 - static void __init xen_fill_possible_map(void) 152 - { 153 - int i, rc; 154 - 155 - if (xen_initial_domain()) 156 - return; 157 - 158 - for (i = 0; i < nr_cpu_ids; i++) { 159 - rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL); 160 - if (rc >= 0) { 161 - num_processors++; 162 - set_cpu_possible(i, true); 163 - } 164 - } 165 - } 166 - 167 - static void __init xen_filter_cpu_maps(void) 151 + static void __init _get_smp_config(unsigned int early) 168 152 { 169 153 int i, rc; 170 154 unsigned int subtract = 0; 171 155 172 - if (!xen_initial_domain()) 156 + if (early) 173 157 return; 174 158 175 159 num_processors = 0; ··· 194 210 * sure the old memory can be recycled. */ 195 211 make_lowmem_page_readwrite(xen_initial_gdt); 196 212 197 - xen_filter_cpu_maps(); 198 213 xen_setup_vcpu_info_placement(); 199 214 200 215 /* ··· 459 476 void __init xen_smp_init(void) 460 477 { 461 478 smp_ops = xen_smp_ops; 462 - xen_fill_possible_map(); 479 + 480 + /* Avoid searching for BIOS MP tables */ 481 + x86_init.mpparse.find_smp_config = x86_init_noop; 482 + x86_init.mpparse.get_smp_config = _get_smp_config; 463 483 }
+1 -1
block/bio-integrity.c
··· 373 373 struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk); 374 374 unsigned bytes = bio_integrity_bytes(bi, bytes_done >> 9); 375 375 376 - bip->bip_iter.bi_sector += bytes_done >> 9; 376 + bip->bip_iter.bi_sector += bio_integrity_intervals(bi, bytes_done >> 9); 377 377 bvec_iter_advance(bip->bip_vec, &bip->bip_iter, bytes); 378 378 } 379 379
+19 -14
block/fops.c
··· 566 566 { 567 567 struct block_device *bdev = iocb->ki_filp->private_data; 568 568 loff_t size = bdev_nr_bytes(bdev); 569 - size_t count = iov_iter_count(to); 570 569 loff_t pos = iocb->ki_pos; 571 570 size_t shorted = 0; 572 571 ssize_t ret = 0; 572 + size_t count; 573 573 574 - if (unlikely(pos + count > size)) { 574 + if (unlikely(pos + iov_iter_count(to) > size)) { 575 575 if (pos >= size) 576 576 return 0; 577 577 size -= pos; 578 - if (count > size) { 579 - shorted = count - size; 580 - iov_iter_truncate(to, size); 581 - } 578 + shorted = iov_iter_count(to) - size; 579 + iov_iter_truncate(to, size); 582 580 } 581 + 582 + count = iov_iter_count(to); 583 + if (!count) 584 + goto reexpand; /* skip atime */ 583 585 584 586 if (iocb->ki_flags & IOCB_DIRECT) { 585 587 struct address_space *mapping = iocb->ki_filp->f_mapping; 586 588 587 589 if (iocb->ki_flags & IOCB_NOWAIT) { 588 - if (filemap_range_needs_writeback(mapping, iocb->ki_pos, 589 - iocb->ki_pos + count - 1)) 590 - return -EAGAIN; 590 + if (filemap_range_needs_writeback(mapping, pos, 591 + pos + count - 1)) { 592 + ret = -EAGAIN; 593 + goto reexpand; 594 + } 591 595 } else { 592 - ret = filemap_write_and_wait_range(mapping, 593 - iocb->ki_pos, 594 - iocb->ki_pos + count - 1); 596 + ret = filemap_write_and_wait_range(mapping, pos, 597 + pos + count - 1); 595 598 if (ret < 0) 596 - return ret; 599 + goto reexpand; 597 600 } 598 601 599 602 file_accessed(iocb->ki_filp); ··· 606 603 iocb->ki_pos += ret; 607 604 count -= ret; 608 605 } 606 + iov_iter_revert(to, count - iov_iter_count(to)); 609 607 if (ret < 0 || !count) 610 - return ret; 608 + goto reexpand; 611 609 } 612 610 613 611 ret = filemap_read(iocb, to, ret); 614 612 613 + reexpand: 615 614 if (unlikely(shorted)) 616 615 iov_iter_reexpand(to, iov_iter_count(to) + shorted); 617 616 return ret;
+1
crypto/algapi.c
··· 1324 1324 1325 1325 MODULE_LICENSE("GPL"); 1326 1326 MODULE_DESCRIPTION("Cryptographic algorithms API"); 1327 + MODULE_SOFTDEP("pre: cryptomgr");
-1
crypto/api.c
··· 643 643 644 644 MODULE_DESCRIPTION("Cryptographic core API"); 645 645 MODULE_LICENSE("GPL"); 646 - MODULE_SOFTDEP("pre: cryptomgr");
+2 -2
crypto/blake2s_generic.c
··· 15 15 static int crypto_blake2s_update_generic(struct shash_desc *desc, 16 16 const u8 *in, unsigned int inlen) 17 17 { 18 - return crypto_blake2s_update(desc, in, inlen, blake2s_compress_generic); 18 + return crypto_blake2s_update(desc, in, inlen, true); 19 19 } 20 20 21 21 static int crypto_blake2s_final_generic(struct shash_desc *desc, u8 *out) 22 22 { 23 - return crypto_blake2s_final(desc, out, blake2s_compress_generic); 23 + return crypto_blake2s_final(desc, out, true); 24 24 } 25 25 26 26 #define BLAKE2S_ALG(name, driver_name, digest_size) \
+1
drivers/acpi/Kconfig
··· 11 11 depends on ARCH_SUPPORTS_ACPI 12 12 select PNP 13 13 select NLS 14 + select CRC32 14 15 default y if X86 15 16 help 16 17 Advanced Configuration and Power Interface (ACPI) support for
+16 -8
drivers/ata/libata-core.c
··· 2007 2007 { 2008 2008 struct ata_port *ap = dev->link->ap; 2009 2009 2010 + if (dev->horkage & ATA_HORKAGE_NO_LOG_DIR) 2011 + return false; 2012 + 2010 2013 if (ata_read_log_page(dev, ATA_LOG_DIRECTORY, 0, ap->sector_buf, 1)) 2011 2014 return false; 2012 2015 return get_unaligned_le16(&ap->sector_buf[log * 2]) ? true : false; ··· 2448 2445 struct ata_cpr_log *cpr_log = NULL; 2449 2446 u8 *desc, *buf = NULL; 2450 2447 2451 - if (!ata_identify_page_supported(dev, 2452 - ATA_LOG_CONCURRENT_POSITIONING_RANGES)) 2448 + if (ata_id_major_version(dev->id) < 11 || 2449 + !ata_log_supported(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES)) 2453 2450 goto out; 2454 2451 2455 2452 /* 2456 - * Read IDENTIFY DEVICE data log, page 0x47 2457 - * (concurrent positioning ranges). We can have at most 255 32B range 2458 - * descriptors plus a 64B header. 2453 + * Read the concurrent positioning ranges log (0x47). We can have at 2454 + * most 255 32B range descriptors plus a 64B header. 2459 2455 */ 2460 2456 buf_len = (64 + 255 * 32 + 511) & ~511; 2461 2457 buf = kzalloc(buf_len, GFP_KERNEL); 2462 2458 if (!buf) 2463 2459 goto out; 2464 2460 2465 - err_mask = ata_read_log_page(dev, ATA_LOG_IDENTIFY_DEVICE, 2466 - ATA_LOG_CONCURRENT_POSITIONING_RANGES, 2467 - buf, buf_len >> 9); 2461 + err_mask = ata_read_log_page(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES, 2462 + 0, buf, buf_len >> 9); 2468 2463 if (err_mask) 2469 2464 goto out; 2470 2465 ··· 4073 4072 { "WDC WD2500JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, 4074 4073 { "WDC WD3000JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, 4075 4074 { "WDC WD3200JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, 4075 + 4076 + /* 4077 + * This sata dom device goes on a walkabout when the ATA_LOG_DIRECTORY 4078 + * log page is accessed. Ensure we never ask for this log page with 4079 + * these devices. 4080 + */ 4081 + { "SATADOM-ML 3ME", NULL, ATA_HORKAGE_NO_LOG_DIR }, 4076 4082 4077 4083 /* End Marker */ 4078 4084 { }
+22 -17
drivers/char/random.c
··· 762 762 return arch_init; 763 763 } 764 764 765 - static bool __init crng_init_try_arch_early(struct crng_state *crng) 765 + static bool __init crng_init_try_arch_early(void) 766 766 { 767 767 int i; 768 768 bool arch_init = true; ··· 774 774 rv = random_get_entropy(); 775 775 arch_init = false; 776 776 } 777 - crng->state[i] ^= rv; 777 + primary_crng.state[i] ^= rv; 778 778 } 779 779 780 780 return arch_init; ··· 788 788 crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1; 789 789 } 790 790 791 - static void __init crng_initialize_primary(struct crng_state *crng) 791 + static void __init crng_initialize_primary(void) 792 792 { 793 - _extract_entropy(&crng->state[4], sizeof(u32) * 12); 794 - if (crng_init_try_arch_early(crng) && trust_cpu && crng_init < 2) { 793 + _extract_entropy(&primary_crng.state[4], sizeof(u32) * 12); 794 + if (crng_init_try_arch_early() && trust_cpu && crng_init < 2) { 795 795 invalidate_batched_entropy(); 796 796 numa_crng_init(); 797 797 crng_init = 2; 798 798 pr_notice("crng init done (trusting CPU's manufacturer)\n"); 799 799 } 800 - crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1; 800 + primary_crng.init_time = jiffies - CRNG_RESEED_INTERVAL - 1; 801 801 } 802 802 803 - static void crng_finalize_init(struct crng_state *crng) 803 + static void crng_finalize_init(void) 804 804 { 805 - if (crng != &primary_crng || crng_init >= 2) 806 - return; 807 805 if (!system_wq) { 808 806 /* We can't call numa_crng_init until we have workqueues, 809 807 * so mark this for processing later. */ ··· 812 814 invalidate_batched_entropy(); 813 815 numa_crng_init(); 814 816 crng_init = 2; 817 + crng_need_final_init = false; 815 818 process_random_ready_list(); 816 819 wake_up_interruptible(&crng_init_wait); 817 820 kill_fasync(&fasync, SIGIO, POLL_IN); ··· 979 980 memzero_explicit(&buf, sizeof(buf)); 980 981 WRITE_ONCE(crng->init_time, jiffies); 981 982 spin_unlock_irqrestore(&crng->lock, flags); 982 - crng_finalize_init(crng); 983 + if (crng == &primary_crng && crng_init < 2) 984 + crng_finalize_init(); 983 985 } 984 986 985 987 static void _extract_crng(struct crng_state *crng, u8 out[CHACHA_BLOCK_SIZE]) ··· 1697 1697 { 1698 1698 init_std_data(); 1699 1699 if (crng_need_final_init) 1700 - crng_finalize_init(&primary_crng); 1701 - crng_initialize_primary(&primary_crng); 1700 + crng_finalize_init(); 1701 + crng_initialize_primary(); 1702 1702 crng_global_init_time = jiffies; 1703 1703 if (ratelimit_disable) { 1704 1704 urandom_warning.interval = 0; ··· 1856 1856 */ 1857 1857 if (!capable(CAP_SYS_ADMIN)) 1858 1858 return -EPERM; 1859 - input_pool.entropy_count = 0; 1859 + if (xchg(&input_pool.entropy_count, 0) && random_write_wakeup_bits) { 1860 + wake_up_interruptible(&random_write_wait); 1861 + kill_fasync(&fasync, SIGIO, POLL_OUT); 1862 + } 1860 1863 return 0; 1861 1864 case RNDRESEEDCRNG: 1862 1865 if (!capable(CAP_SYS_ADMIN)) ··· 2208 2205 return; 2209 2206 } 2210 2207 2211 - /* Suspend writing if we're above the trickle threshold. 2208 + /* Throttle writing if we're above the trickle threshold. 2212 2209 * We'll be woken up again once below random_write_wakeup_thresh, 2213 - * or when the calling thread is about to terminate. 2210 + * when the calling thread is about to terminate, or once 2211 + * CRNG_RESEED_INTERVAL has lapsed. 2214 2212 */ 2215 - wait_event_interruptible(random_write_wait, 2213 + wait_event_interruptible_timeout(random_write_wait, 2216 2214 !system_wq || kthread_should_stop() || 2217 - POOL_ENTROPY_BITS() <= random_write_wakeup_bits); 2215 + POOL_ENTROPY_BITS() <= random_write_wakeup_bits, 2216 + CRNG_RESEED_INTERVAL); 2218 2217 mix_pool_bytes(buffer, count); 2219 2218 credit_entropy_bits(entropy); 2220 2219 }
+2 -1
drivers/crypto/marvell/octeontx2/otx2_cptpf_ucode.c
··· 1753 1753 char engs_info[2 * OTX2_CPT_NAME_LENGTH]; 1754 1754 struct otx2_cpt_eng_grp_info *grp; 1755 1755 struct otx2_cpt_engs_rsvd *engs; 1756 - u32 mask[4]; 1757 1756 int i, j; 1758 1757 1759 1758 pr_debug("Engine groups global info"); ··· 1784 1785 for (j = 0; j < OTX2_CPT_MAX_ETYPES_PER_GRP; j++) { 1785 1786 engs = &grp->engs[j]; 1786 1787 if (engs->type) { 1788 + u32 mask[5] = { }; 1789 + 1787 1790 get_engs_info(grp, engs_info, 1788 1791 2 * OTX2_CPT_NAME_LENGTH, j); 1789 1792 pr_debug("Slot%d: %s", j, engs_info);
+2
drivers/dma-buf/dma-heap.c
··· 14 14 #include <linux/xarray.h> 15 15 #include <linux/list.h> 16 16 #include <linux/slab.h> 17 + #include <linux/nospec.h> 17 18 #include <linux/uaccess.h> 18 19 #include <linux/syscalls.h> 19 20 #include <linux/dma-heap.h> ··· 136 135 if (nr >= ARRAY_SIZE(dma_heap_ioctl_cmds)) 137 136 return -EINVAL; 138 137 138 + nr = array_index_nospec(nr, ARRAY_SIZE(dma_heap_ioctl_cmds)); 139 139 /* Get the kernel ioctl cmd that matches */ 140 140 kcmd = dma_heap_ioctl_cmds[nr]; 141 141
+1 -1
drivers/edac/altera_edac.c
··· 350 350 if (irq < 0) { 351 351 edac_printk(KERN_ERR, EDAC_MC, 352 352 "No irq %d in DT\n", irq); 353 - return -ENODEV; 353 + return irq; 354 354 } 355 355 356 356 /* Arria10 has a 2nd IRQ */
+1 -1
drivers/edac/xgene_edac.c
··· 1919 1919 irq = platform_get_irq_optional(pdev, i); 1920 1920 if (irq < 0) { 1921 1921 dev_err(&pdev->dev, "No IRQ resource\n"); 1922 - rc = -EINVAL; 1922 + rc = irq; 1923 1923 goto out_err; 1924 1924 } 1925 1925 rc = devm_request_irq(&pdev->dev, irq,
+8 -2
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 1408 1408 int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev); 1409 1409 1410 1410 void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps); 1411 - bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev); 1412 1411 void amdgpu_acpi_detect(void); 1413 1412 #else 1414 1413 static inline int amdgpu_acpi_init(struct amdgpu_device *adev) { return 0; } 1415 1414 static inline void amdgpu_acpi_fini(struct amdgpu_device *adev) { } 1416 - static inline bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) { return false; } 1417 1415 static inline void amdgpu_acpi_detect(void) { } 1418 1416 static inline bool amdgpu_acpi_is_power_shift_control_supported(void) { return false; } 1419 1417 static inline int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, 1420 1418 u8 dev_state, bool drv_state) { return 0; } 1421 1419 static inline int amdgpu_acpi_smart_shift_update(struct drm_device *dev, 1422 1420 enum amdgpu_ss ss_state) { return 0; } 1421 + #endif 1422 + 1423 + #if defined(CONFIG_ACPI) && defined(CONFIG_SUSPEND) 1424 + bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev); 1425 + bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev); 1426 + #else 1427 + static inline bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) { return false; } 1428 + static inline bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev) { return false; } 1423 1429 #endif 1424 1430 1425 1431 int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
+32 -5
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
··· 1031 1031 } 1032 1032 } 1033 1033 1034 + #if IS_ENABLED(CONFIG_SUSPEND) 1035 + /** 1036 + * amdgpu_acpi_is_s3_active 1037 + * 1038 + * @adev: amdgpu_device_pointer 1039 + * 1040 + * returns true if supported, false if not. 1041 + */ 1042 + bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev) 1043 + { 1044 + return !(adev->flags & AMD_IS_APU) || 1045 + (pm_suspend_target_state == PM_SUSPEND_MEM); 1046 + } 1047 + 1034 1048 /** 1035 1049 * amdgpu_acpi_is_s0ix_active 1036 1050 * ··· 1054 1040 */ 1055 1041 bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) 1056 1042 { 1057 - #if IS_ENABLED(CONFIG_AMD_PMC) && IS_ENABLED(CONFIG_SUSPEND) 1058 - if (acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) { 1059 - if (adev->flags & AMD_IS_APU) 1060 - return pm_suspend_target_state == PM_SUSPEND_TO_IDLE; 1043 + if (!(adev->flags & AMD_IS_APU) || 1044 + (pm_suspend_target_state != PM_SUSPEND_TO_IDLE)) 1045 + return false; 1046 + 1047 + if (!(acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0)) { 1048 + dev_warn_once(adev->dev, 1049 + "Power consumption will be higher as BIOS has not been configured for suspend-to-idle.\n" 1050 + "To use suspend-to-idle change the sleep mode in BIOS setup.\n"); 1051 + return false; 1061 1052 } 1062 - #endif 1053 + 1054 + #if !IS_ENABLED(CONFIG_AMD_PMC) 1055 + dev_warn_once(adev->dev, 1056 + "Power consumption will be higher as the kernel has not been compiled with CONFIG_AMD_PMC.\n"); 1063 1057 return false; 1058 + #else 1059 + return true; 1060 + #endif /* CONFIG_AMD_PMC */ 1064 1061 } 1062 + 1063 + #endif /* CONFIG_SUSPEND */
+9 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
··· 2246 2246 static int amdgpu_pmops_prepare(struct device *dev) 2247 2247 { 2248 2248 struct drm_device *drm_dev = dev_get_drvdata(dev); 2249 + struct amdgpu_device *adev = drm_to_adev(drm_dev); 2249 2250 2250 2251 /* Return a positive number here so 2251 2252 * DPM_FLAG_SMART_SUSPEND works properly 2252 2253 */ 2253 2254 if (amdgpu_device_supports_boco(drm_dev)) 2254 - return pm_runtime_suspended(dev) && 2255 - pm_suspend_via_firmware(); 2255 + return pm_runtime_suspended(dev); 2256 + 2257 + /* if we will not support s3 or s2i for the device 2258 + * then skip suspend 2259 + */ 2260 + if (!amdgpu_acpi_is_s0ix_active(adev) && 2261 + !amdgpu_acpi_is_s3_active(adev)) 2262 + return 1; 2256 2263 2257 2264 return 0; 2258 2265 }
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 1904 1904 unsigned i; 1905 1905 int r; 1906 1906 1907 - if (direct_submit && !ring->sched.ready) { 1907 + if (!direct_submit && !ring->sched.ready) { 1908 1908 DRM_ERROR("Trying to move memory with ring turned off.\n"); 1909 1909 return -EINVAL; 1910 1910 }
+3
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
··· 1140 1140 { 1141 1141 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1142 1142 1143 + if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 1, 3)) 1144 + return; 1145 + 1143 1146 adev->mmhub.funcs->get_clockgating(adev, flags); 1144 1147 1145 1148 if (adev->ip_versions[ATHUB_HWIP][0] >= IP_VERSION(2, 1, 0))
+8 -8
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/vg_clk_mgr.c
··· 570 570 .wm_inst = WM_A, 571 571 .wm_type = WM_TYPE_PSTATE_CHG, 572 572 .pstate_latency_us = 11.65333, 573 - .sr_exit_time_us = 7.95, 574 - .sr_enter_plus_exit_time_us = 9, 573 + .sr_exit_time_us = 13.5, 574 + .sr_enter_plus_exit_time_us = 16.5, 575 575 .valid = true, 576 576 }, 577 577 { 578 578 .wm_inst = WM_B, 579 579 .wm_type = WM_TYPE_PSTATE_CHG, 580 580 .pstate_latency_us = 11.65333, 581 - .sr_exit_time_us = 9.82, 582 - .sr_enter_plus_exit_time_us = 11.196, 581 + .sr_exit_time_us = 13.5, 582 + .sr_enter_plus_exit_time_us = 16.5, 583 583 .valid = true, 584 584 }, 585 585 { 586 586 .wm_inst = WM_C, 587 587 .wm_type = WM_TYPE_PSTATE_CHG, 588 588 .pstate_latency_us = 11.65333, 589 - .sr_exit_time_us = 9.89, 590 - .sr_enter_plus_exit_time_us = 11.24, 589 + .sr_exit_time_us = 13.5, 590 + .sr_enter_plus_exit_time_us = 16.5, 591 591 .valid = true, 592 592 }, 593 593 { 594 594 .wm_inst = WM_D, 595 595 .wm_type = WM_TYPE_PSTATE_CHG, 596 596 .pstate_latency_us = 11.65333, 597 - .sr_exit_time_us = 9.748, 598 - .sr_enter_plus_exit_time_us = 11.102, 597 + .sr_exit_time_us = 13.5, 598 + .sr_enter_plus_exit_time_us = 16.5, 599 599 .valid = true, 600 600 }, 601 601 }
+10 -10
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.c
··· 329 329 330 330 }; 331 331 332 - static struct wm_table ddr4_wm_table = { 332 + static struct wm_table ddr5_wm_table = { 333 333 .entries = { 334 334 { 335 335 .wm_inst = WM_A, 336 336 .wm_type = WM_TYPE_PSTATE_CHG, 337 337 .pstate_latency_us = 11.72, 338 - .sr_exit_time_us = 6.09, 339 - .sr_enter_plus_exit_time_us = 7.14, 338 + .sr_exit_time_us = 9, 339 + .sr_enter_plus_exit_time_us = 11, 340 340 .valid = true, 341 341 }, 342 342 { 343 343 .wm_inst = WM_B, 344 344 .wm_type = WM_TYPE_PSTATE_CHG, 345 345 .pstate_latency_us = 11.72, 346 - .sr_exit_time_us = 10.12, 347 - .sr_enter_plus_exit_time_us = 11.48, 346 + .sr_exit_time_us = 9, 347 + .sr_enter_plus_exit_time_us = 11, 348 348 .valid = true, 349 349 }, 350 350 { 351 351 .wm_inst = WM_C, 352 352 .wm_type = WM_TYPE_PSTATE_CHG, 353 353 .pstate_latency_us = 11.72, 354 - .sr_exit_time_us = 10.12, 355 - .sr_enter_plus_exit_time_us = 11.48, 354 + .sr_exit_time_us = 9, 355 + .sr_enter_plus_exit_time_us = 11, 356 356 .valid = true, 357 357 }, 358 358 { 359 359 .wm_inst = WM_D, 360 360 .wm_type = WM_TYPE_PSTATE_CHG, 361 361 .pstate_latency_us = 11.72, 362 - .sr_exit_time_us = 10.12, 363 - .sr_enter_plus_exit_time_us = 11.48, 362 + .sr_exit_time_us = 9, 363 + .sr_enter_plus_exit_time_us = 11, 364 364 .valid = true, 365 365 }, 366 366 } ··· 687 687 if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) { 688 688 dcn31_bw_params.wm_table = lpddr5_wm_table; 689 689 } else { 690 - dcn31_bw_params.wm_table = ddr4_wm_table; 690 + dcn31_bw_params.wm_table = ddr5_wm_table; 691 691 } 692 692 /* Saved clocks configured at boot for debug purposes */ 693 693 dcn31_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, &clk_mgr->base.base, &log_info);
-5
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
··· 1608 1608 pipe_ctx->stream_res.stream_enc, 1609 1609 pipe_ctx->stream_res.tg->inst); 1610 1610 1611 - if (dc_is_embedded_signal(pipe_ctx->stream->signal) && 1612 - pipe_ctx->stream_res.stream_enc->funcs->reset_fifo) 1613 - pipe_ctx->stream_res.stream_enc->funcs->reset_fifo( 1614 - pipe_ctx->stream_res.stream_enc); 1615 - 1616 1611 if (dc_is_dp_signal(pipe_ctx->stream->signal)) 1617 1612 dp_source_sequence_trace(link, DPCD_SOURCE_SEQ_AFTER_CONNECT_DIG_FE_OTG); 1618 1613
-15
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c
··· 902 902 903 903 } 904 904 905 - void enc1_stream_encoder_reset_fifo( 906 - struct stream_encoder *enc) 907 - { 908 - struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc); 909 - 910 - /* set DIG_START to 0x1 to reset FIFO */ 911 - REG_UPDATE(DIG_FE_CNTL, DIG_START, 1); 912 - udelay(100); 913 - 914 - /* write 0 to take the FIFO out of reset */ 915 - REG_UPDATE(DIG_FE_CNTL, DIG_START, 0); 916 - } 917 - 918 905 void enc1_stream_encoder_dp_blank( 919 906 struct dc_link *link, 920 907 struct stream_encoder *enc) ··· 1587 1600 enc1_stream_encoder_send_immediate_sdp_message, 1588 1601 .stop_dp_info_packets = 1589 1602 enc1_stream_encoder_stop_dp_info_packets, 1590 - .reset_fifo = 1591 - enc1_stream_encoder_reset_fifo, 1592 1603 .dp_blank = 1593 1604 enc1_stream_encoder_dp_blank, 1594 1605 .dp_unblank =
-3
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
··· 626 626 void enc1_stream_encoder_stop_dp_info_packets( 627 627 struct stream_encoder *enc); 628 628 629 - void enc1_stream_encoder_reset_fifo( 630 - struct stream_encoder *enc); 631 - 632 629 void enc1_stream_encoder_dp_blank( 633 630 struct dc_link *link, 634 631 struct stream_encoder *enc);
-2
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_stream_encoder.c
··· 593 593 enc1_stream_encoder_send_immediate_sdp_message, 594 594 .stop_dp_info_packets = 595 595 enc1_stream_encoder_stop_dp_info_packets, 596 - .reset_fifo = 597 - enc1_stream_encoder_reset_fifo, 598 596 .dp_blank = 599 597 enc1_stream_encoder_dp_blank, 600 598 .dp_unblank =
-2
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c
··· 789 789 enc3_stream_encoder_update_dp_info_packets, 790 790 .stop_dp_info_packets = 791 791 enc1_stream_encoder_stop_dp_info_packets, 792 - .reset_fifo = 793 - enc1_stream_encoder_reset_fifo, 794 792 .dp_blank = 795 793 enc1_stream_encoder_dp_blank, 796 794 .dp_unblank =
-4
drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h
··· 164 164 void (*stop_dp_info_packets)( 165 165 struct stream_encoder *enc); 166 166 167 - void (*reset_fifo)( 168 - struct stream_encoder *enc 169 - ); 170 - 171 167 void (*dp_blank)( 172 168 struct dc_link *link, 173 169 struct stream_encoder *enc);
+3 -3
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
··· 3696 3696 3697 3697 static int sienna_cichlid_enable_mgpu_fan_boost(struct smu_context *smu) 3698 3698 { 3699 - struct smu_table_context *table_context = &smu->smu_table; 3700 - PPTable_t *smc_pptable = table_context->driver_pptable; 3699 + uint16_t *mgpu_fan_boost_limit_rpm; 3701 3700 3701 + GET_PPTABLE_MEMBER(MGpuFanBoostLimitRpm, &mgpu_fan_boost_limit_rpm); 3702 3702 /* 3703 3703 * Skip the MGpuFanBoost setting for those ASICs 3704 3704 * which do not support it 3705 3705 */ 3706 - if (!smc_pptable->MGpuFanBoostLimitRpm) 3706 + if (*mgpu_fan_boost_limit_rpm == 0) 3707 3707 return 0; 3708 3708 3709 3709 return smu_cmn_send_smc_msg_with_param(smu,
+3
drivers/gpu/drm/i915/display/intel_overlay.c
··· 959 959 const struct intel_crtc_state *pipe_config = 960 960 overlay->crtc->config; 961 961 962 + if (rec->dst_height == 0 || rec->dst_width == 0) 963 + return -EINVAL; 964 + 962 965 if (rec->dst_x < pipe_config->pipe_src_w && 963 966 rec->dst_x + rec->dst_width <= pipe_config->pipe_src_w && 964 967 rec->dst_y < pipe_config->pipe_src_h &&
+2 -1
drivers/gpu/drm/i915/display/intel_tc.c
··· 345 345 static bool adl_tc_phy_status_complete(struct intel_digital_port *dig_port) 346 346 { 347 347 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 348 + enum tc_port tc_port = intel_port_to_tc(i915, dig_port->base.port); 348 349 struct intel_uncore *uncore = &i915->uncore; 349 350 u32 val; 350 351 351 - val = intel_uncore_read(uncore, TCSS_DDI_STATUS(dig_port->tc_phy_fia_idx)); 352 + val = intel_uncore_read(uncore, TCSS_DDI_STATUS(tc_port)); 352 353 if (val == 0xffffffff) { 353 354 drm_dbg_kms(&i915->drm, 354 355 "Port %s: PHY in TCCOLD, assuming not complete\n",
+7 -2
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
··· 2505 2505 timeout) < 0) { 2506 2506 i915_request_put(rq); 2507 2507 2508 - tl = intel_context_timeline_lock(ce); 2508 + /* 2509 + * Error path, cannot use intel_context_timeline_lock as 2510 + * that is user interruptable and this clean up step 2511 + * must be done. 2512 + */ 2513 + mutex_lock(&ce->timeline->mutex); 2509 2514 intel_context_exit(ce); 2510 - intel_context_timeline_unlock(tl); 2515 + mutex_unlock(&ce->timeline->mutex); 2511 2516 2512 2517 if (nonblock) 2513 2518 return -EWOULDBLOCK;
+5
drivers/gpu/drm/i915/gt/uc/intel_guc.h
··· 206 206 * context usage for overflows. 207 207 */ 208 208 struct delayed_work work; 209 + 210 + /** 211 + * @shift: Right shift value for the gpm timestamp 212 + */ 213 + u32 shift; 209 214 } timestamp; 210 215 211 216 #ifdef CONFIG_DRM_I915_SELFTEST
+97 -17
drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
··· 1113 1113 if (new_start == lower_32_bits(*prev_start)) 1114 1114 return; 1115 1115 1116 + /* 1117 + * When gt is unparked, we update the gt timestamp and start the ping 1118 + * worker that updates the gt_stamp every POLL_TIME_CLKS. As long as gt 1119 + * is unparked, all switched in contexts will have a start time that is 1120 + * within +/- POLL_TIME_CLKS of the most recent gt_stamp. 1121 + * 1122 + * If neither gt_stamp nor new_start has rolled over, then the 1123 + * gt_stamp_hi does not need to be adjusted, however if one of them has 1124 + * rolled over, we need to adjust gt_stamp_hi accordingly. 1125 + * 1126 + * The below conditions address the cases of new_start rollover and 1127 + * gt_stamp_last rollover respectively. 1128 + */ 1116 1129 if (new_start < gt_stamp_last && 1117 1130 (new_start - gt_stamp_last) <= POLL_TIME_CLKS) 1118 1131 gt_stamp_hi++; ··· 1137 1124 *prev_start = ((u64)gt_stamp_hi << 32) | new_start; 1138 1125 } 1139 1126 1140 - static void guc_update_engine_gt_clks(struct intel_engine_cs *engine) 1127 + /* 1128 + * GuC updates shared memory and KMD reads it. Since this is not synchronized, 1129 + * we run into a race where the value read is inconsistent. Sometimes the 1130 + * inconsistency is in reading the upper MSB bytes of the last_in value when 1131 + * this race occurs. 2 types of cases are seen - upper 8 bits are zero and upper 1132 + * 24 bits are zero. Since these are non-zero values, it is non-trivial to 1133 + * determine validity of these values. Instead we read the values multiple times 1134 + * until they are consistent. In test runs, 3 attempts results in consistent 1135 + * values. The upper bound is set to 6 attempts and may need to be tuned as per 1136 + * any new occurences. 1137 + */ 1138 + static void __get_engine_usage_record(struct intel_engine_cs *engine, 1139 + u32 *last_in, u32 *id, u32 *total) 1141 1140 { 1142 1141 struct guc_engine_usage_record *rec = intel_guc_engine_usage(engine); 1142 + int i = 0; 1143 + 1144 + do { 1145 + *last_in = READ_ONCE(rec->last_switch_in_stamp); 1146 + *id = READ_ONCE(rec->current_context_index); 1147 + *total = READ_ONCE(rec->total_runtime); 1148 + 1149 + if (READ_ONCE(rec->last_switch_in_stamp) == *last_in && 1150 + READ_ONCE(rec->current_context_index) == *id && 1151 + READ_ONCE(rec->total_runtime) == *total) 1152 + break; 1153 + } while (++i < 6); 1154 + } 1155 + 1156 + static void guc_update_engine_gt_clks(struct intel_engine_cs *engine) 1157 + { 1143 1158 struct intel_engine_guc_stats *stats = &engine->stats.guc; 1144 1159 struct intel_guc *guc = &engine->gt->uc.guc; 1145 - u32 last_switch = rec->last_switch_in_stamp; 1146 - u32 ctx_id = rec->current_context_index; 1147 - u32 total = rec->total_runtime; 1160 + u32 last_switch, ctx_id, total; 1148 1161 1149 1162 lockdep_assert_held(&guc->timestamp.lock); 1163 + 1164 + __get_engine_usage_record(engine, &last_switch, &ctx_id, &total); 1150 1165 1151 1166 stats->running = ctx_id != ~0U && last_switch; 1152 1167 if (stats->running) ··· 1190 1149 } 1191 1150 } 1192 1151 1193 - static void guc_update_pm_timestamp(struct intel_guc *guc, 1194 - struct intel_engine_cs *engine, 1195 - ktime_t *now) 1152 + static u32 gpm_timestamp_shift(struct intel_gt *gt) 1196 1153 { 1197 - u32 gt_stamp_now, gt_stamp_hi; 1154 + intel_wakeref_t wakeref; 1155 + u32 reg, shift; 1156 + 1157 + with_intel_runtime_pm(gt->uncore->rpm, wakeref) 1158 + reg = intel_uncore_read(gt->uncore, RPM_CONFIG0); 1159 + 1160 + shift = (reg & GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK) >> 1161 + GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT; 1162 + 1163 + return 3 - shift; 1164 + } 1165 + 1166 + static u64 gpm_timestamp(struct intel_gt *gt) 1167 + { 1168 + u32 lo, hi, old_hi, loop = 0; 1169 + 1170 + hi = intel_uncore_read(gt->uncore, MISC_STATUS1); 1171 + do { 1172 + lo = intel_uncore_read(gt->uncore, MISC_STATUS0); 1173 + old_hi = hi; 1174 + hi = intel_uncore_read(gt->uncore, MISC_STATUS1); 1175 + } while (old_hi != hi && loop++ < 2); 1176 + 1177 + return ((u64)hi << 32) | lo; 1178 + } 1179 + 1180 + static void guc_update_pm_timestamp(struct intel_guc *guc, ktime_t *now) 1181 + { 1182 + struct intel_gt *gt = guc_to_gt(guc); 1183 + u32 gt_stamp_lo, gt_stamp_hi; 1184 + u64 gpm_ts; 1198 1185 1199 1186 lockdep_assert_held(&guc->timestamp.lock); 1200 1187 1201 1188 gt_stamp_hi = upper_32_bits(guc->timestamp.gt_stamp); 1202 - gt_stamp_now = intel_uncore_read(engine->uncore, 1203 - RING_TIMESTAMP(engine->mmio_base)); 1189 + gpm_ts = gpm_timestamp(gt) >> guc->timestamp.shift; 1190 + gt_stamp_lo = lower_32_bits(gpm_ts); 1204 1191 *now = ktime_get(); 1205 1192 1206 - if (gt_stamp_now < lower_32_bits(guc->timestamp.gt_stamp)) 1193 + if (gt_stamp_lo < lower_32_bits(guc->timestamp.gt_stamp)) 1207 1194 gt_stamp_hi++; 1208 1195 1209 - guc->timestamp.gt_stamp = ((u64)gt_stamp_hi << 32) | gt_stamp_now; 1196 + guc->timestamp.gt_stamp = ((u64)gt_stamp_hi << 32) | gt_stamp_lo; 1210 1197 } 1211 1198 1212 1199 /* ··· 1277 1208 if (!in_reset && intel_gt_pm_get_if_awake(gt)) { 1278 1209 stats_saved = *stats; 1279 1210 gt_stamp_saved = guc->timestamp.gt_stamp; 1211 + /* 1212 + * Update gt_clks, then gt timestamp to simplify the 'gt_stamp - 1213 + * start_gt_clk' calculation below for active engines. 1214 + */ 1280 1215 guc_update_engine_gt_clks(engine); 1281 - guc_update_pm_timestamp(guc, engine, now); 1216 + guc_update_pm_timestamp(guc, now); 1282 1217 intel_gt_pm_put_async(gt); 1283 1218 if (i915_reset_count(gpu_error) != reset_count) { 1284 1219 *stats = stats_saved; ··· 1314 1241 1315 1242 spin_lock_irqsave(&guc->timestamp.lock, flags); 1316 1243 1244 + guc_update_pm_timestamp(guc, &unused); 1317 1245 for_each_engine(engine, gt, id) { 1318 - guc_update_pm_timestamp(guc, engine, &unused); 1319 1246 guc_update_engine_gt_clks(engine); 1320 1247 engine->stats.guc.prev_total = 0; 1321 1248 } ··· 1332 1259 ktime_t unused; 1333 1260 1334 1261 spin_lock_irqsave(&guc->timestamp.lock, flags); 1335 - for_each_engine(engine, gt, id) { 1336 - guc_update_pm_timestamp(guc, engine, &unused); 1262 + 1263 + guc_update_pm_timestamp(guc, &unused); 1264 + for_each_engine(engine, gt, id) 1337 1265 guc_update_engine_gt_clks(engine); 1338 - } 1266 + 1339 1267 spin_unlock_irqrestore(&guc->timestamp.lock, flags); 1340 1268 } 1341 1269 ··· 1409 1335 void intel_guc_busyness_unpark(struct intel_gt *gt) 1410 1336 { 1411 1337 struct intel_guc *guc = &gt->uc.guc; 1338 + unsigned long flags; 1339 + ktime_t unused; 1412 1340 1413 1341 if (!guc_submission_initialized(guc)) 1414 1342 return; 1415 1343 1344 + spin_lock_irqsave(&guc->timestamp.lock, flags); 1345 + guc_update_pm_timestamp(guc, &unused); 1346 + spin_unlock_irqrestore(&guc->timestamp.lock, flags); 1416 1347 mod_delayed_work(system_highpri_wq, &guc->timestamp.work, 1417 1348 guc->timestamp.ping_delay); 1418 1349 } ··· 1862 1783 spin_lock_init(&guc->timestamp.lock); 1863 1784 INIT_DELAYED_WORK(&guc->timestamp.work, guc_timestamp_ping); 1864 1785 guc->timestamp.ping_delay = (POLL_TIME_CLKS / gt->clock_frequency + 1) * HZ; 1786 + guc->timestamp.shift = gpm_timestamp_shift(gt); 1865 1787 1866 1788 return 0; 1867 1789 }
+1 -1
drivers/gpu/drm/i915/i915_gpu_error.c
··· 1522 1522 struct i915_request *rq = NULL; 1523 1523 unsigned long flags; 1524 1524 1525 - ee = intel_engine_coredump_alloc(engine, GFP_KERNEL); 1525 + ee = intel_engine_coredump_alloc(engine, ALLOW_FAIL); 1526 1526 if (!ee) 1527 1527 return NULL; 1528 1528
+2 -1
drivers/gpu/drm/i915/i915_reg.h
··· 2684 2684 #define RING_WAIT (1 << 11) /* gen3+, PRBx_CTL */ 2685 2685 #define RING_WAIT_SEMAPHORE (1 << 10) /* gen6+ */ 2686 2686 2687 - #define GUCPMTIMESTAMP _MMIO(0xC3E8) 2687 + #define MISC_STATUS0 _MMIO(0xA500) 2688 + #define MISC_STATUS1 _MMIO(0xA504) 2688 2689 2689 2690 /* There are 16 64-bit CS General Purpose Registers per-engine on Gen8+ */ 2690 2691 #define GEN8_RING_CS_GPR(base, n) _MMIO((base) + 0x600 + (n) * 8)
-6
drivers/gpu/drm/kmb/kmb_plane.c
··· 158 158 case LAYER_1: 159 159 kmb->plane_status[plane_id].ctrl = LCD_CTRL_VL2_ENABLE; 160 160 break; 161 - case LAYER_2: 162 - kmb->plane_status[plane_id].ctrl = LCD_CTRL_GL1_ENABLE; 163 - break; 164 - case LAYER_3: 165 - kmb->plane_status[plane_id].ctrl = LCD_CTRL_GL2_ENABLE; 166 - break; 167 161 } 168 162 169 163 kmb->plane_status[plane_id].disable = true;
+5 -1
drivers/gpu/drm/mxsfb/mxsfb_kms.c
··· 361 361 bridge_state = 362 362 drm_atomic_get_new_bridge_state(state, 363 363 mxsfb->bridge); 364 - bus_format = bridge_state->input_bus_cfg.format; 364 + if (!bridge_state) 365 + bus_format = MEDIA_BUS_FMT_FIXED; 366 + else 367 + bus_format = bridge_state->input_bus_cfg.format; 368 + 365 369 if (bus_format == MEDIA_BUS_FMT_FIXED) { 366 370 dev_warn_once(drm->dev, 367 371 "Bridge does not provide bus format, assuming MEDIA_BUS_FMT_RGB888_1X24.\n"
+1 -1
drivers/gpu/drm/nouveau/nvkm/subdev/bios/base.c
··· 38 38 *addr += bios->imaged_addr; 39 39 } 40 40 41 - if (unlikely(*addr + size >= bios->size)) { 41 + if (unlikely(*addr + size > bios->size)) { 42 42 nvkm_error(&bios->subdev, "OOB %d %08x %08x\n", size, p, *addr); 43 43 return false; 44 44 }
+1 -1
drivers/infiniband/core/cm.c
··· 3322 3322 ret = cm_init_av_by_path(param->alternate_path, NULL, &alt_av); 3323 3323 if (ret) { 3324 3324 rdma_destroy_ah_attr(&ah_attr); 3325 - return -EINVAL; 3325 + goto deref; 3326 3326 } 3327 3327 3328 3328 spin_lock_irq(&cm_id_priv->lock);
+12 -10
drivers/infiniband/core/cma.c
··· 67 67 [RDMA_CM_EVENT_TIMEWAIT_EXIT] = "timewait exit", 68 68 }; 69 69 70 - static void cma_set_mgid(struct rdma_id_private *id_priv, struct sockaddr *addr, 71 - union ib_gid *mgid); 70 + static void cma_iboe_set_mgid(struct sockaddr *addr, union ib_gid *mgid, 71 + enum ib_gid_type gid_type); 72 72 73 73 const char *__attribute_const__ rdma_event_msg(enum rdma_cm_event_type event) 74 74 { ··· 1846 1846 if (dev_addr->bound_dev_if) 1847 1847 ndev = dev_get_by_index(dev_addr->net, 1848 1848 dev_addr->bound_dev_if); 1849 - if (ndev) { 1849 + if (ndev && !send_only) { 1850 + enum ib_gid_type gid_type; 1850 1851 union ib_gid mgid; 1851 1852 1852 - cma_set_mgid(id_priv, (struct sockaddr *)&mc->addr, 1853 - &mgid); 1854 - 1855 - if (!send_only) 1856 - cma_igmp_send(ndev, &mgid, false); 1857 - 1858 - dev_put(ndev); 1853 + gid_type = id_priv->cma_dev->default_gid_type 1854 + [id_priv->id.port_num - 1855 + rdma_start_port( 1856 + id_priv->cma_dev->device)]; 1857 + cma_iboe_set_mgid((struct sockaddr *)&mc->addr, &mgid, 1858 + gid_type); 1859 + cma_igmp_send(ndev, &mgid, false); 1859 1860 } 1861 + dev_put(ndev); 1860 1862 1861 1863 cancel_work_sync(&mc->iboe_join.work); 1862 1864 }
+23 -11
drivers/infiniband/core/ucma.c
··· 95 95 u64 uid; 96 96 97 97 struct list_head list; 98 + struct list_head mc_list; 98 99 struct work_struct close_work; 99 100 }; 100 101 ··· 106 105 107 106 u64 uid; 108 107 u8 join_state; 108 + struct list_head list; 109 109 struct sockaddr_storage addr; 110 110 }; 111 111 ··· 200 198 201 199 INIT_WORK(&ctx->close_work, ucma_close_id); 202 200 init_completion(&ctx->comp); 201 + INIT_LIST_HEAD(&ctx->mc_list); 203 202 /* So list_del() will work if we don't do ucma_finish_ctx() */ 204 203 INIT_LIST_HEAD(&ctx->list); 205 204 ctx->file = file; ··· 487 484 488 485 static void ucma_cleanup_multicast(struct ucma_context *ctx) 489 486 { 490 - struct ucma_multicast *mc; 491 - unsigned long index; 487 + struct ucma_multicast *mc, *tmp; 492 488 493 - xa_for_each(&multicast_table, index, mc) { 494 - if (mc->ctx != ctx) 495 - continue; 489 + xa_lock(&multicast_table); 490 + list_for_each_entry_safe(mc, tmp, &ctx->mc_list, list) { 491 + list_del(&mc->list); 496 492 /* 497 493 * At this point mc->ctx->ref is 0 so the mc cannot leave the 498 494 * lock on the reader and this is enough serialization 499 495 */ 500 - xa_erase(&multicast_table, index); 496 + __xa_erase(&multicast_table, mc->id); 501 497 kfree(mc); 502 498 } 499 + xa_unlock(&multicast_table); 503 500 } 504 501 505 502 static void ucma_cleanup_mc_events(struct ucma_multicast *mc) ··· 1472 1469 mc->uid = cmd->uid; 1473 1470 memcpy(&mc->addr, addr, cmd->addr_size); 1474 1471 1475 - if (xa_alloc(&multicast_table, &mc->id, NULL, xa_limit_32b, 1472 + xa_lock(&multicast_table); 1473 + if (__xa_alloc(&multicast_table, &mc->id, NULL, xa_limit_32b, 1476 1474 GFP_KERNEL)) { 1477 1475 ret = -ENOMEM; 1478 1476 goto err_free_mc; 1479 1477 } 1478 + 1479 + list_add_tail(&mc->list, &ctx->mc_list); 1480 + xa_unlock(&multicast_table); 1480 1481 1481 1482 mutex_lock(&ctx->mutex); 1482 1483 ret = rdma_join_multicast(ctx->cm_id, (struct sockaddr *)&mc->addr, ··· 1507 1500 mutex_unlock(&ctx->mutex); 1508 1501 ucma_cleanup_mc_events(mc); 1509 1502 err_xa_erase: 1510 - xa_erase(&multicast_table, mc->id); 1503 + xa_lock(&multicast_table); 1504 + list_del(&mc->list); 1505 + __xa_erase(&multicast_table, mc->id); 1511 1506 err_free_mc: 1507 + xa_unlock(&multicast_table); 1512 1508 kfree(mc); 1513 1509 err_put_ctx: 1514 1510 ucma_put_ctx(ctx); ··· 1579 1569 mc = ERR_PTR(-EINVAL); 1580 1570 else if (!refcount_inc_not_zero(&mc->ctx->ref)) 1581 1571 mc = ERR_PTR(-ENXIO); 1582 - else 1583 - __xa_erase(&multicast_table, mc->id); 1584 - xa_unlock(&multicast_table); 1585 1572 1586 1573 if (IS_ERR(mc)) { 1574 + xa_unlock(&multicast_table); 1587 1575 ret = PTR_ERR(mc); 1588 1576 goto out; 1589 1577 } 1578 + 1579 + list_del(&mc->list); 1580 + __xa_erase(&multicast_table, mc->id); 1581 + xa_unlock(&multicast_table); 1590 1582 1591 1583 mutex_lock(&mc->ctx->mutex); 1592 1584 rdma_leave_multicast(mc->ctx->cm_id, (struct sockaddr *) &mc->addr);
+1 -1
drivers/infiniband/hw/hfi1/ipoib.h
··· 55 55 */ 56 56 struct ipoib_txreq { 57 57 struct sdma_txreq txreq; 58 - struct hfi1_sdma_header sdma_hdr; 58 + struct hfi1_sdma_header *sdma_hdr; 59 59 int sdma_status; 60 60 int complete; 61 61 struct hfi1_ipoib_dev_priv *priv;
+15 -12
drivers/infiniband/hw/hfi1/ipoib_main.c
··· 22 22 int ret; 23 23 24 24 dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); 25 + if (!dev->tstats) 26 + return -ENOMEM; 25 27 26 28 ret = priv->netdev_ops->ndo_init(dev); 27 29 if (ret) 28 - return ret; 30 + goto out_ret; 29 31 30 32 ret = hfi1_netdev_add_data(priv->dd, 31 33 qpn_from_mac(priv->netdev->dev_addr), 32 34 dev); 33 35 if (ret < 0) { 34 36 priv->netdev_ops->ndo_uninit(dev); 35 - return ret; 37 + goto out_ret; 36 38 } 37 39 38 40 return 0; 41 + out_ret: 42 + free_percpu(dev->tstats); 43 + dev->tstats = NULL; 44 + return ret; 39 45 } 40 46 41 47 static void hfi1_ipoib_dev_uninit(struct net_device *dev) 42 48 { 43 49 struct hfi1_ipoib_dev_priv *priv = hfi1_ipoib_priv(dev); 50 + 51 + free_percpu(dev->tstats); 52 + dev->tstats = NULL; 44 53 45 54 hfi1_netdev_remove_data(priv->dd, qpn_from_mac(priv->netdev->dev_addr)); 46 55 ··· 175 166 hfi1_ipoib_rxq_deinit(priv->netdev); 176 167 177 168 free_percpu(dev->tstats); 178 - } 179 - 180 - static void hfi1_ipoib_free_rdma_netdev(struct net_device *dev) 181 - { 182 - hfi1_ipoib_netdev_dtor(dev); 183 - free_netdev(dev); 169 + dev->tstats = NULL; 184 170 } 185 171 186 172 static void hfi1_ipoib_set_id(struct net_device *dev, int id) ··· 215 211 priv->port_num = port_num; 216 212 priv->netdev_ops = netdev->netdev_ops; 217 213 218 - netdev->netdev_ops = &hfi1_ipoib_netdev_ops; 219 - 220 214 ib_query_pkey(device, port_num, priv->pkey_index, &priv->pkey); 221 215 222 216 rc = hfi1_ipoib_txreq_init(priv); 223 217 if (rc) { 224 218 dd_dev_err(dd, "IPoIB netdev TX init - failed(%d)\n", rc); 225 - hfi1_ipoib_free_rdma_netdev(netdev); 226 219 return rc; 227 220 } 228 221 229 222 rc = hfi1_ipoib_rxq_init(netdev); 230 223 if (rc) { 231 224 dd_dev_err(dd, "IPoIB netdev RX init - failed(%d)\n", rc); 232 - hfi1_ipoib_free_rdma_netdev(netdev); 225 + hfi1_ipoib_txreq_deinit(priv); 233 226 return rc; 234 227 } 228 + 229 + netdev->netdev_ops = &hfi1_ipoib_netdev_ops; 235 230 236 231 netdev->priv_destructor = hfi1_ipoib_netdev_dtor; 237 232 netdev->needs_free_netdev = true;
+26 -12
drivers/infiniband/hw/hfi1/ipoib_tx.c
··· 122 122 dd_dev_warn(priv->dd, 123 123 "%s: Status = 0x%x pbc 0x%llx txq = %d sde = %d\n", 124 124 __func__, tx->sdma_status, 125 - le64_to_cpu(tx->sdma_hdr.pbc), tx->txq->q_idx, 125 + le64_to_cpu(tx->sdma_hdr->pbc), tx->txq->q_idx, 126 126 tx->txq->sde->this_idx); 127 127 } 128 128 ··· 231 231 { 232 232 struct hfi1_devdata *dd = txp->dd; 233 233 struct sdma_txreq *txreq = &tx->txreq; 234 - struct hfi1_sdma_header *sdma_hdr = &tx->sdma_hdr; 234 + struct hfi1_sdma_header *sdma_hdr = tx->sdma_hdr; 235 235 u16 pkt_bytes = 236 236 sizeof(sdma_hdr->pbc) + (txp->hdr_dwords << 2) + tx->skb->len; 237 237 int ret; ··· 256 256 struct ipoib_txparms *txp) 257 257 { 258 258 struct hfi1_ipoib_dev_priv *priv = tx->txq->priv; 259 - struct hfi1_sdma_header *sdma_hdr = &tx->sdma_hdr; 259 + struct hfi1_sdma_header *sdma_hdr = tx->sdma_hdr; 260 260 struct sk_buff *skb = tx->skb; 261 261 struct hfi1_pportdata *ppd = ppd_from_ibp(txp->ibp); 262 262 struct rdma_ah_attr *ah_attr = txp->ah_attr; ··· 483 483 if (likely(!ret)) { 484 484 tx_ok: 485 485 trace_sdma_output_ibhdr(txq->priv->dd, 486 - &tx->sdma_hdr.hdr, 486 + &tx->sdma_hdr->hdr, 487 487 ib_is_sc5(txp->flow.sc5)); 488 488 hfi1_ipoib_check_queue_depth(txq); 489 489 return NETDEV_TX_OK; ··· 547 547 hfi1_ipoib_check_queue_depth(txq); 548 548 549 549 trace_sdma_output_ibhdr(txq->priv->dd, 550 - &tx->sdma_hdr.hdr, 550 + &tx->sdma_hdr->hdr, 551 551 ib_is_sc5(txp->flow.sc5)); 552 552 553 553 if (!netdev_xmit_more()) ··· 683 683 { 684 684 struct net_device *dev = priv->netdev; 685 685 u32 tx_ring_size, tx_item_size; 686 - int i; 686 + struct hfi1_ipoib_circ_buf *tx_ring; 687 + int i, j; 687 688 688 689 /* 689 690 * Ring holds 1 less than tx_ring_size ··· 702 701 703 702 for (i = 0; i < dev->num_tx_queues; i++) { 704 703 struct hfi1_ipoib_txq *txq = &priv->txqs[i]; 704 + struct ipoib_txreq *tx; 705 705 706 + tx_ring = &txq->tx_ring; 706 707 iowait_init(&txq->wait, 707 708 0, 708 709 hfi1_ipoib_flush_txq, ··· 728 725 priv->dd->node); 729 726 730 727 txq->tx_ring.items = 731 - kcalloc_node(tx_ring_size, tx_item_size, 732 - GFP_KERNEL, priv->dd->node); 728 + kvzalloc_node(array_size(tx_ring_size, tx_item_size), 729 + GFP_KERNEL, priv->dd->node); 733 730 if (!txq->tx_ring.items) 734 731 goto free_txqs; 735 732 736 733 txq->tx_ring.max_items = tx_ring_size; 737 - txq->tx_ring.shift = ilog2(tx_ring_size); 734 + txq->tx_ring.shift = ilog2(tx_item_size); 738 735 txq->tx_ring.avail = hfi1_ipoib_ring_hwat(txq); 736 + tx_ring = &txq->tx_ring; 737 + for (j = 0; j < tx_ring_size; j++) 738 + hfi1_txreq_from_idx(tx_ring, j)->sdma_hdr = 739 + kzalloc_node(sizeof(*tx->sdma_hdr), 740 + GFP_KERNEL, priv->dd->node); 739 741 740 742 netif_tx_napi_add(dev, &txq->napi, 741 743 hfi1_ipoib_poll_tx_ring, ··· 754 746 struct hfi1_ipoib_txq *txq = &priv->txqs[i]; 755 747 756 748 netif_napi_del(&txq->napi); 757 - kfree(txq->tx_ring.items); 749 + tx_ring = &txq->tx_ring; 750 + for (j = 0; j < tx_ring_size; j++) 751 + kfree(hfi1_txreq_from_idx(tx_ring, j)->sdma_hdr); 752 + kvfree(tx_ring->items); 758 753 } 759 754 760 755 kfree(priv->txqs); ··· 791 780 792 781 void hfi1_ipoib_txreq_deinit(struct hfi1_ipoib_dev_priv *priv) 793 782 { 794 - int i; 783 + int i, j; 795 784 796 785 for (i = 0; i < priv->netdev->num_tx_queues; i++) { 797 786 struct hfi1_ipoib_txq *txq = &priv->txqs[i]; 787 + struct hfi1_ipoib_circ_buf *tx_ring = &txq->tx_ring; 798 788 799 789 iowait_cancel_work(&txq->wait); 800 790 iowait_sdma_drain(&txq->wait); 801 791 hfi1_ipoib_drain_tx_list(txq); 802 792 netif_napi_del(&txq->napi); 803 793 hfi1_ipoib_drain_tx_ring(txq); 804 - kfree(txq->tx_ring.items); 794 + for (j = 0; j < tx_ring->max_items; j++) 795 + kfree(hfi1_txreq_from_idx(tx_ring, j)->sdma_hdr); 796 + kvfree(tx_ring->items); 805 797 } 806 798 807 799 kfree(priv->txqs);
+1 -1
drivers/infiniband/hw/mlx4/main.c
··· 3237 3237 case MLX4_DEV_EVENT_PORT_MGMT_CHANGE: 3238 3238 ew = kmalloc(sizeof *ew, GFP_ATOMIC); 3239 3239 if (!ew) 3240 - break; 3240 + return; 3241 3241 3242 3242 INIT_WORK(&ew->work, handle_port_mgmt_change_event); 3243 3243 memcpy(&ew->ib_eqe, eqe, sizeof *eqe);
+2
drivers/infiniband/sw/rdmavt/qp.c
··· 3073 3073 case IB_WR_ATOMIC_FETCH_AND_ADD: 3074 3074 if (unlikely(!(qp->qp_access_flags & IB_ACCESS_REMOTE_ATOMIC))) 3075 3075 goto inv_err; 3076 + if (unlikely(wqe->atomic_wr.remote_addr & (sizeof(u64) - 1))) 3077 + goto inv_err; 3076 3078 if (unlikely(!rvt_rkey_ok(qp, &qp->r_sge.sge, sizeof(u64), 3077 3079 wqe->atomic_wr.remote_addr, 3078 3080 wqe->atomic_wr.rkey,
+1 -6
drivers/infiniband/sw/siw/siw.h
··· 644 644 return &qp->orq[qp->orq_get % qp->attrs.orq_size]; 645 645 } 646 646 647 - static inline struct siw_sqe *orq_get_tail(struct siw_qp *qp) 648 - { 649 - return &qp->orq[qp->orq_put % qp->attrs.orq_size]; 650 - } 651 - 652 647 static inline struct siw_sqe *orq_get_free(struct siw_qp *qp) 653 648 { 654 - struct siw_sqe *orq_e = orq_get_tail(qp); 649 + struct siw_sqe *orq_e = &qp->orq[qp->orq_put % qp->attrs.orq_size]; 655 650 656 651 if (READ_ONCE(orq_e->flags) == 0) 657 652 return orq_e;
+11 -9
drivers/infiniband/sw/siw/siw_qp_rx.c
··· 1153 1153 1154 1154 spin_lock_irqsave(&qp->orq_lock, flags); 1155 1155 1156 - rreq = orq_get_current(qp); 1157 - 1158 1156 /* free current orq entry */ 1157 + rreq = orq_get_current(qp); 1159 1158 WRITE_ONCE(rreq->flags, 0); 1159 + 1160 + qp->orq_get++; 1160 1161 1161 1162 if (qp->tx_ctx.orq_fence) { 1162 1163 if (unlikely(tx_waiting->wr_status != SIW_WR_QUEUED)) { ··· 1166 1165 rv = -EPROTO; 1167 1166 goto out; 1168 1167 } 1169 - /* resume SQ processing */ 1168 + /* resume SQ processing, if possible */ 1170 1169 if (tx_waiting->sqe.opcode == SIW_OP_READ || 1171 1170 tx_waiting->sqe.opcode == SIW_OP_READ_LOCAL_INV) { 1172 - rreq = orq_get_tail(qp); 1171 + 1172 + /* SQ processing was stopped because of a full ORQ */ 1173 + rreq = orq_get_free(qp); 1173 1174 if (unlikely(!rreq)) { 1174 1175 pr_warn("siw: [QP %u]: no ORQE\n", qp_id(qp)); 1175 1176 rv = -EPROTO; ··· 1184 1181 resume_tx = 1; 1185 1182 1186 1183 } else if (siw_orq_empty(qp)) { 1184 + /* 1185 + * SQ processing was stopped by fenced work request. 1186 + * Resume since all previous Read's are now completed. 1187 + */ 1187 1188 qp->tx_ctx.orq_fence = 0; 1188 1189 resume_tx = 1; 1189 - } else { 1190 - pr_warn("siw: [QP %u]: fence resume: orq idx: %d:%d\n", 1191 - qp_id(qp), qp->orq_get, qp->orq_put); 1192 - rv = -EPROTO; 1193 1190 } 1194 1191 } 1195 - qp->orq_get++; 1196 1192 out: 1197 1193 spin_unlock_irqrestore(&qp->orq_lock, flags); 1198 1194
+2 -1
drivers/infiniband/sw/siw/siw_verbs.c
··· 313 313 314 314 if (atomic_inc_return(&sdev->num_qp) > SIW_MAX_QP) { 315 315 siw_dbg(base_dev, "too many QP's\n"); 316 - return -ENOMEM; 316 + rv = -ENOMEM; 317 + goto err_atomic; 317 318 } 318 319 if (attrs->qp_type != IB_QPT_RC) { 319 320 siw_dbg(base_dev, "only RC QP's supported\n");
+3 -9
drivers/input/touchscreen/wm97xx-core.c
··· 615 615 * extensions) 616 616 */ 617 617 wm->touch_dev = platform_device_alloc("wm97xx-touch", -1); 618 - if (!wm->touch_dev) { 619 - ret = -ENOMEM; 620 - goto touch_err; 621 - } 618 + if (!wm->touch_dev) 619 + return -ENOMEM; 620 + 622 621 platform_set_drvdata(wm->touch_dev, wm); 623 622 wm->touch_dev->dev.parent = wm->dev; 624 623 wm->touch_dev->dev.platform_data = pdata; ··· 628 629 return 0; 629 630 touch_reg_err: 630 631 platform_device_put(wm->touch_dev); 631 - touch_err: 632 - input_unregister_device(wm->input_dev); 633 - wm->input_dev = NULL; 634 632 635 633 return ret; 636 634 } ··· 635 639 static void wm97xx_unregister_touch(struct wm97xx *wm) 636 640 { 637 641 platform_device_unregister(wm->touch_dev); 638 - input_unregister_device(wm->input_dev); 639 - wm->input_dev = NULL; 640 642 } 641 643 642 644 static int _wm97xx_probe(struct wm97xx *wm)
+2
drivers/iommu/amd/init.c
··· 21 21 #include <linux/export.h> 22 22 #include <linux/kmemleak.h> 23 23 #include <linux/cc_platform.h> 24 + #include <linux/iopoll.h> 24 25 #include <asm/pci-direct.h> 25 26 #include <asm/iommu.h> 26 27 #include <asm/apic.h> ··· 835 834 status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET); 836 835 if (status & (MMIO_STATUS_GALOG_RUN_MASK)) 837 836 break; 837 + udelay(10); 838 838 } 839 839 840 840 if (WARN_ON(i >= LOOP_TIMEOUT))
+10 -3
drivers/iommu/intel/irq_remapping.c
··· 569 569 fn, &intel_ir_domain_ops, 570 570 iommu); 571 571 if (!iommu->ir_domain) { 572 - irq_domain_free_fwnode(fn); 573 572 pr_err("IR%d: failed to allocate irqdomain\n", iommu->seq_id); 574 - goto out_free_bitmap; 573 + goto out_free_fwnode; 575 574 } 576 575 iommu->ir_msi_domain = 577 576 arch_create_remap_msi_irq_domain(iommu->ir_domain, ··· 594 595 595 596 if (dmar_enable_qi(iommu)) { 596 597 pr_err("Failed to enable queued invalidation\n"); 597 - goto out_free_bitmap; 598 + goto out_free_ir_domain; 598 599 } 599 600 } 600 601 ··· 618 619 619 620 return 0; 620 621 622 + out_free_ir_domain: 623 + if (iommu->ir_msi_domain) 624 + irq_domain_remove(iommu->ir_msi_domain); 625 + iommu->ir_msi_domain = NULL; 626 + irq_domain_remove(iommu->ir_domain); 627 + iommu->ir_domain = NULL; 628 + out_free_fwnode: 629 + irq_domain_free_fwnode(fn); 621 630 out_free_bitmap: 622 631 bitmap_free(bitmap); 623 632 out_free_pages:
+1
drivers/iommu/ioasid.c
··· 349 349 350 350 /** 351 351 * ioasid_get - obtain a reference to the IOASID 352 + * @ioasid: the ID to get 352 353 */ 353 354 void ioasid_get(ioasid_t ioasid) 354 355 {
+19 -14
drivers/iommu/iommu.c
··· 207 207 208 208 static void dev_iommu_free(struct device *dev) 209 209 { 210 - iommu_fwspec_free(dev); 211 - kfree(dev->iommu); 210 + struct dev_iommu *param = dev->iommu; 211 + 212 212 dev->iommu = NULL; 213 + if (param->fwspec) { 214 + fwnode_handle_put(param->fwspec->iommu_fwnode); 215 + kfree(param->fwspec); 216 + } 217 + kfree(param); 213 218 } 214 219 215 220 static int __iommu_probe_device(struct device *dev, struct list_head *group_list) ··· 985 980 return ret; 986 981 } 987 982 988 - /** 989 - * iommu_group_for_each_dev - iterate over each device in the group 990 - * @group: the group 991 - * @data: caller opaque data to be passed to callback function 992 - * @fn: caller supplied callback function 993 - * 994 - * This function is called by group users to iterate over group devices. 995 - * Callers should hold a reference count to the group during callback. 996 - * The group->mutex is held across callbacks, which will block calls to 997 - * iommu_group_add/remove_device. 998 - */ 999 983 static int __iommu_group_for_each_dev(struct iommu_group *group, void *data, 1000 984 int (*fn)(struct device *, void *)) 1001 985 { ··· 999 1005 return ret; 1000 1006 } 1001 1007 1002 - 1008 + /** 1009 + * iommu_group_for_each_dev - iterate over each device in the group 1010 + * @group: the group 1011 + * @data: caller opaque data to be passed to callback function 1012 + * @fn: caller supplied callback function 1013 + * 1014 + * This function is called by group users to iterate over group devices. 1015 + * Callers should hold a reference count to the group during callback. 1016 + * The group->mutex is held across callbacks, which will block calls to 1017 + * iommu_group_add/remove_device. 1018 + */ 1003 1019 int iommu_group_for_each_dev(struct iommu_group *group, void *data, 1004 1020 int (*fn)(struct device *, void *)) 1005 1021 { ··· 3036 3032 * iommu_sva_bind_device() - Bind a process address space to a device 3037 3033 * @dev: the device 3038 3034 * @mm: the mm to bind, caller must hold a reference to it 3035 + * @drvdata: opaque data pointer to pass to bind callback 3039 3036 * 3040 3037 * Create a bond between device and address space, allowing the device to access 3041 3038 * the mm using the returned PASID. If a bond already exists between @device and
+1 -1
drivers/iommu/omap-iommu.c
··· 1085 1085 } 1086 1086 1087 1087 /** 1088 - * omap_iommu_suspend_prepare - prepare() dev_pm_ops implementation 1088 + * omap_iommu_prepare - prepare() dev_pm_ops implementation 1089 1089 * @dev: iommu device 1090 1090 * 1091 1091 * This function performs the necessary checks to determine if the IOMMU
+4 -4
drivers/md/md.c
··· 5869 5869 nowait = nowait && blk_queue_nowait(bdev_get_queue(rdev->bdev)); 5870 5870 } 5871 5871 5872 - /* Set the NOWAIT flags if all underlying devices support it */ 5873 - if (nowait) 5874 - blk_queue_flag_set(QUEUE_FLAG_NOWAIT, mddev->queue); 5875 - 5876 5872 if (!bioset_initialized(&mddev->bio_set)) { 5877 5873 err = bioset_init(&mddev->bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS); 5878 5874 if (err) ··· 6006 6010 else 6007 6011 blk_queue_flag_clear(QUEUE_FLAG_NONROT, mddev->queue); 6008 6012 blk_queue_flag_set(QUEUE_FLAG_IO_STAT, mddev->queue); 6013 + 6014 + /* Set the NOWAIT flags if all underlying devices support it */ 6015 + if (nowait) 6016 + blk_queue_flag_set(QUEUE_FLAG_NOWAIT, mddev->queue); 6009 6017 } 6010 6018 if (pers->sync_request) { 6011 6019 if (mddev->kobj.sd &&
+7 -1
drivers/mmc/core/sd.c
··· 67 67 __res & __mask; \ 68 68 }) 69 69 70 - #define SD_POWEROFF_NOTIFY_TIMEOUT_MS 2000 70 + #define SD_POWEROFF_NOTIFY_TIMEOUT_MS 1000 71 71 #define SD_WRITE_EXTR_SINGLE_TIMEOUT_MS 1000 72 72 73 73 struct sd_busy_data { ··· 1663 1663 mmc_hostname(card->host), err); 1664 1664 goto out; 1665 1665 } 1666 + 1667 + /* Find out when the command is completed. */ 1668 + err = mmc_poll_for_busy(card, SD_WRITE_EXTR_SINGLE_TIMEOUT_MS, false, 1669 + MMC_BUSY_EXTR_SINGLE); 1670 + if (err) 1671 + goto out; 1666 1672 1667 1673 cb_data.card = card; 1668 1674 cb_data.reg_buf = reg_buf;
+1 -1
drivers/mmc/host/moxart-mmc.c
··· 705 705 if (!IS_ERR_OR_NULL(host->dma_chan_rx)) 706 706 dma_release_channel(host->dma_chan_rx); 707 707 mmc_remove_host(mmc); 708 - mmc_free_host(mmc); 709 708 710 709 writel(0, host->base + REG_INTERRUPT_MASK); 711 710 writel(0, host->base + REG_POWER_CONTROL); 712 711 writel(readl(host->base + REG_CLOCK_CONTROL) | CLK_OFF, 713 712 host->base + REG_CLOCK_CONTROL); 713 + mmc_free_host(mmc); 714 714 715 715 return 0; 716 716 }
+6 -2
drivers/mmc/host/sdhci-of-esdhc.c
··· 524 524 525 525 static int esdhc_of_enable_dma(struct sdhci_host *host) 526 526 { 527 + int ret; 527 528 u32 value; 528 529 struct device *dev = mmc_dev(host->mmc); 529 530 530 531 if (of_device_is_compatible(dev->of_node, "fsl,ls1043a-esdhc") || 531 - of_device_is_compatible(dev->of_node, "fsl,ls1046a-esdhc")) 532 - dma_set_mask_and_coherent(dev, DMA_BIT_MASK(40)); 532 + of_device_is_compatible(dev->of_node, "fsl,ls1046a-esdhc")) { 533 + ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(40)); 534 + if (ret) 535 + return ret; 536 + } 533 537 534 538 value = sdhci_readl(host, ESDHC_DMA_SYSCTL); 535 539
+3
drivers/mmc/host/sh_mmcif.c
··· 405 405 struct dma_slave_config cfg = { 0, }; 406 406 407 407 res = platform_get_resource(host->pd, IORESOURCE_MEM, 0); 408 + if (!res) 409 + return -EINVAL; 410 + 408 411 cfg.direction = direction; 409 412 410 413 if (direction == DMA_DEV_TO_MEM) {
+2 -1
drivers/net/bonding/bond_3ad.c
··· 1021 1021 if (port->aggregator && 1022 1022 port->aggregator->is_active && 1023 1023 !__port_is_enabled(port)) { 1024 - 1025 1024 __enable_port(port); 1025 + *update_slave_arr = true; 1026 1026 } 1027 1027 } 1028 1028 break; ··· 1779 1779 port = port->next_port_in_aggregator) { 1780 1780 __enable_port(port); 1781 1781 } 1782 + *update_slave_arr = true; 1782 1783 } 1783 1784 } 1784 1785
+5 -2
drivers/net/dsa/bcm_sf2.c
··· 621 621 get_device(&priv->master_mii_bus->dev); 622 622 priv->master_mii_dn = dn; 623 623 624 - priv->slave_mii_bus = devm_mdiobus_alloc(ds->dev); 624 + priv->slave_mii_bus = mdiobus_alloc(); 625 625 if (!priv->slave_mii_bus) { 626 626 of_node_put(dn); 627 627 return -ENOMEM; ··· 681 681 } 682 682 683 683 err = mdiobus_register(priv->slave_mii_bus); 684 - if (err && dn) 684 + if (err && dn) { 685 + mdiobus_free(priv->slave_mii_bus); 685 686 of_node_put(dn); 687 + } 686 688 687 689 return err; 688 690 } ··· 692 690 static void bcm_sf2_mdio_unregister(struct bcm_sf2_priv *priv) 693 691 { 694 692 mdiobus_unregister(priv->slave_mii_bus); 693 + mdiobus_free(priv->slave_mii_bus); 695 694 of_node_put(priv->master_mii_dn); 696 695 } 697 696
+11 -3
drivers/net/dsa/lantiq_gswip.c
··· 498 498 static int gswip_mdio(struct gswip_priv *priv, struct device_node *mdio_np) 499 499 { 500 500 struct dsa_switch *ds = priv->ds; 501 + int err; 501 502 502 - ds->slave_mii_bus = devm_mdiobus_alloc(priv->dev); 503 + ds->slave_mii_bus = mdiobus_alloc(); 503 504 if (!ds->slave_mii_bus) 504 505 return -ENOMEM; 505 506 ··· 513 512 ds->slave_mii_bus->parent = priv->dev; 514 513 ds->slave_mii_bus->phy_mask = ~ds->phys_mii_mask; 515 514 516 - return of_mdiobus_register(ds->slave_mii_bus, mdio_np); 515 + err = of_mdiobus_register(ds->slave_mii_bus, mdio_np); 516 + if (err) 517 + mdiobus_free(ds->slave_mii_bus); 518 + 519 + return err; 517 520 } 518 521 519 522 static int gswip_pce_table_entry_read(struct gswip_priv *priv, ··· 2150 2145 gswip_mdio_mask(priv, GSWIP_MDIO_GLOB_ENABLE, 0, GSWIP_MDIO_GLOB); 2151 2146 dsa_unregister_switch(priv->ds); 2152 2147 mdio_bus: 2153 - if (mdio_np) 2148 + if (mdio_np) { 2154 2149 mdiobus_unregister(priv->ds->slave_mii_bus); 2150 + mdiobus_free(priv->ds->slave_mii_bus); 2151 + } 2155 2152 put_mdio_node: 2156 2153 of_node_put(mdio_np); 2157 2154 for (i = 0; i < priv->num_gphy_fw; i++) ··· 2176 2169 2177 2170 if (priv->ds->slave_mii_bus) { 2178 2171 mdiobus_unregister(priv->ds->slave_mii_bus); 2172 + mdiobus_free(priv->ds->slave_mii_bus); 2179 2173 of_node_put(priv->ds->slave_mii_bus->dev.of_node); 2180 2174 } 2181 2175
+1 -1
drivers/net/dsa/mt7530.c
··· 2074 2074 if (priv->irq) 2075 2075 mt7530_setup_mdio_irq(priv); 2076 2076 2077 - ret = mdiobus_register(bus); 2077 + ret = devm_mdiobus_register(dev, bus); 2078 2078 if (ret) { 2079 2079 dev_err(dev, "failed to register MDIO bus: %d\n", ret); 2080 2080 if (priv->irq)
+10 -5
drivers/net/dsa/mv88e6xxx/chip.c
··· 3566 3566 return err; 3567 3567 } 3568 3568 3569 - bus = devm_mdiobus_alloc_size(chip->dev, sizeof(*mdio_bus)); 3569 + bus = mdiobus_alloc_size(sizeof(*mdio_bus)); 3570 3570 if (!bus) 3571 3571 return -ENOMEM; 3572 3572 ··· 3591 3591 if (!external) { 3592 3592 err = mv88e6xxx_g2_irq_mdio_setup(chip, bus); 3593 3593 if (err) 3594 - return err; 3594 + goto out; 3595 3595 } 3596 3596 3597 3597 err = of_mdiobus_register(bus, np); 3598 3598 if (err) { 3599 3599 dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err); 3600 3600 mv88e6xxx_g2_irq_mdio_free(chip, bus); 3601 - return err; 3601 + goto out; 3602 3602 } 3603 3603 3604 3604 if (external) ··· 3607 3607 list_add(&mdio_bus->list, &chip->mdios); 3608 3608 3609 3609 return 0; 3610 + 3611 + out: 3612 + mdiobus_free(bus); 3613 + return err; 3610 3614 } 3611 3615 3612 3616 static void mv88e6xxx_mdios_unregister(struct mv88e6xxx_chip *chip) 3613 3617 3614 3618 { 3615 - struct mv88e6xxx_mdio_bus *mdio_bus; 3619 + struct mv88e6xxx_mdio_bus *mdio_bus, *p; 3616 3620 struct mii_bus *bus; 3617 3621 3618 - list_for_each_entry(mdio_bus, &chip->mdios, list) { 3622 + list_for_each_entry_safe(mdio_bus, p, &chip->mdios, list) { 3619 3623 bus = mdio_bus->bus; 3620 3624 3621 3625 if (!mdio_bus->external) 3622 3626 mv88e6xxx_g2_irq_mdio_free(chip, bus); 3623 3627 3624 3628 mdiobus_unregister(bus); 3629 + mdiobus_free(bus); 3625 3630 } 3626 3631 } 3627 3632
+3 -1
drivers/net/dsa/ocelot/felix_vsc9959.c
··· 1061 1061 return PTR_ERR(hw); 1062 1062 } 1063 1063 1064 - bus = devm_mdiobus_alloc_size(dev, sizeof(*mdio_priv)); 1064 + bus = mdiobus_alloc_size(sizeof(*mdio_priv)); 1065 1065 if (!bus) 1066 1066 return -ENOMEM; 1067 1067 ··· 1081 1081 rc = mdiobus_register(bus); 1082 1082 if (rc < 0) { 1083 1083 dev_err(dev, "failed to register MDIO bus\n"); 1084 + mdiobus_free(bus); 1084 1085 return rc; 1085 1086 } 1086 1087 ··· 1133 1132 lynx_pcs_destroy(phylink_pcs); 1134 1133 } 1135 1134 mdiobus_unregister(felix->imdio); 1135 + mdiobus_free(felix->imdio); 1136 1136 } 1137 1137 1138 1138 static void vsc9959_sched_speed_set(struct ocelot *ocelot, int port,
+3 -2
drivers/net/dsa/ocelot/seville_vsc9953.c
··· 1029 1029 } 1030 1030 1031 1031 /* Needed in order to initialize the bus mutex lock */ 1032 - rc = of_mdiobus_register(bus, NULL); 1032 + rc = devm_of_mdiobus_register(dev, bus, NULL); 1033 1033 if (rc < 0) { 1034 1034 dev_err(dev, "failed to register MDIO bus\n"); 1035 1035 return rc; ··· 1083 1083 mdio_device_free(mdio_device); 1084 1084 lynx_pcs_destroy(phylink_pcs); 1085 1085 } 1086 - mdiobus_unregister(felix->imdio); 1086 + 1087 + /* mdiobus_unregister and mdiobus_free handled by devres */ 1087 1088 } 1088 1089 1089 1090 static const struct felix_info seville_info_vsc9953 = {
+1 -2
drivers/net/dsa/qca/ar9331.c
··· 378 378 if (!mnp) 379 379 return -ENODEV; 380 380 381 - ret = of_mdiobus_register(mbus, mnp); 381 + ret = devm_of_mdiobus_register(dev, mbus, mnp); 382 382 of_node_put(mnp); 383 383 if (ret) 384 384 return ret; ··· 1066 1066 } 1067 1067 1068 1068 irq_domain_remove(priv->irqdomain); 1069 - mdiobus_unregister(priv->mbus); 1070 1069 dsa_unregister_switch(&priv->ds); 1071 1070 1072 1071 reset_control_assert(priv->sw_reset);
+3
drivers/net/ethernet/amd/xgbe/xgbe-pci.c
··· 425 425 426 426 pci_free_irq_vectors(pdata->pcidev); 427 427 428 + /* Disable all interrupts in the hardware */ 429 + XP_IOWRITE(pdata, XP_INT_EN, 0x0); 430 + 428 431 xgbe_free_pdata(pdata); 429 432 } 430 433
+1 -1
drivers/net/ethernet/cadence/macb_main.c
··· 4765 4765 4766 4766 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT 4767 4767 if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) { 4768 - dma_set_mask(&pdev->dev, DMA_BIT_MASK(44)); 4768 + dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44)); 4769 4769 bp->hw_dma_cap |= HW_DMA_CAP_64B; 4770 4770 } 4771 4771 #endif
+2 -2
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
··· 4733 4733 #ifdef CONFIG_DEBUG_FS 4734 4734 dpaa2_dbg_remove(priv); 4735 4735 #endif 4736 + 4737 + unregister_netdev(net_dev); 4736 4738 rtnl_lock(); 4737 4739 dpaa2_eth_disconnect_mac(priv); 4738 4740 rtnl_unlock(); 4739 - 4740 - unregister_netdev(net_dev); 4741 4741 4742 4742 dpaa2_eth_dl_port_del(priv); 4743 4743 dpaa2_eth_dl_traps_unregister(priv);
+1
drivers/net/ethernet/google/gve/gve_rx.c
··· 609 609 610 610 *packet_size_bytes = skb->len + (skb->protocol ? ETH_HLEN : 0); 611 611 *work_done = work_cnt; 612 + skb_record_rx_queue(skb, rx->q_num); 612 613 if (skb_is_nonlinear(skb)) 613 614 napi_gro_frags(napi); 614 615 else
+9 -4
drivers/net/ethernet/ibm/ibmvnic.c
··· 110 110 struct ibmvnic_sub_crq_queue *tx_scrq); 111 111 static void free_long_term_buff(struct ibmvnic_adapter *adapter, 112 112 struct ibmvnic_long_term_buff *ltb); 113 + static void ibmvnic_disable_irqs(struct ibmvnic_adapter *adapter); 113 114 114 115 struct ibmvnic_stat { 115 116 char name[ETH_GSTRING_LEN]; ··· 1425 1424 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_UP); 1426 1425 if (rc) { 1427 1426 ibmvnic_napi_disable(adapter); 1428 - release_resources(adapter); 1427 + ibmvnic_disable_irqs(adapter); 1429 1428 return rc; 1430 1429 } 1431 1430 ··· 1475 1474 rc = init_resources(adapter); 1476 1475 if (rc) { 1477 1476 netdev_err(netdev, "failed to initialize resources\n"); 1478 - release_resources(adapter); 1479 - release_rx_pools(adapter); 1480 - release_tx_pools(adapter); 1481 1477 goto out; 1482 1478 } 1483 1479 } ··· 1491 1493 adapter->state = VNIC_OPEN; 1492 1494 rc = 0; 1493 1495 } 1496 + 1497 + if (rc) { 1498 + release_resources(adapter); 1499 + release_rx_pools(adapter); 1500 + release_tx_pools(adapter); 1501 + } 1502 + 1494 1503 return rc; 1495 1504 } 1496 1505
+2 -1
drivers/net/ethernet/intel/ice/ice.h
··· 487 487 ICE_FLAG_MDD_AUTO_RESET_VF, 488 488 ICE_FLAG_VF_VLAN_PRUNING, 489 489 ICE_FLAG_LINK_LENIENT_MODE_ENA, 490 + ICE_FLAG_PLUG_AUX_DEV, 490 491 ICE_PF_FLAGS_NBITS /* must be last */ 491 492 }; 492 493 ··· 892 891 if (pf->hw.func_caps.common_cap.rdma && pf->num_rdma_msix) { 893 892 set_bit(ICE_FLAG_RDMA_ENA, pf->flags); 894 893 set_bit(ICE_FLAG_AUX_ENA, pf->flags); 895 - ice_plug_aux_dev(pf); 894 + set_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags); 896 895 } 897 896 } 898 897
+2 -1
drivers/net/ethernet/intel/ice/ice_common.c
··· 3381 3381 !ice_fw_supports_report_dflt_cfg(hw)) { 3382 3382 struct ice_link_default_override_tlv tlv; 3383 3383 3384 - if (ice_get_link_default_override(&tlv, pi)) 3384 + status = ice_get_link_default_override(&tlv, pi); 3385 + if (status) 3385 3386 goto out; 3386 3387 3387 3388 if (!(tlv.options & ICE_LINK_OVERRIDE_STRICT_MODE) &&
+28 -6
drivers/net/ethernet/intel/ice/ice_lag.c
··· 204 204 lag->upper_netdev = NULL; 205 205 } 206 206 207 - if (lag->peer_netdev) { 208 - dev_put(lag->peer_netdev); 209 - lag->peer_netdev = NULL; 210 - } 211 - 207 + lag->peer_netdev = NULL; 212 208 ice_set_sriov_cap(pf); 213 209 ice_set_rdma_cap(pf); 210 + lag->bonded = false; 211 + lag->role = ICE_LAG_NONE; 212 + } 213 + 214 + /** 215 + * ice_lag_unregister - handle netdev unregister events 216 + * @lag: LAG info struct 217 + * @netdev: netdev reporting the event 218 + */ 219 + static void ice_lag_unregister(struct ice_lag *lag, struct net_device *netdev) 220 + { 221 + struct ice_pf *pf = lag->pf; 222 + 223 + /* check to see if this event is for this netdev 224 + * check that we are in an aggregate 225 + */ 226 + if (netdev != lag->netdev || !lag->bonded) 227 + return; 228 + 229 + if (lag->upper_netdev) { 230 + dev_put(lag->upper_netdev); 231 + lag->upper_netdev = NULL; 232 + ice_set_sriov_cap(pf); 233 + ice_set_rdma_cap(pf); 234 + } 235 + /* perform some cleanup in case we come back */ 214 236 lag->bonded = false; 215 237 lag->role = ICE_LAG_NONE; 216 238 } ··· 329 307 ice_lag_info_event(lag, ptr); 330 308 break; 331 309 case NETDEV_UNREGISTER: 332 - ice_lag_unlink(lag, ptr); 310 + ice_lag_unregister(lag, netdev); 333 311 break; 334 312 default: 335 313 break;
+1
drivers/net/ethernet/intel/ice/ice_lan_tx_rx.h
··· 570 570 (0x3FFFFULL << ICE_TXD_CTX_QW1_TSO_LEN_S) 571 571 572 572 #define ICE_TXD_CTX_QW1_MSS_S 50 573 + #define ICE_TXD_CTX_MIN_MSS 64 573 574 574 575 #define ICE_TXD_CTX_QW1_VSI_S 50 575 576 #define ICE_TXD_CTX_QW1_VSI_M (0x3FFULL << ICE_TXD_CTX_QW1_VSI_S)
+20 -8
drivers/net/ethernet/intel/ice/ice_main.c
··· 2256 2256 return; 2257 2257 } 2258 2258 2259 + if (test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) 2260 + ice_plug_aux_dev(pf); 2261 + 2259 2262 ice_clean_adminq_subtask(pf); 2260 2263 ice_check_media_subtask(pf); 2261 2264 ice_check_for_hang_subtask(pf); ··· 8727 8724 struct net_device __always_unused *netdev, 8728 8725 netdev_features_t features) 8729 8726 { 8727 + bool gso = skb_is_gso(skb); 8730 8728 size_t len; 8731 8729 8732 8730 /* No point in doing any of this if neither checksum nor GSO are ··· 8740 8736 /* We cannot support GSO if the MSS is going to be less than 8741 8737 * 64 bytes. If it is then we need to drop support for GSO. 8742 8738 */ 8743 - if (skb_is_gso(skb) && (skb_shinfo(skb)->gso_size < 64)) 8739 + if (gso && (skb_shinfo(skb)->gso_size < ICE_TXD_CTX_MIN_MSS)) 8744 8740 features &= ~NETIF_F_GSO_MASK; 8745 8741 8746 - len = skb_network_header(skb) - skb->data; 8742 + len = skb_network_offset(skb); 8747 8743 if (len > ICE_TXD_MACLEN_MAX || len & 0x1) 8748 8744 goto out_rm_features; 8749 8745 8750 - len = skb_transport_header(skb) - skb_network_header(skb); 8746 + len = skb_network_header_len(skb); 8751 8747 if (len > ICE_TXD_IPLEN_MAX || len & 0x1) 8752 8748 goto out_rm_features; 8753 8749 8754 8750 if (skb->encapsulation) { 8755 - len = skb_inner_network_header(skb) - skb_transport_header(skb); 8756 - if (len > ICE_TXD_L4LEN_MAX || len & 0x1) 8757 - goto out_rm_features; 8751 + /* this must work for VXLAN frames AND IPIP/SIT frames, and in 8752 + * the case of IPIP frames, the transport header pointer is 8753 + * after the inner header! So check to make sure that this 8754 + * is a GRE or UDP_TUNNEL frame before doing that math. 8755 + */ 8756 + if (gso && (skb_shinfo(skb)->gso_type & 8757 + (SKB_GSO_GRE | SKB_GSO_UDP_TUNNEL))) { 8758 + len = skb_inner_network_header(skb) - 8759 + skb_transport_header(skb); 8760 + if (len > ICE_TXD_L4LEN_MAX || len & 0x1) 8761 + goto out_rm_features; 8762 + } 8758 8763 8759 - len = skb_inner_transport_header(skb) - 8760 - skb_inner_network_header(skb); 8764 + len = skb_inner_network_header_len(skb); 8761 8765 if (len > ICE_TXD_IPLEN_MAX || len & 0x1) 8762 8766 goto out_rm_features; 8763 8767 }
+8 -7
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
··· 1984 1984 if (adapter->flags & IXGBEVF_FLAGS_LEGACY_RX) 1985 1985 return; 1986 1986 1987 + if (PAGE_SIZE < 8192) 1988 + if (max_frame > IXGBEVF_MAX_FRAME_BUILD_SKB) 1989 + set_ring_uses_large_buffer(rx_ring); 1990 + 1991 + /* 82599 can't rely on RXDCTL.RLPML to restrict the size of the frame */ 1992 + if (adapter->hw.mac.type == ixgbe_mac_82599_vf && !ring_uses_large_buffer(rx_ring)) 1993 + return; 1994 + 1987 1995 set_ring_build_skb_enabled(rx_ring); 1988 - 1989 - if (PAGE_SIZE < 8192) { 1990 - if (max_frame <= IXGBEVF_MAX_FRAME_BUILD_SKB) 1991 - return; 1992 - 1993 - set_ring_uses_large_buffer(rx_ring); 1994 - } 1995 1996 } 1996 1997 1997 1998 /**
+1 -1
drivers/net/ethernet/litex/Kconfig
··· 17 17 18 18 config LITEX_LITEETH 19 19 tristate "LiteX Ethernet support" 20 - depends on OF 20 + depends on OF && HAS_IOMEM 21 21 help 22 22 If you wish to compile a kernel for hardware with a LiteX LiteEth 23 23 device then you should answer Y to this.
+1 -1
drivers/net/ethernet/microchip/sparx5/sparx5_ethtool.c
··· 1103 1103 stats->tx_carrier_errors = portstats[spx5_stats_tx_csense_cnt]; 1104 1104 stats->tx_window_errors = portstats[spx5_stats_tx_late_coll_cnt]; 1105 1105 stats->rx_dropped = portstats[spx5_stats_ana_ac_port_stat_lsb_cnt]; 1106 - for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx, ++stats) 1106 + for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx) 1107 1107 stats->rx_dropped += portstats[spx5_stats_green_p0_rx_port_drop 1108 1108 + idx]; 1109 1109 stats->tx_dropped = portstats[spx5_stats_tx_local_drop];
+15 -4
drivers/net/ethernet/mscc/ocelot.c
··· 1432 1432 ocelot_populate_ipv4_ptp_event_trap_key(struct ocelot_vcap_filter *trap) 1433 1433 { 1434 1434 trap->key_type = OCELOT_VCAP_KEY_IPV4; 1435 + trap->key.ipv4.proto.value[0] = IPPROTO_UDP; 1436 + trap->key.ipv4.proto.mask[0] = 0xff; 1435 1437 trap->key.ipv4.dport.value = PTP_EV_PORT; 1436 1438 trap->key.ipv4.dport.mask = 0xffff; 1437 1439 } ··· 1442 1440 ocelot_populate_ipv6_ptp_event_trap_key(struct ocelot_vcap_filter *trap) 1443 1441 { 1444 1442 trap->key_type = OCELOT_VCAP_KEY_IPV6; 1443 + trap->key.ipv4.proto.value[0] = IPPROTO_UDP; 1444 + trap->key.ipv4.proto.mask[0] = 0xff; 1445 1445 trap->key.ipv6.dport.value = PTP_EV_PORT; 1446 1446 trap->key.ipv6.dport.mask = 0xffff; 1447 1447 } ··· 1452 1448 ocelot_populate_ipv4_ptp_general_trap_key(struct ocelot_vcap_filter *trap) 1453 1449 { 1454 1450 trap->key_type = OCELOT_VCAP_KEY_IPV4; 1451 + trap->key.ipv4.proto.value[0] = IPPROTO_UDP; 1452 + trap->key.ipv4.proto.mask[0] = 0xff; 1455 1453 trap->key.ipv4.dport.value = PTP_GEN_PORT; 1456 1454 trap->key.ipv4.dport.mask = 0xffff; 1457 1455 } ··· 1462 1456 ocelot_populate_ipv6_ptp_general_trap_key(struct ocelot_vcap_filter *trap) 1463 1457 { 1464 1458 trap->key_type = OCELOT_VCAP_KEY_IPV6; 1459 + trap->key.ipv4.proto.value[0] = IPPROTO_UDP; 1460 + trap->key.ipv4.proto.mask[0] = 0xff; 1465 1461 trap->key.ipv6.dport.value = PTP_GEN_PORT; 1466 1462 trap->key.ipv6.dport.mask = 0xffff; 1467 1463 } ··· 1745 1737 } 1746 1738 EXPORT_SYMBOL(ocelot_get_strings); 1747 1739 1740 + /* Caller must hold &ocelot->stats_lock */ 1748 1741 static void ocelot_update_stats(struct ocelot *ocelot) 1749 1742 { 1750 1743 int i, j; 1751 - 1752 - mutex_lock(&ocelot->stats_lock); 1753 1744 1754 1745 for (i = 0; i < ocelot->num_phys_ports; i++) { 1755 1746 /* Configure the port to read the stats from */ ··· 1768 1761 ~(u64)U32_MAX) + val; 1769 1762 } 1770 1763 } 1771 - 1772 - mutex_unlock(&ocelot->stats_lock); 1773 1764 } 1774 1765 1775 1766 static void ocelot_check_stats_work(struct work_struct *work) ··· 1776 1771 struct ocelot *ocelot = container_of(del_work, struct ocelot, 1777 1772 stats_work); 1778 1773 1774 + mutex_lock(&ocelot->stats_lock); 1779 1775 ocelot_update_stats(ocelot); 1776 + mutex_unlock(&ocelot->stats_lock); 1780 1777 1781 1778 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work, 1782 1779 OCELOT_STATS_CHECK_DELAY); ··· 1788 1781 { 1789 1782 int i; 1790 1783 1784 + mutex_lock(&ocelot->stats_lock); 1785 + 1791 1786 /* check and update now */ 1792 1787 ocelot_update_stats(ocelot); 1793 1788 1794 1789 /* Copy all counters */ 1795 1790 for (i = 0; i < ocelot->num_stats; i++) 1796 1791 *data++ = ocelot->stats[port * ocelot->num_stats + i]; 1792 + 1793 + mutex_unlock(&ocelot->stats_lock); 1797 1794 } 1798 1795 EXPORT_SYMBOL(ocelot_get_ethtool_stats); 1799 1796
+8 -4
drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c
··· 1011 1011 struct nfp_flower_repr_priv *repr_priv; 1012 1012 struct nfp_tun_offloaded_mac *entry; 1013 1013 struct nfp_repr *repr; 1014 + u16 nfp_mac_idx; 1014 1015 int ida_idx; 1015 1016 1016 1017 entry = nfp_tunnel_lookup_offloaded_macs(app, mac); ··· 1030 1029 entry->bridge_count--; 1031 1030 1032 1031 if (!entry->bridge_count && entry->ref_count) { 1033 - u16 nfp_mac_idx; 1034 - 1035 1032 nfp_mac_idx = entry->index & ~NFP_TUN_PRE_TUN_IDX_BIT; 1036 1033 if (__nfp_tunnel_offload_mac(app, mac, nfp_mac_idx, 1037 1034 false)) { ··· 1045 1046 1046 1047 /* If MAC is now used by 1 repr set the offloaded MAC index to port. */ 1047 1048 if (entry->ref_count == 1 && list_is_singular(&entry->repr_list)) { 1048 - u16 nfp_mac_idx; 1049 1049 int port, err; 1050 1050 1051 1051 repr_priv = list_first_entry(&entry->repr_list, ··· 1072 1074 WARN_ON_ONCE(rhashtable_remove_fast(&priv->tun.offloaded_macs, 1073 1075 &entry->ht_node, 1074 1076 offloaded_macs_params)); 1077 + 1078 + if (nfp_flower_is_supported_bridge(netdev)) 1079 + nfp_mac_idx = entry->index & ~NFP_TUN_PRE_TUN_IDX_BIT; 1080 + else 1081 + nfp_mac_idx = entry->index; 1082 + 1075 1083 /* If MAC has global ID then extract and free the ida entry. */ 1076 - if (nfp_tunnel_is_mac_idx_global(entry->index)) { 1084 + if (nfp_tunnel_is_mac_idx_global(nfp_mac_idx)) { 1077 1085 ida_idx = nfp_tunnel_get_ida_from_global_mac_idx(entry->index); 1078 1086 ida_simple_remove(&priv->tun.mac_off_ids, ida_idx); 1079 1087 }
+1
drivers/net/mdio/mdio-aspeed.c
··· 148 148 { .compatible = "aspeed,ast2600-mdio", }, 149 149 { }, 150 150 }; 151 + MODULE_DEVICE_TABLE(of, aspeed_mdio_of_match); 151 152 152 153 static struct platform_driver aspeed_mdio_driver = { 153 154 .driver = {
+10 -9
drivers/net/phy/marvell.c
··· 553 553 else 554 554 mscr = 0; 555 555 556 - return phy_modify_paged(phydev, MII_MARVELL_MSCR_PAGE, 557 - MII_88E1121_PHY_MSCR_REG, 558 - MII_88E1121_PHY_MSCR_DELAY_MASK, mscr); 556 + return phy_modify_paged_changed(phydev, MII_MARVELL_MSCR_PAGE, 557 + MII_88E1121_PHY_MSCR_REG, 558 + MII_88E1121_PHY_MSCR_DELAY_MASK, mscr); 559 559 } 560 560 561 561 static int m88e1121_config_aneg(struct phy_device *phydev) ··· 569 569 return err; 570 570 } 571 571 572 + changed = err; 573 + 572 574 err = marvell_set_polarity(phydev, phydev->mdix_ctrl); 573 575 if (err < 0) 574 576 return err; 575 577 576 - changed = err; 578 + changed |= err; 577 579 578 580 err = genphy_config_aneg(phydev); 579 581 if (err < 0) ··· 1215 1213 { 1216 1214 int err; 1217 1215 1218 - err = genphy_soft_reset(phydev); 1219 - if (err < 0) 1220 - return err; 1221 - 1222 1216 err = marvell_set_polarity(phydev, phydev->mdix_ctrl); 1223 1217 if (err < 0) 1224 1218 return err; 1225 1219 1226 1220 err = genphy_config_aneg(phydev); 1227 - return 0; 1221 + if (err < 0) 1222 + return err; 1223 + 1224 + return genphy_soft_reset(phydev); 1228 1225 } 1229 1226 1230 1227 static int m88e1118_config_init(struct phy_device *phydev)
+2
drivers/net/usb/qmi_wwan.c
··· 1400 1400 {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ 1401 1401 {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ 1402 1402 {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ 1403 + {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/ 1404 + {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */ 1403 1405 {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ 1404 1406 {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ 1405 1407 {QMI_QUIRK_SET_DTR(0x22de, 0x9051, 2)}, /* Hucom Wireless HM-211S/K */
+8 -5
drivers/net/veth.c
··· 265 265 { 266 266 /* Write ptr_ring before reading rx_notify_masked */ 267 267 smp_mb(); 268 - if (!rq->rx_notify_masked) { 269 - rq->rx_notify_masked = true; 270 - napi_schedule(&rq->xdp_napi); 268 + if (!READ_ONCE(rq->rx_notify_masked) && 269 + napi_schedule_prep(&rq->xdp_napi)) { 270 + WRITE_ONCE(rq->rx_notify_masked, true); 271 + __napi_schedule(&rq->xdp_napi); 271 272 } 272 273 } 273 274 ··· 913 912 /* Write rx_notify_masked before reading ptr_ring */ 914 913 smp_store_mb(rq->rx_notify_masked, false); 915 914 if (unlikely(!__ptr_ring_empty(&rq->xdp_ring))) { 916 - rq->rx_notify_masked = true; 917 - napi_schedule(&rq->xdp_napi); 915 + if (napi_schedule_prep(&rq->xdp_napi)) { 916 + WRITE_ONCE(rq->rx_notify_masked, true); 917 + __napi_schedule(&rq->xdp_napi); 918 + } 918 919 } 919 920 } 920 921
+8 -1
drivers/nvme/host/core.c
··· 4253 4253 container_of(work, struct nvme_ctrl, async_event_work); 4254 4254 4255 4255 nvme_aen_uevent(ctrl); 4256 - ctrl->ops->submit_async_event(ctrl); 4256 + 4257 + /* 4258 + * The transport drivers must guarantee AER submission here is safe by 4259 + * flushing ctrl async_event_work after changing the controller state 4260 + * from LIVE and before freeing the admin queue. 4261 + */ 4262 + if (ctrl->state == NVME_CTRL_LIVE) 4263 + ctrl->ops->submit_async_event(ctrl); 4257 4264 } 4258 4265 4259 4266 static bool nvme_ctrl_pp_status(struct nvme_ctrl *ctrl)
+1
drivers/nvme/host/fabrics.h
··· 170 170 struct nvmf_ctrl_options *opts) 171 171 { 172 172 if (ctrl->state == NVME_CTRL_DELETING || 173 + ctrl->state == NVME_CTRL_DELETING_NOIO || 173 174 ctrl->state == NVME_CTRL_DEAD || 174 175 strcmp(opts->subsysnqn, ctrl->opts->subsysnqn) || 175 176 strcmp(opts->host->nqn, ctrl->opts->host->nqn) ||
+1
drivers/nvme/host/rdma.c
··· 1200 1200 struct nvme_rdma_ctrl, err_work); 1201 1201 1202 1202 nvme_stop_keep_alive(&ctrl->ctrl); 1203 + flush_work(&ctrl->ctrl.async_event_work); 1203 1204 nvme_rdma_teardown_io_queues(ctrl, false); 1204 1205 nvme_start_queues(&ctrl->ctrl); 1205 1206 nvme_rdma_teardown_admin_queue(ctrl, false);
+1
drivers/nvme/host/tcp.c
··· 2096 2096 struct nvme_ctrl *ctrl = &tcp_ctrl->ctrl; 2097 2097 2098 2098 nvme_stop_keep_alive(ctrl); 2099 + flush_work(&ctrl->async_event_work); 2099 2100 nvme_tcp_teardown_io_queues(ctrl, false); 2100 2101 /* unquiesce to fail fast pending requests */ 2101 2102 nvme_start_queues(ctrl);
+42 -43
drivers/pci/controller/cadence/pci-j721e.c
··· 356 356 const struct j721e_pcie_data *data; 357 357 struct cdns_pcie *cdns_pcie; 358 358 struct j721e_pcie *pcie; 359 - struct cdns_pcie_rc *rc; 360 - struct cdns_pcie_ep *ep; 359 + struct cdns_pcie_rc *rc = NULL; 360 + struct cdns_pcie_ep *ep = NULL; 361 361 struct gpio_desc *gpiod; 362 362 void __iomem *base; 363 363 struct clk *clk; ··· 375 375 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); 376 376 if (!pcie) 377 377 return -ENOMEM; 378 + 379 + switch (mode) { 380 + case PCI_MODE_RC: 381 + if (!IS_ENABLED(CONFIG_PCIE_CADENCE_HOST)) 382 + return -ENODEV; 383 + 384 + bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rc)); 385 + if (!bridge) 386 + return -ENOMEM; 387 + 388 + if (!data->byte_access_allowed) 389 + bridge->ops = &cdns_ti_pcie_host_ops; 390 + rc = pci_host_bridge_priv(bridge); 391 + rc->quirk_retrain_flag = data->quirk_retrain_flag; 392 + rc->quirk_detect_quiet_flag = data->quirk_detect_quiet_flag; 393 + 394 + cdns_pcie = &rc->pcie; 395 + cdns_pcie->dev = dev; 396 + cdns_pcie->ops = &j721e_pcie_ops; 397 + pcie->cdns_pcie = cdns_pcie; 398 + break; 399 + case PCI_MODE_EP: 400 + if (!IS_ENABLED(CONFIG_PCIE_CADENCE_EP)) 401 + return -ENODEV; 402 + 403 + ep = devm_kzalloc(dev, sizeof(*ep), GFP_KERNEL); 404 + if (!ep) 405 + return -ENOMEM; 406 + 407 + ep->quirk_detect_quiet_flag = data->quirk_detect_quiet_flag; 408 + 409 + cdns_pcie = &ep->pcie; 410 + cdns_pcie->dev = dev; 411 + cdns_pcie->ops = &j721e_pcie_ops; 412 + pcie->cdns_pcie = cdns_pcie; 413 + break; 414 + default: 415 + dev_err(dev, "INVALID device type %d\n", mode); 416 + return 0; 417 + } 378 418 379 419 pcie->mode = mode; 380 420 pcie->linkdown_irq_regfield = data->linkdown_irq_regfield; ··· 466 426 467 427 switch (mode) { 468 428 case PCI_MODE_RC: 469 - if (!IS_ENABLED(CONFIG_PCIE_CADENCE_HOST)) { 470 - ret = -ENODEV; 471 - goto err_get_sync; 472 - } 473 - 474 - bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rc)); 475 - if (!bridge) { 476 - ret = -ENOMEM; 477 - goto err_get_sync; 478 - } 479 - 480 - if (!data->byte_access_allowed) 481 - bridge->ops = &cdns_ti_pcie_host_ops; 482 - rc = pci_host_bridge_priv(bridge); 483 - rc->quirk_retrain_flag = data->quirk_retrain_flag; 484 - rc->quirk_detect_quiet_flag = data->quirk_detect_quiet_flag; 485 - 486 - cdns_pcie = &rc->pcie; 487 - cdns_pcie->dev = dev; 488 - cdns_pcie->ops = &j721e_pcie_ops; 489 - pcie->cdns_pcie = cdns_pcie; 490 - 491 429 gpiod = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); 492 430 if (IS_ERR(gpiod)) { 493 431 ret = PTR_ERR(gpiod); ··· 515 497 516 498 break; 517 499 case PCI_MODE_EP: 518 - if (!IS_ENABLED(CONFIG_PCIE_CADENCE_EP)) { 519 - ret = -ENODEV; 520 - goto err_get_sync; 521 - } 522 - 523 - ep = devm_kzalloc(dev, sizeof(*ep), GFP_KERNEL); 524 - if (!ep) { 525 - ret = -ENOMEM; 526 - goto err_get_sync; 527 - } 528 - ep->quirk_detect_quiet_flag = data->quirk_detect_quiet_flag; 529 - 530 - cdns_pcie = &ep->pcie; 531 - cdns_pcie->dev = dev; 532 - cdns_pcie->ops = &j721e_pcie_ops; 533 - pcie->cdns_pcie = cdns_pcie; 534 - 535 500 ret = cdns_pcie_init_phy(dev, cdns_pcie); 536 501 if (ret) { 537 502 dev_err(dev, "Failed to init phy\n"); ··· 526 525 goto err_pcie_setup; 527 526 528 527 break; 529 - default: 530 - dev_err(dev, "INVALID device type %d\n", mode); 531 528 } 532 529 533 530 return 0;
+18 -13
drivers/pci/controller/dwc/pcie-kirin.c
··· 756 756 return 0; 757 757 } 758 758 759 + struct kirin_pcie_data { 760 + enum pcie_kirin_phy_type phy_type; 761 + }; 762 + 763 + static const struct kirin_pcie_data kirin_960_data = { 764 + .phy_type = PCIE_KIRIN_INTERNAL_PHY, 765 + }; 766 + 767 + static const struct kirin_pcie_data kirin_970_data = { 768 + .phy_type = PCIE_KIRIN_EXTERNAL_PHY, 769 + }; 770 + 759 771 static const struct of_device_id kirin_pcie_match[] = { 760 - { 761 - .compatible = "hisilicon,kirin960-pcie", 762 - .data = (void *)PCIE_KIRIN_INTERNAL_PHY 763 - }, 764 - { 765 - .compatible = "hisilicon,kirin970-pcie", 766 - .data = (void *)PCIE_KIRIN_EXTERNAL_PHY 767 - }, 772 + { .compatible = "hisilicon,kirin960-pcie", .data = &kirin_960_data }, 773 + { .compatible = "hisilicon,kirin970-pcie", .data = &kirin_970_data }, 768 774 {}, 769 775 }; 770 776 771 777 static int kirin_pcie_probe(struct platform_device *pdev) 772 778 { 773 - enum pcie_kirin_phy_type phy_type; 774 779 struct device *dev = &pdev->dev; 780 + const struct kirin_pcie_data *data; 775 781 struct kirin_pcie *kirin_pcie; 776 782 struct dw_pcie *pci; 777 783 int ret; ··· 787 781 return -EINVAL; 788 782 } 789 783 790 - phy_type = (long)of_device_get_match_data(dev); 791 - if (!phy_type) { 784 + data = of_device_get_match_data(dev); 785 + if (!data) { 792 786 dev_err(dev, "OF data missing\n"); 793 787 return -EINVAL; 794 788 } 795 - 796 789 797 790 kirin_pcie = devm_kzalloc(dev, sizeof(struct kirin_pcie), GFP_KERNEL); 798 791 if (!kirin_pcie) ··· 805 800 pci->ops = &kirin_dw_pcie_ops; 806 801 pci->pp.ops = &kirin_pcie_host_ops; 807 802 kirin_pcie->pci = pci; 808 - kirin_pcie->type = phy_type; 803 + kirin_pcie->type = data->phy_type; 809 804 810 805 ret = kirin_pcie_get_resource(kirin_pcie, pdev); 811 806 if (ret)
+2 -1
drivers/pci/msi/msi.c
··· 1111 1111 if (!desc) 1112 1112 return cpu_possible_mask; 1113 1113 1114 - if (WARN_ON_ONCE(!desc->affinity)) 1114 + /* MSI[X] interrupts can be allocated without affinity descriptor */ 1115 + if (!desc->affinity) 1115 1116 return NULL; 1116 1117 1117 1118 /*
+13 -8
drivers/scsi/bnx2fc/bnx2fc_fcoe.c
··· 508 508 509 509 static void bnx2fc_recv_frame(struct sk_buff *skb) 510 510 { 511 - u32 fr_len; 511 + u64 crc_err; 512 + u32 fr_len, fr_crc; 512 513 struct fc_lport *lport; 513 514 struct fcoe_rcv_info *fr; 514 515 struct fc_stats *stats; ··· 542 541 fh = (struct fc_frame_header *) skb_transport_header(skb); 543 542 skb_pull(skb, sizeof(struct fcoe_hdr)); 544 543 fr_len = skb->len - sizeof(struct fcoe_crc_eof); 544 + 545 + stats = per_cpu_ptr(lport->stats, get_cpu()); 546 + stats->RxFrames++; 547 + stats->RxWords += fr_len / FCOE_WORD_TO_BYTE; 548 + put_cpu(); 545 549 546 550 fp = (struct fc_frame *)skb; 547 551 fc_frame_init(fp); ··· 630 624 return; 631 625 } 632 626 633 - stats = per_cpu_ptr(lport->stats, smp_processor_id()); 634 - stats->RxFrames++; 635 - stats->RxWords += fr_len / FCOE_WORD_TO_BYTE; 627 + fr_crc = le32_to_cpu(fr_crc(fp)); 636 628 637 - if (le32_to_cpu(fr_crc(fp)) != 638 - ~crc32(~0, skb->data, fr_len)) { 639 - if (stats->InvalidCRCCount < 5) 629 + if (unlikely(fr_crc != ~crc32(~0, skb->data, fr_len))) { 630 + stats = per_cpu_ptr(lport->stats, get_cpu()); 631 + crc_err = (stats->InvalidCRCCount++); 632 + put_cpu(); 633 + if (crc_err < 5) 640 634 printk(KERN_WARNING PFX "dropping frame with " 641 635 "CRC error\n"); 642 - stats->InvalidCRCCount++; 643 636 kfree_skb(skb); 644 637 return; 645 638 }
+6 -8
drivers/scsi/hisi_sas/hisi_sas_main.c
··· 400 400 struct hisi_sas_slot *slot, 401 401 struct hisi_sas_dq *dq, 402 402 struct hisi_sas_device *sas_dev, 403 - struct hisi_sas_internal_abort *abort, 404 - struct hisi_sas_tmf_task *tmf) 403 + struct hisi_sas_internal_abort *abort) 405 404 { 406 405 struct hisi_sas_cmd_hdr *cmd_hdr_base; 407 406 int dlvry_queue_slot, dlvry_queue; ··· 426 427 cmd_hdr_base = hisi_hba->cmd_hdr[dlvry_queue]; 427 428 slot->cmd_hdr = &cmd_hdr_base[dlvry_queue_slot]; 428 429 429 - slot->tmf = tmf; 430 - slot->is_internal = tmf; 431 430 task->lldd_task = slot; 432 431 433 432 memset(slot->cmd_hdr, 0, sizeof(struct hisi_sas_cmd_hdr)); ··· 584 587 slot->is_internal = tmf; 585 588 586 589 /* protect task_prep and start_delivery sequence */ 587 - hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, NULL, tmf); 590 + hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, NULL); 588 591 589 592 return 0; 590 593 ··· 1377 1380 struct hisi_hba *hisi_hba = dev_to_hisi_hba(device); 1378 1381 struct device *dev = hisi_hba->dev; 1379 1382 int s = sizeof(struct host_to_dev_fis); 1383 + struct hisi_sas_tmf_task tmf = {}; 1380 1384 1381 1385 ata_for_each_link(link, ap, EDGE) { 1382 1386 int pmp = sata_srst_pmp(link); 1383 1387 1384 1388 hisi_sas_fill_ata_reset_cmd(link->device, 1, pmp, fis); 1385 - rc = hisi_sas_exec_internal_tmf_task(device, fis, s, NULL); 1389 + rc = hisi_sas_exec_internal_tmf_task(device, fis, s, &tmf); 1386 1390 if (rc != TMF_RESP_FUNC_COMPLETE) 1387 1391 break; 1388 1392 } ··· 1394 1396 1395 1397 hisi_sas_fill_ata_reset_cmd(link->device, 0, pmp, fis); 1396 1398 rc = hisi_sas_exec_internal_tmf_task(device, fis, 1397 - s, NULL); 1399 + s, &tmf); 1398 1400 if (rc != TMF_RESP_FUNC_COMPLETE) 1399 1401 dev_err(dev, "ata disk %016llx de-reset failed\n", 1400 1402 SAS_ADDR(device->sas_addr)); ··· 2065 2067 slot->port = port; 2066 2068 slot->is_internal = true; 2067 2069 2068 - hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, abort, NULL); 2070 + hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, abort); 2069 2071 2070 2072 return 0; 2071 2073
-18
drivers/scsi/pm8001/pm8001_hwi.c
··· 2692 2692 u32 tag = le32_to_cpu(psataPayload->tag); 2693 2693 u32 port_id = le32_to_cpu(psataPayload->port_id); 2694 2694 u32 dev_id = le32_to_cpu(psataPayload->device_id); 2695 - unsigned long flags; 2696 2695 2697 2696 if (event) 2698 2697 pm8001_dbg(pm8001_ha, FAIL, "SATA EVENT 0x%x\n", event); ··· 2723 2724 ts->resp = SAS_TASK_COMPLETE; 2724 2725 ts->stat = SAS_DATA_OVERRUN; 2725 2726 ts->residual = 0; 2726 - if (pm8001_dev) 2727 - atomic_dec(&pm8001_dev->running_req); 2728 2727 break; 2729 2728 case IO_XFER_ERROR_BREAK: 2730 2729 pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_BREAK\n"); ··· 2764 2767 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS); 2765 2768 ts->resp = SAS_TASK_COMPLETE; 2766 2769 ts->stat = SAS_QUEUE_FULL; 2767 - pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); 2768 2770 return; 2769 2771 } 2770 2772 break; ··· 2848 2852 ts->resp = SAS_TASK_COMPLETE; 2849 2853 ts->stat = SAS_OPEN_TO; 2850 2854 break; 2851 - } 2852 - spin_lock_irqsave(&t->task_state_lock, flags); 2853 - t->task_state_flags &= ~SAS_TASK_STATE_PENDING; 2854 - t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; 2855 - t->task_state_flags |= SAS_TASK_STATE_DONE; 2856 - if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) { 2857 - spin_unlock_irqrestore(&t->task_state_lock, flags); 2858 - pm8001_dbg(pm8001_ha, FAIL, 2859 - "task 0x%p done with io_status 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n", 2860 - t, event, ts->resp, ts->stat); 2861 - pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2862 - } else { 2863 - spin_unlock_irqrestore(&t->task_state_lock, flags); 2864 - pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); 2865 2855 } 2866 2856 } 2867 2857
+5
drivers/scsi/pm8001/pm8001_sas.c
··· 769 769 res = -TMF_RESP_FUNC_FAILED; 770 770 /* Even TMF timed out, return direct. */ 771 771 if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { 772 + struct pm8001_ccb_info *ccb = task->lldd_task; 773 + 772 774 pm8001_dbg(pm8001_ha, FAIL, "TMF task[%x]timeout.\n", 773 775 tmf->tmf); 776 + 777 + if (ccb) 778 + ccb->task = NULL; 774 779 goto ex_err; 775 780 } 776 781
+3 -28
drivers/scsi/pm8001/pm80xx_hwi.c
··· 2185 2185 pm8001_dbg(pm8001_ha, FAIL, 2186 2186 "task 0x%p done with io_status 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n", 2187 2187 t, status, ts->resp, ts->stat); 2188 + pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2188 2189 if (t->slow_task) 2189 2190 complete(&t->slow_task->completion); 2190 - pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2191 2191 } else { 2192 2192 spin_unlock_irqrestore(&t->task_state_lock, flags); 2193 2193 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); ··· 2794 2794 pm8001_dbg(pm8001_ha, FAIL, 2795 2795 "task 0x%p done with io_status 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n", 2796 2796 t, status, ts->resp, ts->stat); 2797 + pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2797 2798 if (t->slow_task) 2798 2799 complete(&t->slow_task->completion); 2799 - pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2800 2800 } else { 2801 2801 spin_unlock_irqrestore(&t->task_state_lock, flags); 2802 2802 spin_unlock_irqrestore(&circularQ->oq_lock, ··· 2821 2821 u32 tag = le32_to_cpu(psataPayload->tag); 2822 2822 u32 port_id = le32_to_cpu(psataPayload->port_id); 2823 2823 u32 dev_id = le32_to_cpu(psataPayload->device_id); 2824 - unsigned long flags; 2825 2824 2826 2825 if (event) 2827 2826 pm8001_dbg(pm8001_ha, FAIL, "SATA EVENT 0x%x\n", event); ··· 2853 2854 ts->resp = SAS_TASK_COMPLETE; 2854 2855 ts->stat = SAS_DATA_OVERRUN; 2855 2856 ts->residual = 0; 2856 - if (pm8001_dev) 2857 - atomic_dec(&pm8001_dev->running_req); 2858 2857 break; 2859 2858 case IO_XFER_ERROR_BREAK: 2860 2859 pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_BREAK\n"); ··· 2901 2904 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS); 2902 2905 ts->resp = SAS_TASK_COMPLETE; 2903 2906 ts->stat = SAS_QUEUE_FULL; 2904 - spin_unlock_irqrestore(&circularQ->oq_lock, 2905 - circularQ->lock_flags); 2906 - pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); 2907 - spin_lock_irqsave(&circularQ->oq_lock, 2908 - circularQ->lock_flags); 2909 2907 return; 2910 2908 } 2911 2909 break; ··· 2999 3007 ts->resp = SAS_TASK_COMPLETE; 3000 3008 ts->stat = SAS_OPEN_TO; 3001 3009 break; 3002 - } 3003 - spin_lock_irqsave(&t->task_state_lock, flags); 3004 - t->task_state_flags &= ~SAS_TASK_STATE_PENDING; 3005 - t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; 3006 - t->task_state_flags |= SAS_TASK_STATE_DONE; 3007 - if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) { 3008 - spin_unlock_irqrestore(&t->task_state_lock, flags); 3009 - pm8001_dbg(pm8001_ha, FAIL, 3010 - "task 0x%p done with io_status 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n", 3011 - t, event, ts->resp, ts->stat); 3012 - pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 3013 - } else { 3014 - spin_unlock_irqrestore(&t->task_state_lock, flags); 3015 - spin_unlock_irqrestore(&circularQ->oq_lock, 3016 - circularQ->lock_flags); 3017 - pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); 3018 - spin_lock_irqsave(&circularQ->oq_lock, 3019 - circularQ->lock_flags); 3020 3010 } 3021 3011 } 3022 3012 ··· 3905 3931 /** 3906 3932 * process_one_iomb - process one outbound Queue memory block 3907 3933 * @pm8001_ha: our hba card information 3934 + * @circularQ: outbound circular queue 3908 3935 * @piomb: IO message buffer 3909 3936 */ 3910 3937 static void process_one_iomb(struct pm8001_hba_info *pm8001_ha,
+50 -5
drivers/scsi/scsi_scan.c
··· 214 214 SCSI_TIMEOUT, 3, NULL); 215 215 } 216 216 217 + static int scsi_realloc_sdev_budget_map(struct scsi_device *sdev, 218 + unsigned int depth) 219 + { 220 + int new_shift = sbitmap_calculate_shift(depth); 221 + bool need_alloc = !sdev->budget_map.map; 222 + bool need_free = false; 223 + int ret; 224 + struct sbitmap sb_backup; 225 + 226 + /* 227 + * realloc if new shift is calculated, which is caused by setting 228 + * up one new default queue depth after calling ->slave_configure 229 + */ 230 + if (!need_alloc && new_shift != sdev->budget_map.shift) 231 + need_alloc = need_free = true; 232 + 233 + if (!need_alloc) 234 + return 0; 235 + 236 + /* 237 + * Request queue has to be frozen for reallocating budget map, 238 + * and here disk isn't added yet, so freezing is pretty fast 239 + */ 240 + if (need_free) { 241 + blk_mq_freeze_queue(sdev->request_queue); 242 + sb_backup = sdev->budget_map; 243 + } 244 + ret = sbitmap_init_node(&sdev->budget_map, 245 + scsi_device_max_queue_depth(sdev), 246 + new_shift, GFP_KERNEL, 247 + sdev->request_queue->node, false, true); 248 + if (need_free) { 249 + if (ret) 250 + sdev->budget_map = sb_backup; 251 + else 252 + sbitmap_free(&sb_backup); 253 + ret = 0; 254 + blk_mq_unfreeze_queue(sdev->request_queue); 255 + } 256 + return ret; 257 + } 258 + 217 259 /** 218 260 * scsi_alloc_sdev - allocate and setup a scsi_Device 219 261 * @starget: which target to allocate a &scsi_device for ··· 348 306 * default device queue depth to figure out sbitmap shift 349 307 * since we use this queue depth most of times. 350 308 */ 351 - if (sbitmap_init_node(&sdev->budget_map, 352 - scsi_device_max_queue_depth(sdev), 353 - sbitmap_calculate_shift(depth), 354 - GFP_KERNEL, sdev->request_queue->node, 355 - false, true)) { 309 + if (scsi_realloc_sdev_budget_map(sdev, depth)) { 356 310 put_device(&starget->dev); 357 311 kfree(sdev); 358 312 goto out; ··· 1055 1017 } 1056 1018 return SCSI_SCAN_NO_RESPONSE; 1057 1019 } 1020 + 1021 + /* 1022 + * The queue_depth is often changed in ->slave_configure. 1023 + * Set up budget map again since memory consumption of 1024 + * the map depends on actual queue depth. 1025 + */ 1026 + scsi_realloc_sdev_budget_map(sdev, sdev->queue_depth); 1058 1027 } 1059 1028 1060 1029 if (sdev->scsi_level >= SCSI_3)
+20
drivers/video/console/Kconfig
··· 78 78 help 79 79 Low-level framebuffer-based console driver. 80 80 81 + config FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION 82 + bool "Enable legacy fbcon hardware acceleration code" 83 + depends on FRAMEBUFFER_CONSOLE 84 + default y if PARISC 85 + default n 86 + help 87 + This option enables the fbcon (framebuffer text-based) hardware 88 + acceleration for graphics drivers which were written for the fbdev 89 + graphics interface. 90 + 91 + On modern machines, on mainstream machines (like x86-64) or when 92 + using a modern Linux distribution those fbdev drivers usually aren't used. 93 + So enabling this option wouldn't have any effect, which is why you want 94 + to disable this option on such newer machines. 95 + 96 + If you compile this kernel for older machines which still require the 97 + fbdev drivers, you may want to say Y. 98 + 99 + If unsure, select n. 100 + 81 101 config FRAMEBUFFER_CONSOLE_DETECT_PRIMARY 82 102 bool "Map the console to the primary display device" 83 103 depends on FRAMEBUFFER_CONSOLE
+16
drivers/video/fbdev/core/bitblit.c
··· 43 43 } 44 44 } 45 45 46 + static void bit_bmove(struct vc_data *vc, struct fb_info *info, int sy, 47 + int sx, int dy, int dx, int height, int width) 48 + { 49 + struct fb_copyarea area; 50 + 51 + area.sx = sx * vc->vc_font.width; 52 + area.sy = sy * vc->vc_font.height; 53 + area.dx = dx * vc->vc_font.width; 54 + area.dy = dy * vc->vc_font.height; 55 + area.height = height * vc->vc_font.height; 56 + area.width = width * vc->vc_font.width; 57 + 58 + info->fbops->fb_copyarea(info, &area); 59 + } 60 + 46 61 static void bit_clear(struct vc_data *vc, struct fb_info *info, int sy, 47 62 int sx, int height, int width) 48 63 { ··· 393 378 394 379 void fbcon_set_bitops(struct fbcon_ops *ops) 395 380 { 381 + ops->bmove = bit_bmove; 396 382 ops->clear = bit_clear; 397 383 ops->putcs = bit_putcs; 398 384 ops->clear_margins = bit_clear_margins;
+536 -21
drivers/video/fbdev/core/fbcon.c
··· 173 173 int count, int ypos, int xpos); 174 174 static void fbcon_clear_margins(struct vc_data *vc, int bottom_only); 175 175 static void fbcon_cursor(struct vc_data *vc, int mode); 176 + static void fbcon_bmove(struct vc_data *vc, int sy, int sx, int dy, int dx, 177 + int height, int width); 176 178 static int fbcon_switch(struct vc_data *vc); 177 179 static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch); 178 180 static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table); ··· 182 180 /* 183 181 * Internal routines 184 182 */ 183 + static __inline__ void ywrap_up(struct vc_data *vc, int count); 184 + static __inline__ void ywrap_down(struct vc_data *vc, int count); 185 + static __inline__ void ypan_up(struct vc_data *vc, int count); 186 + static __inline__ void ypan_down(struct vc_data *vc, int count); 187 + static void fbcon_bmove_rec(struct vc_data *vc, struct fbcon_display *p, int sy, int sx, 188 + int dy, int dx, int height, int width, u_int y_break); 185 189 static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var, 186 190 int unit); 191 + static void fbcon_redraw_move(struct vc_data *vc, struct fbcon_display *p, 192 + int line, int count, int dy); 187 193 static void fbcon_modechanged(struct fb_info *info); 188 194 static void fbcon_set_all_vcs(struct fb_info *info); 189 195 static void fbcon_start(void); ··· 1025 1015 struct vc_data *svc = *default_mode; 1026 1016 struct fbcon_display *t, *p = &fb_display[vc->vc_num]; 1027 1017 int logo = 1, new_rows, new_cols, rows, cols; 1028 - int ret; 1018 + int cap, ret; 1029 1019 1030 1020 if (WARN_ON(info_idx == -1)) 1031 1021 return; ··· 1034 1024 con2fb_map[vc->vc_num] = info_idx; 1035 1025 1036 1026 info = registered_fb[con2fb_map[vc->vc_num]]; 1027 + cap = info->flags; 1037 1028 1038 1029 if (logo_shown < 0 && console_loglevel <= CONSOLE_LOGLEVEL_QUIET) 1039 1030 logo_shown = FBCON_LOGO_DONTSHOW; ··· 1136 1125 1137 1126 ops->graphics = 0; 1138 1127 1128 + #ifdef CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION 1129 + if ((cap & FBINFO_HWACCEL_COPYAREA) && 1130 + !(cap & FBINFO_HWACCEL_DISABLED)) 1131 + p->scrollmode = SCROLL_MOVE; 1132 + else /* default to something safe */ 1133 + p->scrollmode = SCROLL_REDRAW; 1134 + #endif 1135 + 1139 1136 /* 1140 1137 * ++guenther: console.c:vc_allocate() relies on initializing 1141 1138 * vc_{cols,rows}, but we must not set those if we are only ··· 1230 1211 * This system is now divided into two levels because of complications 1231 1212 * caused by hardware scrolling. Top level functions: 1232 1213 * 1233 - * fbcon_clear(), fbcon_putc(), fbcon_clear_margins() 1214 + * fbcon_bmove(), fbcon_clear(), fbcon_putc(), fbcon_clear_margins() 1234 1215 * 1235 1216 * handles y values in range [0, scr_height-1] that correspond to real 1236 1217 * screen positions. y_wrap shift means that first line of bitmap may be 1237 1218 * anywhere on this display. These functions convert lineoffsets to 1238 1219 * bitmap offsets and deal with the wrap-around case by splitting blits. 1239 1220 * 1221 + * fbcon_bmove_physical_8() -- These functions fast implementations 1240 1222 * fbcon_clear_physical_8() -- of original fbcon_XXX fns. 1241 1223 * fbcon_putc_physical_8() -- (font width != 8) may be added later 1242 1224 * ··· 1410 1390 } 1411 1391 } 1412 1392 1393 + static __inline__ void ywrap_up(struct vc_data *vc, int count) 1394 + { 1395 + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; 1396 + struct fbcon_ops *ops = info->fbcon_par; 1397 + struct fbcon_display *p = &fb_display[vc->vc_num]; 1398 + 1399 + p->yscroll += count; 1400 + if (p->yscroll >= p->vrows) /* Deal with wrap */ 1401 + p->yscroll -= p->vrows; 1402 + ops->var.xoffset = 0; 1403 + ops->var.yoffset = p->yscroll * vc->vc_font.height; 1404 + ops->var.vmode |= FB_VMODE_YWRAP; 1405 + ops->update_start(info); 1406 + scrollback_max += count; 1407 + if (scrollback_max > scrollback_phys_max) 1408 + scrollback_max = scrollback_phys_max; 1409 + scrollback_current = 0; 1410 + } 1411 + 1412 + static __inline__ void ywrap_down(struct vc_data *vc, int count) 1413 + { 1414 + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; 1415 + struct fbcon_ops *ops = info->fbcon_par; 1416 + struct fbcon_display *p = &fb_display[vc->vc_num]; 1417 + 1418 + p->yscroll -= count; 1419 + if (p->yscroll < 0) /* Deal with wrap */ 1420 + p->yscroll += p->vrows; 1421 + ops->var.xoffset = 0; 1422 + ops->var.yoffset = p->yscroll * vc->vc_font.height; 1423 + ops->var.vmode |= FB_VMODE_YWRAP; 1424 + ops->update_start(info); 1425 + scrollback_max -= count; 1426 + if (scrollback_max < 0) 1427 + scrollback_max = 0; 1428 + scrollback_current = 0; 1429 + } 1430 + 1431 + static __inline__ void ypan_up(struct vc_data *vc, int count) 1432 + { 1433 + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; 1434 + struct fbcon_display *p = &fb_display[vc->vc_num]; 1435 + struct fbcon_ops *ops = info->fbcon_par; 1436 + 1437 + p->yscroll += count; 1438 + if (p->yscroll > p->vrows - vc->vc_rows) { 1439 + ops->bmove(vc, info, p->vrows - vc->vc_rows, 1440 + 0, 0, 0, vc->vc_rows, vc->vc_cols); 1441 + p->yscroll -= p->vrows - vc->vc_rows; 1442 + } 1443 + 1444 + ops->var.xoffset = 0; 1445 + ops->var.yoffset = p->yscroll * vc->vc_font.height; 1446 + ops->var.vmode &= ~FB_VMODE_YWRAP; 1447 + ops->update_start(info); 1448 + fbcon_clear_margins(vc, 1); 1449 + scrollback_max += count; 1450 + if (scrollback_max > scrollback_phys_max) 1451 + scrollback_max = scrollback_phys_max; 1452 + scrollback_current = 0; 1453 + } 1454 + 1455 + static __inline__ void ypan_up_redraw(struct vc_data *vc, int t, int count) 1456 + { 1457 + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; 1458 + struct fbcon_ops *ops = info->fbcon_par; 1459 + struct fbcon_display *p = &fb_display[vc->vc_num]; 1460 + 1461 + p->yscroll += count; 1462 + 1463 + if (p->yscroll > p->vrows - vc->vc_rows) { 1464 + p->yscroll -= p->vrows - vc->vc_rows; 1465 + fbcon_redraw_move(vc, p, t + count, vc->vc_rows - count, t); 1466 + } 1467 + 1468 + ops->var.xoffset = 0; 1469 + ops->var.yoffset = p->yscroll * vc->vc_font.height; 1470 + ops->var.vmode &= ~FB_VMODE_YWRAP; 1471 + ops->update_start(info); 1472 + fbcon_clear_margins(vc, 1); 1473 + scrollback_max += count; 1474 + if (scrollback_max > scrollback_phys_max) 1475 + scrollback_max = scrollback_phys_max; 1476 + scrollback_current = 0; 1477 + } 1478 + 1479 + static __inline__ void ypan_down(struct vc_data *vc, int count) 1480 + { 1481 + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; 1482 + struct fbcon_display *p = &fb_display[vc->vc_num]; 1483 + struct fbcon_ops *ops = info->fbcon_par; 1484 + 1485 + p->yscroll -= count; 1486 + if (p->yscroll < 0) { 1487 + ops->bmove(vc, info, 0, 0, p->vrows - vc->vc_rows, 1488 + 0, vc->vc_rows, vc->vc_cols); 1489 + p->yscroll += p->vrows - vc->vc_rows; 1490 + } 1491 + 1492 + ops->var.xoffset = 0; 1493 + ops->var.yoffset = p->yscroll * vc->vc_font.height; 1494 + ops->var.vmode &= ~FB_VMODE_YWRAP; 1495 + ops->update_start(info); 1496 + fbcon_clear_margins(vc, 1); 1497 + scrollback_max -= count; 1498 + if (scrollback_max < 0) 1499 + scrollback_max = 0; 1500 + scrollback_current = 0; 1501 + } 1502 + 1503 + static __inline__ void ypan_down_redraw(struct vc_data *vc, int t, int count) 1504 + { 1505 + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; 1506 + struct fbcon_ops *ops = info->fbcon_par; 1507 + struct fbcon_display *p = &fb_display[vc->vc_num]; 1508 + 1509 + p->yscroll -= count; 1510 + 1511 + if (p->yscroll < 0) { 1512 + p->yscroll += p->vrows - vc->vc_rows; 1513 + fbcon_redraw_move(vc, p, t, vc->vc_rows - count, t + count); 1514 + } 1515 + 1516 + ops->var.xoffset = 0; 1517 + ops->var.yoffset = p->yscroll * vc->vc_font.height; 1518 + ops->var.vmode &= ~FB_VMODE_YWRAP; 1519 + ops->update_start(info); 1520 + fbcon_clear_margins(vc, 1); 1521 + scrollback_max -= count; 1522 + if (scrollback_max < 0) 1523 + scrollback_max = 0; 1524 + scrollback_current = 0; 1525 + } 1526 + 1527 + static void fbcon_redraw_move(struct vc_data *vc, struct fbcon_display *p, 1528 + int line, int count, int dy) 1529 + { 1530 + unsigned short *s = (unsigned short *) 1531 + (vc->vc_origin + vc->vc_size_row * line); 1532 + 1533 + while (count--) { 1534 + unsigned short *start = s; 1535 + unsigned short *le = advance_row(s, 1); 1536 + unsigned short c; 1537 + int x = 0; 1538 + unsigned short attr = 1; 1539 + 1540 + do { 1541 + c = scr_readw(s); 1542 + if (attr != (c & 0xff00)) { 1543 + attr = c & 0xff00; 1544 + if (s > start) { 1545 + fbcon_putcs(vc, start, s - start, 1546 + dy, x); 1547 + x += s - start; 1548 + start = s; 1549 + } 1550 + } 1551 + console_conditional_schedule(); 1552 + s++; 1553 + } while (s < le); 1554 + if (s > start) 1555 + fbcon_putcs(vc, start, s - start, dy, x); 1556 + console_conditional_schedule(); 1557 + dy++; 1558 + } 1559 + } 1560 + 1561 + static void fbcon_redraw_blit(struct vc_data *vc, struct fb_info *info, 1562 + struct fbcon_display *p, int line, int count, int ycount) 1563 + { 1564 + int offset = ycount * vc->vc_cols; 1565 + unsigned short *d = (unsigned short *) 1566 + (vc->vc_origin + vc->vc_size_row * line); 1567 + unsigned short *s = d + offset; 1568 + struct fbcon_ops *ops = info->fbcon_par; 1569 + 1570 + while (count--) { 1571 + unsigned short *start = s; 1572 + unsigned short *le = advance_row(s, 1); 1573 + unsigned short c; 1574 + int x = 0; 1575 + 1576 + do { 1577 + c = scr_readw(s); 1578 + 1579 + if (c == scr_readw(d)) { 1580 + if (s > start) { 1581 + ops->bmove(vc, info, line + ycount, x, 1582 + line, x, 1, s-start); 1583 + x += s - start + 1; 1584 + start = s + 1; 1585 + } else { 1586 + x++; 1587 + start++; 1588 + } 1589 + } 1590 + 1591 + scr_writew(c, d); 1592 + console_conditional_schedule(); 1593 + s++; 1594 + d++; 1595 + } while (s < le); 1596 + if (s > start) 1597 + ops->bmove(vc, info, line + ycount, x, line, x, 1, 1598 + s-start); 1599 + console_conditional_schedule(); 1600 + if (ycount > 0) 1601 + line++; 1602 + else { 1603 + line--; 1604 + /* NOTE: We subtract two lines from these pointers */ 1605 + s -= vc->vc_size_row; 1606 + d -= vc->vc_size_row; 1607 + } 1608 + } 1609 + } 1610 + 1413 1611 static void fbcon_redraw(struct vc_data *vc, struct fbcon_display *p, 1414 1612 int line, int count, int offset) 1415 1613 { ··· 1688 1450 { 1689 1451 struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; 1690 1452 struct fbcon_display *p = &fb_display[vc->vc_num]; 1453 + int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK; 1691 1454 1692 1455 if (fbcon_is_inactive(vc, info)) 1693 1456 return true; ··· 1705 1466 case SM_UP: 1706 1467 if (count > vc->vc_rows) /* Maximum realistic size */ 1707 1468 count = vc->vc_rows; 1708 - fbcon_redraw(vc, p, t, b - t - count, 1709 - count * vc->vc_cols); 1710 - fbcon_clear(vc, b - count, 0, count, vc->vc_cols); 1711 - scr_memsetw((unsigned short *) (vc->vc_origin + 1712 - vc->vc_size_row * 1713 - (b - count)), 1714 - vc->vc_video_erase_char, 1715 - vc->vc_size_row * count); 1716 - return true; 1469 + if (logo_shown >= 0) 1470 + goto redraw_up; 1471 + switch (fb_scrollmode(p)) { 1472 + case SCROLL_MOVE: 1473 + fbcon_redraw_blit(vc, info, p, t, b - t - count, 1474 + count); 1475 + fbcon_clear(vc, b - count, 0, count, vc->vc_cols); 1476 + scr_memsetw((unsigned short *) (vc->vc_origin + 1477 + vc->vc_size_row * 1478 + (b - count)), 1479 + vc->vc_video_erase_char, 1480 + vc->vc_size_row * count); 1481 + return true; 1482 + 1483 + case SCROLL_WRAP_MOVE: 1484 + if (b - t - count > 3 * vc->vc_rows >> 2) { 1485 + if (t > 0) 1486 + fbcon_bmove(vc, 0, 0, count, 0, t, 1487 + vc->vc_cols); 1488 + ywrap_up(vc, count); 1489 + if (vc->vc_rows - b > 0) 1490 + fbcon_bmove(vc, b - count, 0, b, 0, 1491 + vc->vc_rows - b, 1492 + vc->vc_cols); 1493 + } else if (info->flags & FBINFO_READS_FAST) 1494 + fbcon_bmove(vc, t + count, 0, t, 0, 1495 + b - t - count, vc->vc_cols); 1496 + else 1497 + goto redraw_up; 1498 + fbcon_clear(vc, b - count, 0, count, vc->vc_cols); 1499 + break; 1500 + 1501 + case SCROLL_PAN_REDRAW: 1502 + if ((p->yscroll + count <= 1503 + 2 * (p->vrows - vc->vc_rows)) 1504 + && ((!scroll_partial && (b - t == vc->vc_rows)) 1505 + || (scroll_partial 1506 + && (b - t - count > 1507 + 3 * vc->vc_rows >> 2)))) { 1508 + if (t > 0) 1509 + fbcon_redraw_move(vc, p, 0, t, count); 1510 + ypan_up_redraw(vc, t, count); 1511 + if (vc->vc_rows - b > 0) 1512 + fbcon_redraw_move(vc, p, b, 1513 + vc->vc_rows - b, b); 1514 + } else 1515 + fbcon_redraw_move(vc, p, t + count, b - t - count, t); 1516 + fbcon_clear(vc, b - count, 0, count, vc->vc_cols); 1517 + break; 1518 + 1519 + case SCROLL_PAN_MOVE: 1520 + if ((p->yscroll + count <= 1521 + 2 * (p->vrows - vc->vc_rows)) 1522 + && ((!scroll_partial && (b - t == vc->vc_rows)) 1523 + || (scroll_partial 1524 + && (b - t - count > 1525 + 3 * vc->vc_rows >> 2)))) { 1526 + if (t > 0) 1527 + fbcon_bmove(vc, 0, 0, count, 0, t, 1528 + vc->vc_cols); 1529 + ypan_up(vc, count); 1530 + if (vc->vc_rows - b > 0) 1531 + fbcon_bmove(vc, b - count, 0, b, 0, 1532 + vc->vc_rows - b, 1533 + vc->vc_cols); 1534 + } else if (info->flags & FBINFO_READS_FAST) 1535 + fbcon_bmove(vc, t + count, 0, t, 0, 1536 + b - t - count, vc->vc_cols); 1537 + else 1538 + goto redraw_up; 1539 + fbcon_clear(vc, b - count, 0, count, vc->vc_cols); 1540 + break; 1541 + 1542 + case SCROLL_REDRAW: 1543 + redraw_up: 1544 + fbcon_redraw(vc, p, t, b - t - count, 1545 + count * vc->vc_cols); 1546 + fbcon_clear(vc, b - count, 0, count, vc->vc_cols); 1547 + scr_memsetw((unsigned short *) (vc->vc_origin + 1548 + vc->vc_size_row * 1549 + (b - count)), 1550 + vc->vc_video_erase_char, 1551 + vc->vc_size_row * count); 1552 + return true; 1553 + } 1554 + break; 1717 1555 1718 1556 case SM_DOWN: 1719 1557 if (count > vc->vc_rows) /* Maximum realistic size */ 1720 1558 count = vc->vc_rows; 1721 - fbcon_redraw(vc, p, b - 1, b - t - count, 1722 - -count * vc->vc_cols); 1723 - fbcon_clear(vc, t, 0, count, vc->vc_cols); 1724 - scr_memsetw((unsigned short *) (vc->vc_origin + 1725 - vc->vc_size_row * 1726 - t), 1727 - vc->vc_video_erase_char, 1728 - vc->vc_size_row * count); 1729 - return true; 1559 + if (logo_shown >= 0) 1560 + goto redraw_down; 1561 + switch (fb_scrollmode(p)) { 1562 + case SCROLL_MOVE: 1563 + fbcon_redraw_blit(vc, info, p, b - 1, b - t - count, 1564 + -count); 1565 + fbcon_clear(vc, t, 0, count, vc->vc_cols); 1566 + scr_memsetw((unsigned short *) (vc->vc_origin + 1567 + vc->vc_size_row * 1568 + t), 1569 + vc->vc_video_erase_char, 1570 + vc->vc_size_row * count); 1571 + return true; 1572 + 1573 + case SCROLL_WRAP_MOVE: 1574 + if (b - t - count > 3 * vc->vc_rows >> 2) { 1575 + if (vc->vc_rows - b > 0) 1576 + fbcon_bmove(vc, b, 0, b - count, 0, 1577 + vc->vc_rows - b, 1578 + vc->vc_cols); 1579 + ywrap_down(vc, count); 1580 + if (t > 0) 1581 + fbcon_bmove(vc, count, 0, 0, 0, t, 1582 + vc->vc_cols); 1583 + } else if (info->flags & FBINFO_READS_FAST) 1584 + fbcon_bmove(vc, t, 0, t + count, 0, 1585 + b - t - count, vc->vc_cols); 1586 + else 1587 + goto redraw_down; 1588 + fbcon_clear(vc, t, 0, count, vc->vc_cols); 1589 + break; 1590 + 1591 + case SCROLL_PAN_MOVE: 1592 + if ((count - p->yscroll <= p->vrows - vc->vc_rows) 1593 + && ((!scroll_partial && (b - t == vc->vc_rows)) 1594 + || (scroll_partial 1595 + && (b - t - count > 1596 + 3 * vc->vc_rows >> 2)))) { 1597 + if (vc->vc_rows - b > 0) 1598 + fbcon_bmove(vc, b, 0, b - count, 0, 1599 + vc->vc_rows - b, 1600 + vc->vc_cols); 1601 + ypan_down(vc, count); 1602 + if (t > 0) 1603 + fbcon_bmove(vc, count, 0, 0, 0, t, 1604 + vc->vc_cols); 1605 + } else if (info->flags & FBINFO_READS_FAST) 1606 + fbcon_bmove(vc, t, 0, t + count, 0, 1607 + b - t - count, vc->vc_cols); 1608 + else 1609 + goto redraw_down; 1610 + fbcon_clear(vc, t, 0, count, vc->vc_cols); 1611 + break; 1612 + 1613 + case SCROLL_PAN_REDRAW: 1614 + if ((count - p->yscroll <= p->vrows - vc->vc_rows) 1615 + && ((!scroll_partial && (b - t == vc->vc_rows)) 1616 + || (scroll_partial 1617 + && (b - t - count > 1618 + 3 * vc->vc_rows >> 2)))) { 1619 + if (vc->vc_rows - b > 0) 1620 + fbcon_redraw_move(vc, p, b, vc->vc_rows - b, 1621 + b - count); 1622 + ypan_down_redraw(vc, t, count); 1623 + if (t > 0) 1624 + fbcon_redraw_move(vc, p, count, t, 0); 1625 + } else 1626 + fbcon_redraw_move(vc, p, t, b - t - count, t + count); 1627 + fbcon_clear(vc, t, 0, count, vc->vc_cols); 1628 + break; 1629 + 1630 + case SCROLL_REDRAW: 1631 + redraw_down: 1632 + fbcon_redraw(vc, p, b - 1, b - t - count, 1633 + -count * vc->vc_cols); 1634 + fbcon_clear(vc, t, 0, count, vc->vc_cols); 1635 + scr_memsetw((unsigned short *) (vc->vc_origin + 1636 + vc->vc_size_row * 1637 + t), 1638 + vc->vc_video_erase_char, 1639 + vc->vc_size_row * count); 1640 + return true; 1641 + } 1730 1642 } 1731 1643 return false; 1644 + } 1645 + 1646 + 1647 + static void fbcon_bmove(struct vc_data *vc, int sy, int sx, int dy, int dx, 1648 + int height, int width) 1649 + { 1650 + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; 1651 + struct fbcon_display *p = &fb_display[vc->vc_num]; 1652 + 1653 + if (fbcon_is_inactive(vc, info)) 1654 + return; 1655 + 1656 + if (!width || !height) 1657 + return; 1658 + 1659 + /* Split blits that cross physical y_wrap case. 1660 + * Pathological case involves 4 blits, better to use recursive 1661 + * code rather than unrolled case 1662 + * 1663 + * Recursive invocations don't need to erase the cursor over and 1664 + * over again, so we use fbcon_bmove_rec() 1665 + */ 1666 + fbcon_bmove_rec(vc, p, sy, sx, dy, dx, height, width, 1667 + p->vrows - p->yscroll); 1668 + } 1669 + 1670 + static void fbcon_bmove_rec(struct vc_data *vc, struct fbcon_display *p, int sy, int sx, 1671 + int dy, int dx, int height, int width, u_int y_break) 1672 + { 1673 + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; 1674 + struct fbcon_ops *ops = info->fbcon_par; 1675 + u_int b; 1676 + 1677 + if (sy < y_break && sy + height > y_break) { 1678 + b = y_break - sy; 1679 + if (dy < sy) { /* Avoid trashing self */ 1680 + fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width, 1681 + y_break); 1682 + fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx, 1683 + height - b, width, y_break); 1684 + } else { 1685 + fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx, 1686 + height - b, width, y_break); 1687 + fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width, 1688 + y_break); 1689 + } 1690 + return; 1691 + } 1692 + 1693 + if (dy < y_break && dy + height > y_break) { 1694 + b = y_break - dy; 1695 + if (dy < sy) { /* Avoid trashing self */ 1696 + fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width, 1697 + y_break); 1698 + fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx, 1699 + height - b, width, y_break); 1700 + } else { 1701 + fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx, 1702 + height - b, width, y_break); 1703 + fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width, 1704 + y_break); 1705 + } 1706 + return; 1707 + } 1708 + ops->bmove(vc, info, real_y(p, sy), sx, real_y(p, dy), dx, 1709 + height, width); 1710 + } 1711 + 1712 + static void updatescrollmode_accel(struct fbcon_display *p, 1713 + struct fb_info *info, 1714 + struct vc_data *vc) 1715 + { 1716 + #ifdef CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION 1717 + struct fbcon_ops *ops = info->fbcon_par; 1718 + int cap = info->flags; 1719 + u16 t = 0; 1720 + int ypan = FBCON_SWAP(ops->rotate, info->fix.ypanstep, 1721 + info->fix.xpanstep); 1722 + int ywrap = FBCON_SWAP(ops->rotate, info->fix.ywrapstep, t); 1723 + int yres = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres); 1724 + int vyres = FBCON_SWAP(ops->rotate, info->var.yres_virtual, 1725 + info->var.xres_virtual); 1726 + int good_pan = (cap & FBINFO_HWACCEL_YPAN) && 1727 + divides(ypan, vc->vc_font.height) && vyres > yres; 1728 + int good_wrap = (cap & FBINFO_HWACCEL_YWRAP) && 1729 + divides(ywrap, vc->vc_font.height) && 1730 + divides(vc->vc_font.height, vyres) && 1731 + divides(vc->vc_font.height, yres); 1732 + int reading_fast = cap & FBINFO_READS_FAST; 1733 + int fast_copyarea = (cap & FBINFO_HWACCEL_COPYAREA) && 1734 + !(cap & FBINFO_HWACCEL_DISABLED); 1735 + int fast_imageblit = (cap & FBINFO_HWACCEL_IMAGEBLIT) && 1736 + !(cap & FBINFO_HWACCEL_DISABLED); 1737 + 1738 + if (good_wrap || good_pan) { 1739 + if (reading_fast || fast_copyarea) 1740 + p->scrollmode = good_wrap ? 1741 + SCROLL_WRAP_MOVE : SCROLL_PAN_MOVE; 1742 + else 1743 + p->scrollmode = good_wrap ? SCROLL_REDRAW : 1744 + SCROLL_PAN_REDRAW; 1745 + } else { 1746 + if (reading_fast || (fast_copyarea && !fast_imageblit)) 1747 + p->scrollmode = SCROLL_MOVE; 1748 + else 1749 + p->scrollmode = SCROLL_REDRAW; 1750 + } 1751 + #endif 1732 1752 } 1733 1753 1734 1754 static void updatescrollmode(struct fbcon_display *p, ··· 2005 1507 p->vrows -= (yres - (fh * vc->vc_rows)) / fh; 2006 1508 if ((yres % fh) && (vyres % fh < yres % fh)) 2007 1509 p->vrows--; 1510 + 1511 + /* update scrollmode in case hardware acceleration is used */ 1512 + updatescrollmode_accel(p, info, vc); 2008 1513 } 2009 1514 2010 1515 #define PITCH(w) (((w) + 7) >> 3) ··· 2165 1664 2166 1665 updatescrollmode(p, info, vc); 2167 1666 2168 - scrollback_phys_max = 0; 1667 + switch (fb_scrollmode(p)) { 1668 + case SCROLL_WRAP_MOVE: 1669 + scrollback_phys_max = p->vrows - vc->vc_rows; 1670 + break; 1671 + case SCROLL_PAN_MOVE: 1672 + case SCROLL_PAN_REDRAW: 1673 + scrollback_phys_max = p->vrows - 2 * vc->vc_rows; 1674 + if (scrollback_phys_max < 0) 1675 + scrollback_phys_max = 0; 1676 + break; 1677 + default: 1678 + scrollback_phys_max = 0; 1679 + break; 1680 + } 1681 + 2169 1682 scrollback_max = 0; 2170 1683 scrollback_current = 0; 2171 1684
+72
drivers/video/fbdev/core/fbcon.h
··· 29 29 /* Filled in by the low-level console driver */ 30 30 const u_char *fontdata; 31 31 int userfont; /* != 0 if fontdata kmalloc()ed */ 32 + #ifdef CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION 33 + u_short scrollmode; /* Scroll Method, use fb_scrollmode() */ 34 + #endif 32 35 u_short inverse; /* != 0 text black on white as default */ 33 36 short yscroll; /* Hardware scrolling */ 34 37 int vrows; /* number of virtual rows */ ··· 54 51 }; 55 52 56 53 struct fbcon_ops { 54 + void (*bmove)(struct vc_data *vc, struct fb_info *info, int sy, 55 + int sx, int dy, int dx, int height, int width); 57 56 void (*clear)(struct vc_data *vc, struct fb_info *info, int sy, 58 57 int sx, int height, int width); 59 58 void (*putcs)(struct vc_data *vc, struct fb_info *info, ··· 153 148 154 149 #define attr_bgcol_ec(bgshift, vc, info) attr_col_ec(bgshift, vc, info, 0) 155 150 #define attr_fgcol_ec(fgshift, vc, info) attr_col_ec(fgshift, vc, info, 1) 151 + 152 + /* 153 + * Scroll Method 154 + */ 155 + 156 + /* There are several methods fbcon can use to move text around the screen: 157 + * 158 + * Operation Pan Wrap 159 + *--------------------------------------------- 160 + * SCROLL_MOVE copyarea No No 161 + * SCROLL_PAN_MOVE copyarea Yes No 162 + * SCROLL_WRAP_MOVE copyarea No Yes 163 + * SCROLL_REDRAW imageblit No No 164 + * SCROLL_PAN_REDRAW imageblit Yes No 165 + * SCROLL_WRAP_REDRAW imageblit No Yes 166 + * 167 + * (SCROLL_WRAP_REDRAW is not implemented yet) 168 + * 169 + * In general, fbcon will choose the best scrolling 170 + * method based on the rule below: 171 + * 172 + * Pan/Wrap > accel imageblit > accel copyarea > 173 + * soft imageblit > (soft copyarea) 174 + * 175 + * Exception to the rule: Pan + accel copyarea is 176 + * preferred over Pan + accel imageblit. 177 + * 178 + * The above is typical for PCI/AGP cards. Unless 179 + * overridden, fbcon will never use soft copyarea. 180 + * 181 + * If you need to override the above rule, set the 182 + * appropriate flags in fb_info->flags. For example, 183 + * to prefer copyarea over imageblit, set 184 + * FBINFO_READS_FAST. 185 + * 186 + * Other notes: 187 + * + use the hardware engine to move the text 188 + * (hw-accelerated copyarea() and fillrect()) 189 + * + use hardware-supported panning on a large virtual screen 190 + * + amifb can not only pan, but also wrap the display by N lines 191 + * (i.e. visible line i = physical line (i+N) % yres). 192 + * + read what's already rendered on the screen and 193 + * write it in a different place (this is cfb_copyarea()) 194 + * + re-render the text to the screen 195 + * 196 + * Whether to use wrapping or panning can only be figured out at 197 + * runtime (when we know whether our font height is a multiple 198 + * of the pan/wrap step) 199 + * 200 + */ 201 + 202 + #define SCROLL_MOVE 0x001 203 + #define SCROLL_PAN_MOVE 0x002 204 + #define SCROLL_WRAP_MOVE 0x003 205 + #define SCROLL_REDRAW 0x004 206 + #define SCROLL_PAN_REDRAW 0x005 207 + 208 + static inline u_short fb_scrollmode(struct fbcon_display *fb) 209 + { 210 + #ifdef CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION 211 + return fb->scrollmode; 212 + #else 213 + /* hardcoded to SCROLL_REDRAW if acceleration was disabled. */ 214 + return SCROLL_REDRAW; 215 + #endif 216 + } 217 + 156 218 157 219 #ifdef CONFIG_FB_TILEBLITTING 158 220 extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info);
+24 -4
drivers/video/fbdev/core/fbcon_ccw.c
··· 59 59 } 60 60 } 61 61 62 + 63 + static void ccw_bmove(struct vc_data *vc, struct fb_info *info, int sy, 64 + int sx, int dy, int dx, int height, int width) 65 + { 66 + struct fbcon_ops *ops = info->fbcon_par; 67 + struct fb_copyarea area; 68 + u32 vyres = GETVYRES(ops->p, info); 69 + 70 + area.sx = sy * vc->vc_font.height; 71 + area.sy = vyres - ((sx + width) * vc->vc_font.width); 72 + area.dx = dy * vc->vc_font.height; 73 + area.dy = vyres - ((dx + width) * vc->vc_font.width); 74 + area.width = height * vc->vc_font.height; 75 + area.height = width * vc->vc_font.width; 76 + 77 + info->fbops->fb_copyarea(info, &area); 78 + } 79 + 62 80 static void ccw_clear(struct vc_data *vc, struct fb_info *info, int sy, 63 81 int sx, int height, int width) 64 82 { 83 + struct fbcon_ops *ops = info->fbcon_par; 65 84 struct fb_fillrect region; 66 85 int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; 67 - u32 vyres = info->var.yres; 86 + u32 vyres = GETVYRES(ops->p, info); 68 87 69 88 region.color = attr_bgcol_ec(bgshift,vc,info); 70 89 region.dx = sy * vc->vc_font.height; ··· 140 121 u32 cnt, pitch, size; 141 122 u32 attribute = get_attribute(info, scr_readw(s)); 142 123 u8 *dst, *buf = NULL; 143 - u32 vyres = info->var.yres; 124 + u32 vyres = GETVYRES(ops->p, info); 144 125 145 126 if (!ops->fontbuffer) 146 127 return; ··· 229 210 int attribute, use_sw = vc->vc_cursor_type & CUR_SW; 230 211 int err = 1, dx, dy; 231 212 char *src; 232 - u32 vyres = info->var.yres; 213 + u32 vyres = GETVYRES(ops->p, info); 233 214 234 215 if (!ops->fontbuffer) 235 216 return; ··· 387 368 { 388 369 struct fbcon_ops *ops = info->fbcon_par; 389 370 u32 yoffset; 390 - u32 vyres = info->var.yres; 371 + u32 vyres = GETVYRES(ops->p, info); 391 372 int err; 392 373 393 374 yoffset = (vyres - info->var.yres) - ops->var.xoffset; ··· 402 383 403 384 void fbcon_rotate_ccw(struct fbcon_ops *ops) 404 385 { 386 + ops->bmove = ccw_bmove; 405 387 ops->clear = ccw_clear; 406 388 ops->putcs = ccw_putcs; 407 389 ops->clear_margins = ccw_clear_margins;
+24 -4
drivers/video/fbdev/core/fbcon_cw.c
··· 44 44 } 45 45 } 46 46 47 + 48 + static void cw_bmove(struct vc_data *vc, struct fb_info *info, int sy, 49 + int sx, int dy, int dx, int height, int width) 50 + { 51 + struct fbcon_ops *ops = info->fbcon_par; 52 + struct fb_copyarea area; 53 + u32 vxres = GETVXRES(ops->p, info); 54 + 55 + area.sx = vxres - ((sy + height) * vc->vc_font.height); 56 + area.sy = sx * vc->vc_font.width; 57 + area.dx = vxres - ((dy + height) * vc->vc_font.height); 58 + area.dy = dx * vc->vc_font.width; 59 + area.width = height * vc->vc_font.height; 60 + area.height = width * vc->vc_font.width; 61 + 62 + info->fbops->fb_copyarea(info, &area); 63 + } 64 + 47 65 static void cw_clear(struct vc_data *vc, struct fb_info *info, int sy, 48 66 int sx, int height, int width) 49 67 { 68 + struct fbcon_ops *ops = info->fbcon_par; 50 69 struct fb_fillrect region; 51 70 int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; 52 - u32 vxres = info->var.xres; 71 + u32 vxres = GETVXRES(ops->p, info); 53 72 54 73 region.color = attr_bgcol_ec(bgshift,vc,info); 55 74 region.dx = vxres - ((sy + height) * vc->vc_font.height); ··· 125 106 u32 cnt, pitch, size; 126 107 u32 attribute = get_attribute(info, scr_readw(s)); 127 108 u8 *dst, *buf = NULL; 128 - u32 vxres = info->var.xres; 109 + u32 vxres = GETVXRES(ops->p, info); 129 110 130 111 if (!ops->fontbuffer) 131 112 return; ··· 212 193 int attribute, use_sw = vc->vc_cursor_type & CUR_SW; 213 194 int err = 1, dx, dy; 214 195 char *src; 215 - u32 vxres = info->var.xres; 196 + u32 vxres = GETVXRES(ops->p, info); 216 197 217 198 if (!ops->fontbuffer) 218 199 return; ··· 369 350 static int cw_update_start(struct fb_info *info) 370 351 { 371 352 struct fbcon_ops *ops = info->fbcon_par; 372 - u32 vxres = info->var.xres; 353 + u32 vxres = GETVXRES(ops->p, info); 373 354 u32 xoffset; 374 355 int err; 375 356 ··· 385 366 386 367 void fbcon_rotate_cw(struct fbcon_ops *ops) 387 368 { 369 + ops->bmove = cw_bmove; 388 370 ops->clear = cw_clear; 389 371 ops->putcs = cw_putcs; 390 372 ops->clear_margins = cw_clear_margins;
+9
drivers/video/fbdev/core/fbcon_rotate.h
··· 11 11 #ifndef _FBCON_ROTATE_H 12 12 #define _FBCON_ROTATE_H 13 13 14 + #define GETVYRES(s,i) ({ \ 15 + (fb_scrollmode(s) == SCROLL_REDRAW || fb_scrollmode(s) == SCROLL_MOVE) ? \ 16 + (i)->var.yres : (i)->var.yres_virtual; }) 17 + 18 + #define GETVXRES(s,i) ({ \ 19 + (fb_scrollmode(s) == SCROLL_REDRAW || fb_scrollmode(s) == SCROLL_MOVE || !(i)->fix.xpanstep) ? \ 20 + (i)->var.xres : (i)->var.xres_virtual; }) 21 + 22 + 14 23 static inline int pattern_test_bit(u32 x, u32 y, u32 pitch, const char *pat) 15 24 { 16 25 u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8;
+29 -8
drivers/video/fbdev/core/fbcon_ud.c
··· 44 44 } 45 45 } 46 46 47 + 48 + static void ud_bmove(struct vc_data *vc, struct fb_info *info, int sy, 49 + int sx, int dy, int dx, int height, int width) 50 + { 51 + struct fbcon_ops *ops = info->fbcon_par; 52 + struct fb_copyarea area; 53 + u32 vyres = GETVYRES(ops->p, info); 54 + u32 vxres = GETVXRES(ops->p, info); 55 + 56 + area.sy = vyres - ((sy + height) * vc->vc_font.height); 57 + area.sx = vxres - ((sx + width) * vc->vc_font.width); 58 + area.dy = vyres - ((dy + height) * vc->vc_font.height); 59 + area.dx = vxres - ((dx + width) * vc->vc_font.width); 60 + area.height = height * vc->vc_font.height; 61 + area.width = width * vc->vc_font.width; 62 + 63 + info->fbops->fb_copyarea(info, &area); 64 + } 65 + 47 66 static void ud_clear(struct vc_data *vc, struct fb_info *info, int sy, 48 67 int sx, int height, int width) 49 68 { 69 + struct fbcon_ops *ops = info->fbcon_par; 50 70 struct fb_fillrect region; 51 71 int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; 52 - u32 vyres = info->var.yres; 53 - u32 vxres = info->var.xres; 72 + u32 vyres = GETVYRES(ops->p, info); 73 + u32 vxres = GETVXRES(ops->p, info); 54 74 55 75 region.color = attr_bgcol_ec(bgshift,vc,info); 56 76 region.dy = vyres - ((sy + height) * vc->vc_font.height); ··· 162 142 u32 mod = vc->vc_font.width % 8, cnt, pitch, size; 163 143 u32 attribute = get_attribute(info, scr_readw(s)); 164 144 u8 *dst, *buf = NULL; 165 - u32 vyres = info->var.yres; 166 - u32 vxres = info->var.xres; 145 + u32 vyres = GETVYRES(ops->p, info); 146 + u32 vxres = GETVXRES(ops->p, info); 167 147 168 148 if (!ops->fontbuffer) 169 149 return; ··· 259 239 int attribute, use_sw = vc->vc_cursor_type & CUR_SW; 260 240 int err = 1, dx, dy; 261 241 char *src; 262 - u32 vyres = info->var.yres; 263 - u32 vxres = info->var.xres; 242 + u32 vyres = GETVYRES(ops->p, info); 243 + u32 vxres = GETVXRES(ops->p, info); 264 244 265 245 if (!ops->fontbuffer) 266 246 return; ··· 410 390 { 411 391 struct fbcon_ops *ops = info->fbcon_par; 412 392 int xoffset, yoffset; 413 - u32 vyres = info->var.yres; 414 - u32 vxres = info->var.xres; 393 + u32 vyres = GETVYRES(ops->p, info); 394 + u32 vxres = GETVXRES(ops->p, info); 415 395 int err; 416 396 417 397 xoffset = vxres - info->var.xres - ops->var.xoffset; ··· 429 409 430 410 void fbcon_rotate_ud(struct fbcon_ops *ops) 431 411 { 412 + ops->bmove = ud_bmove; 432 413 ops->clear = ud_clear; 433 414 ops->putcs = ud_putcs; 434 415 ops->clear_margins = ud_clear_margins;
+16
drivers/video/fbdev/core/tileblit.c
··· 16 16 #include <asm/types.h> 17 17 #include "fbcon.h" 18 18 19 + static void tile_bmove(struct vc_data *vc, struct fb_info *info, int sy, 20 + int sx, int dy, int dx, int height, int width) 21 + { 22 + struct fb_tilearea area; 23 + 24 + area.sx = sx; 25 + area.sy = sy; 26 + area.dx = dx; 27 + area.dy = dy; 28 + area.height = height; 29 + area.width = width; 30 + 31 + info->tileops->fb_tilecopy(info, &area); 32 + } 33 + 19 34 static void tile_clear(struct vc_data *vc, struct fb_info *info, int sy, 20 35 int sx, int height, int width) 21 36 { ··· 133 118 struct fb_tilemap map; 134 119 struct fbcon_ops *ops = info->fbcon_par; 135 120 121 + ops->bmove = tile_bmove; 136 122 ops->clear = tile_clear; 137 123 ops->putcs = tile_putcs; 138 124 ops->clear_margins = tile_clear_margins;
+6 -6
drivers/video/fbdev/skeletonfb.c
··· 505 505 } 506 506 507 507 /** 508 - * xxxfb_copyarea - OBSOLETE function. 508 + * xxxfb_copyarea - REQUIRED function. Can use generic routines if 509 + * non acclerated hardware and packed pixel based. 509 510 * Copies one area of the screen to another area. 510 - * Will be deleted in a future version 511 511 * 512 512 * @info: frame buffer structure that represents a single frame buffer 513 513 * @area: Structure providing the data to copy the framebuffer contents 514 514 * from one region to another. 515 515 * 516 - * This drawing operation copied a rectangular area from one area of the 516 + * This drawing operation copies a rectangular area from one area of the 517 517 * screen to another area. 518 518 */ 519 519 void xxxfb_copyarea(struct fb_info *p, const struct fb_copyarea *area) ··· 645 645 .fb_setcolreg = xxxfb_setcolreg, 646 646 .fb_blank = xxxfb_blank, 647 647 .fb_pan_display = xxxfb_pan_display, 648 - .fb_fillrect = xxxfb_fillrect, /* Needed !!! */ 649 - .fb_copyarea = xxxfb_copyarea, /* Obsolete */ 650 - .fb_imageblit = xxxfb_imageblit, /* Needed !!! */ 648 + .fb_fillrect = xxxfb_fillrect, /* Needed !!! */ 649 + .fb_copyarea = xxxfb_copyarea, /* Needed !!! */ 650 + .fb_imageblit = xxxfb_imageblit, /* Needed !!! */ 651 651 .fb_cursor = xxxfb_cursor, /* Optional !!! */ 652 652 .fb_sync = xxxfb_sync, 653 653 .fb_ioctl = xxxfb_ioctl,
+4 -5
fs/9p/fid.c
··· 96 96 dentry, dentry, from_kuid(&init_user_ns, uid), 97 97 any); 98 98 ret = NULL; 99 - 100 - if (d_inode(dentry)) 101 - ret = v9fs_fid_find_inode(d_inode(dentry), uid); 102 - 103 99 /* we'll recheck under lock if there's anything to look in */ 104 - if (!ret && dentry->d_fsdata) { 100 + if (dentry->d_fsdata) { 105 101 struct hlist_head *h = (struct hlist_head *)&dentry->d_fsdata; 106 102 107 103 spin_lock(&dentry->d_lock); ··· 109 113 } 110 114 } 111 115 spin_unlock(&dentry->d_lock); 116 + } else { 117 + if (dentry->d_inode) 118 + ret = v9fs_fid_find_inode(dentry->d_inode, uid); 112 119 } 113 120 114 121 return ret;
+2 -2
fs/Kconfig
··· 369 369 370 370 config SMBFS_COMMON 371 371 tristate 372 - default y if CIFS=y 373 - default m if CIFS=m 372 + default y if CIFS=y || SMB_SERVER=y 373 + default m if CIFS=m || SMB_SERVER=m 374 374 375 375 source "fs/coda/Kconfig" 376 376 source "fs/afs/Kconfig"
+1 -5
fs/binfmt_misc.c
··· 817 817 }; 818 818 MODULE_ALIAS_FS("binfmt_misc"); 819 819 820 - static struct ctl_table_header *binfmt_misc_header; 821 - 822 820 static int __init init_misc_binfmt(void) 823 821 { 824 822 int err = register_filesystem(&bm_fs_type); 825 823 if (!err) 826 824 insert_binfmt(&misc_format); 827 - binfmt_misc_header = register_sysctl_mount_point("fs/binfmt_misc"); 828 - return 0; 825 + return err; 829 826 } 830 827 831 828 static void __exit exit_misc_binfmt(void) 832 829 { 833 - unregister_sysctl_table(binfmt_misc_header); 834 830 unregister_binfmt(&misc_format); 835 831 unregister_filesystem(&bm_fs_type); 836 832 }
+37 -2
fs/btrfs/block-group.c
··· 124 124 { 125 125 if (refcount_dec_and_test(&cache->refs)) { 126 126 WARN_ON(cache->pinned > 0); 127 - WARN_ON(cache->reserved > 0); 127 + /* 128 + * If there was a failure to cleanup a log tree, very likely due 129 + * to an IO failure on a writeback attempt of one or more of its 130 + * extent buffers, we could not do proper (and cheap) unaccounting 131 + * of their reserved space, so don't warn on reserved > 0 in that 132 + * case. 133 + */ 134 + if (!(cache->flags & BTRFS_BLOCK_GROUP_METADATA) || 135 + !BTRFS_FS_LOG_CLEANUP_ERROR(cache->fs_info)) 136 + WARN_ON(cache->reserved > 0); 128 137 129 138 /* 130 139 * A block_group shouldn't be on the discard_list anymore. ··· 2553 2544 int ret; 2554 2545 bool dirty_bg_running; 2555 2546 2547 + /* 2548 + * This can only happen when we are doing read-only scrub on read-only 2549 + * mount. 2550 + * In that case we should not start a new transaction on read-only fs. 2551 + * Thus here we skip all chunk allocations. 2552 + */ 2553 + if (sb_rdonly(fs_info->sb)) { 2554 + mutex_lock(&fs_info->ro_block_group_mutex); 2555 + ret = inc_block_group_ro(cache, 0); 2556 + mutex_unlock(&fs_info->ro_block_group_mutex); 2557 + return ret; 2558 + } 2559 + 2556 2560 do { 2557 2561 trans = btrfs_join_transaction(root); 2558 2562 if (IS_ERR(trans)) ··· 3996 3974 * important and indicates a real bug if this happens. 3997 3975 */ 3998 3976 if (WARN_ON(space_info->bytes_pinned > 0 || 3999 - space_info->bytes_reserved > 0 || 4000 3977 space_info->bytes_may_use > 0)) 4001 3978 btrfs_dump_space_info(info, space_info, 0, 0); 3979 + 3980 + /* 3981 + * If there was a failure to cleanup a log tree, very likely due 3982 + * to an IO failure on a writeback attempt of one or more of its 3983 + * extent buffers, we could not do proper (and cheap) unaccounting 3984 + * of their reserved space, so don't warn on bytes_reserved > 0 in 3985 + * that case. 3986 + */ 3987 + if (!(space_info->flags & BTRFS_BLOCK_GROUP_METADATA) || 3988 + !BTRFS_FS_LOG_CLEANUP_ERROR(info)) { 3989 + if (WARN_ON(space_info->bytes_reserved > 0)) 3990 + btrfs_dump_space_info(info, space_info, 0, 0); 3991 + } 3992 + 4002 3993 WARN_ON(space_info->reclaim_size > 0); 4003 3994 list_del(&space_info->list); 4004 3995 btrfs_sysfs_remove_space_info(space_info);
+6
fs/btrfs/ctree.h
··· 145 145 BTRFS_FS_STATE_DUMMY_FS_INFO, 146 146 147 147 BTRFS_FS_STATE_NO_CSUMS, 148 + 149 + /* Indicates there was an error cleaning up a log tree. */ 150 + BTRFS_FS_STATE_LOG_CLEANUP_ERROR, 148 151 }; 149 152 150 153 #define BTRFS_BACKREF_REV_MAX 256 ··· 3596 3593 3597 3594 #define BTRFS_FS_ERROR(fs_info) (unlikely(test_bit(BTRFS_FS_STATE_ERROR, \ 3598 3595 &(fs_info)->fs_state))) 3596 + #define BTRFS_FS_LOG_CLEANUP_ERROR(fs_info) \ 3597 + (unlikely(test_bit(BTRFS_FS_STATE_LOG_CLEANUP_ERROR, \ 3598 + &(fs_info)->fs_state))) 3599 3599 3600 3600 __printf(5, 6) 3601 3601 __cold
+2 -5
fs/btrfs/ioctl.c
··· 805 805 goto fail; 806 806 } 807 807 808 - spin_lock(&fs_info->trans_lock); 809 - list_add(&pending_snapshot->list, 810 - &trans->transaction->pending_snapshots); 811 - spin_unlock(&fs_info->trans_lock); 808 + trans->pending_snapshot = pending_snapshot; 812 809 813 810 ret = btrfs_commit_transaction(trans); 814 811 if (ret) ··· 3351 3354 struct block_device *bdev = NULL; 3352 3355 fmode_t mode; 3353 3356 int ret; 3354 - bool cancel; 3357 + bool cancel = false; 3355 3358 3356 3359 if (!capable(CAP_SYS_ADMIN)) 3357 3360 return -EPERM;
+19 -2
fs/btrfs/qgroup.c
··· 1185 1185 struct btrfs_trans_handle *trans = NULL; 1186 1186 int ret = 0; 1187 1187 1188 + /* 1189 + * We need to have subvol_sem write locked, to prevent races between 1190 + * concurrent tasks trying to disable quotas, because we will unlock 1191 + * and relock qgroup_ioctl_lock across BTRFS_FS_QUOTA_ENABLED changes. 1192 + */ 1193 + lockdep_assert_held_write(&fs_info->subvol_sem); 1194 + 1188 1195 mutex_lock(&fs_info->qgroup_ioctl_lock); 1189 1196 if (!fs_info->quota_root) 1190 1197 goto out; 1198 + 1199 + /* 1200 + * Request qgroup rescan worker to complete and wait for it. This wait 1201 + * must be done before transaction start for quota disable since it may 1202 + * deadlock with transaction by the qgroup rescan worker. 1203 + */ 1204 + clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); 1205 + btrfs_qgroup_wait_for_completion(fs_info, false); 1191 1206 mutex_unlock(&fs_info->qgroup_ioctl_lock); 1192 1207 1193 1208 /* ··· 1220 1205 if (IS_ERR(trans)) { 1221 1206 ret = PTR_ERR(trans); 1222 1207 trans = NULL; 1208 + set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); 1223 1209 goto out; 1224 1210 } 1225 1211 1226 1212 if (!fs_info->quota_root) 1227 1213 goto out; 1228 1214 1229 - clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); 1230 - btrfs_qgroup_wait_for_completion(fs_info, false); 1231 1215 spin_lock(&fs_info->qgroup_lock); 1232 1216 quota_root = fs_info->quota_root; 1233 1217 fs_info->quota_root = NULL; ··· 3397 3383 btrfs_warn(fs_info, 3398 3384 "qgroup rescan init failed, qgroup is not enabled"); 3399 3385 ret = -EINVAL; 3386 + } else if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) { 3387 + /* Quota disable is in progress */ 3388 + ret = -EBUSY; 3400 3389 } 3401 3390 3402 3391 if (ret) {
+24
fs/btrfs/transaction.c
··· 2000 2000 btrfs_wait_ordered_roots(fs_info, U64_MAX, 0, (u64)-1); 2001 2001 } 2002 2002 2003 + /* 2004 + * Add a pending snapshot associated with the given transaction handle to the 2005 + * respective handle. This must be called after the transaction commit started 2006 + * and while holding fs_info->trans_lock. 2007 + * This serves to guarantee a caller of btrfs_commit_transaction() that it can 2008 + * safely free the pending snapshot pointer in case btrfs_commit_transaction() 2009 + * returns an error. 2010 + */ 2011 + static void add_pending_snapshot(struct btrfs_trans_handle *trans) 2012 + { 2013 + struct btrfs_transaction *cur_trans = trans->transaction; 2014 + 2015 + if (!trans->pending_snapshot) 2016 + return; 2017 + 2018 + lockdep_assert_held(&trans->fs_info->trans_lock); 2019 + ASSERT(cur_trans->state >= TRANS_STATE_COMMIT_START); 2020 + 2021 + list_add(&trans->pending_snapshot->list, &cur_trans->pending_snapshots); 2022 + } 2023 + 2003 2024 int btrfs_commit_transaction(struct btrfs_trans_handle *trans) 2004 2025 { 2005 2026 struct btrfs_fs_info *fs_info = trans->fs_info; ··· 2093 2072 spin_lock(&fs_info->trans_lock); 2094 2073 if (cur_trans->state >= TRANS_STATE_COMMIT_START) { 2095 2074 enum btrfs_trans_state want_state = TRANS_STATE_COMPLETED; 2075 + 2076 + add_pending_snapshot(trans); 2096 2077 2097 2078 spin_unlock(&fs_info->trans_lock); 2098 2079 refcount_inc(&cur_trans->use_count); ··· 2186 2163 * COMMIT_DOING so make sure to wait for num_writers to == 1 again. 2187 2164 */ 2188 2165 spin_lock(&fs_info->trans_lock); 2166 + add_pending_snapshot(trans); 2189 2167 cur_trans->state = TRANS_STATE_COMMIT_DOING; 2190 2168 spin_unlock(&fs_info->trans_lock); 2191 2169 wait_event(cur_trans->writer_wait,
+2
fs/btrfs/transaction.h
··· 123 123 struct btrfs_transaction *transaction; 124 124 struct btrfs_block_rsv *block_rsv; 125 125 struct btrfs_block_rsv *orig_rsv; 126 + /* Set by a task that wants to create a snapshot. */ 127 + struct btrfs_pending_snapshot *pending_snapshot; 126 128 refcount_t use_count; 127 129 unsigned int type; 128 130 /*
+15
fs/btrfs/tree-checker.c
··· 965 965 struct btrfs_key *key, int slot) 966 966 { 967 967 struct btrfs_dev_item *ditem; 968 + const u32 item_size = btrfs_item_size(leaf, slot); 968 969 969 970 if (unlikely(key->objectid != BTRFS_DEV_ITEMS_OBJECTID)) { 970 971 dev_item_err(leaf, slot, ··· 973 972 key->objectid, BTRFS_DEV_ITEMS_OBJECTID); 974 973 return -EUCLEAN; 975 974 } 975 + 976 + if (unlikely(item_size != sizeof(*ditem))) { 977 + dev_item_err(leaf, slot, "invalid item size: has %u expect %zu", 978 + item_size, sizeof(*ditem)); 979 + return -EUCLEAN; 980 + } 981 + 976 982 ditem = btrfs_item_ptr(leaf, slot, struct btrfs_dev_item); 977 983 if (unlikely(btrfs_device_id(leaf, ditem) != key->offset)) { 978 984 dev_item_err(leaf, slot, ··· 1015 1007 struct btrfs_inode_item *iitem; 1016 1008 u64 super_gen = btrfs_super_generation(fs_info->super_copy); 1017 1009 u32 valid_mask = (S_IFMT | S_ISUID | S_ISGID | S_ISVTX | 0777); 1010 + const u32 item_size = btrfs_item_size(leaf, slot); 1018 1011 u32 mode; 1019 1012 int ret; 1020 1013 u32 flags; ··· 1024 1015 ret = check_inode_key(leaf, key, slot); 1025 1016 if (unlikely(ret < 0)) 1026 1017 return ret; 1018 + 1019 + if (unlikely(item_size != sizeof(*iitem))) { 1020 + generic_err(leaf, slot, "invalid item size: has %u expect %zu", 1021 + item_size, sizeof(*iitem)); 1022 + return -EUCLEAN; 1023 + } 1027 1024 1028 1025 iitem = btrfs_item_ptr(leaf, slot, struct btrfs_inode_item); 1029 1026
+23
fs/btrfs/tree-log.c
··· 3414 3414 if (log->node) { 3415 3415 ret = walk_log_tree(trans, log, &wc); 3416 3416 if (ret) { 3417 + /* 3418 + * We weren't able to traverse the entire log tree, the 3419 + * typical scenario is getting an -EIO when reading an 3420 + * extent buffer of the tree, due to a previous writeback 3421 + * failure of it. 3422 + */ 3423 + set_bit(BTRFS_FS_STATE_LOG_CLEANUP_ERROR, 3424 + &log->fs_info->fs_state); 3425 + 3426 + /* 3427 + * Some extent buffers of the log tree may still be dirty 3428 + * and not yet written back to storage, because we may 3429 + * have updates to a log tree without syncing a log tree, 3430 + * such as during rename and link operations. So flush 3431 + * them out and wait for their writeback to complete, so 3432 + * that we properly cleanup their state and pages. 3433 + */ 3434 + btrfs_write_marked_extents(log->fs_info, 3435 + &log->dirty_log_pages, 3436 + EXTENT_DIRTY | EXTENT_NEW); 3437 + btrfs_wait_tree_log_extents(log, 3438 + EXTENT_DIRTY | EXTENT_NEW); 3439 + 3417 3440 if (trans) 3418 3441 btrfs_abort_transaction(trans, ret); 3419 3442 else
+59
fs/cachefiles/io.c
··· 192 192 } 193 193 194 194 /* 195 + * Query the occupancy of the cache in a region, returning where the next chunk 196 + * of data starts and how long it is. 197 + */ 198 + static int cachefiles_query_occupancy(struct netfs_cache_resources *cres, 199 + loff_t start, size_t len, size_t granularity, 200 + loff_t *_data_start, size_t *_data_len) 201 + { 202 + struct cachefiles_object *object; 203 + struct file *file; 204 + loff_t off, off2; 205 + 206 + *_data_start = -1; 207 + *_data_len = 0; 208 + 209 + if (!fscache_wait_for_operation(cres, FSCACHE_WANT_READ)) 210 + return -ENOBUFS; 211 + 212 + object = cachefiles_cres_object(cres); 213 + file = cachefiles_cres_file(cres); 214 + granularity = max_t(size_t, object->volume->cache->bsize, granularity); 215 + 216 + _enter("%pD,%li,%llx,%zx/%llx", 217 + file, file_inode(file)->i_ino, start, len, 218 + i_size_read(file_inode(file))); 219 + 220 + off = cachefiles_inject_read_error(); 221 + if (off == 0) 222 + off = vfs_llseek(file, start, SEEK_DATA); 223 + if (off == -ENXIO) 224 + return -ENODATA; /* Beyond EOF */ 225 + if (off < 0 && off >= (loff_t)-MAX_ERRNO) 226 + return -ENOBUFS; /* Error. */ 227 + if (round_up(off, granularity) >= start + len) 228 + return -ENODATA; /* No data in range */ 229 + 230 + off2 = cachefiles_inject_read_error(); 231 + if (off2 == 0) 232 + off2 = vfs_llseek(file, off, SEEK_HOLE); 233 + if (off2 == -ENXIO) 234 + return -ENODATA; /* Beyond EOF */ 235 + if (off2 < 0 && off2 >= (loff_t)-MAX_ERRNO) 236 + return -ENOBUFS; /* Error. */ 237 + 238 + /* Round away partial blocks */ 239 + off = round_up(off, granularity); 240 + off2 = round_down(off2, granularity); 241 + if (off2 <= off) 242 + return -ENODATA; 243 + 244 + *_data_start = off; 245 + if (off2 > start + len) 246 + *_data_len = len; 247 + else 248 + *_data_len = off2 - off; 249 + return 0; 250 + } 251 + 252 + /* 195 253 * Handle completion of a write to the cache. 196 254 */ 197 255 static void cachefiles_write_complete(struct kiocb *iocb, long ret) ··· 603 545 .write = cachefiles_write, 604 546 .prepare_read = cachefiles_prepare_read, 605 547 .prepare_write = cachefiles_prepare_write, 548 + .query_occupancy = cachefiles_query_occupancy, 606 549 }; 607 550 608 551 /*
+16 -7
fs/cifs/connect.c
··· 162 162 mutex_unlock(&server->srv_mutex); 163 163 } 164 164 165 - /** 165 + /* 166 166 * Mark all sessions and tcons for reconnect. 167 167 * 168 168 * @server needs to be previously set to CifsNeedReconnect. ··· 1831 1831 int i; 1832 1832 1833 1833 for (i = 1; i < chan_count; i++) { 1834 - /* 1835 - * note: for now, we're okay accessing ses->chans 1836 - * without chan_lock. But when chans can go away, we'll 1837 - * need to introduce ref counting to make sure that chan 1838 - * is not freed from under us. 1839 - */ 1834 + spin_unlock(&ses->chan_lock); 1840 1835 cifs_put_tcp_session(ses->chans[i].server, 0); 1836 + spin_lock(&ses->chan_lock); 1841 1837 ses->chans[i].server = NULL; 1842 1838 } 1843 1839 } ··· 1975 1979 ctx->password = NULL; 1976 1980 goto out_key_put; 1977 1981 } 1982 + } 1983 + 1984 + ctx->workstation_name = kstrdup(ses->workstation_name, GFP_KERNEL); 1985 + if (!ctx->workstation_name) { 1986 + cifs_dbg(FYI, "Unable to allocate memory for workstation_name\n"); 1987 + rc = -ENOMEM; 1988 + kfree(ctx->username); 1989 + ctx->username = NULL; 1990 + kfree_sensitive(ctx->password); 1991 + ctx->password = NULL; 1992 + kfree(ctx->domainname); 1993 + ctx->domainname = NULL; 1994 + goto out_key_put; 1978 1995 } 1979 1996 1980 1997 out_key_put:
+83 -140
fs/cifs/file.c
··· 4269 4269 for (i = 0; i < rdata->nr_pages; i++) { 4270 4270 struct page *page = rdata->pages[i]; 4271 4271 4272 - lru_cache_add(page); 4273 - 4274 4272 if (rdata->result == 0 || 4275 4273 (rdata->result == -EAGAIN && got_bytes)) { 4276 4274 flush_dcache_page(page); ··· 4276 4278 } else 4277 4279 SetPageError(page); 4278 4280 4279 - unlock_page(page); 4280 - 4281 4281 if (rdata->result == 0 || 4282 4282 (rdata->result == -EAGAIN && got_bytes)) 4283 4283 cifs_readpage_to_fscache(rdata->mapping->host, page); 4284 + 4285 + unlock_page(page); 4284 4286 4285 4287 got_bytes -= min_t(unsigned int, PAGE_SIZE, got_bytes); 4286 4288 ··· 4338 4340 * fill them until the writes are flushed. 4339 4341 */ 4340 4342 zero_user(page, 0, PAGE_SIZE); 4341 - lru_cache_add(page); 4342 4343 flush_dcache_page(page); 4343 4344 SetPageUptodate(page); 4344 4345 unlock_page(page); ··· 4347 4350 continue; 4348 4351 } else { 4349 4352 /* no need to hold page hostage */ 4350 - lru_cache_add(page); 4351 4353 unlock_page(page); 4352 4354 put_page(page); 4353 4355 rdata->pages[i] = NULL; ··· 4389 4393 return readpages_fill_pages(server, rdata, iter, iter->count); 4390 4394 } 4391 4395 4392 - static int 4393 - readpages_get_pages(struct address_space *mapping, struct list_head *page_list, 4394 - unsigned int rsize, struct list_head *tmplist, 4395 - unsigned int *nr_pages, loff_t *offset, unsigned int *bytes) 4396 - { 4397 - struct page *page, *tpage; 4398 - unsigned int expected_index; 4399 - int rc; 4400 - gfp_t gfp = readahead_gfp_mask(mapping); 4401 - 4402 - INIT_LIST_HEAD(tmplist); 4403 - 4404 - page = lru_to_page(page_list); 4405 - 4406 - /* 4407 - * Lock the page and put it in the cache. Since no one else 4408 - * should have access to this page, we're safe to simply set 4409 - * PG_locked without checking it first. 4410 - */ 4411 - __SetPageLocked(page); 4412 - rc = add_to_page_cache_locked(page, mapping, 4413 - page->index, gfp); 4414 - 4415 - /* give up if we can't stick it in the cache */ 4416 - if (rc) { 4417 - __ClearPageLocked(page); 4418 - return rc; 4419 - } 4420 - 4421 - /* move first page to the tmplist */ 4422 - *offset = (loff_t)page->index << PAGE_SHIFT; 4423 - *bytes = PAGE_SIZE; 4424 - *nr_pages = 1; 4425 - list_move_tail(&page->lru, tmplist); 4426 - 4427 - /* now try and add more pages onto the request */ 4428 - expected_index = page->index + 1; 4429 - list_for_each_entry_safe_reverse(page, tpage, page_list, lru) { 4430 - /* discontinuity ? */ 4431 - if (page->index != expected_index) 4432 - break; 4433 - 4434 - /* would this page push the read over the rsize? */ 4435 - if (*bytes + PAGE_SIZE > rsize) 4436 - break; 4437 - 4438 - __SetPageLocked(page); 4439 - rc = add_to_page_cache_locked(page, mapping, page->index, gfp); 4440 - if (rc) { 4441 - __ClearPageLocked(page); 4442 - break; 4443 - } 4444 - list_move_tail(&page->lru, tmplist); 4445 - (*bytes) += PAGE_SIZE; 4446 - expected_index++; 4447 - (*nr_pages)++; 4448 - } 4449 - return rc; 4450 - } 4451 - 4452 - static int cifs_readpages(struct file *file, struct address_space *mapping, 4453 - struct list_head *page_list, unsigned num_pages) 4396 + static void cifs_readahead(struct readahead_control *ractl) 4454 4397 { 4455 4398 int rc; 4456 - int err = 0; 4457 - struct list_head tmplist; 4458 - struct cifsFileInfo *open_file = file->private_data; 4459 - struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file); 4399 + struct cifsFileInfo *open_file = ractl->file->private_data; 4400 + struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(ractl->file); 4460 4401 struct TCP_Server_Info *server; 4461 4402 pid_t pid; 4462 - unsigned int xid; 4403 + unsigned int xid, nr_pages, last_batch_size = 0, cache_nr_pages = 0; 4404 + pgoff_t next_cached = ULONG_MAX; 4405 + bool caching = fscache_cookie_enabled(cifs_inode_cookie(ractl->mapping->host)) && 4406 + cifs_inode_cookie(ractl->mapping->host)->cache_priv; 4407 + bool check_cache = caching; 4463 4408 4464 4409 xid = get_xid(); 4465 - /* 4466 - * Reads as many pages as possible from fscache. Returns -ENOBUFS 4467 - * immediately if the cookie is negative 4468 - * 4469 - * After this point, every page in the list might have PG_fscache set, 4470 - * so we will need to clean that up off of every page we don't use. 4471 - */ 4472 - rc = cifs_readpages_from_fscache(mapping->host, mapping, page_list, 4473 - &num_pages); 4474 - if (rc == 0) { 4475 - free_xid(xid); 4476 - return rc; 4477 - } 4478 4410 4479 4411 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) 4480 4412 pid = open_file->pid; ··· 4413 4489 server = cifs_pick_channel(tlink_tcon(open_file->tlink)->ses); 4414 4490 4415 4491 cifs_dbg(FYI, "%s: file=%p mapping=%p num_pages=%u\n", 4416 - __func__, file, mapping, num_pages); 4492 + __func__, ractl->file, ractl->mapping, readahead_count(ractl)); 4417 4493 4418 4494 /* 4419 - * Start with the page at end of list and move it to private 4420 - * list. Do the same with any following pages until we hit 4421 - * the rsize limit, hit an index discontinuity, or run out of 4422 - * pages. Issue the async read and then start the loop again 4423 - * until the list is empty. 4424 - * 4425 - * Note that list order is important. The page_list is in 4426 - * the order of declining indexes. When we put the pages in 4427 - * the rdata->pages, then we want them in increasing order. 4495 + * Chop the readahead request up into rsize-sized read requests. 4428 4496 */ 4429 - while (!list_empty(page_list) && !err) { 4430 - unsigned int i, nr_pages, bytes, rsize; 4431 - loff_t offset; 4432 - struct page *page, *tpage; 4497 + while ((nr_pages = readahead_count(ractl) - last_batch_size)) { 4498 + unsigned int i, got, rsize; 4499 + struct page *page; 4433 4500 struct cifs_readdata *rdata; 4434 4501 struct cifs_credits credits_on_stack; 4435 4502 struct cifs_credits *credits = &credits_on_stack; 4503 + pgoff_t index = readahead_index(ractl) + last_batch_size; 4504 + 4505 + /* 4506 + * Find out if we have anything cached in the range of 4507 + * interest, and if so, where the next chunk of cached data is. 4508 + */ 4509 + if (caching) { 4510 + if (check_cache) { 4511 + rc = cifs_fscache_query_occupancy( 4512 + ractl->mapping->host, index, nr_pages, 4513 + &next_cached, &cache_nr_pages); 4514 + if (rc < 0) 4515 + caching = false; 4516 + check_cache = false; 4517 + } 4518 + 4519 + if (index == next_cached) { 4520 + /* 4521 + * TODO: Send a whole batch of pages to be read 4522 + * by the cache. 4523 + */ 4524 + page = readahead_page(ractl); 4525 + last_batch_size = 1 << thp_order(page); 4526 + if (cifs_readpage_from_fscache(ractl->mapping->host, 4527 + page) < 0) { 4528 + /* 4529 + * TODO: Deal with cache read failure 4530 + * here, but for the moment, delegate 4531 + * that to readpage. 4532 + */ 4533 + caching = false; 4534 + } 4535 + unlock_page(page); 4536 + next_cached++; 4537 + cache_nr_pages--; 4538 + if (cache_nr_pages == 0) 4539 + check_cache = true; 4540 + continue; 4541 + } 4542 + } 4436 4543 4437 4544 if (open_file->invalidHandle) { 4438 4545 rc = cifs_reopen_file(open_file, true); 4439 - if (rc == -EAGAIN) 4440 - continue; 4441 - else if (rc) 4546 + if (rc) { 4547 + if (rc == -EAGAIN) 4548 + continue; 4442 4549 break; 4550 + } 4443 4551 } 4444 4552 4445 4553 rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, 4446 4554 &rsize, credits); 4447 4555 if (rc) 4448 4556 break; 4557 + nr_pages = min_t(size_t, rsize / PAGE_SIZE, readahead_count(ractl)); 4558 + nr_pages = min_t(size_t, nr_pages, next_cached - index); 4449 4559 4450 4560 /* 4451 4561 * Give up immediately if rsize is too small to read an entire ··· 4487 4529 * reach this point however since we set ra_pages to 0 when the 4488 4530 * rsize is smaller than a cache page. 4489 4531 */ 4490 - if (unlikely(rsize < PAGE_SIZE)) { 4491 - add_credits_and_wake_if(server, credits, 0); 4492 - free_xid(xid); 4493 - return 0; 4494 - } 4495 - 4496 - nr_pages = 0; 4497 - err = readpages_get_pages(mapping, page_list, rsize, &tmplist, 4498 - &nr_pages, &offset, &bytes); 4499 - if (!nr_pages) { 4532 + if (unlikely(!nr_pages)) { 4500 4533 add_credits_and_wake_if(server, credits, 0); 4501 4534 break; 4502 4535 } ··· 4495 4546 rdata = cifs_readdata_alloc(nr_pages, cifs_readv_complete); 4496 4547 if (!rdata) { 4497 4548 /* best to give up if we're out of mem */ 4498 - list_for_each_entry_safe(page, tpage, &tmplist, lru) { 4499 - list_del(&page->lru); 4500 - lru_cache_add(page); 4501 - unlock_page(page); 4502 - put_page(page); 4503 - } 4504 - rc = -ENOMEM; 4505 4549 add_credits_and_wake_if(server, credits, 0); 4506 4550 break; 4507 4551 } 4508 4552 4509 - rdata->cfile = cifsFileInfo_get(open_file); 4510 - rdata->server = server; 4511 - rdata->mapping = mapping; 4512 - rdata->offset = offset; 4513 - rdata->bytes = bytes; 4514 - rdata->pid = pid; 4515 - rdata->pagesz = PAGE_SIZE; 4516 - rdata->tailsz = PAGE_SIZE; 4517 - rdata->read_into_pages = cifs_readpages_read_into_pages; 4518 - rdata->copy_into_pages = cifs_readpages_copy_into_pages; 4519 - rdata->credits = credits_on_stack; 4520 - 4521 - list_for_each_entry_safe(page, tpage, &tmplist, lru) { 4522 - list_del(&page->lru); 4523 - rdata->pages[rdata->nr_pages++] = page; 4553 + got = __readahead_batch(ractl, rdata->pages, nr_pages); 4554 + if (got != nr_pages) { 4555 + pr_warn("__readahead_batch() returned %u/%u\n", 4556 + got, nr_pages); 4557 + nr_pages = got; 4524 4558 } 4525 4559 4526 - rc = adjust_credits(server, &rdata->credits, rdata->bytes); 4560 + rdata->nr_pages = nr_pages; 4561 + rdata->bytes = readahead_batch_length(ractl); 4562 + rdata->cfile = cifsFileInfo_get(open_file); 4563 + rdata->server = server; 4564 + rdata->mapping = ractl->mapping; 4565 + rdata->offset = readahead_pos(ractl); 4566 + rdata->pid = pid; 4567 + rdata->pagesz = PAGE_SIZE; 4568 + rdata->tailsz = PAGE_SIZE; 4569 + rdata->read_into_pages = cifs_readpages_read_into_pages; 4570 + rdata->copy_into_pages = cifs_readpages_copy_into_pages; 4571 + rdata->credits = credits_on_stack; 4527 4572 4573 + rc = adjust_credits(server, &rdata->credits, rdata->bytes); 4528 4574 if (!rc) { 4529 4575 if (rdata->cfile->invalidHandle) 4530 4576 rc = -EAGAIN; ··· 4531 4587 add_credits_and_wake_if(server, &rdata->credits, 0); 4532 4588 for (i = 0; i < rdata->nr_pages; i++) { 4533 4589 page = rdata->pages[i]; 4534 - lru_cache_add(page); 4535 4590 unlock_page(page); 4536 4591 put_page(page); 4537 4592 } ··· 4540 4597 } 4541 4598 4542 4599 kref_put(&rdata->refcount, cifs_readdata_release); 4600 + last_batch_size = nr_pages; 4543 4601 } 4544 4602 4545 4603 free_xid(xid); 4546 - return rc; 4547 4604 } 4548 4605 4549 4606 /* ··· 4867 4924 * In the non-cached mode (mount with cache=none), we shunt off direct read and write requests 4868 4925 * so this method should never be called. 4869 4926 * 4870 - * Direct IO is not yet supported in the cached mode. 4927 + * Direct IO is not yet supported in the cached mode. 4871 4928 */ 4872 4929 static ssize_t 4873 4930 cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter) ··· 4949 5006 4950 5007 const struct address_space_operations cifs_addr_ops = { 4951 5008 .readpage = cifs_readpage, 4952 - .readpages = cifs_readpages, 5009 + .readahead = cifs_readahead, 4953 5010 .writepage = cifs_writepage, 4954 5011 .writepages = cifs_writepages, 4955 5012 .write_begin = cifs_write_begin,
+111 -21
fs/cifs/fscache.c
··· 134 134 } 135 135 } 136 136 137 + static inline void fscache_end_operation(struct netfs_cache_resources *cres) 138 + { 139 + const struct netfs_cache_ops *ops = fscache_operation_valid(cres); 140 + 141 + if (ops) 142 + ops->end_operation(cres); 143 + } 144 + 145 + /* 146 + * Fallback page reading interface. 147 + */ 148 + static int fscache_fallback_read_page(struct inode *inode, struct page *page) 149 + { 150 + struct netfs_cache_resources cres; 151 + struct fscache_cookie *cookie = cifs_inode_cookie(inode); 152 + struct iov_iter iter; 153 + struct bio_vec bvec[1]; 154 + int ret; 155 + 156 + memset(&cres, 0, sizeof(cres)); 157 + bvec[0].bv_page = page; 158 + bvec[0].bv_offset = 0; 159 + bvec[0].bv_len = PAGE_SIZE; 160 + iov_iter_bvec(&iter, READ, bvec, ARRAY_SIZE(bvec), PAGE_SIZE); 161 + 162 + ret = fscache_begin_read_operation(&cres, cookie); 163 + if (ret < 0) 164 + return ret; 165 + 166 + ret = fscache_read(&cres, page_offset(page), &iter, NETFS_READ_HOLE_FAIL, 167 + NULL, NULL); 168 + fscache_end_operation(&cres); 169 + return ret; 170 + } 171 + 172 + /* 173 + * Fallback page writing interface. 174 + */ 175 + static int fscache_fallback_write_page(struct inode *inode, struct page *page, 176 + bool no_space_allocated_yet) 177 + { 178 + struct netfs_cache_resources cres; 179 + struct fscache_cookie *cookie = cifs_inode_cookie(inode); 180 + struct iov_iter iter; 181 + struct bio_vec bvec[1]; 182 + loff_t start = page_offset(page); 183 + size_t len = PAGE_SIZE; 184 + int ret; 185 + 186 + memset(&cres, 0, sizeof(cres)); 187 + bvec[0].bv_page = page; 188 + bvec[0].bv_offset = 0; 189 + bvec[0].bv_len = PAGE_SIZE; 190 + iov_iter_bvec(&iter, WRITE, bvec, ARRAY_SIZE(bvec), PAGE_SIZE); 191 + 192 + ret = fscache_begin_write_operation(&cres, cookie); 193 + if (ret < 0) 194 + return ret; 195 + 196 + ret = cres.ops->prepare_write(&cres, &start, &len, i_size_read(inode), 197 + no_space_allocated_yet); 198 + if (ret == 0) 199 + ret = fscache_write(&cres, page_offset(page), &iter, NULL, NULL); 200 + fscache_end_operation(&cres); 201 + return ret; 202 + } 203 + 137 204 /* 138 205 * Retrieve a page from FS-Cache 139 206 */ 140 207 int __cifs_readpage_from_fscache(struct inode *inode, struct page *page) 141 208 { 142 - cifs_dbg(FYI, "%s: (fsc:%p, p:%p, i:0x%p\n", 143 - __func__, CIFS_I(inode)->fscache, page, inode); 144 - return -ENOBUFS; // Needs conversion to using netfslib 145 - } 209 + int ret; 146 210 147 - /* 148 - * Retrieve a set of pages from FS-Cache 149 - */ 150 - int __cifs_readpages_from_fscache(struct inode *inode, 151 - struct address_space *mapping, 152 - struct list_head *pages, 153 - unsigned *nr_pages) 154 - { 155 - cifs_dbg(FYI, "%s: (0x%p/%u/0x%p)\n", 156 - __func__, CIFS_I(inode)->fscache, *nr_pages, inode); 157 - return -ENOBUFS; // Needs conversion to using netfslib 211 + cifs_dbg(FYI, "%s: (fsc:%p, p:%p, i:0x%p\n", 212 + __func__, cifs_inode_cookie(inode), page, inode); 213 + 214 + ret = fscache_fallback_read_page(inode, page); 215 + if (ret < 0) 216 + return ret; 217 + 218 + /* Read completed synchronously */ 219 + SetPageUptodate(page); 220 + return 0; 158 221 } 159 222 160 223 void __cifs_readpage_to_fscache(struct inode *inode, struct page *page) 161 224 { 162 - struct cifsInodeInfo *cifsi = CIFS_I(inode); 163 - 164 - WARN_ON(!cifsi->fscache); 165 - 166 225 cifs_dbg(FYI, "%s: (fsc: %p, p: %p, i: %p)\n", 167 - __func__, cifsi->fscache, page, inode); 226 + __func__, cifs_inode_cookie(inode), page, inode); 168 227 169 - // Needs conversion to using netfslib 228 + fscache_fallback_write_page(inode, page, true); 229 + } 230 + 231 + /* 232 + * Query the cache occupancy. 233 + */ 234 + int __cifs_fscache_query_occupancy(struct inode *inode, 235 + pgoff_t first, unsigned int nr_pages, 236 + pgoff_t *_data_first, 237 + unsigned int *_data_nr_pages) 238 + { 239 + struct netfs_cache_resources cres; 240 + struct fscache_cookie *cookie = cifs_inode_cookie(inode); 241 + loff_t start, data_start; 242 + size_t len, data_len; 243 + int ret; 244 + 245 + ret = fscache_begin_read_operation(&cres, cookie); 246 + if (ret < 0) 247 + return ret; 248 + 249 + start = first * PAGE_SIZE; 250 + len = nr_pages * PAGE_SIZE; 251 + ret = cres.ops->query_occupancy(&cres, start, len, PAGE_SIZE, 252 + &data_start, &data_len); 253 + if (ret == 0) { 254 + *_data_first = data_start / PAGE_SIZE; 255 + *_data_nr_pages = len / PAGE_SIZE; 256 + } 257 + 258 + fscache_end_operation(&cres); 259 + return ret; 170 260 }
+50 -31
fs/cifs/fscache.h
··· 9 9 #ifndef _CIFS_FSCACHE_H 10 10 #define _CIFS_FSCACHE_H 11 11 12 + #include <linux/swap.h> 12 13 #include <linux/fscache.h> 13 14 14 15 #include "cifsglob.h" ··· 59 58 } 60 59 61 60 62 - extern int cifs_fscache_release_page(struct page *page, gfp_t gfp); 63 - extern int __cifs_readpage_from_fscache(struct inode *, struct page *); 64 - extern int __cifs_readpages_from_fscache(struct inode *, 65 - struct address_space *, 66 - struct list_head *, 67 - unsigned *); 68 - extern void __cifs_readpage_to_fscache(struct inode *, struct page *); 69 - 70 61 static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode) 71 62 { 72 63 return CIFS_I(inode)->fscache; ··· 73 80 i_size_read(inode), flags); 74 81 } 75 82 83 + extern int __cifs_fscache_query_occupancy(struct inode *inode, 84 + pgoff_t first, unsigned int nr_pages, 85 + pgoff_t *_data_first, 86 + unsigned int *_data_nr_pages); 87 + 88 + static inline int cifs_fscache_query_occupancy(struct inode *inode, 89 + pgoff_t first, unsigned int nr_pages, 90 + pgoff_t *_data_first, 91 + unsigned int *_data_nr_pages) 92 + { 93 + if (!cifs_inode_cookie(inode)) 94 + return -ENOBUFS; 95 + return __cifs_fscache_query_occupancy(inode, first, nr_pages, 96 + _data_first, _data_nr_pages); 97 + } 98 + 99 + extern int __cifs_readpage_from_fscache(struct inode *pinode, struct page *ppage); 100 + extern void __cifs_readpage_to_fscache(struct inode *pinode, struct page *ppage); 101 + 102 + 76 103 static inline int cifs_readpage_from_fscache(struct inode *inode, 77 104 struct page *page) 78 105 { 79 - if (CIFS_I(inode)->fscache) 106 + if (cifs_inode_cookie(inode)) 80 107 return __cifs_readpage_from_fscache(inode, page); 81 - 82 - return -ENOBUFS; 83 - } 84 - 85 - static inline int cifs_readpages_from_fscache(struct inode *inode, 86 - struct address_space *mapping, 87 - struct list_head *pages, 88 - unsigned *nr_pages) 89 - { 90 - if (CIFS_I(inode)->fscache) 91 - return __cifs_readpages_from_fscache(inode, mapping, pages, 92 - nr_pages); 93 108 return -ENOBUFS; 94 109 } 95 110 96 111 static inline void cifs_readpage_to_fscache(struct inode *inode, 97 112 struct page *page) 98 113 { 99 - if (PageFsCache(page)) 114 + if (cifs_inode_cookie(inode)) 100 115 __cifs_readpage_to_fscache(inode, page); 116 + } 117 + 118 + static inline int cifs_fscache_release_page(struct page *page, gfp_t gfp) 119 + { 120 + if (PageFsCache(page)) { 121 + if (current_is_kswapd() || !(gfp & __GFP_FS)) 122 + return false; 123 + wait_on_page_fscache(page); 124 + fscache_note_page_release(cifs_inode_cookie(page->mapping->host)); 125 + } 126 + return true; 101 127 } 102 128 103 129 #else /* CONFIG_CIFS_FSCACHE */ ··· 135 123 static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode) { return NULL; } 136 124 static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags) {} 137 125 126 + static inline int cifs_fscache_query_occupancy(struct inode *inode, 127 + pgoff_t first, unsigned int nr_pages, 128 + pgoff_t *_data_first, 129 + unsigned int *_data_nr_pages) 130 + { 131 + *_data_first = ULONG_MAX; 132 + *_data_nr_pages = 0; 133 + return -ENOBUFS; 134 + } 135 + 138 136 static inline int 139 137 cifs_readpage_from_fscache(struct inode *inode, struct page *page) 140 138 { 141 139 return -ENOBUFS; 142 140 } 143 141 144 - static inline int cifs_readpages_from_fscache(struct inode *inode, 145 - struct address_space *mapping, 146 - struct list_head *pages, 147 - unsigned *nr_pages) 148 - { 149 - return -ENOBUFS; 150 - } 142 + static inline 143 + void cifs_readpage_to_fscache(struct inode *inode, struct page *page) {} 151 144 152 - static inline void cifs_readpage_to_fscache(struct inode *inode, 153 - struct page *page) {} 145 + static inline int nfs_fscache_release_page(struct page *page, gfp_t gfp) 146 + { 147 + return true; /* May release page */ 148 + } 154 149 155 150 #endif /* CONFIG_CIFS_FSCACHE */ 156 151
+4 -4
fs/cifs/inode.c
··· 83 83 static void 84 84 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr) 85 85 { 86 + struct cifs_fscache_inode_coherency_data cd; 86 87 struct cifsInodeInfo *cifs_i = CIFS_I(inode); 87 88 88 89 cifs_dbg(FYI, "%s: revalidating inode %llu\n", ··· 114 113 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n", 115 114 __func__, cifs_i->uniqueid); 116 115 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags); 116 + /* Invalidate fscache cookie */ 117 + cifs_fscache_fill_coherency(&cifs_i->vfs_inode, &cd); 118 + fscache_invalidate(cifs_inode_cookie(inode), &cd, i_size_read(inode), 0); 117 119 } 118 120 119 121 /* ··· 2265 2261 int 2266 2262 cifs_invalidate_mapping(struct inode *inode) 2267 2263 { 2268 - struct cifs_fscache_inode_coherency_data cd; 2269 - struct cifsInodeInfo *cifsi = CIFS_I(inode); 2270 2264 int rc = 0; 2271 2265 2272 2266 if (inode->i_mapping && inode->i_mapping->nrpages != 0) { ··· 2274 2272 __func__, inode); 2275 2273 } 2276 2274 2277 - cifs_fscache_fill_coherency(&cifsi->vfs_inode, &cd); 2278 - fscache_invalidate(cifs_inode_cookie(inode), &cd, i_size_read(inode), 0); 2279 2275 return rc; 2280 2276 } 2281 2277
+5 -1
fs/cifs/sess.c
··· 713 713 else 714 714 sz += sizeof(__le16); 715 715 716 - sz += sizeof(__le16) * strnlen(ses->workstation_name, CIFS_MAX_WORKSTATION_LEN); 716 + if (ses->workstation_name) 717 + sz += sizeof(__le16) * strnlen(ses->workstation_name, 718 + CIFS_MAX_WORKSTATION_LEN); 719 + else 720 + sz += sizeof(__le16); 717 721 718 722 return sz; 719 723 }
+4 -4
fs/erofs/data.c
··· 252 252 return ret; 253 253 254 254 iomap->offset = map.m_la; 255 - if (flags & IOMAP_DAX) { 255 + if (flags & IOMAP_DAX) 256 256 iomap->dax_dev = mdev.m_daxdev; 257 - iomap->offset += mdev.m_dax_part_off; 258 - } else { 257 + else 259 258 iomap->bdev = mdev.m_bdev; 260 - } 261 259 iomap->length = map.m_llen; 262 260 iomap->flags = 0; 263 261 iomap->private = NULL; ··· 282 284 } else { 283 285 iomap->type = IOMAP_MAPPED; 284 286 iomap->addr = mdev.m_pa; 287 + if (flags & IOMAP_DAX) 288 + iomap->addr += mdev.m_dax_part_off; 285 289 } 286 290 return 0; 287 291 }
+56 -57
fs/erofs/zdata.c
··· 810 810 return false; 811 811 } 812 812 813 - static void z_erofs_decompressqueue_work(struct work_struct *work); 814 - static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io, 815 - bool sync, int bios) 816 - { 817 - struct erofs_sb_info *const sbi = EROFS_SB(io->sb); 818 - 819 - /* wake up the caller thread for sync decompression */ 820 - if (sync) { 821 - unsigned long flags; 822 - 823 - spin_lock_irqsave(&io->u.wait.lock, flags); 824 - if (!atomic_add_return(bios, &io->pending_bios)) 825 - wake_up_locked(&io->u.wait); 826 - spin_unlock_irqrestore(&io->u.wait.lock, flags); 827 - return; 828 - } 829 - 830 - if (atomic_add_return(bios, &io->pending_bios)) 831 - return; 832 - /* Use workqueue and sync decompression for atomic contexts only */ 833 - if (in_atomic() || irqs_disabled()) { 834 - queue_work(z_erofs_workqueue, &io->u.work); 835 - /* enable sync decompression for readahead */ 836 - if (sbi->opt.sync_decompress == EROFS_SYNC_DECOMPRESS_AUTO) 837 - sbi->opt.sync_decompress = EROFS_SYNC_DECOMPRESS_FORCE_ON; 838 - return; 839 - } 840 - z_erofs_decompressqueue_work(&io->u.work); 841 - } 842 - 843 813 static bool z_erofs_page_is_invalidated(struct page *page) 844 814 { 845 815 return !page->mapping && !z_erofs_is_shortlived_page(page); 846 - } 847 - 848 - static void z_erofs_decompressqueue_endio(struct bio *bio) 849 - { 850 - tagptr1_t t = tagptr_init(tagptr1_t, bio->bi_private); 851 - struct z_erofs_decompressqueue *q = tagptr_unfold_ptr(t); 852 - blk_status_t err = bio->bi_status; 853 - struct bio_vec *bvec; 854 - struct bvec_iter_all iter_all; 855 - 856 - bio_for_each_segment_all(bvec, bio, iter_all) { 857 - struct page *page = bvec->bv_page; 858 - 859 - DBG_BUGON(PageUptodate(page)); 860 - DBG_BUGON(z_erofs_page_is_invalidated(page)); 861 - 862 - if (err) 863 - SetPageError(page); 864 - 865 - if (erofs_page_is_managed(EROFS_SB(q->sb), page)) { 866 - if (!err) 867 - SetPageUptodate(page); 868 - unlock_page(page); 869 - } 870 - } 871 - z_erofs_decompress_kickoff(q, tagptr_unfold_tags(t), -1); 872 - bio_put(bio); 873 816 } 874 817 875 818 static int z_erofs_decompress_pcluster(struct super_block *sb, ··· 1066 1123 kvfree(bgq); 1067 1124 } 1068 1125 1126 + static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io, 1127 + bool sync, int bios) 1128 + { 1129 + struct erofs_sb_info *const sbi = EROFS_SB(io->sb); 1130 + 1131 + /* wake up the caller thread for sync decompression */ 1132 + if (sync) { 1133 + unsigned long flags; 1134 + 1135 + spin_lock_irqsave(&io->u.wait.lock, flags); 1136 + if (!atomic_add_return(bios, &io->pending_bios)) 1137 + wake_up_locked(&io->u.wait); 1138 + spin_unlock_irqrestore(&io->u.wait.lock, flags); 1139 + return; 1140 + } 1141 + 1142 + if (atomic_add_return(bios, &io->pending_bios)) 1143 + return; 1144 + /* Use workqueue and sync decompression for atomic contexts only */ 1145 + if (in_atomic() || irqs_disabled()) { 1146 + queue_work(z_erofs_workqueue, &io->u.work); 1147 + /* enable sync decompression for readahead */ 1148 + if (sbi->opt.sync_decompress == EROFS_SYNC_DECOMPRESS_AUTO) 1149 + sbi->opt.sync_decompress = EROFS_SYNC_DECOMPRESS_FORCE_ON; 1150 + return; 1151 + } 1152 + z_erofs_decompressqueue_work(&io->u.work); 1153 + } 1154 + 1069 1155 static struct page *pickup_page_for_submission(struct z_erofs_pcluster *pcl, 1070 1156 unsigned int nr, 1071 1157 struct page **pagepool, ··· 1270 1298 WRITE_ONCE(*bypass_qtail, &pcl->next); 1271 1299 1272 1300 qtail[JQ_BYPASS] = &pcl->next; 1301 + } 1302 + 1303 + static void z_erofs_decompressqueue_endio(struct bio *bio) 1304 + { 1305 + tagptr1_t t = tagptr_init(tagptr1_t, bio->bi_private); 1306 + struct z_erofs_decompressqueue *q = tagptr_unfold_ptr(t); 1307 + blk_status_t err = bio->bi_status; 1308 + struct bio_vec *bvec; 1309 + struct bvec_iter_all iter_all; 1310 + 1311 + bio_for_each_segment_all(bvec, bio, iter_all) { 1312 + struct page *page = bvec->bv_page; 1313 + 1314 + DBG_BUGON(PageUptodate(page)); 1315 + DBG_BUGON(z_erofs_page_is_invalidated(page)); 1316 + 1317 + if (err) 1318 + SetPageError(page); 1319 + 1320 + if (erofs_page_is_managed(EROFS_SB(q->sb), page)) { 1321 + if (!err) 1322 + SetPageUptodate(page); 1323 + unlock_page(page); 1324 + } 1325 + } 1326 + z_erofs_decompress_kickoff(q, tagptr_unfold_tags(t), -1); 1327 + bio_put(bio); 1273 1328 } 1274 1329 1275 1330 static void z_erofs_submit_queue(struct super_block *sb,
+7
fs/erofs/zmap.c
··· 630 630 if (endoff >= m.clusterofs) { 631 631 m.headtype = m.type; 632 632 map->m_la = (m.lcn << lclusterbits) | m.clusterofs; 633 + /* 634 + * For ztailpacking files, in order to inline data more 635 + * effectively, special EOF lclusters are now supported 636 + * which can have three parts at most. 637 + */ 638 + if (ztailpacking && end > inode->i_size) 639 + end = inode->i_size; 633 640 break; 634 641 } 635 642 /* m.lcn should be >= 1 if endoff < m.clusterofs */
+4 -4
fs/ext4/acl.c
··· 139 139 /* 140 140 * Inode operation get_posix_acl(). 141 141 * 142 - * inode->i_mutex: don't care 142 + * inode->i_rwsem: don't care 143 143 */ 144 144 struct posix_acl * 145 145 ext4_get_acl(struct inode *inode, int type, bool rcu) ··· 183 183 /* 184 184 * Set the access or default ACL of an inode. 185 185 * 186 - * inode->i_mutex: down unless called from ext4_new_inode 186 + * inode->i_rwsem: down unless called from ext4_new_inode 187 187 */ 188 188 static int 189 189 __ext4_set_acl(handle_t *handle, struct inode *inode, int type, ··· 271 271 /* 272 272 * Initialize the ACLs of a new inode. Called from ext4_new_inode. 273 273 * 274 - * dir->i_mutex: down 275 - * inode->i_mutex: up (access to inode is still exclusive) 274 + * dir->i_rwsem: down 275 + * inode->i_rwsem: up (access to inode is still exclusive) 276 276 */ 277 277 int 278 278 ext4_init_acl(handle_t *handle, struct inode *inode, struct inode *dir)
+9 -8
fs/ext4/ext4.h
··· 1028 1028 1029 1029 /* 1030 1030 * Extended attributes can be read independently of the main file 1031 - * data. Taking i_mutex even when reading would cause contention 1031 + * data. Taking i_rwsem even when reading would cause contention 1032 1032 * between readers of EAs and writers of regular file data, so 1033 1033 * instead we synchronize on xattr_sem when reading or changing 1034 1034 * EAs. ··· 1750 1750 spinlock_t s_fc_lock; 1751 1751 struct buffer_head *s_fc_bh; 1752 1752 struct ext4_fc_stats s_fc_stats; 1753 + tid_t s_fc_ineligible_tid; 1753 1754 #ifdef CONFIG_EXT4_DEBUG 1754 1755 int s_fc_debug_max_replay; 1755 1756 #endif ··· 1796 1795 enum { 1797 1796 EXT4_MF_MNTDIR_SAMPLED, 1798 1797 EXT4_MF_FS_ABORTED, /* Fatal error detected */ 1799 - EXT4_MF_FC_INELIGIBLE, /* Fast commit ineligible */ 1800 - EXT4_MF_FC_COMMITTING /* File system underoing a fast 1801 - * commit. 1802 - */ 1798 + EXT4_MF_FC_INELIGIBLE /* Fast commit ineligible */ 1803 1799 }; 1804 1800 1805 1801 static inline void ext4_set_mount_flag(struct super_block *sb, int bit) ··· 2924 2926 struct dentry *dentry); 2925 2927 void ext4_fc_track_create(handle_t *handle, struct dentry *dentry); 2926 2928 void ext4_fc_track_inode(handle_t *handle, struct inode *inode); 2927 - void ext4_fc_mark_ineligible(struct super_block *sb, int reason); 2929 + void ext4_fc_mark_ineligible(struct super_block *sb, int reason, handle_t *handle); 2928 2930 void ext4_fc_start_update(struct inode *inode); 2929 2931 void ext4_fc_stop_update(struct inode *inode); 2930 2932 void ext4_fc_del(struct inode *inode); ··· 2933 2935 int ext4_fc_commit(journal_t *journal, tid_t commit_tid); 2934 2936 int __init ext4_fc_init_dentry_cache(void); 2935 2937 void ext4_fc_destroy_dentry_cache(void); 2938 + int ext4_fc_record_regions(struct super_block *sb, int ino, 2939 + ext4_lblk_t lblk, ext4_fsblk_t pblk, 2940 + int len, int replay); 2936 2941 2937 2942 /* mballoc.c */ 2938 2943 extern const struct seq_operations ext4_mb_seq_groups_ops; ··· 3408 3407 #define EXT4_FREECLUSTERS_WATERMARK 0 3409 3408 #endif 3410 3409 3411 - /* Update i_disksize. Requires i_mutex to avoid races with truncate */ 3410 + /* Update i_disksize. Requires i_rwsem to avoid races with truncate */ 3412 3411 static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize) 3413 3412 { 3414 3413 WARN_ON_ONCE(S_ISREG(inode->i_mode) && ··· 3419 3418 up_write(&EXT4_I(inode)->i_data_sem); 3420 3419 } 3421 3420 3422 - /* Update i_size, i_disksize. Requires i_mutex to avoid races with truncate */ 3421 + /* Update i_size, i_disksize. Requires i_rwsem to avoid races with truncate */ 3423 3422 static inline int ext4_update_inode_size(struct inode *inode, loff_t newsize) 3424 3423 { 3425 3424 int changed = 0;
+1 -1
fs/ext4/ext4_jbd2.h
··· 491 491 /* 492 492 * This function controls whether or not we should try to go down the 493 493 * dioread_nolock code paths, which makes it safe to avoid taking 494 - * i_mutex for direct I/O reads. This only works for extent-based 494 + * i_rwsem for direct I/O reads. This only works for extent-based 495 495 * files, and it doesn't work if data journaling is enabled, since the 496 496 * dioread_nolock code uses b_private to pass information back to the 497 497 * I/O completion handler, and this conflicts with the jbd's use of
+10 -6
fs/ext4/extents.c
··· 97 97 * Drop i_data_sem to avoid deadlock with ext4_map_blocks. At this 98 98 * moment, get_block can be called only for blocks inside i_size since 99 99 * page cache has been already dropped and writes are blocked by 100 - * i_mutex. So we can safely drop the i_data_sem here. 100 + * i_rwsem. So we can safely drop the i_data_sem here. 101 101 */ 102 102 BUG_ON(EXT4_JOURNAL(inode) == NULL); 103 103 ext4_discard_preallocations(inode, 0); ··· 4572 4572 4573 4573 flags = EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT; 4574 4574 4575 - /* Wait all existing dio workers, newcomers will block on i_mutex */ 4575 + /* Wait all existing dio workers, newcomers will block on i_rwsem */ 4576 4576 inode_dio_wait(inode); 4577 4577 4578 4578 /* Preallocate the range including the unaligned edges */ ··· 4738 4738 goto out; 4739 4739 } 4740 4740 4741 - /* Wait all existing dio workers, newcomers will block on i_mutex */ 4741 + /* Wait all existing dio workers, newcomers will block on i_rwsem */ 4742 4742 inode_dio_wait(inode); 4743 4743 4744 4744 ret = ext4_alloc_file_blocks(file, lblk, max_blocks, new_size, flags); ··· 5334 5334 ret = PTR_ERR(handle); 5335 5335 goto out_mmap; 5336 5336 } 5337 - ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_FALLOC_RANGE); 5337 + ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_FALLOC_RANGE, handle); 5338 5338 5339 5339 down_write(&EXT4_I(inode)->i_data_sem); 5340 5340 ext4_discard_preallocations(inode, 0); ··· 5474 5474 ret = PTR_ERR(handle); 5475 5475 goto out_mmap; 5476 5476 } 5477 - ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_FALLOC_RANGE); 5477 + ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_FALLOC_RANGE, handle); 5478 5478 5479 5479 /* Expand file to avoid data loss if there is error while shifting */ 5480 5480 inode->i_size += len; ··· 5571 5571 * stuff such as page-cache locking consistency, bh mapping consistency or 5572 5572 * extent's data copying must be performed by caller. 5573 5573 * Locking: 5574 - * i_mutex is held for both inodes 5574 + * i_rwsem is held for both inodes 5575 5575 * i_data_sem is locked for write for both inodes 5576 5576 * Assumptions: 5577 5577 * All pages from requested range are locked for both inodes ··· 6091 6091 6092 6092 ext4_mb_mark_bb(inode->i_sb, 6093 6093 path[j].p_block, 1, 0); 6094 + ext4_fc_record_regions(inode->i_sb, inode->i_ino, 6095 + 0, path[j].p_block, 1, 1); 6094 6096 } 6095 6097 ext4_ext_drop_refs(path); 6096 6098 kfree(path); 6097 6099 } 6098 6100 ext4_mb_mark_bb(inode->i_sb, map.m_pblk, map.m_len, 0); 6101 + ext4_fc_record_regions(inode->i_sb, inode->i_ino, 6102 + map.m_lblk, map.m_pblk, map.m_len, 1); 6099 6103 } 6100 6104 cur = cur + map.m_len; 6101 6105 }
+78 -55
fs/ext4/fast_commit.c
··· 300 300 } 301 301 302 302 /* 303 - * Mark file system as fast commit ineligible. This means that next commit 304 - * operation would result in a full jbd2 commit. 303 + * Mark file system as fast commit ineligible, and record latest 304 + * ineligible transaction tid. This means until the recorded 305 + * transaction, commit operation would result in a full jbd2 commit. 305 306 */ 306 - void ext4_fc_mark_ineligible(struct super_block *sb, int reason) 307 + void ext4_fc_mark_ineligible(struct super_block *sb, int reason, handle_t *handle) 307 308 { 308 309 struct ext4_sb_info *sbi = EXT4_SB(sb); 310 + tid_t tid; 309 311 310 312 if (!test_opt2(sb, JOURNAL_FAST_COMMIT) || 311 313 (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY)) 312 314 return; 313 315 314 316 ext4_set_mount_flag(sb, EXT4_MF_FC_INELIGIBLE); 317 + if (handle && !IS_ERR(handle)) 318 + tid = handle->h_transaction->t_tid; 319 + else { 320 + read_lock(&sbi->s_journal->j_state_lock); 321 + tid = sbi->s_journal->j_running_transaction ? 322 + sbi->s_journal->j_running_transaction->t_tid : 0; 323 + read_unlock(&sbi->s_journal->j_state_lock); 324 + } 325 + spin_lock(&sbi->s_fc_lock); 326 + if (sbi->s_fc_ineligible_tid < tid) 327 + sbi->s_fc_ineligible_tid = tid; 328 + spin_unlock(&sbi->s_fc_lock); 315 329 WARN_ON(reason >= EXT4_FC_REASON_MAX); 316 330 sbi->s_fc_stats.fc_ineligible_reason_count[reason]++; 317 331 } ··· 375 361 spin_lock(&sbi->s_fc_lock); 376 362 if (list_empty(&EXT4_I(inode)->i_fc_list)) 377 363 list_add_tail(&EXT4_I(inode)->i_fc_list, 378 - (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_COMMITTING)) ? 364 + (sbi->s_journal->j_flags & JBD2_FULL_COMMIT_ONGOING || 365 + sbi->s_journal->j_flags & JBD2_FAST_COMMIT_ONGOING) ? 379 366 &sbi->s_fc_q[FC_Q_STAGING] : 380 367 &sbi->s_fc_q[FC_Q_MAIN]); 381 368 spin_unlock(&sbi->s_fc_lock); ··· 402 387 mutex_unlock(&ei->i_fc_lock); 403 388 node = kmem_cache_alloc(ext4_fc_dentry_cachep, GFP_NOFS); 404 389 if (!node) { 405 - ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_NOMEM); 390 + ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_NOMEM, NULL); 406 391 mutex_lock(&ei->i_fc_lock); 407 392 return -ENOMEM; 408 393 } ··· 415 400 if (!node->fcd_name.name) { 416 401 kmem_cache_free(ext4_fc_dentry_cachep, node); 417 402 ext4_fc_mark_ineligible(inode->i_sb, 418 - EXT4_FC_REASON_NOMEM); 403 + EXT4_FC_REASON_NOMEM, NULL); 419 404 mutex_lock(&ei->i_fc_lock); 420 405 return -ENOMEM; 421 406 } ··· 429 414 node->fcd_name.len = dentry->d_name.len; 430 415 431 416 spin_lock(&sbi->s_fc_lock); 432 - if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_COMMITTING)) 417 + if (sbi->s_journal->j_flags & JBD2_FULL_COMMIT_ONGOING || 418 + sbi->s_journal->j_flags & JBD2_FAST_COMMIT_ONGOING) 433 419 list_add_tail(&node->fcd_list, 434 420 &sbi->s_fc_dentry_q[FC_Q_STAGING]); 435 421 else ··· 518 502 519 503 if (ext4_should_journal_data(inode)) { 520 504 ext4_fc_mark_ineligible(inode->i_sb, 521 - EXT4_FC_REASON_INODE_JOURNAL_DATA); 505 + EXT4_FC_REASON_INODE_JOURNAL_DATA, handle); 522 506 return; 523 507 } 524 508 ··· 895 879 int ret = 0; 896 880 897 881 spin_lock(&sbi->s_fc_lock); 898 - ext4_set_mount_flag(sb, EXT4_MF_FC_COMMITTING); 899 882 list_for_each_entry(ei, &sbi->s_fc_q[FC_Q_MAIN], i_fc_list) { 900 883 ext4_set_inode_state(&ei->vfs_inode, EXT4_STATE_FC_COMMITTING); 901 884 while (atomic_read(&ei->i_fc_updates)) { ··· 1194 1179 * Fast commit cleanup routine. This is called after every fast commit and 1195 1180 * full commit. full is true if we are called after a full commit. 1196 1181 */ 1197 - static void ext4_fc_cleanup(journal_t *journal, int full) 1182 + static void ext4_fc_cleanup(journal_t *journal, int full, tid_t tid) 1198 1183 { 1199 1184 struct super_block *sb = journal->j_private; 1200 1185 struct ext4_sb_info *sbi = EXT4_SB(sb); ··· 1212 1197 list_del_init(&iter->i_fc_list); 1213 1198 ext4_clear_inode_state(&iter->vfs_inode, 1214 1199 EXT4_STATE_FC_COMMITTING); 1215 - ext4_fc_reset_inode(&iter->vfs_inode); 1200 + if (iter->i_sync_tid <= tid) 1201 + ext4_fc_reset_inode(&iter->vfs_inode); 1216 1202 /* Make sure EXT4_STATE_FC_COMMITTING bit is clear */ 1217 1203 smp_mb(); 1218 1204 #if (BITS_PER_LONG < 64) ··· 1242 1226 list_splice_init(&sbi->s_fc_q[FC_Q_STAGING], 1243 1227 &sbi->s_fc_q[FC_Q_MAIN]); 1244 1228 1245 - ext4_clear_mount_flag(sb, EXT4_MF_FC_COMMITTING); 1246 - ext4_clear_mount_flag(sb, EXT4_MF_FC_INELIGIBLE); 1229 + if (tid >= sbi->s_fc_ineligible_tid) { 1230 + sbi->s_fc_ineligible_tid = 0; 1231 + ext4_clear_mount_flag(sb, EXT4_MF_FC_INELIGIBLE); 1232 + } 1247 1233 1248 1234 if (full) 1249 1235 sbi->s_fc_bytes = 0; ··· 1410 1392 if (state->fc_modified_inodes[i] == ino) 1411 1393 return 0; 1412 1394 if (state->fc_modified_inodes_used == state->fc_modified_inodes_size) { 1413 - state->fc_modified_inodes_size += 1414 - EXT4_FC_REPLAY_REALLOC_INCREMENT; 1415 1395 state->fc_modified_inodes = krealloc( 1416 - state->fc_modified_inodes, sizeof(int) * 1417 - state->fc_modified_inodes_size, 1418 - GFP_KERNEL); 1396 + state->fc_modified_inodes, 1397 + sizeof(int) * (state->fc_modified_inodes_size + 1398 + EXT4_FC_REPLAY_REALLOC_INCREMENT), 1399 + GFP_KERNEL); 1419 1400 if (!state->fc_modified_inodes) 1420 1401 return -ENOMEM; 1402 + state->fc_modified_inodes_size += 1403 + EXT4_FC_REPLAY_REALLOC_INCREMENT; 1421 1404 } 1422 1405 state->fc_modified_inodes[state->fc_modified_inodes_used++] = ino; 1423 1406 return 0; ··· 1450 1431 } 1451 1432 inode = NULL; 1452 1433 1453 - ext4_fc_record_modified_inode(sb, ino); 1434 + ret = ext4_fc_record_modified_inode(sb, ino); 1435 + if (ret) 1436 + goto out; 1454 1437 1455 1438 raw_fc_inode = (struct ext4_inode *) 1456 1439 (val + offsetof(struct ext4_fc_inode, fc_raw_inode)); ··· 1584 1563 } 1585 1564 1586 1565 /* 1587 - * Record physical disk regions which are in use as per fast commit area. Our 1588 - * simple replay phase allocator excludes these regions from allocation. 1566 + * Record physical disk regions which are in use as per fast commit area, 1567 + * and used by inodes during replay phase. Our simple replay phase 1568 + * allocator excludes these regions from allocation. 1589 1569 */ 1590 - static int ext4_fc_record_regions(struct super_block *sb, int ino, 1591 - ext4_lblk_t lblk, ext4_fsblk_t pblk, int len) 1570 + int ext4_fc_record_regions(struct super_block *sb, int ino, 1571 + ext4_lblk_t lblk, ext4_fsblk_t pblk, int len, int replay) 1592 1572 { 1593 1573 struct ext4_fc_replay_state *state; 1594 1574 struct ext4_fc_alloc_region *region; 1595 1575 1596 1576 state = &EXT4_SB(sb)->s_fc_replay_state; 1577 + /* 1578 + * during replay phase, the fc_regions_valid may not same as 1579 + * fc_regions_used, update it when do new additions. 1580 + */ 1581 + if (replay && state->fc_regions_used != state->fc_regions_valid) 1582 + state->fc_regions_used = state->fc_regions_valid; 1597 1583 if (state->fc_regions_used == state->fc_regions_size) { 1598 1584 state->fc_regions_size += 1599 1585 EXT4_FC_REPLAY_REALLOC_INCREMENT; ··· 1617 1589 region->lblk = lblk; 1618 1590 region->pblk = pblk; 1619 1591 region->len = len; 1592 + 1593 + if (replay) 1594 + state->fc_regions_valid++; 1620 1595 1621 1596 return 0; 1622 1597 } ··· 1652 1621 } 1653 1622 1654 1623 ret = ext4_fc_record_modified_inode(sb, inode->i_ino); 1624 + if (ret) 1625 + goto out; 1655 1626 1656 1627 start = le32_to_cpu(ex->ee_block); 1657 1628 start_pblk = ext4_ext_pblock(ex); ··· 1671 1638 map.m_pblk = 0; 1672 1639 ret = ext4_map_blocks(NULL, inode, &map, 0); 1673 1640 1674 - if (ret < 0) { 1675 - iput(inode); 1676 - return 0; 1677 - } 1641 + if (ret < 0) 1642 + goto out; 1678 1643 1679 1644 if (ret == 0) { 1680 1645 /* Range is not mapped */ 1681 1646 path = ext4_find_extent(inode, cur, NULL, 0); 1682 - if (IS_ERR(path)) { 1683 - iput(inode); 1684 - return 0; 1685 - } 1647 + if (IS_ERR(path)) 1648 + goto out; 1686 1649 memset(&newex, 0, sizeof(newex)); 1687 1650 newex.ee_block = cpu_to_le32(cur); 1688 1651 ext4_ext_store_pblock( ··· 1692 1663 up_write((&EXT4_I(inode)->i_data_sem)); 1693 1664 ext4_ext_drop_refs(path); 1694 1665 kfree(path); 1695 - if (ret) { 1696 - iput(inode); 1697 - return 0; 1698 - } 1666 + if (ret) 1667 + goto out; 1699 1668 goto next; 1700 1669 } 1701 1670 ··· 1706 1679 ret = ext4_ext_replay_update_ex(inode, cur, map.m_len, 1707 1680 ext4_ext_is_unwritten(ex), 1708 1681 start_pblk + cur - start); 1709 - if (ret) { 1710 - iput(inode); 1711 - return 0; 1712 - } 1682 + if (ret) 1683 + goto out; 1713 1684 /* 1714 1685 * Mark the old blocks as free since they aren't used 1715 1686 * anymore. We maintain an array of all the modified ··· 1727 1702 ext4_ext_is_unwritten(ex), map.m_pblk); 1728 1703 ret = ext4_ext_replay_update_ex(inode, cur, map.m_len, 1729 1704 ext4_ext_is_unwritten(ex), map.m_pblk); 1730 - if (ret) { 1731 - iput(inode); 1732 - return 0; 1733 - } 1705 + if (ret) 1706 + goto out; 1734 1707 /* 1735 1708 * We may have split the extent tree while toggling the state. 1736 1709 * Try to shrink the extent tree now. ··· 1740 1717 } 1741 1718 ext4_ext_replay_shrink_inode(inode, i_size_read(inode) >> 1742 1719 sb->s_blocksize_bits); 1720 + out: 1743 1721 iput(inode); 1744 1722 return 0; 1745 1723 } ··· 1770 1746 } 1771 1747 1772 1748 ret = ext4_fc_record_modified_inode(sb, inode->i_ino); 1749 + if (ret) 1750 + goto out; 1773 1751 1774 1752 jbd_debug(1, "DEL_RANGE, inode %ld, lblk %d, len %d\n", 1775 1753 inode->i_ino, le32_to_cpu(lrange.fc_lblk), ··· 1781 1755 map.m_len = remaining; 1782 1756 1783 1757 ret = ext4_map_blocks(NULL, inode, &map, 0); 1784 - if (ret < 0) { 1785 - iput(inode); 1786 - return 0; 1787 - } 1758 + if (ret < 0) 1759 + goto out; 1788 1760 if (ret > 0) { 1789 1761 remaining -= ret; 1790 1762 cur += ret; ··· 1794 1770 } 1795 1771 1796 1772 down_write(&EXT4_I(inode)->i_data_sem); 1797 - ret = ext4_ext_remove_space(inode, lrange.fc_lblk, 1798 - lrange.fc_lblk + lrange.fc_len - 1); 1773 + ret = ext4_ext_remove_space(inode, le32_to_cpu(lrange.fc_lblk), 1774 + le32_to_cpu(lrange.fc_lblk) + 1775 + le32_to_cpu(lrange.fc_len) - 1); 1799 1776 up_write(&EXT4_I(inode)->i_data_sem); 1800 - if (ret) { 1801 - iput(inode); 1802 - return 0; 1803 - } 1777 + if (ret) 1778 + goto out; 1804 1779 ext4_ext_replay_shrink_inode(inode, 1805 1780 i_size_read(inode) >> sb->s_blocksize_bits); 1806 1781 ext4_mark_inode_dirty(NULL, inode); 1782 + out: 1807 1783 iput(inode); 1808 - 1809 1784 return 0; 1810 1785 } 1811 1786 ··· 1960 1937 ret = ext4_fc_record_regions(sb, 1961 1938 le32_to_cpu(ext.fc_ino), 1962 1939 le32_to_cpu(ex->ee_block), ext4_ext_pblock(ex), 1963 - ext4_ext_get_actual_len(ex)); 1940 + ext4_ext_get_actual_len(ex), 0); 1964 1941 if (ret < 0) 1965 1942 break; 1966 1943 ret = JBD2_FC_REPLAY_CONTINUE;
+1 -1
fs/ext4/indirect.c
··· 696 696 * Drop i_data_sem to avoid deadlock with ext4_map_blocks. At this 697 697 * moment, get_block can be called only for blocks inside i_size since 698 698 * page cache has been already dropped and writes are blocked by 699 - * i_mutex. So we can safely drop the i_data_sem here. 699 + * i_rwsem. So we can safely drop the i_data_sem here. 700 700 */ 701 701 BUG_ON(EXT4_JOURNAL(inode) == NULL); 702 702 ext4_discard_preallocations(inode, 0);
+13 -10
fs/ext4/inline.c
··· 911 911 struct page **pagep, 912 912 void **fsdata) 913 913 { 914 - int ret, inline_size; 914 + int ret; 915 915 handle_t *handle; 916 916 struct page *page; 917 917 struct ext4_iloc iloc; ··· 928 928 goto out; 929 929 } 930 930 931 - inline_size = ext4_get_max_inline_size(inode); 932 - 933 - ret = -ENOSPC; 934 - if (inline_size >= pos + len) { 935 - ret = ext4_prepare_inline_data(handle, inode, pos + len); 936 - if (ret && ret != -ENOSPC) 937 - goto out_journal; 938 - } 931 + ret = ext4_prepare_inline_data(handle, inode, pos + len); 932 + if (ret && ret != -ENOSPC) 933 + goto out_journal; 939 934 940 935 /* 941 936 * We cannot recurse into the filesystem as the transaction ··· 1128 1133 struct ext4_iloc *iloc, 1129 1134 void *buf, int inline_size) 1130 1135 { 1131 - ext4_create_inline_data(handle, inode, inline_size); 1136 + int ret; 1137 + 1138 + ret = ext4_create_inline_data(handle, inode, inline_size); 1139 + if (ret) { 1140 + ext4_msg(inode->i_sb, KERN_EMERG, 1141 + "error restoring inline_data for inode -- potential data loss! (inode %lu, error %d)", 1142 + inode->i_ino, ret); 1143 + return; 1144 + } 1132 1145 ext4_write_inline_data(inode, iloc, buf, 0, inline_size); 1133 1146 ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); 1134 1147 }
+6 -6
fs/ext4/inode.c
··· 338 338 return; 339 339 no_delete: 340 340 if (!list_empty(&EXT4_I(inode)->i_fc_list)) 341 - ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_NOMEM); 341 + ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_NOMEM, NULL); 342 342 ext4_clear_inode(inode); /* We must guarantee clearing of inode... */ 343 343 } 344 344 ··· 1224 1224 /* 1225 1225 * __block_write_begin may have instantiated a few blocks 1226 1226 * outside i_size. Trim these off again. Don't need 1227 - * i_size_read because we hold i_mutex. 1227 + * i_size_read because we hold i_rwsem. 1228 1228 * 1229 1229 * Add inode to orphan list in case we crash before 1230 1230 * truncate finishes ··· 3979 3979 3980 3980 } 3981 3981 3982 - /* Wait all existing dio workers, newcomers will block on i_mutex */ 3982 + /* Wait all existing dio workers, newcomers will block on i_rwsem */ 3983 3983 inode_dio_wait(inode); 3984 3984 3985 3985 /* ··· 4129 4129 /* 4130 4130 * There is a possibility that we're either freeing the inode 4131 4131 * or it's a completely new inode. In those cases we might not 4132 - * have i_mutex locked because it's not necessary. 4132 + * have i_rwsem locked because it's not necessary. 4133 4133 */ 4134 4134 if (!(inode->i_state & (I_NEW|I_FREEING))) 4135 4135 WARN_ON(!inode_is_locked(inode)); ··· 5271 5271 * transaction are already on disk (truncate waits for pages under 5272 5272 * writeback). 5273 5273 * 5274 - * Called with inode->i_mutex down. 5274 + * Called with inode->i_rwsem down. 5275 5275 */ 5276 5276 int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry, 5277 5277 struct iattr *attr) ··· 5983 5983 return PTR_ERR(handle); 5984 5984 5985 5985 ext4_fc_mark_ineligible(inode->i_sb, 5986 - EXT4_FC_REASON_JOURNAL_FLAG_CHANGE); 5986 + EXT4_FC_REASON_JOURNAL_FLAG_CHANGE, handle); 5987 5987 err = ext4_mark_inode_dirty(handle, inode); 5988 5988 ext4_handle_sync(handle); 5989 5989 ext4_journal_stop(handle);
+2 -2
fs/ext4/ioctl.c
··· 411 411 err = -EINVAL; 412 412 goto err_out; 413 413 } 414 - ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_SWAP_BOOT); 414 + ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_SWAP_BOOT, handle); 415 415 416 416 /* Protect extent tree against block allocations via delalloc */ 417 417 ext4_double_down_write_data_sem(inode, inode_bl); ··· 1373 1373 1374 1374 err = ext4_resize_fs(sb, n_blocks_count); 1375 1375 if (EXT4_SB(sb)->s_journal) { 1376 - ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_RESIZE); 1376 + ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_RESIZE, NULL); 1377 1377 jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal); 1378 1378 err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal, 0); 1379 1379 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
+17 -9
fs/ext4/mballoc.c
··· 5753 5753 struct super_block *sb = ar->inode->i_sb; 5754 5754 ext4_group_t group; 5755 5755 ext4_grpblk_t blkoff; 5756 - int i = sb->s_blocksize; 5756 + ext4_grpblk_t max = EXT4_CLUSTERS_PER_GROUP(sb); 5757 + ext4_grpblk_t i = 0; 5757 5758 ext4_fsblk_t goal, block; 5758 5759 struct ext4_super_block *es = EXT4_SB(sb)->s_es; 5759 5760 ··· 5776 5775 ext4_get_group_no_and_offset(sb, 5777 5776 max(ext4_group_first_block_no(sb, group), goal), 5778 5777 NULL, &blkoff); 5779 - i = mb_find_next_zero_bit(bitmap_bh->b_data, sb->s_blocksize, 5778 + while (1) { 5779 + i = mb_find_next_zero_bit(bitmap_bh->b_data, max, 5780 5780 blkoff); 5781 + if (i >= max) 5782 + break; 5783 + if (ext4_fc_replay_check_excluded(sb, 5784 + ext4_group_first_block_no(sb, group) + i)) { 5785 + blkoff = i + 1; 5786 + } else 5787 + break; 5788 + } 5781 5789 brelse(bitmap_bh); 5782 - if (i >= sb->s_blocksize) 5783 - continue; 5784 - if (ext4_fc_replay_check_excluded(sb, 5785 - ext4_group_first_block_no(sb, group) + i)) 5786 - continue; 5787 - break; 5790 + if (i < max) 5791 + break; 5788 5792 } 5789 5793 5790 - if (group >= ext4_get_groups_count(sb) && i >= sb->s_blocksize) 5794 + if (group >= ext4_get_groups_count(sb) || i >= max) { 5795 + *errp = -ENOSPC; 5791 5796 return 0; 5797 + } 5792 5798 5793 5799 block = ext4_group_first_block_no(sb, group) + i; 5794 5800 ext4_mb_mark_bb(sb, block, 1, 1);
+1 -1
fs/ext4/migrate.c
··· 485 485 * when we add extents we extent the journal 486 486 */ 487 487 /* 488 - * Even though we take i_mutex we can still cause block 488 + * Even though we take i_rwsem we can still cause block 489 489 * allocation via mmap write to holes. If we have allocated 490 490 * new blocks we fail migrate. New block allocation will 491 491 * clear EXT4_STATE_EXT_MIGRATE flag. The flag is updated
+2 -2
fs/ext4/namei.c
··· 3889 3889 * dirents in directories. 3890 3890 */ 3891 3891 ext4_fc_mark_ineligible(old.inode->i_sb, 3892 - EXT4_FC_REASON_RENAME_DIR); 3892 + EXT4_FC_REASON_RENAME_DIR, handle); 3893 3893 } else { 3894 3894 if (new.inode) 3895 3895 ext4_fc_track_unlink(handle, new.dentry); ··· 4049 4049 if (unlikely(retval)) 4050 4050 goto end_rename; 4051 4051 ext4_fc_mark_ineligible(new.inode->i_sb, 4052 - EXT4_FC_REASON_CROSS_RENAME); 4052 + EXT4_FC_REASON_CROSS_RENAME, handle); 4053 4053 if (old.dir_bh) { 4054 4054 retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino); 4055 4055 if (retval)
+2 -2
fs/ext4/orphan.c
··· 93 93 * At filesystem recovery time, we walk this list deleting unlinked 94 94 * inodes and truncating linked inodes in ext4_orphan_cleanup(). 95 95 * 96 - * Orphan list manipulation functions must be called under i_mutex unless 96 + * Orphan list manipulation functions must be called under i_rwsem unless 97 97 * we are just creating the inode or deleting it. 98 98 */ 99 99 int ext4_orphan_add(handle_t *handle, struct inode *inode) ··· 119 119 /* 120 120 * Orphan handling is only valid for files with data blocks 121 121 * being truncated, or files being unlinked. Note that we either 122 - * hold i_mutex, or the inode can not be referenced from outside, 122 + * hold i_rwsem, or the inode can not be referenced from outside, 123 123 * so i_nlink should not be bumped due to race 124 124 */ 125 125 ASSERT((S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
+2 -2
fs/ext4/super.c
··· 5082 5082 INIT_LIST_HEAD(&sbi->s_fc_dentry_q[FC_Q_STAGING]); 5083 5083 sbi->s_fc_bytes = 0; 5084 5084 ext4_clear_mount_flag(sb, EXT4_MF_FC_INELIGIBLE); 5085 - ext4_clear_mount_flag(sb, EXT4_MF_FC_COMMITTING); 5085 + sbi->s_fc_ineligible_tid = 0; 5086 5086 spin_lock_init(&sbi->s_fc_lock); 5087 5087 memset(&sbi->s_fc_stats, 0, sizeof(sbi->s_fc_stats)); 5088 5088 sbi->s_fc_replay_state.fc_regions = NULL; ··· 5540 5540 5541 5541 sbi = ext4_alloc_sbi(sb); 5542 5542 if (!sbi) 5543 - ret = -ENOMEM; 5543 + return -ENOMEM; 5544 5544 5545 5545 fc->s_fs_info = sbi; 5546 5546
+3 -3
fs/ext4/xattr.c
··· 2408 2408 if (IS_SYNC(inode)) 2409 2409 ext4_handle_sync(handle); 2410 2410 } 2411 - ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_XATTR); 2411 + ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_XATTR, handle); 2412 2412 2413 2413 cleanup: 2414 2414 brelse(is.iloc.bh); ··· 2486 2486 if (error == 0) 2487 2487 error = error2; 2488 2488 } 2489 - ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_XATTR); 2489 + ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_XATTR, NULL); 2490 2490 2491 2491 return error; 2492 2492 } ··· 2920 2920 error); 2921 2921 goto cleanup; 2922 2922 } 2923 - ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_XATTR); 2923 + ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_XATTR, handle); 2924 2924 } 2925 2925 error = 0; 2926 2926 cleanup:
+2
fs/file_table.c
··· 119 119 static int __init init_fs_stat_sysctls(void) 120 120 { 121 121 register_sysctl_init("fs", fs_stat_sysctls); 122 + if (IS_ENABLED(CONFIG_BINFMT_MISC)) 123 + register_sysctl_mount_point("fs/binfmt_misc"); 122 124 return 0; 123 125 } 124 126 fs_initcall(init_fs_stat_sysctls);
+48 -4
fs/iomap/buffered-io.c
··· 21 21 22 22 #include "../internal.h" 23 23 24 + #define IOEND_BATCH_SIZE 4096 25 + 24 26 /* 25 27 * Structure allocated for each folio when block size < folio size 26 28 * to track sub-folio uptodate status and I/O completions. ··· 1041 1039 * state, release holds on bios, and finally free up memory. Do not use the 1042 1040 * ioend after this. 1043 1041 */ 1044 - static void 1042 + static u32 1045 1043 iomap_finish_ioend(struct iomap_ioend *ioend, int error) 1046 1044 { 1047 1045 struct inode *inode = ioend->io_inode; ··· 1050 1048 u64 start = bio->bi_iter.bi_sector; 1051 1049 loff_t offset = ioend->io_offset; 1052 1050 bool quiet = bio_flagged(bio, BIO_QUIET); 1051 + u32 folio_count = 0; 1053 1052 1054 1053 for (bio = &ioend->io_inline_bio; bio; bio = next) { 1055 1054 struct folio_iter fi; ··· 1065 1062 next = bio->bi_private; 1066 1063 1067 1064 /* walk all folios in bio, ending page IO on them */ 1068 - bio_for_each_folio_all(fi, bio) 1065 + bio_for_each_folio_all(fi, bio) { 1069 1066 iomap_finish_folio_write(inode, fi.folio, fi.length, 1070 1067 error); 1068 + folio_count++; 1069 + } 1071 1070 bio_put(bio); 1072 1071 } 1073 1072 /* The ioend has been freed by bio_put() */ ··· 1079 1074 "%s: writeback error on inode %lu, offset %lld, sector %llu", 1080 1075 inode->i_sb->s_id, inode->i_ino, offset, start); 1081 1076 } 1077 + return folio_count; 1082 1078 } 1083 1079 1080 + /* 1081 + * Ioend completion routine for merged bios. This can only be called from task 1082 + * contexts as merged ioends can be of unbound length. Hence we have to break up 1083 + * the writeback completions into manageable chunks to avoid long scheduler 1084 + * holdoffs. We aim to keep scheduler holdoffs down below 10ms so that we get 1085 + * good batch processing throughput without creating adverse scheduler latency 1086 + * conditions. 1087 + */ 1084 1088 void 1085 1089 iomap_finish_ioends(struct iomap_ioend *ioend, int error) 1086 1090 { 1087 1091 struct list_head tmp; 1092 + u32 completions; 1093 + 1094 + might_sleep(); 1088 1095 1089 1096 list_replace_init(&ioend->io_list, &tmp); 1090 - iomap_finish_ioend(ioend, error); 1097 + completions = iomap_finish_ioend(ioend, error); 1091 1098 1092 1099 while (!list_empty(&tmp)) { 1100 + if (completions > IOEND_BATCH_SIZE * 8) { 1101 + cond_resched(); 1102 + completions = 0; 1103 + } 1093 1104 ioend = list_first_entry(&tmp, struct iomap_ioend, io_list); 1094 1105 list_del_init(&ioend->io_list); 1095 - iomap_finish_ioend(ioend, error); 1106 + completions += iomap_finish_ioend(ioend, error); 1096 1107 } 1097 1108 } 1098 1109 EXPORT_SYMBOL_GPL(iomap_finish_ioends); ··· 1128 1107 (next->io_type == IOMAP_UNWRITTEN)) 1129 1108 return false; 1130 1109 if (ioend->io_offset + ioend->io_size != next->io_offset) 1110 + return false; 1111 + /* 1112 + * Do not merge physically discontiguous ioends. The filesystem 1113 + * completion functions will have to iterate the physical 1114 + * discontiguities even if we merge the ioends at a logical level, so 1115 + * we don't gain anything by merging physical discontiguities here. 1116 + * 1117 + * We cannot use bio->bi_iter.bi_sector here as it is modified during 1118 + * submission so does not point to the start sector of the bio at 1119 + * completion. 1120 + */ 1121 + if (ioend->io_sector + (ioend->io_size >> 9) != next->io_sector) 1131 1122 return false; 1132 1123 return true; 1133 1124 } ··· 1242 1209 ioend->io_flags = wpc->iomap.flags; 1243 1210 ioend->io_inode = inode; 1244 1211 ioend->io_size = 0; 1212 + ioend->io_folios = 0; 1245 1213 ioend->io_offset = offset; 1246 1214 ioend->io_bio = bio; 1215 + ioend->io_sector = sector; 1247 1216 return ioend; 1248 1217 } 1249 1218 ··· 1285 1250 if (offset != wpc->ioend->io_offset + wpc->ioend->io_size) 1286 1251 return false; 1287 1252 if (sector != bio_end_sector(wpc->ioend->io_bio)) 1253 + return false; 1254 + /* 1255 + * Limit ioend bio chain lengths to minimise IO completion latency. This 1256 + * also prevents long tight loops ending page writeback on all the 1257 + * folios in the ioend. 1258 + */ 1259 + if (wpc->ioend->io_folios >= IOEND_BATCH_SIZE) 1288 1260 return false; 1289 1261 return true; 1290 1262 } ··· 1377 1335 &submit_list); 1378 1336 count++; 1379 1337 } 1338 + if (count) 1339 + wpc->ioend->io_folios++; 1380 1340 1381 1341 WARN_ON_ONCE(!wpc->ioend && !list_empty(&submit_list)); 1382 1342 WARN_ON_ONCE(!folio_test_locked(folio));
+4 -17
fs/jbd2/commit.c
··· 484 484 stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start, 485 485 stats.run.rs_locked); 486 486 487 - spin_lock(&commit_transaction->t_handle_lock); 488 - while (atomic_read(&commit_transaction->t_updates)) { 489 - DEFINE_WAIT(wait); 487 + // waits for any t_updates to finish 488 + jbd2_journal_wait_updates(journal); 490 489 491 - prepare_to_wait(&journal->j_wait_updates, &wait, 492 - TASK_UNINTERRUPTIBLE); 493 - if (atomic_read(&commit_transaction->t_updates)) { 494 - spin_unlock(&commit_transaction->t_handle_lock); 495 - write_unlock(&journal->j_state_lock); 496 - schedule(); 497 - write_lock(&journal->j_state_lock); 498 - spin_lock(&commit_transaction->t_handle_lock); 499 - } 500 - finish_wait(&journal->j_wait_updates, &wait); 501 - } 502 - spin_unlock(&commit_transaction->t_handle_lock); 503 490 commit_transaction->t_state = T_SWITCH; 504 491 write_unlock(&journal->j_state_lock); 505 492 ··· 804 817 commit_transaction->t_state = T_COMMIT_DFLUSH; 805 818 write_unlock(&journal->j_state_lock); 806 819 807 - /* 820 + /* 808 821 * If the journal is not located on the file system device, 809 822 * then we must flush the file system device before we issue 810 823 * the commit record ··· 1157 1170 if (journal->j_commit_callback) 1158 1171 journal->j_commit_callback(journal, commit_transaction); 1159 1172 if (journal->j_fc_cleanup_callback) 1160 - journal->j_fc_cleanup_callback(journal, 1); 1173 + journal->j_fc_cleanup_callback(journal, 1, commit_transaction->t_tid); 1161 1174 1162 1175 trace_jbd2_end_commit(journal, commit_transaction); 1163 1176 jbd_debug(1, "JBD2: commit %d complete, head %d\n",
+5 -1
fs/jbd2/journal.c
··· 771 771 { 772 772 jbd2_journal_unlock_updates(journal); 773 773 if (journal->j_fc_cleanup_callback) 774 - journal->j_fc_cleanup_callback(journal, 0); 774 + journal->j_fc_cleanup_callback(journal, 0, tid); 775 775 write_lock(&journal->j_state_lock); 776 776 journal->j_flags &= ~JBD2_FAST_COMMIT_ONGOING; 777 777 if (fallback) ··· 1287 1287 1288 1288 /** 1289 1289 * jbd2_journal_shrink_scan() 1290 + * @shrink: shrinker to work on 1291 + * @sc: reclaim request to process 1290 1292 * 1291 1293 * Scan the checkpointed buffer on the checkpoint list and release the 1292 1294 * journal_head. ··· 1314 1312 1315 1313 /** 1316 1314 * jbd2_journal_shrink_count() 1315 + * @shrink: shrinker to work on 1316 + * @sc: reclaim request to process 1317 1317 * 1318 1318 * Count the number of checkpoint buffers on the checkpoint list. 1319 1319 */
+32 -21
fs/jbd2/transaction.c
··· 449 449 } 450 450 451 451 /* OK, account for the buffers that this operation expects to 452 - * use and add the handle to the running transaction. 452 + * use and add the handle to the running transaction. 453 453 */ 454 454 update_t_max_wait(transaction, ts); 455 455 handle->h_transaction = transaction; ··· 836 836 } 837 837 EXPORT_SYMBOL(jbd2_journal_restart); 838 838 839 + /* 840 + * Waits for any outstanding t_updates to finish. 841 + * This is called with write j_state_lock held. 842 + */ 843 + void jbd2_journal_wait_updates(journal_t *journal) 844 + { 845 + transaction_t *commit_transaction = journal->j_running_transaction; 846 + 847 + if (!commit_transaction) 848 + return; 849 + 850 + spin_lock(&commit_transaction->t_handle_lock); 851 + while (atomic_read(&commit_transaction->t_updates)) { 852 + DEFINE_WAIT(wait); 853 + 854 + prepare_to_wait(&journal->j_wait_updates, &wait, 855 + TASK_UNINTERRUPTIBLE); 856 + if (atomic_read(&commit_transaction->t_updates)) { 857 + spin_unlock(&commit_transaction->t_handle_lock); 858 + write_unlock(&journal->j_state_lock); 859 + schedule(); 860 + write_lock(&journal->j_state_lock); 861 + spin_lock(&commit_transaction->t_handle_lock); 862 + } 863 + finish_wait(&journal->j_wait_updates, &wait); 864 + } 865 + spin_unlock(&commit_transaction->t_handle_lock); 866 + } 867 + 839 868 /** 840 869 * jbd2_journal_lock_updates () - establish a transaction barrier. 841 870 * @journal: Journal to establish a barrier on. ··· 892 863 write_lock(&journal->j_state_lock); 893 864 } 894 865 895 - /* Wait until there are no running updates */ 896 - while (1) { 897 - transaction_t *transaction = journal->j_running_transaction; 866 + /* Wait until there are no running t_updates */ 867 + jbd2_journal_wait_updates(journal); 898 868 899 - if (!transaction) 900 - break; 901 - 902 - spin_lock(&transaction->t_handle_lock); 903 - prepare_to_wait(&journal->j_wait_updates, &wait, 904 - TASK_UNINTERRUPTIBLE); 905 - if (!atomic_read(&transaction->t_updates)) { 906 - spin_unlock(&transaction->t_handle_lock); 907 - finish_wait(&journal->j_wait_updates, &wait); 908 - break; 909 - } 910 - spin_unlock(&transaction->t_handle_lock); 911 - write_unlock(&journal->j_state_lock); 912 - schedule(); 913 - finish_wait(&journal->j_wait_updates, &wait); 914 - write_lock(&journal->j_state_lock); 915 - } 916 869 write_unlock(&journal->j_state_lock); 917 870 918 871 /*
+27
fs/ksmbd/auth.c
··· 29 29 #include "mgmt/user_config.h" 30 30 #include "crypto_ctx.h" 31 31 #include "transport_ipc.h" 32 + #include "../smbfs_common/arc4.h" 32 33 33 34 /* 34 35 * Fixed format data defining GSS header and fixed string ··· 337 336 nt_len - CIFS_ENCPWD_SIZE, 338 337 domain_name, conn->ntlmssp.cryptkey); 339 338 kfree(domain_name); 339 + 340 + /* The recovered secondary session key */ 341 + if (conn->ntlmssp.client_flags & NTLMSSP_NEGOTIATE_KEY_XCH) { 342 + struct arc4_ctx *ctx_arc4; 343 + unsigned int sess_key_off, sess_key_len; 344 + 345 + sess_key_off = le32_to_cpu(authblob->SessionKey.BufferOffset); 346 + sess_key_len = le16_to_cpu(authblob->SessionKey.Length); 347 + 348 + if (blob_len < (u64)sess_key_off + sess_key_len) 349 + return -EINVAL; 350 + 351 + ctx_arc4 = kmalloc(sizeof(*ctx_arc4), GFP_KERNEL); 352 + if (!ctx_arc4) 353 + return -ENOMEM; 354 + 355 + cifs_arc4_setkey(ctx_arc4, sess->sess_key, 356 + SMB2_NTLMV2_SESSKEY_SIZE); 357 + cifs_arc4_crypt(ctx_arc4, sess->sess_key, 358 + (char *)authblob + sess_key_off, sess_key_len); 359 + kfree_sensitive(ctx_arc4); 360 + } 361 + 340 362 return ret; 341 363 } 342 364 ··· 431 407 if (conn->use_spnego && 432 408 (cflags & NTLMSSP_NEGOTIATE_EXTENDED_SEC)) 433 409 flags |= NTLMSSP_NEGOTIATE_EXTENDED_SEC; 410 + 411 + if (cflags & NTLMSSP_NEGOTIATE_KEY_XCH) 412 + flags |= NTLMSSP_NEGOTIATE_KEY_XCH; 434 413 435 414 chgblob->NegotiateFlags = cpu_to_le32(flags); 436 415 len = strlen(ksmbd_netbios_name());
+35 -10
fs/ksmbd/smb2pdu.c
··· 2688 2688 (struct create_posix *)context; 2689 2689 if (le16_to_cpu(context->DataOffset) + 2690 2690 le32_to_cpu(context->DataLength) < 2691 - sizeof(struct create_posix)) { 2691 + sizeof(struct create_posix) - 4) { 2692 2692 rc = -EINVAL; 2693 2693 goto err_out1; 2694 2694 } ··· 3422 3422 goto free_conv_name; 3423 3423 } 3424 3424 3425 - struct_sz = readdir_info_level_struct_sz(info_level); 3426 - next_entry_offset = ALIGN(struct_sz - 1 + conv_len, 3427 - KSMBD_DIR_INFO_ALIGNMENT); 3425 + struct_sz = readdir_info_level_struct_sz(info_level) - 1 + conv_len; 3426 + next_entry_offset = ALIGN(struct_sz, KSMBD_DIR_INFO_ALIGNMENT); 3427 + d_info->last_entry_off_align = next_entry_offset - struct_sz; 3428 3428 3429 3429 if (next_entry_offset > d_info->out_buf_len) { 3430 3430 d_info->out_buf_len = 0; ··· 3976 3976 ((struct file_directory_info *) 3977 3977 ((char *)rsp->Buffer + d_info.last_entry_offset)) 3978 3978 ->NextEntryOffset = 0; 3979 + d_info.data_count -= d_info.last_entry_off_align; 3979 3980 3980 3981 rsp->StructureSize = cpu_to_le16(9); 3981 3982 rsp->OutputBufferOffset = cpu_to_le16(72); ··· 6127 6126 __le16 ChannelInfoOffset, 6128 6127 __le16 ChannelInfoLength) 6129 6128 { 6129 + unsigned int i, ch_count; 6130 + 6130 6131 if (work->conn->dialect == SMB30_PROT_ID && 6131 6132 Channel != SMB2_CHANNEL_RDMA_V1) 6132 6133 return -EINVAL; 6133 6134 6134 - if (ChannelInfoOffset == 0 || 6135 - le16_to_cpu(ChannelInfoLength) < sizeof(*desc)) 6135 + ch_count = le16_to_cpu(ChannelInfoLength) / sizeof(*desc); 6136 + if (ksmbd_debug_types & KSMBD_DEBUG_RDMA) { 6137 + for (i = 0; i < ch_count; i++) { 6138 + pr_info("RDMA r/w request %#x: token %#x, length %#x\n", 6139 + i, 6140 + le32_to_cpu(desc[i].token), 6141 + le32_to_cpu(desc[i].length)); 6142 + } 6143 + } 6144 + if (ch_count != 1) { 6145 + ksmbd_debug(RDMA, "RDMA multiple buffer descriptors %d are not supported yet\n", 6146 + ch_count); 6136 6147 return -EINVAL; 6148 + } 6137 6149 6138 6150 work->need_invalidate_rkey = 6139 6151 (Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE); ··· 6199 6185 6200 6186 if (req->Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE || 6201 6187 req->Channel == SMB2_CHANNEL_RDMA_V1) { 6188 + unsigned int ch_offset = le16_to_cpu(req->ReadChannelInfoOffset); 6189 + 6190 + if (ch_offset < offsetof(struct smb2_read_req, Buffer)) { 6191 + err = -EINVAL; 6192 + goto out; 6193 + } 6202 6194 err = smb2_set_remote_key_for_rdma(work, 6203 6195 (struct smb2_buffer_desc_v1 *) 6204 - &req->Buffer[0], 6196 + ((char *)req + ch_offset), 6205 6197 req->Channel, 6206 6198 req->ReadChannelInfoOffset, 6207 6199 req->ReadChannelInfoLength); ··· 6448 6428 6449 6429 if (req->Channel == SMB2_CHANNEL_RDMA_V1 || 6450 6430 req->Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE) { 6451 - if (req->Length != 0 || req->DataOffset != 0) 6452 - return -EINVAL; 6431 + unsigned int ch_offset = le16_to_cpu(req->WriteChannelInfoOffset); 6432 + 6433 + if (req->Length != 0 || req->DataOffset != 0 || 6434 + ch_offset < offsetof(struct smb2_write_req, Buffer)) { 6435 + err = -EINVAL; 6436 + goto out; 6437 + } 6453 6438 err = smb2_set_remote_key_for_rdma(work, 6454 6439 (struct smb2_buffer_desc_v1 *) 6455 - &req->Buffer[0], 6440 + ((char *)req + ch_offset), 6456 6441 req->Channel, 6457 6442 req->WriteChannelInfoOffset, 6458 6443 req->WriteChannelInfoLength);
+4 -1
fs/ksmbd/smb_common.c
··· 308 308 for (i = 0; i < 2; i++) { 309 309 struct kstat kstat; 310 310 struct ksmbd_kstat ksmbd_kstat; 311 + struct dentry *dentry; 311 312 312 313 if (!dir->dot_dotdot[i]) { /* fill dot entry info */ 313 314 if (i == 0) { 314 315 d_info->name = "."; 315 316 d_info->name_len = 1; 317 + dentry = dir->filp->f_path.dentry; 316 318 } else { 317 319 d_info->name = ".."; 318 320 d_info->name_len = 2; 321 + dentry = dir->filp->f_path.dentry->d_parent; 319 322 } 320 323 321 324 if (!match_pattern(d_info->name, d_info->name_len, ··· 330 327 ksmbd_kstat.kstat = &kstat; 331 328 ksmbd_vfs_fill_dentry_attrs(work, 332 329 user_ns, 333 - dir->filp->f_path.dentry->d_parent, 330 + dentry, 334 331 &ksmbd_kstat); 335 332 rc = fn(conn, info_level, d_info, &ksmbd_kstat); 336 333 if (rc)
+1 -1
fs/ksmbd/transport_rdma.c
··· 80 80 /* The maximum single-message size which can be received */ 81 81 static int smb_direct_max_receive_size = 8192; 82 82 83 - static int smb_direct_max_read_write_size = 1048512; 83 + static int smb_direct_max_read_write_size = 524224; 84 84 85 85 static int smb_direct_max_outstanding_rw_ops = 8; 86 86
+1
fs/ksmbd/vfs.h
··· 47 47 int last_entry_offset; 48 48 bool hide_dot_file; 49 49 int flags; 50 + int last_entry_off_align; 50 51 }; 51 52 52 53 struct ksmbd_readdir_data {
+1 -1
fs/nfs/client.c
··· 177 177 INIT_LIST_HEAD(&clp->cl_superblocks); 178 178 clp->cl_rpcclient = ERR_PTR(-EINVAL); 179 179 180 + clp->cl_flags = cl_init->init_flags; 180 181 clp->cl_proto = cl_init->proto; 181 182 clp->cl_nconnect = cl_init->nconnect; 182 183 clp->cl_max_connect = cl_init->max_connect ? cl_init->max_connect : 1; ··· 424 423 list_add_tail(&new->cl_share_link, 425 424 &nn->nfs_client_list); 426 425 spin_unlock(&nn->nfs_client_lock); 427 - new->cl_flags = cl_init->init_flags; 428 426 return rpc_ops->init_client(new, cl_init); 429 427 } 430 428
+18 -6
fs/nfs/dir.c
··· 80 80 ctx->dir_cookie = 0; 81 81 ctx->dup_cookie = 0; 82 82 ctx->page_index = 0; 83 + ctx->eof = false; 83 84 spin_lock(&dir->i_lock); 84 85 if (list_empty(&nfsi->open_files) && 85 86 (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER)) ··· 169 168 unsigned int cache_entry_index; 170 169 signed char duped; 171 170 bool plus; 171 + bool eob; 172 172 bool eof; 173 173 }; 174 174 ··· 869 867 870 868 status = nfs_readdir_page_filler(desc, entry, pages, pglen, 871 869 arrays, narrays); 872 - } while (!status && nfs_readdir_page_needs_filling(page)); 870 + } while (!status && nfs_readdir_page_needs_filling(page) && 871 + page_mapping(page)); 873 872 874 873 nfs_readdir_free_pages(pages, array_size); 875 874 out: ··· 991 988 ent = &array->array[i]; 992 989 if (!dir_emit(desc->ctx, ent->name, ent->name_len, 993 990 nfs_compat_user_ino64(ent->ino), ent->d_type)) { 994 - desc->eof = true; 991 + desc->eob = true; 995 992 break; 996 993 } 997 994 memcpy(desc->verf, verf, sizeof(desc->verf)); ··· 1007 1004 desc->duped = 1; 1008 1005 } 1009 1006 if (array->page_is_eof) 1010 - desc->eof = true; 1007 + desc->eof = !desc->eob; 1011 1008 1012 1009 kunmap(desc->page); 1013 1010 dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %llu\n", ··· 1044 1041 goto out; 1045 1042 1046 1043 desc->page_index = 0; 1044 + desc->cache_entry_index = 0; 1047 1045 desc->last_cookie = desc->dir_cookie; 1048 1046 desc->duped = 0; 1049 1047 1050 1048 status = nfs_readdir_xdr_to_array(desc, desc->verf, verf, arrays, sz); 1051 1049 1052 - for (i = 0; !desc->eof && i < sz && arrays[i]; i++) { 1050 + for (i = 0; !desc->eob && i < sz && arrays[i]; i++) { 1053 1051 desc->page = arrays[i]; 1054 1052 nfs_do_filldir(desc, verf); 1055 1053 } ··· 1109 1105 desc->duped = dir_ctx->duped; 1110 1106 page_index = dir_ctx->page_index; 1111 1107 desc->attr_gencount = dir_ctx->attr_gencount; 1108 + desc->eof = dir_ctx->eof; 1112 1109 memcpy(desc->verf, dir_ctx->verf, sizeof(desc->verf)); 1113 1110 spin_unlock(&file->f_lock); 1111 + 1112 + if (desc->eof) { 1113 + res = 0; 1114 + goto out_free; 1115 + } 1114 1116 1115 1117 if (test_and_clear_bit(NFS_INO_FORCE_READDIR, &nfsi->flags) && 1116 1118 list_is_singular(&nfsi->open_files)) ··· 1151 1141 1152 1142 nfs_do_filldir(desc, nfsi->cookieverf); 1153 1143 nfs_readdir_page_unlock_and_put_cached(desc); 1154 - } while (!desc->eof); 1144 + } while (!desc->eob && !desc->eof); 1155 1145 1156 1146 spin_lock(&file->f_lock); 1157 1147 dir_ctx->dir_cookie = desc->dir_cookie; ··· 1159 1149 dir_ctx->duped = desc->duped; 1160 1150 dir_ctx->attr_gencount = desc->attr_gencount; 1161 1151 dir_ctx->page_index = desc->page_index; 1152 + dir_ctx->eof = desc->eof; 1162 1153 memcpy(dir_ctx->verf, desc->verf, sizeof(dir_ctx->verf)); 1163 1154 spin_unlock(&file->f_lock); 1164 - 1155 + out_free: 1165 1156 kfree(desc); 1166 1157 1167 1158 out: ··· 1204 1193 if (offset == 0) 1205 1194 memset(dir_ctx->verf, 0, sizeof(dir_ctx->verf)); 1206 1195 dir_ctx->duped = 0; 1196 + dir_ctx->eof = false; 1207 1197 } 1208 1198 spin_unlock(&filp->f_lock); 1209 1199 return offset;
+2 -1
fs/nfs/nfs4proc.c
··· 8032 8032 8033 8033 /** 8034 8034 * nfs4_proc_get_locations - discover locations for a migrated FSID 8035 - * @inode: inode on FSID that is migrating 8035 + * @server: pointer to nfs_server to process 8036 + * @fhandle: pointer to the kernel NFS client file handle 8036 8037 * @locations: result of query 8037 8038 * @page: buffer 8038 8039 * @cred: credential to use for this operation
+11 -8
fs/nfsd/nfs3proc.c
··· 150 150 unsigned int len; 151 151 int v; 152 152 153 - argp->count = min_t(u32, argp->count, max_blocksize); 154 - 155 153 dprintk("nfsd: READ(3) %s %lu bytes at %Lu\n", 156 154 SVCFH_fmt(&argp->fh), 157 155 (unsigned long) argp->count, 158 156 (unsigned long long) argp->offset); 157 + 158 + argp->count = min_t(u32, argp->count, max_blocksize); 159 + if (argp->offset > (u64)OFFSET_MAX) 160 + argp->offset = (u64)OFFSET_MAX; 161 + if (argp->offset + argp->count > (u64)OFFSET_MAX) 162 + argp->count = (u64)OFFSET_MAX - argp->offset; 159 163 160 164 v = 0; 161 165 len = argp->count; ··· 202 198 argp->len, 203 199 (unsigned long long) argp->offset, 204 200 argp->stable? " stable" : ""); 201 + 202 + resp->status = nfserr_fbig; 203 + if (argp->offset > (u64)OFFSET_MAX || 204 + argp->offset + argp->len > (u64)OFFSET_MAX) 205 + return rpc_success; 205 206 206 207 fh_copy(&resp->fh, &argp->fh); 207 208 resp->committed = argp->stable; ··· 660 651 argp->count, 661 652 (unsigned long long) argp->offset); 662 653 663 - if (argp->offset > NFS_OFFSET_MAX) { 664 - resp->status = nfserr_inval; 665 - goto out; 666 - } 667 - 668 654 fh_copy(&resp->fh, &argp->fh); 669 655 resp->status = nfsd_commit(rqstp, &resp->fh, argp->offset, 670 656 argp->count, resp->verf); 671 - out: 672 657 return rpc_success; 673 658 } 674 659
+2 -2
fs/nfsd/nfs3xdr.c
··· 254 254 if (xdr_stream_decode_u64(xdr, &newsize) < 0) 255 255 return false; 256 256 iap->ia_valid |= ATTR_SIZE; 257 - iap->ia_size = min_t(u64, newsize, NFS_OFFSET_MAX); 257 + iap->ia_size = newsize; 258 258 } 259 259 if (xdr_stream_decode_u32(xdr, &set_it) < 0) 260 260 return false; ··· 1060 1060 return false; 1061 1061 /* cookie */ 1062 1062 resp->cookie_offset = dirlist->len; 1063 - if (xdr_stream_encode_u64(xdr, NFS_OFFSET_MAX) < 0) 1063 + if (xdr_stream_encode_u64(xdr, OFFSET_MAX) < 0) 1064 1064 return false; 1065 1065 1066 1066 return true;
+9 -4
fs/nfsd/nfs4proc.c
··· 782 782 __be32 status; 783 783 784 784 read->rd_nf = NULL; 785 - if (read->rd_offset >= OFFSET_MAX) 786 - return nfserr_inval; 787 785 788 786 trace_nfsd_read_start(rqstp, &cstate->current_fh, 789 787 read->rd_offset, read->rd_length); 788 + 789 + read->rd_length = min_t(u32, read->rd_length, svc_max_payload(rqstp)); 790 + if (read->rd_offset > (u64)OFFSET_MAX) 791 + read->rd_offset = (u64)OFFSET_MAX; 792 + if (read->rd_offset + read->rd_length > (u64)OFFSET_MAX) 793 + read->rd_length = (u64)OFFSET_MAX - read->rd_offset; 790 794 791 795 /* 792 796 * If we do a zero copy read, then a client will see read data ··· 1022 1018 unsigned long cnt; 1023 1019 int nvecs; 1024 1020 1025 - if (write->wr_offset >= OFFSET_MAX) 1026 - return nfserr_inval; 1021 + if (write->wr_offset > (u64)OFFSET_MAX || 1022 + write->wr_offset + write->wr_buflen > (u64)OFFSET_MAX) 1023 + return nfserr_fbig; 1027 1024 1028 1025 cnt = write->wr_buflen; 1029 1026 trace_nfsd_write_start(rqstp, &cstate->current_fh,
+3 -7
fs/nfsd/nfs4xdr.c
··· 3495 3495 p = xdr_reserve_space(xdr, 3*4 + namlen); 3496 3496 if (!p) 3497 3497 goto fail; 3498 - p = xdr_encode_hyper(p, NFS_OFFSET_MAX); /* offset of next entry */ 3498 + p = xdr_encode_hyper(p, OFFSET_MAX); /* offset of next entry */ 3499 3499 p = xdr_encode_array(p, name, namlen); /* name length & name */ 3500 3500 3501 3501 nfserr = nfsd4_encode_dirent_fattr(xdr, cd, name, namlen); ··· 3986 3986 } 3987 3987 xdr_commit_encode(xdr); 3988 3988 3989 - maxcount = svc_max_payload(resp->rqstp); 3990 - maxcount = min_t(unsigned long, maxcount, 3989 + maxcount = min_t(unsigned long, read->rd_length, 3991 3990 (xdr->buf->buflen - xdr->buf->len)); 3992 - maxcount = min_t(unsigned long, maxcount, read->rd_length); 3993 3991 3994 3992 if (file->f_op->splice_read && 3995 3993 test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags)) ··· 4824 4826 return nfserr_resource; 4825 4827 xdr_commit_encode(xdr); 4826 4828 4827 - maxcount = svc_max_payload(resp->rqstp); 4828 - maxcount = min_t(unsigned long, maxcount, 4829 + maxcount = min_t(unsigned long, read->rd_length, 4829 4830 (xdr->buf->buflen - xdr->buf->len)); 4830 - maxcount = min_t(unsigned long, maxcount, read->rd_length); 4831 4831 count = maxcount; 4832 4832 4833 4833 eof = read->rd_offset >= i_size_read(file_inode(file));
+7 -7
fs/nfsd/trace.h
··· 306 306 DECLARE_EVENT_CLASS(nfsd_io_class, 307 307 TP_PROTO(struct svc_rqst *rqstp, 308 308 struct svc_fh *fhp, 309 - loff_t offset, 310 - unsigned long len), 309 + u64 offset, 310 + u32 len), 311 311 TP_ARGS(rqstp, fhp, offset, len), 312 312 TP_STRUCT__entry( 313 313 __field(u32, xid) 314 314 __field(u32, fh_hash) 315 - __field(loff_t, offset) 316 - __field(unsigned long, len) 315 + __field(u64, offset) 316 + __field(u32, len) 317 317 ), 318 318 TP_fast_assign( 319 319 __entry->xid = be32_to_cpu(rqstp->rq_xid); ··· 321 321 __entry->offset = offset; 322 322 __entry->len = len; 323 323 ), 324 - TP_printk("xid=0x%08x fh_hash=0x%08x offset=%lld len=%lu", 324 + TP_printk("xid=0x%08x fh_hash=0x%08x offset=%llu len=%u", 325 325 __entry->xid, __entry->fh_hash, 326 326 __entry->offset, __entry->len) 327 327 ) ··· 330 330 DEFINE_EVENT(nfsd_io_class, nfsd_##name, \ 331 331 TP_PROTO(struct svc_rqst *rqstp, \ 332 332 struct svc_fh *fhp, \ 333 - loff_t offset, \ 334 - unsigned long len), \ 333 + u64 offset, \ 334 + u32 len), \ 335 335 TP_ARGS(rqstp, fhp, offset, len)) 336 336 337 337 DEFINE_NFSD_IO_EVENT(read_start);
+40 -17
fs/nfsd/vfs.c
··· 435 435 .ia_size = iap->ia_size, 436 436 }; 437 437 438 + host_err = -EFBIG; 439 + if (iap->ia_size < 0) 440 + goto out_unlock; 441 + 438 442 host_err = notify_change(&init_user_ns, dentry, &size_attr, NULL); 439 443 if (host_err) 440 444 goto out_unlock; ··· 1114 1110 } 1115 1111 1116 1112 #ifdef CONFIG_NFSD_V3 1117 - /* 1118 - * Commit all pending writes to stable storage. 1113 + /** 1114 + * nfsd_commit - Commit pending writes to stable storage 1115 + * @rqstp: RPC request being processed 1116 + * @fhp: NFS filehandle 1117 + * @offset: raw offset from beginning of file 1118 + * @count: raw count of bytes to sync 1119 + * @verf: filled in with the server's current write verifier 1119 1120 * 1120 - * Note: we only guarantee that data that lies within the range specified 1121 - * by the 'offset' and 'count' parameters will be synced. 1121 + * Note: we guarantee that data that lies within the range specified 1122 + * by the 'offset' and 'count' parameters will be synced. The server 1123 + * is permitted to sync data that lies outside this range at the 1124 + * same time. 1122 1125 * 1123 1126 * Unfortunately we cannot lock the file to make sure we return full WCC 1124 1127 * data to the client, as locking happens lower down in the filesystem. 1128 + * 1129 + * Return values: 1130 + * An nfsstat value in network byte order. 1125 1131 */ 1126 1132 __be32 1127 - nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp, 1128 - loff_t offset, unsigned long count, __be32 *verf) 1133 + nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp, u64 offset, 1134 + u32 count, __be32 *verf) 1129 1135 { 1136 + u64 maxbytes; 1137 + loff_t start, end; 1130 1138 struct nfsd_net *nn; 1131 1139 struct nfsd_file *nf; 1132 - loff_t end = LLONG_MAX; 1133 - __be32 err = nfserr_inval; 1134 - 1135 - if (offset < 0) 1136 - goto out; 1137 - if (count != 0) { 1138 - end = offset + (loff_t)count - 1; 1139 - if (end < offset) 1140 - goto out; 1141 - } 1140 + __be32 err; 1142 1141 1143 1142 err = nfsd_file_acquire(rqstp, fhp, 1144 1143 NFSD_MAY_WRITE|NFSD_MAY_NOT_BREAK_LEASE, &nf); 1145 1144 if (err) 1146 1145 goto out; 1146 + 1147 + /* 1148 + * Convert the client-provided (offset, count) range to a 1149 + * (start, end) range. If the client-provided range falls 1150 + * outside the maximum file size of the underlying FS, 1151 + * clamp the sync range appropriately. 1152 + */ 1153 + start = 0; 1154 + end = LLONG_MAX; 1155 + maxbytes = (u64)fhp->fh_dentry->d_sb->s_maxbytes; 1156 + if (offset < maxbytes) { 1157 + start = offset; 1158 + if (count && (offset + count - 1 < maxbytes)) 1159 + end = offset + count - 1; 1160 + } 1161 + 1147 1162 nn = net_generic(nf->nf_net, nfsd_net_id); 1148 1163 if (EX_ISSYNC(fhp->fh_export)) { 1149 1164 errseq_t since = READ_ONCE(nf->nf_file->f_wb_err); 1150 1165 int err2; 1151 1166 1152 - err2 = vfs_fsync_range(nf->nf_file, offset, end, 0); 1167 + err2 = vfs_fsync_range(nf->nf_file, start, end, 0); 1153 1168 switch (err2) { 1154 1169 case 0: 1155 1170 nfsd_copy_write_verifier(verf, nn);
+2 -2
fs/nfsd/vfs.h
··· 74 74 char *name, int len, struct iattr *attrs, 75 75 struct svc_fh *res, int createmode, 76 76 u32 *verifier, bool *truncp, bool *created); 77 - __be32 nfsd_commit(struct svc_rqst *, struct svc_fh *, 78 - loff_t, unsigned long, __be32 *verf); 77 + __be32 nfsd_commit(struct svc_rqst *rqst, struct svc_fh *fhp, 78 + u64 offset, u32 count, __be32 *verf); 79 79 #endif /* CONFIG_NFSD_V3 */ 80 80 #ifdef CONFIG_NFSD_V4 81 81 __be32 nfsd_getxattr(struct svc_rqst *rqstp, struct svc_fh *fhp,
+8 -3
fs/quota/dquot.c
··· 690 690 /* This is not very clever (and fast) but currently I don't know about 691 691 * any other simple way of getting quota data to disk and we must get 692 692 * them there for userspace to be visible... */ 693 - if (sb->s_op->sync_fs) 694 - sb->s_op->sync_fs(sb, 1); 695 - sync_blockdev(sb->s_bdev); 693 + if (sb->s_op->sync_fs) { 694 + ret = sb->s_op->sync_fs(sb, 1); 695 + if (ret) 696 + return ret; 697 + } 698 + ret = sync_blockdev(sb->s_bdev); 699 + if (ret) 700 + return ret; 696 701 697 702 /* 698 703 * Now when everything is written we can discard the pagecache so
+12 -7
fs/super.c
··· 1616 1616 percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_); 1617 1617 } 1618 1618 1619 - static void sb_freeze_unlock(struct super_block *sb) 1619 + static void sb_freeze_unlock(struct super_block *sb, int level) 1620 1620 { 1621 - int level; 1622 - 1623 - for (level = SB_FREEZE_LEVELS - 1; level >= 0; level--) 1621 + for (level--; level >= 0; level--) 1624 1622 percpu_up_write(sb->s_writers.rw_sem + level); 1625 1623 } 1626 1624 ··· 1689 1691 sb_wait_write(sb, SB_FREEZE_PAGEFAULT); 1690 1692 1691 1693 /* All writers are done so after syncing there won't be dirty data */ 1692 - sync_filesystem(sb); 1694 + ret = sync_filesystem(sb); 1695 + if (ret) { 1696 + sb->s_writers.frozen = SB_UNFROZEN; 1697 + sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT); 1698 + wake_up(&sb->s_writers.wait_unfrozen); 1699 + deactivate_locked_super(sb); 1700 + return ret; 1701 + } 1693 1702 1694 1703 /* Now wait for internal filesystem counter */ 1695 1704 sb->s_writers.frozen = SB_FREEZE_FS; ··· 1708 1703 printk(KERN_ERR 1709 1704 "VFS:Filesystem freeze failed\n"); 1710 1705 sb->s_writers.frozen = SB_UNFROZEN; 1711 - sb_freeze_unlock(sb); 1706 + sb_freeze_unlock(sb, SB_FREEZE_FS); 1712 1707 wake_up(&sb->s_writers.wait_unfrozen); 1713 1708 deactivate_locked_super(sb); 1714 1709 return ret; ··· 1753 1748 } 1754 1749 1755 1750 sb->s_writers.frozen = SB_UNFROZEN; 1756 - sb_freeze_unlock(sb); 1751 + sb_freeze_unlock(sb, SB_FREEZE_FS); 1757 1752 out: 1758 1753 wake_up(&sb->s_writers.wait_unfrozen); 1759 1754 deactivate_locked_super(sb);
+12 -6
fs/sync.c
··· 29 29 */ 30 30 int sync_filesystem(struct super_block *sb) 31 31 { 32 - int ret; 32 + int ret = 0; 33 33 34 34 /* 35 35 * We need to be protected against the filesystem going from ··· 52 52 * at a time. 53 53 */ 54 54 writeback_inodes_sb(sb, WB_REASON_SYNC); 55 - if (sb->s_op->sync_fs) 56 - sb->s_op->sync_fs(sb, 0); 55 + if (sb->s_op->sync_fs) { 56 + ret = sb->s_op->sync_fs(sb, 0); 57 + if (ret) 58 + return ret; 59 + } 57 60 ret = sync_blockdev_nowait(sb->s_bdev); 58 - if (ret < 0) 61 + if (ret) 59 62 return ret; 60 63 61 64 sync_inodes_sb(sb); 62 - if (sb->s_op->sync_fs) 63 - sb->s_op->sync_fs(sb, 1); 65 + if (sb->s_op->sync_fs) { 66 + ret = sb->s_op->sync_fs(sb, 1); 67 + if (ret) 68 + return ret; 69 + } 64 70 return sync_blockdev(sb->s_bdev); 65 71 } 66 72 EXPORT_SYMBOL(sync_filesystem);
+15 -1
fs/xfs/xfs_aops.c
··· 136 136 memalloc_nofs_restore(nofs_flag); 137 137 } 138 138 139 - /* Finish all pending io completions. */ 139 + /* 140 + * Finish all pending IO completions that require transactional modifications. 141 + * 142 + * We try to merge physical and logically contiguous ioends before completion to 143 + * minimise the number of transactions we need to perform during IO completion. 144 + * Both unwritten extent conversion and COW remapping need to iterate and modify 145 + * one physical extent at a time, so we gain nothing by merging physically 146 + * discontiguous extents here. 147 + * 148 + * The ioend chain length that we can be processing here is largely unbound in 149 + * length and we may have to perform significant amounts of work on each ioend 150 + * to complete it. Hence we have to be careful about holding the CPU for too 151 + * long in this loop. 152 + */ 140 153 void 141 154 xfs_end_io( 142 155 struct work_struct *work) ··· 170 157 list_del_init(&ioend->io_list); 171 158 iomap_ioend_try_merge(ioend, &tmp); 172 159 xfs_end_ioend(ioend); 160 + cond_resched(); 173 161 } 174 162 } 175 163
+3 -6
fs/xfs/xfs_bmap_util.c
··· 850 850 rblocks = 0; 851 851 } 852 852 853 - /* 854 - * Allocate and setup the transaction. 855 - */ 856 853 error = xfs_trans_alloc_inode(ip, &M_RES(mp)->tr_write, 857 854 dblocks, rblocks, false, &tp); 858 855 if (error) ··· 866 869 if (error) 867 870 goto error; 868 871 869 - /* 870 - * Complete the transaction 871 - */ 872 + ip->i_diflags |= XFS_DIFLAG_PREALLOC; 873 + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 874 + 872 875 error = xfs_trans_commit(tp); 873 876 xfs_iunlock(ip, XFS_ILOCK_EXCL); 874 877 if (error)
+26 -60
fs/xfs/xfs_file.c
··· 66 66 return !((pos | len) & mask); 67 67 } 68 68 69 - int 70 - xfs_update_prealloc_flags( 71 - struct xfs_inode *ip, 72 - enum xfs_prealloc_flags flags) 73 - { 74 - struct xfs_trans *tp; 75 - int error; 76 - 77 - error = xfs_trans_alloc(ip->i_mount, &M_RES(ip->i_mount)->tr_writeid, 78 - 0, 0, 0, &tp); 79 - if (error) 80 - return error; 81 - 82 - xfs_ilock(ip, XFS_ILOCK_EXCL); 83 - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 84 - 85 - if (!(flags & XFS_PREALLOC_INVISIBLE)) { 86 - VFS_I(ip)->i_mode &= ~S_ISUID; 87 - if (VFS_I(ip)->i_mode & S_IXGRP) 88 - VFS_I(ip)->i_mode &= ~S_ISGID; 89 - xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); 90 - } 91 - 92 - if (flags & XFS_PREALLOC_SET) 93 - ip->i_diflags |= XFS_DIFLAG_PREALLOC; 94 - if (flags & XFS_PREALLOC_CLEAR) 95 - ip->i_diflags &= ~XFS_DIFLAG_PREALLOC; 96 - 97 - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 98 - if (flags & XFS_PREALLOC_SYNC) 99 - xfs_trans_set_sync(tp); 100 - return xfs_trans_commit(tp); 101 - } 102 - 103 69 /* 104 70 * Fsync operations on directories are much simpler than on regular files, 105 71 * as there is no file data to flush, and thus also no need for explicit ··· 861 895 return error; 862 896 } 863 897 898 + /* Does this file, inode, or mount want synchronous writes? */ 899 + static inline bool xfs_file_sync_writes(struct file *filp) 900 + { 901 + struct xfs_inode *ip = XFS_I(file_inode(filp)); 902 + 903 + if (xfs_has_wsync(ip->i_mount)) 904 + return true; 905 + if (filp->f_flags & (__O_SYNC | O_DSYNC)) 906 + return true; 907 + if (IS_SYNC(file_inode(filp))) 908 + return true; 909 + 910 + return false; 911 + } 912 + 864 913 #define XFS_FALLOC_FL_SUPPORTED \ 865 914 (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \ 866 915 FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | \ ··· 891 910 struct inode *inode = file_inode(file); 892 911 struct xfs_inode *ip = XFS_I(inode); 893 912 long error; 894 - enum xfs_prealloc_flags flags = 0; 895 913 uint iolock = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL; 896 914 loff_t new_size = 0; 897 915 bool do_file_insert = false; ··· 934 954 if (error) 935 955 goto out_unlock; 936 956 } 957 + 958 + error = file_modified(file); 959 + if (error) 960 + goto out_unlock; 937 961 938 962 if (mode & FALLOC_FL_PUNCH_HOLE) { 939 963 error = xfs_free_file_space(ip, offset, len); ··· 988 1004 } 989 1005 do_file_insert = true; 990 1006 } else { 991 - flags |= XFS_PREALLOC_SET; 992 - 993 1007 if (!(mode & FALLOC_FL_KEEP_SIZE) && 994 1008 offset + len > i_size_read(inode)) { 995 1009 new_size = offset + len; ··· 1039 1057 } 1040 1058 } 1041 1059 1042 - if (file->f_flags & O_DSYNC) 1043 - flags |= XFS_PREALLOC_SYNC; 1044 - 1045 - error = xfs_update_prealloc_flags(ip, flags); 1046 - if (error) 1047 - goto out_unlock; 1048 - 1049 1060 /* Change file size if needed */ 1050 1061 if (new_size) { 1051 1062 struct iattr iattr; ··· 1057 1082 * leave shifted extents past EOF and hence losing access to 1058 1083 * the data that is contained within them. 1059 1084 */ 1060 - if (do_file_insert) 1085 + if (do_file_insert) { 1061 1086 error = xfs_insert_file_space(ip, offset, len); 1087 + if (error) 1088 + goto out_unlock; 1089 + } 1090 + 1091 + if (xfs_file_sync_writes(file)) 1092 + error = xfs_log_force_inode(ip); 1062 1093 1063 1094 out_unlock: 1064 1095 xfs_iunlock(ip, iolock); ··· 1094 1113 if (lockflags) 1095 1114 xfs_iunlock(ip, lockflags); 1096 1115 return ret; 1097 - } 1098 - 1099 - /* Does this file, inode, or mount want synchronous writes? */ 1100 - static inline bool xfs_file_sync_writes(struct file *filp) 1101 - { 1102 - struct xfs_inode *ip = XFS_I(file_inode(filp)); 1103 - 1104 - if (xfs_has_wsync(ip->i_mount)) 1105 - return true; 1106 - if (filp->f_flags & (__O_SYNC | O_DSYNC)) 1107 - return true; 1108 - if (IS_SYNC(file_inode(filp))) 1109 - return true; 1110 - 1111 - return false; 1112 1116 } 1113 1117 1114 1118 STATIC loff_t
-9
fs/xfs/xfs_inode.h
··· 462 462 } 463 463 464 464 /* from xfs_file.c */ 465 - enum xfs_prealloc_flags { 466 - XFS_PREALLOC_SET = (1 << 1), 467 - XFS_PREALLOC_CLEAR = (1 << 2), 468 - XFS_PREALLOC_SYNC = (1 << 3), 469 - XFS_PREALLOC_INVISIBLE = (1 << 4), 470 - }; 471 - 472 - int xfs_update_prealloc_flags(struct xfs_inode *ip, 473 - enum xfs_prealloc_flags flags); 474 465 int xfs_break_layouts(struct inode *inode, uint *iolock, 475 466 enum layout_break_reason reason); 476 467
+1 -1
fs/xfs/xfs_ioctl.c
··· 1464 1464 1465 1465 if (bmx.bmv_count < 2) 1466 1466 return -EINVAL; 1467 - if (bmx.bmv_count > ULONG_MAX / recsize) 1467 + if (bmx.bmv_count >= INT_MAX / recsize) 1468 1468 return -ENOMEM; 1469 1469 1470 1470 buf = kvcalloc(bmx.bmv_count, sizeof(*buf), GFP_KERNEL);
+39 -3
fs/xfs/xfs_pnfs.c
··· 71 71 } 72 72 73 73 /* 74 + * We cannot use file based VFS helpers such as file_modified() to update 75 + * inode state as we modify the data/metadata in the inode here. Hence we have 76 + * to open code the timestamp updates and SUID/SGID stripping. We also need 77 + * to set the inode prealloc flag to ensure that the extents we allocate are not 78 + * removed if the inode is reclaimed from memory before xfs_fs_block_commit() 79 + * is from the client to indicate that data has been written and the file size 80 + * can be extended. 81 + */ 82 + static int 83 + xfs_fs_map_update_inode( 84 + struct xfs_inode *ip) 85 + { 86 + struct xfs_trans *tp; 87 + int error; 88 + 89 + error = xfs_trans_alloc(ip->i_mount, &M_RES(ip->i_mount)->tr_writeid, 90 + 0, 0, 0, &tp); 91 + if (error) 92 + return error; 93 + 94 + xfs_ilock(ip, XFS_ILOCK_EXCL); 95 + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 96 + 97 + VFS_I(ip)->i_mode &= ~S_ISUID; 98 + if (VFS_I(ip)->i_mode & S_IXGRP) 99 + VFS_I(ip)->i_mode &= ~S_ISGID; 100 + xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); 101 + ip->i_diflags |= XFS_DIFLAG_PREALLOC; 102 + 103 + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 104 + return xfs_trans_commit(tp); 105 + } 106 + 107 + /* 74 108 * Get a layout for the pNFS client. 75 109 */ 76 110 int ··· 198 164 * that the blocks allocated and handed out to the client are 199 165 * guaranteed to be present even after a server crash. 200 166 */ 201 - error = xfs_update_prealloc_flags(ip, 202 - XFS_PREALLOC_SET | XFS_PREALLOC_SYNC); 167 + error = xfs_fs_map_update_inode(ip); 168 + if (!error) 169 + error = xfs_log_force_inode(ip); 203 170 if (error) 204 171 goto out_unlock; 172 + 205 173 } else { 206 174 xfs_iunlock(ip, lock_flags); 207 175 } ··· 291 255 length = end - start; 292 256 if (!length) 293 257 continue; 294 - 258 + 295 259 /* 296 260 * Make sure reads through the pagecache see the new data. 297 261 */
+5 -1
fs/xfs/xfs_super.c
··· 735 735 int wait) 736 736 { 737 737 struct xfs_mount *mp = XFS_M(sb); 738 + int error; 738 739 739 740 trace_xfs_fs_sync_fs(mp, __return_address); 740 741 ··· 745 744 if (!wait) 746 745 return 0; 747 746 748 - xfs_log_force(mp, XFS_LOG_SYNC); 747 + error = xfs_log_force(mp, XFS_LOG_SYNC); 748 + if (error) 749 + return error; 750 + 749 751 if (laptop_mode) { 750 752 /* 751 753 * The disk must be active because we're syncing.
+25 -15
include/crypto/internal/blake2s.h
··· 24 24 state->f[0] = -1; 25 25 } 26 26 27 - typedef void (*blake2s_compress_t)(struct blake2s_state *state, 28 - const u8 *block, size_t nblocks, u32 inc); 29 - 30 27 /* Helper functions for BLAKE2s shared by the library and shash APIs */ 31 28 32 - static inline void __blake2s_update(struct blake2s_state *state, 33 - const u8 *in, size_t inlen, 34 - blake2s_compress_t compress) 29 + static __always_inline void 30 + __blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen, 31 + bool force_generic) 35 32 { 36 33 const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen; 37 34 ··· 36 39 return; 37 40 if (inlen > fill) { 38 41 memcpy(state->buf + state->buflen, in, fill); 39 - (*compress)(state, state->buf, 1, BLAKE2S_BLOCK_SIZE); 42 + if (force_generic) 43 + blake2s_compress_generic(state, state->buf, 1, 44 + BLAKE2S_BLOCK_SIZE); 45 + else 46 + blake2s_compress(state, state->buf, 1, 47 + BLAKE2S_BLOCK_SIZE); 40 48 state->buflen = 0; 41 49 in += fill; 42 50 inlen -= fill; ··· 49 47 if (inlen > BLAKE2S_BLOCK_SIZE) { 50 48 const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE); 51 49 /* Hash one less (full) block than strictly possible */ 52 - (*compress)(state, in, nblocks - 1, BLAKE2S_BLOCK_SIZE); 50 + if (force_generic) 51 + blake2s_compress_generic(state, in, nblocks - 1, 52 + BLAKE2S_BLOCK_SIZE); 53 + else 54 + blake2s_compress(state, in, nblocks - 1, 55 + BLAKE2S_BLOCK_SIZE); 53 56 in += BLAKE2S_BLOCK_SIZE * (nblocks - 1); 54 57 inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1); 55 58 } ··· 62 55 state->buflen += inlen; 63 56 } 64 57 65 - static inline void __blake2s_final(struct blake2s_state *state, u8 *out, 66 - blake2s_compress_t compress) 58 + static __always_inline void 59 + __blake2s_final(struct blake2s_state *state, u8 *out, bool force_generic) 67 60 { 68 61 blake2s_set_lastblock(state); 69 62 memset(state->buf + state->buflen, 0, 70 63 BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */ 71 - (*compress)(state, state->buf, 1, state->buflen); 64 + if (force_generic) 65 + blake2s_compress_generic(state, state->buf, 1, state->buflen); 66 + else 67 + blake2s_compress(state, state->buf, 1, state->buflen); 72 68 cpu_to_le32_array(state->h, ARRAY_SIZE(state->h)); 73 69 memcpy(out, state->h, state->outlen); 74 70 } ··· 109 99 110 100 static inline int crypto_blake2s_update(struct shash_desc *desc, 111 101 const u8 *in, unsigned int inlen, 112 - blake2s_compress_t compress) 102 + bool force_generic) 113 103 { 114 104 struct blake2s_state *state = shash_desc_ctx(desc); 115 105 116 - __blake2s_update(state, in, inlen, compress); 106 + __blake2s_update(state, in, inlen, force_generic); 117 107 return 0; 118 108 } 119 109 120 110 static inline int crypto_blake2s_final(struct shash_desc *desc, u8 *out, 121 - blake2s_compress_t compress) 111 + bool force_generic) 122 112 { 123 113 struct blake2s_state *state = shash_desc_ctx(desc); 124 114 125 - __blake2s_final(state, out, compress); 115 + __blake2s_final(state, out, force_generic); 126 116 return 0; 127 117 } 128 118
+1 -1
include/linux/ata.h
··· 324 324 ATA_LOG_NCQ_NON_DATA = 0x12, 325 325 ATA_LOG_NCQ_SEND_RECV = 0x13, 326 326 ATA_LOG_IDENTIFY_DEVICE = 0x30, 327 + ATA_LOG_CONCURRENT_POSITIONING_RANGES = 0x47, 327 328 328 329 /* Identify device log pages: */ 329 330 ATA_LOG_SECURITY = 0x06, 330 331 ATA_LOG_SATA_SETTINGS = 0x08, 331 332 ATA_LOG_ZONED_INFORMATION = 0x09, 332 - ATA_LOG_CONCURRENT_POSITIONING_RANGES = 0x47, 333 333 334 334 /* Identify device SATA settings log:*/ 335 335 ATA_LOG_DEVSLP_OFFSET = 0x30,
+1
include/linux/ceph/libceph.h
··· 35 35 #define CEPH_OPT_TCP_NODELAY (1<<4) /* TCP_NODELAY on TCP sockets */ 36 36 #define CEPH_OPT_NOMSGSIGN (1<<5) /* don't sign msgs (msgr1) */ 37 37 #define CEPH_OPT_ABORT_ON_FULL (1<<6) /* abort w/ ENOSPC when full */ 38 + #define CEPH_OPT_RXBOUNCE (1<<7) /* double-buffer read data */ 38 39 39 40 #define CEPH_OPT_DEFAULT (CEPH_OPT_TCP_NODELAY) 40 41
+5
include/linux/ceph/messenger.h
··· 383 383 struct ceph_gcm_nonce in_gcm_nonce; 384 384 struct ceph_gcm_nonce out_gcm_nonce; 385 385 386 + struct page **in_enc_pages; 387 + int in_enc_page_cnt; 388 + int in_enc_resid; 389 + int in_enc_i; 386 390 struct page **out_enc_pages; 387 391 int out_enc_page_cnt; 388 392 int out_enc_resid; ··· 461 457 struct ceph_msg *out_msg; /* sending message (== tail of 462 458 out_sent) */ 463 459 460 + struct page *bounce_page; 464 461 u32 in_front_crc, in_middle_crc, in_data_crc; /* calculated crc */ 465 462 466 463 struct timespec64 last_keepalive_ack; /* keepalive2 ack stamp */
+1 -1
include/linux/fb.h
··· 262 262 263 263 /* Draws a rectangle */ 264 264 void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect); 265 - /* Copy data from area to another. Obsolete. */ 265 + /* Copy data from area to another */ 266 266 void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region); 267 267 /* Draws a image to the display */ 268 268 void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);
+2
include/linux/iomap.h
··· 263 263 struct list_head io_list; /* next ioend in chain */ 264 264 u16 io_type; 265 265 u16 io_flags; /* IOMAP_F_* */ 266 + u32 io_folios; /* folios added to ioend */ 266 267 struct inode *io_inode; /* file being written to */ 267 268 size_t io_size; /* size of the extent */ 268 269 loff_t io_offset; /* offset in the file */ 270 + sector_t io_sector; /* start sector of ioend */ 269 271 struct bio *io_bio; /* bio being built */ 270 272 struct bio io_inline_bio; /* MUST BE LAST! */ 271 273 };
+4 -9
include/linux/jbd2.h
··· 594 594 */ 595 595 unsigned long t_log_start; 596 596 597 - /* 597 + /* 598 598 * Number of buffers on the t_buffers list [j_list_lock, no locks 599 599 * needed for jbd2 thread] 600 600 */ ··· 1295 1295 * Clean-up after fast commit or full commit. JBD2 calls this function 1296 1296 * after every commit operation. 1297 1297 */ 1298 - void (*j_fc_cleanup_callback)(struct journal_s *journal, int); 1298 + void (*j_fc_cleanup_callback)(struct journal_s *journal, int full, tid_t tid); 1299 1299 1300 1300 /** 1301 1301 * @j_fc_replay_callback: ··· 1419 1419 extern bool __jbd2_journal_refile_buffer(struct journal_head *); 1420 1420 extern void jbd2_journal_refile_buffer(journal_t *, struct journal_head *); 1421 1421 extern void __jbd2_journal_file_buffer(struct journal_head *, transaction_t *, int); 1422 - extern void __journal_free_buffer(struct journal_head *bh); 1423 1422 extern void jbd2_journal_file_buffer(struct journal_head *, transaction_t *, int); 1424 - extern void __journal_clean_data_list(transaction_t *transaction); 1425 1423 static inline void jbd2_file_log_bh(struct list_head *head, struct buffer_head *bh) 1426 1424 { 1427 1425 list_add_tail(&bh->b_assoc_buffers, head); ··· 1484 1486 struct buffer_head **bh_out, 1485 1487 sector_t blocknr); 1486 1488 1487 - /* Transaction locking */ 1488 - extern void __wait_on_journal (journal_t *); 1489 - 1490 1489 /* Transaction cache support */ 1491 1490 extern void jbd2_journal_destroy_transaction_cache(void); 1492 1491 extern int __init jbd2_journal_init_transaction_cache(void); ··· 1537 1542 extern int jbd2_journal_flush(journal_t *journal, unsigned int flags); 1538 1543 extern void jbd2_journal_lock_updates (journal_t *); 1539 1544 extern void jbd2_journal_unlock_updates (journal_t *); 1545 + 1546 + void jbd2_journal_wait_updates(journal_t *); 1540 1547 1541 1548 extern journal_t * jbd2_journal_init_dev(struct block_device *bdev, 1542 1549 struct block_device *fs_dev, ··· 1770 1773 #define BJ_Shadow 3 /* Buffer contents being shadowed to the log */ 1771 1774 #define BJ_Reserved 4 /* Buffer is reserved for access by journal */ 1772 1775 #define BJ_Types 5 1773 - 1774 - extern int jbd_blocks_per_page(struct inode *inode); 1775 1776 1776 1777 /* JBD uses a CRC32 checksum */ 1777 1778 #define JBD_MAX_CHECKSUM_SIZE 4
+109 -3
include/linux/kvm_host.h
··· 29 29 #include <linux/refcount.h> 30 30 #include <linux/nospec.h> 31 31 #include <linux/notifier.h> 32 + #include <linux/ftrace.h> 32 33 #include <linux/hashtable.h> 34 + #include <linux/instrumentation.h> 33 35 #include <linux/interval_tree.h> 34 36 #include <linux/rbtree.h> 35 37 #include <linux/xarray.h> ··· 370 368 u64 last_used_slot_gen; 371 369 }; 372 370 373 - /* must be called with irqs disabled */ 374 - static __always_inline void guest_enter_irqoff(void) 371 + /* 372 + * Start accounting time towards a guest. 373 + * Must be called before entering guest context. 374 + */ 375 + static __always_inline void guest_timing_enter_irqoff(void) 375 376 { 376 377 /* 377 378 * This is running in ioctl context so its safe to assume that it's the ··· 383 378 instrumentation_begin(); 384 379 vtime_account_guest_enter(); 385 380 instrumentation_end(); 381 + } 386 382 383 + /* 384 + * Enter guest context and enter an RCU extended quiescent state. 385 + * 386 + * Between guest_context_enter_irqoff() and guest_context_exit_irqoff() it is 387 + * unsafe to use any code which may directly or indirectly use RCU, tracing 388 + * (including IRQ flag tracing), or lockdep. All code in this period must be 389 + * non-instrumentable. 390 + */ 391 + static __always_inline void guest_context_enter_irqoff(void) 392 + { 387 393 /* 388 394 * KVM does not hold any references to rcu protected data when it 389 395 * switches CPU into a guest mode. In fact switching to a guest mode ··· 410 394 } 411 395 } 412 396 413 - static __always_inline void guest_exit_irqoff(void) 397 + /* 398 + * Deprecated. Architectures should move to guest_timing_enter_irqoff() and 399 + * guest_state_enter_irqoff(). 400 + */ 401 + static __always_inline void guest_enter_irqoff(void) 402 + { 403 + guest_timing_enter_irqoff(); 404 + guest_context_enter_irqoff(); 405 + } 406 + 407 + /** 408 + * guest_state_enter_irqoff - Fixup state when entering a guest 409 + * 410 + * Entry to a guest will enable interrupts, but the kernel state is interrupts 411 + * disabled when this is invoked. Also tell RCU about it. 412 + * 413 + * 1) Trace interrupts on state 414 + * 2) Invoke context tracking if enabled to adjust RCU state 415 + * 3) Tell lockdep that interrupts are enabled 416 + * 417 + * Invoked from architecture specific code before entering a guest. 418 + * Must be called with interrupts disabled and the caller must be 419 + * non-instrumentable. 420 + * The caller has to invoke guest_timing_enter_irqoff() before this. 421 + * 422 + * Note: this is analogous to exit_to_user_mode(). 423 + */ 424 + static __always_inline void guest_state_enter_irqoff(void) 425 + { 426 + instrumentation_begin(); 427 + trace_hardirqs_on_prepare(); 428 + lockdep_hardirqs_on_prepare(CALLER_ADDR0); 429 + instrumentation_end(); 430 + 431 + guest_context_enter_irqoff(); 432 + lockdep_hardirqs_on(CALLER_ADDR0); 433 + } 434 + 435 + /* 436 + * Exit guest context and exit an RCU extended quiescent state. 437 + * 438 + * Between guest_context_enter_irqoff() and guest_context_exit_irqoff() it is 439 + * unsafe to use any code which may directly or indirectly use RCU, tracing 440 + * (including IRQ flag tracing), or lockdep. All code in this period must be 441 + * non-instrumentable. 442 + */ 443 + static __always_inline void guest_context_exit_irqoff(void) 414 444 { 415 445 context_tracking_guest_exit(); 446 + } 416 447 448 + /* 449 + * Stop accounting time towards a guest. 450 + * Must be called after exiting guest context. 451 + */ 452 + static __always_inline void guest_timing_exit_irqoff(void) 453 + { 417 454 instrumentation_begin(); 418 455 /* Flush the guest cputime we spent on the guest */ 419 456 vtime_account_guest_exit(); 420 457 instrumentation_end(); 458 + } 459 + 460 + /* 461 + * Deprecated. Architectures should move to guest_state_exit_irqoff() and 462 + * guest_timing_exit_irqoff(). 463 + */ 464 + static __always_inline void guest_exit_irqoff(void) 465 + { 466 + guest_context_exit_irqoff(); 467 + guest_timing_exit_irqoff(); 421 468 } 422 469 423 470 static inline void guest_exit(void) ··· 490 411 local_irq_save(flags); 491 412 guest_exit_irqoff(); 492 413 local_irq_restore(flags); 414 + } 415 + 416 + /** 417 + * guest_state_exit_irqoff - Establish state when returning from guest mode 418 + * 419 + * Entry from a guest disables interrupts, but guest mode is traced as 420 + * interrupts enabled. Also with NO_HZ_FULL RCU might be idle. 421 + * 422 + * 1) Tell lockdep that interrupts are disabled 423 + * 2) Invoke context tracking if enabled to reactivate RCU 424 + * 3) Trace interrupts off state 425 + * 426 + * Invoked from architecture specific code after exiting a guest. 427 + * Must be invoked with interrupts disabled and the caller must be 428 + * non-instrumentable. 429 + * The caller has to invoke guest_timing_exit_irqoff() after this. 430 + * 431 + * Note: this is analogous to enter_from_user_mode(). 432 + */ 433 + static __always_inline void guest_state_exit_irqoff(void) 434 + { 435 + lockdep_hardirqs_off(CALLER_ADDR0); 436 + guest_context_exit_irqoff(); 437 + 438 + instrumentation_begin(); 439 + trace_hardirqs_off_finish(); 440 + instrumentation_end(); 493 441 } 494 442 495 443 static inline int kvm_vcpu_exiting_guest_mode(struct kvm_vcpu *vcpu)
+1
include/linux/libata.h
··· 380 380 ATA_HORKAGE_MAX_TRIM_128M = (1 << 26), /* Limit max trim size to 128M */ 381 381 ATA_HORKAGE_NO_NCQ_ON_ATI = (1 << 27), /* Disable NCQ on ATI chipset */ 382 382 ATA_HORKAGE_NO_ID_DEV_LOG = (1 << 28), /* Identify device log missing */ 383 + ATA_HORKAGE_NO_LOG_DIR = (1 << 29), /* Do not read log directory */ 383 384 384 385 /* DMA mask for user DMA control: User visible values; DO NOT 385 386 renumber */
+7
include/linux/netfs.h
··· 244 244 int (*prepare_write)(struct netfs_cache_resources *cres, 245 245 loff_t *_start, size_t *_len, loff_t i_size, 246 246 bool no_space_allocated_yet); 247 + 248 + /* Query the occupancy of the cache in a region, returning where the 249 + * next chunk of data starts and how long it is. 250 + */ 251 + int (*query_occupancy)(struct netfs_cache_resources *cres, 252 + loff_t start, size_t len, size_t granularity, 253 + loff_t *_data_start, size_t *_data_len); 247 254 }; 248 255 249 256 struct readahead_control;
-8
include/linux/nfs.h
··· 36 36 memcpy(target->data, source->data, source->size); 37 37 } 38 38 39 - 40 - /* 41 - * This is really a general kernel constant, but since nothing like 42 - * this is defined in the kernel headers, I have to do it here. 43 - */ 44 - #define NFS_OFFSET_MAX ((__s64)((~(__u64)0) >> 1)) 45 - 46 - 47 39 enum nfs3_stable_how { 48 40 NFS_UNSTABLE = 0, 49 41 NFS_DATA_SYNC = 1,
+1
include/linux/nfs_fs.h
··· 107 107 __u64 dup_cookie; 108 108 pgoff_t page_index; 109 109 signed char duped; 110 + bool eof; 110 111 }; 111 112 112 113 /*
+19
include/linux/page_table_check.h
··· 26 26 pmd_t *pmdp, pmd_t pmd); 27 27 void __page_table_check_pud_set(struct mm_struct *mm, unsigned long addr, 28 28 pud_t *pudp, pud_t pud); 29 + void __page_table_check_pte_clear_range(struct mm_struct *mm, 30 + unsigned long addr, 31 + pmd_t pmd); 29 32 30 33 static inline void page_table_check_alloc(struct page *page, unsigned int order) 31 34 { ··· 103 100 __page_table_check_pud_set(mm, addr, pudp, pud); 104 101 } 105 102 103 + static inline void page_table_check_pte_clear_range(struct mm_struct *mm, 104 + unsigned long addr, 105 + pmd_t pmd) 106 + { 107 + if (static_branch_likely(&page_table_check_disabled)) 108 + return; 109 + 110 + __page_table_check_pte_clear_range(mm, addr, pmd); 111 + } 112 + 106 113 #else 107 114 108 115 static inline void page_table_check_alloc(struct page *page, unsigned int order) ··· 153 140 static inline void page_table_check_pud_set(struct mm_struct *mm, 154 141 unsigned long addr, pud_t *pudp, 155 142 pud_t pud) 143 + { 144 + } 145 + 146 + static inline void page_table_check_pte_clear_range(struct mm_struct *mm, 147 + unsigned long addr, 148 + pmd_t pmd) 156 149 { 157 150 } 158 151
+1
include/linux/pgtable.h
··· 62 62 { 63 63 return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); 64 64 } 65 + #define pte_index pte_index 65 66 66 67 #ifndef pmd_index 67 68 static inline unsigned long pmd_index(unsigned long address)
+13 -1
include/net/dst_metadata.h
··· 123 123 124 124 memcpy(&new_md->u.tun_info, &md_dst->u.tun_info, 125 125 sizeof(struct ip_tunnel_info) + md_size); 126 + #ifdef CONFIG_DST_CACHE 127 + /* Unclone the dst cache if there is one */ 128 + if (new_md->u.tun_info.dst_cache.cache) { 129 + int ret; 130 + 131 + ret = dst_cache_init(&new_md->u.tun_info.dst_cache, GFP_ATOMIC); 132 + if (ret) { 133 + metadata_dst_free(new_md); 134 + return ERR_PTR(ret); 135 + } 136 + } 137 + #endif 138 + 126 139 skb_dst_drop(skb); 127 - dst_hold(&new_md->dst); 128 140 skb_dst_set(skb, &new_md->dst); 129 141 return new_md; 130 142 }
+15
include/sound/pcm.h
··· 617 617 void snd_pcm_stream_lock_irq(struct snd_pcm_substream *substream); 618 618 void snd_pcm_stream_unlock_irq(struct snd_pcm_substream *substream); 619 619 unsigned long _snd_pcm_stream_lock_irqsave(struct snd_pcm_substream *substream); 620 + unsigned long _snd_pcm_stream_lock_irqsave_nested(struct snd_pcm_substream *substream); 620 621 621 622 /** 622 623 * snd_pcm_stream_lock_irqsave - Lock the PCM stream ··· 635 634 } while (0) 636 635 void snd_pcm_stream_unlock_irqrestore(struct snd_pcm_substream *substream, 637 636 unsigned long flags); 637 + 638 + /** 639 + * snd_pcm_stream_lock_irqsave_nested - Single-nested PCM stream locking 640 + * @substream: PCM substream 641 + * @flags: irq flags 642 + * 643 + * This locks the PCM stream like snd_pcm_stream_lock_irqsave() but with 644 + * the single-depth lockdep subclass. 645 + */ 646 + #define snd_pcm_stream_lock_irqsave_nested(substream, flags) \ 647 + do { \ 648 + typecheck(unsigned long, flags); \ 649 + flags = _snd_pcm_stream_lock_irqsave_nested(substream); \ 650 + } while (0) 638 651 639 652 /** 640 653 * snd_pcm_group_for_each_entry - iterate over the linked substreams
+3 -3
include/uapi/linux/kvm.h
··· 1624 1624 #define KVM_S390_NORMAL_RESET _IO(KVMIO, 0xc3) 1625 1625 #define KVM_S390_CLEAR_RESET _IO(KVMIO, 0xc4) 1626 1626 1627 - /* Available with KVM_CAP_XSAVE2 */ 1628 - #define KVM_GET_XSAVE2 _IOR(KVMIO, 0xcf, struct kvm_xsave) 1629 - 1630 1627 struct kvm_s390_pv_sec_parm { 1631 1628 __u64 origin; 1632 1629 __u64 length; ··· 2044 2047 }; 2045 2048 2046 2049 #define KVM_GET_STATS_FD _IO(KVMIO, 0xce) 2050 + 2051 + /* Available with KVM_CAP_XSAVE2 */ 2052 + #define KVM_GET_XSAVE2 _IOR(KVMIO, 0xcf, struct kvm_xsave) 2047 2053 2048 2054 #endif /* __LINUX_KVM_H */
+1 -1
include/uapi/linux/netfilter/nf_conntrack_common.h
··· 106 106 IPS_NAT_CLASH = IPS_UNTRACKED, 107 107 #endif 108 108 109 - /* Conntrack got a helper explicitly attached via CT target. */ 109 + /* Conntrack got a helper explicitly attached (ruleset, ctnetlink). */ 110 110 IPS_HELPER_BIT = 13, 111 111 IPS_HELPER = (1 << IPS_HELPER_BIT), 112 112
+2
include/uapi/linux/perf_event.h
··· 465 465 /* 466 466 * User provided data if sigtrap=1, passed back to user via 467 467 * siginfo_t::si_perf_data, e.g. to permit user to identify the event. 468 + * Note, siginfo_t::si_perf_data is long-sized, and sig_data will be 469 + * truncated accordingly on 32 bit architectures. 468 470 */ 469 471 __u64 sig_data; 470 472 };
+3 -1
include/uapi/sound/asound.h
··· 56 56 * * 57 57 ****************************************************************************/ 58 58 59 + #define AES_IEC958_STATUS_SIZE 24 60 + 59 61 struct snd_aes_iec958 { 60 - unsigned char status[24]; /* AES/IEC958 channel status bits */ 62 + unsigned char status[AES_IEC958_STATUS_SIZE]; /* AES/IEC958 channel status bits */ 61 63 unsigned char subcode[147]; /* AES/IEC958 subcode bits */ 62 64 unsigned char pad; /* nothing */ 63 65 unsigned char dig_subframe[4]; /* AES/IEC958 subframe bits */
+7 -1
include/uapi/xen/gntdev.h
··· 47 47 /* 48 48 * Inserts the grant references into the mapping table of an instance 49 49 * of gntdev. N.B. This does not perform the mapping, which is deferred 50 - * until mmap() is called with @index as the offset. 50 + * until mmap() is called with @index as the offset. @index should be 51 + * considered opaque to userspace, with one exception: if no grant 52 + * references have ever been inserted into the mapping table of this 53 + * instance, @index will be set to 0. This is necessary to use gntdev 54 + * with userspace APIs that expect a file descriptor that can be 55 + * mmap()'d at offset 0, such as Wayland. If @count is set to 0, this 56 + * ioctl will fail. 51 57 */ 52 58 #define IOCTL_GNTDEV_MAP_GRANT_REF \ 53 59 _IOC(_IOC_NONE, 'G', 0, sizeof(struct ioctl_gntdev_map_grant_ref))
-2
include/xen/xenbus_dev.h
··· 1 1 /****************************************************************************** 2 - * evtchn.h 3 - * 4 2 * Interface to /dev/xen/xenbus_backend. 5 3 * 6 4 * Copyright (c) 2011 Bastian Blank <waldi@debian.org>
+2 -2
ipc/sem.c
··· 1964 1964 */ 1965 1965 un = lookup_undo(ulp, semid); 1966 1966 if (un) { 1967 + spin_unlock(&ulp->lock); 1967 1968 kvfree(new); 1968 1969 goto success; 1969 1970 } ··· 1977 1976 ipc_assert_locked_object(&sma->sem_perm); 1978 1977 list_add(&new->list_id, &sma->list_id); 1979 1978 un = new; 1980 - 1981 - success: 1982 1979 spin_unlock(&ulp->lock); 1980 + success: 1983 1981 sem_unlock(sma, -1); 1984 1982 out: 1985 1983 return un;
+1 -1
kernel/auditsc.c
··· 185 185 case AUDITSC_EXECVE: 186 186 return mask & AUDIT_PERM_EXEC; 187 187 case AUDITSC_OPENAT2: 188 - return mask & ACC_MODE((u32)((struct open_how *)ctx->argv[2])->flags); 188 + return mask & ACC_MODE((u32)ctx->openat2.flags); 189 189 default: 190 190 return 0; 191 191 }
+16
kernel/events/core.c
··· 3238 3238 return err; 3239 3239 } 3240 3240 3241 + /* 3242 + * Copy event-type-independent attributes that may be modified. 3243 + */ 3244 + static void perf_event_modify_copy_attr(struct perf_event_attr *to, 3245 + const struct perf_event_attr *from) 3246 + { 3247 + to->sig_data = from->sig_data; 3248 + } 3249 + 3241 3250 static int perf_event_modify_attr(struct perf_event *event, 3242 3251 struct perf_event_attr *attr) 3243 3252 { ··· 3269 3260 WARN_ON_ONCE(event->ctx->parent_ctx); 3270 3261 3271 3262 mutex_lock(&event->child_mutex); 3263 + /* 3264 + * Event-type-independent attributes must be copied before event-type 3265 + * modification, which will validate that final attributes match the 3266 + * source attributes after all relevant attributes have been copied. 3267 + */ 3268 + perf_event_modify_copy_attr(&event->attr, attr); 3272 3269 err = func(event, attr); 3273 3270 if (err) 3274 3271 goto out; 3275 3272 list_for_each_entry(child, &event->child_list, child_list) { 3273 + perf_event_modify_copy_attr(&child->attr, attr); 3276 3274 err = func(child, attr); 3277 3275 if (err) 3278 3276 goto out;
+2 -2
lib/crypto/blake2s.c
··· 18 18 19 19 void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen) 20 20 { 21 - __blake2s_update(state, in, inlen, blake2s_compress); 21 + __blake2s_update(state, in, inlen, false); 22 22 } 23 23 EXPORT_SYMBOL(blake2s_update); 24 24 25 25 void blake2s_final(struct blake2s_state *state, u8 *out) 26 26 { 27 27 WARN_ON(IS_ENABLED(DEBUG) && !out); 28 - __blake2s_final(state, out, blake2s_compress); 28 + __blake2s_final(state, out, false); 29 29 memzero_explicit(state, sizeof(*state)); 30 30 } 31 31 EXPORT_SYMBOL(blake2s_final);
+2
mm/debug_vm_pgtable.c
··· 171 171 ptep_test_and_clear_young(args->vma, args->vaddr, args->ptep); 172 172 pte = ptep_get(args->ptep); 173 173 WARN_ON(pte_young(pte)); 174 + 175 + ptep_get_and_clear_full(args->mm, args->vaddr, args->ptep, 1); 174 176 } 175 177 176 178 static void __init pte_savedwrite_tests(struct pgtable_debug_args *args)
+21 -16
mm/khugepaged.c
··· 16 16 #include <linux/hashtable.h> 17 17 #include <linux/userfaultfd_k.h> 18 18 #include <linux/page_idle.h> 19 + #include <linux/page_table_check.h> 19 20 #include <linux/swapops.h> 20 21 #include <linux/shmem_fs.h> 21 22 ··· 1417 1416 return 0; 1418 1417 } 1419 1418 1419 + static void collapse_and_free_pmd(struct mm_struct *mm, struct vm_area_struct *vma, 1420 + unsigned long addr, pmd_t *pmdp) 1421 + { 1422 + spinlock_t *ptl; 1423 + pmd_t pmd; 1424 + 1425 + mmap_assert_write_locked(mm); 1426 + ptl = pmd_lock(vma->vm_mm, pmdp); 1427 + pmd = pmdp_collapse_flush(vma, addr, pmdp); 1428 + spin_unlock(ptl); 1429 + mm_dec_nr_ptes(mm); 1430 + page_table_check_pte_clear_range(mm, addr, pmd); 1431 + pte_free(mm, pmd_pgtable(pmd)); 1432 + } 1433 + 1420 1434 /** 1421 1435 * collapse_pte_mapped_thp - Try to collapse a pte-mapped THP for mm at 1422 1436 * address haddr. ··· 1449 1433 struct vm_area_struct *vma = find_vma(mm, haddr); 1450 1434 struct page *hpage; 1451 1435 pte_t *start_pte, *pte; 1452 - pmd_t *pmd, _pmd; 1436 + pmd_t *pmd; 1453 1437 spinlock_t *ptl; 1454 1438 int count = 0; 1455 1439 int i; ··· 1525 1509 } 1526 1510 1527 1511 /* step 4: collapse pmd */ 1528 - ptl = pmd_lock(vma->vm_mm, pmd); 1529 - _pmd = pmdp_collapse_flush(vma, haddr, pmd); 1530 - spin_unlock(ptl); 1531 - mm_dec_nr_ptes(mm); 1532 - pte_free(mm, pmd_pgtable(_pmd)); 1533 - 1512 + collapse_and_free_pmd(mm, vma, haddr, pmd); 1534 1513 drop_hpage: 1535 1514 unlock_page(hpage); 1536 1515 put_page(hpage); ··· 1563 1552 struct vm_area_struct *vma; 1564 1553 struct mm_struct *mm; 1565 1554 unsigned long addr; 1566 - pmd_t *pmd, _pmd; 1555 + pmd_t *pmd; 1567 1556 1568 1557 i_mmap_lock_write(mapping); 1569 1558 vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { ··· 1602 1591 * reverse order. Trylock is a way to avoid deadlock. 1603 1592 */ 1604 1593 if (mmap_write_trylock(mm)) { 1605 - if (!khugepaged_test_exit(mm)) { 1606 - spinlock_t *ptl = pmd_lock(mm, pmd); 1607 - /* assume page table is clear */ 1608 - _pmd = pmdp_collapse_flush(vma, addr, pmd); 1609 - spin_unlock(ptl); 1610 - mm_dec_nr_ptes(mm); 1611 - pte_free(mm, pmd_pgtable(_pmd)); 1612 - } 1594 + if (!khugepaged_test_exit(mm)) 1595 + collapse_and_free_pmd(mm, vma, addr, pmd); 1613 1596 mmap_write_unlock(mm); 1614 1597 } else { 1615 1598 /* Try again later */
+7 -6
mm/kmemleak.c
··· 1410 1410 { 1411 1411 unsigned long flags; 1412 1412 struct kmemleak_object *object; 1413 - int i; 1413 + struct zone *zone; 1414 + int __maybe_unused i; 1414 1415 int new_leaks = 0; 1415 1416 1416 1417 jiffies_last_scan = jiffies; ··· 1451 1450 * Struct page scanning for each node. 1452 1451 */ 1453 1452 get_online_mems(); 1454 - for_each_online_node(i) { 1455 - unsigned long start_pfn = node_start_pfn(i); 1456 - unsigned long end_pfn = node_end_pfn(i); 1453 + for_each_populated_zone(zone) { 1454 + unsigned long start_pfn = zone->zone_start_pfn; 1455 + unsigned long end_pfn = zone_end_pfn(zone); 1457 1456 unsigned long pfn; 1458 1457 1459 1458 for (pfn = start_pfn; pfn < end_pfn; pfn++) { ··· 1462 1461 if (!page) 1463 1462 continue; 1464 1463 1465 - /* only scan pages belonging to this node */ 1466 - if (page_to_nid(page) != i) 1464 + /* only scan pages belonging to this zone */ 1465 + if (page_zone(page) != zone) 1467 1466 continue; 1468 1467 /* only scan if page is in use */ 1469 1468 if (page_count(page) == 0)
+1 -1
mm/page_isolation.c
··· 115 115 * onlining - just onlined memory won't immediately be considered for 116 116 * allocation. 117 117 */ 118 - if (!isolated_page && PageBuddy(page)) { 118 + if (!isolated_page) { 119 119 nr_pages = move_freepages_block(zone, page, migratetype, NULL); 120 120 __mod_zone_freepage_state(zone, nr_pages, migratetype); 121 121 }
+27 -28
mm/page_table_check.c
··· 86 86 { 87 87 struct page_ext *page_ext; 88 88 struct page *page; 89 + unsigned long i; 89 90 bool anon; 90 - int i; 91 91 92 92 if (!pfn_valid(pfn)) 93 93 return; ··· 121 121 { 122 122 struct page_ext *page_ext; 123 123 struct page *page; 124 + unsigned long i; 124 125 bool anon; 125 - int i; 126 126 127 127 if (!pfn_valid(pfn)) 128 128 return; ··· 152 152 void __page_table_check_zero(struct page *page, unsigned int order) 153 153 { 154 154 struct page_ext *page_ext = lookup_page_ext(page); 155 - int i; 155 + unsigned long i; 156 156 157 157 BUG_ON(!page_ext); 158 - for (i = 0; i < (1 << order); i++) { 158 + for (i = 0; i < (1ul << order); i++) { 159 159 struct page_table_check *ptc = get_page_table_check(page_ext); 160 160 161 161 BUG_ON(atomic_read(&ptc->anon_map_count)); ··· 206 206 void __page_table_check_pte_set(struct mm_struct *mm, unsigned long addr, 207 207 pte_t *ptep, pte_t pte) 208 208 { 209 - pte_t old_pte; 210 - 211 209 if (&init_mm == mm) 212 210 return; 213 211 214 - old_pte = *ptep; 215 - if (pte_user_accessible_page(old_pte)) { 216 - page_table_check_clear(mm, addr, pte_pfn(old_pte), 217 - PAGE_SIZE >> PAGE_SHIFT); 218 - } 219 - 212 + __page_table_check_pte_clear(mm, addr, *ptep); 220 213 if (pte_user_accessible_page(pte)) { 221 214 page_table_check_set(mm, addr, pte_pfn(pte), 222 215 PAGE_SIZE >> PAGE_SHIFT, ··· 221 228 void __page_table_check_pmd_set(struct mm_struct *mm, unsigned long addr, 222 229 pmd_t *pmdp, pmd_t pmd) 223 230 { 224 - pmd_t old_pmd; 225 - 226 231 if (&init_mm == mm) 227 232 return; 228 233 229 - old_pmd = *pmdp; 230 - if (pmd_user_accessible_page(old_pmd)) { 231 - page_table_check_clear(mm, addr, pmd_pfn(old_pmd), 232 - PMD_PAGE_SIZE >> PAGE_SHIFT); 233 - } 234 - 234 + __page_table_check_pmd_clear(mm, addr, *pmdp); 235 235 if (pmd_user_accessible_page(pmd)) { 236 236 page_table_check_set(mm, addr, pmd_pfn(pmd), 237 237 PMD_PAGE_SIZE >> PAGE_SHIFT, ··· 236 250 void __page_table_check_pud_set(struct mm_struct *mm, unsigned long addr, 237 251 pud_t *pudp, pud_t pud) 238 252 { 239 - pud_t old_pud; 240 - 241 253 if (&init_mm == mm) 242 254 return; 243 255 244 - old_pud = *pudp; 245 - if (pud_user_accessible_page(old_pud)) { 246 - page_table_check_clear(mm, addr, pud_pfn(old_pud), 247 - PUD_PAGE_SIZE >> PAGE_SHIFT); 248 - } 249 - 256 + __page_table_check_pud_clear(mm, addr, *pudp); 250 257 if (pud_user_accessible_page(pud)) { 251 258 page_table_check_set(mm, addr, pud_pfn(pud), 252 259 PUD_PAGE_SIZE >> PAGE_SHIFT, ··· 247 268 } 248 269 } 249 270 EXPORT_SYMBOL(__page_table_check_pud_set); 271 + 272 + void __page_table_check_pte_clear_range(struct mm_struct *mm, 273 + unsigned long addr, 274 + pmd_t pmd) 275 + { 276 + if (&init_mm == mm) 277 + return; 278 + 279 + if (!pmd_bad(pmd) && !pmd_leaf(pmd)) { 280 + pte_t *ptep = pte_offset_map(&pmd, addr); 281 + unsigned long i; 282 + 283 + pte_unmap(ptep); 284 + for (i = 0; i < PTRS_PER_PTE; i++) { 285 + __page_table_check_pte_clear(mm, addr, *ptep); 286 + addr += PAGE_SIZE; 287 + ptep++; 288 + } 289 + } 290 + }
+1 -1
net/8021q/vlan.h
··· 129 129 u32 skb_prio, u16 vlan_prio); 130 130 int vlan_dev_set_egress_priority(const struct net_device *dev, 131 131 u32 skb_prio, u16 vlan_prio); 132 + void vlan_dev_free_egress_priority(const struct net_device *dev); 132 133 int vlan_dev_change_flags(const struct net_device *dev, u32 flag, u32 mask); 133 134 void vlan_dev_get_realdev_name(const struct net_device *dev, char *result, 134 135 size_t size); ··· 140 139 void vlan_setup(struct net_device *dev); 141 140 int register_vlan_dev(struct net_device *dev, struct netlink_ext_ack *extack); 142 141 void unregister_vlan_dev(struct net_device *dev, struct list_head *head); 143 - void vlan_dev_uninit(struct net_device *dev); 144 142 bool vlan_dev_inherit_address(struct net_device *dev, 145 143 struct net_device *real_dev); 146 144
+11 -4
net/8021q/vlan_dev.c
··· 622 622 } 623 623 624 624 /* Note: this function might be called multiple times for the same device. */ 625 - void vlan_dev_uninit(struct net_device *dev) 625 + void vlan_dev_free_egress_priority(const struct net_device *dev) 626 626 { 627 627 struct vlan_priority_tci_mapping *pm; 628 628 struct vlan_dev_priv *vlan = vlan_dev_priv(dev); ··· 634 634 kfree(pm); 635 635 } 636 636 } 637 + } 638 + 639 + static void vlan_dev_uninit(struct net_device *dev) 640 + { 641 + struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 642 + 643 + vlan_dev_free_egress_priority(dev); 644 + 645 + /* Get rid of the vlan's reference to real_dev */ 646 + dev_put_track(vlan->real_dev, &vlan->dev_tracker); 637 647 } 638 648 639 649 static netdev_features_t vlan_dev_fix_features(struct net_device *dev, ··· 856 846 857 847 free_percpu(vlan->vlan_pcpu_stats); 858 848 vlan->vlan_pcpu_stats = NULL; 859 - 860 - /* Get rid of the vlan's reference to real_dev */ 861 - dev_put_track(vlan->real_dev, &vlan->dev_tracker); 862 849 } 863 850 864 851 void vlan_setup(struct net_device *dev)
+4 -3
net/8021q/vlan_netlink.c
··· 183 183 return -EINVAL; 184 184 185 185 err = vlan_changelink(dev, tb, data, extack); 186 - if (!err) 187 - err = register_vlan_dev(dev, extack); 188 186 if (err) 189 - vlan_dev_uninit(dev); 187 + return err; 188 + err = register_vlan_dev(dev, extack); 189 + if (err) 190 + vlan_dev_free_egress_priority(dev); 190 191 return err; 191 192 } 192 193
+5 -2
net/ax25/af_ax25.c
··· 91 91 spin_unlock_bh(&ax25_list_lock); 92 92 lock_sock(sk); 93 93 s->ax25_dev = NULL; 94 + dev_put_track(ax25_dev->dev, &ax25_dev->dev_tracker); 94 95 ax25_dev_put(ax25_dev); 95 - release_sock(sk); 96 96 ax25_disconnect(s, ENETUNREACH); 97 + release_sock(sk); 97 98 spin_lock_bh(&ax25_list_lock); 98 99 sock_put(sk); 99 100 /* The entry could have been deleted from the ··· 1117 1116 } 1118 1117 } 1119 1118 1120 - if (ax25_dev != NULL) 1119 + if (ax25_dev) { 1121 1120 ax25_fillin_cb(ax25, ax25_dev); 1121 + dev_hold_track(ax25_dev->dev, &ax25_dev->dev_tracker, GFP_ATOMIC); 1122 + } 1122 1123 1123 1124 done: 1124 1125 ax25_cb_add(ax25);
+22 -7
net/can/isotp.c
··· 56 56 #include <linux/module.h> 57 57 #include <linux/init.h> 58 58 #include <linux/interrupt.h> 59 + #include <linux/spinlock.h> 59 60 #include <linux/hrtimer.h> 60 61 #include <linux/wait.h> 61 62 #include <linux/uio.h> ··· 146 145 struct tpcon rx, tx; 147 146 struct list_head notifier; 148 147 wait_queue_head_t wait; 148 + spinlock_t rx_lock; /* protect single thread state machine */ 149 149 }; 150 150 151 151 static LIST_HEAD(isotp_notifier_list); ··· 617 615 618 616 n_pci_type = cf->data[ae] & 0xF0; 619 617 618 + /* Make sure the state changes and data structures stay consistent at 619 + * CAN frame reception time. This locking is not needed in real world 620 + * use cases but the inconsistency can be triggered with syzkaller. 621 + */ 622 + spin_lock(&so->rx_lock); 623 + 620 624 if (so->opt.flags & CAN_ISOTP_HALF_DUPLEX) { 621 625 /* check rx/tx path half duplex expectations */ 622 626 if ((so->tx.state != ISOTP_IDLE && n_pci_type != N_PCI_FC) || 623 627 (so->rx.state != ISOTP_IDLE && n_pci_type == N_PCI_FC)) 624 - return; 628 + goto out_unlock; 625 629 } 626 630 627 631 switch (n_pci_type) { ··· 676 668 isotp_rcv_cf(sk, cf, ae, skb); 677 669 break; 678 670 } 671 + 672 + out_unlock: 673 + spin_unlock(&so->rx_lock); 679 674 } 680 675 681 676 static void isotp_fill_dataframe(struct canfd_frame *cf, struct isotp_sock *so, ··· 887 876 888 877 if (!size || size > MAX_MSG_LENGTH) { 889 878 err = -EINVAL; 890 - goto err_out; 879 + goto err_out_drop; 891 880 } 892 881 893 882 /* take care of a potential SF_DL ESC offset for TX_DL > 8 */ ··· 897 886 if ((so->opt.flags & CAN_ISOTP_SF_BROADCAST) && 898 887 (size > so->tx.ll_dl - SF_PCI_SZ4 - ae - off)) { 899 888 err = -EINVAL; 900 - goto err_out; 889 + goto err_out_drop; 901 890 } 902 891 903 892 err = memcpy_from_msg(so->tx.buf, msg, size); 904 893 if (err < 0) 905 - goto err_out; 894 + goto err_out_drop; 906 895 907 896 dev = dev_get_by_index(sock_net(sk), so->ifindex); 908 897 if (!dev) { 909 898 err = -ENXIO; 910 - goto err_out; 899 + goto err_out_drop; 911 900 } 912 901 913 902 skb = sock_alloc_send_skb(sk, so->ll.mtu + sizeof(struct can_skb_priv), 914 903 msg->msg_flags & MSG_DONTWAIT, &err); 915 904 if (!skb) { 916 905 dev_put(dev); 917 - goto err_out; 906 + goto err_out_drop; 918 907 } 919 908 920 909 can_skb_reserve(skb); ··· 976 965 if (err) { 977 966 pr_notice_once("can-isotp: %s: can_send_ret %pe\n", 978 967 __func__, ERR_PTR(err)); 979 - goto err_out; 968 + goto err_out_drop; 980 969 } 981 970 982 971 if (wait_tx_done) { ··· 989 978 990 979 return size; 991 980 981 + err_out_drop: 982 + /* drop this PDU and unlock a potential wait queue */ 983 + old_state = ISOTP_IDLE; 992 984 err_out: 993 985 so->tx.state = old_state; 994 986 if (so->tx.state == ISOTP_IDLE) ··· 1458 1444 so->txtimer.function = isotp_tx_timer_handler; 1459 1445 1460 1446 init_waitqueue_head(&so->wait); 1447 + spin_lock_init(&so->rx_lock); 1461 1448 1462 1449 spin_lock(&isotp_notifier_lock); 1463 1450 list_add_tail(&so->notifier, &isotp_notifier_list);
+7
net/ceph/ceph_common.c
··· 246 246 Opt_cephx_sign_messages, 247 247 Opt_tcp_nodelay, 248 248 Opt_abort_on_full, 249 + Opt_rxbounce, 249 250 }; 250 251 251 252 enum { ··· 296 295 fsparam_u32 ("osdkeepalive", Opt_osdkeepalivetimeout), 297 296 fsparam_enum ("read_from_replica", Opt_read_from_replica, 298 297 ceph_param_read_from_replica), 298 + fsparam_flag ("rxbounce", Opt_rxbounce), 299 299 fsparam_enum ("ms_mode", Opt_ms_mode, 300 300 ceph_param_ms_mode), 301 301 fsparam_string ("secret", Opt_secret), ··· 586 584 case Opt_abort_on_full: 587 585 opt->flags |= CEPH_OPT_ABORT_ON_FULL; 588 586 break; 587 + case Opt_rxbounce: 588 + opt->flags |= CEPH_OPT_RXBOUNCE; 589 + break; 589 590 590 591 default: 591 592 BUG(); ··· 665 660 seq_puts(m, "notcp_nodelay,"); 666 661 if (show_all && (opt->flags & CEPH_OPT_ABORT_ON_FULL)) 667 662 seq_puts(m, "abort_on_full,"); 663 + if (opt->flags & CEPH_OPT_RXBOUNCE) 664 + seq_puts(m, "rxbounce,"); 668 665 669 666 if (opt->mount_timeout != CEPH_MOUNT_TIMEOUT_DEFAULT) 670 667 seq_printf(m, "mount_timeout=%d,",
+4
net/ceph/messenger.c
··· 515 515 ceph_msg_put(con->out_msg); 516 516 con->out_msg = NULL; 517 517 } 518 + if (con->bounce_page) { 519 + __free_page(con->bounce_page); 520 + con->bounce_page = NULL; 521 + } 518 522 519 523 if (ceph_msgr2(from_msgr(con->msgr))) 520 524 ceph_con_v2_reset_protocol(con);
+48 -6
net/ceph/messenger_v1.c
··· 992 992 993 993 static int read_partial_msg_data(struct ceph_connection *con) 994 994 { 995 - struct ceph_msg *msg = con->in_msg; 996 - struct ceph_msg_data_cursor *cursor = &msg->cursor; 995 + struct ceph_msg_data_cursor *cursor = &con->in_msg->cursor; 997 996 bool do_datacrc = !ceph_test_opt(from_msgr(con->msgr), NOCRC); 998 997 struct page *page; 999 998 size_t page_offset; 1000 999 size_t length; 1001 1000 u32 crc = 0; 1002 1001 int ret; 1003 - 1004 - if (!msg->num_data_items) 1005 - return -EIO; 1006 1002 1007 1003 if (do_datacrc) 1008 1004 crc = con->in_data_crc; ··· 1023 1027 } 1024 1028 if (do_datacrc) 1025 1029 con->in_data_crc = crc; 1030 + 1031 + return 1; /* must return > 0 to indicate success */ 1032 + } 1033 + 1034 + static int read_partial_msg_data_bounce(struct ceph_connection *con) 1035 + { 1036 + struct ceph_msg_data_cursor *cursor = &con->in_msg->cursor; 1037 + struct page *page; 1038 + size_t off, len; 1039 + u32 crc; 1040 + int ret; 1041 + 1042 + if (unlikely(!con->bounce_page)) { 1043 + con->bounce_page = alloc_page(GFP_NOIO); 1044 + if (!con->bounce_page) { 1045 + pr_err("failed to allocate bounce page\n"); 1046 + return -ENOMEM; 1047 + } 1048 + } 1049 + 1050 + crc = con->in_data_crc; 1051 + while (cursor->total_resid) { 1052 + if (!cursor->resid) { 1053 + ceph_msg_data_advance(cursor, 0); 1054 + continue; 1055 + } 1056 + 1057 + page = ceph_msg_data_next(cursor, &off, &len, NULL); 1058 + ret = ceph_tcp_recvpage(con->sock, con->bounce_page, 0, len); 1059 + if (ret <= 0) { 1060 + con->in_data_crc = crc; 1061 + return ret; 1062 + } 1063 + 1064 + crc = crc32c(crc, page_address(con->bounce_page), ret); 1065 + memcpy_to_page(page, off, page_address(con->bounce_page), ret); 1066 + 1067 + ceph_msg_data_advance(cursor, ret); 1068 + } 1069 + con->in_data_crc = crc; 1026 1070 1027 1071 return 1; /* must return > 0 to indicate success */ 1028 1072 } ··· 1177 1141 1178 1142 /* (page) data */ 1179 1143 if (data_len) { 1180 - ret = read_partial_msg_data(con); 1144 + if (!m->num_data_items) 1145 + return -EIO; 1146 + 1147 + if (ceph_test_opt(from_msgr(con->msgr), RXBOUNCE)) 1148 + ret = read_partial_msg_data_bounce(con); 1149 + else 1150 + ret = read_partial_msg_data(con); 1181 1151 if (ret <= 0) 1182 1152 return ret; 1183 1153 }
+186 -64
net/ceph/messenger_v2.c
··· 57 57 #define IN_S_HANDLE_CONTROL_REMAINDER 3 58 58 #define IN_S_PREPARE_READ_DATA 4 59 59 #define IN_S_PREPARE_READ_DATA_CONT 5 60 - #define IN_S_HANDLE_EPILOGUE 6 61 - #define IN_S_FINISH_SKIP 7 60 + #define IN_S_PREPARE_READ_ENC_PAGE 6 61 + #define IN_S_HANDLE_EPILOGUE 7 62 + #define IN_S_FINISH_SKIP 8 62 63 63 64 #define OUT_S_QUEUE_DATA 1 64 65 #define OUT_S_QUEUE_DATA_CONT 2 ··· 1033 1032 padded_len(rem_len) + CEPH_GCM_TAG_LEN); 1034 1033 } 1035 1034 1036 - static int decrypt_message(struct ceph_connection *con) 1035 + static int decrypt_tail(struct ceph_connection *con) 1037 1036 { 1037 + struct sg_table enc_sgt = {}; 1038 1038 struct sg_table sgt = {}; 1039 + int tail_len; 1039 1040 int ret; 1041 + 1042 + tail_len = tail_onwire_len(con->in_msg, true); 1043 + ret = sg_alloc_table_from_pages(&enc_sgt, con->v2.in_enc_pages, 1044 + con->v2.in_enc_page_cnt, 0, tail_len, 1045 + GFP_NOIO); 1046 + if (ret) 1047 + goto out; 1040 1048 1041 1049 ret = setup_message_sgs(&sgt, con->in_msg, FRONT_PAD(con->v2.in_buf), 1042 1050 MIDDLE_PAD(con->v2.in_buf), DATA_PAD(con->v2.in_buf), ··· 1053 1043 if (ret) 1054 1044 goto out; 1055 1045 1056 - ret = gcm_crypt(con, false, sgt.sgl, sgt.sgl, 1057 - tail_onwire_len(con->in_msg, true)); 1046 + dout("%s con %p msg %p enc_page_cnt %d sg_cnt %d\n", __func__, con, 1047 + con->in_msg, con->v2.in_enc_page_cnt, sgt.orig_nents); 1048 + ret = gcm_crypt(con, false, enc_sgt.sgl, sgt.sgl, tail_len); 1049 + if (ret) 1050 + goto out; 1051 + 1052 + WARN_ON(!con->v2.in_enc_page_cnt); 1053 + ceph_release_page_vector(con->v2.in_enc_pages, 1054 + con->v2.in_enc_page_cnt); 1055 + con->v2.in_enc_pages = NULL; 1056 + con->v2.in_enc_page_cnt = 0; 1058 1057 1059 1058 out: 1060 1059 sg_free_table(&sgt); 1060 + sg_free_table(&enc_sgt); 1061 1061 return ret; 1062 1062 } 1063 1063 ··· 1753 1733 return 0; 1754 1734 } 1755 1735 1756 - static void prepare_read_data(struct ceph_connection *con) 1736 + static int prepare_read_data(struct ceph_connection *con) 1757 1737 { 1758 1738 struct bio_vec bv; 1759 1739 1760 - if (!con_secure(con)) 1761 - con->in_data_crc = -1; 1740 + con->in_data_crc = -1; 1762 1741 ceph_msg_data_cursor_init(&con->v2.in_cursor, con->in_msg, 1763 1742 data_len(con->in_msg)); 1764 1743 1765 1744 get_bvec_at(&con->v2.in_cursor, &bv); 1766 - set_in_bvec(con, &bv); 1745 + if (ceph_test_opt(from_msgr(con->msgr), RXBOUNCE)) { 1746 + if (unlikely(!con->bounce_page)) { 1747 + con->bounce_page = alloc_page(GFP_NOIO); 1748 + if (!con->bounce_page) { 1749 + pr_err("failed to allocate bounce page\n"); 1750 + return -ENOMEM; 1751 + } 1752 + } 1753 + 1754 + bv.bv_page = con->bounce_page; 1755 + bv.bv_offset = 0; 1756 + set_in_bvec(con, &bv); 1757 + } else { 1758 + set_in_bvec(con, &bv); 1759 + } 1767 1760 con->v2.in_state = IN_S_PREPARE_READ_DATA_CONT; 1761 + return 0; 1768 1762 } 1769 1763 1770 1764 static void prepare_read_data_cont(struct ceph_connection *con) 1771 1765 { 1772 1766 struct bio_vec bv; 1773 1767 1774 - if (!con_secure(con)) 1768 + if (ceph_test_opt(from_msgr(con->msgr), RXBOUNCE)) { 1769 + con->in_data_crc = crc32c(con->in_data_crc, 1770 + page_address(con->bounce_page), 1771 + con->v2.in_bvec.bv_len); 1772 + 1773 + get_bvec_at(&con->v2.in_cursor, &bv); 1774 + memcpy_to_page(bv.bv_page, bv.bv_offset, 1775 + page_address(con->bounce_page), 1776 + con->v2.in_bvec.bv_len); 1777 + } else { 1775 1778 con->in_data_crc = ceph_crc32c_page(con->in_data_crc, 1776 1779 con->v2.in_bvec.bv_page, 1777 1780 con->v2.in_bvec.bv_offset, 1778 1781 con->v2.in_bvec.bv_len); 1782 + } 1779 1783 1780 1784 ceph_msg_data_advance(&con->v2.in_cursor, con->v2.in_bvec.bv_len); 1781 1785 if (con->v2.in_cursor.total_resid) { 1782 1786 get_bvec_at(&con->v2.in_cursor, &bv); 1783 - set_in_bvec(con, &bv); 1787 + if (ceph_test_opt(from_msgr(con->msgr), RXBOUNCE)) { 1788 + bv.bv_page = con->bounce_page; 1789 + bv.bv_offset = 0; 1790 + set_in_bvec(con, &bv); 1791 + } else { 1792 + set_in_bvec(con, &bv); 1793 + } 1784 1794 WARN_ON(con->v2.in_state != IN_S_PREPARE_READ_DATA_CONT); 1785 1795 return; 1786 1796 } 1787 1797 1788 1798 /* 1789 - * We've read all data. Prepare to read data padding (if any) 1790 - * and epilogue. 1799 + * We've read all data. Prepare to read epilogue. 1791 1800 */ 1792 1801 reset_in_kvecs(con); 1793 - if (con_secure(con)) { 1794 - if (need_padding(data_len(con->in_msg))) 1795 - add_in_kvec(con, DATA_PAD(con->v2.in_buf), 1796 - padding_len(data_len(con->in_msg))); 1797 - add_in_kvec(con, con->v2.in_buf, CEPH_EPILOGUE_SECURE_LEN); 1802 + add_in_kvec(con, con->v2.in_buf, CEPH_EPILOGUE_PLAIN_LEN); 1803 + con->v2.in_state = IN_S_HANDLE_EPILOGUE; 1804 + } 1805 + 1806 + static int prepare_read_tail_plain(struct ceph_connection *con) 1807 + { 1808 + struct ceph_msg *msg = con->in_msg; 1809 + 1810 + if (!front_len(msg) && !middle_len(msg)) { 1811 + WARN_ON(!data_len(msg)); 1812 + return prepare_read_data(con); 1813 + } 1814 + 1815 + reset_in_kvecs(con); 1816 + if (front_len(msg)) { 1817 + add_in_kvec(con, msg->front.iov_base, front_len(msg)); 1818 + WARN_ON(msg->front.iov_len != front_len(msg)); 1819 + } 1820 + if (middle_len(msg)) { 1821 + add_in_kvec(con, msg->middle->vec.iov_base, middle_len(msg)); 1822 + WARN_ON(msg->middle->vec.iov_len != middle_len(msg)); 1823 + } 1824 + 1825 + if (data_len(msg)) { 1826 + con->v2.in_state = IN_S_PREPARE_READ_DATA; 1798 1827 } else { 1799 1828 add_in_kvec(con, con->v2.in_buf, CEPH_EPILOGUE_PLAIN_LEN); 1829 + con->v2.in_state = IN_S_HANDLE_EPILOGUE; 1800 1830 } 1831 + return 0; 1832 + } 1833 + 1834 + static void prepare_read_enc_page(struct ceph_connection *con) 1835 + { 1836 + struct bio_vec bv; 1837 + 1838 + dout("%s con %p i %d resid %d\n", __func__, con, con->v2.in_enc_i, 1839 + con->v2.in_enc_resid); 1840 + WARN_ON(!con->v2.in_enc_resid); 1841 + 1842 + bv.bv_page = con->v2.in_enc_pages[con->v2.in_enc_i]; 1843 + bv.bv_offset = 0; 1844 + bv.bv_len = min(con->v2.in_enc_resid, (int)PAGE_SIZE); 1845 + 1846 + set_in_bvec(con, &bv); 1847 + con->v2.in_enc_i++; 1848 + con->v2.in_enc_resid -= bv.bv_len; 1849 + 1850 + if (con->v2.in_enc_resid) { 1851 + con->v2.in_state = IN_S_PREPARE_READ_ENC_PAGE; 1852 + return; 1853 + } 1854 + 1855 + /* 1856 + * We are set to read the last piece of ciphertext (ending 1857 + * with epilogue) + auth tag. 1858 + */ 1859 + WARN_ON(con->v2.in_enc_i != con->v2.in_enc_page_cnt); 1801 1860 con->v2.in_state = IN_S_HANDLE_EPILOGUE; 1861 + } 1862 + 1863 + static int prepare_read_tail_secure(struct ceph_connection *con) 1864 + { 1865 + struct page **enc_pages; 1866 + int enc_page_cnt; 1867 + int tail_len; 1868 + 1869 + tail_len = tail_onwire_len(con->in_msg, true); 1870 + WARN_ON(!tail_len); 1871 + 1872 + enc_page_cnt = calc_pages_for(0, tail_len); 1873 + enc_pages = ceph_alloc_page_vector(enc_page_cnt, GFP_NOIO); 1874 + if (IS_ERR(enc_pages)) 1875 + return PTR_ERR(enc_pages); 1876 + 1877 + WARN_ON(con->v2.in_enc_pages || con->v2.in_enc_page_cnt); 1878 + con->v2.in_enc_pages = enc_pages; 1879 + con->v2.in_enc_page_cnt = enc_page_cnt; 1880 + con->v2.in_enc_resid = tail_len; 1881 + con->v2.in_enc_i = 0; 1882 + 1883 + prepare_read_enc_page(con); 1884 + return 0; 1802 1885 } 1803 1886 1804 1887 static void __finish_skip(struct ceph_connection *con) ··· 2712 2589 } 2713 2590 2714 2591 msg = con->in_msg; /* set in process_message_header() */ 2715 - if (!front_len(msg) && !middle_len(msg)) { 2716 - if (!data_len(msg)) 2717 - return process_message(con); 2718 - 2719 - prepare_read_data(con); 2720 - return 0; 2721 - } 2722 - 2723 - reset_in_kvecs(con); 2724 2592 if (front_len(msg)) { 2725 2593 WARN_ON(front_len(msg) > msg->front_alloc_len); 2726 - add_in_kvec(con, msg->front.iov_base, front_len(msg)); 2727 2594 msg->front.iov_len = front_len(msg); 2728 - 2729 - if (con_secure(con) && need_padding(front_len(msg))) 2730 - add_in_kvec(con, FRONT_PAD(con->v2.in_buf), 2731 - padding_len(front_len(msg))); 2732 2595 } else { 2733 2596 msg->front.iov_len = 0; 2734 2597 } 2735 2598 if (middle_len(msg)) { 2736 2599 WARN_ON(middle_len(msg) > msg->middle->alloc_len); 2737 - add_in_kvec(con, msg->middle->vec.iov_base, middle_len(msg)); 2738 2600 msg->middle->vec.iov_len = middle_len(msg); 2739 - 2740 - if (con_secure(con) && need_padding(middle_len(msg))) 2741 - add_in_kvec(con, MIDDLE_PAD(con->v2.in_buf), 2742 - padding_len(middle_len(msg))); 2743 2601 } else if (msg->middle) { 2744 2602 msg->middle->vec.iov_len = 0; 2745 2603 } 2746 2604 2747 - if (data_len(msg)) { 2748 - con->v2.in_state = IN_S_PREPARE_READ_DATA; 2749 - } else { 2750 - add_in_kvec(con, con->v2.in_buf, 2751 - con_secure(con) ? CEPH_EPILOGUE_SECURE_LEN : 2752 - CEPH_EPILOGUE_PLAIN_LEN); 2753 - con->v2.in_state = IN_S_HANDLE_EPILOGUE; 2754 - } 2755 - return 0; 2605 + if (!front_len(msg) && !middle_len(msg) && !data_len(msg)) 2606 + return process_message(con); 2607 + 2608 + if (con_secure(con)) 2609 + return prepare_read_tail_secure(con); 2610 + 2611 + return prepare_read_tail_plain(con); 2756 2612 } 2757 2613 2758 2614 static int handle_preamble(struct ceph_connection *con) ··· 2819 2717 int ret; 2820 2718 2821 2719 if (con_secure(con)) { 2822 - ret = decrypt_message(con); 2720 + ret = decrypt_tail(con); 2823 2721 if (ret) { 2824 2722 if (ret == -EBADMSG) 2825 2723 con->error_msg = "integrity error, bad epilogue auth tag"; ··· 2887 2785 ret = handle_control_remainder(con); 2888 2786 break; 2889 2787 case IN_S_PREPARE_READ_DATA: 2890 - prepare_read_data(con); 2891 - ret = 0; 2788 + ret = prepare_read_data(con); 2892 2789 break; 2893 2790 case IN_S_PREPARE_READ_DATA_CONT: 2894 2791 prepare_read_data_cont(con); 2792 + ret = 0; 2793 + break; 2794 + case IN_S_PREPARE_READ_ENC_PAGE: 2795 + prepare_read_enc_page(con); 2895 2796 ret = 0; 2896 2797 break; 2897 2798 case IN_S_HANDLE_EPILOGUE: ··· 3431 3326 3432 3327 static void revoke_at_prepare_read_data(struct ceph_connection *con) 3433 3328 { 3434 - int remaining; /* data + [data padding] + epilogue */ 3329 + int remaining; 3435 3330 int resid; 3436 3331 3332 + WARN_ON(con_secure(con)); 3437 3333 WARN_ON(!data_len(con->in_msg)); 3438 3334 WARN_ON(!iov_iter_is_kvec(&con->v2.in_iter)); 3439 3335 resid = iov_iter_count(&con->v2.in_iter); 3440 3336 WARN_ON(!resid); 3441 3337 3442 - if (con_secure(con)) 3443 - remaining = padded_len(data_len(con->in_msg)) + 3444 - CEPH_EPILOGUE_SECURE_LEN; 3445 - else 3446 - remaining = data_len(con->in_msg) + CEPH_EPILOGUE_PLAIN_LEN; 3447 - 3338 + remaining = data_len(con->in_msg) + CEPH_EPILOGUE_PLAIN_LEN; 3448 3339 dout("%s con %p resid %d remaining %d\n", __func__, con, resid, 3449 3340 remaining); 3450 3341 con->v2.in_iter.count -= resid; ··· 3451 3350 static void revoke_at_prepare_read_data_cont(struct ceph_connection *con) 3452 3351 { 3453 3352 int recved, resid; /* current piece of data */ 3454 - int remaining; /* [data padding] + epilogue */ 3353 + int remaining; 3455 3354 3355 + WARN_ON(con_secure(con)); 3456 3356 WARN_ON(!data_len(con->in_msg)); 3457 3357 WARN_ON(!iov_iter_is_bvec(&con->v2.in_iter)); 3458 3358 resid = iov_iter_count(&con->v2.in_iter); ··· 3465 3363 ceph_msg_data_advance(&con->v2.in_cursor, recved); 3466 3364 WARN_ON(resid > con->v2.in_cursor.total_resid); 3467 3365 3468 - if (con_secure(con)) 3469 - remaining = padding_len(data_len(con->in_msg)) + 3470 - CEPH_EPILOGUE_SECURE_LEN; 3471 - else 3472 - remaining = CEPH_EPILOGUE_PLAIN_LEN; 3473 - 3366 + remaining = CEPH_EPILOGUE_PLAIN_LEN; 3474 3367 dout("%s con %p total_resid %zu remaining %d\n", __func__, con, 3475 3368 con->v2.in_cursor.total_resid, remaining); 3476 3369 con->v2.in_iter.count -= resid; ··· 3473 3376 con->v2.in_state = IN_S_FINISH_SKIP; 3474 3377 } 3475 3378 3379 + static void revoke_at_prepare_read_enc_page(struct ceph_connection *con) 3380 + { 3381 + int resid; /* current enc page (not necessarily data) */ 3382 + 3383 + WARN_ON(!con_secure(con)); 3384 + WARN_ON(!iov_iter_is_bvec(&con->v2.in_iter)); 3385 + resid = iov_iter_count(&con->v2.in_iter); 3386 + WARN_ON(!resid || resid > con->v2.in_bvec.bv_len); 3387 + 3388 + dout("%s con %p resid %d enc_resid %d\n", __func__, con, resid, 3389 + con->v2.in_enc_resid); 3390 + con->v2.in_iter.count -= resid; 3391 + set_in_skip(con, resid + con->v2.in_enc_resid); 3392 + con->v2.in_state = IN_S_FINISH_SKIP; 3393 + } 3394 + 3476 3395 static void revoke_at_handle_epilogue(struct ceph_connection *con) 3477 3396 { 3478 3397 int resid; 3479 3398 3480 - WARN_ON(!iov_iter_is_kvec(&con->v2.in_iter)); 3481 3399 resid = iov_iter_count(&con->v2.in_iter); 3482 3400 WARN_ON(!resid); 3483 3401 ··· 3510 3398 break; 3511 3399 case IN_S_PREPARE_READ_DATA_CONT: 3512 3400 revoke_at_prepare_read_data_cont(con); 3401 + break; 3402 + case IN_S_PREPARE_READ_ENC_PAGE: 3403 + revoke_at_prepare_read_enc_page(con); 3513 3404 break; 3514 3405 case IN_S_HANDLE_EPILOGUE: 3515 3406 revoke_at_handle_epilogue(con); ··· 3547 3432 clear_out_sign_kvecs(con); 3548 3433 free_conn_bufs(con); 3549 3434 3435 + if (con->v2.in_enc_pages) { 3436 + WARN_ON(!con->v2.in_enc_page_cnt); 3437 + ceph_release_page_vector(con->v2.in_enc_pages, 3438 + con->v2.in_enc_page_cnt); 3439 + con->v2.in_enc_pages = NULL; 3440 + con->v2.in_enc_page_cnt = 0; 3441 + } 3550 3442 if (con->v2.out_enc_pages) { 3551 3443 WARN_ON(!con->v2.out_enc_page_cnt); 3552 3444 ceph_release_page_vector(con->v2.out_enc_pages,
+1 -1
net/core/skbuff.c
··· 681 681 * while trying to recycle fragments on __skb_frag_unref() we need 682 682 * to make one SKB responsible for triggering the recycle path. 683 683 * So disable the recycling bit if an SKB is cloned and we have 684 - * additional references to to the fragmented part of the SKB. 684 + * additional references to the fragmented part of the SKB. 685 685 * Eventually the last SKB will have the recycling bit set and it's 686 686 * dataref set to 0, which will trigger the recycling 687 687 */
+6 -19
net/dsa/dsa2.c
··· 1784 1784 void dsa_switch_shutdown(struct dsa_switch *ds) 1785 1785 { 1786 1786 struct net_device *master, *slave_dev; 1787 - LIST_HEAD(unregister_list); 1788 1787 struct dsa_port *dp; 1789 1788 1790 1789 mutex_lock(&dsa2_mutex); ··· 1794 1795 slave_dev = dp->slave; 1795 1796 1796 1797 netdev_upper_dev_unlink(master, slave_dev); 1797 - /* Just unlinking ourselves as uppers of the master is not 1798 - * sufficient. When the master net device unregisters, that will 1799 - * also call dev_close, which we will catch as NETDEV_GOING_DOWN 1800 - * and trigger a dev_close on our own devices (dsa_slave_close). 1801 - * In turn, that will call dev_mc_unsync on the master's net 1802 - * device. If the master is also a DSA switch port, this will 1803 - * trigger dsa_slave_set_rx_mode which will call dev_mc_sync on 1804 - * its own master. Lockdep will complain about the fact that 1805 - * all cascaded masters have the same dsa_master_addr_list_lock_key, 1806 - * which it normally would not do if the cascaded masters would 1807 - * be in a proper upper/lower relationship, which we've just 1808 - * destroyed. 1809 - * To suppress the lockdep warnings, let's actually unregister 1810 - * the DSA slave interfaces too, to avoid the nonsensical 1811 - * multicast address list synchronization on shutdown. 1812 - */ 1813 - unregister_netdevice_queue(slave_dev, &unregister_list); 1814 1798 } 1815 - unregister_netdevice_many(&unregister_list); 1799 + 1800 + /* Disconnect from further netdevice notifiers on the master, 1801 + * since netdev_uses_dsa() will now return false. 1802 + */ 1803 + dsa_switch_for_each_cpu_port(dp, ds) 1804 + dp->master->dsa_ptr = NULL; 1816 1805 1817 1806 rtnl_unlock(); 1818 1807 mutex_unlock(&dsa2_mutex);
+2
net/ipv4/ipmr.c
··· 256 256 return 0; 257 257 258 258 err2: 259 + rtnl_lock(); 259 260 ipmr_free_table(mrt); 261 + rtnl_unlock(); 260 262 err1: 261 263 fib_rules_unregister(ops); 262 264 return err;
+19 -14
net/ipv4/tcp.c
··· 936 936 } 937 937 } 938 938 939 + /* skb changing from pure zc to mixed, must charge zc */ 940 + static int tcp_downgrade_zcopy_pure(struct sock *sk, struct sk_buff *skb) 941 + { 942 + if (unlikely(skb_zcopy_pure(skb))) { 943 + u32 extra = skb->truesize - 944 + SKB_TRUESIZE(skb_end_offset(skb)); 945 + 946 + if (!sk_wmem_schedule(sk, extra)) 947 + return -ENOMEM; 948 + 949 + sk_mem_charge(sk, extra); 950 + skb_shinfo(skb)->flags &= ~SKBFL_PURE_ZEROCOPY; 951 + } 952 + return 0; 953 + } 954 + 939 955 static struct sk_buff *tcp_build_frag(struct sock *sk, int size_goal, int flags, 940 956 struct page *page, int offset, size_t *size) 941 957 { ··· 987 971 tcp_mark_push(tp, skb); 988 972 goto new_segment; 989 973 } 990 - if (!sk_wmem_schedule(sk, copy)) 974 + if (tcp_downgrade_zcopy_pure(sk, skb) || !sk_wmem_schedule(sk, copy)) 991 975 return NULL; 992 976 993 977 if (can_coalesce) { ··· 1335 1319 1336 1320 copy = min_t(int, copy, pfrag->size - pfrag->offset); 1337 1321 1338 - /* skb changing from pure zc to mixed, must charge zc */ 1339 - if (unlikely(skb_zcopy_pure(skb))) { 1340 - u32 extra = skb->truesize - 1341 - SKB_TRUESIZE(skb_end_offset(skb)); 1342 - 1343 - if (!sk_wmem_schedule(sk, extra)) 1344 - goto wait_for_space; 1345 - 1346 - sk_mem_charge(sk, extra); 1347 - skb_shinfo(skb)->flags &= ~SKBFL_PURE_ZEROCOPY; 1348 - } 1349 - 1350 - if (!sk_wmem_schedule(sk, copy)) 1322 + if (tcp_downgrade_zcopy_pure(sk, skb) || 1323 + !sk_wmem_schedule(sk, copy)) 1351 1324 goto wait_for_space; 1352 1325 1353 1326 err = skb_copy_to_page_nocache(sk, &msg->msg_iter, skb,
+2
net/ipv6/ip6mr.c
··· 243 243 return 0; 244 244 245 245 err2: 246 + rtnl_lock(); 246 247 ip6mr_free_table(mrt); 248 + rtnl_unlock(); 247 249 err1: 248 250 fib_rules_unregister(ops); 249 251 return err;
+1 -1
net/mpls/af_mpls.c
··· 1607 1607 struct net_device *dev = netdev_notifier_info_to_dev(ptr); 1608 1608 struct mpls_dev *mdev; 1609 1609 unsigned int flags; 1610 + int err; 1610 1611 1611 1612 if (event == NETDEV_REGISTER) { 1612 1613 mdev = mpls_add_dev(dev); ··· 1622 1621 return NOTIFY_OK; 1623 1622 1624 1623 switch (event) { 1625 - int err; 1626 1624 1627 1625 case NETDEV_DOWN: 1628 1626 err = mpls_ifdown(dev, event);
+6 -2
net/mptcp/pm_netlink.c
··· 925 925 static int mptcp_pm_nl_create_listen_socket(struct sock *sk, 926 926 struct mptcp_pm_addr_entry *entry) 927 927 { 928 + int addrlen = sizeof(struct sockaddr_in); 928 929 struct sockaddr_storage addr; 929 930 struct mptcp_sock *msk; 930 931 struct socket *ssock; ··· 950 949 } 951 950 952 951 mptcp_info2sockaddr(&entry->addr, &addr, entry->addr.family); 953 - err = kernel_bind(ssock, (struct sockaddr *)&addr, 954 - sizeof(struct sockaddr_in)); 952 + #if IS_ENABLED(CONFIG_MPTCP_IPV6) 953 + if (entry->addr.family == AF_INET6) 954 + addrlen = sizeof(struct sockaddr_in6); 955 + #endif 956 + err = kernel_bind(ssock, (struct sockaddr *)&addr, addrlen); 955 957 if (err) { 956 958 pr_warn("kernel_bind error, err=%d", err); 957 959 goto out;
+2 -1
net/netfilter/nf_conntrack_netlink.c
··· 2321 2321 if (helper->from_nlattr) 2322 2322 helper->from_nlattr(helpinfo, ct); 2323 2323 2324 - /* not in hash table yet so not strictly necessary */ 2324 + /* disable helper auto-assignment for this entry */ 2325 + ct->status |= IPS_HELPER; 2325 2326 RCU_INIT_POINTER(help->helper, helper); 2326 2327 } 2327 2328 } else {
+9
net/netfilter/nf_conntrack_proto_sctp.c
··· 489 489 pr_debug("Setting vtag %x for dir %d\n", 490 490 ih->init_tag, !dir); 491 491 ct->proto.sctp.vtag[!dir] = ih->init_tag; 492 + 493 + /* don't renew timeout on init retransmit so 494 + * port reuse by client or NAT middlebox cannot 495 + * keep entry alive indefinitely (incl. nat info). 496 + */ 497 + if (new_state == SCTP_CONNTRACK_CLOSED && 498 + old_state == SCTP_CONNTRACK_CLOSED && 499 + nf_ct_is_confirmed(ct)) 500 + ignore = true; 492 501 } 493 502 494 503 ct->proto.sctp.state = new_state;
+41 -18
net/netfilter/nf_conntrack_proto_tcp.c
··· 446 446 } 447 447 } 448 448 449 + static void tcp_init_sender(struct ip_ct_tcp_state *sender, 450 + struct ip_ct_tcp_state *receiver, 451 + const struct sk_buff *skb, 452 + unsigned int dataoff, 453 + const struct tcphdr *tcph, 454 + u32 end, u32 win) 455 + { 456 + /* SYN-ACK in reply to a SYN 457 + * or SYN from reply direction in simultaneous open. 458 + */ 459 + sender->td_end = 460 + sender->td_maxend = end; 461 + sender->td_maxwin = (win == 0 ? 1 : win); 462 + 463 + tcp_options(skb, dataoff, tcph, sender); 464 + /* RFC 1323: 465 + * Both sides must send the Window Scale option 466 + * to enable window scaling in either direction. 467 + */ 468 + if (!(sender->flags & IP_CT_TCP_FLAG_WINDOW_SCALE && 469 + receiver->flags & IP_CT_TCP_FLAG_WINDOW_SCALE)) { 470 + sender->td_scale = 0; 471 + receiver->td_scale = 0; 472 + } 473 + } 474 + 449 475 static bool tcp_in_window(struct nf_conn *ct, 450 476 enum ip_conntrack_dir dir, 451 477 unsigned int index, ··· 525 499 * Initialize sender data. 526 500 */ 527 501 if (tcph->syn) { 528 - /* 529 - * SYN-ACK in reply to a SYN 530 - * or SYN from reply direction in simultaneous open. 531 - */ 532 - sender->td_end = 533 - sender->td_maxend = end; 534 - sender->td_maxwin = (win == 0 ? 1 : win); 535 - 536 - tcp_options(skb, dataoff, tcph, sender); 537 - /* 538 - * RFC 1323: 539 - * Both sides must send the Window Scale option 540 - * to enable window scaling in either direction. 541 - */ 542 - if (!(sender->flags & IP_CT_TCP_FLAG_WINDOW_SCALE 543 - && receiver->flags & IP_CT_TCP_FLAG_WINDOW_SCALE)) 544 - sender->td_scale = 545 - receiver->td_scale = 0; 502 + tcp_init_sender(sender, receiver, 503 + skb, dataoff, tcph, 504 + end, win); 546 505 if (!tcph->ack) 547 506 /* Simultaneous open */ 548 507 return true; ··· 571 560 sender->td_maxwin = (win == 0 ? 1 : win); 572 561 573 562 tcp_options(skb, dataoff, tcph, sender); 563 + } else if (tcph->syn && dir == IP_CT_DIR_REPLY && 564 + state->state == TCP_CONNTRACK_SYN_SENT) { 565 + /* Retransmitted syn-ack, or syn (simultaneous open). 566 + * 567 + * Re-init state for this direction, just like for the first 568 + * syn(-ack) reply, it might differ in seq, ack or tcp options. 569 + */ 570 + tcp_init_sender(sender, receiver, 571 + skb, dataoff, tcph, 572 + end, win); 573 + if (!tcph->ack) 574 + return true; 574 575 } 575 576 576 577 if (!(tcph->ack)) {
+1 -1
net/netfilter/nft_exthdr.c
··· 167 167 { 168 168 struct tcphdr *tcph; 169 169 170 - if (pkt->tprot != IPPROTO_TCP) 170 + if (pkt->tprot != IPPROTO_TCP || pkt->fragoff) 171 171 return NULL; 172 172 173 173 tcph = skb_header_pointer(pkt->skb, nft_thoff(pkt), sizeof(*tcph), buffer);
+5 -4
net/netfilter/nft_payload.c
··· 83 83 { 84 84 unsigned int thoff = nft_thoff(pkt); 85 85 86 - if (!(pkt->flags & NFT_PKTINFO_L4PROTO)) 86 + if (!(pkt->flags & NFT_PKTINFO_L4PROTO) || pkt->fragoff) 87 87 return -1; 88 88 89 89 switch (pkt->tprot) { ··· 147 147 offset = skb_network_offset(skb); 148 148 break; 149 149 case NFT_PAYLOAD_TRANSPORT_HEADER: 150 - if (!(pkt->flags & NFT_PKTINFO_L4PROTO)) 150 + if (!(pkt->flags & NFT_PKTINFO_L4PROTO) || pkt->fragoff) 151 151 goto err; 152 152 offset = nft_thoff(pkt); 153 153 break; ··· 688 688 offset = skb_network_offset(skb); 689 689 break; 690 690 case NFT_PAYLOAD_TRANSPORT_HEADER: 691 - if (!(pkt->flags & NFT_PKTINFO_L4PROTO)) 691 + if (!(pkt->flags & NFT_PKTINFO_L4PROTO) || pkt->fragoff) 692 692 goto err; 693 693 offset = nft_thoff(pkt); 694 694 break; ··· 728 728 if (priv->csum_type == NFT_PAYLOAD_CSUM_SCTP && 729 729 pkt->tprot == IPPROTO_SCTP && 730 730 skb->ip_summed != CHECKSUM_PARTIAL) { 731 - if (nft_payload_csum_sctp(skb, nft_thoff(pkt))) 731 + if (pkt->fragoff == 0 && 732 + nft_payload_csum_sctp(skb, nft_thoff(pkt))) 732 733 goto err; 733 734 } 734 735
+5 -3
net/smc/smc_pnet.c
··· 368 368 new_pe->type = SMC_PNET_ETH; 369 369 memcpy(new_pe->pnet_name, pnet_name, SMC_MAX_PNETID_LEN); 370 370 strncpy(new_pe->eth_name, eth_name, IFNAMSIZ); 371 - new_pe->ndev = ndev; 372 - if (ndev) 373 - netdev_tracker_alloc(ndev, &new_pe->dev_tracker, GFP_KERNEL); 374 371 rc = -EEXIST; 375 372 new_netdev = true; 376 373 write_lock(&pnettable->lock); ··· 379 382 } 380 383 } 381 384 if (new_netdev) { 385 + if (ndev) { 386 + new_pe->ndev = ndev; 387 + netdev_tracker_alloc(ndev, &new_pe->dev_tracker, 388 + GFP_ATOMIC); 389 + } 382 390 list_add_tail(&new_pe->list, &pnettable->pnetlist); 383 391 write_unlock(&pnettable->lock); 384 392 } else {
+4 -1
net/sunrpc/sysfs.c
··· 115 115 } 116 116 117 117 sock = container_of(xprt, struct sock_xprt, xprt); 118 - if (kernel_getsockname(sock->sock, (struct sockaddr *)&saddr) < 0) 118 + mutex_lock(&sock->recv_mutex); 119 + if (sock->sock == NULL || 120 + kernel_getsockname(sock->sock, (struct sockaddr *)&saddr) < 0) 119 121 goto out; 120 122 121 123 ret = sprintf(buf, "%pISc\n", &saddr); 122 124 out: 125 + mutex_unlock(&sock->recv_mutex); 123 126 xprt_put(xprt); 124 127 return ret + 1; 125 128 }
+3
net/sunrpc/xprtrdma/verbs.c
··· 413 413 IB_POLL_WORKQUEUE); 414 414 if (IS_ERR(ep->re_attr.send_cq)) { 415 415 rc = PTR_ERR(ep->re_attr.send_cq); 416 + ep->re_attr.send_cq = NULL; 416 417 goto out_destroy; 417 418 } 418 419 ··· 422 421 IB_POLL_WORKQUEUE); 423 422 if (IS_ERR(ep->re_attr.recv_cq)) { 424 423 rc = PTR_ERR(ep->re_attr.recv_cq); 424 + ep->re_attr.recv_cq = NULL; 425 425 goto out_destroy; 426 426 } 427 427 ep->re_receive_count = 0; ··· 461 459 ep->re_pd = ib_alloc_pd(device, 0); 462 460 if (IS_ERR(ep->re_pd)) { 463 461 rc = PTR_ERR(ep->re_pd); 462 + ep->re_pd = NULL; 464 463 goto out_destroy; 465 464 } 466 465
+6 -1
net/sunrpc/xprtsock.c
··· 1641 1641 unsigned short get_srcport(struct rpc_xprt *xprt) 1642 1642 { 1643 1643 struct sock_xprt *sock = container_of(xprt, struct sock_xprt, xprt); 1644 - return xs_sock_getport(sock->sock); 1644 + unsigned short ret = 0; 1645 + mutex_lock(&sock->recv_mutex); 1646 + if (sock->sock) 1647 + ret = xs_sock_getport(sock->sock); 1648 + mutex_unlock(&sock->recv_mutex); 1649 + return ret; 1645 1650 } 1646 1651 EXPORT_SYMBOL(get_srcport); 1647 1652
+7 -2
net/tipc/link.c
··· 2200 2200 struct tipc_msg *hdr = buf_msg(skb); 2201 2201 struct tipc_gap_ack_blks *ga = NULL; 2202 2202 bool reply = msg_probe(hdr), retransmitted = false; 2203 - u16 dlen = msg_data_sz(hdr), glen = 0; 2203 + u32 dlen = msg_data_sz(hdr), glen = 0; 2204 2204 u16 peers_snd_nxt = msg_next_sent(hdr); 2205 2205 u16 peers_tol = msg_link_tolerance(hdr); 2206 2206 u16 peers_prio = msg_linkprio(hdr); ··· 2214 2214 void *data; 2215 2215 2216 2216 trace_tipc_proto_rcv(skb, false, l->name); 2217 + 2218 + if (dlen > U16_MAX) 2219 + goto exit; 2220 + 2217 2221 if (tipc_link_is_blocked(l) || !xmitq) 2218 2222 goto exit; 2219 2223 ··· 2313 2309 2314 2310 /* Receive Gap ACK blocks from peer if any */ 2315 2311 glen = tipc_get_gap_ack_blks(&ga, l, hdr, true); 2316 - 2312 + if(glen > dlen) 2313 + break; 2317 2314 tipc_mon_rcv(l->net, data + glen, dlen - glen, l->addr, 2318 2315 &l->mon_state, l->bearer_id); 2319 2316
+2
net/tipc/monitor.c
··· 496 496 state->probing = false; 497 497 498 498 /* Sanity check received domain record */ 499 + if (new_member_cnt > MAX_MON_DOMAIN) 500 + return; 499 501 if (dlen < dom_rec_len(arrv_dom, 0)) 500 502 return; 501 503 if (dlen != dom_rec_len(arrv_dom, new_member_cnt))
+1 -1
net/tipc/name_distr.c
··· 313 313 pr_warn_ratelimited("Failed to remove binding %u,%u from %u\n", 314 314 ua.sr.type, ua.sr.lower, node); 315 315 } else { 316 - pr_warn("Unrecognized name table message received\n"); 316 + pr_warn_ratelimited("Unknown name table message received\n"); 317 317 } 318 318 return false; 319 319 }
+9 -6
security/integrity/digsig_asymmetric.c
··· 109 109 110 110 pk = asymmetric_key_public_key(key); 111 111 pks.pkey_algo = pk->pkey_algo; 112 - if (!strcmp(pk->pkey_algo, "rsa")) 112 + if (!strcmp(pk->pkey_algo, "rsa")) { 113 113 pks.encoding = "pkcs1"; 114 - else if (!strncmp(pk->pkey_algo, "ecdsa-", 6)) 114 + } else if (!strncmp(pk->pkey_algo, "ecdsa-", 6)) { 115 115 /* edcsa-nist-p192 etc. */ 116 116 pks.encoding = "x962"; 117 - else if (!strcmp(pk->pkey_algo, "ecrdsa") || 118 - !strcmp(pk->pkey_algo, "sm2")) 117 + } else if (!strcmp(pk->pkey_algo, "ecrdsa") || 118 + !strcmp(pk->pkey_algo, "sm2")) { 119 119 pks.encoding = "raw"; 120 - else 121 - return -ENOPKG; 120 + } else { 121 + ret = -ENOPKG; 122 + goto out; 123 + } 122 124 123 125 pks.digest = (u8 *)data; 124 126 pks.digest_size = datalen; 125 127 pks.s = hdr->sig; 126 128 pks.s_size = siglen; 127 129 ret = verify_signature(key, &pks); 130 + out: 128 131 key_put(key); 129 132 pr_debug("%s() = %d\n", __func__, ret); 130 133 return ret;
+1 -1
security/integrity/ima/ima_fs.c
··· 496 496 497 497 return 0; 498 498 out: 499 + securityfs_remove(ima_policy); 499 500 securityfs_remove(violations); 500 501 securityfs_remove(runtime_measurements_count); 501 502 securityfs_remove(ascii_runtime_measurements); 502 503 securityfs_remove(binary_runtime_measurements); 503 504 securityfs_remove(ima_symlink); 504 505 securityfs_remove(ima_dir); 505 - securityfs_remove(ima_policy); 506 506 return -1; 507 507 }
+8
security/integrity/ima/ima_policy.c
··· 1967 1967 1968 1968 rcu_read_lock(); 1969 1969 1970 + /* Do not print rules with inactive LSM labels */ 1971 + for (i = 0; i < MAX_LSM_RULES; i++) { 1972 + if (entry->lsm[i].args_p && !entry->lsm[i].rule) { 1973 + rcu_read_unlock(); 1974 + return 0; 1975 + } 1976 + } 1977 + 1970 1978 if (entry->action & MEASURE) 1971 1979 seq_puts(m, pt(Opt_measure)); 1972 1980 if (entry->action & DONT_MEASURE)
+7 -3
security/integrity/ima/ima_template.c
··· 29 29 30 30 static LIST_HEAD(defined_templates); 31 31 static DEFINE_SPINLOCK(template_list); 32 + static int template_setup_done; 32 33 33 34 static const struct ima_template_field supported_fields[] = { 34 35 {.field_id = "d", .field_init = ima_eventdigest_init, ··· 102 101 struct ima_template_desc *template_desc; 103 102 int template_len = strlen(str); 104 103 105 - if (ima_template) 104 + if (template_setup_done) 106 105 return 1; 107 106 108 - ima_init_template_list(); 107 + if (!ima_template) 108 + ima_init_template_list(); 109 109 110 110 /* 111 111 * Verify that a template with the supplied name exists. ··· 130 128 } 131 129 132 130 ima_template = template_desc; 131 + template_setup_done = 1; 133 132 return 1; 134 133 } 135 134 __setup("ima_template=", ima_template_setup); ··· 139 136 { 140 137 int num_templates = ARRAY_SIZE(builtin_templates); 141 138 142 - if (ima_template) 139 + if (template_setup_done) 143 140 return 1; 144 141 145 142 if (template_desc_init_fields(str, NULL, NULL) < 0) { ··· 150 147 151 148 builtin_templates[num_templates - 1].fmt = str; 152 149 ima_template = builtin_templates + num_templates - 1; 150 + template_setup_done = 1; 153 151 154 152 return 1; 155 153 }
+2
security/integrity/integrity_audit.c
··· 45 45 return; 46 46 47 47 ab = audit_log_start(audit_context(), GFP_KERNEL, audit_msgno); 48 + if (!ab) 49 + return; 48 50 audit_log_format(ab, "pid=%d uid=%u auid=%u ses=%u", 49 51 task_pid_nr(current), 50 52 from_kuid(&init_user_ns, current_uid()),
+13
sound/core/pcm_native.c
··· 172 172 } 173 173 EXPORT_SYMBOL_GPL(_snd_pcm_stream_lock_irqsave); 174 174 175 + unsigned long _snd_pcm_stream_lock_irqsave_nested(struct snd_pcm_substream *substream) 176 + { 177 + unsigned long flags = 0; 178 + if (substream->pcm->nonatomic) 179 + mutex_lock_nested(&substream->self_group.mutex, 180 + SINGLE_DEPTH_NESTING); 181 + else 182 + spin_lock_irqsave_nested(&substream->self_group.lock, flags, 183 + SINGLE_DEPTH_NESTING); 184 + return flags; 185 + } 186 + EXPORT_SYMBOL_GPL(_snd_pcm_stream_lock_irqsave_nested); 187 + 175 188 /** 176 189 * snd_pcm_stream_unlock_irqrestore - Unlock the PCM stream 177 190 * @substream: PCM substream
+3 -4
sound/hda/intel-sdw-acpi.c
··· 50 50 static int 51 51 sdw_intel_scan_controller(struct sdw_intel_acpi_info *info) 52 52 { 53 - struct acpi_device *adev; 53 + struct acpi_device *adev = acpi_fetch_acpi_dev(info->handle); 54 54 int ret, i; 55 55 u8 count; 56 56 57 - if (acpi_bus_get_device(info->handle, &adev)) 57 + if (!adev) 58 58 return -EINVAL; 59 59 60 60 /* Found controller, find links supported */ ··· 119 119 void *cdata, void **return_value) 120 120 { 121 121 struct sdw_intel_acpi_info *info = cdata; 122 - struct acpi_device *adev; 123 122 acpi_status status; 124 123 u64 adr; 125 124 ··· 126 127 if (ACPI_FAILURE(status)) 127 128 return AE_OK; /* keep going */ 128 129 129 - if (acpi_bus_get_device(handle, &adev)) { 130 + if (!acpi_fetch_acpi_dev(handle)) { 130 131 pr_err("%s: Couldn't find ACPI handle\n", __func__); 131 132 return AE_NOT_FOUND; 132 133 }
+1 -1
sound/pci/hda/hda_auto_parser.c
··· 981 981 int id = HDA_FIXUP_ID_NOT_SET; 982 982 const char *name = NULL; 983 983 const char *type = NULL; 984 - int vendor, device; 984 + unsigned int vendor, device; 985 985 986 986 if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET) 987 987 return;
+4
sound/pci/hda/hda_codec.c
··· 3000 3000 { 3001 3001 struct hda_pcm *cpcm; 3002 3002 3003 + /* Skip the shutdown if codec is not registered */ 3004 + if (!codec->registered) 3005 + return; 3006 + 3003 3007 list_for_each_entry(cpcm, &codec->pcm_list_head, list) 3004 3008 snd_pcm_suspend_all(cpcm->pcm); 3005 3009
+15 -2
sound/pci/hda/hda_generic.c
··· 91 91 free_kctls(spec); 92 92 snd_array_free(&spec->paths); 93 93 snd_array_free(&spec->loopback_list); 94 + #ifdef CONFIG_SND_HDA_GENERIC_LEDS 95 + if (spec->led_cdevs[LED_AUDIO_MUTE]) 96 + led_classdev_unregister(spec->led_cdevs[LED_AUDIO_MUTE]); 97 + if (spec->led_cdevs[LED_AUDIO_MICMUTE]) 98 + led_classdev_unregister(spec->led_cdevs[LED_AUDIO_MICMUTE]); 99 + #endif 94 100 } 95 101 96 102 /* ··· 3928 3922 enum led_brightness), 3929 3923 bool micmute) 3930 3924 { 3925 + struct hda_gen_spec *spec = codec->spec; 3931 3926 struct led_classdev *cdev; 3927 + int idx = micmute ? LED_AUDIO_MICMUTE : LED_AUDIO_MUTE; 3928 + int err; 3932 3929 3933 3930 cdev = devm_kzalloc(&codec->core.dev, sizeof(*cdev), GFP_KERNEL); 3934 3931 if (!cdev) ··· 3941 3932 cdev->max_brightness = 1; 3942 3933 cdev->default_trigger = micmute ? "audio-micmute" : "audio-mute"; 3943 3934 cdev->brightness_set_blocking = callback; 3944 - cdev->brightness = ledtrig_audio_get(micmute ? LED_AUDIO_MICMUTE : LED_AUDIO_MUTE); 3935 + cdev->brightness = ledtrig_audio_get(idx); 3945 3936 cdev->flags = LED_CORE_SUSPENDRESUME; 3946 3937 3947 - return devm_led_classdev_register(&codec->core.dev, cdev); 3938 + err = led_classdev_register(&codec->core.dev, cdev); 3939 + if (err < 0) 3940 + return err; 3941 + spec->led_cdevs[idx] = cdev; 3942 + return 0; 3948 3943 } 3949 3944 3950 3945 /**
+3
sound/pci/hda/hda_generic.h
··· 294 294 struct hda_jack_callback *cb); 295 295 void (*mic_autoswitch_hook)(struct hda_codec *codec, 296 296 struct hda_jack_callback *cb); 297 + 298 + /* leds */ 299 + struct led_classdev *led_cdevs[NUM_AUDIO_LEDS]; 297 300 }; 298 301 299 302 /* values for add_stereo_mix_input flag */
+55 -12
sound/pci/hda/patch_realtek.c
··· 98 98 unsigned int gpio_mic_led_mask; 99 99 struct alc_coef_led mute_led_coef; 100 100 struct alc_coef_led mic_led_coef; 101 + struct mutex coef_mutex; 101 102 102 103 hda_nid_t headset_mic_pin; 103 104 hda_nid_t headphone_mic_pin; ··· 138 137 * COEF access helper functions 139 138 */ 140 139 141 - static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 142 - unsigned int coef_idx) 140 + static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 141 + unsigned int coef_idx) 143 142 { 144 143 unsigned int val; 145 144 ··· 148 147 return val; 149 148 } 150 149 150 + static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 151 + unsigned int coef_idx) 152 + { 153 + struct alc_spec *spec = codec->spec; 154 + unsigned int val; 155 + 156 + mutex_lock(&spec->coef_mutex); 157 + val = __alc_read_coefex_idx(codec, nid, coef_idx); 158 + mutex_unlock(&spec->coef_mutex); 159 + return val; 160 + } 161 + 151 162 #define alc_read_coef_idx(codec, coef_idx) \ 152 163 alc_read_coefex_idx(codec, 0x20, coef_idx) 153 164 154 - static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 155 - unsigned int coef_idx, unsigned int coef_val) 165 + static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 166 + unsigned int coef_idx, unsigned int coef_val) 156 167 { 157 168 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx); 158 169 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val); 159 170 } 160 171 172 + static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 173 + unsigned int coef_idx, unsigned int coef_val) 174 + { 175 + struct alc_spec *spec = codec->spec; 176 + 177 + mutex_lock(&spec->coef_mutex); 178 + __alc_write_coefex_idx(codec, nid, coef_idx, coef_val); 179 + mutex_unlock(&spec->coef_mutex); 180 + } 181 + 161 182 #define alc_write_coef_idx(codec, coef_idx, coef_val) \ 162 183 alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val) 184 + 185 + static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 186 + unsigned int coef_idx, unsigned int mask, 187 + unsigned int bits_set) 188 + { 189 + unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx); 190 + 191 + if (val != -1) 192 + __alc_write_coefex_idx(codec, nid, coef_idx, 193 + (val & ~mask) | bits_set); 194 + } 163 195 164 196 static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid, 165 197 unsigned int coef_idx, unsigned int mask, 166 198 unsigned int bits_set) 167 199 { 168 - unsigned int val = alc_read_coefex_idx(codec, nid, coef_idx); 200 + struct alc_spec *spec = codec->spec; 169 201 170 - if (val != -1) 171 - alc_write_coefex_idx(codec, nid, coef_idx, 172 - (val & ~mask) | bits_set); 202 + mutex_lock(&spec->coef_mutex); 203 + __alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set); 204 + mutex_unlock(&spec->coef_mutex); 173 205 } 174 206 175 207 #define alc_update_coef_idx(codec, coef_idx, mask, bits_set) \ ··· 235 201 static void alc_process_coef_fw(struct hda_codec *codec, 236 202 const struct coef_fw *fw) 237 203 { 204 + struct alc_spec *spec = codec->spec; 205 + 206 + mutex_lock(&spec->coef_mutex); 238 207 for (; fw->nid; fw++) { 239 208 if (fw->mask == (unsigned short)-1) 240 - alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val); 209 + __alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val); 241 210 else 242 - alc_update_coefex_idx(codec, fw->nid, fw->idx, 243 - fw->mask, fw->val); 211 + __alc_update_coefex_idx(codec, fw->nid, fw->idx, 212 + fw->mask, fw->val); 244 213 } 214 + mutex_unlock(&spec->coef_mutex); 245 215 } 246 216 247 217 /* ··· 1191 1153 codec->spdif_status_reset = 1; 1192 1154 codec->forced_resume = 1; 1193 1155 codec->patch_ops = alc_patch_ops; 1156 + mutex_init(&spec->coef_mutex); 1194 1157 1195 1158 err = alc_codec_rename_from_preset(codec); 1196 1159 if (err < 0) { ··· 2164 2125 { 2165 2126 static const hda_nid_t conn1[] = { 0x0c }; 2166 2127 static const struct coef_fw gb_x570_coefs[] = { 2128 + WRITE_COEF(0x07, 0x03c0), 2167 2129 WRITE_COEF(0x1a, 0x01c1), 2168 2130 WRITE_COEF(0x1b, 0x0202), 2169 2131 WRITE_COEF(0x43, 0x3005), ··· 2591 2551 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE), 2592 2552 SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS), 2593 2553 SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570), 2594 - SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_CLEVO_P950), 2554 + SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570), 2555 + SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570), 2595 2556 SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950), 2596 2557 SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950), 2597 2558 SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950), ··· 2667 2626 {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"}, 2668 2627 {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"}, 2669 2628 {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"}, 2629 + {.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"}, 2670 2630 {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"}, 2671 2631 {} 2672 2632 }; ··· 9011 8969 SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS), 9012 8970 SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401), 9013 8971 SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401), 8972 + SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401), 9014 8973 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2), 9015 8974 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC), 9016 8975 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
+2 -2
sound/soc/amd/acp/acp-mach-common.c
··· 303 303 304 304 static struct snd_soc_codec_conf rt1019_conf[] = { 305 305 { 306 - .dlc = COMP_CODEC_CONF("i2c-10EC1019:00"), 306 + .dlc = COMP_CODEC_CONF("i2c-10EC1019:01"), 307 307 .name_prefix = "Left", 308 308 }, 309 309 { 310 - .dlc = COMP_CODEC_CONF("i2c-10EC1019:01"), 310 + .dlc = COMP_CODEC_CONF("i2c-10EC1019:00"), 311 311 .name_prefix = "Right", 312 312 }, 313 313 };
+2
sound/soc/codecs/cpcap.c
··· 1667 1667 { 1668 1668 struct device_node *codec_node = 1669 1669 of_get_child_by_name(pdev->dev.parent->of_node, "audio-codec"); 1670 + if (!codec_node) 1671 + return -ENODEV; 1670 1672 1671 1673 pdev->dev.of_node = codec_node; 1672 1674
+1 -1
sound/soc/codecs/hdmi-codec.c
··· 277 277 bool busy; 278 278 struct snd_soc_jack *jack; 279 279 unsigned int jack_status; 280 - u8 iec_status[5]; 280 + u8 iec_status[AES_IEC958_STATUS_SIZE]; 281 281 }; 282 282 283 283 static const struct snd_soc_dapm_widget hdmi_widgets[] = {
+4 -4
sound/soc/codecs/lpass-rx-macro.c
··· 2688 2688 int reg, b2_reg; 2689 2689 2690 2690 /* Address does not automatically update if reading */ 2691 - reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx; 2692 - b2_reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx; 2691 + reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx; 2692 + b2_reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx; 2693 2693 2694 2694 snd_soc_component_write(component, reg, 2695 2695 ((band_idx * BAND_MAX + coeff_idx) * ··· 2718 2718 static void set_iir_band_coeff(struct snd_soc_component *component, 2719 2719 int iir_idx, int band_idx, uint32_t value) 2720 2720 { 2721 - int reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx; 2721 + int reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx; 2722 2722 2723 2723 snd_soc_component_write(component, reg, (value & 0xFF)); 2724 2724 snd_soc_component_write(component, reg, (value >> 8) & 0xFF); ··· 2739 2739 int iir_idx = ctl->iir_idx; 2740 2740 int band_idx = ctl->band_idx; 2741 2741 u32 coeff[BAND_MAX]; 2742 - int reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx; 2742 + int reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx; 2743 2743 2744 2744 memcpy(&coeff[0], ucontrol->value.bytes.data, params->max); 2745 2745
+2 -1
sound/soc/codecs/max9759.c
··· 64 64 struct snd_soc_component *c = snd_soc_kcontrol_component(kcontrol); 65 65 struct max9759 *priv = snd_soc_component_get_drvdata(c); 66 66 67 - if (ucontrol->value.integer.value[0] > 3) 67 + if (ucontrol->value.integer.value[0] < 0 || 68 + ucontrol->value.integer.value[0] > 3) 68 69 return -EINVAL; 69 70 70 71 priv->gain = ucontrol->value.integer.value[0];
+4 -11
sound/soc/codecs/rt5682-i2c.c
··· 59 59 struct rt5682_priv *rt5682 = container_of(work, struct rt5682_priv, 60 60 jd_check_work.work); 61 61 62 - if (snd_soc_component_read(rt5682->component, RT5682_AJD1_CTRL) 63 - & RT5682_JDH_RS_MASK) { 62 + if (snd_soc_component_read(rt5682->component, RT5682_AJD1_CTRL) & RT5682_JDH_RS_MASK) 64 63 /* jack out */ 65 - rt5682->jack_type = rt5682_headset_detect(rt5682->component, 0); 66 - 67 - snd_soc_jack_report(rt5682->hs_jack, rt5682->jack_type, 68 - SND_JACK_HEADSET | 69 - SND_JACK_BTN_0 | SND_JACK_BTN_1 | 70 - SND_JACK_BTN_2 | SND_JACK_BTN_3); 71 - } else { 64 + mod_delayed_work(system_power_efficient_wq, 65 + &rt5682->jack_detect_work, 0); 66 + else 72 67 schedule_delayed_work(&rt5682->jd_check_work, 500); 73 - } 74 68 } 75 69 76 70 static irqreturn_t rt5682_irq(int irq, void *data) ··· 192 198 } 193 199 194 200 mutex_init(&rt5682->calibrate_mutex); 195 - mutex_init(&rt5682->jdet_mutex); 196 201 rt5682_calibrate(rt5682); 197 202 198 203 rt5682_apply_patch_list(rt5682, &i2c->dev);
+8 -16
sound/soc/codecs/rt5682.c
··· 922 922 * 923 923 * Returns detect status. 924 924 */ 925 - int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert) 925 + static int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert) 926 926 { 927 927 struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 928 928 struct snd_soc_dapm_context *dapm = &component->dapm; 929 929 unsigned int val, count; 930 930 931 931 if (jack_insert) { 932 - snd_soc_dapm_mutex_lock(dapm); 933 - 934 932 snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 935 933 RT5682_PWR_VREF2 | RT5682_PWR_MB, 936 934 RT5682_PWR_VREF2 | RT5682_PWR_MB); ··· 979 981 snd_soc_component_update_bits(component, RT5682_MICBIAS_2, 980 982 RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK, 981 983 RT5682_PWR_CLK25M_PU | RT5682_PWR_CLK1M_PU); 982 - 983 - snd_soc_dapm_mutex_unlock(dapm); 984 984 } else { 985 985 rt5682_enable_push_button_irq(component, false); 986 986 snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, ··· 1007 1011 dev_dbg(component->dev, "jack_type = %d\n", rt5682->jack_type); 1008 1012 return rt5682->jack_type; 1009 1013 } 1010 - EXPORT_SYMBOL_GPL(rt5682_headset_detect); 1011 1014 1012 1015 static int rt5682_set_jack_detect(struct snd_soc_component *component, 1013 1016 struct snd_soc_jack *hs_jack, void *data) ··· 1089 1094 { 1090 1095 struct rt5682_priv *rt5682 = 1091 1096 container_of(work, struct rt5682_priv, jack_detect_work.work); 1097 + struct snd_soc_dapm_context *dapm; 1092 1098 int val, btn_type; 1093 1099 1094 1100 while (!rt5682->component) ··· 1098 1102 while (!rt5682->component->card->instantiated) 1099 1103 usleep_range(10000, 15000); 1100 1104 1101 - mutex_lock(&rt5682->jdet_mutex); 1105 + dapm = snd_soc_component_get_dapm(rt5682->component); 1106 + 1107 + snd_soc_dapm_mutex_lock(dapm); 1102 1108 mutex_lock(&rt5682->calibrate_mutex); 1103 1109 1104 1110 val = snd_soc_component_read(rt5682->component, RT5682_AJD1_CTRL) ··· 1160 1162 rt5682->irq_work_delay_time = 50; 1161 1163 } 1162 1164 1165 + mutex_unlock(&rt5682->calibrate_mutex); 1166 + snd_soc_dapm_mutex_unlock(dapm); 1167 + 1163 1168 snd_soc_jack_report(rt5682->hs_jack, rt5682->jack_type, 1164 1169 SND_JACK_HEADSET | 1165 1170 SND_JACK_BTN_0 | SND_JACK_BTN_1 | ··· 1175 1174 else 1176 1175 cancel_delayed_work_sync(&rt5682->jd_check_work); 1177 1176 } 1178 - 1179 - mutex_unlock(&rt5682->calibrate_mutex); 1180 - mutex_unlock(&rt5682->jdet_mutex); 1181 1177 } 1182 1178 EXPORT_SYMBOL_GPL(rt5682_jack_detect_handler); 1183 1179 ··· 1524 1526 { 1525 1527 struct snd_soc_component *component = 1526 1528 snd_soc_dapm_to_component(w->dapm); 1527 - struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 1528 1529 1529 1530 switch (event) { 1530 1531 case SND_SOC_DAPM_PRE_PMU: ··· 1535 1538 RT5682_DEPOP_1, 0x60, 0x60); 1536 1539 snd_soc_component_update_bits(component, 1537 1540 RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0080); 1538 - 1539 - mutex_lock(&rt5682->jdet_mutex); 1540 - 1541 1541 snd_soc_component_update_bits(component, RT5682_HP_CTRL_2, 1542 1542 RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN, 1543 1543 RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN); 1544 1544 usleep_range(5000, 10000); 1545 1545 snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1, 1546 1546 RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_L); 1547 - 1548 - mutex_unlock(&rt5682->jdet_mutex); 1549 1547 break; 1550 1548 1551 1549 case SND_SOC_DAPM_POST_PMD:
-2
sound/soc/codecs/rt5682.h
··· 1463 1463 1464 1464 int jack_type; 1465 1465 int irq_work_delay_time; 1466 - struct mutex jdet_mutex; 1467 1466 }; 1468 1467 1469 1468 extern const char *rt5682_supply_names[RT5682_NUM_SUPPLIES]; ··· 1472 1473 1473 1474 void rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev); 1474 1475 1475 - int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert); 1476 1476 void rt5682_jack_detect_handler(struct work_struct *work); 1477 1477 1478 1478 bool rt5682_volatile_register(struct device *dev, unsigned int reg);
+19 -16
sound/soc/codecs/wcd938x.c
··· 1432 1432 return 0; 1433 1433 } 1434 1434 1435 - static int wcd938x_connect_port(struct wcd938x_sdw_priv *wcd, u8 ch_id, u8 enable) 1435 + static int wcd938x_connect_port(struct wcd938x_sdw_priv *wcd, u8 port_num, u8 ch_id, u8 enable) 1436 1436 { 1437 - u8 port_num; 1438 - 1439 - port_num = wcd->ch_info[ch_id].port_num; 1440 - 1441 1437 return wcd938x_sdw_connect_port(&wcd->ch_info[ch_id], 1442 - &wcd->port_config[port_num], 1438 + &wcd->port_config[port_num - 1], 1443 1439 enable); 1444 1440 } 1445 1441 ··· 2559 2563 WCD938X_EAR_GAIN_MASK, 2560 2564 ucontrol->value.integer.value[0]); 2561 2565 2562 - return 0; 2566 + return 1; 2563 2567 } 2564 2568 2565 2569 static int wcd938x_get_compander(struct snd_kcontrol *kcontrol, ··· 2589 2593 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2590 2594 struct wcd938x_sdw_priv *wcd; 2591 2595 int value = ucontrol->value.integer.value[0]; 2596 + int portidx; 2592 2597 struct soc_mixer_control *mc; 2593 2598 bool hphr; 2594 2599 ··· 2603 2606 else 2604 2607 wcd938x->comp1_enable = value; 2605 2608 2606 - if (value) 2607 - wcd938x_connect_port(wcd, mc->reg, true); 2608 - else 2609 - wcd938x_connect_port(wcd, mc->reg, false); 2609 + portidx = wcd->ch_info[mc->reg].port_num; 2610 2610 2611 - return 0; 2611 + if (value) 2612 + wcd938x_connect_port(wcd, portidx, mc->reg, true); 2613 + else 2614 + wcd938x_connect_port(wcd, portidx, mc->reg, false); 2615 + 2616 + return 1; 2612 2617 } 2613 2618 2614 2619 static int wcd938x_ldoh_get(struct snd_kcontrol *kcontrol, ··· 2881 2882 struct wcd938x_sdw_priv *wcd; 2882 2883 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; 2883 2884 int dai_id = mixer->shift; 2884 - int portidx = mixer->reg; 2885 + int portidx, ch_idx = mixer->reg; 2886 + 2885 2887 2886 2888 wcd = wcd938x->sdw_priv[dai_id]; 2889 + portidx = wcd->ch_info[ch_idx].port_num; 2887 2890 2888 2891 ucontrol->value.integer.value[0] = wcd->port_enable[portidx]; 2889 2892 ··· 2900 2899 struct wcd938x_sdw_priv *wcd; 2901 2900 struct soc_mixer_control *mixer = 2902 2901 (struct soc_mixer_control *)kcontrol->private_value; 2903 - int portidx = mixer->reg; 2902 + int ch_idx = mixer->reg; 2903 + int portidx; 2904 2904 int dai_id = mixer->shift; 2905 2905 bool enable; 2906 2906 2907 2907 wcd = wcd938x->sdw_priv[dai_id]; 2908 2908 2909 + portidx = wcd->ch_info[ch_idx].port_num; 2909 2910 if (ucontrol->value.integer.value[0]) 2910 2911 enable = true; 2911 2912 else ··· 2915 2912 2916 2913 wcd->port_enable[portidx] = enable; 2917 2914 2918 - wcd938x_connect_port(wcd, portidx, enable); 2915 + wcd938x_connect_port(wcd, portidx, ch_idx, enable); 2919 2916 2920 - return 0; 2917 + return 1; 2921 2918 2922 2919 } 2923 2920
+8 -3
sound/soc/fsl/pcm030-audio-fabric.c
··· 93 93 dev_err(&op->dev, "platform_device_alloc() failed\n"); 94 94 95 95 ret = platform_device_add(pdata->codec_device); 96 - if (ret) 96 + if (ret) { 97 97 dev_err(&op->dev, "platform_device_add() failed: %d\n", ret); 98 + platform_device_put(pdata->codec_device); 99 + } 98 100 99 101 ret = snd_soc_register_card(card); 100 - if (ret) 102 + if (ret) { 101 103 dev_err(&op->dev, "snd_soc_register_card() failed: %d\n", ret); 104 + platform_device_del(pdata->codec_device); 105 + platform_device_put(pdata->codec_device); 106 + } 102 107 103 108 platform_set_drvdata(op, pdata); 104 - 105 109 return ret; 110 + 106 111 } 107 112 108 113 static int pcm030_fabric_remove(struct platform_device *op)
+25 -1
sound/soc/generic/simple-card.c
··· 28 28 .hw_params = asoc_simple_hw_params, 29 29 }; 30 30 31 + static int asoc_simple_parse_platform(struct device_node *node, 32 + struct snd_soc_dai_link_component *dlc) 33 + { 34 + struct of_phandle_args args; 35 + int ret; 36 + 37 + if (!node) 38 + return 0; 39 + 40 + /* 41 + * Get node via "sound-dai = <&phandle port>" 42 + * it will be used as xxx_of_node on soc_bind_dai_link() 43 + */ 44 + ret = of_parse_phandle_with_args(node, DAI, CELL, 0, &args); 45 + if (ret) 46 + return ret; 47 + 48 + /* dai_name is not required and may not exist for plat component */ 49 + 50 + dlc->of_node = args.np; 51 + 52 + return 0; 53 + } 54 + 31 55 static int asoc_simple_parse_dai(struct device_node *node, 32 56 struct snd_soc_dai_link_component *dlc, 33 57 int *is_single_link) ··· 313 289 if (ret < 0) 314 290 goto dai_link_of_err; 315 291 316 - ret = asoc_simple_parse_dai(plat, platforms, NULL); 292 + ret = asoc_simple_parse_platform(plat, platforms); 317 293 if (ret < 0) 318 294 goto dai_link_of_err; 319 295
+1 -1
sound/soc/mediatek/Kconfig
··· 216 216 217 217 config SND_SOC_MT8195_MT6359_RT1011_RT5682 218 218 tristate "ASoC Audio driver for MT8195 with MT6359 RT1011 RT5682 codec" 219 - depends on I2C 219 + depends on I2C && GPIOLIB 220 220 depends on SND_SOC_MT8195 && MTK_PMIC_WRAP 221 221 select SND_SOC_MT6359 222 222 select SND_SOC_RT1011
+5 -2
sound/soc/qcom/qdsp6/q6apm-dai.c
··· 308 308 struct snd_pcm_runtime *runtime = substream->runtime; 309 309 struct q6apm_dai_rtd *prtd = runtime->private_data; 310 310 311 - q6apm_graph_stop(prtd->graph); 312 - q6apm_unmap_memory_regions(prtd->graph, substream->stream); 311 + if (prtd->state) { /* only stop graph that is started */ 312 + q6apm_graph_stop(prtd->graph); 313 + q6apm_unmap_memory_regions(prtd->graph, substream->stream); 314 + } 315 + 313 316 q6apm_graph_close(prtd->graph); 314 317 prtd->graph = NULL; 315 318 kfree(prtd);
+2 -5
sound/soc/soc-acpi.c
··· 55 55 static acpi_status snd_soc_acpi_find_package(acpi_handle handle, u32 level, 56 56 void *context, void **ret) 57 57 { 58 - struct acpi_device *adev; 58 + struct acpi_device *adev = acpi_fetch_acpi_dev(handle); 59 59 acpi_status status; 60 60 struct snd_soc_acpi_package_context *pkg_ctx = context; 61 61 62 62 pkg_ctx->data_valid = false; 63 63 64 - if (acpi_bus_get_device(handle, &adev)) 65 - return AE_OK; 66 - 67 - if (adev->status.present && adev->status.functional) { 64 + if (adev && adev->status.present && adev->status.functional) { 68 65 struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; 69 66 union acpi_object *myobj = NULL; 70 67
+26 -3
sound/soc/soc-ops.c
··· 316 316 if (sign_bit) 317 317 mask = BIT(sign_bit + 1) - 1; 318 318 319 - val = ((ucontrol->value.integer.value[0] + min) & mask); 319 + if (ucontrol->value.integer.value[0] < 0) 320 + return -EINVAL; 321 + val = ucontrol->value.integer.value[0]; 322 + if (mc->platform_max && val > mc->platform_max) 323 + return -EINVAL; 324 + if (val > max - min) 325 + return -EINVAL; 326 + val = (val + min) & mask; 320 327 if (invert) 321 328 val = max - val; 322 329 val_mask = mask << shift; 323 330 val = val << shift; 324 331 if (snd_soc_volsw_is_stereo(mc)) { 325 - val2 = ((ucontrol->value.integer.value[1] + min) & mask); 332 + if (ucontrol->value.integer.value[1] < 0) 333 + return -EINVAL; 334 + val2 = ucontrol->value.integer.value[1]; 335 + if (mc->platform_max && val2 > mc->platform_max) 336 + return -EINVAL; 337 + if (val2 > max - min) 338 + return -EINVAL; 339 + val2 = (val2 + min) & mask; 326 340 if (invert) 327 341 val2 = max - val2; 328 342 if (reg == reg2) { ··· 423 409 int err = 0; 424 410 unsigned int val, val_mask; 425 411 412 + if (ucontrol->value.integer.value[0] < 0) 413 + return -EINVAL; 414 + val = ucontrol->value.integer.value[0]; 415 + if (mc->platform_max && val > mc->platform_max) 416 + return -EINVAL; 417 + if (val > max - min) 418 + return -EINVAL; 426 419 val_mask = mask << shift; 427 - val = (ucontrol->value.integer.value[0] + min) & mask; 420 + val = (val + min) & mask; 428 421 val = val << shift; 429 422 430 423 err = snd_soc_component_update_bits(component, reg, val_mask, val); ··· 879 858 long val = ucontrol->value.integer.value[0]; 880 859 unsigned int i; 881 860 861 + if (val < mc->min || val > mc->max) 862 + return -EINVAL; 882 863 if (invert) 883 864 val = max - val; 884 865 val &= mask;
+13 -7
sound/soc/soc-pcm.c
··· 46 46 snd_pcm_stream_lock_irq(snd_soc_dpcm_get_substream(rtd, stream)); 47 47 } 48 48 49 - #define snd_soc_dpcm_stream_lock_irqsave(rtd, stream, flags) \ 50 - snd_pcm_stream_lock_irqsave(snd_soc_dpcm_get_substream(rtd, stream), flags) 49 + #define snd_soc_dpcm_stream_lock_irqsave_nested(rtd, stream, flags) \ 50 + snd_pcm_stream_lock_irqsave_nested(snd_soc_dpcm_get_substream(rtd, stream), flags) 51 51 52 52 static inline void snd_soc_dpcm_stream_unlock_irq(struct snd_soc_pcm_runtime *rtd, 53 53 int stream) ··· 1268 1268 void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream) 1269 1269 { 1270 1270 struct snd_soc_dpcm *dpcm, *d; 1271 + LIST_HEAD(deleted_dpcms); 1271 1272 1272 1273 snd_soc_dpcm_mutex_assert_held(fe); 1273 1274 ··· 1288 1287 /* BEs still alive need new FE */ 1289 1288 dpcm_be_reparent(fe, dpcm->be, stream); 1290 1289 1291 - dpcm_remove_debugfs_state(dpcm); 1292 - 1293 1290 list_del(&dpcm->list_be); 1294 - list_del(&dpcm->list_fe); 1295 - kfree(dpcm); 1291 + list_move(&dpcm->list_fe, &deleted_dpcms); 1296 1292 } 1297 1293 snd_soc_dpcm_stream_unlock_irq(fe, stream); 1294 + 1295 + while (!list_empty(&deleted_dpcms)) { 1296 + dpcm = list_first_entry(&deleted_dpcms, struct snd_soc_dpcm, 1297 + list_fe); 1298 + list_del(&dpcm->list_fe); 1299 + dpcm_remove_debugfs_state(dpcm); 1300 + kfree(dpcm); 1301 + } 1298 1302 } 1299 1303 1300 1304 /* get BE for DAI widget and stream */ ··· 2100 2094 be = dpcm->be; 2101 2095 be_substream = snd_soc_dpcm_get_substream(be, stream); 2102 2096 2103 - snd_soc_dpcm_stream_lock_irqsave(be, stream, flags); 2097 + snd_soc_dpcm_stream_lock_irqsave_nested(be, stream, flags); 2104 2098 2105 2099 /* is this op for this BE ? */ 2106 2100 if (!snd_soc_dpcm_be_can_update(fe, be, stream))
+24 -3
sound/soc/xilinx/xlnx_formatter_pcm.c
··· 37 37 #define XLNX_AUD_XFER_COUNT 0x28 38 38 #define XLNX_AUD_CH_STS_START 0x2C 39 39 #define XLNX_BYTES_PER_CH 0x44 40 + #define XLNX_AUD_ALIGN_BYTES 64 40 41 41 42 #define AUD_STS_IOC_IRQ_MASK BIT(31) 42 43 #define AUD_STS_CH_STS_MASK BIT(29) ··· 369 368 snd_soc_set_runtime_hwparams(substream, &xlnx_pcm_hardware); 370 369 runtime->private_data = stream_data; 371 370 372 - /* Resize the period size divisible by 64 */ 371 + /* Resize the period bytes as divisible by 64 */ 373 372 err = snd_pcm_hw_constraint_step(runtime, 0, 374 - SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 64); 373 + SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 374 + XLNX_AUD_ALIGN_BYTES); 375 375 if (err) { 376 376 dev_err(component->dev, 377 - "unable to set constraint on period bytes\n"); 377 + "Unable to set constraint on period bytes\n"); 378 + return err; 379 + } 380 + 381 + /* Resize the buffer bytes as divisible by 64 */ 382 + err = snd_pcm_hw_constraint_step(runtime, 0, 383 + SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 384 + XLNX_AUD_ALIGN_BYTES); 385 + if (err) { 386 + dev_err(component->dev, 387 + "Unable to set constraint on buffer bytes\n"); 388 + return err; 389 + } 390 + 391 + /* Set periods as integer multiple */ 392 + err = snd_pcm_hw_constraint_integer(runtime, 393 + SNDRV_PCM_HW_PARAM_PERIODS); 394 + if (err < 0) { 395 + dev_err(component->dev, 396 + "Unable to set constraint on periods to be integer\n"); 378 397 return err; 379 398 } 380 399
+4
sound/usb/mixer.c
··· 1527 1527 usb_audio_err(chip, 1528 1528 "cannot get connectors status: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n", 1529 1529 UAC_GET_CUR, validx, idx, cval->val_type); 1530 + 1531 + if (val) 1532 + *val = 0; 1533 + 1530 1534 return filter_error(cval, ret); 1531 1535 } 1532 1536
+1 -1
sound/usb/quirks-table.h
··· 84 84 * combination. 85 85 */ 86 86 { 87 - USB_DEVICE(0x041e, 0x4095), 87 + USB_AUDIO_DEVICE(0x041e, 0x4095), 88 88 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { 89 89 .ifnum = QUIRK_ANY_INTERFACE, 90 90 .type = QUIRK_COMPOSITE,
+2
tools/arch/x86/include/asm/cpufeatures.h
··· 299 299 /* Intel-defined CPU features, CPUID level 0x00000007:1 (EAX), word 12 */ 300 300 #define X86_FEATURE_AVX_VNNI (12*32+ 4) /* AVX VNNI instructions */ 301 301 #define X86_FEATURE_AVX512_BF16 (12*32+ 5) /* AVX512 BFLOAT16 instructions */ 302 + #define X86_FEATURE_AMX_BF16 (18*32+22) /* AMX bf16 Support */ 302 303 #define X86_FEATURE_AMX_TILE (18*32+24) /* AMX tile Support */ 304 + #define X86_FEATURE_AMX_INT8 (18*32+25) /* AMX int8 Support */ 303 305 304 306 /* AMD-defined CPU features, CPUID level 0x80000008 (EBX), word 13 */ 305 307 #define X86_FEATURE_CLZERO (13*32+ 0) /* CLZERO instruction */
+3 -3
tools/include/uapi/linux/kvm.h
··· 1624 1624 #define KVM_S390_NORMAL_RESET _IO(KVMIO, 0xc3) 1625 1625 #define KVM_S390_CLEAR_RESET _IO(KVMIO, 0xc4) 1626 1626 1627 - /* Available with KVM_CAP_XSAVE2 */ 1628 - #define KVM_GET_XSAVE2 _IOR(KVMIO, 0xcf, struct kvm_xsave) 1629 - 1630 1627 struct kvm_s390_pv_sec_parm { 1631 1628 __u64 origin; 1632 1629 __u64 length; ··· 2044 2047 }; 2045 2048 2046 2049 #define KVM_GET_STATS_FD _IO(KVMIO, 0xce) 2050 + 2051 + /* Available with KVM_CAP_XSAVE2 */ 2052 + #define KVM_GET_XSAVE2 _IOR(KVMIO, 0xcf, struct kvm_xsave) 2047 2053 2048 2054 #endif /* __LINUX_KVM_H */
+3 -3
tools/include/uapi/linux/perf_event.h
··· 1332 1332 1333 1333 /* hop level */ 1334 1334 #define PERF_MEM_HOPS_0 0x01 /* remote core, same node */ 1335 - #define PERF_MEM_HOPS_1 0x02 /* remote node, same socket */ 1336 - #define PERF_MEM_HOPS_2 0x03 /* remote socket, same board */ 1337 - #define PERF_MEM_HOPS_3 0x04 /* remote board */ 1335 + #define PERF_MEM_HOPS_1 0x02 /* remote node, same socket */ 1336 + #define PERF_MEM_HOPS_2 0x03 /* remote socket, same board */ 1337 + #define PERF_MEM_HOPS_3 0x04 /* remote board */ 1338 1338 /* 5-7 available */ 1339 1339 #define PERF_MEM_HOPS_SHIFT 43 1340 1340
+3
tools/include/uapi/linux/prctl.h
··· 272 272 # define PR_SCHED_CORE_SCOPE_THREAD_GROUP 1 273 273 # define PR_SCHED_CORE_SCOPE_PROCESS_GROUP 2 274 274 275 + #define PR_SET_VMA 0x53564d41 276 + # define PR_SET_VMA_ANON_NAME 0 277 + 275 278 #endif /* _LINUX_PRCTL_H */
+9 -2
tools/include/uapi/sound/asound.h
··· 56 56 * * 57 57 ****************************************************************************/ 58 58 59 + #define AES_IEC958_STATUS_SIZE 24 60 + 59 61 struct snd_aes_iec958 { 60 - unsigned char status[24]; /* AES/IEC958 channel status bits */ 62 + unsigned char status[AES_IEC958_STATUS_SIZE]; /* AES/IEC958 channel status bits */ 61 63 unsigned char subcode[147]; /* AES/IEC958 subcode bits */ 62 64 unsigned char pad; /* nothing */ 63 65 unsigned char dig_subframe[4]; /* AES/IEC958 subframe bits */ ··· 204 202 #define SNDRV_PCM_FORMAT_S24_BE ((__force snd_pcm_format_t) 7) /* low three bytes */ 205 203 #define SNDRV_PCM_FORMAT_U24_LE ((__force snd_pcm_format_t) 8) /* low three bytes */ 206 204 #define SNDRV_PCM_FORMAT_U24_BE ((__force snd_pcm_format_t) 9) /* low three bytes */ 205 + /* 206 + * For S32/U32 formats, 'msbits' hardware parameter is often used to deliver information about the 207 + * available bit count in most significant bit. It's for the case of so-called 'left-justified' or 208 + * `right-padding` sample which has less width than 32 bit. 209 + */ 207 210 #define SNDRV_PCM_FORMAT_S32_LE ((__force snd_pcm_format_t) 10) 208 211 #define SNDRV_PCM_FORMAT_S32_BE ((__force snd_pcm_format_t) 11) 209 212 #define SNDRV_PCM_FORMAT_U32_LE ((__force snd_pcm_format_t) 12) ··· 307 300 #define SNDRV_PCM_INFO_HAS_LINK_ESTIMATED_ATIME 0x04000000 /* report estimated link audio time */ 308 301 #define SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME 0x08000000 /* report synchronized audio/system time */ 309 302 #define SNDRV_PCM_INFO_EXPLICIT_SYNC 0x10000000 /* needs explicit sync of pointers and data */ 310 - 303 + #define SNDRV_PCM_INFO_NO_REWINDS 0x20000000 /* hardware can only support monotonic changes of appl_ptr */ 311 304 #define SNDRV_PCM_INFO_DRAIN_TRIGGER 0x40000000 /* internal kernel flag - trigger in drain */ 312 305 #define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000 /* internal kernel flag - FIFO size is in frames */ 313 306
+98
tools/lib/perf/mmap.c
··· 13 13 #include <internal/lib.h> 14 14 #include <linux/kernel.h> 15 15 #include <linux/math64.h> 16 + #include <linux/stringify.h> 16 17 #include "internal.h" 17 18 18 19 void perf_mmap__init(struct perf_mmap *map, struct perf_mmap *prev, ··· 295 294 296 295 return low | ((u64)high) << 32; 297 296 } 297 + #elif defined(__aarch64__) 298 + #define read_sysreg(r) ({ \ 299 + u64 __val; \ 300 + asm volatile("mrs %0, " __stringify(r) : "=r" (__val)); \ 301 + __val; \ 302 + }) 303 + 304 + static u64 read_pmccntr(void) 305 + { 306 + return read_sysreg(pmccntr_el0); 307 + } 308 + 309 + #define PMEVCNTR_READ(idx) \ 310 + static u64 read_pmevcntr_##idx(void) { \ 311 + return read_sysreg(pmevcntr##idx##_el0); \ 312 + } 313 + 314 + PMEVCNTR_READ(0); 315 + PMEVCNTR_READ(1); 316 + PMEVCNTR_READ(2); 317 + PMEVCNTR_READ(3); 318 + PMEVCNTR_READ(4); 319 + PMEVCNTR_READ(5); 320 + PMEVCNTR_READ(6); 321 + PMEVCNTR_READ(7); 322 + PMEVCNTR_READ(8); 323 + PMEVCNTR_READ(9); 324 + PMEVCNTR_READ(10); 325 + PMEVCNTR_READ(11); 326 + PMEVCNTR_READ(12); 327 + PMEVCNTR_READ(13); 328 + PMEVCNTR_READ(14); 329 + PMEVCNTR_READ(15); 330 + PMEVCNTR_READ(16); 331 + PMEVCNTR_READ(17); 332 + PMEVCNTR_READ(18); 333 + PMEVCNTR_READ(19); 334 + PMEVCNTR_READ(20); 335 + PMEVCNTR_READ(21); 336 + PMEVCNTR_READ(22); 337 + PMEVCNTR_READ(23); 338 + PMEVCNTR_READ(24); 339 + PMEVCNTR_READ(25); 340 + PMEVCNTR_READ(26); 341 + PMEVCNTR_READ(27); 342 + PMEVCNTR_READ(28); 343 + PMEVCNTR_READ(29); 344 + PMEVCNTR_READ(30); 345 + 346 + /* 347 + * Read a value direct from PMEVCNTR<idx> 348 + */ 349 + static u64 read_perf_counter(unsigned int counter) 350 + { 351 + static u64 (* const read_f[])(void) = { 352 + read_pmevcntr_0, 353 + read_pmevcntr_1, 354 + read_pmevcntr_2, 355 + read_pmevcntr_3, 356 + read_pmevcntr_4, 357 + read_pmevcntr_5, 358 + read_pmevcntr_6, 359 + read_pmevcntr_7, 360 + read_pmevcntr_8, 361 + read_pmevcntr_9, 362 + read_pmevcntr_10, 363 + read_pmevcntr_11, 364 + read_pmevcntr_13, 365 + read_pmevcntr_12, 366 + read_pmevcntr_14, 367 + read_pmevcntr_15, 368 + read_pmevcntr_16, 369 + read_pmevcntr_17, 370 + read_pmevcntr_18, 371 + read_pmevcntr_19, 372 + read_pmevcntr_20, 373 + read_pmevcntr_21, 374 + read_pmevcntr_22, 375 + read_pmevcntr_23, 376 + read_pmevcntr_24, 377 + read_pmevcntr_25, 378 + read_pmevcntr_26, 379 + read_pmevcntr_27, 380 + read_pmevcntr_28, 381 + read_pmevcntr_29, 382 + read_pmevcntr_30, 383 + read_pmccntr 384 + }; 385 + 386 + if (counter < ARRAY_SIZE(read_f)) 387 + return (read_f[counter])(); 388 + 389 + return 0; 390 + } 391 + 392 + static u64 read_timestamp(void) { return read_sysreg(cntvct_el0); } 393 + 298 394 #else 299 395 static u64 read_perf_counter(unsigned int counter __maybe_unused) { return 0; } 300 396 static u64 read_timestamp(void) { return 0; }
+4 -1
tools/lib/perf/tests/test-evsel.c
··· 130 130 struct perf_event_attr attr = { 131 131 .type = PERF_TYPE_HARDWARE, 132 132 .config = event, 133 + #ifdef __aarch64__ 134 + .config1 = 0x2, /* Request user access */ 135 + #endif 133 136 }; 134 137 int err, i; 135 138 ··· 153 150 pc = perf_evsel__mmap_base(evsel, 0, 0); 154 151 __T("failed to get mmapped address", pc); 155 152 156 - #if defined(__i386__) || defined(__x86_64__) 153 + #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) 157 154 __T("userspace counter access not supported", pc->cap_user_rdpmc); 158 155 __T("userspace counter access not enabled", pc->index); 159 156 __T("userspace counter width not set", pc->pmc_width >= 32);
+1 -1
tools/objtool/check.c
··· 2854 2854 2855 2855 static inline const char *call_dest_name(struct instruction *insn) 2856 2856 { 2857 - static char pvname[16]; 2857 + static char pvname[19]; 2858 2858 struct reloc *rel; 2859 2859 int idx; 2860 2860
+24 -21
tools/perf/builtin-ftrace.c
··· 1115 1115 int cmd_ftrace(int argc, const char **argv) 1116 1116 { 1117 1117 int ret; 1118 + int (*cmd_func)(struct perf_ftrace *) = NULL; 1118 1119 struct perf_ftrace ftrace = { 1119 1120 .tracer = DEFAULT_TRACER, 1120 1121 .target = { .uid = UINT_MAX, }, ··· 1222 1221 goto out_delete_filters; 1223 1222 } 1224 1223 1224 + switch (subcmd) { 1225 + case PERF_FTRACE_TRACE: 1226 + if (!argc && target__none(&ftrace.target)) 1227 + ftrace.target.system_wide = true; 1228 + cmd_func = __cmd_ftrace; 1229 + break; 1230 + case PERF_FTRACE_LATENCY: 1231 + if (list_empty(&ftrace.filters)) { 1232 + pr_err("Should provide a function to measure\n"); 1233 + parse_options_usage(ftrace_usage, options, "T", 1); 1234 + ret = -EINVAL; 1235 + goto out_delete_filters; 1236 + } 1237 + cmd_func = __cmd_latency; 1238 + break; 1239 + case PERF_FTRACE_NONE: 1240 + default: 1241 + pr_err("Invalid subcommand\n"); 1242 + ret = -EINVAL; 1243 + goto out_delete_filters; 1244 + } 1245 + 1225 1246 ret = target__validate(&ftrace.target); 1226 1247 if (ret) { 1227 1248 char errbuf[512]; ··· 1271 1248 goto out_delete_evlist; 1272 1249 } 1273 1250 1274 - switch (subcmd) { 1275 - case PERF_FTRACE_TRACE: 1276 - if (!argc && target__none(&ftrace.target)) 1277 - ftrace.target.system_wide = true; 1278 - ret = __cmd_ftrace(&ftrace); 1279 - break; 1280 - case PERF_FTRACE_LATENCY: 1281 - if (list_empty(&ftrace.filters)) { 1282 - pr_err("Should provide a function to measure\n"); 1283 - parse_options_usage(ftrace_usage, options, "T", 1); 1284 - ret = -EINVAL; 1285 - goto out_delete_evlist; 1286 - } 1287 - ret = __cmd_latency(&ftrace); 1288 - break; 1289 - case PERF_FTRACE_NONE: 1290 - default: 1291 - pr_err("Invalid subcommand\n"); 1292 - ret = -EINVAL; 1293 - break; 1294 - } 1251 + ret = cmd_func(&ftrace); 1295 1252 1296 1253 out_delete_evlist: 1297 1254 evlist__delete(ftrace.evlist);
+1 -1
tools/perf/trace/beauty/prctl_option.sh
··· 4 4 [ $# -eq 1 ] && header_dir=$1 || header_dir=tools/include/uapi/linux/ 5 5 6 6 printf "static const char *prctl_options[] = {\n" 7 - regex='^#define[[:space:]]+PR_(\w+)[[:space:]]*([[:xdigit:]]+).*' 7 + regex='^#define[[:space:]]{1}PR_(\w+)[[:space:]]*([[:xdigit:]]+)([[:space:]]*\/.*)?$' 8 8 egrep $regex ${header_dir}/prctl.h | grep -v PR_SET_PTRACER | \ 9 9 sed -r "s/$regex/\2 \1/g" | \ 10 10 sort -n | xargs printf "\t[%s] = \"%s\",\n"
+1
tools/perf/util/annotate.c
··· 2036 2036 memset(&objdump_process, 0, sizeof(objdump_process)); 2037 2037 objdump_process.argv = objdump_argv; 2038 2038 objdump_process.out = -1; 2039 + objdump_process.err = -1; 2039 2040 if (start_command(&objdump_process)) { 2040 2041 pr_err("Failure starting to run %s\n", command); 2041 2042 err = -1;
+1 -1
tools/perf/util/bpf_counter_cgroup.c
··· 266 266 idx = evsel->core.idx; 267 267 err = bpf_map_lookup_elem(reading_map_fd, &idx, values); 268 268 if (err) { 269 - pr_err("bpf map lookup falied: idx=%u, event=%s, cgrp=%s\n", 269 + pr_err("bpf map lookup failed: idx=%u, event=%s, cgrp=%s\n", 270 270 idx, evsel__name(evsel), evsel->cgrp->name); 271 271 goto out; 272 272 }
+2
tools/perf/util/machine.c
··· 2073 2073 2074 2074 ams->addr = ip; 2075 2075 ams->al_addr = al.addr; 2076 + ams->al_level = al.level; 2076 2077 ams->ms.maps = al.maps; 2077 2078 ams->ms.sym = al.sym; 2078 2079 ams->ms.map = al.map; ··· 2093 2092 2094 2093 ams->addr = addr; 2095 2094 ams->al_addr = al.addr; 2095 + ams->al_level = al.level; 2096 2096 ams->ms.maps = al.maps; 2097 2097 ams->ms.sym = al.sym; 2098 2098 ams->ms.map = al.map;
+1
tools/perf/util/map_symbol.h
··· 18 18 struct map_symbol ms; 19 19 u64 addr; 20 20 u64 al_addr; 21 + char al_level; 21 22 u64 phys_addr; 22 23 u64 data_page_size; 23 24 };
+1 -1
tools/perf/util/perf_event_attr_fprintf.c
··· 52 52 bit_name(ABORT_TX), bit_name(IN_TX), bit_name(NO_TX), 53 53 bit_name(COND), bit_name(CALL_STACK), bit_name(IND_JUMP), 54 54 bit_name(CALL), bit_name(NO_FLAGS), bit_name(NO_CYCLES), 55 - bit_name(HW_INDEX), 55 + bit_name(TYPE_SAVE), bit_name(HW_INDEX), 56 56 { .name = NULL, } 57 57 }; 58 58 #undef bit_name
+2 -1
tools/perf/util/session.c
··· 1503 1503 ++evlist->stats.nr_unknown_id; 1504 1504 return 0; 1505 1505 } 1506 - dump_sample(evsel, event, sample, perf_env__arch(machine->env)); 1507 1506 if (machine == NULL) { 1508 1507 ++evlist->stats.nr_unprocessable_samples; 1508 + dump_sample(evsel, event, sample, perf_env__arch(NULL)); 1509 1509 return 0; 1510 1510 } 1511 + dump_sample(evsel, event, sample, perf_env__arch(machine->env)); 1511 1512 return evlist__deliver_sample(evlist, tool, event, sample, evsel, machine); 1512 1513 case PERF_RECORD_MMAP: 1513 1514 return tool->mmap(tool, event, sample, machine);
+2 -2
tools/perf/util/sort.c
··· 915 915 struct addr_map_symbol *from = &he->branch_info->from; 916 916 917 917 return _hist_entry__sym_snprintf(&from->ms, from->al_addr, 918 - he->level, bf, size, width); 918 + from->al_level, bf, size, width); 919 919 } 920 920 921 921 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); ··· 928 928 struct addr_map_symbol *to = &he->branch_info->to; 929 929 930 930 return _hist_entry__sym_snprintf(&to->ms, to->al_addr, 931 - he->level, bf, size, width); 931 + to->al_level, bf, size, width); 932 932 } 933 933 934 934 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A");
+10 -9
tools/perf/util/stat-display.c
··· 585 585 586 586 alias = list_prepare_entry(counter, &(evlist->core.entries), core.node); 587 587 list_for_each_entry_continue (alias, &evlist->core.entries, core.node) { 588 - if (strcmp(evsel__name(alias), evsel__name(counter)) || 589 - alias->scale != counter->scale || 590 - alias->cgrp != counter->cgrp || 591 - strcmp(alias->unit, counter->unit) || 592 - evsel__is_clock(alias) != evsel__is_clock(counter) || 593 - !strcmp(alias->pmu_name, counter->pmu_name)) 594 - break; 595 - alias->merged_stat = true; 596 - cb(config, alias, data, false); 588 + /* Merge events with the same name, etc. but on different PMUs. */ 589 + if (!strcmp(evsel__name(alias), evsel__name(counter)) && 590 + alias->scale == counter->scale && 591 + alias->cgrp == counter->cgrp && 592 + !strcmp(alias->unit, counter->unit) && 593 + evsel__is_clock(alias) == evsel__is_clock(counter) && 594 + strcmp(alias->pmu_name, counter->pmu_name)) { 595 + alias->merged_stat = true; 596 + cb(config, alias, data, false); 597 + } 597 598 } 598 599 } 599 600
+19
tools/perf/util/synthetic-events.c
··· 1784 1784 perf_event__handler_t process, bool needs_mmap, 1785 1785 bool data_mmap, unsigned int nr_threads_synthesize) 1786 1786 { 1787 + /* 1788 + * When perf runs in non-root PID namespace, and the namespace's proc FS 1789 + * is not mounted, nsinfo__is_in_root_namespace() returns false. 1790 + * In this case, the proc FS is coming for the parent namespace, thus 1791 + * perf tool will wrongly gather process info from its parent PID 1792 + * namespace. 1793 + * 1794 + * To avoid the confusion that the perf tool runs in a child PID 1795 + * namespace but it synthesizes thread info from its parent PID 1796 + * namespace, returns failure with warning. 1797 + */ 1798 + if (!nsinfo__is_in_root_namespace()) { 1799 + pr_err("Perf runs in non-root PID namespace but it tries to "); 1800 + pr_err("gather process info from its parent PID namespace.\n"); 1801 + pr_err("Please mount the proc file system properly, e.g. "); 1802 + pr_err("add the option '--mount-proc' for unshare command.\n"); 1803 + return -EPERM; 1804 + } 1805 + 1787 1806 if (target__has_task(target)) 1788 1807 return perf_event__synthesize_thread_map(tool, threads, process, machine, 1789 1808 needs_mmap, data_mmap);
+1 -1
tools/testing/kunit/run_checks.py
··· 61 61 elif isinstance(ex, subprocess.CalledProcessError): 62 62 print(f'{name}: FAILED') 63 63 else: 64 - print('{name}: unexpected exception: {ex}') 64 + print(f'{name}: unexpected exception: {ex}') 65 65 continue 66 66 67 67 output = ex.output
-2
tools/testing/selftests/clone3/clone3.c
··· 126 126 127 127 int main(int argc, char *argv[]) 128 128 { 129 - pid_t pid; 130 - 131 129 uid_t uid = getuid(); 132 130 133 131 ksft_print_header();
+10
tools/testing/selftests/ir/ir_loopback.c
··· 29 29 #define SYSFS_PATH_MAX 256 30 30 #define DNAME_PATH_MAX 256 31 31 32 + /* 33 + * Support ancient lirc.h which does not have these values. Can be removed 34 + * once RHEL 8 is no longer a relevant testing platform. 35 + */ 36 + #if RC_PROTO_MAX < 26 37 + #define RC_PROTO_RCMM12 24 38 + #define RC_PROTO_RCMM24 25 39 + #define RC_PROTO_RCMM32 26 40 + #endif 41 + 32 42 static const struct { 33 43 enum rc_proto proto; 34 44 const char *name;
+1
tools/testing/selftests/net/mptcp/mptcp_join.sh
··· 1299 1299 pm_nl_add_endpoint $ns2 10.0.3.2 flags signal 1300 1300 pm_nl_add_endpoint $ns2 10.0.4.2 flags signal 1301 1301 run_tests $ns1 $ns2 10.0.1.1 1302 + chk_join_nr "signal addresses race test" 3 3 3 1302 1303 1303 1304 # the server will not signal the address terminating 1304 1305 # the MPC subflow
+9 -8
tools/testing/selftests/perf_events/sigtrap_threads.c
··· 44 44 } ctx; 45 45 46 46 /* Unique value to check si_perf_data is correctly set from perf_event_attr::sig_data. */ 47 - #define TEST_SIG_DATA(addr) (~(unsigned long)(addr)) 47 + #define TEST_SIG_DATA(addr, id) (~(unsigned long)(addr) + id) 48 48 49 - static struct perf_event_attr make_event_attr(bool enabled, volatile void *addr) 49 + static struct perf_event_attr make_event_attr(bool enabled, volatile void *addr, 50 + unsigned long id) 50 51 { 51 52 struct perf_event_attr attr = { 52 53 .type = PERF_TYPE_BREAKPOINT, ··· 61 60 .inherit_thread = 1, /* ... but only cloned with CLONE_THREAD. */ 62 61 .remove_on_exec = 1, /* Required by sigtrap. */ 63 62 .sigtrap = 1, /* Request synchronous SIGTRAP on event. */ 64 - .sig_data = TEST_SIG_DATA(addr), 63 + .sig_data = TEST_SIG_DATA(addr, id), 65 64 }; 66 65 return attr; 67 66 } ··· 111 110 112 111 FIXTURE_SETUP(sigtrap_threads) 113 112 { 114 - struct perf_event_attr attr = make_event_attr(false, &ctx.iterate_on); 113 + struct perf_event_attr attr = make_event_attr(false, &ctx.iterate_on, 0); 115 114 struct sigaction action = {}; 116 115 int i; 117 116 ··· 166 165 EXPECT_EQ(ctx.tids_want_signal, 0); 167 166 EXPECT_EQ(ctx.first_siginfo.si_addr, &ctx.iterate_on); 168 167 EXPECT_EQ(ctx.first_siginfo.si_perf_type, PERF_TYPE_BREAKPOINT); 169 - EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on)); 168 + EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on, 0)); 170 169 171 170 /* Check enabled for parent. */ 172 171 ctx.iterate_on = 0; ··· 176 175 /* Test that modification propagates to all inherited events. */ 177 176 TEST_F(sigtrap_threads, modify_and_enable_event) 178 177 { 179 - struct perf_event_attr new_attr = make_event_attr(true, &ctx.iterate_on); 178 + struct perf_event_attr new_attr = make_event_attr(true, &ctx.iterate_on, 42); 180 179 181 180 EXPECT_EQ(ioctl(self->fd, PERF_EVENT_IOC_MODIFY_ATTRIBUTES, &new_attr), 0); 182 181 run_test_threads(_metadata, self); ··· 185 184 EXPECT_EQ(ctx.tids_want_signal, 0); 186 185 EXPECT_EQ(ctx.first_siginfo.si_addr, &ctx.iterate_on); 187 186 EXPECT_EQ(ctx.first_siginfo.si_perf_type, PERF_TYPE_BREAKPOINT); 188 - EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on)); 187 + EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on, 42)); 189 188 190 189 /* Check enabled for parent. */ 191 190 ctx.iterate_on = 0; ··· 205 204 EXPECT_EQ(ctx.tids_want_signal, 0); 206 205 EXPECT_EQ(ctx.first_siginfo.si_addr, &ctx.iterate_on); 207 206 EXPECT_EQ(ctx.first_siginfo.si_perf_type, PERF_TYPE_BREAKPOINT); 208 - EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on)); 207 + EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on, 0)); 209 208 } 210 209 211 210 TEST_HARNESS_MAIN
+10 -3
tools/testing/selftests/pidfd/pidfd.h
··· 68 68 #define PIDFD_SKIP 3 69 69 #define PIDFD_XFAIL 4 70 70 71 - int wait_for_pid(pid_t pid) 71 + static inline int wait_for_pid(pid_t pid) 72 72 { 73 73 int status, ret; 74 74 ··· 78 78 if (errno == EINTR) 79 79 goto again; 80 80 81 + ksft_print_msg("waitpid returned -1, errno=%d\n", errno); 81 82 return -1; 82 83 } 83 84 84 - if (!WIFEXITED(status)) 85 + if (!WIFEXITED(status)) { 86 + ksft_print_msg( 87 + "waitpid !WIFEXITED, WIFSIGNALED=%d, WTERMSIG=%d\n", 88 + WIFSIGNALED(status), WTERMSIG(status)); 85 89 return -1; 90 + } 86 91 87 - return WEXITSTATUS(status); 92 + ret = WEXITSTATUS(status); 93 + ksft_print_msg("waitpid WEXITSTATUS=%d\n", ret); 94 + return ret; 88 95 } 89 96 90 97 static inline int sys_pidfd_open(pid_t pid, unsigned int flags)
+18 -4
tools/testing/selftests/pidfd/pidfd_fdinfo_test.c
··· 12 12 #include <string.h> 13 13 #include <syscall.h> 14 14 #include <sys/wait.h> 15 + #include <sys/mman.h> 15 16 16 17 #include "pidfd.h" 17 18 #include "../kselftest.h" ··· 81 80 return err->code; 82 81 } 83 82 83 + #define CHILD_STACK_SIZE 8192 84 + 84 85 struct child { 86 + char *stack; 85 87 pid_t pid; 86 88 int fd; 87 89 }; ··· 93 89 struct error *err) 94 90 { 95 91 static int flags = CLONE_PIDFD | CLONE_NEWPID | CLONE_NEWNS | SIGCHLD; 96 - size_t stack_size = 1024; 97 - char *stack[1024] = { 0 }; 98 92 struct child ret; 99 93 100 94 if (!(flags & CLONE_NEWUSER) && geteuid() != 0) 101 95 flags |= CLONE_NEWUSER; 102 96 97 + ret.stack = mmap(NULL, CHILD_STACK_SIZE, PROT_READ | PROT_WRITE, 98 + MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0); 99 + if (ret.stack == MAP_FAILED) { 100 + error_set(err, -1, "mmap of stack failed (errno %d)", errno); 101 + return ret; 102 + } 103 + 103 104 #ifdef __ia64__ 104 - ret.pid = __clone2(fn, stack, stack_size, flags, args, &ret.fd); 105 + ret.pid = __clone2(fn, ret.stack, CHILD_STACK_SIZE, flags, args, &ret.fd); 105 106 #else 106 - ret.pid = clone(fn, stack + stack_size, flags, args, &ret.fd); 107 + ret.pid = clone(fn, ret.stack + CHILD_STACK_SIZE, flags, args, &ret.fd); 107 108 #endif 108 109 109 110 if (ret.pid < 0) { ··· 137 128 r, errno); 138 129 else if (r > 0) 139 130 error_set(err, r, "child %d reported: %d", child->pid, r); 131 + 132 + if (munmap(child->stack, CHILD_STACK_SIZE)) { 133 + error_set(err, -1, "munmap of child stack failed (errno %d)", errno); 134 + r = -1; 135 + } 140 136 141 137 return r; 142 138 }
+3 -3
tools/testing/selftests/pidfd/pidfd_test.c
··· 441 441 { 442 442 int pid, pidfd = 0; 443 443 int status, ret; 444 - pthread_t t1; 445 444 time_t prog_start = time(NULL); 446 445 const char *test_name = "pidfd_poll check for premature notification on child thread exec"; 447 446 ··· 499 500 */ 500 501 *child_exit_secs = time(NULL); 501 502 syscall(SYS_exit, 0); 503 + /* Never reached, but appeases compiler thinking we should return. */ 504 + exit(0); 502 505 } 503 506 504 507 static void test_pidfd_poll_leader_exit(int use_waitpid) 505 508 { 506 509 int pid, pidfd = 0; 507 - int status, ret; 508 - time_t prog_start = time(NULL); 510 + int status, ret = 0; 509 511 const char *test_name = "pidfd_poll check for premature notification on non-empty" 510 512 "group leader exit"; 511 513
+2 -3
tools/testing/selftests/pidfd/pidfd_wait.c
··· 39 39 40 40 TEST(wait_simple) 41 41 { 42 - int pidfd = -1, status = 0; 42 + int pidfd = -1; 43 43 pid_t parent_tid = -1; 44 44 struct clone_args args = { 45 45 .parent_tid = ptr_to_u64(&parent_tid), ··· 47 47 .flags = CLONE_PIDFD | CLONE_PARENT_SETTID, 48 48 .exit_signal = SIGCHLD, 49 49 }; 50 - int ret; 51 50 pid_t pid; 52 51 siginfo_t info = { 53 52 .si_signo = 0, ··· 87 88 88 89 TEST(wait_states) 89 90 { 90 - int pidfd = -1, status = 0; 91 + int pidfd = -1; 91 92 pid_t parent_tid = -1; 92 93 struct clone_args args = { 93 94 .parent_tid = ptr_to_u64(&parent_tid),
+7 -2
tools/testing/selftests/vm/userfaultfd.c
··· 1417 1417 static int userfaultfd_stress(void) 1418 1418 { 1419 1419 void *area; 1420 + char *tmp_area; 1420 1421 unsigned long nr; 1421 1422 struct uffdio_register uffdio_register; 1422 1423 struct uffd_stats uffd_stats[nr_cpus]; ··· 1528 1527 count_verify[nr], nr); 1529 1528 1530 1529 /* prepare next bounce */ 1531 - swap(area_src, area_dst); 1530 + tmp_area = area_src; 1531 + area_src = area_dst; 1532 + area_dst = tmp_area; 1532 1533 1533 - swap(area_src_alias, area_dst_alias); 1534 + tmp_area = area_src_alias; 1535 + area_src_alias = area_dst_alias; 1536 + area_dst_alias = tmp_area; 1534 1537 1535 1538 uffd_stats_report(uffd_stats, nr_cpus); 1536 1539 }