diff --git a/Documentation/ABI/stable/sysfs-driver-dma-idxd b/Documentation/ABI/stable/sysfs-driver-dma-idxd index f2ec42949a54d7b293541810fec83c7cfa8e26a3..825e619250bf2ebb77d6c2abc9843414c8b5efd5 100644 --- a/Documentation/ABI/stable/sysfs-driver-dma-idxd +++ b/Documentation/ABI/stable/sysfs-driver-dma-idxd @@ -270,12 +270,6 @@ Description: Shows the operation capability bits displayed in bitmap format correlates to the operations allowed. It's visible only on platforms that support the capability. -What: /sys/bus/dsa/devices/wq./driver_name -Date: Sept 8, 2023 -KernelVersion: 6.7.0 -Contact: dmaengine@vger.kernel.org -Description: Name of driver to be bounded to the wq. - What: /sys/bus/dsa/devices/engine./group_id Date: Oct 25, 2019 KernelVersion: 5.6.0 diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu index 868ec736a9d2356804a2decaa013823d690e8a23..0426ec112155ec79143862806bbf8357ff3a2729 100644 --- a/Documentation/ABI/testing/sysfs-devices-system-cpu +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu @@ -526,7 +526,6 @@ What: /sys/devices/system/cpu/vulnerabilities /sys/devices/system/cpu/vulnerabilities/spectre_v1 /sys/devices/system/cpu/vulnerabilities/spectre_v2 /sys/devices/system/cpu/vulnerabilities/srbds - /sys/devices/system/cpu/vulnerabilities/tsa /sys/devices/system/cpu/vulnerabilities/tsx_async_abort Date: January 2018 Contact: Linux kernel mailing list diff --git a/Documentation/ABI/testing/sysfs-driver-ufs b/Documentation/ABI/testing/sysfs-driver-ufs index 84131641580c956fa2cf37ff8220b292efbf7e42..0c7efaf62de0c00b5f481b27e547fd24a022959f 100644 --- a/Documentation/ABI/testing/sysfs-driver-ufs +++ b/Documentation/ABI/testing/sysfs-driver-ufs @@ -711,7 +711,7 @@ Description: This file shows the thin provisioning type. This is one of The file is read only. -What: /sys/class/scsi_device/*/device/unit_descriptor/physical_memory_resource_count +What: /sys/class/scsi_device/*/device/unit_descriptor/physical_memory_resourse_count Date: February 2018 Contact: Stanislav Nijnikov Description: This file shows the total physical memory resources. This is diff --git a/Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst b/Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst index e916dc232b0f0c22699ccdf5f99313eeaa87512a..c98fd11907cc8754878ea89f371f5e753d9e0269 100644 --- a/Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst +++ b/Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst @@ -157,7 +157,9 @@ This is achieved by using the otherwise unused and obsolete VERW instruction in combination with a microcode update. The microcode clears the affected CPU buffers when the VERW instruction is executed. -Kernel does the buffer clearing with x86_clear_cpu_buffers(). +Kernel reuses the MDS function to invoke the buffer clearing: + + mds_clear_cpu_buffers() On MDS affected CPUs, the kernel already invokes CPU buffer clear on kernel/userspace, hypervisor/guest and C-state (idle) transitions. No diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index bcfa49019c3f1635a2a737ec79a49f25f53d1f9c..315a817e338042c1aeaa6a4ff52dd7af8142824a 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -5978,6 +5978,8 @@ Selecting 'on' will also enable the mitigation against user space to user space task attacks. + Selecting specific mitigation does not force enable + user mitigations. Selecting 'off' will disable both the kernel and the user space protections. @@ -6645,19 +6647,6 @@ If not specified, "default" is used. In this case, the RNG's choice is left to each individual trust source. - tsa= [X86] Control mitigation for Transient Scheduler - Attacks on AMD CPUs. Search the following in your - favourite search engine for more details: - - "Technical guidance for mitigating transient scheduler - attacks". - - off - disable the mitigation - on - enable the mitigation (default) - user - mitigate only user/kernel transitions - vm - mitigate only guest/host transitions - - tsc= Disable clocksource stability checks for TSC. Format: [x86] reliable: mark tsc clocksource as reliable, this diff --git a/Documentation/arch/x86/mds.rst b/Documentation/arch/x86/mds.rst index 43106f349cc35f27eb504ef037db36813e1780af..c58c72362911cd0a10be8e96eba4cb9940d3b576 100644 --- a/Documentation/arch/x86/mds.rst +++ b/Documentation/arch/x86/mds.rst @@ -93,7 +93,7 @@ enters a C-state. The kernel provides a function to invoke the buffer clearing: - x86_clear_cpu_buffers() + mds_clear_cpu_buffers() Also macro CLEAR_CPU_BUFFERS can be used in ASM late in exit-to-user path. Other than CFLAGS.ZF, this macro doesn't clobber any registers. @@ -185,9 +185,9 @@ Mitigation points idle clearing would be a window dressing exercise and is therefore not activated. - The invocation is controlled by the static key cpu_buf_idle_clear which is - switched depending on the chosen mitigation mode and the SMT state of the - system. + The invocation is controlled by the static key mds_idle_clear which is + switched depending on the chosen mitigation mode and the SMT state of + the system. The buffer clear is only invoked before entering the C-State to prevent that stale data from the idling CPU from spilling to the Hyper-Thread diff --git a/Documentation/bpf/map_hash.rst b/Documentation/bpf/map_hash.rst index 8606bf958a8cf096620ab2eca85461f27a2dd35b..d2343952f2cbd3138e8a3a0034718609f376d2ba 100644 --- a/Documentation/bpf/map_hash.rst +++ b/Documentation/bpf/map_hash.rst @@ -233,16 +233,10 @@ attempts in order to enforce the LRU property which have increasing impacts on other CPUs involved in the following operation attempts: - Attempt to use CPU-local state to batch operations -- Attempt to fetch ``target_free`` free nodes from global lists +- Attempt to fetch free nodes from global lists - Attempt to pull any node from a global list and remove it from the hashmap - Attempt to pull any node from any CPU's list and remove it from the hashmap -The number of nodes to borrow from the global list in a batch, ``target_free``, -depends on the size of the map. Larger batch size reduces lock contention, but -may also exhaust the global structure. The value is computed at map init to -avoid exhaustion, by limiting aggregate reservation by all CPUs to half the map -size. With a minimum of a single element and maximum budget of 128 at a time. - This algorithm is described visually in the following diagram. See the description in commit 3a08c2fd7634 ("bpf: LRU List") for a full explanation of the corresponding operations: diff --git a/Documentation/bpf/map_lru_hash_update.dot b/Documentation/bpf/map_lru_hash_update.dot index ab10058f5b79f55dbade3bb6dad441d2f6e81d0a..a0fee349d29c27b6e9016807df56c27f62070c0f 100644 --- a/Documentation/bpf/map_lru_hash_update.dot +++ b/Documentation/bpf/map_lru_hash_update.dot @@ -35,18 +35,18 @@ digraph { fn_bpf_lru_list_pop_free_to_local [shape=rectangle,fillcolor=2, label="Flush local pending, Rotate Global list, move - target_free + LOCAL_FREE_TARGET from global -> local"] // Also corresponds to: // fn__local_list_flush() // fn_bpf_lru_list_rotate() fn___bpf_lru_node_move_to_free[shape=diamond,fillcolor=2, - label="Able to free\ntarget_free\nnodes?"] + label="Able to free\nLOCAL_FREE_TARGET\nnodes?"] fn___bpf_lru_list_shrink_inactive [shape=rectangle,fillcolor=3, label="Shrink inactive list up to remaining - target_free + LOCAL_FREE_TARGET (global LRU -> local)"] fn___bpf_lru_list_shrink [shape=diamond,fillcolor=2, label="> 0 entries in\nlocal free list?"] diff --git a/Documentation/core-api/symbol-namespaces.rst b/Documentation/core-api/symbol-namespaces.rst index 29875e25e376f66c4ee07943313c118554ad60de..12e4aecdae94522c30929c427410505bef6f3c4b 100644 --- a/Documentation/core-api/symbol-namespaces.rst +++ b/Documentation/core-api/symbol-namespaces.rst @@ -28,9 +28,6 @@ kernel. As of today, modules that make use of symbols exported into namespaces, are required to import the namespace. Otherwise the kernel will, depending on its configuration, reject loading the module or warn about a missing import. -Additionally, it is possible to put symbols into a module namespace, strictly -limiting which modules are allowed to use these symbols. - 2. How to define Symbol Namespaces ================================== @@ -87,22 +84,6 @@ unit as preprocessor statement. The above example would then read:: within the corresponding compilation unit before any EXPORT_SYMBOL macro is used. -2.3 Using the EXPORT_SYMBOL_GPL_FOR_MODULES() macro -=================================================== - -Symbols exported using this macro are put into a module namespace. This -namespace cannot be imported. - -The macro takes a comma separated list of module names, allowing only those -modules to access this symbol. Simple tail-globs are supported. - -For example: - - EXPORT_SYMBOL_GPL_FOR_MODULES(preempt_notifier_inc, "kvm,kvm-*") - -will limit usage of this symbol to modules whoes name matches the given -patterns. - 3. How to use Symbols exported in Namespaces ============================================ @@ -174,6 +155,3 @@ in-tree modules:: You can also run nsdeps for external module builds. A typical usage is:: $ make -C M=$PWD nsdeps - -Note: it will happily generate an import statement for the module namespace; -which will not work and generates build and runtime failures. diff --git a/Documentation/devicetree/bindings/i2c/nvidia,tegra20-i2c.yaml b/Documentation/devicetree/bindings/i2c/nvidia,tegra20-i2c.yaml index 2cb311ddd912a933c28e9850a59b3eb602f3d816..424a4fc218b66bfdf7897ad06a864e6b7bcb3cef 100644 --- a/Documentation/devicetree/bindings/i2c/nvidia,tegra20-i2c.yaml +++ b/Documentation/devicetree/bindings/i2c/nvidia,tegra20-i2c.yaml @@ -103,10 +103,7 @@ properties: resets: items: - - description: - Module reset. This property is optional for controllers in Tegra194, - Tegra234 etc where an internal software reset is available as an - alternative. + - description: module reset reset-names: items: @@ -122,13 +119,6 @@ properties: - const: rx - const: tx -required: - - compatible - - reg - - interrupts - - clocks - - clock-names - allOf: - $ref: /schemas/i2c/i2c-controller.yaml - if: @@ -182,18 +172,6 @@ allOf: items: - description: phandle to the VENC power domain - - if: - not: - properties: - compatible: - contains: - enum: - - nvidia,tegra194-i2c - then: - required: - - resets - - reset-names - unevaluatedProperties: false examples: diff --git a/Documentation/devicetree/bindings/phy/fsl,imx8mq-usb-phy.yaml b/Documentation/devicetree/bindings/phy/fsl,imx8mq-usb-phy.yaml index bac4d0b51d8a1ba6773d5960c0f2a6d5e608b69a..dc3a3f709feaa693a05dc69fa718facada78461b 100644 --- a/Documentation/devicetree/bindings/phy/fsl,imx8mq-usb-phy.yaml +++ b/Documentation/devicetree/bindings/phy/fsl,imx8mq-usb-phy.yaml @@ -58,7 +58,8 @@ properties: fsl,phy-tx-vboost-level-microvolt: description: Adjust the boosted transmit launch pk-pk differential amplitude - enum: [844, 1008, 1156] + minimum: 880 + maximum: 1120 fsl,phy-comp-dis-tune-percent: description: diff --git a/Documentation/devicetree/bindings/regulator/mediatek,mt6357-regulator.yaml b/Documentation/devicetree/bindings/regulator/mediatek,mt6357-regulator.yaml index 698266c09e25359a516d969a0487cc94444b842d..6327bb2f6ee080a178ff3e982768c5eb0595e771 100644 --- a/Documentation/devicetree/bindings/regulator/mediatek,mt6357-regulator.yaml +++ b/Documentation/devicetree/bindings/regulator/mediatek,mt6357-regulator.yaml @@ -33,7 +33,7 @@ patternProperties: "^ldo-v(camio18|aud28|aux18|io18|io28|rf12|rf18|cn18|cn28|fe28)$": type: object - $ref: regulator.yaml# + $ref: fixed-regulator.yaml# unevaluatedProperties: false description: Properties for single fixed LDO regulator. @@ -112,6 +112,7 @@ examples: regulator-enable-ramp-delay = <220>; }; mt6357_vfe28_reg: ldo-vfe28 { + compatible = "regulator-fixed"; regulator-name = "vfe28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; @@ -124,12 +125,14 @@ examples: regulator-enable-ramp-delay = <110>; }; mt6357_vrf18_reg: ldo-vrf18 { + compatible = "regulator-fixed"; regulator-name = "vrf18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-enable-ramp-delay = <110>; }; mt6357_vrf12_reg: ldo-vrf12 { + compatible = "regulator-fixed"; regulator-name = "vrf12"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; @@ -154,12 +157,14 @@ examples: regulator-enable-ramp-delay = <264>; }; mt6357_vcn28_reg: ldo-vcn28 { + compatible = "regulator-fixed"; regulator-name = "vcn28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; regulator-enable-ramp-delay = <264>; }; mt6357_vcn18_reg: ldo-vcn18 { + compatible = "regulator-fixed"; regulator-name = "vcn18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -178,6 +183,7 @@ examples: regulator-enable-ramp-delay = <264>; }; mt6357_vcamio_reg: ldo-vcamio18 { + compatible = "regulator-fixed"; regulator-name = "vcamio"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -206,24 +212,28 @@ examples: regulator-always-on; }; mt6357_vaux18_reg: ldo-vaux18 { + compatible = "regulator-fixed"; regulator-name = "vaux18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-enable-ramp-delay = <264>; }; mt6357_vaud28_reg: ldo-vaud28 { + compatible = "regulator-fixed"; regulator-name = "vaud28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; regulator-enable-ramp-delay = <264>; }; mt6357_vio28_reg: ldo-vio28 { + compatible = "regulator-fixed"; regulator-name = "vio28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; regulator-enable-ramp-delay = <264>; }; mt6357_vio18_reg: ldo-vio18 { + compatible = "regulator-fixed"; regulator-name = "vio18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; diff --git a/Documentation/devicetree/bindings/serial/8250.yaml b/Documentation/devicetree/bindings/serial/8250.yaml index 6ba0325039be214f0da2393c8cd596526ac72478..692aa05500fd5329a5ded6fb2d8474149da1877a 100644 --- a/Documentation/devicetree/bindings/serial/8250.yaml +++ b/Documentation/devicetree/bindings/serial/8250.yaml @@ -45,7 +45,7 @@ allOf: - ns16550 - ns16550a then: - oneOf: + anyOf: - required: [ clock-frequency ] - required: [ clocks ] diff --git a/Documentation/devicetree/bindings/usb/cypress,hx3.yaml b/Documentation/devicetree/bindings/usb/cypress,hx3.yaml index 02349bbb0d46ff0c7279a7b0e6e26afe261e062f..47add0d85fb891793c4d1c67f93fe16983309db7 100644 --- a/Documentation/devicetree/bindings/usb/cypress,hx3.yaml +++ b/Documentation/devicetree/bindings/usb/cypress,hx3.yaml @@ -14,22 +14,9 @@ allOf: properties: compatible: - oneOf: - - enum: - - usb4b4,6504 - - usb4b4,6506 - - items: - - enum: - - usb4b4,6500 - - usb4b4,6508 - - const: usb4b4,6504 - - items: - - enum: - - usb4b4,6502 - - usb4b4,6503 - - usb4b4,6507 - - usb4b4,650a - - const: usb4b4,6506 + enum: + - usb4b4,6504 + - usb4b4,6506 reg: true diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml index 7376a924e9aca1dc5c25ae08b9b7e53094920ef2..dc275ab60e53442685e1012a228f669ddc4de879 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -773,8 +773,6 @@ patternProperties: description: Linux-specific binding "^linx,.*": description: Linx Technologies - "^liontron,.*": - description: Shenzhen Liontron Technology Co., Ltd "^liteon,.*": description: LITE-ON Technology Corp. "^litex,.*": diff --git a/Makefile b/Makefile index 116eb523392a23a9cc14b5b09b4eebd3c1029785..51d975b3555195e30019c7777665672a611310f1 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 6 -SUBLEVEL = 101 +SUBLEVEL = 92 EXTRAVERSION = NAME = Pinguïn Aangedreven diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 351d0b039b5ca6392a680955702e62bd2a7ae146..5ba42f69f8ce0c1c3d8858f8124004041076d6a6 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -142,7 +142,7 @@ endif # Need -Uarm for gcc < 3.x KBUILD_CPPFLAGS +=$(cpp-y) KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_ISA) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm -KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_ISA) -Wa,$(arch-y) $(tune-y) -include $(srctree)/arch/arm/include/asm/unified.h -msoft-float +KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_ISA) -Wa,$(arch-y) $(tune-y) -include asm/unified.h -msoft-float CHECKFLAGS += -D__arm__ diff --git a/arch/arm/boot/dts/microchip/at91sam9263ek.dts b/arch/arm/boot/dts/microchip/at91sam9263ek.dts index e42e1a75a715dbb39d773359c002cfa204330a5f..ce8baff6a9f4e0702f126d9965a1275da68b9ce0 100644 --- a/arch/arm/boot/dts/microchip/at91sam9263ek.dts +++ b/arch/arm/boot/dts/microchip/at91sam9263ek.dts @@ -152,7 +152,7 @@ nand_controller: nand-controller { nand@3 { reg = <0x3 0x0 0x800000>; rb-gpios = <&pioA 22 GPIO_ACTIVE_HIGH>; - cs-gpios = <&pioD 15 GPIO_ACTIVE_HIGH>; + cs-gpios = <&pioA 15 GPIO_ACTIVE_HIGH>; nand-bus-width = <8>; nand-ecc-mode = "soft"; nand-on-flash-bbt; diff --git a/arch/arm/boot/dts/microchip/tny_a9263.dts b/arch/arm/boot/dts/microchip/tny_a9263.dts index c8b6318aaa838c4e8d54ea43d3ebfb47ecac9116..62b7d9f9a926c5be5a7ae01e66880e9f2b7af341 100644 --- a/arch/arm/boot/dts/microchip/tny_a9263.dts +++ b/arch/arm/boot/dts/microchip/tny_a9263.dts @@ -64,7 +64,7 @@ nand_controller: nand-controller { nand@3 { reg = <0x3 0x0 0x800000>; rb-gpios = <&pioA 22 GPIO_ACTIVE_HIGH>; - cs-gpios = <&pioD 15 GPIO_ACTIVE_HIGH>; + cs-gpios = <&pioA 15 GPIO_ACTIVE_HIGH>; nand-bus-width = <8>; nand-ecc-mode = "soft"; nand-on-flash-bbt; diff --git a/arch/arm/boot/dts/microchip/usb_a9263.dts b/arch/arm/boot/dts/microchip/usb_a9263.dts index 454176ce6d3fff23c2178db5a9a23b7957776463..45745915b2e160e8710003411caa2d8fc344157e 100644 --- a/arch/arm/boot/dts/microchip/usb_a9263.dts +++ b/arch/arm/boot/dts/microchip/usb_a9263.dts @@ -58,7 +58,7 @@ usb1: gadget@fff78000 { }; spi0: spi@fffa4000 { - cs-gpios = <&pioA 5 GPIO_ACTIVE_LOW>; + cs-gpios = <&pioB 15 GPIO_ACTIVE_HIGH>; status = "okay"; flash@0 { compatible = "atmel,at45", "atmel,dataflash"; @@ -84,7 +84,7 @@ nand_controller: nand-controller { nand@3 { reg = <0x3 0x0 0x800000>; rb-gpios = <&pioA 22 GPIO_ACTIVE_HIGH>; - cs-gpios = <&pioD 15 GPIO_ACTIVE_HIGH>; + cs-gpios = <&pioA 15 GPIO_ACTIVE_HIGH>; nand-bus-width = <8>; nand-ecc-mode = "soft"; nand-on-flash-bbt; diff --git a/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi b/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi index b8f160cfe8e1569ad9724211881e9aa3c7ed70f9..950adb63af7016e7775446aa5fb7ae019d749e9e 100644 --- a/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi +++ b/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi @@ -213,6 +213,12 @@ sleep_clk: sleep_clk { }; }; + sfpb_mutex: hwmutex { + compatible = "qcom,sfpb-mutex"; + syscon = <&sfpb_wrapper_mutex 0x604 0x4>; + #hwlock-cells = <1>; + }; + smem { compatible = "qcom,smem"; memory-region = <&smem_region>; @@ -316,10 +322,9 @@ tlmm_pinmux: pinctrl@800000 { pinctrl-0 = <&ps_hold>; }; - sfpb_mutex: hwmutex@1200600 { - compatible = "qcom,sfpb-mutex"; - reg = <0x01200600 0x100>; - #hwlock-cells = <1>; + sfpb_wrapper_mutex: syscon@1200000 { + compatible = "syscon"; + reg = <0x01200000 0x8000>; }; intc: interrupt-controller@2000000 { @@ -338,8 +343,6 @@ timer@200a000 { <1 3 0x301>; reg = <0x0200a000 0x100>; clock-frequency = <27000000>; - clocks = <&sleep_clk>; - clock-names = "sleep"; cpu-offset = <0x80000>; }; diff --git a/arch/arm/boot/dts/ti/omap/am335x-bone-common.dtsi b/arch/arm/boot/dts/ti/omap/am335x-bone-common.dtsi index 27e73e745e25f2588fd3fd37e9333077b5e65a4c..96451c8a815ccd996fcf6f6f9c27e78e4ee0d285 100644 --- a/arch/arm/boot/dts/ti/omap/am335x-bone-common.dtsi +++ b/arch/arm/boot/dts/ti/omap/am335x-bone-common.dtsi @@ -385,7 +385,7 @@ ethphy0: ethernet-phy@0 { /* Support GPIO reset on revision C3 boards */ reset-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; reset-assert-us = <300>; - reset-deassert-us = <50000>; + reset-deassert-us = <6500>; }; }; diff --git a/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h index 14a38cc67e0bc966891af77d23a8897873ea46a3..7f44e88d1f25bcc57891701af2339f57054b3f14 100644 --- a/arch/arm/include/asm/ptrace.h +++ b/arch/arm/include/asm/ptrace.h @@ -10,7 +10,6 @@ #include #ifndef __ASSEMBLY__ -#include #include struct pt_regs { @@ -36,8 +35,8 @@ struct svc_pt_regs { #ifndef CONFIG_CPU_V7M #define isa_mode(regs) \ - (FIELD_GET(PSR_J_BIT, (regs)->ARM_cpsr) << 1 | \ - FIELD_GET(PSR_T_BIT, (regs)->ARM_cpsr)) + ((((regs)->ARM_cpsr & PSR_J_BIT) >> (__ffs(PSR_J_BIT) - 1)) | \ + (((regs)->ARM_cpsr & PSR_T_BIT) >> (__ffs(PSR_T_BIT)))) #else #define isa_mode(regs) 1 /* Thumb */ #endif diff --git a/arch/arm/mach-aspeed/Kconfig b/arch/arm/mach-aspeed/Kconfig index fcf287edd0e5e662693a12035b86dff97fcba31e..080019aa6fcd89ef706f572477d1f72f9f90c8e9 100644 --- a/arch/arm/mach-aspeed/Kconfig +++ b/arch/arm/mach-aspeed/Kconfig @@ -2,6 +2,7 @@ menuconfig ARCH_ASPEED bool "Aspeed BMC architectures" depends on (CPU_LITTLE_ENDIAN && ARCH_MULTI_V5) || ARCH_MULTI_V6 || ARCH_MULTI_V7 + select SRAM select WATCHDOG select ASPEED_WATCHDOG select MFD_SYSCON diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h index 86a2f9e5d0ef9d8a883140fc3d054ba11ecb0f61..c36fb27212615ae2c5014cb9a3e4517a95c55000 100644 --- a/arch/arm/mach-omap2/clockdomain.h +++ b/arch/arm/mach-omap2/clockdomain.h @@ -48,7 +48,6 @@ #define CLKDM_NO_AUTODEPS (1 << 4) #define CLKDM_ACTIVE_WITH_MPU (1 << 5) #define CLKDM_MISSING_IDLE_REPORTING (1 << 6) -#define CLKDM_STANDBY_FORCE_WAKEUP BIT(7) #define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO) #define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP) diff --git a/arch/arm/mach-omap2/clockdomains33xx_data.c b/arch/arm/mach-omap2/clockdomains33xx_data.c index c05a3c07d44863640235fb06bcb8eede750fcaa4..87f4e927eb1830e19d1c26d4daf8758c12f20a60 100644 --- a/arch/arm/mach-omap2/clockdomains33xx_data.c +++ b/arch/arm/mach-omap2/clockdomains33xx_data.c @@ -19,7 +19,7 @@ static struct clockdomain l4ls_am33xx_clkdm = { .pwrdm = { .name = "per_pwrdm" }, .cm_inst = AM33XX_CM_PER_MOD, .clkdm_offs = AM33XX_CM_PER_L4LS_CLKSTCTRL_OFFSET, - .flags = CLKDM_CAN_SWSUP | CLKDM_STANDBY_FORCE_WAKEUP, + .flags = CLKDM_CAN_SWSUP, }; static struct clockdomain l3s_am33xx_clkdm = { diff --git a/arch/arm/mach-omap2/cm33xx.c b/arch/arm/mach-omap2/cm33xx.c index aaee67d097915cad512447c24669f300864a285d..c824d4e3db632c9ff1827ae6fff31d4ac96d94ba 100644 --- a/arch/arm/mach-omap2/cm33xx.c +++ b/arch/arm/mach-omap2/cm33xx.c @@ -20,9 +20,6 @@ #include "cm-regbits-34xx.h" #include "cm-regbits-33xx.h" #include "prm33xx.h" -#if IS_ENABLED(CONFIG_SUSPEND) -#include -#endif /* * CLKCTRL_IDLEST_*: possible values for the CM_*_CLKCTRL.IDLEST bitfield: @@ -331,17 +328,8 @@ static int am33xx_clkdm_clk_disable(struct clockdomain *clkdm) { bool hwsup = false; -#if IS_ENABLED(CONFIG_SUSPEND) - /* - * In case of standby, Don't put the l4ls clk domain to sleep. - * Since CM3 PM FW doesn't wake-up/enable the l4ls clk domain - * upon wake-up, CM3 PM FW fails to wake-up th MPU. - */ - if (pm_suspend_target_state == PM_SUSPEND_STANDBY && - (clkdm->flags & CLKDM_STANDBY_FORCE_WAKEUP)) - return 0; -#endif hwsup = am33xx_cm_is_clkdm_in_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); + if (!hwsup && (clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) am33xx_clkdm_sleep(clkdm); diff --git a/arch/arm/mach-omap2/pmic-cpcap.c b/arch/arm/mach-omap2/pmic-cpcap.c index 527cf4b7e37874c1dac4953b58ed2371d8739f5e..668dc84fd31e0435f041b0f672e4d295eb185e92 100644 --- a/arch/arm/mach-omap2/pmic-cpcap.c +++ b/arch/arm/mach-omap2/pmic-cpcap.c @@ -264,11 +264,7 @@ int __init omap4_cpcap_init(void) static int __init cpcap_late_init(void) { - if (!of_find_compatible_node(NULL, NULL, "motorola,cpcap")) - return 0; - - if (soc_is_omap443x() || soc_is_omap446x() || soc_is_omap447x()) - omap4_vc_set_pmic_signaling(PWRDM_POWER_RET); + omap4_vc_set_pmic_signaling(PWRDM_POWER_RET); return 0; } diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index 7801c5bb775d90ad5fb03b437514e3b06e0fb17c..1c5aeba9bc27f3d5d3cb05d5236249f2d6b86581 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c @@ -515,5 +515,7 @@ void __init early_ioremap_init(void) bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size, unsigned long flags) { - return memblock_is_map_memory(offset); + unsigned long pfn = PHYS_PFN(offset); + + return memblock_is_map_memory(pfn); } diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 5b36e26c26932a06db9dd6c3d2c0e352fe7c779f..f0d4cc3499dd185a2936bae1bc05ceb96b1248eb 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -304,9 +304,9 @@ config ARCH_MMAP_RND_BITS_MAX default 24 if ARM64_VA_BITS=39 default 27 if ARM64_VA_BITS=42 default 30 if ARM64_VA_BITS=47 - default 29 if (ARM64_VA_BITS=48 || ARM64_VA_BITS=52) && ARM64_64K_PAGES - default 31 if (ARM64_VA_BITS=48 || ARM64_VA_BITS=52) && ARM64_16K_PAGES - default 33 if (ARM64_VA_BITS=48 || ARM64_VA_BITS=52) + default 29 if ARM64_VA_BITS=48 && ARM64_64K_PAGES + default 31 if ARM64_VA_BITS=48 && ARM64_16K_PAGES + default 33 if ARM64_VA_BITS=48 default 14 if ARM64_64K_PAGES default 16 if ARM64_16K_PAGES default 18 diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts index c854c7e3105196fb302a2bf66bf6a916814edf98..381d58cea092d9f8dadfe6f37ba2caa52d700c1c 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts @@ -151,12 +151,28 @@ &pio { vcc-pg-supply = <®_aldo1>; }; -&r_i2c { +&r_ir { + linux,rc-map-name = "rc-beelink-gs1"; + status = "okay"; +}; + +&r_pio { + /* + * FIXME: We can't add that supply for now since it would + * create a circular dependency between pinctrl, the regulator + * and the RSB Bus. + * + * vcc-pl-supply = <®_aldo1>; + */ + vcc-pm-supply = <®_aldo1>; +}; + +&r_rsb { status = "okay"; - axp805: pmic@36 { + axp805: pmic@745 { compatible = "x-powers,axp805", "x-powers,axp806"; - reg = <0x36>; + reg = <0x745>; interrupt-parent = <&r_intc>; interrupts = ; interrupt-controller; @@ -274,22 +290,6 @@ sw { }; }; -&r_ir { - linux,rc-map-name = "rc-beelink-gs1"; - status = "okay"; -}; - -&r_pio { - /* - * PL0 and PL1 are used for PMIC I2C - * don't enable the pl-supply else - * it will fail at boot - * - * vcc-pl-supply = <®_aldo1>; - */ - vcc-pm-supply = <®_aldo1>; -}; - &spdif { pinctrl-names = "default"; pinctrl-0 = <&spdif_tx_pin>; diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts index 8c476e089185b589a239c00dc259eaa5bc83fdf6..6fc65e8db2206810ae34b14f48916aed4b2f00b7 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts @@ -175,12 +175,16 @@ &pio { vcc-pg-supply = <®_vcc_wifi_io>; }; -&r_i2c { +&r_ir { + status = "okay"; +}; + +&r_rsb { status = "okay"; - axp805: pmic@36 { + axp805: pmic@745 { compatible = "x-powers,axp805", "x-powers,axp806"; - reg = <0x36>; + reg = <0x745>; interrupt-parent = <&r_intc>; interrupts = ; interrupt-controller; @@ -291,10 +295,6 @@ sw { }; }; -&r_ir { - status = "okay"; -}; - &rtc { clocks = <&ext_osc32k>; }; diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi.dtsi index 4ec4996592befb5e58c522fe21dd60f294f3e86a..92745128fcfebdf6d1f85cb6605ac560e2aaa7ca 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi.dtsi @@ -112,12 +112,20 @@ &pio { vcc-pg-supply = <®_aldo1>; }; -&r_i2c { +&r_ir { + status = "okay"; +}; + +&r_pio { + vcc-pm-supply = <®_bldo3>; +}; + +&r_rsb { status = "okay"; - axp805: pmic@36 { + axp805: pmic@745 { compatible = "x-powers,axp805", "x-powers,axp806"; - reg = <0x36>; + reg = <0x745>; interrupt-parent = <&r_intc>; interrupts = ; interrupt-controller; @@ -232,14 +240,6 @@ sw { }; }; -&r_ir { - status = "okay"; -}; - -&r_pio { - vcc-pm-supply = <®_bldo3>; -}; - &rtc { clocks = <&ext_osc32k>; }; diff --git a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi index cb78ce7af0b38011bdffb8b08408164eccc03ba7..5988a4eb6efaa008c290b1842e0da2aae8052ba4 100644 --- a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi +++ b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi @@ -71,7 +71,7 @@ hpm1: usb-pd@3f { */ &port00 { bus-range = <1 1>; - wifi0: wifi@0,0 { + wifi0: network@0,0 { compatible = "pci14e4,4425"; reg = <0x10000 0x0 0x0 0x0 0x0>; /* To be filled by the loader */ diff --git a/arch/arm64/boot/dts/freescale/imx8mm-beacon-kit.dts b/arch/arm64/boot/dts/freescale/imx8mm-beacon-kit.dts index a6e6860bf018430917caf90d24c3fe61d1c4dfe3..905c98cb080d2fc664df1c39759b08eda788086c 100644 --- a/arch/arm64/boot/dts/freescale/imx8mm-beacon-kit.dts +++ b/arch/arm64/boot/dts/freescale/imx8mm-beacon-kit.dts @@ -124,7 +124,6 @@ &sai5 { assigned-clock-parents = <&clk IMX8MM_AUDIO_PLL1_OUT>; assigned-clock-rates = <24576000>; #sound-dai-cells = <0>; - fsl,sai-mclk-direction-output; status = "okay"; }; diff --git a/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi index 8ab0e45f2ad31c05fbfe8f7b3c341c2351ec2647..f264102bdb274883e7f40a664900ccbc0d21b2a7 100644 --- a/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi @@ -231,7 +231,6 @@ eeprom@50 { rtc: rtc@51 { compatible = "nxp,pcf85263"; reg = <0x51>; - quartz-load-femtofarads = <12500>; }; }; diff --git a/arch/arm64/boot/dts/freescale/imx8mm-verdin.dtsi b/arch/arm64/boot/dts/freescale/imx8mm-verdin.dtsi index 218b5482190784e4de2a36c29b494d2e07e800a4..6457d2c377017a11b858ce9aabdb54622b41af51 100644 --- a/arch/arm64/boot/dts/freescale/imx8mm-verdin.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mm-verdin.dtsi @@ -470,7 +470,6 @@ reg_vdd_phy: LDO4 { }; reg_nvcc_sd: LDO5 { - regulator-always-on; regulator-max-microvolt = <3300000>; regulator-min-microvolt = <1800000>; regulator-name = "On-module +V3.3_1.8_SD (LDO5)"; diff --git a/arch/arm64/boot/dts/freescale/imx8mn-beacon-kit.dts b/arch/arm64/boot/dts/freescale/imx8mn-beacon-kit.dts index dfa08be33a4f20b33fd7f0d89d35aee1fc35bb00..35b8d2060cd99aa95ef9dd13c0eca5eb3ebc159b 100644 --- a/arch/arm64/boot/dts/freescale/imx8mn-beacon-kit.dts +++ b/arch/arm64/boot/dts/freescale/imx8mn-beacon-kit.dts @@ -126,7 +126,6 @@ &sai5 { assigned-clock-parents = <&clk IMX8MN_AUDIO_PLL1_OUT>; assigned-clock-rates = <24576000>; #sound-dai-cells = <0>; - fsl,sai-mclk-direction-output; status = "okay"; }; diff --git a/arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi index 1760062e6ffcfd548c5e2c9c8dec8ea03e76299c..90073b16536f401ebf0c8003607e87e3490198cb 100644 --- a/arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi @@ -240,7 +240,6 @@ eeprom@50 { rtc: rtc@51 { compatible = "nxp,pcf85263"; reg = <0x51>; - quartz-load-femtofarads = <12500>; }; }; diff --git a/arch/arm64/boot/dts/freescale/imx8mp-beacon-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-beacon-som.dtsi index 24380f8a0085014b3755d7bea4c29cc11eed9736..e5da9080478084da704a76198fa50b0feeeab79b 100644 --- a/arch/arm64/boot/dts/freescale/imx8mp-beacon-som.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mp-beacon-som.dtsi @@ -192,7 +192,6 @@ eeprom@50 { rtc: rtc@51 { compatible = "nxp,pcf85263"; reg = <0x51>; - quartz-load-femtofarads = <12500>; }; }; diff --git a/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts b/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts index 34619f085623b53ba654d82ae6d1acebc3871a1e..faa370a5885ff48375d4a57ae2321c972ee52d71 100644 --- a/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts +++ b/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts @@ -185,7 +185,7 @@ tpm@0 { #address-cells = <0x1>; #size-cells = <0x1>; reg = <0x0>; - spi-max-frequency = <25000000>; + spi-max-frequency = <36000000>; }; }; diff --git a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi index 37244e8816d9e87e87d0d2f81eac4b147ac08ab5..3f79923376fb28f13a20992e88364587fcae2d95 100644 --- a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi +++ b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi @@ -26,8 +26,6 @@ memory@0 { leds { compatible = "gpio-leds"; - pinctrl-names = "default"; - pinctrl-0 = <&spi_quad_pins>; led-power1 { label = "udpu:green:power"; @@ -84,6 +82,8 @@ &sdhci0 { &spi0 { status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&spi_quad_pins>; flash@0 { compatible = "jedec,spi-nor"; @@ -108,10 +108,6 @@ partition@180000 { }; }; -&spi_quad_pins { - function = "gpio"; -}; - &pinctrl_nb { i2c2_recovery_pins: i2c2-recovery-pins { groups = "i2c2"; diff --git a/arch/arm64/boot/dts/mediatek/mt6357.dtsi b/arch/arm64/boot/dts/mediatek/mt6357.dtsi index dca4e5c3d8e210c1e118539153e77e2822066da3..5fafa842d312f3b01e7d71ddc04ef48ca52bc89d 100644 --- a/arch/arm64/boot/dts/mediatek/mt6357.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt6357.dtsi @@ -60,6 +60,7 @@ mt6357_vpa_reg: buck-vpa { }; mt6357_vfe28_reg: ldo-vfe28 { + compatible = "regulator-fixed"; regulator-name = "vfe28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; @@ -74,6 +75,7 @@ mt6357_vxo22_reg: ldo-vxo22 { }; mt6357_vrf18_reg: ldo-vrf18 { + compatible = "regulator-fixed"; regulator-name = "vrf18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -81,6 +83,7 @@ mt6357_vrf18_reg: ldo-vrf18 { }; mt6357_vrf12_reg: ldo-vrf12 { + compatible = "regulator-fixed"; regulator-name = "vrf12"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; @@ -109,6 +112,7 @@ mt6357_vcn33_wifi_reg: ldo-vcn33-wifi { }; mt6357_vcn28_reg: ldo-vcn28 { + compatible = "regulator-fixed"; regulator-name = "vcn28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; @@ -116,6 +120,7 @@ mt6357_vcn28_reg: ldo-vcn28 { }; mt6357_vcn18_reg: ldo-vcn18 { + compatible = "regulator-fixed"; regulator-name = "vcn18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -137,6 +142,7 @@ mt6357_vcamd_reg: ldo-vcamd { }; mt6357_vcamio_reg: ldo-vcamio18 { + compatible = "regulator-fixed"; regulator-name = "vcamio"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -169,6 +175,7 @@ mt6357_vsram_proc_reg: ldo-vsram-proc { }; mt6357_vaux18_reg: ldo-vaux18 { + compatible = "regulator-fixed"; regulator-name = "vaux18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -176,6 +183,7 @@ mt6357_vaux18_reg: ldo-vaux18 { }; mt6357_vaud28_reg: ldo-vaud28 { + compatible = "regulator-fixed"; regulator-name = "vaud28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; @@ -183,6 +191,7 @@ mt6357_vaud28_reg: ldo-vaud28 { }; mt6357_vio28_reg: ldo-vio28 { + compatible = "regulator-fixed"; regulator-name = "vio28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; @@ -190,6 +199,7 @@ mt6357_vio28_reg: ldo-vio28 { }; mt6357_vio18_reg: ldo-vio18 { + compatible = "regulator-fixed"; regulator-name = "vio18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; diff --git a/arch/arm64/boot/dts/mediatek/mt6359.dtsi b/arch/arm64/boot/dts/mediatek/mt6359.dtsi index 779d6dfb55c0036e449d9c54275a74290b46141e..8e1b8c85c6ede94a7beaefcdfc74ce47b3ab50fe 100644 --- a/arch/arm64/boot/dts/mediatek/mt6359.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt6359.dtsi @@ -18,8 +18,6 @@ mt6359codec: mt6359codec { }; regulators { - compatible = "mediatek,mt6359-regulator"; - mt6359_vs1_buck_reg: buck_vs1 { regulator-name = "vs1"; regulator-min-microvolt = <800000>; @@ -298,7 +296,7 @@ mt6359_vsram_others_sshub_ldo: ldo_vsram_others_sshub { }; }; - mt6359rtc: rtc { + mt6359rtc: mt6359rtc { compatible = "mediatek,mt6358-rtc"; }; }; diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi index 22604d3abde3bd2c867238269a6986f02f2eb76a..7ba30209ba9a9ac46815de78b418440fa13c7176 100644 --- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi @@ -617,6 +617,22 @@ power-domain@MT8195_POWER_DOMAIN_VPPSYS0 { #size-cells = <0>; #power-domain-cells = <1>; + power-domain@MT8195_POWER_DOMAIN_VDEC1 { + reg = ; + clocks = <&vdecsys CLK_VDEC_LARB1>; + clock-names = "vdec1-0"; + mediatek,infracfg = <&infracfg_ao>; + #power-domain-cells = <0>; + }; + + power-domain@MT8195_POWER_DOMAIN_VENC_CORE1 { + reg = ; + clocks = <&vencsys_core1 CLK_VENC_CORE1_LARB>; + clock-names = "venc1-larb"; + mediatek,infracfg = <&infracfg_ao>; + #power-domain-cells = <0>; + }; + power-domain@MT8195_POWER_DOMAIN_VDOSYS0 { reg = ; clocks = <&topckgen CLK_TOP_CFG_VDO0>, @@ -662,25 +678,15 @@ power-domain@MT8195_POWER_DOMAIN_VDEC0 { clocks = <&vdecsys_soc CLK_VDEC_SOC_LARB1>; clock-names = "vdec0-0"; mediatek,infracfg = <&infracfg_ao>; - #address-cells = <1>; - #size-cells = <0>; #power-domain-cells = <0>; + }; - power-domain@MT8195_POWER_DOMAIN_VDEC1 { - reg = ; - clocks = <&vdecsys CLK_VDEC_LARB1>; - clock-names = "vdec1-0"; - mediatek,infracfg = <&infracfg_ao>; - #power-domain-cells = <0>; - }; - - power-domain@MT8195_POWER_DOMAIN_VDEC2 { - reg = ; - clocks = <&vdecsys_core1 CLK_VDEC_CORE1_LARB1>; - clock-names = "vdec2-0"; - mediatek,infracfg = <&infracfg_ao>; - #power-domain-cells = <0>; - }; + power-domain@MT8195_POWER_DOMAIN_VDEC2 { + reg = ; + clocks = <&vdecsys_core1 CLK_VDEC_CORE1_LARB1>; + clock-names = "vdec2-0"; + mediatek,infracfg = <&infracfg_ao>; + #power-domain-cells = <0>; }; power-domain@MT8195_POWER_DOMAIN_VENC { @@ -688,17 +694,7 @@ power-domain@MT8195_POWER_DOMAIN_VENC { clocks = <&vencsys CLK_VENC_LARB>; clock-names = "venc0-larb"; mediatek,infracfg = <&infracfg_ao>; - #address-cells = <1>; - #size-cells = <0>; #power-domain-cells = <0>; - - power-domain@MT8195_POWER_DOMAIN_VENC_CORE1 { - reg = ; - clocks = <&vencsys_core1 CLK_VENC_CORE1_LARB>; - clock-names = "venc1-larb"; - mediatek,infracfg = <&infracfg_ao>; - #power-domain-cells = <0>; - }; }; power-domain@MT8195_POWER_DOMAIN_VDOSYS1 { diff --git a/arch/arm64/boot/dts/nvidia/tegra186.dtsi b/arch/arm64/boot/dts/nvidia/tegra186.dtsi index f0b7949df92c0583d0e710e5e2b93818434a913f..2b3bb5d0af17bd521f87db0484fcbe943dd1a797 100644 --- a/arch/arm64/boot/dts/nvidia/tegra186.dtsi +++ b/arch/arm64/boot/dts/nvidia/tegra186.dtsi @@ -621,7 +621,9 @@ uartb: serial@3110000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTB>; + clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTB>; + reset-names = "serial"; status = "disabled"; }; @@ -631,7 +633,9 @@ uartd: serial@3130000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTD>; + clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTD>; + reset-names = "serial"; status = "disabled"; }; @@ -641,7 +645,9 @@ uarte: serial@3140000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTE>; + clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTE>; + reset-names = "serial"; status = "disabled"; }; @@ -651,7 +657,9 @@ uartf: serial@3150000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTF>; + clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTF>; + reset-names = "serial"; status = "disabled"; }; @@ -1228,7 +1236,9 @@ uartc: serial@c280000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTC>; + clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTC>; + reset-names = "serial"; status = "disabled"; }; @@ -1238,7 +1248,9 @@ uartg: serial@c290000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTG>; + clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTG>; + reset-names = "serial"; status = "disabled"; }; diff --git a/arch/arm64/boot/dts/nvidia/tegra194.dtsi b/arch/arm64/boot/dts/nvidia/tegra194.dtsi index c3695077478514708933934f06f25ef7dbe6f923..33f92b77cd9d9e530eae87a4bb8ba61993ceffeb 100644 --- a/arch/arm64/boot/dts/nvidia/tegra194.dtsi +++ b/arch/arm64/boot/dts/nvidia/tegra194.dtsi @@ -766,7 +766,9 @@ uartd: serial@3130000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTD>; + clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTD>; + reset-names = "serial"; status = "disabled"; }; @@ -776,7 +778,9 @@ uarte: serial@3140000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTE>; + clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTE>; + reset-names = "serial"; status = "disabled"; }; @@ -786,7 +790,9 @@ uartf: serial@3150000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTF>; + clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTF>; + reset-names = "serial"; status = "disabled"; }; @@ -811,7 +817,9 @@ uarth: serial@3170000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTH>; + clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTH>; + reset-names = "serial"; status = "disabled"; }; @@ -1608,7 +1616,9 @@ uartc: serial@c280000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTC>; + clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTC>; + reset-names = "serial"; status = "disabled"; }; @@ -1618,7 +1628,9 @@ uartg: serial@c290000 { reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTG>; + clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTG>; + reset-names = "serial"; status = "disabled"; }; diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi index 82e4fd5eb388ff73f9d4badc156b3f1fa54f721e..8a72ad4afd03201c4cbb607d97ce8d1f78fa1c51 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi @@ -231,8 +231,6 @@ cryptobam: dma-controller@704000 { interrupts = ; #dma-cells = <1>; qcom,ee = <1>; - qcom,num-ees = <4>; - num-channels = <16>; qcom,controlled-remotely; }; diff --git a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts index 5498e84bfead0110ceab375e19baf8f0c528b7f2..5c2894fcfa4a08a2954b3ad07b03732219d7be35 100644 --- a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts +++ b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts @@ -985,6 +985,9 @@ &sound { "VA DMIC0", "MIC BIAS1", "VA DMIC1", "MIC BIAS1", "VA DMIC2", "MIC BIAS3", + "VA DMIC0", "VA MIC BIAS1", + "VA DMIC1", "VA MIC BIAS1", + "VA DMIC2", "VA MIC BIAS3", "TX SWR_ADC1", "ADC2_OUTPUT"; wcd-playback-dai-link { diff --git a/arch/arm64/boot/dts/qcom/sda660-inforce-ifc6560.dts b/arch/arm64/boot/dts/qcom/sda660-inforce-ifc6560.dts index d687cfadee6a16ce2aa3b07f7d4b65b899828709..2ed39d402d3f6aeef2529ec997ccea7d373066ca 100644 --- a/arch/arm64/boot/dts/qcom/sda660-inforce-ifc6560.dts +++ b/arch/arm64/boot/dts/qcom/sda660-inforce-ifc6560.dts @@ -155,7 +155,6 @@ &blsp1_dma { * BAM DMA interconnects support is in place. */ /delete-property/ clocks; - /delete-property/ clock-names; }; &blsp1_uart2 { @@ -168,7 +167,6 @@ &blsp2_dma { * BAM DMA interconnects support is in place. */ /delete-property/ clocks; - /delete-property/ clock-names; }; &blsp2_uart1 { diff --git a/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts b/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts index 8221da390e1aa6dd6bb6a8b2421e2c75916896b0..3c47410ba94c0b4df66d77f1e646270e8ba7b44f 100644 --- a/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts +++ b/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts @@ -107,7 +107,6 @@ &qusb2phy0 { status = "okay"; vdd-supply = <&vreg_l1b_0p925>; - vdda-pll-supply = <&vreg_l10a_1p8>; vdda-phy-dpdm-supply = <&vreg_l7b_3p125>; }; @@ -405,8 +404,6 @@ &sdhc_1 { &sdhc_2 { status = "okay"; - cd-gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>; - vmmc-supply = <&vreg_l5b_2p95>; vqmmc-supply = <&vreg_l2b_2p95>; }; diff --git a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts index 5948b401165ce9e75bbcda1869a9fd8a90a66124..d37a433130b98f057497be120047cb480b23cf3b 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts @@ -135,6 +135,8 @@ vdda_pll_cc_ebi23: vdda_sp_sensor: vdda_ufs1_core: vdda_ufs2_core: + vdda_usb1_ss_core: + vdda_usb2_ss_core: vreg_l1a_0p875: ldo1 { regulator-min-microvolt = <880000>; regulator-max-microvolt = <880000>; @@ -155,7 +157,6 @@ vreg_l3a_1p0: ldo3 { regulator-initial-mode = ; }; - vdda_usb1_ss_core: vdd_wcss_cx: vdd_wcss_mx: vdda_wcss_pll: @@ -382,8 +383,8 @@ &ufs_mem_phy { }; &sdhc_2 { - pinctrl-0 = <&sdc2_clk_state &sdc2_cmd_state &sdc2_data_state &sd_card_det_n_state>; pinctrl-names = "default"; + pinctrl-0 = <&sdc2_clk_state &sdc2_cmd_state &sdc2_data_state &sd_card_det_n_state>; cd-gpios = <&tlmm 126 GPIO_ACTIVE_LOW>; vmmc-supply = <&vreg_l21a_2p95>; vqmmc-supply = <&vddpx_2>; @@ -417,9 +418,16 @@ &usb_1_qmpphy { status = "okay"; }; +&wifi { + vdd-0.8-cx-mx-supply = <&vreg_l5a_0p8>; + vdd-1.8-xo-supply = <&vreg_l7a_1p8>; + vdd-1.3-rfa-supply = <&vreg_l17a_1p3>; + vdd-3.3-ch0-supply = <&vreg_l25a_3p3>; + status = "okay"; +}; + &tlmm { - gpio-reserved-ranges = <27 4>, /* SPI (eSE - embedded Secure Element) */ - <85 4>; /* SPI (fingerprint reader) */ + gpio-reserved-ranges = <0 4>, <27 4>, <81 4>, <85 4>; sdc2_clk_state: sdc2-clk-state { pins = "sdc2_clk"; diff --git a/arch/arm64/boot/dts/qcom/sm8250.dtsi b/arch/arm64/boot/dts/qcom/sm8250.dtsi index c9a7d1b75c658d1754e3eda2431929bc3541dd94..21bbffc4e5a284906ef9d23e24287b55a27fb027 100644 --- a/arch/arm64/boot/dts/qcom/sm8250.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi @@ -601,7 +601,7 @@ cpu7_opp8: opp-1632000000 { }; cpu7_opp9: opp-1747200000 { - opp-hz = /bits/ 64 <1747200000>; + opp-hz = /bits/ 64 <1708800000>; opp-peak-kBps = <5412000 42393600>; }; diff --git a/arch/arm64/boot/dts/qcom/sm8350.dtsi b/arch/arm64/boot/dts/qcom/sm8350.dtsi index 215782b1970df982d278e25f719f35d154aa467e..2a4d950ac02bfe2bb339fc6437e83d3ce89fc5b9 100644 --- a/arch/arm64/boot/dts/qcom/sm8350.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8350.dtsi @@ -442,7 +442,7 @@ cdsp_secure_heap: memory@80c00000 { no-map; }; - pil_camera_mem: memory@85200000 { + pil_camera_mem: mmeory@85200000 { reg = <0x0 0x85200000 0x0 0x500000>; no-map; }; @@ -1754,11 +1754,11 @@ cryptobam: dma-controller@1dc4000 { interrupts = ; #dma-cells = <1>; qcom,ee = <0>; - qcom,num-ees = <4>; - num-channels = <16>; qcom,controlled-remotely; iommus = <&apps_smmu 0x594 0x0011>, <&apps_smmu 0x596 0x0011>; + /* FIXME: Probing BAM DMA causes some abort and system hang */ + status = "fail"; }; crypto: crypto@1dfa000 { @@ -1770,6 +1770,8 @@ crypto: crypto@1dfa000 { <&apps_smmu 0x596 0x0011>; interconnects = <&aggre2_noc MASTER_CRYPTO 0 &mc_virt SLAVE_EBI1 0>; interconnect-names = "memory"; + /* FIXME: dependency BAM DMA is disabled */ + status = "disabled"; }; ipa: ipa@1e40000 { diff --git a/arch/arm64/boot/dts/qcom/sm8450.dtsi b/arch/arm64/boot/dts/qcom/sm8450.dtsi index c1ed39cac8c5b7b94026a113d0f5387db876be87..3b4d78823008978249654aa893d873e3efd42f7d 100644 --- a/arch/arm64/boot/dts/qcom/sm8450.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8450.dtsi @@ -4233,8 +4233,6 @@ cryptobam: dma-controller@1dc4000 { interrupts = ; #dma-cells = <1>; qcom,ee = <0>; - qcom,num-ees = <4>; - num-channels = <16>; qcom,controlled-remotely; iommus = <&apps_smmu 0x584 0x11>, <&apps_smmu 0x588 0x0>, diff --git a/arch/arm64/boot/dts/qcom/sm8550.dtsi b/arch/arm64/boot/dts/qcom/sm8550.dtsi index 2f0f1c2ab7391fcc7191eeef2cf1b9b88f6d8808..bc9a1fca2db3ae9a9bc17d691d3e3e0d44bdfda2 100644 --- a/arch/arm64/boot/dts/qcom/sm8550.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8550.dtsi @@ -1064,20 +1064,6 @@ spi13: spi@894000 { status = "disabled"; }; - uart14: serial@898000 { - compatible = "qcom,geni-uart"; - reg = <0 0x898000 0 0x4000>; - clock-names = "se"; - clocks = <&gcc GCC_QUPV3_WRAP2_S6_CLK>; - pinctrl-names = "default"; - pinctrl-0 = <&qup_uart14_default>, <&qup_uart14_cts_rts>; - interrupts = ; - interconnects = <&clk_virt MASTER_QUP_CORE_2 0 &clk_virt SLAVE_QUP_CORE_2 0>, - <&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_QUP_2 0>; - interconnect-names = "qup-core", "qup-config"; - status = "disabled"; - }; - i2c15: i2c@89c000 { compatible = "qcom,geni-i2c"; reg = <0 0x0089c000 0 0x4000>; @@ -1880,8 +1866,6 @@ cryptobam: dma-controller@1dc4000 { interrupts = ; #dma-cells = <1>; qcom,ee = <0>; - qcom,num-ees = <4>; - num-channels = <20>; qcom,controlled-remotely; iommus = <&apps_smmu 0x480 0x0>, <&apps_smmu 0x481 0x0>; @@ -3654,22 +3638,6 @@ qup_uart7_default: qup-uart7-default-state { bias-disable; }; - qup_uart14_default: qup-uart14-default-state { - /* TX, RX */ - pins = "gpio78", "gpio79"; - function = "qup2_se6"; - drive-strength = <2>; - bias-pull-up; - }; - - qup_uart14_cts_rts: qup-uart14-cts-rts-state { - /* CTS, RTS */ - pins = "gpio76", "gpio77"; - function = "qup2_se6"; - drive-strength = <2>; - bias-pull-down; - }; - sdc2_sleep: sdc2-sleep-state { clk-pins { pins = "sdc2_clk"; diff --git a/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-ard-audio-da7212.dtso b/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-ard-audio-da7212.dtso index 99f62574bc3c2a59b998eb63d9cc60db4a96e807..e6f53377ecd90c6b6e245ddb74b7e1f550e500d9 100644 --- a/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-ard-audio-da7212.dtso +++ b/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-ard-audio-da7212.dtso @@ -108,7 +108,7 @@ sound_clk_pins: sound-clk { }; tpu0_pins: tpu0 { - groups = "tpu_to0_b"; + groups = "tpu_to0_a"; function = "tpu"; }; }; diff --git a/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi b/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi index 403a295bde6ab2e7d7271de1a5011911188f9857..2963d634baba99f9f7216904b0a6b542c71d78ba 100644 --- a/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi +++ b/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi @@ -344,18 +344,6 @@ pmic_int: pmic-int { <0 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>; }; }; - - spi1 { - spi1_csn0_gpio_pin: spi1-csn0-gpio-pin { - rockchip,pins = - <3 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up_4ma>; - }; - - spi1_csn1_gpio_pin: spi1-csn1-gpio-pin { - rockchip,pins = - <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up_4ma>; - }; - }; }; &saradc { @@ -367,17 +355,6 @@ &sdmmc { vqmmc-supply = <&vccio_sd>; }; -&spi1 { - /* - * Hardware CS has a very slow rise time of about 6us, - * causing transmission errors. - * With cs-gpios we have a rise time of about 20ns. - */ - cs-gpios = <&gpio3 RK_PB1 GPIO_ACTIVE_LOW>, <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>; - pinctrl-names = "default"; - pinctrl-0 = <&spi1_clk &spi1_csn0_gpio_pin &spi1_csn1_gpio_pin &spi1_miso &spi1_mosi>; -}; - &tsadc { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts index 396a6636073b515cb97a7671617a62a7f649ba86..115c14c0a3c68c44be5c2ed1dc772c5d1496910b 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts +++ b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts @@ -251,6 +251,14 @@ &uart2 { status = "okay"; }; +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + &vopb { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dtsi index c30354268c8f5e4a8aa828296f09fb492e1497d0..93189f830640066a3f979fb6b84a36f67b9ffbd5 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dtsi @@ -486,12 +486,9 @@ &saradc { &sdhci { bus-width = <8>; max-frequency = <200000000>; - mmc-hs200-1_8v; non-removable; pinctrl-names = "default"; - pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd &emmc_datastrobe>; - vmmc-supply = <&vcc_3v3>; - vqmmc-supply = <&vcc_1v8>; + pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/ti/k3-am65-main.dtsi b/arch/arm64/boot/dts/ti/k3-am65-main.dtsi index 0523bd0da80c72ececdc0a31ce8194146d5c95bb..57befcce93b9762f9af518935d58ebd21cb1bfa9 100644 --- a/arch/arm64/boot/dts/ti/k3-am65-main.dtsi +++ b/arch/arm64/boot/dts/ti/k3-am65-main.dtsi @@ -436,8 +436,6 @@ sdhci0: mmc@4f80000 { interrupts = ; mmc-ddr-1_8v; mmc-hs200-1_8v; - ti,clkbuf-sel = <0x7>; - ti,trm-icp = <0x8>; ti,otap-del-sel-legacy = <0x0>; ti,otap-del-sel-mmc-hs = <0x0>; ti,otap-del-sel-sd-hs = <0x0>; @@ -448,9 +446,8 @@ sdhci0: mmc@4f80000 { ti,otap-del-sel-ddr50 = <0x5>; ti,otap-del-sel-ddr52 = <0x5>; ti,otap-del-sel-hs200 = <0x5>; - ti,itap-del-sel-legacy = <0xa>; - ti,itap-del-sel-mmc-hs = <0x1>; - ti,itap-del-sel-ddr52 = <0x0>; + ti,otap-del-sel-hs400 = <0x0>; + ti,trm-icp = <0x8>; dma-coherent; }; @@ -461,22 +458,18 @@ sdhci1: mmc@4fa0000 { clocks = <&k3_clks 48 0>, <&k3_clks 48 1>; clock-names = "clk_ahb", "clk_xin"; interrupts = ; - ti,clkbuf-sel = <0x7>; - ti,trm-icp = <0x8>; ti,otap-del-sel-legacy = <0x0>; ti,otap-del-sel-mmc-hs = <0x0>; ti,otap-del-sel-sd-hs = <0x0>; - ti,otap-del-sel-sdr12 = <0xf>; - ti,otap-del-sel-sdr25 = <0xf>; + ti,otap-del-sel-sdr12 = <0x0>; + ti,otap-del-sel-sdr25 = <0x0>; ti,otap-del-sel-sdr50 = <0x8>; ti,otap-del-sel-sdr104 = <0x7>; ti,otap-del-sel-ddr50 = <0x4>; ti,otap-del-sel-ddr52 = <0x4>; ti,otap-del-sel-hs200 = <0x7>; - ti,itap-del-sel-legacy = <0xa>; - ti,itap-del-sel-sd-hs = <0x1>; - ti,itap-del-sel-sdr12 = <0xa>; - ti,itap-del-sel-sdr25 = <0x1>; + ti,clkbuf-sel = <0x7>; + ti,trm-icp = <0x8>; dma-coherent; }; diff --git a/arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts b/arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts index 2e92f4174b3cf04a9c05ab41da37befa3f4bc90a..5df5946687b3483a3d3da932639e85450137771c 100644 --- a/arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts +++ b/arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts @@ -43,17 +43,6 @@ vusb_main: regulator-vusb-main5v0 { regulator-boot-on; }; - vsys_5v0: regulator-vsys5v0 { - /* Output of LM61460 */ - compatible = "regulator-fixed"; - regulator-name = "vsys_5v0"; - regulator-min-microvolt = <5000000>; - regulator-max-microvolt = <5000000>; - vin-supply = <&vusb_main>; - regulator-always-on; - regulator-boot-on; - }; - vsys_3v3: regulator-vsys3v3 { /* Output of LM5141 */ compatible = "regulator-fixed"; @@ -86,7 +75,7 @@ vdd_sd_dv: regulator-tlv71033 { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; regulator-boot-on; - vin-supply = <&vsys_5v0>; + vin-supply = <&vsys_3v3>; gpios = <&main_gpio0 49 GPIO_ACTIVE_HIGH>; states = <1800000 0x0>, <3300000 0x1>; diff --git a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts index 90ae8e948671d6081a66c820d632b57540210331..fe5207ac7d85d158ff8c95620e155955e16f02af 100644 --- a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts +++ b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts @@ -557,7 +557,6 @@ &usb1 { &ospi1 { pinctrl-names = "default"; pinctrl-0 = <&mcu_fss0_ospi1_pins_default>; - status = "okay"; flash@0 { compatible = "jedec,spi-nor"; diff --git a/arch/arm64/boot/dts/ti/k3-j721e-sk.dts b/arch/arm64/boot/dts/ti/k3-j721e-sk.dts index 952d2c72628ef4c9fa154b155add515e3fd9ba7c..ccacb65683b5b09f4c0e693726c1d81c9037e8d8 100644 --- a/arch/arm64/boot/dts/ti/k3-j721e-sk.dts +++ b/arch/arm64/boot/dts/ti/k3-j721e-sk.dts @@ -183,17 +183,6 @@ vsys_3v3: fixedregulator-vsys3v3 { regulator-boot-on; }; - vsys_5v0: fixedregulator-vsys5v0 { - /* Output of LM61460 */ - compatible = "regulator-fixed"; - regulator-name = "vsys_5v0"; - regulator-min-microvolt = <5000000>; - regulator-max-microvolt = <5000000>; - vin-supply = <&vusb_main>; - regulator-always-on; - regulator-boot-on; - }; - vdd_mmc1: fixedregulator-sd { compatible = "regulator-fixed"; pinctrl-names = "default"; @@ -221,56 +210,6 @@ vdd_sd_dv_alt: gpio-regulator-tps659411 { <3300000 0x1>; }; - vdd_sd_dv: gpio-regulator-TLV71033 { - compatible = "regulator-gpio"; - pinctrl-names = "default"; - pinctrl-0 = <&vdd_sd_dv_pins_default>; - regulator-name = "tlv71033"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <3300000>; - regulator-boot-on; - vin-supply = <&vsys_5v0>; - gpios = <&main_gpio0 118 GPIO_ACTIVE_HIGH>; - states = <1800000 0x0>, - <3300000 0x1>; - }; - - transceiver1: can-phy1 { - compatible = "ti,tcan1042"; - #phy-cells = <0>; - max-bitrate = <5000000>; - pinctrl-names = "default"; - pinctrl-0 = <&mcu_mcan0_gpio_pins_default>; - standby-gpios = <&wkup_gpio0 3 GPIO_ACTIVE_HIGH>; - }; - - transceiver2: can-phy2 { - compatible = "ti,tcan1042"; - #phy-cells = <0>; - max-bitrate = <5000000>; - pinctrl-names = "default"; - pinctrl-0 = <&main_mcan0_gpio_pins_default>; - standby-gpios = <&main_gpio0 65 GPIO_ACTIVE_HIGH>; - }; - - transceiver3: can-phy3 { - compatible = "ti,tcan1042"; - #phy-cells = <0>; - max-bitrate = <5000000>; - pinctrl-names = "default"; - pinctrl-0 = <&main_mcan5_gpio_pins_default>; - standby-gpios = <&main_gpio0 66 GPIO_ACTIVE_HIGH>; - }; - - transceiver4: can-phy4 { - compatible = "ti,tcan1042"; - #phy-cells = <0>; - max-bitrate = <5000000>; - pinctrl-names = "default"; - pinctrl-0 = <&main_mcan9_gpio_pins_default>; - standby-gpios = <&main_gpio0 67 GPIO_ACTIVE_HIGH>; - }; - dp_pwr_3v3: fixedregulator-dp-prw { compatible = "regulator-fixed"; regulator-name = "dp-pwr"; @@ -347,15 +286,6 @@ tfp410_out: endpoint { }; }; }; - - csi_mux: mux-controller { - compatible = "gpio-mux"; - #mux-state-cells = <1>; - mux-gpios = <&main_gpio0 88 GPIO_ACTIVE_HIGH>; - idle-state = <0>; - pinctrl-names = "default"; - pinctrl-0 = <&main_csi_mux_sel_pins_default>; - }; }; &main_pmx0 { @@ -422,51 +352,6 @@ J721E_IOPAD(0x214, PIN_OUTPUT, 4) /* (V4) MCAN1_TX.USB1_DRVVBUS */ >; }; - main_csi_mux_sel_pins_default: main-csi-mux-sel-default-pins { - pinctrl-single,pins = < - J721E_IOPAD(0x164, PIN_OUTPUT, 7) /* (V29) RGMII5_TD2 */ - >; - }; - - main_mcan0_pins_default: main-mcan0-default-pins { - pinctrl-single,pins = < - J721E_IOPAD(0x208, PIN_INPUT, 0) /* (W5) MCAN0_RX */ - J721E_IOPAD(0x20c, PIN_OUTPUT, 0) /* (W6) MCAN0_TX */ - >; - }; - - main_mcan0_gpio_pins_default: main-mcan0-gpio-default-pins { - pinctrl-single,pins = < - J721E_IOPAD(0x108, PIN_INPUT, 7) /* (AD27) PRG0_PRU1_GPO2.GPIO0_65 */ - >; - }; - - main_mcan5_pins_default: main-mcan5-default-pins { - pinctrl-single,pins = < - J721E_IOPAD(0x050, PIN_INPUT, 6) /* (AE21) PRG1_PRU0_GPO18.MCAN5_RX */ - J721E_IOPAD(0x04c, PIN_OUTPUT, 6) /* (AJ21) PRG1_PRU0_GPO17.MCAN5_TX */ - >; - }; - - main_mcan5_gpio_pins_default: main-mcan5-gpio-default-pins { - pinctrl-single,pins = < - J721E_IOPAD(0x10c, PIN_INPUT, 7) /* (AC25) PRG0_PRU1_GPO3.GPIO0_66 */ - >; - }; - - main_mcan9_pins_default: main-mcan9-default-pins { - pinctrl-single,pins = < - J721E_IOPAD(0x0d0, PIN_INPUT, 6) /* (AC27) PRG0_PRU0_GPO8.MCAN9_RX */ - J721E_IOPAD(0x0cc, PIN_OUTPUT, 6) /* (AC28) PRG0_PRU0_GPO7.MCAN9_TX */ - >; - }; - - main_mcan9_gpio_pins_default: main-mcan9-gpio-default-pins { - pinctrl-single,pins = < - J721E_IOPAD(0x110, PIN_INPUT, 7) /* (AD29) PRG0_PRU1_GPO4.GPIO0_67 */ - >; - }; - dp0_pins_default: dp0-default-pins { pinctrl-single,pins = < J721E_IOPAD(0x1c4, PIN_INPUT, 5) /* SPI0_CS1.DP0_HPD */ @@ -626,12 +511,6 @@ J721E_WKUP_IOPAD(0xd4, PIN_OUTPUT, 7) /* (G26) WKUP_GPIO0_9 */ >; }; - vdd_sd_dv_pins_default: vdd-sd-dv-default-pins { - pinctrl-single,pins = < - J721E_IOPAD(0x1dc, PIN_OUTPUT, 7) /* (Y1) SPI1_CLK.GPIO0_118 */ - >; - }; - wkup_uart0_pins_default: wkup-uart0-default-pins { pinctrl-single,pins = < J721E_WKUP_IOPAD(0xa0, PIN_INPUT, 0) /* (J29) WKUP_UART0_RXD */ @@ -655,19 +534,6 @@ J721E_WKUP_IOPAD(0xfc, PIN_INPUT_PULLUP, 0) /* (H24) WKUP_I2C0_SDA */ >; }; - mcu_mcan0_pins_default: mcu-mcan0-default-pins { - pinctrl-single,pins = < - J721E_WKUP_IOPAD(0x0ac, PIN_INPUT, 0) /* (C29) MCU_MCAN0_RX */ - J721E_WKUP_IOPAD(0x0a8, PIN_OUTPUT, 0) /* (D29) MCU_MCAN0_TX */ - >; - }; - - mcu_mcan0_gpio_pins_default: mcu-mcan0-gpio-default-pins { - pinctrl-single,pins = < - J721E_WKUP_IOPAD(0x0bc, PIN_INPUT, 7) /* (F27) WKUP_GPIO0_3 */ - >; - }; - /* Reset for M.2 M Key slot on PCIe1 */ mkey_reset_pins_default: mkey-reset-pns-default-pins { pinctrl-single,pins = < @@ -841,14 +707,14 @@ i2c-mux@70 { reg = <0x70>; /* CSI0 I2C */ - cam0_i2c: i2c@0 { + i2c@0 { #address-cells = <1>; #size-cells = <0>; reg = <0>; }; /* CSI1 I2C */ - cam1_i2c: i2c@1 { + i2c@1 { #address-cells = <1>; #size-cells = <0>; reg = <1>; @@ -1076,34 +942,6 @@ &pcie1_rc { num-lanes = <2>; }; -&mcu_mcan0 { - pinctrl-names = "default"; - pinctrl-0 = <&mcu_mcan0_pins_default>; - phys = <&transceiver1>; - status = "okay"; -}; - -&main_mcan0 { - pinctrl-names = "default"; - pinctrl-0 = <&main_mcan0_pins_default>; - phys = <&transceiver2>; - status = "okay"; -}; - -&main_mcan5 { - pinctrl-names = "default"; - pinctrl-0 = <&main_mcan5_pins_default>; - phys = <&transceiver3>; - status = "okay"; -}; - -&main_mcan9 { - pinctrl-names = "default"; - pinctrl-0 = <&main_mcan9_pins_default>; - phys = <&transceiver4>; - status = "okay"; -}; - &ufs_wrapper { status = "disabled"; }; diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-clk-ccf.dtsi b/arch/arm64/boot/dts/xilinx/zynqmp-clk-ccf.dtsi index 995bd8ce9d43af6006b6d2b8d43cb370f19a812c..ccaca29200bb93519432a7983ca6bb9f4acf3280 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-clk-ccf.dtsi +++ b/arch/arm64/boot/dts/xilinx/zynqmp-clk-ccf.dtsi @@ -10,44 +10,39 @@ #include / { - pss_ref_clk: pss-ref-clk { + pss_ref_clk: pss_ref_clk { bootph-all; compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <33333333>; - clock-output-names = "pss_ref_clk"; }; - video_clk: video-clk { + video_clk: video_clk { bootph-all; compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <27000000>; - clock-output-names = "video_clk"; }; - pss_alt_ref_clk: pss-alt-ref-clk { + pss_alt_ref_clk: pss_alt_ref_clk { bootph-all; compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <0>; - clock-output-names = "pss_alt_ref_clk"; }; - gt_crx_ref_clk: gt-crx-ref-clk { + gt_crx_ref_clk: gt_crx_ref_clk { bootph-all; compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <108000000>; - clock-output-names = "gt_crx_ref_clk"; }; - aux_ref_clk: aux-ref-clk { + aux_ref_clk: aux_ref_clk { bootph-all; compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <27000000>; - clock-output-names = "aux_ref_clk"; }; }; diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index a4fc913d1e4943b01cfa23f315411772f0755848..60af93c04b45a7397573af970c302826af850eda 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig @@ -1412,9 +1412,6 @@ CONFIG_PHY_HISTB_COMBPHY=y CONFIG_PHY_HISI_INNO_USB2=y CONFIG_PHY_MVEBU_CP110_COMPHY=y CONFIG_PHY_MTK_TPHY=y -CONFIG_PHY_MTK_HDMI=m -CONFIG_PHY_MTK_MIPI_DSI=m -CONFIG_PHY_MTK_DP=m CONFIG_PHY_QCOM_EDP=m CONFIG_PHY_QCOM_EUSB2_REPEATER=m CONFIG_PHY_QCOM_PCIE2=m diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h index 0fa067c2324de9149f8f3fe622e4554ad2792b93..376a980f2bad08bb5a823ef4d3e4eccb96892080 100644 --- a/arch/arm64/include/asm/assembler.h +++ b/arch/arm64/include/asm/assembler.h @@ -45,11 +45,6 @@ /* * Save/restore interrupts. */ - .macro save_and_disable_daif, flags - mrs \flags, daif - msr daifset, #0xf - .endm - .macro save_and_disable_irq, flags mrs \flags, daif msr daifset, #3 diff --git a/arch/arm64/include/asm/esr.h b/arch/arm64/include/asm/esr.h index b04575ea3a355ee46a96d8d6ff85733e135f952d..1cdae1b4f03beec90c9e1ab53d6cac27cb357d77 100644 --- a/arch/arm64/include/asm/esr.h +++ b/arch/arm64/include/asm/esr.h @@ -366,14 +366,12 @@ /* * ISS values for SME traps */ -#define ESR_ELx_SME_ISS_SMTC_MASK GENMASK(2, 0) -#define ESR_ELx_SME_ISS_SMTC(esr) ((esr) & ESR_ELx_SME_ISS_SMTC_MASK) - -#define ESR_ELx_SME_ISS_SMTC_SME_DISABLED 0 -#define ESR_ELx_SME_ISS_SMTC_ILL 1 -#define ESR_ELx_SME_ISS_SMTC_SM_DISABLED 2 -#define ESR_ELx_SME_ISS_SMTC_ZA_DISABLED 3 -#define ESR_ELx_SME_ISS_SMTC_ZT_DISABLED 4 + +#define ESR_ELx_SME_ISS_SME_DISABLED 0 +#define ESR_ELx_SME_ISS_ILL 1 +#define ESR_ELx_SME_ISS_SM_DISABLED 2 +#define ESR_ELx_SME_ISS_ZA_DISABLED 3 +#define ESR_ELx_SME_ISS_ZT_DISABLED 4 /* ISS field definitions for MOPS exceptions */ #define ESR_ELx_MOPS_ISS_MEM_INST (UL(1) << 24) diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h index c4840ea6d137f0ccef1c526897502a5e3044962a..7415c63b41874d0fd2c763ff83d42c031e59ce8e 100644 --- a/arch/arm64/include/asm/fpsimd.h +++ b/arch/arm64/include/asm/fpsimd.h @@ -6,7 +6,6 @@ #define __ASM_FP_H #include -#include #include #include #include @@ -70,8 +69,6 @@ struct cpu_fp_state { enum fp_type to_save; }; -DECLARE_PER_CPU(struct cpu_fp_state, fpsimd_last_state); - extern void fpsimd_bind_state_to_cpu(struct cpu_fp_state *fp_state); extern void fpsimd_flush_task_state(struct task_struct *target); diff --git a/arch/arm64/include/asm/tlbflush.h b/arch/arm64/include/asm/tlbflush.h index 6eeb56b6fac13e994db06d5aafe90ed92ca9516a..d37db2f7a54cf0b9666f1eb212b02b6e34bedce5 100644 --- a/arch/arm64/include/asm/tlbflush.h +++ b/arch/arm64/include/asm/tlbflush.h @@ -311,14 +311,13 @@ static inline void arch_tlbbatch_add_pending(struct arch_tlbflush_unmap_batch *b } /* - * If mprotect/munmap/etc occurs during TLB batched flushing, we need to ensure - * all the previously issued TLBIs targeting mm have completed. But since we - * can be executing on a remote CPU, a DSB cannot guarantee this like it can - * for arch_tlbbatch_flush(). Our only option is to flush the entire mm. + * If mprotect/munmap/etc occurs during TLB batched flushing, we need to + * synchronise all the TLBI issued with a DSB to avoid the race mentioned in + * flush_tlb_batched_pending(). */ static inline void arch_flush_tlb_batched_pending(struct mm_struct *mm) { - flush_tlb_mm(mm); + dsb(ish); } /* diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 2ce9ef9d924aacd83a6f0b269986d30de6b04467..82778258855d1a5c91321f403a67b8a151b37891 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -364,7 +364,6 @@ static const struct arm64_ftr_bits ftr_id_aa64mmfr0[] = { }; static const struct arm64_ftr_bits ftr_id_aa64mmfr1[] = { - ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR1_EL1_ECBHB_SHIFT, 4, 0), ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64MMFR1_EL1_TIDCP1_SHIFT, 4, 0), ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR1_EL1_AFP_SHIFT, 4, 0), ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR1_EL1_HCX_SHIFT, 4, 0), @@ -2805,13 +2804,6 @@ static bool has_sve_feature(const struct arm64_cpu_capabilities *cap, int scope) } #endif -#ifdef CONFIG_ARM64_SME -static bool has_sme_feature(const struct arm64_cpu_capabilities *cap, int scope) -{ - return system_supports_sme() && has_user_cpuid_feature(cap, scope); -} -#endif - static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = { HWCAP_CAP(ID_AA64ISAR0_EL1, AES, PMULL, CAP_HWCAP, KERNEL_HWCAP_PMULL), HWCAP_CAP(ID_AA64ISAR0_EL1, AES, AES, CAP_HWCAP, KERNEL_HWCAP_AES), @@ -2883,20 +2875,20 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = { HWCAP_CAP(ID_AA64ISAR2_EL1, MOPS, IMP, CAP_HWCAP, KERNEL_HWCAP_MOPS), HWCAP_CAP(ID_AA64ISAR2_EL1, BC, IMP, CAP_HWCAP, KERNEL_HWCAP_HBC), #ifdef CONFIG_ARM64_SME - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64PFR1_EL1, SME, IMP, CAP_HWCAP, KERNEL_HWCAP_SME), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, FA64, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_FA64), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, SMEver, SME2p1, CAP_HWCAP, KERNEL_HWCAP_SME2P1), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, SMEver, SME2, CAP_HWCAP, KERNEL_HWCAP_SME2), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, I16I64, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_I16I64), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, F64F64, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_F64F64), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, I16I32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_I16I32), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, B16B16, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_B16B16), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, F16F16, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_F16F16), - HWCAP_CAP(ID_MATCH_ID(has_sme_feature, AA64SMFR0_EL1, I8I32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_I8I32), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, F16F32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_F16F32), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, B16F32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_B16F32), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, BI32I32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_BI32I32), - HWCAP_CAP_MATCH_ID(has_sme_feature, ID_AA64SMFR0_EL1, F32F32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_F32F32), + HWCAP_CAP(ID_AA64PFR1_EL1, SME, IMP, CAP_HWCAP, KERNEL_HWCAP_SME), + HWCAP_CAP(ID_AA64SMFR0_EL1, FA64, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_FA64), + HWCAP_CAP(ID_AA64SMFR0_EL1, SMEver, SME2p1, CAP_HWCAP, KERNEL_HWCAP_SME2P1), + HWCAP_CAP(ID_AA64SMFR0_EL1, SMEver, SME2, CAP_HWCAP, KERNEL_HWCAP_SME2), + HWCAP_CAP(ID_AA64SMFR0_EL1, I16I64, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_I16I64), + HWCAP_CAP(ID_AA64SMFR0_EL1, F64F64, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_F64F64), + HWCAP_CAP(ID_AA64SMFR0_EL1, I16I32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_I16I32), + HWCAP_CAP(ID_AA64SMFR0_EL1, B16B16, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_B16B16), + HWCAP_CAP(ID_AA64SMFR0_EL1, F16F16, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_F16F16), + HWCAP_CAP(ID_AA64SMFR0_EL1, I8I32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_I8I32), + HWCAP_CAP(ID_AA64SMFR0_EL1, F16F32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_F16F32), + HWCAP_CAP(ID_AA64SMFR0_EL1, B16F32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_B16F32), + HWCAP_CAP(ID_AA64SMFR0_EL1, BI32I32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_BI32I32), + HWCAP_CAP(ID_AA64SMFR0_EL1, F32F32, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_F32F32), #endif /* CONFIG_ARM64_SME */ {}, }; diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c index 5e8204d250b437c806ec43e9ed0d6cc9991ddaa2..0fc94207e69a8e8fb86097d7a420055356f719b9 100644 --- a/arch/arm64/kernel/entry-common.c +++ b/arch/arm64/kernel/entry-common.c @@ -359,16 +359,20 @@ static bool cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs) * As per the ABI exit SME streaming mode and clear the SVE state not * shared with FPSIMD on syscall entry. */ -static inline void fpsimd_syscall_enter(void) +static inline void fp_user_discard(void) { - /* Ensure PSTATE.SM is clear, but leave PSTATE.ZA as-is. */ + /* + * If SME is active then exit streaming mode. If ZA is active + * then flush the SVE registers but leave userspace access to + * both SVE and SME enabled, otherwise disable SME for the + * task and fall through to disabling SVE too. This means + * that after a syscall we never have any streaming mode + * register state to track, if this changes the KVM code will + * need updating. + */ if (system_supports_sme()) sme_smstop_sm(); - /* - * The CPU is not in streaming mode. If non-streaming SVE is not - * supported, there is no SVE state that needs to be discarded. - */ if (!system_supports_sve()) return; @@ -378,33 +382,6 @@ static inline void fpsimd_syscall_enter(void) sve_vq_minus_one = sve_vq_from_vl(task_get_sve_vl(current)) - 1; sve_flush_live(true, sve_vq_minus_one); } - - /* - * Any live non-FPSIMD SVE state has been zeroed. Allow - * fpsimd_save_user_state() to lazily discard SVE state until either - * the live state is unbound or fpsimd_syscall_exit() is called. - */ - __this_cpu_write(fpsimd_last_state.to_save, FP_STATE_FPSIMD); -} - -static __always_inline void fpsimd_syscall_exit(void) -{ - if (!system_supports_sve()) - return; - - /* - * The current task's user FPSIMD/SVE/SME state is now bound to this - * CPU. The fpsimd_last_state.to_save value is either: - * - * - FP_STATE_FPSIMD, if the state has not been reloaded on this CPU - * since fpsimd_syscall_enter(). - * - * - FP_STATE_CURRENT, if the state has been reloaded on this CPU at - * any point. - * - * Reset this to FP_STATE_CURRENT to stop lazy discarding. - */ - __this_cpu_write(fpsimd_last_state.to_save, FP_STATE_CURRENT); } UNHANDLED(el1t, 64, sync) @@ -696,11 +673,10 @@ static void noinstr el0_svc(struct pt_regs *regs) { enter_from_user_mode(regs); cortex_a76_erratum_1463225_svc_handler(); - fpsimd_syscall_enter(); + fp_user_discard(); local_daif_restore(DAIF_PROCCTX); do_el0_svc(regs); exit_to_user_mode(regs); - fpsimd_syscall_exit(); } static void noinstr el0_fpac(struct pt_regs *regs, unsigned long esr) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 60a3cf3da7181d16f68183f631ee8775a08de1a7..7fcbee0f6c0e4e316da280eb1706c6be5213dd51 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -824,7 +824,6 @@ SYM_CODE_END(__bp_harden_el1_vectors) * */ SYM_FUNC_START(cpu_switch_to) - save_and_disable_daif x11 mov x10, #THREAD_CPU_CONTEXT add x8, x0, x10 mov x9, sp @@ -848,7 +847,6 @@ SYM_FUNC_START(cpu_switch_to) ptrauth_keys_install_kernel x1, x8, x9, x10 scs_save x0 scs_load_current - restore_irq x11 ret SYM_FUNC_END(cpu_switch_to) NOKPROBE(cpu_switch_to) @@ -875,7 +873,6 @@ NOKPROBE(ret_from_fork) * Calls func(regs) using this CPU's irq stack and shadow irq stack. */ SYM_FUNC_START(call_on_irq_stack) - save_and_disable_daif x9 #ifdef CONFIG_SHADOW_CALL_STACK get_current_task x16 scs_save x16 @@ -890,10 +887,8 @@ SYM_FUNC_START(call_on_irq_stack) /* Move to the new stack and call the function there */ add sp, x16, #IRQ_STACK_SIZE - restore_irq x9 blr x1 - save_and_disable_daif x9 /* * Restore the SP from the FP, and restore the FP and LR from the frame * record. @@ -901,7 +896,6 @@ SYM_FUNC_START(call_on_irq_stack) mov sp, x29 ldp x29, x30, [sp], #16 scs_load_current - restore_irq x9 ret SYM_FUNC_END(call_on_irq_stack) NOKPROBE(call_on_irq_stack) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index a1e0cc5353fb12339c8463687f60f61fd7b13cac..bd4f6c6ee0f318e1f60d40755c0f4915edb415b8 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -119,7 +119,7 @@ * whatever is in the FPSIMD registers is not saved to memory, but discarded. */ -DEFINE_PER_CPU(struct cpu_fp_state, fpsimd_last_state); +static DEFINE_PER_CPU(struct cpu_fp_state, fpsimd_last_state); __ro_after_init struct vl_info vl_info[ARM64_VEC_MAX] = { #ifdef CONFIG_ARM64_SVE @@ -473,15 +473,12 @@ static void fpsimd_save(void) return; /* - * Save SVE state if it is live. - * - * The syscall ABI discards live SVE state at syscall entry. When - * entering a syscall, fpsimd_syscall_enter() sets to_save to - * FP_STATE_FPSIMD to allow the SVE state to be lazily discarded until - * either new SVE state is loaded+bound or fpsimd_syscall_exit() is - * called prior to a return to userspace. + * If a task is in a syscall the ABI allows us to only + * preserve the state shared with FPSIMD so don't bother + * saving the full SVE state in that case. */ - if ((last->to_save == FP_STATE_CURRENT && test_thread_flag(TIF_SVE)) || + if ((last->to_save == FP_STATE_CURRENT && test_thread_flag(TIF_SVE) && + !in_syscall(current_pt_regs())) || last->to_save == FP_STATE_SVE) { save_sve_regs = true; save_ffr = true; @@ -1517,7 +1514,7 @@ void do_sme_acc(unsigned long esr, struct pt_regs *regs) * If this not a trap due to SME being disabled then something * is being used in the wrong mode, report as SIGILL. */ - if (ESR_ELx_SME_ISS_SMTC(esr) != ESR_ELx_SME_ISS_SMTC_SME_DISABLED) { + if (ESR_ELx_ISS(esr) != ESR_ELx_SME_ISS_SME_DISABLED) { force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc, 0); return; } @@ -1541,8 +1538,6 @@ void do_sme_acc(unsigned long esr, struct pt_regs *regs) sme_set_vq(vq_minus_one); fpsimd_bind_task_to_cpu(); - } else { - fpsimd_flush_task_state(current); } put_cpu_fpsimd_context(); @@ -1808,7 +1803,7 @@ void fpsimd_update_current_state(struct user_fpsimd_state const *state) get_cpu_fpsimd_context(); current->thread.uw.fpsimd_state = *state; - if (current->thread.fp_type == FP_STATE_SVE) + if (test_thread_flag(TIF_SVE)) fpsimd_to_sve(current); task_fpsimd_load(); diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index c30f5a70bd18f432c2dabe8e52cef09fb79717b0..a26293e0cc555dff9856a09159799dd3a32fa97f 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -139,7 +139,7 @@ unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n) addr += n; if (regs_within_kernel_stack(regs, (unsigned long)addr)) - return READ_ONCE_NOCHECK(*addr); + return *addr; else return 0; } diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index c8e83fe1cd5a7376d24888fe001275c06d821998..bc97916a035a645b49deadb74c9ba2e9d78b6201 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -1253,8 +1253,7 @@ int pud_free_pmd_page(pud_t *pudp, unsigned long addr) next = addr; end = addr + PUD_SIZE; do { - if (pmd_present(pmdp_get(pmdp))) - pmd_free_pte_page(pmdp, next); + pmd_free_pte_page(pmdp, next); } while (pmdp++, next += PMD_SIZE, next != end); pud_clear(pudp); diff --git a/arch/arm64/xen/hypercall.S b/arch/arm64/xen/hypercall.S index ae551b8571374f3b764d167dbf1db656cb2c479e..9d01361696a1450962e05f567d6f2b003d980e22 100644 --- a/arch/arm64/xen/hypercall.S +++ b/arch/arm64/xen/hypercall.S @@ -83,26 +83,7 @@ HYPERCALL3(vcpu_op); HYPERCALL1(platform_op_raw); HYPERCALL2(multicall); HYPERCALL2(vm_assist); - -SYM_FUNC_START(HYPERVISOR_dm_op) - mov x16, #__HYPERVISOR_dm_op; \ - /* - * dm_op hypercalls are issued by the userspace. The kernel needs to - * enable access to TTBR0_EL1 as the hypervisor would issue stage 1 - * translations to user memory via AT instructions. Since AT - * instructions are not affected by the PAN bit (ARMv8.1), we only - * need the explicit uaccess_enable/disable if the TTBR0 PAN emulation - * is enabled (it implies that hardware UAO and PAN disabled). - */ - uaccess_ttbr0_enable x6, x7, x8 - hvc XEN_IMM - - /* - * Disable userspace access from kernel once the hyp call completed. - */ - uaccess_ttbr0_disable x6, x7 - ret -SYM_FUNC_END(HYPERVISOR_dm_op); +HYPERCALL3(dm_op); SYM_FUNC_START(privcmd_call) mov x16, x0 diff --git a/arch/loongarch/include/asm/irqflags.h b/arch/loongarch/include/asm/irqflags.h index 003172b8406be723e518fa637169e3370ea68b13..319a8c616f1f5b60097c30a24f9f24682b9282cc 100644 --- a/arch/loongarch/include/asm/irqflags.h +++ b/arch/loongarch/include/asm/irqflags.h @@ -14,48 +14,40 @@ static inline void arch_local_irq_enable(void) { u32 flags = CSR_CRMD_IE; - register u32 mask asm("t0") = CSR_CRMD_IE; - __asm__ __volatile__( "csrxchg %[val], %[mask], %[reg]\n\t" : [val] "+r" (flags) - : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD) + : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) : "memory"); } static inline void arch_local_irq_disable(void) { u32 flags = 0; - register u32 mask asm("t0") = CSR_CRMD_IE; - __asm__ __volatile__( "csrxchg %[val], %[mask], %[reg]\n\t" : [val] "+r" (flags) - : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD) + : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) : "memory"); } static inline unsigned long arch_local_irq_save(void) { u32 flags = 0; - register u32 mask asm("t0") = CSR_CRMD_IE; - __asm__ __volatile__( "csrxchg %[val], %[mask], %[reg]\n\t" : [val] "+r" (flags) - : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD) + : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) : "memory"); return flags; } static inline void arch_local_irq_restore(unsigned long flags) { - register u32 mask asm("t0") = CSR_CRMD_IE; - __asm__ __volatile__( "csrxchg %[val], %[mask], %[reg]\n\t" : [val] "+r" (flags) - : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD) + : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) : "memory"); } diff --git a/arch/loongarch/mm/hugetlbpage.c b/arch/loongarch/mm/hugetlbpage.c index 58277fd9fb2f0e263f68ceb080efd459b3342cdd..41308429f446121019f736695fc3d69ec4ab2266 100644 --- a/arch/loongarch/mm/hugetlbpage.c +++ b/arch/loongarch/mm/hugetlbpage.c @@ -47,8 +47,7 @@ pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr, pmd = pmd_offset(pud, addr); } } - - return (!pmd || pmd_none(pmdp_get(pmd))) ? NULL : (pte_t *) pmd; + return pmd_none(pmdp_get(pmd)) ? NULL : (pte_t *) pmd; } int pmd_huge(pmd_t pmd) diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c index 9f5603e01a68898a4580d1d42cabff48c94b8787..382f656c29eaeef2d8280ee4c5423f65cd0e1f7b 100644 --- a/arch/m68k/mac/config.c +++ b/arch/m68k/mac/config.c @@ -801,7 +801,7 @@ static void __init mac_identify(void) } macintosh_config = mac_data_table; - for (m = &mac_data_table[1]; m->ident != -1; m++) { + for (m = macintosh_config; m->ident != -1; m++) { if (m->ident == model) { macintosh_config = m; break; diff --git a/arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts b/arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts index 6c277ab83d4b94d838b851486a968df74866667f..c7ea4f1c0bb21f806610734521e9e425df4fa7ca 100644 --- a/arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts +++ b/arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts @@ -29,7 +29,6 @@ msi: msi-controller@2ff00000 { compatible = "loongson,pch-msi-1.0"; reg = <0 0x2ff00000 0 0x8>; interrupt-controller; - #interrupt-cells = <1>; msi-controller; loongson,msi-base-vec = <64>; loongson,msi-num-vecs = <64>; diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile index 0a3249647401d487bddcd3023b877c5d70fb05ea..eb56581f6d734fa8fbfab419a954ba12b685eff0 100644 --- a/arch/mips/vdso/Makefile +++ b/arch/mips/vdso/Makefile @@ -30,7 +30,6 @@ endif # offsets. cflags-vdso := $(ccflags-vdso) \ $(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \ - $(filter -std=%,$(KBUILD_CFLAGS)) \ -O3 -g -fPIC -fno-strict-aliasing -fno-common -fno-builtin -G 0 \ -mrelax-pic-calls $(call cc-option, -mexplicit-relocs) \ -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \ diff --git a/arch/parisc/boot/compressed/Makefile b/arch/parisc/boot/compressed/Makefile index 9fba12b70d1b31576bd3a218398a396f666877bc..a294a1b58ee7ede0ebfbc9d5329a1665be645691 100644 --- a/arch/parisc/boot/compressed/Makefile +++ b/arch/parisc/boot/compressed/Makefile @@ -22,7 +22,6 @@ KBUILD_CFLAGS += -fno-PIE -mno-space-regs -mdisable-fpregs -Os ifndef CONFIG_64BIT KBUILD_CFLAGS += -mfast-indirect-calls endif -KBUILD_CFLAGS += -std=gnu11 LDFLAGS_vmlinux := -X -e startup --as-needed -T $(obj)/vmlinux: $(obj)/vmlinux.lds $(addprefix $(obj)/, $(OBJECTS)) $(LIBGCC) FORCE diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c index e673c71e16d97a2c3022f60924e722da231d29cb..a8e75e5b884a701ad9c84f828a4931821d1444e3 100644 --- a/arch/parisc/kernel/unaligned.c +++ b/arch/parisc/kernel/unaligned.c @@ -24,7 +24,7 @@ #define DPRINTF(fmt, args...) #endif -#define RFMT "0x%08lx" +#define RFMT "%#08lx" /* 1111 1100 0000 0000 0001 0011 1100 0000 */ #define OPCODE1(a,b,c) ((a)<<26|(b)<<12|(c)<<6) diff --git a/arch/powerpc/crypto/Kconfig b/arch/powerpc/crypto/Kconfig index 5c1619f251885301539186b69e1340a72547f5b5..fccf742c55c2c39922e554029b9ed5fa63c291d8 100644 --- a/arch/powerpc/crypto/Kconfig +++ b/arch/powerpc/crypto/Kconfig @@ -129,7 +129,6 @@ config CRYPTO_CHACHA20_P10 config CRYPTO_POLY1305_P10 tristate "Hash functions: Poly1305 (P10 or later)" depends on PPC64 && CPU_LITTLE_ENDIAN && VSX - depends on BROKEN # Needs to be fixed to work in softirq context select CRYPTO_HASH select CRYPTO_LIB_POLY1305_GENERIC help diff --git a/arch/powerpc/include/asm/mmzone.h b/arch/powerpc/include/asm/mmzone.h index f2c4457c94c397f4bc7aa4965d0979474d507ca3..da827d2d08666e1ea33f4fe9346045c4fe4fa554 100644 --- a/arch/powerpc/include/asm/mmzone.h +++ b/arch/powerpc/include/asm/mmzone.h @@ -35,7 +35,6 @@ extern cpumask_var_t node_to_cpumask_map[]; #ifdef CONFIG_MEMORY_HOTPLUG extern unsigned long max_pfn; u64 memory_hotplug_max(void); -u64 hot_add_drconf_memory_max(void); #else #define memory_hotplug_max() memblock_end_of_DRAM() #endif diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index fa792653286659955aecef5168d0ed3d2a3eeeba..e7792aa135105ab00f7a563c0520b093845eb330 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h @@ -183,7 +183,7 @@ /* * Used to name C functions called from asm */ -#if defined(__powerpc64__) && defined(CONFIG_PPC_KERNEL_PCREL) +#ifdef CONFIG_PPC_KERNEL_PCREL #define CFUNC(name) name@notoc #else #define CFUNC(name) name diff --git a/arch/powerpc/include/uapi/asm/ioctls.h b/arch/powerpc/include/uapi/asm/ioctls.h index b5211e413829a2d9c299b6ef05d9df92d2a6d4b7..2c145da3b774a136044e9106e96e38559c9e5832 100644 --- a/arch/powerpc/include/uapi/asm/ioctls.h +++ b/arch/powerpc/include/uapi/asm/ioctls.h @@ -23,10 +23,10 @@ #define TCSETSW _IOW('t', 21, struct termios) #define TCSETSF _IOW('t', 22, struct termios) -#define TCGETA 0x40147417 /* _IOR('t', 23, struct termio) */ -#define TCSETA 0x80147418 /* _IOW('t', 24, struct termio) */ -#define TCSETAW 0x80147419 /* _IOW('t', 25, struct termio) */ -#define TCSETAF 0x8014741c /* _IOW('t', 28, struct termio) */ +#define TCGETA _IOR('t', 23, struct termio) +#define TCSETA _IOW('t', 24, struct termio) +#define TCSETAW _IOW('t', 25, struct termio) +#define TCSETAF _IOW('t', 28, struct termio) #define TCSBRK _IO('t', 29) #define TCXONC _IO('t', 30) diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 131c859b24679eb7b4a0426a2fdd1ee037552570..2919433be35574eb26e687b637c19e2529e88055 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile @@ -165,7 +165,9 @@ endif obj64-$(CONFIG_PPC_TRANSACTIONAL_MEM) += tm.o +ifneq ($(CONFIG_XMON)$(CONFIG_KEXEC_CORE)(CONFIG_PPC_BOOK3S),) obj-y += ppc_save_regs.o +endif obj-$(CONFIG_EPAPR_PARAVIRT) += epapr_paravirt.o epapr_hcalls.o obj-$(CONFIG_KVM_GUEST) += kvm.o kvm_emul.o diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c index 2e286bba2f6456e6f61e01231ef73c27801211c5..ab316e155ea9f5f16b05cb9c6bab16c65057d317 100644 --- a/arch/powerpc/kernel/eeh.c +++ b/arch/powerpc/kernel/eeh.c @@ -1516,8 +1516,6 @@ int eeh_pe_configure(struct eeh_pe *pe) /* Invalid PE ? */ if (!pe) return -ENODEV; - else - ret = eeh_ops->configure_bridge(pe); return ret; } diff --git a/arch/powerpc/kernel/vdso/Makefile b/arch/powerpc/kernel/vdso/Makefile index 47a9533a4dc1d6af04fdec396cb5133a42bfc69f..d5defff8472da7b87a01fa4b9149f5fb93684b63 100644 --- a/arch/powerpc/kernel/vdso/Makefile +++ b/arch/powerpc/kernel/vdso/Makefile @@ -50,7 +50,7 @@ ldflags-$(CONFIG_LD_ORPHAN_WARN) += -Wl,--orphan-handling=$(CONFIG_LD_ORPHAN_WAR ldflags-y += $(filter-out $(CC_AUTO_VAR_INIT_ZERO_ENABLER) $(CC_FLAGS_FTRACE) -Wa$(comma)%, $(KBUILD_CFLAGS)) CC32FLAGS := -m32 -CC32FLAGSREMOVE := -mcmodel=medium -mabi=elfv1 -mabi=elfv2 -mcall-aixdesc -mpcrel +CC32FLAGSREMOVE := -mcmodel=medium -mabi=elfv1 -mabi=elfv2 -mcall-aixdesc ifdef CONFIG_CC_IS_CLANG # This flag is supported by clang for 64-bit but not 32-bit so it will cause # an unused command line flag warning for this file. diff --git a/arch/powerpc/kexec/crash.c b/arch/powerpc/kexec/crash.c index 61552bbb1ea8a3445b6a0a60cb500bddbd6ec576..ef5c2d25ec39769b5b29ac131dd1bae4facd03a2 100644 --- a/arch/powerpc/kexec/crash.c +++ b/arch/powerpc/kexec/crash.c @@ -356,10 +356,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs) if (TRAP(regs) == INTERRUPT_SYSTEM_RESET) is_via_system_reset = 1; - if (IS_ENABLED(CONFIG_SMP)) - crash_smp_send_stop(); - else - crash_kexec_prepare(); + crash_smp_send_stop(); crash_save_cpu(regs, crashing_cpu); diff --git a/arch/powerpc/mm/book3s64/radix_pgtable.c b/arch/powerpc/mm/book3s64/radix_pgtable.c index aff3b37e32d64e3b857b26c8d5836e7c704fd8e1..28460e3340808406782eb4b03e363d10db74a817 100644 --- a/arch/powerpc/mm/book3s64/radix_pgtable.c +++ b/arch/powerpc/mm/book3s64/radix_pgtable.c @@ -912,7 +912,7 @@ int __meminit radix__vmemmap_create_mapping(unsigned long start, return 0; } -#ifdef CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP + bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap) { if (radix_enabled()) @@ -920,7 +920,6 @@ bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap) return false; } -#endif int __meminit vmemmap_check_pmd(pmd_t *pmdp, int node, unsigned long addr, unsigned long next) diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 65a9df0b9e5a096bc82c319c73fe817a1c86d538..f6c4ace3b22197e990f47d3124f5ac800459f21d 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c @@ -1342,7 +1342,7 @@ int hot_add_scn_to_nid(unsigned long scn_addr) return nid; } -u64 hot_add_drconf_memory_max(void) +static u64 hot_add_drconf_memory_max(void) { struct device_node *memory = NULL; struct device_node *dn = NULL; diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 4bb84dc4393fca1f71c5490cfed28c51290d88da..10b946e9c6e756e3d4623495a5613cdcd425e628 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c @@ -2229,10 +2229,6 @@ static struct pmu power_pmu = { #define PERF_SAMPLE_ADDR_TYPE (PERF_SAMPLE_ADDR | \ PERF_SAMPLE_PHYS_ADDR | \ PERF_SAMPLE_DATA_PAGE_SIZE) - -#define SIER_TYPE_SHIFT 15 -#define SIER_TYPE_MASK (0x7ull << SIER_TYPE_SHIFT) - /* * A counter has overflowed; update its count and record * things if requested. Note that interrupts are hard-disabled @@ -2301,22 +2297,6 @@ static void record_and_restart(struct perf_event *event, unsigned long val, is_kernel_addr(mfspr(SPRN_SIAR))) record = 0; - /* - * SIER[46-48] presents instruction type of the sampled instruction. - * In ISA v3.0 and before values "0" and "7" are considered reserved. - * In ISA v3.1, value "7" has been used to indicate "larx/stcx". - * Drop the sample if "type" has reserved values for this field with a - * ISA version check. - */ - if (event->attr.sample_type & PERF_SAMPLE_DATA_SRC && - ppmu->get_mem_data_src) { - val = (regs->dar & SIER_TYPE_MASK) >> SIER_TYPE_SHIFT; - if (val == 0 || (val == 7 && !cpu_has_feature(CPU_FTR_ARCH_31))) { - record = 0; - atomic64_inc(&event->lost_samples); - } - } - /* * Finally record data if requested. */ diff --git a/arch/powerpc/perf/isa207-common.c b/arch/powerpc/perf/isa207-common.c index 031a2b63c171dce5d13553daccffbc9804391fef..56301b2bc8ae87e8e3c94987f6bd224adfbf4d4f 100644 --- a/arch/powerpc/perf/isa207-common.c +++ b/arch/powerpc/perf/isa207-common.c @@ -321,10 +321,8 @@ void isa207_get_mem_data_src(union perf_mem_data_src *dsrc, u32 flags, sier = mfspr(SPRN_SIER); val = (sier & ISA207_SIER_TYPE_MASK) >> ISA207_SIER_TYPE_SHIFT; - if (val != 1 && val != 2 && !(val == 7 && cpu_has_feature(CPU_FTR_ARCH_31))) { - dsrc->val = 0; + if (val != 1 && val != 2 && !(val == 7 && cpu_has_feature(CPU_FTR_ARCH_31))) return; - } idx = (sier & ISA207_SIER_LDST_MASK) >> ISA207_SIER_LDST_SHIFT; sub_idx = (sier & ISA207_SIER_DATA_SRC_MASK) >> ISA207_SIER_DATA_SRC_SHIFT; diff --git a/arch/powerpc/platforms/book3s/vas-api.c b/arch/powerpc/platforms/book3s/vas-api.c index dc6f75d3ac6ef76b272fbd3997d0511abb9204df..0b6365d85d11714a87174dc8ebfee854eb3442c8 100644 --- a/arch/powerpc/platforms/book3s/vas-api.c +++ b/arch/powerpc/platforms/book3s/vas-api.c @@ -521,15 +521,6 @@ static int coproc_mmap(struct file *fp, struct vm_area_struct *vma) return -EINVAL; } - /* - * Map complete page to the paste address. So the user - * space should pass 0ULL to the offset parameter. - */ - if (vma->vm_pgoff) { - pr_debug("Page offset unsupported to map paste address\n"); - return -EINVAL; - } - /* Ensure instance has an open send window */ if (!txwin) { pr_err("No send window open?\n"); diff --git a/arch/powerpc/platforms/powernv/memtrace.c b/arch/powerpc/platforms/powernv/memtrace.c index 35471b679638a8df93dfb376f8d3461d086d17a4..877720c645151f55056f4cbf3a1f7ae964c4573b 100644 --- a/arch/powerpc/platforms/powernv/memtrace.c +++ b/arch/powerpc/platforms/powernv/memtrace.c @@ -48,15 +48,11 @@ static ssize_t memtrace_read(struct file *filp, char __user *ubuf, static int memtrace_mmap(struct file *filp, struct vm_area_struct *vma) { struct memtrace_entry *ent = filp->private_data; - unsigned long ent_nrpages = ent->size >> PAGE_SHIFT; - unsigned long vma_nrpages = vma_pages(vma); - /* The requested page offset should be within object's page count */ - if (vma->vm_pgoff >= ent_nrpages) + if (ent->size < vma->vm_end - vma->vm_start) return -EINVAL; - /* The requested mapping range should remain within the bounds */ - if (vma_nrpages > ent_nrpages - vma->vm_pgoff) + if (vma->vm_pgoff << PAGE_SHIFT >= ent->size) return -EINVAL; vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index bf02f94a973dbde0aee5d627ad4a93ee7c8c2e39..b1e6d275cda9ebaa7fa4659905691348d17faa75 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c @@ -1183,13 +1183,17 @@ static LIST_HEAD(failed_ddw_pdn_list); static phys_addr_t ddw_memory_hotplug_max(void) { - resource_size_t max_addr; + resource_size_t max_addr = memory_hotplug_max(); + struct device_node *memory; -#if defined(CONFIG_NUMA) && defined(CONFIG_MEMORY_HOTPLUG) - max_addr = hot_add_drconf_memory_max(); -#else - max_addr = memblock_end_of_DRAM(); -#endif + for_each_node_by_type(memory, "memory") { + struct resource res; + + if (of_address_to_resource(memory, 0, &res)) + continue; + + max_addr = max_t(resource_size_t, max_addr, res.end + 1); + } return max_addr; } @@ -1467,7 +1471,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn) window->direct = true; /* DDW maps the whole partition, so enable direct DMA mapping */ - ret = walk_system_ram_range(0, ddw_memory_hotplug_max() >> PAGE_SHIFT, + ret = walk_system_ram_range(0, memblock_end_of_DRAM() >> PAGE_SHIFT, win64->value, tce_setrange_multi_pSeriesLP_walk); if (ret) { dev_info(&dev->dev, "failed to map DMA window for %pOF: %d\n", @@ -1654,17 +1658,11 @@ static int iommu_mem_notifier(struct notifier_block *nb, unsigned long action, struct memory_notify *arg = data; int ret = 0; - /* This notifier can get called when onlining persistent memory as well. - * TCEs are not pre-mapped for persistent memory. Persistent memory will - * always be above ddw_memory_hotplug_max() - */ - switch (action) { case MEM_GOING_ONLINE: spin_lock(&dma_win_list_lock); list_for_each_entry(window, &dma_win_list, list) { - if (window->direct && (arg->start_pfn << PAGE_SHIFT) < - ddw_memory_hotplug_max()) { + if (window->direct) { ret |= tce_setrange_multi_pSeriesLP(arg->start_pfn, arg->nr_pages, window->prop); } @@ -1676,8 +1674,7 @@ static int iommu_mem_notifier(struct notifier_block *nb, unsigned long action, case MEM_OFFLINE: spin_lock(&dma_win_list_lock); list_for_each_entry(window, &dma_win_list, list) { - if (window->direct && (arg->start_pfn << PAGE_SHIFT) < - ddw_memory_hotplug_max()) { + if (window->direct) { ret |= tce_clearrange_multi_pSeriesLP(arg->start_pfn, arg->nr_pages, window->prop); } diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c index fdcf10cd4d127081ee2e078f8bc7ddef7609305c..423ee1d5bd9440d3e437e763aca682ac1cd24943 100644 --- a/arch/powerpc/platforms/pseries/msi.c +++ b/arch/powerpc/platforms/pseries/msi.c @@ -519,12 +519,7 @@ static struct msi_domain_info pseries_msi_domain_info = { static void pseries_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) { - struct pci_dev *dev = msi_desc_to_pci_dev(irq_data_get_msi_desc(data)); - - if (dev->current_state == PCI_D0) - __pci_read_msi_msg(irq_data_get_msi_desc(data), msg); - else - get_cached_msi_msg(data->irq, msg); + __pci_read_msi_msg(irq_data_get_msi_desc(data), msg); } static struct irq_chip pseries_msi_irq_chip = { diff --git a/arch/riscv/kvm/vcpu_sbi.c b/arch/riscv/kvm/vcpu_sbi.c index a71d33cd81d3d14a42d41b3de49a1c92afde06fe..be43278109f4e89e86bc7b6e81d4e691e99b1f59 100644 --- a/arch/riscv/kvm/vcpu_sbi.c +++ b/arch/riscv/kvm/vcpu_sbi.c @@ -103,9 +103,9 @@ void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu, struct kvm_vcpu *tmp; kvm_for_each_vcpu(i, tmp, vcpu->kvm) { - spin_lock(&tmp->arch.mp_state_lock); + spin_lock(&vcpu->arch.mp_state_lock); WRITE_ONCE(tmp->arch.mp_state.mp_state, KVM_MP_STATE_STOPPED); - spin_unlock(&tmp->arch.mp_state_lock); + spin_unlock(&vcpu->arch.mp_state_lock); } kvm_make_all_cpus_request(vcpu->kvm, KVM_REQ_SLEEP); diff --git a/arch/riscv/kvm/vcpu_sbi_replace.c b/arch/riscv/kvm/vcpu_sbi_replace.c index 36f5386c60db75c2fe615599e7975e3a7ba38877..87ec68ed52d762d23581f49b0cd31f06402fbb0e 100644 --- a/arch/riscv/kvm/vcpu_sbi_replace.c +++ b/arch/riscv/kvm/vcpu_sbi_replace.c @@ -103,7 +103,7 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_FENCE_I_SENT); break; case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA: - if ((cp->a2 == 0 && cp->a3 == 0) || cp->a3 == -1UL) + if (cp->a2 == 0 && cp->a3 == 0) kvm_riscv_hfence_vvma_all(vcpu->kvm, hbase, hmask); else kvm_riscv_hfence_vvma_gva(vcpu->kvm, hbase, hmask, @@ -111,7 +111,7 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_HFENCE_VVMA_SENT); break; case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID: - if ((cp->a2 == 0 && cp->a3 == 0) || cp->a3 == -1UL) + if (cp->a2 == 0 && cp->a3 == 0) kvm_riscv_hfence_vvma_asid_all(vcpu->kvm, hbase, hmask, cp->a4); else @@ -127,9 +127,9 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID: /* * Until nested virtualization is implemented, the - * SBI HFENCE calls should return not supported - * hence fallthrough. + * SBI HFENCE calls should be treated as NOPs */ + break; default: retdata->err_val = SBI_ERR_NOT_SUPPORTED; } diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 0476ce7700dfaa416e2e170bed952bbdbe6fdb25..ebad8c8b8c57dd755e96d719afed69bd80ff8fcf 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S @@ -639,7 +639,7 @@ SYM_CODE_START(stack_overflow) stmg %r0,%r7,__PT_R0(%r11) stmg %r8,%r9,__PT_PSW(%r11) mvc __PT_R8(64,%r11),0(%r14) - mvc __PT_ORIG_GPR2(8,%r11),__LC_PGM_LAST_BREAK + stg %r10,__PT_ORIG_GPR2(%r11) # store last break to orig_gpr2 xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) lgr %r2,%r11 # pass pointer to pt_regs jg kernel_stack_overflow diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c index 969a5e15691923c7a137601d52e51cf9a241b2ac..090dc38334336b5d6aae37a5abff59e37cfc04a6 100644 --- a/arch/s390/kvm/gaccess.c +++ b/arch/s390/kvm/gaccess.c @@ -490,7 +490,7 @@ enum prot_type { PROT_TYPE_DAT = 3, PROT_TYPE_IEP = 4, /* Dummy value for passing an initialized value when code != PGM_PROTECTION */ - PROT_TYPE_DUMMY, + PROT_NONE, }; static int trans_exc_ending(struct kvm_vcpu *vcpu, int code, unsigned long gva, u8 ar, @@ -506,7 +506,7 @@ static int trans_exc_ending(struct kvm_vcpu *vcpu, int code, unsigned long gva, switch (code) { case PGM_PROTECTION: switch (prot) { - case PROT_TYPE_DUMMY: + case PROT_NONE: /* We should never get here, acts like termination */ WARN_ON_ONCE(1); break; @@ -976,7 +976,7 @@ static int guest_range_to_gpas(struct kvm_vcpu *vcpu, unsigned long ga, u8 ar, gpa = kvm_s390_real_to_abs(vcpu, ga); if (kvm_is_error_gpa(vcpu->kvm, gpa)) { rc = PGM_ADDRESSING; - prot = PROT_TYPE_DUMMY; + prot = PROT_NONE; } } if (rc) @@ -1134,7 +1134,7 @@ int access_guest_with_key(struct kvm_vcpu *vcpu, unsigned long ga, u8 ar, if (rc == PGM_PROTECTION) prot = PROT_TYPE_KEYC; else - prot = PROT_TYPE_DUMMY; + prot = PROT_NONE; rc = trans_exc_ending(vcpu, rc, ga, ar, mode, prot, terminate); } out_unlock: diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 2d8facfd4e42524e8800f6994914952be3afebd6..62ee557d4b4996605dffcc82ea9ebe7413297158 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c @@ -539,15 +539,7 @@ static void bpf_jit_plt(struct bpf_plt *plt, void *ret, void *target) { memcpy(plt, &bpf_plt, sizeof(*plt)); plt->ret = ret; - /* - * (target == NULL) implies that the branch to this PLT entry was - * patched and became a no-op. However, some CPU could have jumped - * to this PLT entry before patching and may be still executing it. - * - * Since the intention in this case is to make the PLT entry a no-op, - * make the target point to the return label instead of NULL. - */ - plt->target = target ?: ret; + plt->target = target; } /* @@ -595,15 +587,17 @@ static void bpf_jit_prologue(struct bpf_jit *jit, struct bpf_prog *fp, } /* Setup stack and backchain */ if (is_first_pass(jit) || (jit->seen & SEEN_STACK)) { - /* lgr %w1,%r15 (backchain) */ - EMIT4(0xb9040000, REG_W1, REG_15); + if (is_first_pass(jit) || (jit->seen & SEEN_FUNC)) + /* lgr %w1,%r15 (backchain) */ + EMIT4(0xb9040000, REG_W1, REG_15); /* la %bfp,STK_160_UNUSED(%r15) (BPF frame pointer) */ EMIT4_DISP(0x41000000, BPF_REG_FP, REG_15, STK_160_UNUSED); /* aghi %r15,-STK_OFF */ EMIT4_IMM(0xa70b0000, REG_15, -(STK_OFF + stack_depth)); - /* stg %w1,152(%r15) (backchain) */ - EMIT6_DISP_LH(0xe3000000, 0x0024, REG_W1, REG_0, - REG_15, 152); + if (is_first_pass(jit) || (jit->seen & SEEN_FUNC)) + /* stg %w1,152(%r15) (backchain) */ + EMIT6_DISP_LH(0xe3000000, 0x0024, REG_W1, REG_0, + REG_15, 152); } } diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c index d969f36bf186f295898249ec36f1b22d51a946eb..b3961f1016ea0b764cee29809dd760460b92296a 100644 --- a/arch/s390/pci/pci_event.c +++ b/arch/s390/pci/pci_event.c @@ -98,10 +98,6 @@ static pci_ers_result_t zpci_event_do_error_state_clear(struct pci_dev *pdev, struct zpci_dev *zdev = to_zpci(pdev); int rc; - /* The underlying device may have been disabled by the event */ - if (!zdev_enabled(zdev)) - return PCI_ERS_RESULT_NEED_RESET; - pr_info("%s: Unblocking device access for examination\n", pci_name(pdev)); rc = zpci_reset_load_store_blocked(zdev); if (rc) { diff --git a/arch/s390/pci/pci_mmio.c b/arch/s390/pci/pci_mmio.c index 2ee7b5a5016c7d415fa6904974f31c376b1c4e43..a90499c087f0c5e917c1f36072f56c0979951d1a 100644 --- a/arch/s390/pci/pci_mmio.c +++ b/arch/s390/pci/pci_mmio.c @@ -223,7 +223,7 @@ static inline int __pcilg_mio_inuser( [ioaddr_len] "+&d" (ioaddr_len.pair), [cc] "+d" (cc), [val] "=d" (val), [dst] "+a" (dst), [cnt] "+d" (cnt), [tmp] "=d" (tmp), - [shift] "+a" (shift) + [shift] "+d" (shift) :: "cc", "memory"); /* did we write everything to the user space buffer? */ diff --git a/arch/um/Makefile b/arch/um/Makefile index 744c5d0bdeb8fcbcde095f67b9a67682a90831a3..34957dcb88b9c31befa3c2b7e08809de73b23a3e 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile @@ -151,6 +151,5 @@ MRPROPER_FILES += $(HOST_DIR)/include/generated archclean: @find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \ -o -name '*.gcov' \) -type f -print | xargs rm -f - $(Q)$(MAKE) -f $(srctree)/Makefile ARCH=$(HEADER_ARCH) clean export HEADER_ARCH SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING DEV_NULL_PATH diff --git a/arch/um/drivers/ubd_user.c b/arch/um/drivers/ubd_user.c index fb5b1e7c133d8667355c381603787d99662b7101..a1afe414ce481481adb956675783b78660a9ab46 100644 --- a/arch/um/drivers/ubd_user.c +++ b/arch/um/drivers/ubd_user.c @@ -41,7 +41,7 @@ int start_io_thread(unsigned long sp, int *fd_out) *fd_out = fds[1]; err = os_set_fd_block(*fd_out, 0); - err |= os_set_fd_block(kernel_fd, 0); + err = os_set_fd_block(kernel_fd, 0); if (err) { printk("start_io_thread - failed to set nonblocking I/O.\n"); goto out_close; diff --git a/arch/um/drivers/vector_kern.c b/arch/um/drivers/vector_kern.c index 1a068859a4185022fd1941fedef3cc5b71a88796..2baa8d4a33ed3d78c1312518805ba96371104f8d 100644 --- a/arch/um/drivers/vector_kern.c +++ b/arch/um/drivers/vector_kern.c @@ -1600,19 +1600,35 @@ static void vector_eth_configure( device->dev = dev; - INIT_LIST_HEAD(&vp->list); - vp->dev = dev; - vp->unit = n; - vp->options = get_transport_options(def); - vp->parsed = def; - vp->max_packet = get_mtu(def) + ETH_HEADER_OTHER; - /* - * TODO - we need to calculate headroom so that ip header - * is 16 byte aligned all the time - */ - vp->headroom = get_headroom(def); - vp->coalesce = 2; - vp->req_size = get_req_size(def); + *vp = ((struct vector_private) + { + .list = LIST_HEAD_INIT(vp->list), + .dev = dev, + .unit = n, + .options = get_transport_options(def), + .rx_irq = 0, + .tx_irq = 0, + .parsed = def, + .max_packet = get_mtu(def) + ETH_HEADER_OTHER, + /* TODO - we need to calculate headroom so that ip header + * is 16 byte aligned all the time + */ + .headroom = get_headroom(def), + .form_header = NULL, + .verify_header = NULL, + .header_rxbuffer = NULL, + .header_txbuffer = NULL, + .header_size = 0, + .rx_header_size = 0, + .rexmit_scheduled = false, + .opened = false, + .transport_data = NULL, + .in_write_poll = false, + .coalesce = 2, + .req_size = get_req_size(def), + .in_error = false, + .bpf = NULL + }); dev->features = dev->hw_features = (NETIF_F_SG | NETIF_F_FRAGLIST); INIT_WORK(&vp->reset_tx, vector_reset_tx); diff --git a/arch/um/include/asm/asm-prototypes.h b/arch/um/include/asm/asm-prototypes.h index 408b31d591279ddd7180c860a1d311b8ae7689e5..5898a26daa0dd4fa78113b70636ab16ff73a7c87 100644 --- a/arch/um/include/asm/asm-prototypes.h +++ b/arch/um/include/asm/asm-prototypes.h @@ -1,6 +1 @@ #include -#include - -#ifdef CONFIG_UML_X86 -extern void cmpxchg8b_emu(void); -#endif diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index c16b80011adaacdc359d55fe707ce57162834c98..6d8ae86ae978fdeef10c52d7d9a8d5cb11a43038 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c @@ -17,122 +17,6 @@ #include #include -/* - * NOTE: UML does not have exception tables. As such, this is almost a copy - * of the code in mm/memory.c, only adjusting the logic to simply check whether - * we are coming from the kernel instead of doing an additional lookup in the - * exception table. - * We can do this simplification because we never get here if the exception was - * fixable. - */ -static inline bool get_mmap_lock_carefully(struct mm_struct *mm, bool is_user) -{ - if (likely(mmap_read_trylock(mm))) - return true; - - if (!is_user) - return false; - - return !mmap_read_lock_killable(mm); -} - -static inline bool mmap_upgrade_trylock(struct mm_struct *mm) -{ - /* - * We don't have this operation yet. - * - * It should be easy enough to do: it's basically a - * atomic_long_try_cmpxchg_acquire() - * from RWSEM_READER_BIAS -> RWSEM_WRITER_LOCKED, but - * it also needs the proper lockdep magic etc. - */ - return false; -} - -static inline bool upgrade_mmap_lock_carefully(struct mm_struct *mm, bool is_user) -{ - mmap_read_unlock(mm); - if (!is_user) - return false; - - return !mmap_write_lock_killable(mm); -} - -/* - * Helper for page fault handling. - * - * This is kind of equivalend to "mmap_read_lock()" followed - * by "find_extend_vma()", except it's a lot more careful about - * the locking (and will drop the lock on failure). - * - * For example, if we have a kernel bug that causes a page - * fault, we don't want to just use mmap_read_lock() to get - * the mm lock, because that would deadlock if the bug were - * to happen while we're holding the mm lock for writing. - * - * So this checks the exception tables on kernel faults in - * order to only do this all for instructions that are actually - * expected to fault. - * - * We can also actually take the mm lock for writing if we - * need to extend the vma, which helps the VM layer a lot. - */ -static struct vm_area_struct * -um_lock_mm_and_find_vma(struct mm_struct *mm, - unsigned long addr, bool is_user) -{ - struct vm_area_struct *vma; - - if (!get_mmap_lock_carefully(mm, is_user)) - return NULL; - - vma = find_vma(mm, addr); - if (likely(vma && (vma->vm_start <= addr))) - return vma; - - /* - * Well, dang. We might still be successful, but only - * if we can extend a vma to do so. - */ - if (!vma || !(vma->vm_flags & VM_GROWSDOWN)) { - mmap_read_unlock(mm); - return NULL; - } - - /* - * We can try to upgrade the mmap lock atomically, - * in which case we can continue to use the vma - * we already looked up. - * - * Otherwise we'll have to drop the mmap lock and - * re-take it, and also look up the vma again, - * re-checking it. - */ - if (!mmap_upgrade_trylock(mm)) { - if (!upgrade_mmap_lock_carefully(mm, is_user)) - return NULL; - - vma = find_vma(mm, addr); - if (!vma) - goto fail; - if (vma->vm_start <= addr) - goto success; - if (!(vma->vm_flags & VM_GROWSDOWN)) - goto fail; - } - - if (expand_stack_locked(vma, addr)) - goto fail; - -success: - mmap_write_downgrade(mm); - return vma; - -fail: - mmap_write_unlock(mm); - return NULL; -} - /* * Note this is constrained to return 0, -EFAULT, -EACCES, -ENOMEM by * segv(). @@ -159,10 +43,21 @@ int handle_page_fault(unsigned long address, unsigned long ip, if (is_user) flags |= FAULT_FLAG_USER; retry: - vma = um_lock_mm_and_find_vma(mm, address, is_user); + mmap_read_lock(mm); + vma = find_vma(mm, address); + if (!vma) + goto out; + if (vma->vm_start <= address) + goto good_area; + if (!(vma->vm_flags & VM_GROWSDOWN)) + goto out; + if (is_user && !ARCH_IS_STACKGROW(address)) + goto out; + vma = expand_stack(mm, address); if (!vma) goto out_nosemaphore; +good_area: *code_out = SEGV_ACCERR; if (is_write) { if (!(vma->vm_flags & VM_WRITE)) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2b5b7d9a24e98c1d237653a174bfcb38e3b69a16..4372657ab0d6fa7451f509ee0dffa10f6bfc8f34 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -128,7 +128,7 @@ config X86 select ARCH_WANTS_DYNAMIC_TASK_STRUCT select ARCH_WANTS_NO_INSTR select ARCH_WANT_GENERAL_HUGETLB - select ARCH_WANT_HUGE_PMD_SHARE if X86_64 + select ARCH_WANT_HUGE_PMD_SHARE select ARCH_WANT_LD_ORPHAN_WARN select ARCH_WANT_OPTIMIZE_DAX_VMEMMAP if X86_64 select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP if X86_64 @@ -2621,15 +2621,6 @@ config MITIGATION_ITS disabled, mitigation cannot be enabled via cmdline. See -config MITIGATION_TSA - bool "Mitigate Transient Scheduler Attacks" - depends on CPU_SUP_AMD - default y - help - Enable mitigation for Transient Scheduler Attacks. TSA is a hardware - security vulnerability on AMD CPUs which can lead to forwarding of - invalid info to subsequent instructions and thus can affect their - timing and thereby cause a leakage. endif config ARCH_HAS_ADD_PAGES diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 6d593fb85a9e936c8795cc76d2b5da2a2178e9e6..c83582b5a010de24e9717fee87bd31f76cdd8c10 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -43,7 +43,7 @@ endif # How to compile the 16-bit code. Note we always compile for -march=i386; # that way we can complain to the user if the CPU is insufficient. -REALMODE_CFLAGS := -std=gnu11 -m16 -g -Os -DDISABLE_BRANCH_PROFILING -D__DISABLE_EXPORTS \ +REALMODE_CFLAGS := -m16 -g -Os -DDISABLE_BRANCH_PROFILING -D__DISABLE_EXPORTS \ -Wall -Wstrict-prototypes -march=i386 -mregparm=3 \ -fno-strict-aliasing -fomit-frame-pointer -fno-pic \ -mno-mmx -mno-sse $(call cc-option,-fcf-protection=none) diff --git a/arch/x86/entry/entry.S b/arch/x86/entry/entry.S index 4e7ecffee762ad79337fcf3855374939f0f9d4f5..ad292c0d971a3f70c7fe6dbf9c2b125bc48befbf 100644 --- a/arch/x86/entry/entry.S +++ b/arch/x86/entry/entry.S @@ -31,20 +31,20 @@ EXPORT_SYMBOL_GPL(entry_ibpb); /* * Define the VERW operand that is disguised as entry code so that - * it can be referenced with KPTI enabled. This ensures VERW can be + * it can be referenced with KPTI enabled. This ensure VERW can be * used late in exit-to-user path after page tables are switched. */ .pushsection .entry.text, "ax" .align L1_CACHE_BYTES, 0xcc -SYM_CODE_START_NOALIGN(x86_verw_sel) +SYM_CODE_START_NOALIGN(mds_verw_sel) UNWIND_HINT_UNDEFINED ANNOTATE_NOENDBR .word __KERNEL_DS .align L1_CACHE_BYTES, 0xcc -SYM_CODE_END(x86_verw_sel); +SYM_CODE_END(mds_verw_sel); /* For KVM */ -EXPORT_SYMBOL_GPL(x86_verw_sel); +EXPORT_SYMBOL_GPL(mds_verw_sel); .popsection diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c index fac3d97111b09808b30fac403b2a03f65bd32b43..f483874fa20f19f7f37bf0515f6705115e91989d 100644 --- a/arch/x86/events/amd/ibs.c +++ b/arch/x86/events/amd/ibs.c @@ -272,7 +272,7 @@ static int perf_ibs_init(struct perf_event *event) { struct hw_perf_event *hwc = &event->hw; struct perf_ibs *perf_ibs; - u64 config; + u64 max_cnt, config; int ret; perf_ibs = get_ibs_pmu(event->attr.type); @@ -306,19 +306,10 @@ static int perf_ibs_init(struct perf_event *event) if (!hwc->sample_period) hwc->sample_period = 0x10; } else { - u64 period = 0; - - if (perf_ibs == &perf_ibs_op) { - period = (config & IBS_OP_MAX_CNT) << 4; - if (ibs_caps & IBS_CAPS_OPCNTEXT) - period |= config & IBS_OP_MAX_CNT_EXT_MASK; - } else { - period = (config & IBS_FETCH_MAX_CNT) << 4; - } - + max_cnt = config & perf_ibs->cnt_mask; config &= ~perf_ibs->cnt_mask; - event->attr.sample_period = period; - hwc->sample_period = period; + event->attr.sample_period = max_cnt << 4; + hwc->sample_period = event->attr.sample_period; } if (!hwc->sample_period) @@ -1228,8 +1219,7 @@ static __init int perf_ibs_op_init(void) if (ibs_caps & IBS_CAPS_OPCNTEXT) { perf_ibs_op.max_period |= IBS_OP_MAX_CNT_EXT_MASK; perf_ibs_op.config_mask |= IBS_OP_MAX_CNT_EXT_MASK; - perf_ibs_op.cnt_mask |= (IBS_OP_MAX_CNT_EXT_MASK | - IBS_OP_CUR_CNT_EXT_MASK); + perf_ibs_op.cnt_mask |= IBS_OP_MAX_CNT_EXT_MASK; } if (ibs_caps & IBS_CAPS_ZEN4) diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 87ea4339e03a28808c6ab28569f50447ab27223b..835c9febb6a854263768a0a4d7a76265912f94e1 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -2734,7 +2734,7 @@ static void intel_pmu_read_event(struct perf_event *event) if (pmu_enabled) intel_pmu_disable_all(); - if (is_topdown_count(event)) + if (is_topdown_event(event)) static_call(intel_pmu_update_topdown_event)(event); else intel_pmu_drain_pebs_buffer(); diff --git a/arch/x86/hyperv/irqdomain.c b/arch/x86/hyperv/irqdomain.c index 865ae4be233b37ffe1c91d30d4ca4ab12ef45670..42c70d28ef272dd3de0c07cbf47efced041b43aa 100644 --- a/arch/x86/hyperv/irqdomain.c +++ b/arch/x86/hyperv/irqdomain.c @@ -192,6 +192,7 @@ static void hv_irq_compose_msi_msg(struct irq_data *data, struct msi_msg *msg) struct pci_dev *dev; struct hv_interrupt_entry out_entry, *stored_entry; struct irq_cfg *cfg = irqd_cfg(data); + const cpumask_t *affinity; int cpu; u64 status; @@ -203,7 +204,8 @@ static void hv_irq_compose_msi_msg(struct irq_data *data, struct msi_msg *msg) return; } - cpu = cpumask_first(irq_data_get_effective_affinity_mask(data)); + affinity = irq_data_get_effective_affinity_mask(data); + cpu = cpumask_first_and(affinity, cpu_online_mask); if (data->chip_data) { /* diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h index 9a0f29be1a9ea634466c31b4a74a4e717b3cefa8..806649c7f23dc627d4680fb0f64a7312468b14a3 100644 --- a/arch/x86/include/asm/bug.h +++ b/arch/x86/include/asm/bug.h @@ -22,9 +22,8 @@ #define SECOND_BYTE_OPCODE_UD2 0x0b #define BUG_NONE 0xffff -#define BUG_UD2 0xfffe -#define BUG_UD1 0xfffd -#define BUG_UD1_UBSAN 0xfffc +#define BUG_UD1 0xfffe +#define BUG_UD2 0xfffd #ifdef CONFIG_GENERIC_BUG diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h index 9c67f8b4c91971bdeb2a8a8e6d896e16d83a82c6..fecc4fe1d68aff799c7b91b363d69e961cefbab1 100644 --- a/arch/x86/include/asm/cpu.h +++ b/arch/x86/include/asm/cpu.h @@ -81,16 +81,4 @@ int intel_microcode_sanity_check(void *mc, bool print_err, int hdr_type); extern struct cpumask cpus_stop_mask; -union zen_patch_rev { - struct { - __u32 rev : 8, - stepping : 4, - model : 4, - __reserved : 4, - ext_model : 4, - ext_fam : 8; - }; - __u32 ucode_rev; -}; - #endif /* _ASM_X86_CPU_H */ diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h index 311cc58f29581d9dd56cce1b0dc8c05601b5601a..8a2482651a6f1e637fbef4a870a50d1d6ef47e37 100644 --- a/arch/x86/include/asm/cpufeatures.h +++ b/arch/x86/include/asm/cpufeatures.h @@ -449,7 +449,6 @@ /* AMD-defined Extended Feature 2 EAX, CPUID level 0x80000021 (EAX), word 20 */ #define X86_FEATURE_NO_NESTED_DATA_BP (20*32+ 0) /* "" No Nested Data Breakpoints */ #define X86_FEATURE_LFENCE_RDTSC (20*32+ 2) /* "" LFENCE always serializing / synchronizes RDTSC */ -#define X86_FEATURE_VERW_CLEAR (20*32+ 5) /* "" The memory form of VERW mitigates TSA */ #define X86_FEATURE_NULL_SEL_CLR_BASE (20*32+ 6) /* "" Null Selector Clears Base */ #define X86_FEATURE_AUTOIBRS (20*32+ 8) /* "" Automatic IBRS */ #define X86_FEATURE_NO_SMM_CTL_MSR (20*32+ 9) /* "" SMM_CTL MSR is not present */ @@ -471,10 +470,6 @@ #define X86_FEATURE_CLEAR_BHB_LOOP_ON_VMEXIT (21*32+ 4) /* "" Clear branch history at vmexit using SW loop */ #define X86_FEATURE_INDIRECT_THUNK_ITS (21*32 + 5) /* "" Use thunk for indirect branches in lower half of cacheline */ -#define X86_FEATURE_TSA_SQ_NO (21*32+11) /* "" AMD CPU not vulnerable to TSA-SQ */ -#define X86_FEATURE_TSA_L1_NO (21*32+12) /* "" AMD CPU not vulnerable to TSA-L1 */ -#define X86_FEATURE_CLEAR_CPU_BUF_VM (21*32+13) /* "" Clear CPU buffers using VERW before VMRUN */ - /* * BUG word(s) */ @@ -526,5 +521,4 @@ #define X86_BUG_IBPB_NO_RET X86_BUG(1*32 + 4) /* "ibpb_no_ret" IBPB omits return target predictions */ #define X86_BUG_ITS X86_BUG(1*32 + 5) /* CPU is affected by Indirect Target Selection */ #define X86_BUG_ITS_NATIVE_ONLY X86_BUG(1*32 + 6) /* CPU is affected by ITS, VMX is not affected */ -#define X86_BUG_TSA X86_BUG(1*32+ 9) /* "tsa" CPU is affected by Transient Scheduler Attacks */ #endif /* _ASM_X86_CPUFEATURES_H */ diff --git a/arch/x86/include/asm/ibt.h b/arch/x86/include/asm/ibt.h index b778ae6e67ee8c9dc009377901a74a2fa1a42080..1e59581d500ca9f82dc073e1587da11fe944873d 100644 --- a/arch/x86/include/asm/ibt.h +++ b/arch/x86/include/asm/ibt.h @@ -41,7 +41,7 @@ _ASM_PTR fname "\n\t" \ ".popsection\n\t" -static __always_inline __attribute_const__ u32 gen_endbr(void) +static inline __attribute_const__ u32 gen_endbr(void) { u32 endbr; @@ -56,7 +56,7 @@ static __always_inline __attribute_const__ u32 gen_endbr(void) return endbr; } -static __always_inline __attribute_const__ u32 gen_endbr_poison(void) +static inline __attribute_const__ u32 gen_endbr_poison(void) { /* * 4 byte NOP that isn't NOP4 (in fact it is OSP NOP3), such that it diff --git a/arch/x86/include/asm/irqflags.h b/arch/x86/include/asm/irqflags.h index 9bfb7b90e2990e21dd229960e03112eb74c1d57a..9acfe2bcf1fd5bbfb6f24e3a606200e9593b4155 100644 --- a/arch/x86/include/asm/irqflags.h +++ b/arch/x86/include/asm/irqflags.h @@ -44,13 +44,13 @@ static __always_inline void native_irq_enable(void) static __always_inline void native_safe_halt(void) { - x86_idle_clear_cpu_buffers(); + mds_idle_clear_cpu_buffers(); asm volatile("sti; hlt": : :"memory"); } static __always_inline void native_halt(void) { - x86_idle_clear_cpu_buffers(); + mds_idle_clear_cpu_buffers(); asm volatile("hlt": : :"memory"); } diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 0338554575815905b8c4d92e5868393dd9151cef..9fbad4cb971bff8f02f2c650119b5716f598381e 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h @@ -575,7 +575,6 @@ #define MSR_AMD64_OSVW_STATUS 0xc0010141 #define MSR_AMD_PPIN_CTL 0xc00102f0 #define MSR_AMD_PPIN 0xc00102f1 -#define MSR_AMD64_CPUID_FN_7 0xc0011002 #define MSR_AMD64_CPUID_FN_1 0xc0011004 #define MSR_AMD64_LS_CFG 0xc0011020 #define MSR_AMD64_DC_CFG 0xc0011022 diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h index ae7a83e3f743e02310dab0e99cdb399809e3c987..bae83810505bf59a666d2358b114fdcc33cc0432 100644 --- a/arch/x86/include/asm/mwait.h +++ b/arch/x86/include/asm/mwait.h @@ -44,6 +44,8 @@ static __always_inline void __monitorx(const void *eax, unsigned long ecx, static __always_inline void __mwait(unsigned long eax, unsigned long ecx) { + mds_idle_clear_cpu_buffers(); + /* "mwait %eax, %ecx;" */ asm volatile(".byte 0x0f, 0x01, 0xc9;" :: "a" (eax), "c" (ecx)); @@ -78,7 +80,7 @@ static __always_inline void __mwait(unsigned long eax, unsigned long ecx) static __always_inline void __mwaitx(unsigned long eax, unsigned long ebx, unsigned long ecx) { - /* No need for TSA buffer clearing on AMD */ + /* No MDS buffer clear as this is AMD/HYGON only */ /* "mwaitx %eax, %ebx, %ecx;" */ asm volatile(".byte 0x0f, 0x01, 0xfb;" @@ -87,7 +89,7 @@ static __always_inline void __mwaitx(unsigned long eax, unsigned long ebx, static __always_inline void __sti_mwait(unsigned long eax, unsigned long ecx) { - + mds_idle_clear_cpu_buffers(); /* "mwait %eax, %ecx;" */ asm volatile("sti; .byte 0x0f, 0x01, 0xc9;" :: "a" (eax), "c" (ecx)); @@ -105,29 +107,24 @@ static __always_inline void __sti_mwait(unsigned long eax, unsigned long ecx) */ static __always_inline void mwait_idle_with_hints(unsigned long eax, unsigned long ecx) { - if (need_resched()) - return; - - x86_idle_clear_cpu_buffers(); - if (static_cpu_has_bug(X86_BUG_MONITOR) || !current_set_polling_and_test()) { - const void *addr = ¤t_thread_info()->flags; - - alternative_input("", "clflush (%[addr])", X86_BUG_CLFLUSH_MONITOR, [addr] "a" (addr)); - __monitor(addr, 0, 0); + if (static_cpu_has_bug(X86_BUG_CLFLUSH_MONITOR)) { + mb(); + clflush((void *)¤t_thread_info()->flags); + mb(); + } - if (need_resched()) - goto out; + __monitor((void *)¤t_thread_info()->flags, 0, 0); - if (ecx & 1) { - __mwait(eax, ecx); - } else { - __sti_mwait(eax, ecx); - raw_local_irq_disable(); + if (!need_resched()) { + if (ecx & 1) { + __mwait(eax, ecx); + } else { + __sti_mwait(eax, ecx); + raw_local_irq_disable(); + } } } - -out: current_clr_polling(); } diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h index 04f5a41c3a04ed417a67a94790c7aa9290e2af06..bc4fa6d09d29d9b00ab91360930b51230ecb4540 100644 --- a/arch/x86/include/asm/nospec-branch.h +++ b/arch/x86/include/asm/nospec-branch.h @@ -324,31 +324,25 @@ .endm /* - * Macro to execute VERW insns that mitigate transient data sampling - * attacks such as MDS or TSA. On affected systems a microcode update - * overloaded VERW insns to also clear the CPU buffers. VERW clobbers - * CFLAGS.ZF. + * Macro to execute VERW instruction that mitigate transient data sampling + * attacks such as MDS. On affected systems a microcode update overloaded VERW + * instruction to also clear the CPU buffers. VERW clobbers CFLAGS.ZF. + * * Note: Only the memory operand variant of VERW clears the CPU buffers. */ -.macro __CLEAR_CPU_BUFFERS feature +.macro CLEAR_CPU_BUFFERS #ifdef CONFIG_X86_64 - ALTERNATIVE "", "verw x86_verw_sel(%rip)", \feature + ALTERNATIVE "", "verw mds_verw_sel(%rip)", X86_FEATURE_CLEAR_CPU_BUF #else /* * In 32bit mode, the memory operand must be a %cs reference. The data * segments may not be usable (vm86 mode), and the stack segment may not * be flat (ESPFIX32). */ - ALTERNATIVE "", "verw %cs:x86_verw_sel", \feature + ALTERNATIVE "", "verw %cs:mds_verw_sel", X86_FEATURE_CLEAR_CPU_BUF #endif .endm -#define CLEAR_CPU_BUFFERS \ - __CLEAR_CPU_BUFFERS X86_FEATURE_CLEAR_CPU_BUF - -#define VM_CLEAR_CPU_BUFFERS \ - __CLEAR_CPU_BUFFERS X86_FEATURE_CLEAR_CPU_BUF_VM - #ifdef CONFIG_X86_64 .macro CLEAR_BRANCH_HISTORY ALTERNATIVE "", "call clear_bhb_loop", X86_FEATURE_CLEAR_BHB_LOOP @@ -598,24 +592,24 @@ DECLARE_STATIC_KEY_FALSE(switch_to_cond_stibp); DECLARE_STATIC_KEY_FALSE(switch_mm_cond_ibpb); DECLARE_STATIC_KEY_FALSE(switch_mm_always_ibpb); -DECLARE_STATIC_KEY_FALSE(cpu_buf_idle_clear); +DECLARE_STATIC_KEY_FALSE(mds_idle_clear); DECLARE_STATIC_KEY_FALSE(switch_mm_cond_l1d_flush); DECLARE_STATIC_KEY_FALSE(mmio_stale_data_clear); -extern u16 x86_verw_sel; +extern u16 mds_verw_sel; #include /** - * x86_clear_cpu_buffers - Buffer clearing support for different x86 CPU vulns + * mds_clear_cpu_buffers - Mitigation for MDS and TAA vulnerability * * This uses the otherwise unused and obsolete VERW instruction in * combination with microcode which triggers a CPU buffer flush when the * instruction is executed. */ -static __always_inline void x86_clear_cpu_buffers(void) +static __always_inline void mds_clear_cpu_buffers(void) { static const u16 ds = __KERNEL_DS; @@ -632,15 +626,14 @@ static __always_inline void x86_clear_cpu_buffers(void) } /** - * x86_idle_clear_cpu_buffers - Buffer clearing support in idle for the MDS - * and TSA vulnerabilities. + * mds_idle_clear_cpu_buffers - Mitigation for MDS vulnerability * * Clear CPU buffers if the corresponding static key is enabled */ -static __always_inline void x86_idle_clear_cpu_buffers(void) +static __always_inline void mds_idle_clear_cpu_buffers(void) { - if (static_branch_likely(&cpu_buf_idle_clear)) - x86_clear_cpu_buffers(); + if (static_branch_likely(&mds_idle_clear)) + mds_clear_cpu_buffers(); } #endif /* __ASSEMBLY__ */ diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index ba2a3935dc624dec86627de07986bb7e501bf5e8..384e8a7db4827be48c0db95377ec077b70e47bc6 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h @@ -501,7 +501,6 @@ struct pebs_xmm { */ #define IBS_OP_CUR_CNT (0xFFF80ULL<<32) #define IBS_OP_CUR_CNT_RAND (0x0007FULL<<32) -#define IBS_OP_CUR_CNT_EXT_MASK (0x7FULL<<52) #define IBS_OP_CNT_CTL (1ULL<<19) #define IBS_OP_VAL (1ULL<<18) #define IBS_OP_ENABLE (1ULL<<17) diff --git a/arch/x86/include/uapi/asm/debugreg.h b/arch/x86/include/uapi/asm/debugreg.h index 41da492dfb01f0867accbc6a8a7fd35ae7d270d5..0007ba077c0c2beac746d7d51e9e00809cfb4fed 100644 --- a/arch/x86/include/uapi/asm/debugreg.h +++ b/arch/x86/include/uapi/asm/debugreg.h @@ -15,26 +15,7 @@ which debugging register was responsible for the trap. The other bits are either reserved or not of interest to us. */ -/* - * Define bits in DR6 which are set to 1 by default. - * - * This is also the DR6 architectural value following Power-up, Reset or INIT. - * - * Note, with the introduction of Bus Lock Detection (BLD) and Restricted - * Transactional Memory (RTM), the DR6 register has been modified: - * - * 1) BLD flag (bit 11) is no longer reserved to 1 if the CPU supports - * Bus Lock Detection. The assertion of a bus lock could clear it. - * - * 2) RTM flag (bit 16) is no longer reserved to 1 if the CPU supports - * restricted transactional memory. #DB occurred inside an RTM region - * could clear it. - * - * Apparently, DR6.BLD and DR6.RTM are active low bits. - * - * As a result, DR6_RESERVED is an incorrect name now, but it is kept for - * compatibility. - */ +/* Define reserved bits in DR6 which are always set to 1 */ #define DR6_RESERVED (0xFFFF0FF0) #define DR_TRAP0 (0x1) /* db0 */ diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 864d62e9461418a6c19e86af0fd8b5bf65bb7674..498f2753777292385512dd1024f9f2dec8907404 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -539,66 +539,6 @@ static void early_init_amd_mc(struct cpuinfo_x86 *c) #endif } -static bool amd_check_tsa_microcode(void) -{ - struct cpuinfo_x86 *c = &boot_cpu_data; - union zen_patch_rev p; - u32 min_rev = 0; - - p.ext_fam = c->x86 - 0xf; - p.model = c->x86_model; - p.ext_model = c->x86_model >> 4; - p.stepping = c->x86_stepping; - /* reserved bits are expected to be 0 in test below */ - p.__reserved = 0; - - if (cpu_has(c, X86_FEATURE_ZEN3) || - cpu_has(c, X86_FEATURE_ZEN4)) { - switch (p.ucode_rev >> 8) { - case 0xa0011: min_rev = 0x0a0011d7; break; - case 0xa0012: min_rev = 0x0a00123b; break; - case 0xa0082: min_rev = 0x0a00820d; break; - case 0xa1011: min_rev = 0x0a10114c; break; - case 0xa1012: min_rev = 0x0a10124c; break; - case 0xa1081: min_rev = 0x0a108109; break; - case 0xa2010: min_rev = 0x0a20102e; break; - case 0xa2012: min_rev = 0x0a201211; break; - case 0xa4041: min_rev = 0x0a404108; break; - case 0xa5000: min_rev = 0x0a500012; break; - case 0xa6012: min_rev = 0x0a60120a; break; - case 0xa7041: min_rev = 0x0a704108; break; - case 0xa7052: min_rev = 0x0a705208; break; - case 0xa7080: min_rev = 0x0a708008; break; - case 0xa70c0: min_rev = 0x0a70c008; break; - case 0xaa002: min_rev = 0x0aa00216; break; - default: - pr_debug("%s: ucode_rev: 0x%x, current revision: 0x%x\n", - __func__, p.ucode_rev, c->microcode); - return false; - } - } - - if (!min_rev) - return false; - - return c->microcode >= min_rev; -} - -static void tsa_init(struct cpuinfo_x86 *c) -{ - if (cpu_has(c, X86_FEATURE_HYPERVISOR)) - return; - - if (cpu_has(c, X86_FEATURE_ZEN3) || - cpu_has(c, X86_FEATURE_ZEN4)) { - if (amd_check_tsa_microcode()) - setup_force_cpu_cap(X86_FEATURE_VERW_CLEAR); - } else { - setup_force_cpu_cap(X86_FEATURE_TSA_SQ_NO); - setup_force_cpu_cap(X86_FEATURE_TSA_L1_NO); - } -} - static void bsp_init_amd(struct cpuinfo_x86 *c) { if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { @@ -705,9 +645,6 @@ static void bsp_init_amd(struct cpuinfo_x86 *c) break; } - - tsa_init(c); - return; warn: @@ -1156,13 +1093,6 @@ static void init_amd_zen2(struct cpuinfo_x86 *c) { fix_erratum_1386(c); zen2_zenbleed_check(c); - - /* Disable RDSEED on AMD Cyan Skillfish because of an error. */ - if (c->x86_model == 0x47 && c->x86_stepping == 0x0) { - clear_cpu_cap(c, X86_FEATURE_RDSEED); - msr_clear_bit(MSR_AMD64_CPUID_FN_7, 18); - pr_emerg("RDSEED is not reliable on this platform; disabling.\n"); - } } static void init_amd_zen3(struct cpuinfo_x86 *c) diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index c4d5ac99c6af84f8046f881530160ce89c535566..e9c4bcb38f45867128fbd019a52f247219a5e3bc 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c @@ -50,7 +50,6 @@ static void __init l1d_flush_select_mitigation(void); static void __init srso_select_mitigation(void); static void __init gds_select_mitigation(void); static void __init its_select_mitigation(void); -static void __init tsa_select_mitigation(void); /* The base value of the SPEC_CTRL MSR without task-specific bits set */ u64 x86_spec_ctrl_base; @@ -123,9 +122,9 @@ DEFINE_STATIC_KEY_FALSE(switch_mm_cond_ibpb); /* Control unconditional IBPB in switch_mm() */ DEFINE_STATIC_KEY_FALSE(switch_mm_always_ibpb); -/* Control CPU buffer clear before idling (halt, mwait) */ -DEFINE_STATIC_KEY_FALSE(cpu_buf_idle_clear); -EXPORT_SYMBOL_GPL(cpu_buf_idle_clear); +/* Control MDS CPU buffer clear before idling (halt, mwait) */ +DEFINE_STATIC_KEY_FALSE(mds_idle_clear); +EXPORT_SYMBOL_GPL(mds_idle_clear); /* * Controls whether l1d flush based mitigations are enabled, @@ -186,7 +185,6 @@ void __init cpu_select_mitigations(void) srso_select_mitigation(); gds_select_mitigation(); its_select_mitigation(); - tsa_select_mitigation(); } /* @@ -447,7 +445,7 @@ static void __init mmio_select_mitigation(void) * is required irrespective of SMT state. */ if (!(x86_arch_cap_msr & ARCH_CAP_FBSDP_NO)) - static_branch_enable(&cpu_buf_idle_clear); + static_branch_enable(&mds_idle_clear); /* * Check if the system has the right microcode. @@ -1444,9 +1442,13 @@ static __ro_after_init enum spectre_v2_mitigation_cmd spectre_v2_cmd; static enum spectre_v2_user_cmd __init spectre_v2_parse_user_cmdline(void) { + enum spectre_v2_user_cmd mode; char arg[20]; int ret, i; + mode = IS_ENABLED(CONFIG_MITIGATION_SPECTRE_V2) ? + SPECTRE_V2_USER_CMD_AUTO : SPECTRE_V2_USER_CMD_NONE; + switch (spectre_v2_cmd) { case SPECTRE_V2_CMD_NONE: return SPECTRE_V2_USER_CMD_NONE; @@ -1459,7 +1461,7 @@ spectre_v2_parse_user_cmdline(void) ret = cmdline_find_option(boot_command_line, "spectre_v2_user", arg, sizeof(arg)); if (ret < 0) - return SPECTRE_V2_USER_CMD_AUTO; + return mode; for (i = 0; i < ARRAY_SIZE(v2_user_options); i++) { if (match_option(arg, ret, v2_user_options[i].option)) { @@ -1469,8 +1471,8 @@ spectre_v2_parse_user_cmdline(void) } } - pr_err("Unknown user space protection option (%s). Switching to AUTO select\n", arg); - return SPECTRE_V2_USER_CMD_AUTO; + pr_err("Unknown user space protection option (%s). Switching to default\n", arg); + return mode; } static inline bool spectre_v2_in_ibrs_mode(enum spectre_v2_mitigation mode) @@ -2084,10 +2086,10 @@ static void update_mds_branch_idle(void) return; if (sched_smt_active()) { - static_branch_enable(&cpu_buf_idle_clear); + static_branch_enable(&mds_idle_clear); } else if (mmio_mitigation == MMIO_MITIGATION_OFF || (x86_arch_cap_msr & ARCH_CAP_FBSDP_NO)) { - static_branch_disable(&cpu_buf_idle_clear); + static_branch_disable(&mds_idle_clear); } } @@ -2095,94 +2097,6 @@ static void update_mds_branch_idle(void) #define TAA_MSG_SMT "TAA CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/tsx_async_abort.html for more details.\n" #define MMIO_MSG_SMT "MMIO Stale Data CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/processor_mmio_stale_data.html for more details.\n" -#undef pr_fmt -#define pr_fmt(fmt) "Transient Scheduler Attacks: " fmt - -enum tsa_mitigations { - TSA_MITIGATION_NONE, - TSA_MITIGATION_UCODE_NEEDED, - TSA_MITIGATION_USER_KERNEL, - TSA_MITIGATION_VM, - TSA_MITIGATION_FULL, -}; - -static const char * const tsa_strings[] = { - [TSA_MITIGATION_NONE] = "Vulnerable", - [TSA_MITIGATION_UCODE_NEEDED] = "Vulnerable: Clear CPU buffers attempted, no microcode", - [TSA_MITIGATION_USER_KERNEL] = "Mitigation: Clear CPU buffers: user/kernel boundary", - [TSA_MITIGATION_VM] = "Mitigation: Clear CPU buffers: VM", - [TSA_MITIGATION_FULL] = "Mitigation: Clear CPU buffers", -}; - -static enum tsa_mitigations tsa_mitigation __ro_after_init = - IS_ENABLED(CONFIG_MITIGATION_TSA) ? TSA_MITIGATION_FULL : TSA_MITIGATION_NONE; - -static int __init tsa_parse_cmdline(char *str) -{ - if (!str) - return -EINVAL; - - if (!strcmp(str, "off")) - tsa_mitigation = TSA_MITIGATION_NONE; - else if (!strcmp(str, "on")) - tsa_mitigation = TSA_MITIGATION_FULL; - else if (!strcmp(str, "user")) - tsa_mitigation = TSA_MITIGATION_USER_KERNEL; - else if (!strcmp(str, "vm")) - tsa_mitigation = TSA_MITIGATION_VM; - else - pr_err("Ignoring unknown tsa=%s option.\n", str); - - return 0; -} -early_param("tsa", tsa_parse_cmdline); - -static void __init tsa_select_mitigation(void) -{ - if (tsa_mitigation == TSA_MITIGATION_NONE) - return; - - if (cpu_mitigations_off() || !boot_cpu_has_bug(X86_BUG_TSA)) { - tsa_mitigation = TSA_MITIGATION_NONE; - return; - } - - if (!boot_cpu_has(X86_FEATURE_VERW_CLEAR)) - tsa_mitigation = TSA_MITIGATION_UCODE_NEEDED; - - switch (tsa_mitigation) { - case TSA_MITIGATION_USER_KERNEL: - setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF); - break; - - case TSA_MITIGATION_VM: - setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM); - break; - - case TSA_MITIGATION_UCODE_NEEDED: - if (!boot_cpu_has(X86_FEATURE_HYPERVISOR)) - goto out; - - pr_notice("Forcing mitigation on in a VM\n"); - - /* - * On the off-chance that microcode has been updated - * on the host, enable the mitigation in the guest just - * in case. - */ - fallthrough; - case TSA_MITIGATION_FULL: - setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF); - setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM); - break; - default: - break; - } - -out: - pr_info("%s\n", tsa_strings[tsa_mitigation]); -} - void cpu_bugs_smt_update(void) { mutex_lock(&spec_ctrl_mutex); @@ -2236,24 +2150,6 @@ void cpu_bugs_smt_update(void) break; } - switch (tsa_mitigation) { - case TSA_MITIGATION_USER_KERNEL: - case TSA_MITIGATION_VM: - case TSA_MITIGATION_FULL: - case TSA_MITIGATION_UCODE_NEEDED: - /* - * TSA-SQ can potentially lead to info leakage between - * SMT threads. - */ - if (sched_smt_active()) - static_branch_enable(&cpu_buf_idle_clear); - else - static_branch_disable(&cpu_buf_idle_clear); - break; - case TSA_MITIGATION_NONE: - break; - } - mutex_unlock(&spec_ctrl_mutex); } @@ -3183,11 +3079,6 @@ static ssize_t gds_show_state(char *buf) return sysfs_emit(buf, "%s\n", gds_strings[gds_mitigation]); } -static ssize_t tsa_show_state(char *buf) -{ - return sysfs_emit(buf, "%s\n", tsa_strings[tsa_mitigation]); -} - static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr, char *buf, unsigned int bug) { @@ -3249,9 +3140,6 @@ static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr case X86_BUG_ITS: return its_show_state(buf); - case X86_BUG_TSA: - return tsa_show_state(buf); - default: break; } @@ -3336,9 +3224,4 @@ ssize_t cpu_show_indirect_target_selection(struct device *dev, struct device_att { return cpu_show_common(dev, attr, buf, X86_BUG_ITS); } - -ssize_t cpu_show_tsa(struct device *dev, struct device_attribute *attr, char *buf) -{ - return cpu_show_common(dev, attr, buf, X86_BUG_TSA); -} #endif diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index f66c71bffa6d9366ac5a4b84a366e987f0693f83..067e31fb9e165d78b8975d0dd55c7e9ca6172548 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -1066,18 +1066,17 @@ void get_cpu_cap(struct cpuinfo_x86 *c) c->x86_capability[CPUID_D_1_EAX] = eax; } - /* - * Check if extended CPUID leaves are implemented: Max extended - * CPUID leaf must be in the 0x80000001-0x8000ffff range. - */ + /* AMD-defined flags: level 0x80000001 */ eax = cpuid_eax(0x80000000); - c->extended_cpuid_level = ((eax & 0xffff0000) == 0x80000000) ? eax : 0; + c->extended_cpuid_level = eax; - if (c->extended_cpuid_level >= 0x80000001) { - cpuid(0x80000001, &eax, &ebx, &ecx, &edx); + if ((eax & 0xffff0000) == 0x80000000) { + if (eax >= 0x80000001) { + cpuid(0x80000001, &eax, &ebx, &ecx, &edx); - c->x86_capability[CPUID_8000_0001_ECX] = ecx; - c->x86_capability[CPUID_8000_0001_EDX] = edx; + c->x86_capability[CPUID_8000_0001_ECX] = ecx; + c->x86_capability[CPUID_8000_0001_EDX] = edx; + } } if (c->extended_cpuid_level >= 0x80000007) { @@ -1277,8 +1276,6 @@ static const __initconst struct x86_cpu_id cpu_vuln_whitelist[] = { #define ITS BIT(8) /* CPU is affected by Indirect Target Selection, but guest-host isolation is not affected */ #define ITS_NATIVE_ONLY BIT(9) -/* CPU is affected by Transient Scheduler Attacks */ -#define TSA BIT(10) static const struct x86_cpu_id cpu_vuln_blacklist[] __initconst = { VULNBL_INTEL_STEPPINGS(IVYBRIDGE, X86_STEPPING_ANY, SRBDS), @@ -1326,7 +1323,7 @@ static const struct x86_cpu_id cpu_vuln_blacklist[] __initconst = { VULNBL_AMD(0x16, RETBLEED), VULNBL_AMD(0x17, RETBLEED | SMT_RSB | SRSO), VULNBL_HYGON(0x18, RETBLEED | SMT_RSB | SRSO), - VULNBL_AMD(0x19, SRSO | TSA), + VULNBL_AMD(0x19, SRSO), {} }; @@ -1531,16 +1528,6 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c) setup_force_cpu_bug(X86_BUG_ITS_NATIVE_ONLY); } - if (c->x86_vendor == X86_VENDOR_AMD) { - if (!cpu_has(c, X86_FEATURE_TSA_SQ_NO) || - !cpu_has(c, X86_FEATURE_TSA_L1_NO)) { - if (cpu_matches(cpu_vuln_blacklist, TSA) || - /* Enable bug on Zen guests to allow for live migration. */ - (cpu_has(c, X86_FEATURE_HYPERVISOR) && cpu_has(c, X86_FEATURE_ZEN))) - setup_force_cpu_bug(X86_BUG_TSA); - } - } - if (cpu_matches(cpu_vuln_whitelist, NO_MELTDOWN)) return; @@ -2227,16 +2214,20 @@ EXPORT_PER_CPU_SYMBOL(__stack_chk_guard); #endif /* CONFIG_X86_64 */ -static void initialize_debug_regs(void) +/* + * Clear all 6 debug registers: + */ +static void clear_all_debug_regs(void) { - /* Control register first -- to make sure everything is disabled. */ - set_debugreg(0, 7); - set_debugreg(DR6_RESERVED, 6); - /* dr5 and dr4 don't exist */ - set_debugreg(0, 3); - set_debugreg(0, 2); - set_debugreg(0, 1); - set_debugreg(0, 0); + int i; + + for (i = 0; i < 8; i++) { + /* Ignore db4, db5 */ + if ((i == 4) || (i == 5)) + continue; + + set_debugreg(0, i); + } } #ifdef CONFIG_KGDB @@ -2379,7 +2370,7 @@ void cpu_init(void) load_mm_ldt(&init_mm); - initialize_debug_regs(); + clear_all_debug_regs(); dbg_restore_debug_regs(); doublefault_init_cpu_tss(); diff --git a/arch/x86/kernel/cpu/mce/amd.c b/arch/x86/kernel/cpu/mce/amd.c index b89c5a38540341d98d8e7befecff5990ccad7f5b..c267f43de39eab1c549857ecc5ba7b58937ad63d 100644 --- a/arch/x86/kernel/cpu/mce/amd.c +++ b/arch/x86/kernel/cpu/mce/amd.c @@ -335,6 +335,7 @@ static void smca_configure(unsigned int bank, unsigned int cpu) struct thresh_restart { struct threshold_block *b; + int reset; int set_lvt_off; int lvt_off; u16 old_limit; @@ -429,13 +430,13 @@ static void threshold_restart_bank(void *_tr) rdmsr(tr->b->address, lo, hi); - /* - * Reset error count and overflow bit. - * This is done during init or after handling an interrupt. - */ - if (hi & MASK_OVERFLOW_HI || tr->set_lvt_off) { - hi &= ~(MASK_ERR_COUNT_HI | MASK_OVERFLOW_HI); - hi |= THRESHOLD_MAX - tr->b->threshold_limit; + if (tr->b->threshold_limit < (hi & THRESHOLD_MAX)) + tr->reset = 1; /* limit cannot be lower than err count */ + + if (tr->reset) { /* reset err count and overflow bit */ + hi = + (hi & ~(MASK_ERR_COUNT_HI | MASK_OVERFLOW_HI)) | + (THRESHOLD_MAX - tr->b->threshold_limit); } else if (tr->old_limit) { /* change limit w/o reset */ int new_count = (hi & THRESHOLD_MAX) + (tr->old_limit - tr->b->threshold_limit); @@ -1048,20 +1049,13 @@ static const char *get_name(unsigned int cpu, unsigned int bank, struct threshol } bank_type = smca_get_bank_type(cpu, bank); + if (bank_type >= N_SMCA_BANK_TYPES) + return NULL; if (b && (bank_type == SMCA_UMC || bank_type == SMCA_UMC_V2)) { if (b->block < ARRAY_SIZE(smca_umc_block_names)) return smca_umc_block_names[b->block]; - } - - if (b && b->block) { - snprintf(buf_mcatype, MAX_MCATYPE_NAME_LEN, "th_block_%u", b->block); - return buf_mcatype; - } - - if (bank_type >= N_SMCA_BANK_TYPES) { - snprintf(buf_mcatype, MAX_MCATYPE_NAME_LEN, "th_bank_%u", bank); - return buf_mcatype; + return NULL; } if (per_cpu(smca_bank_counts, cpu)[bank_type] == 1) diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c index 106436ec3c005e0ada33471d3f23df24ce704271..e103c227acd3ae4f43b128030461d8accc4ae38c 100644 --- a/arch/x86/kernel/cpu/mce/core.c +++ b/arch/x86/kernel/cpu/mce/core.c @@ -2704,9 +2704,15 @@ static int mce_cpu_dead(unsigned int cpu) static int mce_cpu_online(unsigned int cpu) { struct timer_list *t = this_cpu_ptr(&mce_timer); + int ret; mce_device_create(cpu); - mce_threshold_create_device(cpu); + + ret = mce_threshold_create_device(cpu); + if (ret) { + mce_device_remove(cpu); + return ret; + } mce_reenable_cpu(); mce_start_timer(t); return 0; diff --git a/arch/x86/kernel/cpu/mce/intel.c b/arch/x86/kernel/cpu/mce/intel.c index 0a9ce4f8a88cf590e4136c98166701f36cd69843..f5323551c1a9a9aab0a87de057db19f6e1819b94 100644 --- a/arch/x86/kernel/cpu/mce/intel.c +++ b/arch/x86/kernel/cpu/mce/intel.c @@ -517,7 +517,6 @@ void mce_intel_feature_init(struct cpuinfo_x86 *c) void mce_intel_feature_clear(struct cpuinfo_x86 *c) { intel_clear_lmce(); - cmci_clear(); } bool intel_filter_mce(struct mce *m) diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c index 7444fe0e3d08cd642160568851a27109fc563726..9b0570f769eb3d11f51e4427ffde17693199daf2 100644 --- a/arch/x86/kernel/cpu/microcode/amd.c +++ b/arch/x86/kernel/cpu/microcode/amd.c @@ -96,6 +96,18 @@ static struct equiv_cpu_table { struct equiv_cpu_entry *entry; } equiv_table; +union zen_patch_rev { + struct { + __u32 rev : 8, + stepping : 4, + model : 4, + __reserved : 4, + ext_model : 4, + ext_fam : 8; + }; + __u32 ucode_rev; +}; + union cpuid_1_eax { struct { __u32 stepping : 4, diff --git a/arch/x86/kernel/cpu/microcode/amd_shas.c b/arch/x86/kernel/cpu/microcode/amd_shas.c index 1fd349cfc8024aa2490ea2e7be1bfa52775f3499..2a1655b1fdd88344ae26427c8bf2536b3a11ef1b 100644 --- a/arch/x86/kernel/cpu/microcode/amd_shas.c +++ b/arch/x86/kernel/cpu/microcode/amd_shas.c @@ -231,13 +231,6 @@ static const struct patch_digest phashes[] = { 0x0d,0x5b,0x65,0x34,0x69,0xb2,0x62,0x21, } }, - { 0xa0011d7, { - 0x35,0x07,0xcd,0x40,0x94,0xbc,0x81,0x6b, - 0xfc,0x61,0x56,0x1a,0xe2,0xdb,0x96,0x12, - 0x1c,0x1c,0x31,0xb1,0x02,0x6f,0xe5,0xd2, - 0xfe,0x1b,0x04,0x03,0x2c,0x8f,0x4c,0x36, - } - }, { 0xa001223, { 0xfb,0x32,0x5f,0xc6,0x83,0x4f,0x8c,0xb8, 0xa4,0x05,0xf9,0x71,0x53,0x01,0x16,0xc4, @@ -301,13 +294,6 @@ static const struct patch_digest phashes[] = { 0xc0,0xcd,0x33,0xf2,0x8d,0xf9,0xef,0x59, } }, - { 0xa00123b, { - 0xef,0xa1,0x1e,0x71,0xf1,0xc3,0x2c,0xe2, - 0xc3,0xef,0x69,0x41,0x7a,0x54,0xca,0xc3, - 0x8f,0x62,0x84,0xee,0xc2,0x39,0xd9,0x28, - 0x95,0xa7,0x12,0x49,0x1e,0x30,0x71,0x72, - } - }, { 0xa00820c, { 0xa8,0x0c,0x81,0xc0,0xa6,0x00,0xe7,0xf3, 0x5f,0x65,0xd3,0xb9,0x6f,0xea,0x93,0x63, @@ -315,13 +301,6 @@ static const struct patch_digest phashes[] = { 0xe1,0x3b,0x8d,0xb2,0xf8,0x22,0x03,0xe2, } }, - { 0xa00820d, { - 0xf9,0x2a,0xc0,0xf4,0x9e,0xa4,0x87,0xa4, - 0x7d,0x87,0x00,0xfd,0xab,0xda,0x19,0xca, - 0x26,0x51,0x32,0xc1,0x57,0x91,0xdf,0xc1, - 0x05,0xeb,0x01,0x7c,0x5a,0x95,0x21,0xb7, - } - }, { 0xa10113e, { 0x05,0x3c,0x66,0xd7,0xa9,0x5a,0x33,0x10, 0x1b,0xf8,0x9c,0x8f,0xed,0xfc,0xa7,0xa0, @@ -343,13 +322,6 @@ static const struct patch_digest phashes[] = { 0xf1,0x5e,0xb0,0xde,0xb4,0x98,0xae,0xc4, } }, - { 0xa10114c, { - 0x9e,0xb6,0xa2,0xd9,0x87,0x38,0xc5,0x64, - 0xd8,0x88,0xfa,0x78,0x98,0xf9,0x6f,0x74, - 0x39,0x90,0x1b,0xa5,0xcf,0x5e,0xb4,0x2a, - 0x02,0xff,0xd4,0x8c,0x71,0x8b,0xe2,0xc0, - } - }, { 0xa10123e, { 0x03,0xb9,0x2c,0x76,0x48,0x93,0xc9,0x18, 0xfb,0x56,0xfd,0xf7,0xe2,0x1d,0xca,0x4d, @@ -371,13 +343,6 @@ static const struct patch_digest phashes[] = { 0x1b,0x7d,0x64,0x9d,0x4b,0x53,0x13,0x75, } }, - { 0xa10124c, { - 0x29,0xea,0xf1,0x2c,0xb2,0xe4,0xef,0x90, - 0xa4,0xcd,0x1d,0x86,0x97,0x17,0x61,0x46, - 0xfc,0x22,0xcb,0x57,0x75,0x19,0xc8,0xcc, - 0x0c,0xf5,0xbc,0xac,0x81,0x9d,0x9a,0xd2, - } - }, { 0xa108108, { 0xed,0xc2,0xec,0xa1,0x15,0xc6,0x65,0xe9, 0xd0,0xef,0x39,0xaa,0x7f,0x55,0x06,0xc6, @@ -385,13 +350,6 @@ static const struct patch_digest phashes[] = { 0x28,0x1e,0x9c,0x59,0x69,0x99,0x4d,0x16, } }, - { 0xa108109, { - 0x85,0xb4,0xbd,0x7c,0x49,0xa7,0xbd,0xfa, - 0x49,0x36,0x80,0x81,0xc5,0xb7,0x39,0x1b, - 0x9a,0xaa,0x50,0xde,0x9b,0xe9,0x32,0x35, - 0x42,0x7e,0x51,0x4f,0x52,0x2c,0x28,0x59, - } - }, { 0xa20102d, { 0xf9,0x6e,0xf2,0x32,0xd3,0x0f,0x5f,0x11, 0x59,0xa1,0xfe,0xcc,0xcd,0x9b,0x42,0x89, @@ -399,13 +357,6 @@ static const struct patch_digest phashes[] = { 0x8c,0xe9,0x19,0x3e,0xcc,0x3f,0x7b,0xb4, } }, - { 0xa20102e, { - 0xbe,0x1f,0x32,0x04,0x0d,0x3c,0x9c,0xdd, - 0xe1,0xa4,0xbf,0x76,0x3a,0xec,0xc2,0xf6, - 0x11,0x00,0xa7,0xaf,0x0f,0xe5,0x02,0xc5, - 0x54,0x3a,0x1f,0x8c,0x16,0xb5,0xff,0xbe, - } - }, { 0xa201210, { 0xe8,0x6d,0x51,0x6a,0x8e,0x72,0xf3,0xfe, 0x6e,0x16,0xbc,0x62,0x59,0x40,0x17,0xe9, @@ -413,13 +364,6 @@ static const struct patch_digest phashes[] = { 0xf7,0x55,0xf0,0x13,0xbb,0x22,0xf6,0x41, } }, - { 0xa201211, { - 0x69,0xa1,0x17,0xec,0xd0,0xf6,0x6c,0x95, - 0xe2,0x1e,0xc5,0x59,0x1a,0x52,0x0a,0x27, - 0xc4,0xed,0xd5,0x59,0x1f,0xbf,0x00,0xff, - 0x08,0x88,0xb5,0xe1,0x12,0xb6,0xcc,0x27, - } - }, { 0xa404107, { 0xbb,0x04,0x4e,0x47,0xdd,0x5e,0x26,0x45, 0x1a,0xc9,0x56,0x24,0xa4,0x4c,0x82,0xb0, @@ -427,13 +371,6 @@ static const struct patch_digest phashes[] = { 0x13,0xbc,0xc5,0x25,0xe4,0xc5,0xc3,0x99, } }, - { 0xa404108, { - 0x69,0x67,0x43,0x06,0xf8,0x0c,0x62,0xdc, - 0xa4,0x21,0x30,0x4f,0x0f,0x21,0x2c,0xcb, - 0xcc,0x37,0xf1,0x1c,0xc3,0xf8,0x2f,0x19, - 0xdf,0x53,0x53,0x46,0xb1,0x15,0xea,0x00, - } - }, { 0xa500011, { 0x23,0x3d,0x70,0x7d,0x03,0xc3,0xc4,0xf4, 0x2b,0x82,0xc6,0x05,0xda,0x80,0x0a,0xf1, @@ -441,13 +378,6 @@ static const struct patch_digest phashes[] = { 0x11,0x5e,0x96,0x7e,0x71,0xe9,0xfc,0x74, } }, - { 0xa500012, { - 0xeb,0x74,0x0d,0x47,0xa1,0x8e,0x09,0xe4, - 0x93,0x4c,0xad,0x03,0x32,0x4c,0x38,0x16, - 0x10,0x39,0xdd,0x06,0xaa,0xce,0xd6,0x0f, - 0x62,0x83,0x9d,0x8e,0x64,0x55,0xbe,0x63, - } - }, { 0xa601209, { 0x66,0x48,0xd4,0x09,0x05,0xcb,0x29,0x32, 0x66,0xb7,0x9a,0x76,0xcd,0x11,0xf3,0x30, @@ -455,13 +385,6 @@ static const struct patch_digest phashes[] = { 0xe8,0x73,0xe2,0xd6,0xdb,0xd2,0x77,0x1d, } }, - { 0xa60120a, { - 0x0c,0x8b,0x3d,0xfd,0x52,0x52,0x85,0x7d, - 0x20,0x3a,0xe1,0x7e,0xa4,0x21,0x3b,0x7b, - 0x17,0x86,0xae,0xac,0x13,0xb8,0x63,0x9d, - 0x06,0x01,0xd0,0xa0,0x51,0x9a,0x91,0x2c, - } - }, { 0xa704107, { 0xf3,0xc6,0x58,0x26,0xee,0xac,0x3f,0xd6, 0xce,0xa1,0x72,0x47,0x3b,0xba,0x2b,0x93, @@ -469,13 +392,6 @@ static const struct patch_digest phashes[] = { 0x64,0x39,0x71,0x8c,0xce,0xe7,0x41,0x39, } }, - { 0xa704108, { - 0xd7,0x55,0x15,0x2b,0xfe,0xc4,0xbc,0x93, - 0xec,0x91,0xa0,0xae,0x45,0xb7,0xc3,0x98, - 0x4e,0xff,0x61,0x77,0x88,0xc2,0x70,0x49, - 0xe0,0x3a,0x1d,0x84,0x38,0x52,0xbf,0x5a, - } - }, { 0xa705206, { 0x8d,0xc0,0x76,0xbd,0x58,0x9f,0x8f,0xa4, 0x12,0x9d,0x21,0xfb,0x48,0x21,0xbc,0xe7, @@ -483,13 +399,6 @@ static const struct patch_digest phashes[] = { 0x03,0x35,0xe9,0xbe,0xfb,0x06,0xdf,0xfc, } }, - { 0xa705208, { - 0x30,0x1d,0x55,0x24,0xbc,0x6b,0x5a,0x19, - 0x0c,0x7d,0x1d,0x74,0xaa,0xd1,0xeb,0xd2, - 0x16,0x62,0xf7,0x5b,0xe1,0x1f,0x18,0x11, - 0x5c,0xf0,0x94,0x90,0x26,0xec,0x69,0xff, - } - }, { 0xa708007, { 0x6b,0x76,0xcc,0x78,0xc5,0x8a,0xa3,0xe3, 0x32,0x2d,0x79,0xe4,0xc3,0x80,0xdb,0xb2, @@ -497,13 +406,6 @@ static const struct patch_digest phashes[] = { 0xdf,0x92,0x73,0x84,0x87,0x3c,0x73,0x93, } }, - { 0xa708008, { - 0x08,0x6e,0xf0,0x22,0x4b,0x8e,0xc4,0x46, - 0x58,0x34,0xe6,0x47,0xa2,0x28,0xfd,0xab, - 0x22,0x3d,0xdd,0xd8,0x52,0x9e,0x1d,0x16, - 0xfa,0x01,0x68,0x14,0x79,0x3e,0xe8,0x6b, - } - }, { 0xa70c005, { 0x88,0x5d,0xfb,0x79,0x64,0xd8,0x46,0x3b, 0x4a,0x83,0x8e,0x77,0x7e,0xcf,0xb3,0x0f, @@ -511,13 +413,6 @@ static const struct patch_digest phashes[] = { 0xee,0x49,0xac,0xe1,0x8b,0x13,0xc5,0x13, } }, - { 0xa70c008, { - 0x0f,0xdb,0x37,0xa1,0x10,0xaf,0xd4,0x21, - 0x94,0x0d,0xa4,0xa2,0xe9,0x86,0x6c,0x0e, - 0x85,0x7c,0x36,0x30,0xa3,0x3a,0x78,0x66, - 0x18,0x10,0x60,0x0d,0x78,0x3d,0x44,0xd0, - } - }, { 0xaa00116, { 0xe8,0x4c,0x2c,0x88,0xa1,0xac,0x24,0x63, 0x65,0xe5,0xaa,0x2d,0x16,0xa9,0xc3,0xf5, @@ -546,11 +441,4 @@ static const struct patch_digest phashes[] = { 0x68,0x2f,0x46,0xee,0xfe,0xc6,0x6d,0xef, } }, - { 0xaa00216, { - 0x79,0xfb,0x5b,0x9f,0xb6,0xe6,0xa8,0xf5, - 0x4e,0x7c,0x4f,0x8e,0x1d,0xad,0xd0,0x08, - 0xc2,0x43,0x7c,0x8b,0xe6,0xdb,0xd0,0xd2, - 0xe8,0x39,0x26,0xc1,0xe5,0x5a,0x48,0xf1, - } - }, }; diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c index fc539346599cb152579f2c68fc3fa3de9ce37af8..5b47c320f17a6dc67de5c782e2fc2f138f092bbf 100644 --- a/arch/x86/kernel/cpu/microcode/core.c +++ b/arch/x86/kernel/cpu/microcode/core.c @@ -703,8 +703,6 @@ static int load_late_locked(void) return load_late_stop_cpus(true); case UCODE_NFOUND: return -ENOENT; - case UCODE_OK: - return 0; default: return -EBADFD; } diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c index 6839440a4b31e3a908fa1425427fc3f40689a4d0..2d6aa5d2e3d77ec49fd725e180fffe1df3c5987d 100644 --- a/arch/x86/kernel/cpu/mtrr/generic.c +++ b/arch/x86/kernel/cpu/mtrr/generic.c @@ -582,7 +582,7 @@ static void get_fixed_ranges(mtrr_type *frs) void mtrr_save_fixed_ranges(void *info) { - if (mtrr_state.have_fixed) + if (boot_cpu_has(X86_FEATURE_MTRR)) get_fixed_ranges(mtrr_state.fixed_ranges); } diff --git a/arch/x86/kernel/cpu/scattered.c b/arch/x86/kernel/cpu/scattered.c index 7a42e699f6e39a5b07476492f9e5b7c0ffe9eaa1..af5aa2c754c22226080870967d6c410067c86447 100644 --- a/arch/x86/kernel/cpu/scattered.c +++ b/arch/x86/kernel/cpu/scattered.c @@ -48,8 +48,6 @@ static const struct cpuid_bit cpuid_bits[] = { { X86_FEATURE_MBA, CPUID_EBX, 6, 0x80000008, 0 }, { X86_FEATURE_SMBA, CPUID_EBX, 2, 0x80000020, 0 }, { X86_FEATURE_BMEC, CPUID_EBX, 3, 0x80000020, 0 }, - { X86_FEATURE_TSA_SQ_NO, CPUID_ECX, 1, 0x80000021, 0 }, - { X86_FEATURE_TSA_L1_NO, CPUID_ECX, 2, 0x80000021, 0 }, { X86_FEATURE_PERFMON_V2, CPUID_EAX, 0, 0x80000022, 0 }, { X86_FEATURE_AMD_LBR_V2, CPUID_EAX, 1, 0x80000022, 0 }, { X86_FEATURE_AMD_LBR_PMC_FREEZE, CPUID_EAX, 2, 0x80000022, 0 }, diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c index 0db6eeeeb672059e1f0ba4ef88cc7ed57eca556c..c7f8c3200e8d7f28a382b75307538192cea985f6 100644 --- a/arch/x86/kernel/cpu/sgx/main.c +++ b/arch/x86/kernel/cpu/sgx/main.c @@ -718,8 +718,6 @@ int arch_memory_failure(unsigned long pfn, int flags) goto out; } - sgx_unmark_page_reclaimable(page); - /* * TBD: Add additional plumbing to enable pre-emptive * action for asynchronous poison notification. Until diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c index 9a101150376db7a6a8abfffe714578805cf54024..e2fab3ceb09fb7da1d307e69af014b24ea65735f 100644 --- a/arch/x86/kernel/ioport.c +++ b/arch/x86/kernel/ioport.c @@ -33,9 +33,8 @@ void io_bitmap_share(struct task_struct *tsk) set_tsk_thread_flag(tsk, TIF_IO_BITMAP); } -static void task_update_io_bitmap(void) +static void task_update_io_bitmap(struct task_struct *tsk) { - struct task_struct *tsk = current; struct thread_struct *t = &tsk->thread; if (t->iopl_emul == 3 || t->io_bitmap) { @@ -55,12 +54,7 @@ void io_bitmap_exit(struct task_struct *tsk) struct io_bitmap *iobm = tsk->thread.io_bitmap; tsk->thread.io_bitmap = NULL; - /* - * Don't touch the TSS when invoked on a failed fork(). TSS - * reflects the state of @current and not the state of @tsk. - */ - if (tsk == current) - task_update_io_bitmap(); + task_update_io_bitmap(tsk); if (iobm && refcount_dec_and_test(&iobm->refcnt)) kfree(iobm); } @@ -198,7 +192,8 @@ SYSCALL_DEFINE1(iopl, unsigned int, level) } t->iopl_emul = level; - task_update_io_bitmap(); + task_update_io_bitmap(current); + return 0; } diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index e3c26cc45f70084292731824c7cf174489489d2b..419353904173ff3ce6569c491f9853872afbcd0a 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -180,7 +180,6 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args) frame->ret_addr = (unsigned long) ret_from_fork_asm; p->thread.sp = (unsigned long) fork_frame; p->thread.io_bitmap = NULL; - clear_tsk_thread_flag(p, TIF_IO_BITMAP); p->thread.iopl_warn = 0; memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps)); @@ -469,11 +468,6 @@ void native_tss_update_io_bitmap(void) } else { struct io_bitmap *iobm = t->io_bitmap; - if (WARN_ON_ONCE(!iobm)) { - clear_thread_flag(TIF_IO_BITMAP); - native_tss_invalidate_io_bitmap(); - } - /* * Only copy bitmap data when the sequence number differs. The * update time is accounted to the incoming task. @@ -928,24 +922,19 @@ static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c) */ static __cpuidle void mwait_idle(void) { - if (need_resched()) - return; - - x86_idle_clear_cpu_buffers(); - if (!current_set_polling_and_test()) { - const void *addr = ¤t_thread_info()->flags; - - alternative_input("", "clflush (%[addr])", X86_BUG_CLFLUSH_MONITOR, [addr] "a" (addr)); - __monitor(addr, 0, 0); - if (need_resched()) - goto out; + if (this_cpu_has(X86_BUG_CLFLUSH_MONITOR)) { + mb(); /* quirk */ + clflush((void *)¤t_thread_info()->flags); + mb(); /* quirk */ + } - __sti_mwait(0, 0); - raw_local_irq_disable(); + __monitor((void *)¤t_thread_info()->flags, 0, 0); + if (!need_resched()) { + __sti_mwait(0, 0); + raw_local_irq_disable(); + } } - -out: __current_clr_polling(); } diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index a52db362a65d1686340f920355f014e5fac78983..d8d9bc5a9b32808b004a72c54c939062743d18df 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -92,17 +92,10 @@ __always_inline int is_valid_bugaddr(unsigned long addr) /* * Check for UD1 or UD2, accounting for Address Size Override Prefixes. - * If it's a UD1, further decode to determine its use: - * - * UBSan{0}: 67 0f b9 00 ud1 (%eax),%eax - * UBSan{10}: 67 0f b9 40 10 ud1 0x10(%eax),%eax - * static_call: 0f b9 cc ud1 %esp,%ecx - * - * Notably UBSAN uses EAX, static_call uses ECX. + * If it's a UD1, get the ModRM byte to pass along to UBSan. */ -__always_inline int decode_bug(unsigned long addr, s32 *imm, int *len) +__always_inline int decode_bug(unsigned long addr, u32 *imm) { - unsigned long start = addr; u8 v; if (addr < TASK_SIZE_MAX) @@ -115,42 +108,24 @@ __always_inline int decode_bug(unsigned long addr, s32 *imm, int *len) return BUG_NONE; v = *(u8 *)(addr++); - if (v == SECOND_BYTE_OPCODE_UD2) { - *len = addr - start; + if (v == SECOND_BYTE_OPCODE_UD2) return BUG_UD2; - } - if (v != SECOND_BYTE_OPCODE_UD1) + if (!IS_ENABLED(CONFIG_UBSAN_TRAP) || v != SECOND_BYTE_OPCODE_UD1) return BUG_NONE; - *imm = 0; - v = *(u8 *)(addr++); /* ModRM */ - - if (X86_MODRM_MOD(v) != 3 && X86_MODRM_RM(v) == 4) - addr++; /* SIB */ - - /* Decode immediate, if present */ - switch (X86_MODRM_MOD(v)) { - case 0: if (X86_MODRM_RM(v) == 5) - addr += 4; /* RIP + disp32 */ - break; - - case 1: *imm = *(s8 *)addr; - addr += 1; - break; - - case 2: *imm = *(s32 *)addr; - addr += 4; - break; - - case 3: break; - } - - /* record instruction length */ - *len = addr - start; + /* Retrieve the immediate (type value) for the UBSAN UD1 */ + v = *(u8 *)(addr++); + if (X86_MODRM_RM(v) == 4) + addr++; - if (X86_MODRM_REG(v) == 0) /* EAX */ - return BUG_UD1_UBSAN; + *imm = 0; + if (X86_MODRM_MOD(v) == 1) + *imm = *(u8 *)addr; + else if (X86_MODRM_MOD(v) == 2) + *imm = *(u32 *)addr; + else + WARN_ONCE(1, "Unexpected MODRM_MOD: %u\n", X86_MODRM_MOD(v)); return BUG_UD1; } @@ -281,10 +256,10 @@ static inline void handle_invalid_op(struct pt_regs *regs) static noinstr bool handle_bug(struct pt_regs *regs) { bool handled = false; - int ud_type, ud_len; - s32 ud_imm; + int ud_type; + u32 imm; - ud_type = decode_bug(regs->ip, &ud_imm, &ud_len); + ud_type = decode_bug(regs->ip, &imm); if (ud_type == BUG_NONE) return handled; @@ -304,28 +279,15 @@ static noinstr bool handle_bug(struct pt_regs *regs) */ if (regs->flags & X86_EFLAGS_IF) raw_local_irq_enable(); - - switch (ud_type) { - case BUG_UD2: + if (ud_type == BUG_UD2) { if (report_bug(regs->ip, regs) == BUG_TRAP_TYPE_WARN || handle_cfi_failure(regs) == BUG_TRAP_TYPE_WARN) { - regs->ip += ud_len; + regs->ip += LEN_UD2; handled = true; } - break; - - case BUG_UD1_UBSAN: - if (IS_ENABLED(CONFIG_UBSAN_TRAP)) { - pr_crit("%s at %pS\n", - report_ubsan_failure(regs, ud_imm), - (void *)regs->ip); - } - break; - - default: - break; + } else if (IS_ENABLED(CONFIG_UBSAN_TRAP)) { + pr_crit("%s at %pS\n", report_ubsan_failure(regs, imm), (void *)regs->ip); } - if (regs->flags & X86_EFLAGS_IF) raw_local_irq_disable(); instrumentation_end(); @@ -975,32 +937,24 @@ static bool is_sysenter_singlestep(struct pt_regs *regs) #endif } -static __always_inline unsigned long debug_read_reset_dr6(void) +static __always_inline unsigned long debug_read_clear_dr6(void) { unsigned long dr6; - get_debugreg(dr6, 6); - dr6 ^= DR6_RESERVED; /* Flip to positive polarity */ - /* * The Intel SDM says: * - * Certain debug exceptions may clear bits 0-3 of DR6. - * - * BLD induced #DB clears DR6.BLD and any other debug - * exception doesn't modify DR6.BLD. + * Certain debug exceptions may clear bits 0-3. The remaining + * contents of the DR6 register are never cleared by the + * processor. To avoid confusion in identifying debug + * exceptions, debug handlers should clear the register before + * returning to the interrupted task. * - * RTM induced #DB clears DR6.RTM and any other debug - * exception sets DR6.RTM. - * - * To avoid confusion in identifying debug exceptions, - * debug handlers should set DR6.BLD and DR6.RTM, and - * clear other DR6 bits before returning. - * - * Keep it simple: write DR6 with its architectural reset - * value 0xFFFF0FF0, defined as DR6_RESERVED, immediately. + * Keep it simple: clear DR6 immediately. */ + get_debugreg(dr6, 6); set_debugreg(DR6_RESERVED, 6); + dr6 ^= DR6_RESERVED; /* Flip to positive polarity */ return dr6; } @@ -1196,19 +1150,19 @@ static __always_inline void exc_debug_user(struct pt_regs *regs, /* IST stack entry */ DEFINE_IDTENTRY_DEBUG(exc_debug) { - exc_debug_kernel(regs, debug_read_reset_dr6()); + exc_debug_kernel(regs, debug_read_clear_dr6()); } /* User entry, runs on regular task stack */ DEFINE_IDTENTRY_DEBUG_USER(exc_debug) { - exc_debug_user(regs, debug_read_reset_dr6()); + exc_debug_user(regs, debug_read_clear_dr6()); } #else /* 32 bit does not have separate entry points. */ DEFINE_IDTENTRY_RAW(exc_debug) { - unsigned long dr6 = debug_read_reset_dr6(); + unsigned long dr6 = debug_read_clear_dr6(); if (user_mode(regs)) exc_debug_user(regs, dr6); diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 288db351677222056473cf2cd24ee95584227022..a6cffeff75d40b9b596a82ea69f1796caa0d5aaf 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -780,7 +780,6 @@ void kvm_set_cpu_caps(void) kvm_cpu_cap_mask(CPUID_8000_0021_EAX, F(NO_NESTED_DATA_BP) | F(LFENCE_RDTSC) | 0 /* SmmPgCfgLock */ | - F(VERW_CLEAR) | F(NULL_SEL_CLR_BASE) | F(AUTOIBRS) | 0 /* PrefetchCtlMsr */ ); @@ -791,10 +790,6 @@ void kvm_set_cpu_caps(void) F(PERFMON_V2) ); - kvm_cpu_cap_init_kvm_defined(CPUID_8000_0021_ECX, - F(TSA_SQ_NO) | F(TSA_L1_NO) - ); - /* * Synthesize "LFENCE is serializing" into the AMD-defined entry in * KVM's supported CPUID if the feature is reported as supported by the @@ -1301,9 +1296,8 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function) entry->eax = entry->ebx = entry->ecx = entry->edx = 0; break; case 0x80000021: - entry->ebx = entry->edx = 0; + entry->ebx = entry->ecx = entry->edx = 0; cpuid_entry_override(entry, CPUID_8000_0021_EAX); - cpuid_entry_override(entry, CPUID_8000_0021_ECX); break; /* AMD Extended Performance Monitoring and Debug */ case 0x80000022: { diff --git a/arch/x86/kvm/reverse_cpuid.h b/arch/x86/kvm/reverse_cpuid.h index be23712354bd8e8367ea555c4589f60dd3291c06..2f4e155080badc5efdbcc93fbc909c5bbcf70094 100644 --- a/arch/x86/kvm/reverse_cpuid.h +++ b/arch/x86/kvm/reverse_cpuid.h @@ -17,7 +17,6 @@ enum kvm_only_cpuid_leafs { CPUID_8000_0007_EDX, CPUID_8000_0022_EAX, CPUID_7_2_EDX, - CPUID_8000_0021_ECX, NR_KVM_CPU_CAPS, NKVMCAPINTS = NR_KVM_CPU_CAPS - NCAPINTS, @@ -62,10 +61,6 @@ enum kvm_only_cpuid_leafs { /* CPUID level 0x80000022 (EAX) */ #define KVM_X86_FEATURE_PERFMON_V2 KVM_X86_FEATURE(CPUID_8000_0022_EAX, 0) -/* CPUID level 0x80000021 (ECX) */ -#define KVM_X86_FEATURE_TSA_SQ_NO KVM_X86_FEATURE(CPUID_8000_0021_ECX, 1) -#define KVM_X86_FEATURE_TSA_L1_NO KVM_X86_FEATURE(CPUID_8000_0021_ECX, 2) - struct cpuid_reg { u32 function; u32 index; @@ -95,7 +90,6 @@ static const struct cpuid_reg reverse_cpuid[] = { [CPUID_8000_0021_EAX] = {0x80000021, 0, CPUID_EAX}, [CPUID_8000_0022_EAX] = {0x80000022, 0, CPUID_EAX}, [CPUID_7_2_EDX] = { 7, 2, CPUID_EDX}, - [CPUID_8000_0021_ECX] = {0x80000021, 0, CPUID_ECX}, }; /* @@ -135,8 +129,6 @@ static __always_inline u32 __feature_translate(int x86_feature) KVM_X86_TRANSLATE_FEATURE(PERFMON_V2); KVM_X86_TRANSLATE_FEATURE(RRSBA_CTRL); KVM_X86_TRANSLATE_FEATURE(BHI_CTRL); - KVM_X86_TRANSLATE_FEATURE(TSA_SQ_NO); - KVM_X86_TRANSLATE_FEATURE(TSA_L1_NO); default: return x86_feature; } diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index 67c01bd332f6f04dc14fc3c8477b0c1740618cad..99e72b8a96ac0b224b1b86affd930b3bbdf436a9 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -1782,10 +1782,6 @@ static int sev_check_source_vcpus(struct kvm *dst, struct kvm *src) struct kvm_vcpu *src_vcpu; unsigned long i; - if (src->created_vcpus != atomic_read(&src->online_vcpus) || - dst->created_vcpus != atomic_read(&dst->online_vcpus)) - return -EBUSY; - if (!sev_es_guest(src)) return 0; diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 86c50747e15837e4547ffd99b5734c87c3d72bf8..c84a1451f194c4c6ac045ae339786bf3b8162d05 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -1503,7 +1503,7 @@ static void svm_clear_current_vmcb(struct vmcb *vmcb) { int i; - for_each_possible_cpu(i) + for_each_online_cpu(i) cmpxchg(per_cpu_ptr(&svm_data.current_vmcb, i), vmcb, NULL); } diff --git a/arch/x86/kvm/svm/vmenter.S b/arch/x86/kvm/svm/vmenter.S index 56fe34d9397f648d68423aec45454bdda1a6f1a6..ef2ebabb059c8cdf2f88eb7b98682e29940e4dd8 100644 --- a/arch/x86/kvm/svm/vmenter.S +++ b/arch/x86/kvm/svm/vmenter.S @@ -167,9 +167,6 @@ SYM_FUNC_START(__svm_vcpu_run) #endif mov VCPU_RDI(%_ASM_DI), %_ASM_DI - /* Clobbers EFLAGS.ZF */ - VM_CLEAR_CPU_BUFFERS - /* Enter guest mode */ sti @@ -337,9 +334,6 @@ SYM_FUNC_START(__svm_sev_es_vcpu_run) mov SVM_current_vmcb(%_ASM_DI), %_ASM_AX mov KVM_VMCB_pa(%_ASM_AX), %_ASM_AX - /* Clobbers EFLAGS.ZF */ - VM_CLEAR_CPU_BUFFERS - /* Enter guest mode */ sti diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index e53620e189254b415c3cca4face3ee340800ec3c..e5a2c230110ea4f175c3f5e69b3b1d2f56de839a 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -787,11 +787,8 @@ static void vmx_emergency_disable(void) return; list_for_each_entry(v, &per_cpu(loaded_vmcss_on_cpu, cpu), - loaded_vmcss_on_cpu_link) { + loaded_vmcss_on_cpu_link) vmcs_clear(v->vmcs); - if (v->shadow_vmcs) - vmcs_clear(v->shadow_vmcs); - } kvm_cpu_vmxoff(); } @@ -7263,7 +7260,7 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu, vmx_l1d_flush(vcpu); else if (static_branch_unlikely(&mmio_stale_data_clear) && kvm_arch_has_assigned_device(vcpu->kvm)) - x86_clear_cpu_buffers(); + mds_clear_cpu_buffers(); vmx_disable_fb_clear(vmx); diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c index 94c7fee7a2259fa9693f794663b0538fe0ce5512..0ea6016ad132a227c70a1a3e0c03b84ebc604ab4 100644 --- a/arch/x86/kvm/xen.c +++ b/arch/x86/kvm/xen.c @@ -1260,7 +1260,7 @@ static bool kvm_xen_schedop_poll(struct kvm_vcpu *vcpu, bool longmode, if (kvm_read_guest_virt(vcpu, (gva_t)sched_poll.ports, ports, sched_poll.nr_ports * sizeof(*ports), &e)) { *r = -EFAULT; - goto out; + return true; } for (i = 0; i < sched_poll.nr_ports; i++) { @@ -1737,19 +1737,8 @@ int kvm_xen_setup_evtchn(struct kvm *kvm, { struct kvm_vcpu *vcpu; - /* - * Don't check for the port being within range of max_evtchn_port(). - * Userspace can configure what ever targets it likes; events just won't - * be delivered if/while the target is invalid, just like userspace can - * configure MSIs which target non-existent APICs. - * - * This allow on Live Migration and Live Update, the IRQ routing table - * can be restored *independently* of other things like creating vCPUs, - * without imposing an ordering dependency on userspace. In this - * particular case, the problematic ordering would be with setting the - * Xen 'long mode' flag, which changes max_evtchn_port() to allow 4096 - * instead of 1024 event channels. - */ + if (ue->u.xen_evtchn.port >= max_evtchn_port(kvm)) + return -EINVAL; /* We only support 2 level event channels for now */ if (ue->u.xen_evtchn.priority != KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL) diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 11eb93e13ce17564b1a1c86c1dc9e0cb637bdeb8..aa69353da49f24c0dd3845160806fb7a0b4e5046 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -959,18 +959,9 @@ int add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages, ret = __add_pages(nid, start_pfn, nr_pages, params); WARN_ON_ONCE(ret); - /* - * Special case: add_pages() is called by memremap_pages() for adding device - * private pages. Do not bump up max_pfn in the device private path, - * because max_pfn changes affect dma_addressing_limited(). - * - * dma_addressing_limited() returning true when max_pfn is the device's - * addressable memory can force device drivers to use bounce buffers - * and impact their performance negatively: - */ - if (!params->pgmap) - /* update max_pfn, max_low_pfn and high_memory */ - update_end_of_memory_vars(start_pfn << PAGE_SHIFT, nr_pages << PAGE_SHIFT); + /* update max_pfn, max_low_pfn and high_memory */ + update_end_of_memory_vars(start_pfn << PAGE_SHIFT, + nr_pages << PAGE_SHIFT); return ret; } diff --git a/arch/x86/tools/insn_decoder_test.c b/arch/x86/tools/insn_decoder_test.c index 08cd913cbd4e9a75eed12b97de2208524933edb6..472540aeabc23533e6e8c535c9026e2fd40b8040 100644 --- a/arch/x86/tools/insn_decoder_test.c +++ b/arch/x86/tools/insn_decoder_test.c @@ -10,7 +10,8 @@ #include #include #include -#include + +#define unlikely(cond) (cond) #include #include @@ -105,7 +106,7 @@ static void parse_args(int argc, char **argv) } } -#define BUFSIZE (256 + KSYM_NAME_LEN) +#define BUFSIZE 256 int main(int argc, char **argv) { diff --git a/arch/x86/um/asm/checksum.h b/arch/x86/um/asm/checksum.h index ddc144657efad92e9d5ac2e8c8cc8503dde59ee7..b07824500363fa1ecc065c9a3926b60e55cc1096 100644 --- a/arch/x86/um/asm/checksum.h +++ b/arch/x86/um/asm/checksum.h @@ -20,9 +20,6 @@ */ extern __wsum csum_partial(const void *buff, int len, __wsum sum); -/* Do not call this directly. Declared for export type visibility. */ -extern __visible __wsum csum_partial_copy_generic(const void *src, void *dst, int len); - /** * csum_fold - Fold and invert a 32bit checksum. * sum: 32bit unfolded sum diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 8d15c73a520bd76bafacd8b43161f77584acbe34..74839f6f2e0cb3ff45e03599f5d1a57cb756588f 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -909,5 +909,4 @@ void blk_unregister_queue(struct gendisk *disk) mutex_unlock(&q->sysfs_dir_lock); blk_debugfs_remove(disk); - kobject_put(&disk->queue_kobj); } diff --git a/crypto/lrw.c b/crypto/lrw.c index 5536ec7bf18f14a0e4093119d7711609182e023f..59260aefed2807d948c03faf78ccc661616a2eb1 100644 --- a/crypto/lrw.c +++ b/crypto/lrw.c @@ -322,7 +322,7 @@ static int lrw_create(struct crypto_template *tmpl, struct rtattr **tb) err = crypto_grab_skcipher(spawn, skcipher_crypto_instance(inst), cipher_name, 0, mask); - if (err == -ENOENT && memcmp(cipher_name, "ecb(", 4)) { + if (err == -ENOENT) { err = -ENAMETOOLONG; if (snprintf(ecb_name, CRYPTO_MAX_ALG_NAME, "ecb(%s)", cipher_name) >= CRYPTO_MAX_ALG_NAME) @@ -356,7 +356,7 @@ static int lrw_create(struct crypto_template *tmpl, struct rtattr **tb) /* Alas we screwed up the naming so we have to mangle the * cipher name. */ - if (!memcmp(cipher_name, "ecb(", 4)) { + if (!strncmp(cipher_name, "ecb(", 4)) { int len; len = strscpy(ecb_name, cipher_name + 4, sizeof(ecb_name)); diff --git a/crypto/xts.c b/crypto/xts.c index 97fd0fb8757c2364120d950277430908292c8e97..038f60dd512d9fa850eb0a5fd912063bcb846fab 100644 --- a/crypto/xts.c +++ b/crypto/xts.c @@ -363,7 +363,7 @@ static int xts_create(struct crypto_template *tmpl, struct rtattr **tb) err = crypto_grab_skcipher(&ctx->spawn, skcipher_crypto_instance(inst), cipher_name, 0, mask); - if (err == -ENOENT && memcmp(cipher_name, "ecb(", 4)) { + if (err == -ENOENT) { err = -ENAMETOOLONG; if (snprintf(name, CRYPTO_MAX_ALG_NAME, "ecb(%s)", cipher_name) >= CRYPTO_MAX_ALG_NAME) @@ -397,7 +397,7 @@ static int xts_create(struct crypto_template *tmpl, struct rtattr **tb) /* Alas we screwed up the naming so we have to mangle the * cipher name. */ - if (!memcmp(cipher_name, "ecb(", 4)) { + if (!strncmp(cipher_name, "ecb(", 4)) { int len; len = strscpy(name, cipher_name + 4, sizeof(name)); diff --git a/drivers/accel/qaic/qaic_drv.c b/drivers/accel/qaic/qaic_drv.c index e69bfb30b44e0708d8bb14e45cd52ba7d4de35d1..b5de82e6eb4d56a41b1acabe03a95413522ba3d3 100644 --- a/drivers/accel/qaic/qaic_drv.c +++ b/drivers/accel/qaic/qaic_drv.c @@ -400,7 +400,7 @@ static int init_pci(struct qaic_device *qdev, struct pci_dev *pdev) int bars; int ret; - bars = pci_select_bars(pdev, IORESOURCE_MEM) & 0x3f; + bars = pci_select_bars(pdev, IORESOURCE_MEM); /* make sure the device has the expected BARs */ if (bars != (BIT(0) | BIT(2) | BIT(4))) { diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c index a232746d150a7508e94c2a39e60b9c4f387f4d47..e809c2aed78aeda9dee9fe1c23763c94ed6468f3 100644 --- a/drivers/acpi/acpica/dsmethod.c +++ b/drivers/acpi/acpica/dsmethod.c @@ -483,13 +483,6 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, return_ACPI_STATUS(AE_NULL_OBJECT); } - if (this_walk_state->num_operands < obj_desc->method.param_count) { - ACPI_ERROR((AE_INFO, "Missing argument for method [%4.4s]", - acpi_ut_get_node_name(method_node))); - - return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG); - } - /* Init for new method, possibly wait on method mutex */ status = diff --git a/drivers/acpi/acpica/dsutils.c b/drivers/acpi/acpica/dsutils.c index 2bdae8a25e084de18f44f6f6bcee6cbf92b5fb62..fb9ed5e1da89dc0d3b0c2371d65b1cd47363d65d 100644 --- a/drivers/acpi/acpica/dsutils.c +++ b/drivers/acpi/acpica/dsutils.c @@ -668,8 +668,6 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state, union acpi_parse_object *arguments[ACPI_OBJ_NUM_OPERANDS]; u32 arg_count = 0; u32 index = walk_state->num_operands; - u32 prev_num_operands = walk_state->num_operands; - u32 new_num_operands; u32 i; ACPI_FUNCTION_TRACE_PTR(ds_create_operands, first_arg); @@ -698,7 +696,6 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state, /* Create the interpreter arguments, in reverse order */ - new_num_operands = index; index--; for (i = 0; i < arg_count; i++) { arg = arguments[index]; @@ -723,11 +720,7 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state, * pop everything off of the operand stack and delete those * objects */ - walk_state->num_operands = i; - acpi_ds_obj_stack_pop_and_delete(new_num_operands, walk_state); - - /* Restore operand count */ - walk_state->num_operands = prev_num_operands; + acpi_ds_obj_stack_pop_and_delete(arg_count, walk_state); ACPI_EXCEPTION((AE_INFO, status, "While creating Arg %u", index)); return_ACPI_STATUS(status); diff --git a/drivers/acpi/acpica/exserial.c b/drivers/acpi/acpica/exserial.c index 89a4ac447a2bea45fa1eec230b0bce7a2a50a002..5241f4c01c765585ac3a47642602fc3d9ae68ede 100644 --- a/drivers/acpi/acpica/exserial.c +++ b/drivers/acpi/acpica/exserial.c @@ -201,12 +201,6 @@ acpi_ex_read_serial_bus(union acpi_operand_object *obj_desc, function = ACPI_READ; break; - case ACPI_ADR_SPACE_FIXED_HARDWARE: - - buffer_length = ACPI_FFH_INPUT_BUFFER_SIZE; - function = ACPI_READ; - break; - default: return_ACPI_STATUS(AE_AML_INVALID_SPACE_ID); } diff --git a/drivers/acpi/acpica/psobject.c b/drivers/acpi/acpica/psobject.c index 0bce1baaa62b3293ee72b0b334b6c49a537ea3a7..54471083ba545ead0b265e1bddb8e56fadc1e6f6 100644 --- a/drivers/acpi/acpica/psobject.c +++ b/drivers/acpi/acpica/psobject.c @@ -636,8 +636,7 @@ acpi_status acpi_ps_complete_final_op(struct acpi_walk_state *walk_state, union acpi_parse_object *op, acpi_status status) { - acpi_status return_status = status; - u8 ascending = TRUE; + acpi_status status2; ACPI_FUNCTION_TRACE_PTR(ps_complete_final_op, walk_state); @@ -651,7 +650,7 @@ acpi_ps_complete_final_op(struct acpi_walk_state *walk_state, op)); do { if (op) { - if (ascending && walk_state->ascending_callback != NULL) { + if (walk_state->ascending_callback != NULL) { walk_state->op = op; walk_state->op_info = acpi_ps_get_opcode_info(op->common. @@ -673,26 +672,49 @@ acpi_ps_complete_final_op(struct acpi_walk_state *walk_state, } if (status == AE_CTRL_TERMINATE) { - ascending = FALSE; - return_status = AE_CTRL_TERMINATE; + status = AE_OK; + + /* Clean up */ + do { + if (op) { + status2 = + acpi_ps_complete_this_op + (walk_state, op); + if (ACPI_FAILURE + (status2)) { + return_ACPI_STATUS + (status2); + } + } + + acpi_ps_pop_scope(& + (walk_state-> + parser_state), + &op, + &walk_state-> + arg_types, + &walk_state-> + arg_count); + + } while (op); + + return_ACPI_STATUS(status); } else if (ACPI_FAILURE(status)) { /* First error is most important */ - ascending = FALSE; - return_status = status; + (void) + acpi_ps_complete_this_op(walk_state, + op); + return_ACPI_STATUS(status); } } - status = acpi_ps_complete_this_op(walk_state, op); - if (ACPI_FAILURE(status)) { - ascending = FALSE; - if (ACPI_SUCCESS(return_status) || - return_status == AE_CTRL_TERMINATE) { - return_status = status; - } + status2 = acpi_ps_complete_this_op(walk_state, op); + if (ACPI_FAILURE(status2)) { + return_ACPI_STATUS(status2); } } @@ -702,5 +724,5 @@ acpi_ps_complete_final_op(struct acpi_walk_state *walk_state, } while (op); - return_ACPI_STATUS(return_status); + return_ACPI_STATUS(status); } diff --git a/drivers/acpi/acpica/utprint.c b/drivers/acpi/acpica/utprint.c index 7fad03c5252c3533999ad09c712254be767712ea..42b30b9f93128e1c246875965010e2ab7930f8a2 100644 --- a/drivers/acpi/acpica/utprint.c +++ b/drivers/acpi/acpica/utprint.c @@ -333,8 +333,11 @@ int vsnprintf(char *string, acpi_size size, const char *format, va_list args) pos = string; - size = ACPI_MIN(size, ACPI_PTR_DIFF(ACPI_MAX_PTR, string)); - end = string + size; + if (size != ACPI_UINT32_MAX) { + end = string + size; + } else { + end = ACPI_CAST_PTR(char, ACPI_UINT32_MAX); + } for (; *format; ++format) { if (*format != '%') { diff --git a/drivers/acpi/apei/Kconfig b/drivers/acpi/apei/Kconfig index 71e0d64a7792e90a80932d143ce006f0a658c14f..6b18f8bc7be353403873df2c11ca0b72ef256eb6 100644 --- a/drivers/acpi/apei/Kconfig +++ b/drivers/acpi/apei/Kconfig @@ -23,7 +23,6 @@ config ACPI_APEI_GHES select ACPI_HED select IRQ_WORK select GENERIC_ALLOCATOR - select ARM_SDE_INTERFACE if ARM64 help Generic Hardware Error Source provides a way to report platform hardware errors (such as that from chipset). It diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index 2abf20736702c0dfe6c5ef9d90ddeb15cdc5bf79..3aadc632d7dd538d857200572b4ac9f281f0985c 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -1523,7 +1523,7 @@ void __init acpi_ghes_init(void) { int rc; - acpi_sdei_init(); + sdei_init(); if (acpi_disabled) return; diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 645464f02363f3306b5202a8beb9559ab47abaad..a4aa53b7e2bb30789165145c4d1ccdea214809a3 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -1396,10 +1396,8 @@ static int __init acpi_init(void) } acpi_kobj = kobject_create_and_add("acpi", firmware_kobj); - if (!acpi_kobj) { - pr_err("Failed to register kobject\n"); - return -ENOMEM; - } + if (!acpi_kobj) + pr_debug("%s: kset create error\n", __func__); init_prmt(); acpi_init_pcc(); diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c index 10d531427ba77d18c899f7050eb450afc3d5d38c..ed02a2a9970aa3f8048d79bbdb25bc0faa2f6c23 100644 --- a/drivers/acpi/cppc_acpi.c +++ b/drivers/acpi/cppc_acpi.c @@ -461,7 +461,7 @@ bool cppc_allow_fast_switch(void) struct cpc_desc *cpc_ptr; int cpu; - for_each_present_cpu(cpu) { + for_each_possible_cpu(cpu) { cpc_ptr = per_cpu(cpc_desc_ptr, cpu); desired_reg = &cpc_ptr->cpc_regs[DESIRED_PERF]; if (!CPC_IN_SYSTEM_MEMORY(desired_reg) && diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c index ae9620757865b150a5e4b2c524c2ba5316cf730f..d4405e1ca9b9719df5e6bb8ebdde3032357722aa 100644 --- a/drivers/acpi/osi.c +++ b/drivers/acpi/osi.c @@ -42,6 +42,7 @@ static struct acpi_osi_entry osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = { {"Module Device", true}, {"Processor Device", true}, + {"3.0 _SCP Extensions", true}, {"Processor Aggregator Device", true}, }; diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 39a350755a1baf04227234802434b29b71017cb0..d36e71f475abdc876b8513563cc50bd5ded2c650 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c @@ -514,19 +514,15 @@ unsigned int ata_acpi_gtm_xfermask(struct ata_device *dev, EXPORT_SYMBOL_GPL(ata_acpi_gtm_xfermask); /** - * ata_acpi_cbl_pata_type - Return PATA cable type + * ata_acpi_cbl_80wire - Check for 80 wire cable * @ap: Port to check + * @gtm: GTM data to use * - * Return ATA_CBL_PATA* according to the transfer mode selected by BIOS + * Return 1 if the @gtm indicates the BIOS selected an 80wire mode. */ -int ata_acpi_cbl_pata_type(struct ata_port *ap) +int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm) { struct ata_device *dev; - int ret = ATA_CBL_PATA_UNK; - const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap); - - if (!gtm) - return ATA_CBL_PATA40; ata_for_each_dev(dev, &ap->link, ENABLED) { unsigned int xfer_mask, udma_mask; @@ -534,17 +530,13 @@ int ata_acpi_cbl_pata_type(struct ata_port *ap) xfer_mask = ata_acpi_gtm_xfermask(dev, gtm); ata_unpack_xfermask(xfer_mask, NULL, NULL, &udma_mask); - ret = ATA_CBL_PATA40; - - if (udma_mask & ~ATA_UDMA_MASK_40C) { - ret = ATA_CBL_PATA80; - break; - } + if (udma_mask & ~ATA_UDMA_MASK_40C) + return 1; } - return ret; + return 0; } -EXPORT_SYMBOL_GPL(ata_acpi_cbl_pata_type); +EXPORT_SYMBOL_GPL(ata_acpi_cbl_80wire); static void ata_acpi_gtf_to_tf(struct ata_device *dev, const struct ata_acpi_gtf *gtf, diff --git a/drivers/ata/pata_cs5536.c b/drivers/ata/pata_cs5536.c index 73e81e160c91fb709e7e489d3b399fdbe1c623c4..b811efd2cc346a69c73b1b1fe52c15eae6e92a36 100644 --- a/drivers/ata/pata_cs5536.c +++ b/drivers/ata/pata_cs5536.c @@ -27,7 +27,7 @@ #include #include -#if defined(CONFIG_X86) && defined(CONFIG_X86_32) +#ifdef CONFIG_X86_32 #include static int use_msr; module_param_named(msr, use_msr, int, 0644); diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index bb80e7800dcbe91b0b63c21b03fc283d25a33c3a..696b99720dcbdaa94cb6542b3fc62c398f8d2330 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c @@ -201,9 +201,11 @@ static int via_cable_detect(struct ata_port *ap) { two drives */ if (ata66 & (0x10100000 >> (16 * ap->port_no))) return ATA_CBL_PATA80; - /* Check with ACPI so we can spot BIOS reported SATA bridges */ - return ata_acpi_cbl_pata_type(ap); + if (ata_acpi_init_gtm(ap) && + ata_acpi_cbl_80wire(ap, ata_acpi_init_gtm(ap))) + return ATA_CBL_PATA80; + return ATA_CBL_PATA40; } static int via_pre_reset(struct ata_link *link, unsigned long deadline) @@ -366,8 +368,7 @@ static unsigned int via_mode_filter(struct ata_device *dev, unsigned int mask) } if (dev->class == ATA_DEV_ATAPI && - (dmi_check_system(no_atapi_dma_dmi_table) || - config->id == PCI_DEVICE_ID_VIA_6415)) { + dmi_check_system(no_atapi_dma_dmi_table)) { ata_dev_warn(dev, "controller locks up on ATAPI DMA, forcing PIO\n"); mask &= ATA_MASK_PIO; } diff --git a/drivers/atm/atmtcp.c b/drivers/atm/atmtcp.c index ff558908897f3ee3b34f36699d52cf45d6bf979c..96bea1ab1eccf4b7551c2f000e400613370f3eee 100644 --- a/drivers/atm/atmtcp.c +++ b/drivers/atm/atmtcp.c @@ -288,9 +288,7 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb) struct sk_buff *new_skb; int result = 0; - if (skb->len < sizeof(struct atmtcp_hdr)) - goto done; - + if (!skb->len) return 0; dev = vcc->dev_data; hdr = (struct atmtcp_hdr *) skb->data; if (hdr->length == ATMTCP_HDR_MAGIC) { diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c index 63d41320cd5cf051ae971f29582b5484895d79e3..a876024d8a05f964fb79fb04bd5447b67f28f20c 100644 --- a/drivers/atm/idt77252.c +++ b/drivers/atm/idt77252.c @@ -852,8 +852,6 @@ queue_skb(struct idt77252_dev *card, struct vc_map *vc, IDT77252_PRV_PADDR(skb) = dma_map_single(&card->pcidev->dev, skb->data, skb->len, DMA_TO_DEVICE); - if (dma_mapping_error(&card->pcidev->dev, IDT77252_PRV_PADDR(skb))) - return -ENOMEM; error = -EINVAL; @@ -1859,8 +1857,6 @@ add_rx_skb(struct idt77252_dev *card, int queue, paddr = dma_map_single(&card->pcidev->dev, skb->data, skb_end_pointer(skb) - skb->data, DMA_FROM_DEVICE); - if (dma_mapping_error(&card->pcidev->dev, paddr)) - goto outpoolrm; IDT77252_PRV_PADDR(skb) = paddr; if (push_rx_skb(card, skb, queue)) { @@ -1875,7 +1871,6 @@ add_rx_skb(struct idt77252_dev *card, int queue, dma_unmap_single(&card->pcidev->dev, IDT77252_PRV_PADDR(skb), skb_end_pointer(skb) - skb->data, DMA_FROM_DEVICE); -outpoolrm: handle = IDT77252_PRV_POOL(skb); card->sbpool[POOL_QUEUE(handle)].skb[POOL_INDEX(handle)] = NULL; diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index a11aeef6d6366c317fc6ee1216ce04c6b0b3c724..3f07d28b9dcd882041590147f3288c7d5cb3d024 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c @@ -605,7 +605,6 @@ CPU_SHOW_VULN_FALLBACK(spec_rstack_overflow); CPU_SHOW_VULN_FALLBACK(gds); CPU_SHOW_VULN_FALLBACK(reg_file_data_sampling); CPU_SHOW_VULN_FALLBACK(indirect_target_selection); -CPU_SHOW_VULN_FALLBACK(tsa); static DEVICE_ATTR(meltdown, 0444, cpu_show_meltdown, NULL); static DEVICE_ATTR(spectre_v1, 0444, cpu_show_spectre_v1, NULL); @@ -622,7 +621,6 @@ static DEVICE_ATTR(spec_rstack_overflow, 0444, cpu_show_spec_rstack_overflow, NU static DEVICE_ATTR(gather_data_sampling, 0444, cpu_show_gds, NULL); static DEVICE_ATTR(reg_file_data_sampling, 0444, cpu_show_reg_file_data_sampling, NULL); static DEVICE_ATTR(indirect_target_selection, 0444, cpu_show_indirect_target_selection, NULL); -static DEVICE_ATTR(tsa, 0444, cpu_show_tsa, NULL); static struct attribute *cpu_root_vulnerabilities_attrs[] = { &dev_attr_meltdown.attr, @@ -640,7 +638,6 @@ static struct attribute *cpu_root_vulnerabilities_attrs[] = { &dev_attr_gather_data_sampling.attr, &dev_attr_reg_file_data_sampling.attr, &dev_attr_indirect_target_selection.attr, - &dev_attr_tsa.attr, NULL }; diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index d1dae47f3534b8c684d354ab97e25cb347e9660e..d9d339b8b57108f7bcd3b287dbd6273a39088ba5 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -2856,7 +2856,7 @@ struct device *genpd_dev_pm_attach_by_id(struct device *dev, /* Verify that the index is within a valid range. */ num_domains = of_count_phandle_with_args(dev->of_node, "power-domains", "#power-domain-cells"); - if (num_domains < 0 || index >= num_domains) + if (index >= num_domains) return NULL; /* Allocate and register device on the genpd bus. */ diff --git a/drivers/base/power/domain_governor.c b/drivers/base/power/domain_governor.c index 4f09f9a5a0431b42a5cad2285cf0860a900a7079..cc2c3a5a6d35a42c0e86f6a3ae54b04c4f4118c2 100644 --- a/drivers/base/power/domain_governor.c +++ b/drivers/base/power/domain_governor.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -346,8 +345,6 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd) struct cpuidle_device *dev; ktime_t domain_wakeup, next_hrtimer; ktime_t now = ktime_get(); - struct device *cpu_dev; - s64 cpu_constraint, global_constraint; s64 idle_duration_ns; int cpu, i; @@ -358,7 +355,6 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd) if (!(genpd->flags & GENPD_FLAG_CPU_DOMAIN)) return true; - global_constraint = cpu_latency_qos_limit(); /* * Find the next wakeup for any of the online CPUs within the PM domain * and its subdomains. Note, we only need the genpd->cpus, as it already @@ -372,16 +368,8 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd) if (ktime_before(next_hrtimer, domain_wakeup)) domain_wakeup = next_hrtimer; } - - cpu_dev = get_cpu_device(cpu); - if (cpu_dev) { - cpu_constraint = dev_pm_qos_raw_resume_latency(cpu_dev); - if (cpu_constraint < global_constraint) - global_constraint = cpu_constraint; - } } - global_constraint *= NSEC_PER_USEC; /* The minimum idle duration is from now - until the next wakeup. */ idle_duration_ns = ktime_to_ns(ktime_sub(domain_wakeup, now)); if (idle_duration_ns <= 0) @@ -397,10 +385,8 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd) */ i = genpd->state_idx; do { - if ((idle_duration_ns >= (genpd->states[i].residency_ns + - genpd->states[i].power_off_latency_ns)) && - (global_constraint >= (genpd->states[i].power_on_latency_ns + - genpd->states[i].power_off_latency_ns))) { + if (idle_duration_ns >= (genpd->states[i].residency_ns + + genpd->states[i].power_off_latency_ns)) { genpd->state_idx = i; return true; } diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index baa31194cf20d5ad9fe501ed5547fa68f89f0971..343d3c966e7a7b5e5215c09aecd2080eecaf8191 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -897,8 +897,6 @@ static void __device_resume(struct device *dev, pm_message_t state, bool async) if (!dev->power.is_suspended) goto Complete; - dev->power.is_suspended = false; - if (dev->power.direct_complete) { /* Match the pm_runtime_disable() in __device_suspend(). */ pm_runtime_enable(dev); @@ -954,6 +952,7 @@ static void __device_resume(struct device *dev, pm_message_t state, bool async) End: error = dpm_run_callback(callback, dev, state, info); + dev->power.is_suspended = false; device_unlock(dev); dpm_watchdog_clear(&wd); diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 0d43bf5b6cecbf84dba43a509005c2e14fc88ccb..0af26cf8c0059fa7e7edeee1b373e529f4486e1a 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -1001,7 +1001,7 @@ static enum hrtimer_restart pm_suspend_timer_fn(struct hrtimer *timer) * If 'expires' is after the current time, we've been called * too early. */ - if (expires > 0 && expires <= ktime_get_mono_fast_ns()) { + if (expires > 0 && expires < ktime_get_mono_fast_ns()) { dev->power.timer_expires = 0; rpm_suspend(dev, dev->power.timer_autosuspends ? (RPM_ASYNC | RPM_AUTO) : RPM_ASYNC); diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 1209e01f8c7f9769845bf53fef9c371607f803e7..3011f7f9381b7f2436367ed716de338443bd9512 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -1173,8 +1173,6 @@ struct regmap *__regmap_init(struct device *dev, err_map: kfree(map); err: - if (bus && bus->free_on_exit) - kfree(bus); return ERR_PTR(ret); } EXPORT_SYMBOL_GPL(__regmap_init); diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c index a7a3e3b66bb5edd883aa72d4a071b193756773b1..079bd14bdedc7cb605f4aba336e79e893de980f2 100644 --- a/drivers/base/swnode.c +++ b/drivers/base/swnode.c @@ -518,7 +518,7 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode, if (prop->is_inline) return -EINVAL; - if ((index + 1) * sizeof(*ref) > prop->length) + if (index * sizeof(*ref) >= prop->length) return -ENOENT; ref_array = prop->pointer; diff --git a/drivers/block/aoe/aoe.h b/drivers/block/aoe/aoe.h index d35caa3c69e15e70dcb33decb18973f472b71865..749ae1246f4cf894f8544248c1461d0d06720db0 100644 --- a/drivers/block/aoe/aoe.h +++ b/drivers/block/aoe/aoe.h @@ -80,7 +80,6 @@ enum { DEVFL_NEWSIZE = (1<<6), /* need to update dev size in block layer */ DEVFL_FREEING = (1<<7), /* set when device is being cleaned up */ DEVFL_FREED = (1<<8), /* device has been cleaned up */ - DEVFL_DEAD = (1<<9), /* device has timed out of aoe_deadsecs */ }; enum { diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index c4c5cf1ec71ba9775d8adb778ad67872d877c547..d1f4ddc576451a8814a0a27c7101e56c99d3d32a 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c @@ -754,7 +754,7 @@ rexmit_timer(struct timer_list *timer) utgts = count_targets(d, NULL); - if (d->flags & (DEVFL_TKILL | DEVFL_DEAD)) { + if (d->flags & DEVFL_TKILL) { spin_unlock_irqrestore(&d->lock, flags); return; } @@ -786,8 +786,7 @@ rexmit_timer(struct timer_list *timer) * to clean up. */ list_splice(&flist, &d->factive[0]); - d->flags |= DEVFL_DEAD; - queue_work(aoe_wq, &d->work); + aoedev_downdev(d); goto out; } @@ -899,9 +898,6 @@ aoecmd_sleepwork(struct work_struct *work) { struct aoedev *d = container_of(work, struct aoedev, work); - if (d->flags & DEVFL_DEAD) - aoedev_downdev(d); - if (d->flags & DEVFL_GDALLOC) aoeblk_gdalloc(d); diff --git a/drivers/block/aoe/aoedev.c b/drivers/block/aoe/aoedev.c index 4240e11adfb7698c65e2b3b85a433d0cd22a52a5..3523dd82d7a002b217f2f4856e9f42daeba13caa 100644 --- a/drivers/block/aoe/aoedev.c +++ b/drivers/block/aoe/aoedev.c @@ -198,13 +198,9 @@ aoedev_downdev(struct aoedev *d) { struct aoetgt *t, **tt, **te; struct list_head *head, *pos, *nx; - struct request *rq, *rqnext; int i; - unsigned long flags; - spin_lock_irqsave(&d->lock, flags); - d->flags &= ~(DEVFL_UP | DEVFL_DEAD); - spin_unlock_irqrestore(&d->lock, flags); + d->flags &= ~DEVFL_UP; /* clean out active and to-be-retransmitted buffers */ for (i = 0; i < NFACTIVE; i++) { @@ -227,13 +223,6 @@ aoedev_downdev(struct aoedev *d) /* clean out the in-process request (if any) */ aoe_failip(d); - /* clean out any queued block requests */ - list_for_each_entry_safe(rq, rqnext, &d->rq_list, queuelist) { - list_del_init(&rq->queuelist); - blk_mq_start_request(rq); - blk_mq_end_request(rq, BLK_STS_IOERR); - } - /* fast fail all pending I/O */ if (d->blkq) { /* UP is cleared, freeze+quiesce to insure all are errored */ diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 3742ddf46c55ae02db0b3d45f5db4be950be2740..2203686156bfe05792cb0bf7403d1fc6ffa739a1 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -2120,7 +2120,9 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info) goto out; } } - + ret = nbd_start_device(nbd); + if (ret) + goto out; if (info->attrs[NBD_ATTR_BACKEND_IDENTIFIER]) { nbd->backend = nla_strdup(info->attrs[NBD_ATTR_BACKEND_IDENTIFIER], GFP_KERNEL); @@ -2136,8 +2138,6 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info) goto out; } set_bit(NBD_RT_HAS_BACKEND_FILE, &config->runtime_flags); - - ret = nbd_start_device(nbd); out: mutex_unlock(&nbd->config_lock); if (!ret) { diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 8c873a8e39cd93feb3ca3b1e6f76cbb629912dd3..95095500f93afb433b9abc91c3ba543ddbdf7e37 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -2323,10 +2323,6 @@ static int ublk_ctrl_add_dev(struct io_uring_cmd *cmd) if (copy_from_user(&info, argp, sizeof(info))) return -EFAULT; - if (info.queue_depth > UBLK_MAX_QUEUE_DEPTH || !info.queue_depth || - info.nr_hw_queues > UBLK_MAX_NR_QUEUES || !info.nr_hw_queues) - return -EINVAL; - if (capable(CAP_SYS_ADMIN)) info.flags &= ~UBLK_F_UNPRIVILEGED_DEV; else if (!(info.flags & UBLK_F_UNPRIVILEGED_DEV)) diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index db507a66fa8acd198eb055c909fa7ea854bd0f8c..d6195565ef7aeb7b88f03259f3bd2c6c6107f469 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -3525,8 +3525,9 @@ static void btusb_coredump_qca(struct hci_dev *hdev) static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb) { int ret = 0; - unsigned int skip = 0; u8 pkt_type; + u8 *sk_ptr; + unsigned int sk_len; u16 seqno; u32 dump_size; @@ -3535,13 +3536,18 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb) struct usb_device *udev = btdata->udev; pkt_type = hci_skb_pkt_type(skb); - skip = sizeof(struct hci_event_hdr); - if (pkt_type == HCI_ACLDATA_PKT) - skip += sizeof(struct hci_acl_hdr); + sk_ptr = skb->data; + sk_len = skb->len; - skb_pull(skb, skip); - dump_hdr = (struct qca_dump_hdr *)skb->data; + if (pkt_type == HCI_ACLDATA_PKT) { + sk_ptr += HCI_ACL_HDR_SIZE; + sk_len -= HCI_ACL_HDR_SIZE; + } + + sk_ptr += HCI_EVENT_HDR_SIZE; + sk_len -= HCI_EVENT_HDR_SIZE; + dump_hdr = (struct qca_dump_hdr *)sk_ptr; seqno = le16_to_cpu(dump_hdr->seqno); if (seqno == 0) { set_bit(BTUSB_HW_SSR_ACTIVE, &btdata->flags); @@ -3561,15 +3567,16 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb) btdata->qca_dump.ram_dump_size = dump_size; btdata->qca_dump.ram_dump_seqno = 0; - - skb_pull(skb, offsetof(struct qca_dump_hdr, data0)); + sk_ptr += offsetof(struct qca_dump_hdr, data0); + sk_len -= offsetof(struct qca_dump_hdr, data0); usb_disable_autosuspend(udev); bt_dev_info(hdev, "%s memdump size(%u)\n", (pkt_type == HCI_ACLDATA_PKT) ? "ACL" : "event", dump_size); } else { - skb_pull(skb, offsetof(struct qca_dump_hdr, data)); + sk_ptr += offsetof(struct qca_dump_hdr, data); + sk_len -= offsetof(struct qca_dump_hdr, data); } if (!btdata->qca_dump.ram_dump_size) { @@ -3589,6 +3596,7 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb) return ret; } + skb_pull(skb, skb->len - sk_len); hci_devcd_append(hdev, skb); btdata->qca_dump.ram_dump_seqno++; if (seqno == QCA_LAST_SEQUENCE_NUM) { @@ -3616,58 +3624,68 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb) /* Return: true if the ACL packet is a dump packet, false otherwise. */ static bool acl_pkt_is_dump_qca(struct hci_dev *hdev, struct sk_buff *skb) { + u8 *sk_ptr; + unsigned int sk_len; + struct hci_event_hdr *event_hdr; struct hci_acl_hdr *acl_hdr; struct qca_dump_hdr *dump_hdr; - struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC); - bool is_dump = false; - if (!clone) + sk_ptr = skb->data; + sk_len = skb->len; + + acl_hdr = hci_acl_hdr(skb); + if (le16_to_cpu(acl_hdr->handle) != QCA_MEMDUMP_ACL_HANDLE) return false; - acl_hdr = skb_pull_data(clone, sizeof(*acl_hdr)); - if (!acl_hdr || (le16_to_cpu(acl_hdr->handle) != QCA_MEMDUMP_ACL_HANDLE)) - goto out; + sk_ptr += HCI_ACL_HDR_SIZE; + sk_len -= HCI_ACL_HDR_SIZE; + event_hdr = (struct hci_event_hdr *)sk_ptr; - event_hdr = skb_pull_data(clone, sizeof(*event_hdr)); - if (!event_hdr || (event_hdr->evt != HCI_VENDOR_PKT)) - goto out; + if ((event_hdr->evt != HCI_VENDOR_PKT) || + (event_hdr->plen != (sk_len - HCI_EVENT_HDR_SIZE))) + return false; - dump_hdr = skb_pull_data(clone, sizeof(*dump_hdr)); - if (!dump_hdr || (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) || - (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) - goto out; + sk_ptr += HCI_EVENT_HDR_SIZE; + sk_len -= HCI_EVENT_HDR_SIZE; - is_dump = true; -out: - consume_skb(clone); - return is_dump; + dump_hdr = (struct qca_dump_hdr *)sk_ptr; + if ((sk_len < offsetof(struct qca_dump_hdr, data)) || + (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) || + (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) + return false; + + return true; } /* Return: true if the event packet is a dump packet, false otherwise. */ static bool evt_pkt_is_dump_qca(struct hci_dev *hdev, struct sk_buff *skb) { + u8 *sk_ptr; + unsigned int sk_len; + struct hci_event_hdr *event_hdr; struct qca_dump_hdr *dump_hdr; - struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC); - bool is_dump = false; - if (!clone) + sk_ptr = skb->data; + sk_len = skb->len; + + event_hdr = hci_event_hdr(skb); + + if ((event_hdr->evt != HCI_VENDOR_PKT) + || (event_hdr->plen != (sk_len - HCI_EVENT_HDR_SIZE))) return false; - event_hdr = skb_pull_data(clone, sizeof(*event_hdr)); - if (!event_hdr || (event_hdr->evt != HCI_VENDOR_PKT)) - goto out; + sk_ptr += HCI_EVENT_HDR_SIZE; + sk_len -= HCI_EVENT_HDR_SIZE; - dump_hdr = skb_pull_data(clone, sizeof(*dump_hdr)); - if (!dump_hdr || (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) || - (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) - goto out; + dump_hdr = (struct qca_dump_hdr *)sk_ptr; + if ((sk_len < offsetof(struct qca_dump_hdr, data)) || + (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) || + (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) + return false; - is_dump = true; -out: - consume_skb(clone); - return is_dump; + return true; } static int btusb_recv_acl_qca(struct hci_dev *hdev, struct sk_buff *skb) @@ -3736,32 +3754,6 @@ static const struct qca_device_info qca_devices_table[] = { { 0x00190200, 40, 4, 16 }, /* WCN785x 2.0 */ }; -static u16 qca_extract_board_id(const struct qca_version *ver) -{ - u16 flag = le16_to_cpu(ver->flag); - u16 board_id = 0; - - if (((flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) { - /* The board_id should be split into two bytes - * The 1st byte is chip ID, and the 2nd byte is platform ID - * For example, board ID 0x010A, 0x01 is platform ID. 0x0A is chip ID - * we have several platforms, and platform IDs are continuously added - * Platform ID: - * 0x00 is for Mobile - * 0x01 is for X86 - * 0x02 is for Automotive - * 0x03 is for Consumer electronic - */ - board_id = (ver->chip_id << 8) + ver->platform_id; - } - - /* Take 0xffff as invalid board ID */ - if (board_id == 0xffff) - board_id = 0; - - return board_id; -} - static int btusb_qca_send_vendor_req(struct usb_device *udev, u8 request, void *data, u16 size) { @@ -3918,28 +3910,44 @@ static void btusb_generate_qca_nvm_name(char *fwname, size_t max_size, const struct qca_version *ver) { u32 rom_version = le32_to_cpu(ver->rom_version); - const char *variant; - int len; - u16 board_id; + u16 flag = le16_to_cpu(ver->flag); + + if (((flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) { + /* The board_id should be split into two bytes + * The 1st byte is chip ID, and the 2nd byte is platform ID + * For example, board ID 0x010A, 0x01 is platform ID. 0x0A is chip ID + * we have several platforms, and platform IDs are continuously added + * Platform ID: + * 0x00 is for Mobile + * 0x01 is for X86 + * 0x02 is for Automotive + * 0x03 is for Consumer electronic + */ + u16 board_id = (ver->chip_id << 8) + ver->platform_id; + const char *variant; - board_id = qca_extract_board_id(ver); + switch (le32_to_cpu(ver->ram_version)) { + case WCN6855_2_0_RAM_VERSION_GF: + case WCN6855_2_1_RAM_VERSION_GF: + variant = "_gf"; + break; + default: + variant = ""; + break; + } - switch (le32_to_cpu(ver->ram_version)) { - case WCN6855_2_0_RAM_VERSION_GF: - case WCN6855_2_1_RAM_VERSION_GF: - variant = "_gf"; - break; - default: - variant = NULL; - break; + if (board_id == 0) { + snprintf(fwname, max_size, "qca/nvm_usb_%08x%s.bin", + rom_version, variant); + } else { + snprintf(fwname, max_size, "qca/nvm_usb_%08x%s_%04x.bin", + rom_version, variant, board_id); + } + } else { + snprintf(fwname, max_size, "qca/nvm_usb_%08x.bin", + rom_version); } - len = snprintf(fwname, max_size, "qca/nvm_usb_%08x", rom_version); - if (variant) - len += snprintf(fwname + len, max_size - len, "%s", variant); - if (board_id) - len += snprintf(fwname + len, max_size - len, "_%04x", board_id); - len += snprintf(fwname + len, max_size - len, ".bin"); } static int btusb_setup_qca_load_nvm(struct hci_dev *hdev, diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index 9c6f79d8605329e182b96a6a8723854c7db00c1c..7a552387129ef02647eeb77e262d3604bf00e237 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -2307,14 +2307,14 @@ static int qca_serdev_probe(struct serdev_device *serdev) qcadev->bt_en = devm_gpiod_get_optional(&serdev->dev, "enable", GPIOD_OUT_LOW); - if (IS_ERR(qcadev->bt_en)) - return dev_err_probe(&serdev->dev, - PTR_ERR(qcadev->bt_en), - "failed to acquire BT_EN gpio\n"); - - if (!qcadev->bt_en && + if (IS_ERR(qcadev->bt_en) && (data->soc_type == QCA_WCN6750 || - data->soc_type == QCA_WCN6855)) + data->soc_type == QCA_WCN6855)) { + dev_err(&serdev->dev, "failed to acquire BT_EN gpio\n"); + return PTR_ERR(qcadev->bt_en); + } + + if (!qcadev->bt_en) power_ctrl_enabled = false; qcadev->sw_ctrl = devm_gpiod_get_optional(&serdev->dev, "swctrl", diff --git a/drivers/bus/fsl-mc/fsl-mc-bus.c b/drivers/bus/fsl-mc/fsl-mc-bus.c index 350e7b24ee2b09f8e0960372696a3f109fb15d9c..2f6d5002e43d587458ab5644b685b82f8c63e311 100644 --- a/drivers/bus/fsl-mc/fsl-mc-bus.c +++ b/drivers/bus/fsl-mc/fsl-mc-bus.c @@ -905,10 +905,8 @@ int fsl_mc_device_add(struct fsl_mc_obj_desc *obj_desc, error_cleanup_dev: kfree(mc_dev->regions); - if (mc_bus) - kfree(mc_bus); - else - kfree(mc_dev); + kfree(mc_bus); + kfree(mc_dev); return error; } @@ -942,7 +940,6 @@ struct fsl_mc_device *fsl_mc_get_endpoint(struct fsl_mc_device *mc_dev, struct fsl_mc_obj_desc endpoint_desc = {{ 0 }}; struct dprc_endpoint endpoint1 = {{ 0 }}; struct dprc_endpoint endpoint2 = {{ 0 }}; - struct fsl_mc_bus *mc_bus; int state, err; mc_bus_dev = to_fsl_mc_device(mc_dev->dev.parent); @@ -966,8 +963,6 @@ struct fsl_mc_device *fsl_mc_get_endpoint(struct fsl_mc_device *mc_dev, strcpy(endpoint_desc.type, endpoint2.type); endpoint_desc.id = endpoint2.id; endpoint = fsl_mc_device_lookup(&endpoint_desc, mc_bus_dev); - if (endpoint) - return endpoint; /* * We know that the device has an endpoint because we verified by @@ -975,13 +970,17 @@ struct fsl_mc_device *fsl_mc_get_endpoint(struct fsl_mc_device *mc_dev, * yet discovered by the fsl-mc bus, thus the lookup returned NULL. * Force a rescan of the devices in this container and retry the lookup. */ - mc_bus = to_fsl_mc_bus(mc_bus_dev); - if (mutex_trylock(&mc_bus->scan_mutex)) { - err = dprc_scan_objects(mc_bus_dev, true); - mutex_unlock(&mc_bus->scan_mutex); + if (!endpoint) { + struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_bus_dev); + + if (mutex_trylock(&mc_bus->scan_mutex)) { + err = dprc_scan_objects(mc_bus_dev, true); + mutex_unlock(&mc_bus->scan_mutex); + } + + if (err < 0) + return ERR_PTR(err); } - if (err < 0) - return ERR_PTR(err); endpoint = fsl_mc_device_lookup(&endpoint_desc, mc_bus_dev); /* diff --git a/drivers/bus/fsl-mc/fsl-mc-uapi.c b/drivers/bus/fsl-mc/fsl-mc-uapi.c index a376ec66165348654b1c326f1940640893dbc14a..9c4c1395fcdbf26a8c4ddaae0a948260e9e76d3d 100644 --- a/drivers/bus/fsl-mc/fsl-mc-uapi.c +++ b/drivers/bus/fsl-mc/fsl-mc-uapi.c @@ -275,13 +275,13 @@ static struct fsl_mc_cmd_desc fsl_mc_accepted_cmds[] = { .size = 8, }, [DPSW_GET_TAILDROP] = { - .cmdid_value = 0x0A90, + .cmdid_value = 0x0A80, .cmdid_mask = 0xFFF0, .token = true, .size = 14, }, [DPSW_SET_TAILDROP] = { - .cmdid_value = 0x0A80, + .cmdid_value = 0x0A90, .cmdid_mask = 0xFFF0, .token = true, .size = 24, diff --git a/drivers/bus/fsl-mc/mc-io.c b/drivers/bus/fsl-mc/mc-io.c index 8b7a34f4db94bb67d55ed946d48e0cf3f71853e6..95b10a6cf3073ff476584e45373b63a7599c1a24 100644 --- a/drivers/bus/fsl-mc/mc-io.c +++ b/drivers/bus/fsl-mc/mc-io.c @@ -214,19 +214,12 @@ int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev, if (error < 0) goto error_cleanup_resource; - /* If the DPRC device itself tries to allocate a portal (usually for - * UAPI interaction), don't add a device link between them since the - * DPMCP device is an actual child device of the DPRC and a reverse - * dependency is not allowed. - */ - if (mc_dev != mc_bus_dev) { - dpmcp_dev->consumer_link = device_link_add(&mc_dev->dev, - &dpmcp_dev->dev, - DL_FLAG_AUTOREMOVE_CONSUMER); - if (!dpmcp_dev->consumer_link) { - error = -EINVAL; - goto error_cleanup_mc_io; - } + dpmcp_dev->consumer_link = device_link_add(&mc_dev->dev, + &dpmcp_dev->dev, + DL_FLAG_AUTOREMOVE_CONSUMER); + if (!dpmcp_dev->consumer_link) { + error = -EINVAL; + goto error_cleanup_mc_io; } *new_mc_io = mc_io; diff --git a/drivers/bus/fsl-mc/mc-sys.c b/drivers/bus/fsl-mc/mc-sys.c index b22c59d57c8f0a7c037f08cfd7ddb9124305995e..f2052cd0a0517865f73b778ca7b9b395c9886c4c 100644 --- a/drivers/bus/fsl-mc/mc-sys.c +++ b/drivers/bus/fsl-mc/mc-sys.c @@ -19,7 +19,7 @@ /* * Timeout in milliseconds to wait for the completion of an MC command */ -#define MC_CMD_COMPLETION_TIMEOUT_MS 15000 +#define MC_CMD_COMPLETION_TIMEOUT_MS 500 /* * usleep_range() min and max values used to throttle down polling diff --git a/drivers/bus/mhi/ep/ring.c b/drivers/bus/mhi/ep/ring.c index fedf26392e8d29894fe115166148f2ded2bba731..ba9f696d1aa80e02ed662048818ade94267cb5f3 100644 --- a/drivers/bus/mhi/ep/ring.c +++ b/drivers/bus/mhi/ep/ring.c @@ -131,23 +131,19 @@ int mhi_ep_ring_add_element(struct mhi_ep_ring *ring, struct mhi_ring_element *e } old_offset = ring->rd_offset; + mhi_ep_ring_inc_index(ring); dev_dbg(dev, "Adding an element to ring at offset (%zu)\n", ring->rd_offset); - buf_info.host_addr = ring->rbase + (old_offset * sizeof(*el)); - buf_info.dev_addr = el; - buf_info.size = sizeof(*el); - - ret = mhi_cntrl->write_sync(mhi_cntrl, &buf_info); - if (ret) - return ret; - - mhi_ep_ring_inc_index(ring); /* Update rp in ring context */ rp = cpu_to_le64(ring->rd_offset * sizeof(*el) + ring->rbase); memcpy_toio((void __iomem *) &ring->ring_ctx->generic.rp, &rp, sizeof(u64)); - return ret; + buf_info.host_addr = ring->rbase + (old_offset * sizeof(*el)); + buf_info.dev_addr = el; + buf_info.size = sizeof(*el); + + return mhi_cntrl->write_sync(mhi_cntrl, &buf_info); } void mhi_ep_ring_init(struct mhi_ep_ring *ring, enum mhi_ep_ring_type type, u32 id) diff --git a/drivers/bus/mhi/host/pm.c b/drivers/bus/mhi/host/pm.c index e48bf44c785c9b289143b96ae06517f78cba13d3..27f8a40f288cfd45b96d7889d24c7f39261047cc 100644 --- a/drivers/bus/mhi/host/pm.c +++ b/drivers/bus/mhi/host/pm.c @@ -586,7 +586,6 @@ static void mhi_pm_sys_error_transition(struct mhi_controller *mhi_cntrl) struct mhi_cmd *mhi_cmd; struct mhi_event_ctxt *er_ctxt; struct device *dev = &mhi_cntrl->mhi_dev->dev; - bool reset_device = false; int ret, i; dev_dbg(dev, "Transitioning from PM state: %s to: %s\n", @@ -615,23 +614,8 @@ static void mhi_pm_sys_error_transition(struct mhi_controller *mhi_cntrl) /* Wake up threads waiting for state transition */ wake_up_all(&mhi_cntrl->state_event); - if (MHI_REG_ACCESS_VALID(prev_state)) { - /* - * If the device is in PBL or SBL, it will only respond to - * RESET if the device is in SYSERR state. SYSERR might - * already be cleared at this point. - */ - enum mhi_state cur_state = mhi_get_mhi_state(mhi_cntrl); - enum mhi_ee_type cur_ee = mhi_get_exec_env(mhi_cntrl); - - if (cur_state == MHI_STATE_SYS_ERR) - reset_device = true; - else if (cur_ee != MHI_EE_PBL && cur_ee != MHI_EE_SBL) - reset_device = true; - } - /* Trigger MHI RESET so that the device will not access host memory */ - if (reset_device) { + if (MHI_REG_ACCESS_VALID(prev_state)) { u32 in_reset = -1; unsigned long timeout = msecs_to_jiffies(mhi_cntrl->timeout_ms); diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c index 46d7410f6f0fce13217a52624b44dafc2ca3190a..65163312dab8acd1d369fd648e201470873dc294 100644 --- a/drivers/bus/ti-sysc.c +++ b/drivers/bus/ti-sysc.c @@ -667,6 +667,51 @@ static int sysc_parse_and_check_child_range(struct sysc *ddata) return 0; } +/* Interconnect instances to probe before l4_per instances */ +static struct resource early_bus_ranges[] = { + /* am3/4 l4_wkup */ + { .start = 0x44c00000, .end = 0x44c00000 + 0x300000, }, + /* omap4/5 and dra7 l4_cfg */ + { .start = 0x4a000000, .end = 0x4a000000 + 0x300000, }, + /* omap4 l4_wkup */ + { .start = 0x4a300000, .end = 0x4a300000 + 0x30000, }, + /* omap5 and dra7 l4_wkup without dra7 dcan segment */ + { .start = 0x4ae00000, .end = 0x4ae00000 + 0x30000, }, +}; + +static atomic_t sysc_defer = ATOMIC_INIT(10); + +/** + * sysc_defer_non_critical - defer non_critical interconnect probing + * @ddata: device driver data + * + * We want to probe l4_cfg and l4_wkup interconnect instances before any + * l4_per instances as l4_per instances depend on resources on l4_cfg and + * l4_wkup interconnects. + */ +static int sysc_defer_non_critical(struct sysc *ddata) +{ + struct resource *res; + int i; + + if (!atomic_read(&sysc_defer)) + return 0; + + for (i = 0; i < ARRAY_SIZE(early_bus_ranges); i++) { + res = &early_bus_ranges[i]; + if (ddata->module_pa >= res->start && + ddata->module_pa <= res->end) { + atomic_set(&sysc_defer, 0); + + return 0; + } + } + + atomic_dec_if_positive(&sysc_defer); + + return -EPROBE_DEFER; +} + static struct device_node *stdout_path; static void sysc_init_stdout_path(struct sysc *ddata) @@ -892,6 +937,10 @@ static int sysc_map_and_check_registers(struct sysc *ddata) if (error) return error; + error = sysc_defer_non_critical(ddata); + if (error) + return error; + sysc_check_children(ddata); if (!of_property_present(np, "reg")) diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index db8f1dadaa9f4f8d1ea9d73884fe6fe9a995a20c..186f1fee753403f7b0e0feac76cc7bfd4f20f373 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c @@ -1241,7 +1241,7 @@ int ipmi_create_user(unsigned int if_num, } /* Not found, return an error */ rv = -EINVAL; - goto out_unlock; + goto out_kfree; found: if (atomic_add_return(1, &intf->nr_users) > max_users) { @@ -1283,7 +1283,6 @@ int ipmi_create_user(unsigned int if_num, out_kfree: atomic_dec(&intf->nr_users); -out_unlock: srcu_read_unlock(&ipmi_interfaces_srcu, index); vfree(new_user); return rv; diff --git a/drivers/clk/bcm/clk-raspberrypi.c b/drivers/clk/bcm/clk-raspberrypi.c index cc4ca336ac13a3dcfe077e0cda0c3b2ac0a090a4..4d411408e4afefc2b765c7859a0a3d1582972c89 100644 --- a/drivers/clk/bcm/clk-raspberrypi.c +++ b/drivers/clk/bcm/clk-raspberrypi.c @@ -271,8 +271,6 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi, init.name = devm_kasprintf(rpi->dev, GFP_KERNEL, "fw-clk-%s", rpi_firmware_clk_names[id]); - if (!init.name) - return ERR_PTR(-ENOMEM); init.ops = &raspberrypi_firmware_clk_ops; init.flags = CLK_GET_RATE_NOCACHE; diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c index 337144570fafa2bab52d50dd881c3d549527fe7e..38c456540d1b98cca0fc0370c185b03b497fd3ca 100644 --- a/drivers/clk/clk-s2mps11.c +++ b/drivers/clk/clk-s2mps11.c @@ -137,8 +137,6 @@ static int s2mps11_clk_probe(struct platform_device *pdev) if (!clk_data) return -ENOMEM; - clk_data->num = S2MPS11_CLKS_NUM; - switch (hwid) { case S2MPS11X: s2mps11_reg = S2MPS11_REG_RTC_CTRL; @@ -188,6 +186,7 @@ static int s2mps11_clk_probe(struct platform_device *pdev) clk_data->hws[i] = &s2mps11_clks[i].hw; } + clk_data->num = S2MPS11_CLKS_NUM; of_clk_add_hw_provider(s2mps11_clks->clk_np, of_clk_hw_onecell_get, clk_data); diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c index 69018efbf7f47b7f8fdfaa7e5af8e4ff6724fff6..233ce4a4c1c2f1c7d910ef28ade758441f9ca2cc 100644 --- a/drivers/clk/meson/g12a.c +++ b/drivers/clk/meson/g12a.c @@ -3971,7 +3971,6 @@ static const struct clk_parent_data spicc_sclk_parent_data[] = { { .hw = &g12a_clk81.hw }, { .hw = &g12a_fclk_div4.hw }, { .hw = &g12a_fclk_div3.hw }, - { .hw = &g12a_fclk_div2.hw }, { .hw = &g12a_fclk_div5.hw }, { .hw = &g12a_fclk_div7.hw }, }; diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig index 95cbea8d380c372a4749aab3f842e43a70f97c4c..1de1661037b1b14974169bfc532ccfa1876420f4 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -148,7 +148,7 @@ config IPQ_GCC_4019 config IPQ_GCC_5018 tristate "IPQ5018 Global Clock Controller" - depends on ARM || ARM64 || COMPILE_TEST + depends on ARM64 || COMPILE_TEST help Support for global clock controller on ipq5018 devices. Say Y if you want to use peripheral devices such as UART, SPI, diff --git a/drivers/clk/qcom/camcc-sm6350.c b/drivers/clk/qcom/camcc-sm6350.c index eca36bd3ba5c94177ccd28bfcc69b0cd53f9672e..acba9f99d960c72db49604716ca8c077a73d2a9c 100644 --- a/drivers/clk/qcom/camcc-sm6350.c +++ b/drivers/clk/qcom/camcc-sm6350.c @@ -1694,9 +1694,6 @@ static struct clk_branch camcc_sys_tmr_clk = { static struct gdsc bps_gdsc = { .gdscr = 0x6004, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0xf, .pd = { .name = "bps_gdsc", }, @@ -1706,9 +1703,6 @@ static struct gdsc bps_gdsc = { static struct gdsc ipe_0_gdsc = { .gdscr = 0x7004, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0xf, .pd = { .name = "ipe_0_gdsc", }, @@ -1718,9 +1712,6 @@ static struct gdsc ipe_0_gdsc = { static struct gdsc ife_0_gdsc = { .gdscr = 0x9004, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0xf, .pd = { .name = "ife_0_gdsc", }, @@ -1729,9 +1720,6 @@ static struct gdsc ife_0_gdsc = { static struct gdsc ife_1_gdsc = { .gdscr = 0xa004, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0xf, .pd = { .name = "ife_1_gdsc", }, @@ -1740,9 +1728,6 @@ static struct gdsc ife_1_gdsc = { static struct gdsc ife_2_gdsc = { .gdscr = 0xb004, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0xf, .pd = { .name = "ife_2_gdsc", }, @@ -1751,9 +1736,6 @@ static struct gdsc ife_2_gdsc = { static struct gdsc titan_top_gdsc = { .gdscr = 0x14004, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0xf, .pd = { .name = "titan_top_gdsc", }, diff --git a/drivers/clk/qcom/camcc-sm8250.c b/drivers/clk/qcom/camcc-sm8250.c index e29706d7828707e759dea2ceb560b8bd0540bd87..9b32c56a5bc5af877510dde4bb79b86bd77cc86b 100644 --- a/drivers/clk/qcom/camcc-sm8250.c +++ b/drivers/clk/qcom/camcc-sm8250.c @@ -411,7 +411,7 @@ static struct clk_rcg2 cam_cc_bps_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -433,7 +433,7 @@ static struct clk_rcg2 cam_cc_camnoc_axi_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -454,7 +454,7 @@ static struct clk_rcg2 cam_cc_cci_0_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -469,7 +469,7 @@ static struct clk_rcg2 cam_cc_cci_1_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -490,7 +490,7 @@ static struct clk_rcg2 cam_cc_cphy_rx_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -511,7 +511,7 @@ static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -526,7 +526,7 @@ static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -556,7 +556,7 @@ static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -571,7 +571,7 @@ static struct clk_rcg2 cam_cc_csi4phytimer_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -586,7 +586,7 @@ static struct clk_rcg2 cam_cc_csi5phytimer_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -611,7 +611,7 @@ static struct clk_rcg2 cam_cc_fast_ahb_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -634,7 +634,7 @@ static struct clk_rcg2 cam_cc_fd_core_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -649,7 +649,7 @@ static struct clk_rcg2 cam_cc_icp_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -673,7 +673,7 @@ static struct clk_rcg2 cam_cc_ife_0_clk_src = { .parent_data = cam_cc_parent_data_2, .num_parents = ARRAY_SIZE(cam_cc_parent_data_2), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -710,7 +710,7 @@ static struct clk_rcg2 cam_cc_ife_0_csid_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -734,7 +734,7 @@ static struct clk_rcg2 cam_cc_ife_1_clk_src = { .parent_data = cam_cc_parent_data_3, .num_parents = ARRAY_SIZE(cam_cc_parent_data_3), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -749,7 +749,7 @@ static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -771,7 +771,7 @@ static struct clk_rcg2 cam_cc_ife_lite_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -786,7 +786,7 @@ static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -810,7 +810,7 @@ static struct clk_rcg2 cam_cc_ipe_0_clk_src = { .parent_data = cam_cc_parent_data_4, .num_parents = ARRAY_SIZE(cam_cc_parent_data_4), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -825,7 +825,7 @@ static struct clk_rcg2 cam_cc_jpeg_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -847,7 +847,7 @@ static struct clk_rcg2 cam_cc_mclk0_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -862,7 +862,7 @@ static struct clk_rcg2 cam_cc_mclk1_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -877,7 +877,7 @@ static struct clk_rcg2 cam_cc_mclk2_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -892,7 +892,7 @@ static struct clk_rcg2 cam_cc_mclk3_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -907,7 +907,7 @@ static struct clk_rcg2 cam_cc_mclk4_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -922,7 +922,7 @@ static struct clk_rcg2 cam_cc_mclk5_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; @@ -993,7 +993,7 @@ static struct clk_rcg2 cam_cc_slow_ahb_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_shared_ops, + .ops = &clk_rcg2_ops, }, }; diff --git a/drivers/clk/qcom/clk-alpha-pll.c b/drivers/clk/qcom/clk-alpha-pll.c index 732ca46703ba30ea88b556828db1514d15ad9319..80aadafffacdb17dfb294dd2e02f385e946d5d23 100644 --- a/drivers/clk/qcom/clk-alpha-pll.c +++ b/drivers/clk/qcom/clk-alpha-pll.c @@ -645,19 +645,14 @@ clk_alpha_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); u32 alpha_width = pll_alpha_width(pll); - if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l)) - return 0; - - if (regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl)) - return 0; + regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); + regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); if (ctl & PLL_ALPHA_EN) { - if (regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &low)) - return 0; + regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &low); if (alpha_width > 32) { - if (regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), - &high)) - return 0; + regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), + &high); a = (u64)high << 32 | low; } else { a = low & GENMASK(alpha_width - 1, 0); @@ -849,11 +844,8 @@ alpha_pll_huayra_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); u32 l, alpha = 0, ctl, alpha_m, alpha_n; - if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l)) - return 0; - - if (regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl)) - return 0; + regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); + regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); if (ctl & PLL_ALPHA_EN) { regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &alpha); @@ -1047,11 +1039,8 @@ clk_trion_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); u32 l, frac, alpha_width = pll_alpha_width(pll); - if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l)) - return 0; - - if (regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac)) - return 0; + regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); + regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac); return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width); } @@ -1109,8 +1098,7 @@ clk_alpha_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); u32 ctl; - if (regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl)) - return 0; + regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); ctl >>= PLL_POST_DIV_SHIFT; ctl &= PLL_POST_DIV_MASK(pll); @@ -1326,11 +1314,8 @@ static unsigned long alpha_pll_fabia_recalc_rate(struct clk_hw *hw, struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); u32 l, frac, alpha_width = pll_alpha_width(pll); - if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l)) - return 0; - - if (regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac)) - return 0; + regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); + regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac); return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width); } @@ -1480,8 +1465,7 @@ clk_trion_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) struct regmap *regmap = pll->clkr.regmap; u32 i, div = 1, val; - if (regmap_read(regmap, PLL_USER_CTL(pll), &val)) - return 0; + regmap_read(regmap, PLL_USER_CTL(pll), &val); val >>= pll->post_div_shift; val &= PLL_POST_DIV_MASK(pll); @@ -2355,12 +2339,9 @@ static unsigned long alpha_pll_lucid_evo_recalc_rate(struct clk_hw *hw, struct regmap *regmap = pll->clkr.regmap; u32 l, frac; - if (regmap_read(regmap, PLL_L_VAL(pll), &l)) - return 0; + regmap_read(regmap, PLL_L_VAL(pll), &l); l &= LUCID_EVO_PLL_L_VAL_MASK; - - if (regmap_read(regmap, PLL_ALPHA_VAL(pll), &frac)) - return 0; + regmap_read(regmap, PLL_ALPHA_VAL(pll), &frac); return alpha_pll_calc_rate(parent_rate, l, frac, pll_alpha_width(pll)); } @@ -2435,8 +2416,7 @@ static unsigned long clk_rivian_evo_pll_recalc_rate(struct clk_hw *hw, struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); u32 l; - if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l)) - return 0; + regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); return parent_rate * l; } diff --git a/drivers/clk/qcom/dispcc-sm6350.c b/drivers/clk/qcom/dispcc-sm6350.c index ea98a63746f0f156b49fcc1a8c43133f7f8d6829..ddacb4f76eca5f2545e0d414959d6e92c9fab4a3 100644 --- a/drivers/clk/qcom/dispcc-sm6350.c +++ b/drivers/clk/qcom/dispcc-sm6350.c @@ -680,9 +680,6 @@ static struct clk_branch disp_cc_xo_clk = { static struct gdsc mdss_gdsc = { .gdscr = 0x1004, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0xf, .pd = { .name = "mdss_gdsc", }, diff --git a/drivers/clk/qcom/gcc-msm8939.c b/drivers/clk/qcom/gcc-msm8939.c index e4a44377b75f746cb4aa72533c64c2135450ee47..b45f97c07eeb6ffd27caad22297490a19ecc153b 100644 --- a/drivers/clk/qcom/gcc-msm8939.c +++ b/drivers/clk/qcom/gcc-msm8939.c @@ -432,7 +432,7 @@ static const struct parent_map gcc_xo_gpll0_gpll1a_gpll6_sleep_map[] = { { P_XO, 0 }, { P_GPLL0, 1 }, { P_GPLL1_AUX, 2 }, - { P_GPLL6, 3 }, + { P_GPLL6, 2 }, { P_SLEEP_CLK, 6 }, }; @@ -1100,7 +1100,7 @@ static struct clk_rcg2 jpeg0_clk_src = { }; static const struct freq_tbl ftbl_gcc_camss_mclk0_1_clk[] = { - F(24000000, P_GPLL6, 1, 1, 45), + F(24000000, P_GPLL0, 1, 1, 45), F(66670000, P_GPLL0, 12, 0, 0), { } }; diff --git a/drivers/clk/qcom/gcc-sm6350.c b/drivers/clk/qcom/gcc-sm6350.c index 4031613c6236fb7fdc3c85a34b26529df2704dcc..428cd99dcdcbe583c16c4e8b051b97a38d5a0052 100644 --- a/drivers/clk/qcom/gcc-sm6350.c +++ b/drivers/clk/qcom/gcc-sm6350.c @@ -2320,9 +2320,6 @@ static struct clk_branch gcc_video_xo_clk = { static struct gdsc usb30_prim_gdsc = { .gdscr = 0x1a004, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0xf, .pd = { .name = "usb30_prim_gdsc", }, @@ -2331,9 +2328,6 @@ static struct gdsc usb30_prim_gdsc = { static struct gdsc ufs_phy_gdsc = { .gdscr = 0x3a004, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0xf, .pd = { .name = "ufs_phy_gdsc", }, diff --git a/drivers/clk/qcom/gpucc-sm6350.c b/drivers/clk/qcom/gpucc-sm6350.c index 86c8ad5b55bac4d7fb1299d0024906c8fc482fe4..0bcbba2a2943654e9bece1e2fc45de0c15164a22 100644 --- a/drivers/clk/qcom/gpucc-sm6350.c +++ b/drivers/clk/qcom/gpucc-sm6350.c @@ -412,9 +412,6 @@ static struct clk_branch gpu_cc_gx_vsense_clk = { static struct gdsc gpu_cx_gdsc = { .gdscr = 0x106c, .gds_hw_ctrl = 0x1540, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0x8, .pd = { .name = "gpu_cx_gdsc", }, @@ -425,9 +422,6 @@ static struct gdsc gpu_cx_gdsc = { static struct gdsc gpu_gx_gdsc = { .gdscr = 0x100c, .clamp_io_ctrl = 0x1508, - .en_rest_wait_val = 0x2, - .en_few_wait_val = 0x2, - .clk_dis_wait_val = 0x2, .pd = { .name = "gpu_gx_gdsc", .power_on = gdsc_gx_do_nothing_enable, diff --git a/drivers/clk/rockchip/clk-rk3036.c b/drivers/clk/rockchip/clk-rk3036.c index f5f27535087a3036fd5e164e6c3e048784319163..d644bc155ec6e5c8bc526a94df045922eaaa07ee 100644 --- a/drivers/clk/rockchip/clk-rk3036.c +++ b/drivers/clk/rockchip/clk-rk3036.c @@ -431,7 +431,6 @@ static const char *const rk3036_critical_clocks[] __initconst = { "hclk_peri", "pclk_peri", "pclk_ddrupctl", - "ddrphy", }; static void __init rk3036_clk_init(struct device_node *np) diff --git a/drivers/clk/sunxi-ng/ccu-sun20i-d1.c b/drivers/clk/sunxi-ng/ccu-sun20i-d1.c index 98f107e96317eca295fac879a76ab08cbfbe2984..f95c3615ca77273837057f91be8b7b98bd91b8d6 100644 --- a/drivers/clk/sunxi-ng/ccu-sun20i-d1.c +++ b/drivers/clk/sunxi-ng/ccu-sun20i-d1.c @@ -412,23 +412,19 @@ static const struct clk_parent_data mmc0_mmc1_parents[] = { { .hw = &pll_periph0_2x_clk.common.hw }, { .hw = &pll_audio1_div2_clk.common.hw }, }; -static SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(mmc0_clk, "mmc0", - mmc0_mmc1_parents, 0x830, - 0, 4, /* M */ - 8, 2, /* P */ - 24, 3, /* mux */ - BIT(31), /* gate */ - 2, /* post-div */ - 0); - -static SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(mmc1_clk, "mmc1", - mmc0_mmc1_parents, 0x834, - 0, 4, /* M */ - 8, 2, /* P */ - 24, 3, /* mux */ - BIT(31), /* gate */ - 2, /* post-div */ - 0); +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc0_clk, "mmc0", mmc0_mmc1_parents, 0x830, + 0, 4, /* M */ + 8, 2, /* P */ + 24, 3, /* mux */ + BIT(31), /* gate */ + 0); + +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc1_clk, "mmc1", mmc0_mmc1_parents, 0x834, + 0, 4, /* M */ + 8, 2, /* P */ + 24, 3, /* mux */ + BIT(31), /* gate */ + 0); static const struct clk_parent_data mmc2_parents[] = { { .fw_name = "hosc" }, @@ -437,14 +433,12 @@ static const struct clk_parent_data mmc2_parents[] = { { .hw = &pll_periph0_800M_clk.common.hw }, { .hw = &pll_audio1_div2_clk.common.hw }, }; -static SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(mmc2_clk, "mmc2", mmc2_parents, - 0x838, - 0, 4, /* M */ - 8, 2, /* P */ - 24, 3, /* mux */ - BIT(31), /* gate */ - 2, /* post-div */ - 0); +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc2_clk, "mmc2", mmc2_parents, 0x838, + 0, 4, /* M */ + 8, 2, /* P */ + 24, 3, /* mux */ + BIT(31), /* gate */ + 0); static SUNXI_CCU_GATE_HWS(bus_mmc0_clk, "bus-mmc0", psi_ahb_hws, 0x84c, BIT(0), 0); diff --git a/drivers/clk/sunxi-ng/ccu_mp.h b/drivers/clk/sunxi-ng/ccu_mp.h index 7d836a9fb3db34b201559e2a00d4a2a846fdaf39..6e50f3728fb5f1ed31329d3fb961c2442a71ea37 100644 --- a/drivers/clk/sunxi-ng/ccu_mp.h +++ b/drivers/clk/sunxi-ng/ccu_mp.h @@ -52,28 +52,6 @@ struct ccu_mp { } \ } -#define SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(_struct, _name, _parents, \ - _reg, \ - _mshift, _mwidth, \ - _pshift, _pwidth, \ - _muxshift, _muxwidth, \ - _gate, _postdiv, _flags)\ - struct ccu_mp _struct = { \ - .enable = _gate, \ - .m = _SUNXI_CCU_DIV(_mshift, _mwidth), \ - .p = _SUNXI_CCU_DIV(_pshift, _pwidth), \ - .mux = _SUNXI_CCU_MUX(_muxshift, _muxwidth), \ - .fixed_post_div = _postdiv, \ - .common = { \ - .reg = _reg, \ - .features = CCU_FEATURE_FIXED_POSTDIV, \ - .hw.init = CLK_HW_INIT_PARENTS_DATA(_name, \ - _parents, \ - &ccu_mp_ops, \ - _flags), \ - } \ - } - #define SUNXI_CCU_MP_WITH_MUX_GATE(_struct, _name, _parents, _reg, \ _mshift, _mwidth, \ _pshift, _pwidth, \ diff --git a/drivers/comedi/comedi_fops.c b/drivers/comedi/comedi_fops.c index e4d62cdaff462d73bfb94bdba1c99d2a9fa78276..81763e3f948467ab3974f579ef9efe117ea42801 100644 --- a/drivers/comedi/comedi_fops.c +++ b/drivers/comedi/comedi_fops.c @@ -1556,27 +1556,21 @@ static int do_insnlist_ioctl(struct comedi_device *dev, } for (i = 0; i < n_insns; ++i) { - unsigned int n = insns[i].n; - if (insns[i].insn & INSN_MASK_WRITE) { if (copy_from_user(data, insns[i].data, - n * sizeof(unsigned int))) { + insns[i].n * sizeof(unsigned int))) { dev_dbg(dev->class_dev, "copy_from_user failed\n"); ret = -EFAULT; goto error; } - if (n < MIN_SAMPLES) { - memset(&data[n], 0, (MIN_SAMPLES - n) * - sizeof(unsigned int)); - } } ret = parse_insn(dev, insns + i, data, file); if (ret < 0) goto error; if (insns[i].insn & INSN_MASK_READ) { if (copy_to_user(insns[i].data, data, - n * sizeof(unsigned int))) { + insns[i].n * sizeof(unsigned int))) { dev_dbg(dev->class_dev, "copy_to_user failed\n"); ret = -EFAULT; @@ -1595,16 +1589,6 @@ static int do_insnlist_ioctl(struct comedi_device *dev, return i; } -#define MAX_INSNS MAX_SAMPLES -static int check_insnlist_len(struct comedi_device *dev, unsigned int n_insns) -{ - if (n_insns > MAX_INSNS) { - dev_dbg(dev->class_dev, "insnlist length too large\n"); - return -EINVAL; - } - return 0; -} - /* * COMEDI_INSN ioctl * synchronous instruction @@ -1649,10 +1633,6 @@ static int do_insn_ioctl(struct comedi_device *dev, ret = -EFAULT; goto error; } - if (insn->n < MIN_SAMPLES) { - memset(&data[insn->n], 0, - (MIN_SAMPLES - insn->n) * sizeof(unsigned int)); - } } ret = parse_insn(dev, insn, data, file); if (ret < 0) @@ -2259,9 +2239,6 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd, rc = -EFAULT; break; } - rc = check_insnlist_len(dev, insnlist.n_insns); - if (rc) - break; insns = kcalloc(insnlist.n_insns, sizeof(*insns), GFP_KERNEL); if (!insns) { rc = -ENOMEM; @@ -3113,9 +3090,6 @@ static int compat_insnlist(struct file *file, unsigned long arg) if (copy_from_user(&insnlist32, compat_ptr(arg), sizeof(insnlist32))) return -EFAULT; - rc = check_insnlist_len(dev, insnlist32.n_insns); - if (rc) - return rc; insns = kcalloc(insnlist32.n_insns, sizeof(*insns), GFP_KERNEL); if (!insns) return -ENOMEM; diff --git a/drivers/comedi/drivers.c b/drivers/comedi/drivers.c index 086213bcc499338cee1a90feece903258eccc396..d4e2ed709bfc7a5e27dd2361fa61ae6d1a85ebb2 100644 --- a/drivers/comedi/drivers.c +++ b/drivers/comedi/drivers.c @@ -338,10 +338,10 @@ int comedi_dio_insn_config(struct comedi_device *dev, unsigned int *data, unsigned int mask) { - unsigned int chan = CR_CHAN(insn->chanspec); + unsigned int chan_mask = 1 << CR_CHAN(insn->chanspec); - if (!mask && chan < 32) - mask = 1U << chan; + if (!mask) + mask = chan_mask; switch (data[0]) { case INSN_CONFIG_DIO_INPUT: @@ -381,7 +381,7 @@ EXPORT_SYMBOL_GPL(comedi_dio_insn_config); unsigned int comedi_dio_update_state(struct comedi_subdevice *s, unsigned int *data) { - unsigned int chanmask = (s->n_chan < 32) ? ((1U << s->n_chan) - 1) + unsigned int chanmask = (s->n_chan < 32) ? ((1 << s->n_chan) - 1) : 0xffffffff; unsigned int mask = data[0] & chanmask; unsigned int bits = data[1]; @@ -614,9 +614,6 @@ static int insn_rw_emulate_bits(struct comedi_device *dev, unsigned int _data[2]; int ret; - if (insn->n == 0) - return 0; - memset(_data, 0, sizeof(_data)); memset(&_insn, 0, sizeof(_insn)); _insn.insn = INSN_BITS; @@ -627,8 +624,8 @@ static int insn_rw_emulate_bits(struct comedi_device *dev, if (insn->insn == INSN_WRITE) { if (!(s->subdev_flags & SDF_WRITABLE)) return -EINVAL; - _data[0] = 1U << (chan - base_chan); /* mask */ - _data[1] = data[0] ? (1U << (chan - base_chan)) : 0; /* bits */ + _data[0] = 1 << (chan - base_chan); /* mask */ + _data[1] = data[0] ? (1 << (chan - base_chan)) : 0; /* bits */ } ret = s->insn_bits(dev, s, &_insn, _data); @@ -711,7 +708,7 @@ static int __comedi_device_postconfig(struct comedi_device *dev) if (s->type == COMEDI_SUBD_DO) { if (s->n_chan < 32) - s->io_bits = (1U << s->n_chan) - 1; + s->io_bits = (1 << s->n_chan) - 1; else s->io_bits = 0xffffffff; } diff --git a/drivers/comedi/drivers/aio_iiro_16.c b/drivers/comedi/drivers/aio_iiro_16.c index 739cc4db52ac7e9d030b2e7d7d3d057041b79f54..b00fab0b89d4c45c4cddec4954b82302dcb1b42a 100644 --- a/drivers/comedi/drivers/aio_iiro_16.c +++ b/drivers/comedi/drivers/aio_iiro_16.c @@ -177,8 +177,7 @@ static int aio_iiro_16_attach(struct comedi_device *dev, * Digital input change of state interrupts are optionally supported * using IRQ 2-7, 10-12, 14, or 15. */ - if (it->options[1] > 0 && it->options[1] < 16 && - (1 << it->options[1]) & 0xdcfc) { + if ((1 << it->options[1]) & 0xdcfc) { ret = request_irq(it->options[1], aio_iiro_16_cos, 0, dev->board_name, dev); if (ret == 0) diff --git a/drivers/comedi/drivers/comedi_test.c b/drivers/comedi/drivers/comedi_test.c index e713ef611434da34e3f030a76ab5b69b47ffcbf4..05ae9122823f8032bf62d8e7cd1f7570115a04f8 100644 --- a/drivers/comedi/drivers/comedi_test.c +++ b/drivers/comedi/drivers/comedi_test.c @@ -790,7 +790,7 @@ static void waveform_detach(struct comedi_device *dev) { struct waveform_private *devpriv = dev->private; - if (devpriv && dev->n_subdevices) { + if (devpriv) { del_timer_sync(&devpriv->ai_timer); del_timer_sync(&devpriv->ao_timer); } diff --git a/drivers/comedi/drivers/das16m1.c b/drivers/comedi/drivers/das16m1.c index 99e63d51c506c5eadcbb9952c49ab191228975f4..275effb77746b6d58aebdd4300a95577a26924d6 100644 --- a/drivers/comedi/drivers/das16m1.c +++ b/drivers/comedi/drivers/das16m1.c @@ -522,8 +522,7 @@ static int das16m1_attach(struct comedi_device *dev, devpriv->extra_iobase = dev->iobase + DAS16M1_8255_IOBASE; /* only irqs 2, 3, 4, 5, 6, 7, 10, 11, 12, 14, and 15 are valid */ - if (it->options[1] >= 2 && it->options[1] <= 15 && - (1 << it->options[1]) & 0xdcfc) { + if ((1 << it->options[1]) & 0xdcfc) { ret = request_irq(it->options[1], das16m1_interrupt, 0, dev->board_name, dev); if (ret == 0) diff --git a/drivers/comedi/drivers/das6402.c b/drivers/comedi/drivers/das6402.c index e730668236c2682fccd617d1229b2de392ba6113..1af394591e748055bcb33dc89d9b68e15e45557c 100644 --- a/drivers/comedi/drivers/das6402.c +++ b/drivers/comedi/drivers/das6402.c @@ -567,8 +567,7 @@ static int das6402_attach(struct comedi_device *dev, das6402_reset(dev); /* IRQs 2,3,5,6,7, 10,11,15 are valid for "enhanced" mode */ - if (it->options[1] > 0 && it->options[1] < 16 && - (1 << it->options[1]) & 0x8cec) { + if ((1 << it->options[1]) & 0x8cec) { ret = request_irq(it->options[1], das6402_interrupt, 0, dev->board_name, dev); if (ret == 0) { diff --git a/drivers/comedi/drivers/pcl812.c b/drivers/comedi/drivers/pcl812.c index e0459f286fa613c478fe1ed2505028a9111debb0..70dbc129fcf55810a96498a3372cdf63bf113c64 100644 --- a/drivers/comedi/drivers/pcl812.c +++ b/drivers/comedi/drivers/pcl812.c @@ -1149,8 +1149,7 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it) if (!dev->pacer) return -ENOMEM; - if (it->options[1] > 0 && it->options[1] < 16 && - (1 << it->options[1]) & board->irq_bits) { + if ((1 << it->options[1]) & board->irq_bits) { ret = request_irq(it->options[1], pcl812_interrupt, 0, dev->board_name, dev); if (ret == 0) diff --git a/drivers/counter/interrupt-cnt.c b/drivers/counter/interrupt-cnt.c index bc762ba87a19b61daeb61d0c89ab484bbc15b455..229473855c5b38abf9900046d184a32ce6943c5e 100644 --- a/drivers/counter/interrupt-cnt.c +++ b/drivers/counter/interrupt-cnt.c @@ -3,14 +3,12 @@ * Copyright (c) 2021 Pengutronix, Oleksij Rempel */ -#include #include #include #include #include #include #include -#include #include #include @@ -21,7 +19,6 @@ struct interrupt_cnt_priv { struct gpio_desc *gpio; int irq; bool enabled; - struct mutex lock; struct counter_signal signals; struct counter_synapse synapses; struct counter_count cnts; @@ -44,8 +41,6 @@ static int interrupt_cnt_enable_read(struct counter_device *counter, { struct interrupt_cnt_priv *priv = counter_priv(counter); - guard(mutex)(&priv->lock); - *enable = priv->enabled; return 0; @@ -56,8 +51,6 @@ static int interrupt_cnt_enable_write(struct counter_device *counter, { struct interrupt_cnt_priv *priv = counter_priv(counter); - guard(mutex)(&priv->lock); - if (priv->enabled == enable) return 0; @@ -234,8 +227,6 @@ static int interrupt_cnt_probe(struct platform_device *pdev) if (ret) return ret; - mutex_init(&priv->lock); - ret = devm_counter_add(dev, counter); if (ret < 0) return dev_err_probe(dev, ret, "Failed to add counter\n"); diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 0bfced81cc17e1432dfa19af370204a854202e4e..0615e7fa20ad7ea350c784d68fcad57f5f8c5495 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c @@ -659,7 +659,7 @@ static u64 get_max_boost_ratio(unsigned int cpu, u64 *nominal_freq) nominal_perf = perf_caps.nominal_perf; if (nominal_freq) - *nominal_freq = perf_caps.nominal_freq * 1000; + *nominal_freq = perf_caps.nominal_freq; if (!highest_perf || !nominal_perf) { pr_debug("CPU%d: highest or nominal performance missing\n", cpu); diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c index 6ff77003a96eace1ef2c354ebb9d9223d12b62e6..e4989764efe2a8ae23ca1a4c836eacdf7cc514b5 100644 --- a/drivers/cpufreq/scmi-cpufreq.c +++ b/drivers/cpufreq/scmi-cpufreq.c @@ -299,40 +299,6 @@ static struct cpufreq_driver scmi_cpufreq_driver = { .register_em = scmi_cpufreq_register_em, }; -static bool scmi_dev_used_by_cpus(struct device *scmi_dev) -{ - struct device_node *scmi_np = dev_of_node(scmi_dev); - struct device_node *cpu_np, *np; - struct device *cpu_dev; - int cpu, idx; - - if (!scmi_np) - return false; - - for_each_possible_cpu(cpu) { - cpu_dev = get_cpu_device(cpu); - if (!cpu_dev) - continue; - - cpu_np = dev_of_node(cpu_dev); - - np = of_parse_phandle(cpu_np, "clocks", 0); - of_node_put(np); - - if (np == scmi_np) - return true; - - idx = of_property_match_string(cpu_np, "power-domain-names", "perf"); - np = of_parse_phandle(cpu_np, "power-domains", idx); - of_node_put(np); - - if (np == scmi_np) - return true; - } - - return false; -} - static int scmi_cpufreq_probe(struct scmi_device *sdev) { int ret; @@ -341,7 +307,7 @@ static int scmi_cpufreq_probe(struct scmi_device *sdev) handle = sdev->handle; - if (!handle || !scmi_dev_used_by_cpus(dev)) + if (!handle) return -ENODEV; perf_ops = handle->devm_protocol_get(sdev, SCMI_PROTOCOL_PERF, &ph); diff --git a/drivers/cpufreq/tegra186-cpufreq.c b/drivers/cpufreq/tegra186-cpufreq.c index 7b8fcfa55038bc3de512bc1f034ed57b5a486602..4e5b6f9a56d1b2e50dfc82d573e03d3635705f8a 100644 --- a/drivers/cpufreq/tegra186-cpufreq.c +++ b/drivers/cpufreq/tegra186-cpufreq.c @@ -73,11 +73,18 @@ static int tegra186_cpufreq_init(struct cpufreq_policy *policy) { struct tegra186_cpufreq_data *data = cpufreq_get_driver_data(); unsigned int cluster = data->cpus[policy->cpu].bpmp_cluster_id; + u32 cpu; policy->freq_table = data->clusters[cluster].table; policy->cpuinfo.transition_latency = 300 * 1000; policy->driver_data = NULL; + /* set same policy for all cpus in a cluster */ + for (cpu = 0; cpu < ARRAY_SIZE(tegra186_cpus); cpu++) { + if (data->cpus[cpu].bpmp_cluster_id == cluster) + cpumask_set_cpu(cpu, policy->cpus); + } + return 0; } diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c index 70434601f99bed6b280bdf48bd1b8bbe296af314..d2cf9619018b1a63bf7f3b7e5f221113d532a6a7 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c @@ -275,16 +275,13 @@ static int sun8i_ce_cipher_prepare(struct crypto_engine *engine, void *async_req } else { if (nr_sgs > 0) dma_unmap_sg(ce->dev, areq->src, ns, DMA_TO_DEVICE); - - if (nr_sgd > 0) - dma_unmap_sg(ce->dev, areq->dst, nd, DMA_FROM_DEVICE); + dma_unmap_sg(ce->dev, areq->dst, nd, DMA_FROM_DEVICE); } theend_iv: if (areq->iv && ivsize > 0) { - if (!dma_mapping_error(ce->dev, rctx->addr_iv)) + if (rctx->addr_iv) dma_unmap_single(ce->dev, rctx->addr_iv, rctx->ivlen, DMA_TO_DEVICE); - offset = areq->cryptlen - ivsize; if (rctx->op_dir & CE_DECRYPTION) { memcpy(areq->iv, chan->backup_iv, ivsize); diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c index ebc857ed10e11e7c27deb3f3482e860f8e9d4368..d358334e598115649b6cc77b807dedb201eddb1c 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c @@ -343,8 +343,9 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) u32 common; u64 byte_count; __le32 *bf; - void *buf, *result; + void *buf = NULL; int j, i, todo; + void *result = NULL; u64 bs; int digestsize; dma_addr_t addr_res, addr_pad; @@ -364,14 +365,14 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) buf = kzalloc(bs * 2, GFP_KERNEL | GFP_DMA); if (!buf) { err = -ENOMEM; - goto err_out; + goto theend; } bf = (__le32 *)buf; result = kzalloc(digestsize, GFP_KERNEL | GFP_DMA); if (!result) { err = -ENOMEM; - goto err_free_buf; + goto theend; } flow = rctx->flow; @@ -397,7 +398,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) if (nr_sgs <= 0 || nr_sgs > MAX_SG) { dev_err(ce->dev, "Invalid sg number %d\n", nr_sgs); err = -EINVAL; - goto err_free_result; + goto theend; } len = areq->nbytes; @@ -410,7 +411,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) if (len > 0) { dev_err(ce->dev, "remaining len %d\n", len); err = -EINVAL; - goto err_unmap_src; + goto theend; } addr_res = dma_map_single(ce->dev, result, digestsize, DMA_FROM_DEVICE); cet->t_dst[0].addr = cpu_to_le32(addr_res); @@ -418,7 +419,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) if (dma_mapping_error(ce->dev, addr_res)) { dev_err(ce->dev, "DMA map dest\n"); err = -EINVAL; - goto err_unmap_src; + goto theend; } byte_count = areq->nbytes; @@ -440,7 +441,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) } if (!j) { err = -EINVAL; - goto err_unmap_result; + goto theend; } addr_pad = dma_map_single(ce->dev, buf, j * 4, DMA_TO_DEVICE); @@ -449,7 +450,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) if (dma_mapping_error(ce->dev, addr_pad)) { dev_err(ce->dev, "DMA error on padding SG\n"); err = -EINVAL; - goto err_unmap_result; + goto theend; } if (ce->variant->hash_t_dlen_in_bits) @@ -462,25 +463,16 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) err = sun8i_ce_run_task(ce, flow, crypto_ahash_alg_name(tfm)); dma_unmap_single(ce->dev, addr_pad, j * 4, DMA_TO_DEVICE); - -err_unmap_result: - dma_unmap_single(ce->dev, addr_res, digestsize, DMA_FROM_DEVICE); - if (!err) - memcpy(areq->result, result, algt->alg.hash.base.halg.digestsize); - -err_unmap_src: dma_unmap_sg(ce->dev, areq->src, ns, DMA_TO_DEVICE); + dma_unmap_single(ce->dev, addr_res, digestsize, DMA_FROM_DEVICE); -err_free_result: - kfree(result); -err_free_buf: + memcpy(areq->result, result, algt->alg.hash.base.halg.digestsize); +theend: kfree(buf); - -err_out: + kfree(result); local_bh_disable(); crypto_finalize_hash_request(engine, breq, err); local_bh_enable(); - return 0; } diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h index 65cc1278ee1555835afb541715e888cdbdd1bbd0..93d4985def87a79ccd24672b669d5c6f039bc6c2 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h @@ -293,8 +293,8 @@ struct sun8i_ce_hash_tfm_ctx { * @flow: the flow to use for this request */ struct sun8i_ce_hash_reqctx { + struct ahash_request fallback_req; int flow; - struct ahash_request fallback_req; // keep at the end }; /* diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c index 9b18fb46a2c89f5ef1b1c2c6c64d88ba1567c394..7fa359725ec75f9dcfafde528148726adfaa1896 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c @@ -141,7 +141,7 @@ static int sun8i_ss_setup_ivs(struct skcipher_request *areq) /* we need to copy all IVs from source in case DMA is bi-directionnal */ while (sg && len) { - if (sg->length == 0) { + if (sg_dma_len(sg) == 0) { sg = sg_next(sg); continue; } diff --git a/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c b/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c index b68903212b6404d93bd9263f48a115d891b2c6a2..1e748e8ce12d5df17d92d7f921c1ffb16f8598cf 100644 --- a/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c @@ -27,14 +27,12 @@ MODULE_DEVICE_TABLE(pci, adf_pci_tbl); static int adf_probe(struct pci_dev *dev, const struct pci_device_id *ent); static void adf_remove(struct pci_dev *dev); -static void adf_shutdown(struct pci_dev *dev); static struct pci_driver adf_driver = { .id_table = adf_pci_tbl, .name = ADF_DH895XCC_DEVICE_NAME, .probe = adf_probe, .remove = adf_remove, - .shutdown = adf_shutdown, .sriov_configure = adf_sriov_configure, .err_handler = &adf_err_handler, }; @@ -229,13 +227,6 @@ static void adf_remove(struct pci_dev *pdev) kfree(accel_dev); } -static void adf_shutdown(struct pci_dev *pdev) -{ - struct adf_accel_dev *accel_dev = adf_devmgr_pci_to_accel_dev(pdev); - - adf_dev_down(accel_dev, false); -} - static int __init adfdrv_init(void) { request_module("intel_qat"); diff --git a/drivers/crypto/marvell/cesa/cesa.c b/drivers/crypto/marvell/cesa/cesa.c index 76f34b81258dc3c5482f62465a3d3d26dd6bb569..b61e35b932e590d6f62f1631464bf86b553417af 100644 --- a/drivers/crypto/marvell/cesa/cesa.c +++ b/drivers/crypto/marvell/cesa/cesa.c @@ -94,7 +94,7 @@ static int mv_cesa_std_process(struct mv_cesa_engine *engine, u32 status) static int mv_cesa_int_process(struct mv_cesa_engine *engine, u32 status) { - if (engine->chain_hw.first && engine->chain_hw.last) + if (engine->chain.first && engine->chain.last) return mv_cesa_tdma_process(engine, status); return mv_cesa_std_process(engine, status); diff --git a/drivers/crypto/marvell/cesa/cesa.h b/drivers/crypto/marvell/cesa/cesa.h index 50ca1039fdaa7a477ce0ff23c135d20f08caea92..d215a6bed6bc7b8f9abb43937651763d25f6cd6f 100644 --- a/drivers/crypto/marvell/cesa/cesa.h +++ b/drivers/crypto/marvell/cesa/cesa.h @@ -440,10 +440,8 @@ struct mv_cesa_dev { * SRAM * @queue: fifo of the pending crypto requests * @load: engine load counter, useful for load balancing - * @chain_hw: list of the current tdma descriptors being processed - * by the hardware. - * @chain_sw: list of the current tdma descriptors that will be - * submitted to the hardware. + * @chain: list of the current tdma descriptors being processed + * by this engine. * @complete_queue: fifo of the processed requests by the engine * * Structure storing CESA engine information. @@ -465,8 +463,7 @@ struct mv_cesa_engine { struct gen_pool *pool; struct crypto_queue queue; atomic_t load; - struct mv_cesa_tdma_chain chain_hw; - struct mv_cesa_tdma_chain chain_sw; + struct mv_cesa_tdma_chain chain; struct list_head complete_queue; int irq; }; diff --git a/drivers/crypto/marvell/cesa/cipher.c b/drivers/crypto/marvell/cesa/cipher.c index 3876e3ce822f44c5935528d1c483f93749fc2514..0f37dfd42d850954ab214992ccbf19b4c057202b 100644 --- a/drivers/crypto/marvell/cesa/cipher.c +++ b/drivers/crypto/marvell/cesa/cipher.c @@ -459,9 +459,6 @@ static int mv_cesa_skcipher_queue_req(struct skcipher_request *req, struct mv_cesa_skcipher_req *creq = skcipher_request_ctx(req); struct mv_cesa_engine *engine; - if (!req->cryptlen) - return 0; - ret = mv_cesa_skcipher_req_init(req, tmpl); if (ret) return ret; diff --git a/drivers/crypto/marvell/cesa/hash.c b/drivers/crypto/marvell/cesa/hash.c index 6815eddc9068124a6249391d7325ef51ed6c60d9..f150861ceaf6957c12c359dbf6279948ec836f9f 100644 --- a/drivers/crypto/marvell/cesa/hash.c +++ b/drivers/crypto/marvell/cesa/hash.c @@ -663,7 +663,7 @@ static int mv_cesa_ahash_dma_req_init(struct ahash_request *req) if (ret) goto err_free_tdma; - if (iter.base.len > iter.src.op_offset) { + if (iter.src.sg) { /* * Add all the new data, inserting an operation block and * launch command between each full SRAM block-worth of diff --git a/drivers/crypto/marvell/cesa/tdma.c b/drivers/crypto/marvell/cesa/tdma.c index 243305354420c174d369fc5eaabaa5690cfb2812..388a06e180d64a2132ea4f4669f4cea44b882de5 100644 --- a/drivers/crypto/marvell/cesa/tdma.c +++ b/drivers/crypto/marvell/cesa/tdma.c @@ -38,15 +38,6 @@ void mv_cesa_dma_step(struct mv_cesa_req *dreq) { struct mv_cesa_engine *engine = dreq->engine; - spin_lock_bh(&engine->lock); - if (engine->chain_sw.first == dreq->chain.first) { - engine->chain_sw.first = NULL; - engine->chain_sw.last = NULL; - } - engine->chain_hw.first = dreq->chain.first; - engine->chain_hw.last = dreq->chain.last; - spin_unlock_bh(&engine->lock); - writel_relaxed(0, engine->regs + CESA_SA_CFG); mv_cesa_set_int_mask(engine, CESA_SA_INT_ACC0_IDMA_DONE); @@ -105,27 +96,25 @@ void mv_cesa_dma_prepare(struct mv_cesa_req *dreq, void mv_cesa_tdma_chain(struct mv_cesa_engine *engine, struct mv_cesa_req *dreq) { - struct mv_cesa_tdma_desc *last = engine->chain_sw.last; + if (engine->chain.first == NULL && engine->chain.last == NULL) { + engine->chain.first = dreq->chain.first; + engine->chain.last = dreq->chain.last; + } else { + struct mv_cesa_tdma_desc *last; - /* - * Break the DMA chain if the request being queued needs the IV - * regs to be set before lauching the request. - */ - if (!last || dreq->chain.first->flags & CESA_TDMA_SET_STATE) - engine->chain_sw.first = dreq->chain.first; - else { + last = engine->chain.last; last->next = dreq->chain.first; - last->next_dma = cpu_to_le32(dreq->chain.first->cur_dma); - } - last = dreq->chain.last; - engine->chain_sw.last = last; - /* - * Break the DMA chain if the CESA_TDMA_BREAK_CHAIN is set on - * the last element of the current chain. - */ - if (last->flags & CESA_TDMA_BREAK_CHAIN) { - engine->chain_sw.first = NULL; - engine->chain_sw.last = NULL; + engine->chain.last = dreq->chain.last; + + /* + * Break the DMA chain if the CESA_TDMA_BREAK_CHAIN is set on + * the last element of the current chain, or if the request + * being queued needs the IV regs to be set before lauching + * the request. + */ + if (!(last->flags & CESA_TDMA_BREAK_CHAIN) && + !(dreq->chain.first->flags & CESA_TDMA_SET_STATE)) + last->next_dma = cpu_to_le32(dreq->chain.first->cur_dma); } } @@ -138,7 +127,7 @@ int mv_cesa_tdma_process(struct mv_cesa_engine *engine, u32 status) tdma_cur = readl(engine->regs + CESA_TDMA_CUR); - for (tdma = engine->chain_hw.first; tdma; tdma = next) { + for (tdma = engine->chain.first; tdma; tdma = next) { spin_lock_bh(&engine->lock); next = tdma->next; spin_unlock_bh(&engine->lock); @@ -160,12 +149,12 @@ int mv_cesa_tdma_process(struct mv_cesa_engine *engine, u32 status) &backlog); /* Re-chaining to the next request */ - engine->chain_hw.first = tdma->next; + engine->chain.first = tdma->next; tdma->next = NULL; /* If this is the last request, clear the chain */ - if (engine->chain_hw.first == NULL) - engine->chain_hw.last = NULL; + if (engine->chain.first == NULL) + engine->chain.last = NULL; spin_unlock_bh(&engine->lock); ctx = crypto_tfm_ctx(req->tfm); diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 1728cae1e8409f6c025759173c52de424a57b75a..d7f7f88009d7dbdc18cddd9e0e82b6a967041003 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -1653,13 +1653,6 @@ static int find_pos_and_ways(struct cxl_port *port, struct range *range, } put_device(dev); - if (rc) - dev_err(port->uport_dev, - "failed to find %s:%s in target list of %s\n", - dev_name(&port->dev), - dev_name(port->parent_dport->dport_dev), - dev_name(&cxlsd->cxld.dev)); - return rc; } diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c index 8f3fa149a76d9b51d6c748930b45c5c18c2569fa..9093f751f1336ac4cff9a1692f96502f8232ffdb 100644 --- a/drivers/dma-buf/dma-resv.c +++ b/drivers/dma-buf/dma-resv.c @@ -678,13 +678,11 @@ long dma_resv_wait_timeout(struct dma_resv *obj, enum dma_resv_usage usage, dma_resv_iter_begin(&cursor, obj, usage); dma_resv_for_each_fence_unlocked(&cursor, fence) { - ret = dma_fence_wait_timeout(fence, intr, timeout); - if (ret <= 0) - break; - - /* Even for zero timeout the return value is 1 */ - if (timeout) - timeout = ret; + ret = dma_fence_wait_timeout(fence, intr, ret); + if (ret <= 0) { + dma_resv_iter_end(&cursor); + return ret; + } } dma_resv_iter_end(&cursor); diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index 980975ffc55d3c755568f814f702a38cac235a4f..373282beeb606836d141e12bcf81effdf7d13705 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -161,7 +161,8 @@ static int begin_cpu_udmabuf(struct dma_buf *buf, ubuf->sg = NULL; } } else { - dma_sync_sgtable_for_cpu(dev, ubuf->sg, direction); + dma_sync_sg_for_cpu(dev, ubuf->sg->sgl, ubuf->sg->nents, + direction); } return ret; @@ -176,7 +177,7 @@ static int end_cpu_udmabuf(struct dma_buf *buf, if (!ubuf->sg) return -EINVAL; - dma_sync_sgtable_for_device(dev, ubuf->sg, direction); + dma_sync_sg_for_device(dev, ubuf->sg->sgl, ubuf->sg->nents, direction); return 0; } diff --git a/drivers/dma/fsl-edma-main.c b/drivers/dma/fsl-edma-main.c index eccbcf67951fbea3c4ad2877446ab72c4d4074d1..cc9923ab686dcd2b75c5e7c67cea337df8f4b2e6 100644 --- a/drivers/dma/fsl-edma-main.c +++ b/drivers/dma/fsl-edma-main.c @@ -58,7 +58,7 @@ static irqreturn_t fsl_edma3_tx_handler(int irq, void *dev_id) intr = edma_readl_chreg(fsl_chan, ch_int); if (!intr) - return IRQ_NONE; + return IRQ_HANDLED; edma_writel_chreg(fsl_chan, 1, ch_int); diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c index aa39fcd389a94267c244b0fa49d5b2274be07bc8..c18633ad8455fa0ac4ba0b070ec7c7a2a9c17ed3 100644 --- a/drivers/dma/idxd/cdev.c +++ b/drivers/dma/idxd/cdev.c @@ -225,7 +225,7 @@ static int idxd_cdev_open(struct inode *inode, struct file *filp) struct idxd_wq *wq; struct device *dev, *fdev; int rc = 0; - struct iommu_sva *sva = NULL; + struct iommu_sva *sva; unsigned int pasid; struct idxd_cdev *idxd_cdev; @@ -322,7 +322,7 @@ static int idxd_cdev_open(struct inode *inode, struct file *filp) if (device_user_pasid_enabled(idxd)) idxd_xa_pasid_remove(ctx); failed_get_pasid: - if (device_user_pasid_enabled(idxd) && !IS_ERR_OR_NULL(sva)) + if (device_user_pasid_enabled(idxd)) iommu_sva_unbind_device(sva); failed: mutex_unlock(&wq->wq_lock); @@ -354,9 +354,7 @@ static void idxd_cdev_evl_drain_pasid(struct idxd_wq *wq, u32 pasid) set_bit(h, evl->bmap); h = (h + 1) % size; } - if (wq->wq) - drain_workqueue(wq->wq); - + drain_workqueue(wq->wq); mutex_unlock(&evl->lock); } @@ -414,9 +412,6 @@ static int idxd_cdev_mmap(struct file *filp, struct vm_area_struct *vma) if (!idxd->user_submission_safe && !capable(CAP_SYS_RAWIO)) return -EPERM; - if (current->mm != ctx->mm) - return -EPERM; - rc = check_vma(wq, vma, __func__); if (rc < 0) return rc; @@ -483,9 +478,6 @@ static ssize_t idxd_cdev_write(struct file *filp, const char __user *buf, size_t ssize_t written = 0; int i; - if (current->mm != ctx->mm) - return -EPERM; - for (i = 0; i < len/sizeof(struct dsa_hw_desc); i++) { int rc = idxd_submit_user_descriptor(ctx, udesc + i); @@ -506,9 +498,6 @@ static __poll_t idxd_cdev_poll(struct file *filp, struct idxd_device *idxd = wq->idxd; __poll_t out = 0; - if (current->mm != ctx->mm) - return POLLNVAL; - poll_wait(filp, &wq->err_queue, wait); spin_lock(&idxd->dev_lock); if (idxd->sw_err.valid) @@ -595,7 +584,6 @@ void idxd_wq_del_cdev(struct idxd_wq *wq) static int idxd_user_drv_probe(struct idxd_dev *idxd_dev) { - struct device *dev = &idxd_dev->conf_dev; struct idxd_wq *wq = idxd_dev_to_wq(idxd_dev); struct idxd_device *idxd = wq->idxd; int rc; @@ -623,12 +611,6 @@ static int idxd_user_drv_probe(struct idxd_dev *idxd_dev) mutex_lock(&wq->wq_lock); - if (!idxd_wq_driver_name_match(wq, dev)) { - idxd->cmd_status = IDXD_SCMD_WQ_NO_DRV_NAME; - rc = -ENODEV; - goto wq_err; - } - wq->wq = create_workqueue(dev_name(wq_confdev(wq))); if (!wq->wq) { rc = -ENOMEM; diff --git a/drivers/dma/idxd/dma.c b/drivers/dma/idxd/dma.c index 47a01893cfdbf9667ae62d9cbe934350135b8285..07623fb0f52fc2bb160224ecf5d0dc0e625e2b00 100644 --- a/drivers/dma/idxd/dma.c +++ b/drivers/dma/idxd/dma.c @@ -306,12 +306,6 @@ static int idxd_dmaengine_drv_probe(struct idxd_dev *idxd_dev) return -ENXIO; mutex_lock(&wq->wq_lock); - if (!idxd_wq_driver_name_match(wq, dev)) { - idxd->cmd_status = IDXD_SCMD_WQ_NO_DRV_NAME; - rc = -ENODEV; - goto err; - } - wq->type = IDXD_WQT_KERNEL; rc = drv_enable_wq(wq); diff --git a/drivers/dma/idxd/idxd.h b/drivers/dma/idxd/idxd.h index fcbb8caea89952e2e9467f61d1d14ee52e126c22..bea10c5cdb76bb59cc47da6e65be76f03e644a79 100644 --- a/drivers/dma/idxd/idxd.h +++ b/drivers/dma/idxd/idxd.h @@ -159,8 +159,6 @@ struct idxd_cdev { int minor; }; -#define DRIVER_NAME_SIZE 128 - #define IDXD_ALLOCATED_BATCH_SIZE 128U #define WQ_NAME_SIZE 1024 #define WQ_TYPE_SIZE 10 @@ -229,8 +227,6 @@ struct idxd_wq { /* Lock to protect upasid_xa access. */ struct mutex uc_lock; struct xarray upasid_xa; - - char driver_name[DRIVER_NAME_SIZE + 1]; }; struct idxd_engine { @@ -652,11 +648,6 @@ static inline void idxd_wqcfg_set_max_batch_shift(int idxd_type, union wqcfg *wq wqcfg->max_batch_shift = max_batch_shift; } -static inline int idxd_wq_driver_name_match(struct idxd_wq *wq, struct device *dev) -{ - return (strncmp(wq->driver_name, dev->driver->name, strlen(dev->driver->name)) == 0); -} - int __must_check __idxd_driver_register(struct idxd_device_driver *idxd_drv, struct module *module, const char *mod_name); #define idxd_driver_register(driver) \ diff --git a/drivers/dma/idxd/sysfs.c b/drivers/dma/idxd/sysfs.c index 3a5ce477a81ad681b6319a63192794b515748cc3..1fd5a93045f79efeff0e1a07b8c770aa4d3ec3ac 100644 --- a/drivers/dma/idxd/sysfs.c +++ b/drivers/dma/idxd/sysfs.c @@ -1282,39 +1282,6 @@ static ssize_t wq_op_config_store(struct device *dev, struct device_attribute *a static struct device_attribute dev_attr_wq_op_config = __ATTR(op_config, 0644, wq_op_config_show, wq_op_config_store); -static ssize_t wq_driver_name_show(struct device *dev, struct device_attribute *attr, char *buf) -{ - struct idxd_wq *wq = confdev_to_wq(dev); - - return sysfs_emit(buf, "%s\n", wq->driver_name); -} - -static ssize_t wq_driver_name_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - struct idxd_wq *wq = confdev_to_wq(dev); - char *input, *pos; - - if (wq->state != IDXD_WQ_DISABLED) - return -EPERM; - - if (strlen(buf) > DRIVER_NAME_SIZE || strlen(buf) == 0) - return -EINVAL; - - input = kstrndup(buf, count, GFP_KERNEL); - if (!input) - return -ENOMEM; - - pos = strim(input); - memset(wq->driver_name, 0, DRIVER_NAME_SIZE + 1); - sprintf(wq->driver_name, "%s", pos); - kfree(input); - return count; -} - -static struct device_attribute dev_attr_wq_driver_name = - __ATTR(driver_name, 0644, wq_driver_name_show, wq_driver_name_store); - static struct attribute *idxd_wq_attributes[] = { &dev_attr_wq_clients.attr, &dev_attr_wq_state.attr, @@ -1334,7 +1301,6 @@ static struct attribute *idxd_wq_attributes[] = { &dev_attr_wq_occupancy.attr, &dev_attr_wq_enqcmds_retries.attr, &dev_attr_wq_op_config.attr, - &dev_attr_wq_driver_name.attr, NULL, }; diff --git a/drivers/dma/nbpfaxi.c b/drivers/dma/nbpfaxi.c index a361f8c29cd38d859c4c222e62fc95460c844a54..0b2f96fd8bf0c607bb08a7bb1dafb191bf11b4df 100644 --- a/drivers/dma/nbpfaxi.c +++ b/drivers/dma/nbpfaxi.c @@ -1351,7 +1351,7 @@ static int nbpf_probe(struct platform_device *pdev) if (irqs == 1) { eirq = irqbuf[0]; - for (i = 0; i < num_channels; i++) + for (i = 0; i <= num_channels; i++) nbpf->chan[i].irq = irqbuf[0]; } else { eirq = platform_get_irq_byname(pdev, "error"); @@ -1361,15 +1361,16 @@ static int nbpf_probe(struct platform_device *pdev) if (irqs == num_channels + 1) { struct nbpf_channel *chan; - for (i = 0, chan = nbpf->chan; i < num_channels; + for (i = 0, chan = nbpf->chan; i <= num_channels; i++, chan++) { /* Skip the error IRQ */ if (irqbuf[i] == eirq) i++; - if (i >= ARRAY_SIZE(irqbuf)) - return -EINVAL; chan->irq = irqbuf[i]; } + + if (chan != nbpf->chan + num_channels) + return -EINVAL; } else { /* 2 IRQs and more than one channel */ if (irqbuf[0] == eirq) @@ -1377,7 +1378,7 @@ static int nbpf_probe(struct platform_device *pdev) else irq = irqbuf[0]; - for (i = 0; i < num_channels; i++) + for (i = 0; i <= num_channels; i++) nbpf->chan[i].irq = irq; } } diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c index d99cf81358c54e566483d1548885ba494346a8b3..418e1774af1e5e5b175962bfbdd7a28fdd0570ea 100644 --- a/drivers/dma/ti/k3-udma.c +++ b/drivers/dma/ti/k3-udma.c @@ -5537,8 +5537,7 @@ static int udma_probe(struct platform_device *pdev) uc->config.dir = DMA_MEM_TO_MEM; uc->name = devm_kasprintf(dev, GFP_KERNEL, "%s chan%d", dev_name(dev), i); - if (!uc->name) - return -ENOMEM; + vchan_init(&uc->vc, &ud->ddev); /* Use custom vchan completion handling */ tasklet_setup(&uc->vc.task, udma_vchan_complete); diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c index 14c4c5031b556f2eddf7f8efc779f6fc3e157451..0a3b2e22f23dbbf339f8ca28b32b6e57942abc78 100644 --- a/drivers/dma/xilinx/xilinx_dma.c +++ b/drivers/dma/xilinx/xilinx_dma.c @@ -2900,8 +2900,6 @@ static int xilinx_dma_chan_probe(struct xilinx_dma_device *xdev, return -EINVAL; } - xdev->common.directions |= chan->direction; - /* Request the interrupt */ chan->irq = of_irq_get(node, chan->tdest); if (chan->irq < 0) diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c index 54ec894150939a6d19a66029694d9203af7e6b04..e04fd1a7e9aaead3c0d38a91f04822972fe2a7d2 100644 --- a/drivers/edac/altera_edac.c +++ b/drivers/edac/altera_edac.c @@ -1756,9 +1756,9 @@ altr_edac_a10_device_trig(struct file *file, const char __user *user_buf, local_irq_save(flags); if (trig_type == ALTR_UE_TRIGGER_CHAR) - writew(priv->ue_set_mask, set_addr); + writel(priv->ue_set_mask, set_addr); else - writew(priv->ce_set_mask, set_addr); + writel(priv->ce_set_mask, set_addr); /* Ensure the interrupt test bits are set */ wmb(); @@ -1788,7 +1788,7 @@ altr_edac_a10_device_trig2(struct file *file, const char __user *user_buf, local_irq_save(flags); if (trig_type == ALTR_UE_TRIGGER_CHAR) { - writew(priv->ue_set_mask, set_addr); + writel(priv->ue_set_mask, set_addr); } else { /* Setup read/write of 4 bytes */ writel(ECC_WORD_WRITE, drvdata->base + ECC_BLK_DBYTECTRL_OFST); diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index a8db2bde638401d7924d6492da750a0377279dac..9cd86390a16747e311a9349b341b3e513205ebf7 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -1475,9 +1475,7 @@ static int umc_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt) if (csrow_enabled(2 * dimm + 1, ctrl, pvt)) cs_mode |= CS_ODD_PRIMARY; - if (csrow_sec_enabled(2 * dimm, ctrl, pvt)) - cs_mode |= CS_EVEN_SECONDARY; - + /* Asymmetric dual-rank DIMM support. */ if (csrow_sec_enabled(2 * dimm + 1, ctrl, pvt)) cs_mode |= CS_ODD_SECONDARY; @@ -1498,13 +1496,12 @@ static int umc_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt) return cs_mode; } -static int calculate_cs_size(u32 mask, unsigned int cs_mode) +static int __addr_mask_to_cs_size(u32 addr_mask_orig, unsigned int cs_mode, + int csrow_nr, int dimm) { - int msb, weight, num_zero_bits; - u32 deinterleaved_mask; - - if (!mask) - return 0; + u32 msb, weight, num_zero_bits; + u32 addr_mask_deinterleaved; + int size = 0; /* * The number of zero bits in the mask is equal to the number of bits @@ -1517,30 +1514,19 @@ static int calculate_cs_size(u32 mask, unsigned int cs_mode) * without swapping with the most significant bit. This can be handled * by keeping the MSB where it is and ignoring the single zero bit. */ - msb = fls(mask) - 1; - weight = hweight_long(mask); + msb = fls(addr_mask_orig) - 1; + weight = hweight_long(addr_mask_orig); num_zero_bits = msb - weight - !!(cs_mode & CS_3R_INTERLEAVE); /* Take the number of zero bits off from the top of the mask. */ - deinterleaved_mask = GENMASK(msb - num_zero_bits, 1); - edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", deinterleaved_mask); - - return (deinterleaved_mask >> 2) + 1; -} - -static int __addr_mask_to_cs_size(u32 addr_mask, u32 addr_mask_sec, - unsigned int cs_mode, int csrow_nr, int dimm) -{ - int size; + addr_mask_deinterleaved = GENMASK_ULL(msb - num_zero_bits, 1); edac_dbg(1, "CS%d DIMM%d AddrMasks:\n", csrow_nr, dimm); - edac_dbg(1, " Primary AddrMask: 0x%x\n", addr_mask); + edac_dbg(1, " Original AddrMask: 0x%x\n", addr_mask_orig); + edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", addr_mask_deinterleaved); /* Register [31:1] = Address [39:9]. Size is in kBs here. */ - size = calculate_cs_size(addr_mask, cs_mode); - - edac_dbg(1, " Secondary AddrMask: 0x%x\n", addr_mask_sec); - size += calculate_cs_size(addr_mask_sec, cs_mode); + size = (addr_mask_deinterleaved >> 2) + 1; /* Return size in MBs. */ return size >> 10; @@ -1549,8 +1535,8 @@ static int __addr_mask_to_cs_size(u32 addr_mask, u32 addr_mask_sec, static int umc_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc, unsigned int cs_mode, int csrow_nr) { - u32 addr_mask = 0, addr_mask_sec = 0; int cs_mask_nr = csrow_nr; + u32 addr_mask_orig; int dimm, size = 0; /* No Chip Selects are enabled. */ @@ -1588,13 +1574,13 @@ static int umc_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc, if (!pvt->flags.zn_regs_v2) cs_mask_nr >>= 1; - if (cs_mode & (CS_EVEN_PRIMARY | CS_ODD_PRIMARY)) - addr_mask = pvt->csels[umc].csmasks[cs_mask_nr]; - - if (cs_mode & (CS_EVEN_SECONDARY | CS_ODD_SECONDARY)) - addr_mask_sec = pvt->csels[umc].csmasks_sec[cs_mask_nr]; + /* Asymmetric dual-rank DIMM support. */ + if ((csrow_nr & 1) && (cs_mode & CS_ODD_SECONDARY)) + addr_mask_orig = pvt->csels[umc].csmasks_sec[cs_mask_nr]; + else + addr_mask_orig = pvt->csels[umc].csmasks[cs_mask_nr]; - return __addr_mask_to_cs_size(addr_mask, addr_mask_sec, cs_mode, csrow_nr, dimm); + return __addr_mask_to_cs_size(addr_mask_orig, cs_mode, csrow_nr, dimm); } static void umc_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl) @@ -3787,10 +3773,9 @@ static void gpu_get_err_info(struct mce *m, struct err_info *err) static int gpu_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc, unsigned int cs_mode, int csrow_nr) { - u32 addr_mask = pvt->csels[umc].csmasks[csrow_nr]; - u32 addr_mask_sec = pvt->csels[umc].csmasks_sec[csrow_nr]; + u32 addr_mask_orig = pvt->csels[umc].csmasks[csrow_nr]; - return __addr_mask_to_cs_size(addr_mask, addr_mask_sec, cs_mode, csrow_nr, csrow_nr >> 1); + return __addr_mask_to_cs_size(addr_mask_orig, cs_mode, csrow_nr, csrow_nr >> 1); } static void gpu_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl) @@ -4145,7 +4130,6 @@ static int per_family_init(struct amd64_pvt *pvt) break; case 0x70 ... 0x7f: pvt->ctl_name = "F19h_M70h"; - pvt->max_mcs = 4; pvt->flags.zn_regs_v2 = 1; break; case 0xa0 ... 0xaf: diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c index 068597e8fce95aa815c2931f90697ce309e601c6..67a46abe07da9e017f552d3af65ba6f8c1411587 100644 --- a/drivers/edac/i10nm_base.c +++ b/drivers/edac/i10nm_base.c @@ -99,7 +99,7 @@ static u32 offsets_demand2_spr[] = {0x22c70, 0x22d80, 0x22f18, 0x22d58, 0x22c64, static u32 offsets_demand_spr_hbm0[] = {0x2a54, 0x2a60, 0x2b10, 0x2a58, 0x2a5c, 0x0ee0}; static u32 offsets_demand_spr_hbm1[] = {0x2e54, 0x2e60, 0x2f10, 0x2e58, 0x2e5c, 0x0fb0}; -static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable, u32 *rrl_ctl, +static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable, u32 *offsets_scrub, u32 *offsets_demand, u32 *offsets_demand2) { @@ -112,10 +112,10 @@ static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable if (enable) { /* Save default configurations */ - rrl_ctl[0] = s; - rrl_ctl[1] = d; + imc->chan[chan].retry_rd_err_log_s = s; + imc->chan[chan].retry_rd_err_log_d = d; if (offsets_demand2) - rrl_ctl[2] = d2; + imc->chan[chan].retry_rd_err_log_d2 = d2; s &= ~RETRY_RD_ERR_LOG_NOOVER_UC; s |= RETRY_RD_ERR_LOG_EN; @@ -129,25 +129,25 @@ static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable } } else { /* Restore default configurations */ - if (rrl_ctl[0] & RETRY_RD_ERR_LOG_UC) + if (imc->chan[chan].retry_rd_err_log_s & RETRY_RD_ERR_LOG_UC) s |= RETRY_RD_ERR_LOG_UC; - if (rrl_ctl[0] & RETRY_RD_ERR_LOG_NOOVER) + if (imc->chan[chan].retry_rd_err_log_s & RETRY_RD_ERR_LOG_NOOVER) s |= RETRY_RD_ERR_LOG_NOOVER; - if (!(rrl_ctl[0] & RETRY_RD_ERR_LOG_EN)) + if (!(imc->chan[chan].retry_rd_err_log_s & RETRY_RD_ERR_LOG_EN)) s &= ~RETRY_RD_ERR_LOG_EN; - if (rrl_ctl[1] & RETRY_RD_ERR_LOG_UC) + if (imc->chan[chan].retry_rd_err_log_d & RETRY_RD_ERR_LOG_UC) d |= RETRY_RD_ERR_LOG_UC; - if (rrl_ctl[1] & RETRY_RD_ERR_LOG_NOOVER) + if (imc->chan[chan].retry_rd_err_log_d & RETRY_RD_ERR_LOG_NOOVER) d |= RETRY_RD_ERR_LOG_NOOVER; - if (!(rrl_ctl[1] & RETRY_RD_ERR_LOG_EN)) + if (!(imc->chan[chan].retry_rd_err_log_d & RETRY_RD_ERR_LOG_EN)) d &= ~RETRY_RD_ERR_LOG_EN; if (offsets_demand2) { - if (rrl_ctl[2] & RETRY_RD_ERR_LOG_UC) + if (imc->chan[chan].retry_rd_err_log_d2 & RETRY_RD_ERR_LOG_UC) d2 |= RETRY_RD_ERR_LOG_UC; - if (!(rrl_ctl[2] & RETRY_RD_ERR_LOG_NOOVER)) + if (!(imc->chan[chan].retry_rd_err_log_d2 & RETRY_RD_ERR_LOG_NOOVER)) d2 &= ~RETRY_RD_ERR_LOG_NOOVER; - if (!(rrl_ctl[2] & RETRY_RD_ERR_LOG_EN)) + if (!(imc->chan[chan].retry_rd_err_log_d2 & RETRY_RD_ERR_LOG_EN)) d2 &= ~RETRY_RD_ERR_LOG_EN; } } @@ -161,7 +161,6 @@ static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable static void enable_retry_rd_err_log(bool enable) { int i, j, imc_num, chan_num; - struct skx_channel *chan; struct skx_imc *imc; struct skx_dev *d; @@ -176,9 +175,8 @@ static void enable_retry_rd_err_log(bool enable) if (!imc->mbase) continue; - chan = d->imc[i].chan; for (j = 0; j < chan_num; j++) - __enable_retry_rd_err_log(imc, j, enable, chan[j].rrl_ctl[0], + __enable_retry_rd_err_log(imc, j, enable, res_cfg->offsets_scrub, res_cfg->offsets_demand, res_cfg->offsets_demand2); @@ -192,13 +190,12 @@ static void enable_retry_rd_err_log(bool enable) if (!imc->mbase || !imc->hbm_mc) continue; - chan = d->imc[i].chan; for (j = 0; j < chan_num; j++) { - __enable_retry_rd_err_log(imc, j, enable, chan[j].rrl_ctl[0], + __enable_retry_rd_err_log(imc, j, enable, res_cfg->offsets_scrub_hbm0, res_cfg->offsets_demand_hbm0, NULL); - __enable_retry_rd_err_log(imc, j, enable, chan[j].rrl_ctl[1], + __enable_retry_rd_err_log(imc, j, enable, res_cfg->offsets_scrub_hbm1, res_cfg->offsets_demand_hbm1, NULL); diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c index 9e43aed72bd9fa176eab04d5cc4f96afbd170000..d47f0055217e43c71a44a0a823b83ccf3fdd29f1 100644 --- a/drivers/edac/skx_common.c +++ b/drivers/edac/skx_common.c @@ -115,7 +115,6 @@ EXPORT_SYMBOL_GPL(skx_adxl_get); void skx_adxl_put(void) { - adxl_component_count = 0; kfree(adxl_values); kfree(adxl_msg); } diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h index 2ea4d1d1fbef2616f34195776c6cd1510fa638b2..5acfef8fd3d3623723515e79bbecce0e297d2f47 100644 --- a/drivers/edac/skx_common.h +++ b/drivers/edac/skx_common.h @@ -80,9 +80,6 @@ */ #define MCACOD_EXT_MEM_ERR 0x280 -/* Max RRL register sets per {,sub-,pseudo-}channel. */ -#define NUM_RRL_SET 3 - /* * Each cpu socket contains some pci devices that provide global * information, and also some that are local to each of the two @@ -121,11 +118,9 @@ struct skx_dev { struct skx_channel { struct pci_dev *cdev; struct pci_dev *edev; - /* - * Two groups of RRL control registers per channel to save default RRL - * settings of two {sub-,pseudo-}channels in Linux RRL control mode. - */ - u32 rrl_ctl[2][NUM_RRL_SET]; + u32 retry_rd_err_log_s; + u32 retry_rd_err_log_d; + u32 retry_rd_err_log_d2; struct skx_dimm { u8 close_pg; u8 bank_xor_enable; diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index 8ecffdce94b1668e63d3751b93d1a5fe9ab6f554..3f2f22e47bfa1a3aadb8d6331e86980778d61286 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -40,6 +40,7 @@ config ARM_SCPI_POWER_DOMAIN config ARM_SDE_INTERFACE bool "ARM Software Delegated Exception Interface (SDEI)" depends on ARM64 + depends on ACPI_APEI_GHES help The Software Delegated Exception Interface (SDEI) is an ARM standard for registering callbacks from the platform firmware diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c index e1b949aedf9e088a3b5e4610ba4517fc7a54b3d0..51eeaf14367dacf456d2755d8a6dd49d925d84e3 100644 --- a/drivers/firmware/arm_scmi/bus.c +++ b/drivers/firmware/arm_scmi/bus.c @@ -42,7 +42,7 @@ static atomic_t scmi_syspower_registered = ATOMIC_INIT(0); * This helper let an SCMI driver request specific devices identified by the * @id_table to be created for each active SCMI instance. * - * The requested device name MUST NOT be already existent for this protocol; + * The requested device name MUST NOT be already existent for any protocol; * at first the freshly requested @id_table is annotated in the IDR table * @scmi_requested_devices and then the requested device is advertised to any * registered party via the @scmi_requested_devices_nh notification chain. @@ -52,6 +52,7 @@ static atomic_t scmi_syspower_registered = ATOMIC_INIT(0); static int scmi_protocol_device_request(const struct scmi_device_id *id_table) { int ret = 0; + unsigned int id = 0; struct list_head *head, *phead = NULL; struct scmi_requested_dev *rdev; @@ -66,13 +67,19 @@ static int scmi_protocol_device_request(const struct scmi_device_id *id_table) } /* - * Find the matching protocol rdev list and then search of any - * existent equally named device...fails if any duplicate found. + * Search for the matching protocol rdev list and then search + * of any existent equally named device...fails if any duplicate found. */ mutex_lock(&scmi_requested_devices_mtx); - phead = idr_find(&scmi_requested_devices, id_table->protocol_id); - if (phead) { - head = phead; + idr_for_each_entry(&scmi_requested_devices, head, id) { + if (!phead) { + /* A list found registered in the IDR is never empty */ + rdev = list_first_entry(head, struct scmi_requested_dev, + node); + if (rdev->id_table->protocol_id == + id_table->protocol_id) + phead = head; + } list_for_each_entry(rdev, head, node) { if (!strcmp(rdev->id_table->name, id_table->name)) { pr_err("Ignoring duplicate request [%d] %s\n", diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c index d1fd2e492909e577c813dc6080234c4edb91c521..65d1e66a347d755ec02dfa51d2aaa32334e4329a 100644 --- a/drivers/firmware/arm_scmi/driver.c +++ b/drivers/firmware/arm_scmi/driver.c @@ -1547,39 +1547,6 @@ static int scmi_common_extended_name_get(const struct scmi_protocol_handle *ph, return ret; } -/** - * scmi_protocol_msg_check - Check protocol message attributes - * - * @ph: A reference to the protocol handle. - * @message_id: The ID of the message to check. - * @attributes: A parameter to optionally return the retrieved message - * attributes, in case of Success. - * - * An helper to check protocol message attributes for a specific protocol - * and message pair. - * - * Return: 0 on SUCCESS - */ -static int scmi_protocol_msg_check(const struct scmi_protocol_handle *ph, - u32 message_id, u32 *attributes) -{ - int ret; - struct scmi_xfer *t; - - ret = xfer_get_init(ph, PROTOCOL_MESSAGE_ATTRIBUTES, - sizeof(__le32), 0, &t); - if (ret) - return ret; - - put_unaligned_le32(message_id, t->tx.buf); - ret = do_xfer(ph, t); - if (!ret && attributes) - *attributes = get_unaligned_le32(t->rx.buf); - xfer_put(ph, t); - - return ret; -} - /** * struct scmi_iterator - Iterator descriptor * @msg: A reference to the message TX buffer; filled by @prepare_message with @@ -1721,7 +1688,6 @@ scmi_common_fastchannel_init(const struct scmi_protocol_handle *ph, int ret; u32 flags; u64 phys_addr; - u32 attributes; u8 size; void __iomem *addr; struct scmi_xfer *t; @@ -1730,15 +1696,6 @@ scmi_common_fastchannel_init(const struct scmi_protocol_handle *ph, struct scmi_msg_resp_desc_fc *resp; const struct scmi_protocol_instance *pi = ph_to_pi(ph); - /* Check if the MSG_ID supports fastchannel */ - ret = scmi_protocol_msg_check(ph, message_id, &attributes); - if (ret || !MSG_SUPPORTS_FASTCHANNEL(attributes)) { - dev_dbg(ph->dev, - "Skip FC init for 0x%02X/%d domain:%d - ret:%d\n", - pi->proto->id, message_id, domain, ret); - return; - } - if (!p_addr) { ret = -EINVAL; goto err_out; @@ -1867,7 +1824,6 @@ static const struct scmi_proto_helpers_ops helpers_ops = { .extended_name_get = scmi_common_extended_name_get, .iter_response_init = scmi_iterator_init, .iter_response_run = scmi_iterator_run, - .protocol_msg_check = scmi_protocol_msg_check, .fastchannel_init = scmi_common_fastchannel_init, .fastchannel_db_ring = scmi_common_fastchannel_db_ring, }; diff --git a/drivers/firmware/arm_scmi/protocols.h b/drivers/firmware/arm_scmi/protocols.h index 095b14a2d0a3f607f172994167f0fdb2db570e76..78e1a01eb656e31266f09c179eea547559358ab9 100644 --- a/drivers/firmware/arm_scmi/protocols.h +++ b/drivers/firmware/arm_scmi/protocols.h @@ -29,8 +29,6 @@ #define PROTOCOL_REV_MAJOR(x) ((u16)(FIELD_GET(PROTOCOL_REV_MAJOR_MASK, (x)))) #define PROTOCOL_REV_MINOR(x) ((u16)(FIELD_GET(PROTOCOL_REV_MINOR_MASK, (x)))) -#define MSG_SUPPORTS_FASTCHANNEL(x) ((x) & BIT(0)) - enum scmi_common_cmd { PROTOCOL_VERSION = 0x0, PROTOCOL_ATTRIBUTES = 0x1, @@ -252,8 +250,6 @@ struct scmi_fc_info { * provided in @ops. * @iter_response_run: A common helper to trigger the run of a previously * initialized iterator. - * @protocol_msg_check: A common helper to check is a specific protocol message - * is supported. * @fastchannel_init: A common helper used to initialize FC descriptors by * gathering FC descriptions from the SCMI platform server. * @fastchannel_db_ring: A common helper to ring a FC doorbell. @@ -266,8 +262,6 @@ struct scmi_proto_helpers_ops { unsigned int max_resources, u8 msg_id, size_t tx_size, void *priv); int (*iter_response_run)(void *iter); - int (*protocol_msg_check)(const struct scmi_protocol_handle *ph, - u32 message_id, u32 *attributes); void (*fastchannel_init)(const struct scmi_protocol_handle *ph, u8 describe_id, u32 message_id, u32 valid_size, u32 domain, diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index 71e2a9a89f6adabf2848f61bfdcfcbb908f2a732..3e8051fe829657294cbb29c49c2b3848f98a990f 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -1062,12 +1062,13 @@ static bool __init sdei_present_acpi(void) return true; } -void __init acpi_sdei_init(void) +void __init sdei_init(void) { struct platform_device *pdev; int ret; - if (!sdei_present_acpi()) + ret = platform_driver_register(&sdei_driver); + if (ret || !sdei_present_acpi()) return; pdev = platform_device_register_simple(sdei_driver.driver.name, @@ -1080,12 +1081,6 @@ void __init acpi_sdei_init(void) } } -static int __init sdei_init(void) -{ - return platform_driver_register(&sdei_driver); -} -arch_initcall(sdei_init); - int sdei_event_handler(struct pt_regs *regs, struct sdei_registered_event *arg) { diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c index 492d09b6048bd53f96ae9340d5b59e813f1e5cd0..3dc2f9aaf08db020a74201d2462c2fd2efecef46 100644 --- a/drivers/firmware/efi/libstub/efi-stub-helper.c +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c @@ -561,7 +561,6 @@ efi_status_t efi_load_initrd_cmdline(efi_loaded_image_t *image, * @image: EFI loaded image protocol * @soft_limit: preferred address for loading the initrd * @hard_limit: upper limit address for loading the initrd - * @out: pointer to store the address of the initrd table * * Return: status code */ diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c index d6701d81cf6807d82252e8655c60186552e2303f..2328ca58bba61fdb677ac20a1a7447882cd0cf22 100644 --- a/drivers/firmware/psci/psci.c +++ b/drivers/firmware/psci/psci.c @@ -759,10 +759,8 @@ int __init psci_dt_init(void) np = of_find_matching_node_and_match(NULL, psci_of_match, &matched_np); - if (!np || !of_device_is_available(np)) { - of_node_put(np); + if (!np || !of_device_is_available(np)) return -ENODEV; - } init_fn = (psci_initcall_t)matched_np->data; ret = init_fn(np); diff --git a/drivers/fpga/tests/fpga-mgr-test.c b/drivers/fpga/tests/fpga-mgr-test.c index bfe25c0c0c1c380406f03d69933e9b4998a4b291..6acec55b60ce9af1d35c69addc3621868b52f4d7 100644 --- a/drivers/fpga/tests/fpga-mgr-test.c +++ b/drivers/fpga/tests/fpga-mgr-test.c @@ -253,7 +253,6 @@ static void fpga_mgr_test_img_load_sgt(struct kunit *test) img_buf = init_test_buffer(test, IMAGE_SIZE); sgt = kunit_kzalloc(test, sizeof(*sgt), GFP_KERNEL); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, sgt); ret = sg_alloc_table(sgt, 1, GFP_KERNEL); KUNIT_ASSERT_EQ(test, ret, 0); sg_init_one(sgt->sgl, img_buf, IMAGE_SIZE); diff --git a/drivers/gpio/gpio-mlxbf3.c b/drivers/gpio/gpio-mlxbf3.c index 9875e34bde72a401e2ac8b28ba9a549c160f9d58..10ea71273c891521ac4e4f210d3441faa77e3309 100644 --- a/drivers/gpio/gpio-mlxbf3.c +++ b/drivers/gpio/gpio-mlxbf3.c @@ -190,9 +190,7 @@ static int mlxbf3_gpio_probe(struct platform_device *pdev) struct mlxbf3_gpio_context *gs; struct gpio_irq_chip *girq; struct gpio_chip *gc; - char *colon_ptr; int ret, irq; - long num; gs = devm_kzalloc(dev, sizeof(*gs), GFP_KERNEL); if (!gs) @@ -229,39 +227,25 @@ static int mlxbf3_gpio_probe(struct platform_device *pdev) gc->owner = THIS_MODULE; gc->add_pin_ranges = mlxbf3_gpio_add_pin_ranges; - colon_ptr = strchr(dev_name(dev), ':'); - if (!colon_ptr) { - dev_err(dev, "invalid device name format\n"); - return -EINVAL; - } - - ret = kstrtol(++colon_ptr, 16, &num); - if (ret) { - dev_err(dev, "invalid device instance\n"); - return ret; - } - - if (!num) { - irq = platform_get_irq(pdev, 0); - if (irq >= 0) { - girq = &gs->gc.irq; - gpio_irq_chip_set_chip(girq, &gpio_mlxbf3_irqchip); - girq->default_type = IRQ_TYPE_NONE; - /* This will let us handle the parent IRQ in the driver */ - girq->num_parents = 0; - girq->parents = NULL; - girq->parent_handler = NULL; - girq->handler = handle_bad_irq; - - /* - * Directly request the irq here instead of passing - * a flow-handler because the irq is shared. - */ - ret = devm_request_irq(dev, irq, mlxbf3_gpio_irq_handler, - IRQF_SHARED, dev_name(dev), gs); - if (ret) - return dev_err_probe(dev, ret, "failed to request IRQ"); - } + irq = platform_get_irq(pdev, 0); + if (irq >= 0) { + girq = &gs->gc.irq; + gpio_irq_chip_set_chip(girq, &gpio_mlxbf3_irqchip); + girq->default_type = IRQ_TYPE_NONE; + /* This will let us handle the parent IRQ in the driver */ + girq->num_parents = 0; + girq->parents = NULL; + girq->parent_handler = NULL; + girq->handler = handle_bad_irq; + + /* + * Directly request the irq here instead of passing + * a flow-handler because the irq is shared. + */ + ret = devm_request_irq(dev, irq, mlxbf3_gpio_irq_handler, + IRQF_SHARED, dev_name(dev), gs); + if (ret) + return dev_err_probe(dev, ret, "failed to request IRQ"); } platform_set_drvdata(pdev, gs); diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index c1e83b2926ae4d6a152916e17e784ecf871ac148..a0a2a0f75bba46afd76f49968a5799433139ac1d 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c @@ -203,15 +203,6 @@ static void of_gpio_try_fixup_polarity(const struct device_node *np, */ { "lantiq,pci-xway", "gpio-reset", false }, #endif -#if IS_ENABLED(CONFIG_REGULATOR_S5M8767) - /* - * According to S5M8767, the DVS and DS pin are - * active-high signals. However, exynos5250-spring.dts use - * active-low setting. - */ - { "samsung,s5m8767-pmic", "s5m8767,pmic-buck-dvs-gpios", true }, - { "samsung,s5m8767-pmic", "s5m8767,pmic-buck-ds-gpios", true }, -#endif #if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2005) /* * DTS for Nokia N900 incorrectly specified "active high" diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index 256cc15fc9b5a19d874876111802bd9eef9c2db4..963e106d32eed0d57c7b876a5bd5b63cff1179a8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c @@ -1890,7 +1890,7 @@ static void amdgpu_ib_preempt_mark_partial_job(struct amdgpu_ring *ring) continue; } job = to_amdgpu_job(s_job); - if (preempted && (&job->hw_fence.base) == fence) + if (preempted && (&job->hw_fence) == fence) /* mark the job as preempted */ job->preemption_status |= AMDGPU_IB_PREEMPTED; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 200b59318759da5a79f8523cca8417d33a2432b6..f8058dd5356a13ec8707f823c492d79c4aa81e31 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -5367,7 +5367,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev, * * job->base holds a reference to parent fence */ - if (job && dma_fence_is_signaled(&job->hw_fence.base)) { + if (job && dma_fence_is_signaled(&job->hw_fence)) { job_signaled = true; dev_info(adev->dev, "Guilty job already signaled, skipping HW reset"); goto skip_hw_reset; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index 017dd494d0a2f61245204aabfcd3d5d7ababa855..7537f5aa76f0c08f8385566fa0f25cfd3d692a45 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -41,6 +41,22 @@ #include "amdgpu_trace.h" #include "amdgpu_reset.h" +/* + * Fences mark an event in the GPUs pipeline and are used + * for GPU/CPU synchronization. When the fence is written, + * it is expected that all buffers associated with that fence + * are no longer in use by the associated ring on the GPU and + * that the relevant GPU caches have been flushed. + */ + +struct amdgpu_fence { + struct dma_fence base; + + /* RB, DMA, etc. */ + struct amdgpu_ring *ring; + ktime_t start_timestamp; +}; + static struct kmem_cache *amdgpu_fence_slab; int amdgpu_fence_slab_init(void) @@ -137,12 +153,12 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f, struct amd am_fence = kmem_cache_alloc(amdgpu_fence_slab, GFP_ATOMIC); if (am_fence == NULL) return -ENOMEM; + fence = &am_fence->base; + am_fence->ring = ring; } else { /* take use of job-embedded fence */ - am_fence = &job->hw_fence; + fence = &job->hw_fence; } - fence = &am_fence->base; - am_fence->ring = ring; seq = ++ring->fence_drv.sync_seq; if (job && job->job_run_counter) { @@ -703,7 +719,7 @@ void amdgpu_fence_driver_clear_job_fences(struct amdgpu_ring *ring) * it right here or we won't be able to track them in fence_drv * and they will remain unsignaled during sa_bo free. */ - job = container_of(old, struct amdgpu_job, hw_fence.base); + job = container_of(old, struct amdgpu_job, hw_fence); if (!job->base.s_fence && !dma_fence_is_signaled(old)) dma_fence_signal(old); RCU_INIT_POINTER(*ptr, NULL); @@ -765,7 +781,7 @@ static const char *amdgpu_fence_get_timeline_name(struct dma_fence *f) static const char *amdgpu_job_fence_get_timeline_name(struct dma_fence *f) { - struct amdgpu_job *job = container_of(f, struct amdgpu_job, hw_fence.base); + struct amdgpu_job *job = container_of(f, struct amdgpu_job, hw_fence); return (const char *)to_amdgpu_ring(job->base.sched)->name; } @@ -795,7 +811,7 @@ static bool amdgpu_fence_enable_signaling(struct dma_fence *f) */ static bool amdgpu_job_fence_enable_signaling(struct dma_fence *f) { - struct amdgpu_job *job = container_of(f, struct amdgpu_job, hw_fence.base); + struct amdgpu_job *job = container_of(f, struct amdgpu_job, hw_fence); if (!timer_pending(&to_amdgpu_ring(job->base.sched)->fence_drv.fallback_timer)) amdgpu_fence_schedule_fallback(to_amdgpu_ring(job->base.sched)); @@ -830,7 +846,7 @@ static void amdgpu_job_fence_free(struct rcu_head *rcu) struct dma_fence *f = container_of(rcu, struct dma_fence, rcu); /* free job if fence has a parent job */ - kfree(container_of(f, struct amdgpu_job, hw_fence.base)); + kfree(container_of(f, struct amdgpu_job, hw_fence)); } /** diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index e9adfc88a54ab10fa34ab0d41b3ee9403744896b..49a6b6b88843ddd33b2052e80cb01d680133531c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c @@ -165,8 +165,8 @@ void amdgpu_job_free_resources(struct amdgpu_job *job) /* Check if any fences where initialized */ if (job->base.s_fence && job->base.s_fence->finished.ops) f = &job->base.s_fence->finished; - else if (job->hw_fence.base.ops) - f = &job->hw_fence.base; + else if (job->hw_fence.ops) + f = &job->hw_fence; else f = NULL; @@ -183,10 +183,10 @@ static void amdgpu_job_free_cb(struct drm_sched_job *s_job) amdgpu_sync_free(&job->explicit_sync); /* only put the hw fence if has embedded fence */ - if (!job->hw_fence.base.ops) + if (!job->hw_fence.ops) kfree(job); else - dma_fence_put(&job->hw_fence.base); + dma_fence_put(&job->hw_fence); } void amdgpu_job_set_gang_leader(struct amdgpu_job *job, @@ -215,10 +215,10 @@ void amdgpu_job_free(struct amdgpu_job *job) if (job->gang_submit != &job->base.s_fence->scheduled) dma_fence_put(job->gang_submit); - if (!job->hw_fence.base.ops) + if (!job->hw_fence.ops) kfree(job); else - dma_fence_put(&job->hw_fence.base); + dma_fence_put(&job->hw_fence); } struct dma_fence *amdgpu_job_submit(struct amdgpu_job *job) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h index 65b6fbab544e5fbd3b492331fe96182f8eb98a22..a963a25ddd6209653fb3e70516d06b3798ec2042 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h @@ -48,7 +48,7 @@ struct amdgpu_job { struct drm_sched_job base; struct amdgpu_vm *vm; struct amdgpu_sync explicit_sync; - struct amdgpu_fence hw_fence; + struct dma_fence hw_fence; struct dma_fence *gang_submit; uint32_t preamble_status; uint32_t preemption_status; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index ffa5e72a84ebcbc531a7bdff9a731380f277b2d2..6a24e8ceb94493ea2678c6d42dd972231c1968d3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -43,7 +43,7 @@ #include "amdgpu_securedisplay.h" #include "amdgpu_atomfirmware.h" -#define AMD_VBIOS_FILE_MAX_SIZE_B (1024*1024*16) +#define AMD_VBIOS_FILE_MAX_SIZE_B (1024*1024*3) static int psp_load_smu_fw(struct psp_context *psp); static int psp_rap_terminate(struct psp_context *psp); @@ -506,6 +506,7 @@ static int psp_sw_fini(void *handle) { struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct psp_context *psp = &adev->psp; + struct psp_gfx_cmd_resp *cmd = psp->cmd; psp_memory_training_fini(psp); @@ -515,8 +516,8 @@ static int psp_sw_fini(void *handle) amdgpu_ucode_release(&psp->cap_fw); amdgpu_ucode_release(&psp->toc_fw); - kfree(psp->cmd); - psp->cmd = NULL; + kfree(cmd); + cmd = NULL; psp_free_shared_bufs(psp); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h index 60f770b99c2c540c1d6aa6c302acb0d93c1a86ea..e2ab303ad2708ed14afe5ba24aace7883cb785c6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h @@ -123,22 +123,6 @@ struct amdgpu_fence_driver { struct dma_fence **fences; }; -/* - * Fences mark an event in the GPUs pipeline and are used - * for GPU/CPU synchronization. When the fence is written, - * it is expected that all buffers associated with that fence - * are no longer in use by the associated ring on the GPU and - * that the relevant GPU caches have been flushed. - */ - -struct amdgpu_fence { - struct dma_fence base; - - /* RB, DMA, etc. */ - struct amdgpu_ring *ring; - ktime_t start_timestamp; -}; - extern const struct drm_sched_backend_ops amdgpu_sched_ops; void amdgpu_fence_driver_clear_job_fences(struct amdgpu_ring *ring); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c index e9d2fcdde0e1c63ad29f9baa0b80b40e6a1ed136..bef7541770641cce76c4e6046e0327506ba87354 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c @@ -28,10 +28,6 @@ #include "amdgpu.h" #include "amdgpu_ucode.h" -static const struct kicker_device kicker_device_list[] = { - {0x744B, 0x00}, -}; - static void amdgpu_ucode_print_common_hdr(const struct common_firmware_header *hdr) { DRM_DEBUG("size_bytes: %u\n", le32_to_cpu(hdr->size_bytes)); @@ -1272,19 +1268,6 @@ static const char *amdgpu_ucode_legacy_naming(struct amdgpu_device *adev, int bl return NULL; } -bool amdgpu_is_kicker_fw(struct amdgpu_device *adev) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(kicker_device_list); i++) { - if (adev->pdev->device == kicker_device_list[i].device && - adev->pdev->revision == kicker_device_list[i].revision) - return true; - } - - return false; -} - void amdgpu_ucode_ip_version_decode(struct amdgpu_device *adev, int block_type, char *ucode_prefix, int len) { int maj, min, rev; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h index 4760092aafd723c9d7776ed5796c3324e322c27e..b03321e7d2d893a4f8c79034c4d2774989f5c06f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h @@ -536,11 +536,6 @@ struct amdgpu_firmware { uint64_t fw_buf_mc; }; -struct kicker_device{ - unsigned short device; - u8 revision; -}; - void amdgpu_ucode_print_mc_hdr(const struct common_firmware_header *hdr); void amdgpu_ucode_print_smc_hdr(const struct common_firmware_header *hdr); void amdgpu_ucode_print_imu_hdr(const struct common_firmware_header *hdr); @@ -567,6 +562,5 @@ amdgpu_ucode_get_load_type(struct amdgpu_device *adev, int load_type); const char *amdgpu_ucode_name(enum AMDGPU_UCODE_ID ucode_id); void amdgpu_ucode_ip_version_decode(struct amdgpu_device *adev, int block_type, char *ucode_prefix, int len); -bool amdgpu_is_kicker_fw(struct amdgpu_device *adev); #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 451c37d04e45674d1e438af66a7e506f12fe2c82..c7085a747b03b78012d33b9966eb2a10a6f558d6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -435,7 +435,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, int r; lpfn = (u64)place->lpfn << PAGE_SHIFT; - if (!lpfn || lpfn > man->size) + if (!lpfn) lpfn = man->size; fpfn = (u64)place->fpfn << PAGE_SHIFT; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 472cb0f9e8f6c0f848a7339846f8d9ffd85cc1c6..1943beb135c4c2923c211c5727afbd16141ac718 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c @@ -4656,7 +4656,6 @@ static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring) memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation)); /* reset ring buffer */ ring->wptr = 0; - atomic64_set((atomic64_t *)ring->wptr_cpu_addr, 0); amdgpu_ring_clear_ring(ring); } return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c index 553f4f24f5adebbac7467ad09e4de3ddda696281..9086f2fdfaf422b4312d47c4fd3096e62cce1e60 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c @@ -172,30 +172,6 @@ static void mmhub_v1_7_init_tlb_regs(struct amdgpu_device *adev) WREG32_SOC15(MMHUB, 0, regMC_VM_MX_L1_TLB_CNTL, tmp); } -/* Set snoop bit for SDMA so that SDMA writes probe-invalidates RW lines */ -static void mmhub_v1_7_init_snoop_override_regs(struct amdgpu_device *adev) -{ - uint32_t tmp; - int i; - uint32_t distance = regDAGB1_WRCLI_GPU_SNOOP_OVERRIDE - - regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE; - - for (i = 0; i < 5; i++) { /* DAGB instances */ - tmp = RREG32_SOC15_OFFSET(MMHUB, 0, - regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, i * distance); - tmp |= (1 << 15); /* SDMA client is BIT15 */ - WREG32_SOC15_OFFSET(MMHUB, 0, - regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, i * distance, tmp); - - tmp = RREG32_SOC15_OFFSET(MMHUB, 0, - regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, i * distance); - tmp |= (1 << 15); - WREG32_SOC15_OFFSET(MMHUB, 0, - regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, i * distance, tmp); - } - -} - static void mmhub_v1_7_init_cache_regs(struct amdgpu_device *adev) { uint32_t tmp; @@ -361,7 +337,6 @@ static int mmhub_v1_7_gart_enable(struct amdgpu_device *adev) mmhub_v1_7_init_system_aperture_regs(adev); mmhub_v1_7_init_tlb_regs(adev); mmhub_v1_7_init_cache_regs(adev); - mmhub_v1_7_init_snoop_override_regs(adev); mmhub_v1_7_enable_system_domain(adev); mmhub_v1_7_disable_identity_aperture(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c index c7bdccff785b7131532055f6ce7c907b076f6931..3d8e579d5c4e8a0180bbd42b7bad9b99a26726fa 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c @@ -213,32 +213,6 @@ static void mmhub_v1_8_init_tlb_regs(struct amdgpu_device *adev) } } -/* Set snoop bit for SDMA so that SDMA writes probe-invalidates RW lines */ -static void mmhub_v1_8_init_snoop_override_regs(struct amdgpu_device *adev) -{ - uint32_t tmp, inst_mask; - int i, j; - uint32_t distance = regDAGB1_WRCLI_GPU_SNOOP_OVERRIDE - - regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE; - - inst_mask = adev->aid_mask; - for_each_inst(i, inst_mask) { - for (j = 0; j < 5; j++) { /* DAGB instances */ - tmp = RREG32_SOC15_OFFSET(MMHUB, i, - regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, j * distance); - tmp |= (1 << 15); /* SDMA client is BIT15 */ - WREG32_SOC15_OFFSET(MMHUB, i, - regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, j * distance, tmp); - - tmp = RREG32_SOC15_OFFSET(MMHUB, i, - regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, j * distance); - tmp |= (1 << 15); - WREG32_SOC15_OFFSET(MMHUB, i, - regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, j * distance, tmp); - } - } -} - static void mmhub_v1_8_init_cache_regs(struct amdgpu_device *adev) { uint32_t tmp, inst_mask; @@ -444,7 +418,6 @@ static int mmhub_v1_8_gart_enable(struct amdgpu_device *adev) mmhub_v1_8_init_system_aperture_regs(adev); mmhub_v1_8_init_tlb_regs(adev); mmhub_v1_8_init_cache_regs(adev); - mmhub_v1_8_init_snoop_override_regs(adev); mmhub_v1_8_enable_system_domain(adev); mmhub_v1_8_disable_identity_aperture(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c index 9713cb59d1c14f4aa86e2c3a82e122829c230fdc..5718e4d40e6665e1014bc5bd7536e421bc2cff58 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c @@ -198,36 +198,6 @@ static void mmhub_v9_4_init_tlb_regs(struct amdgpu_device *adev, int hubid) hubid * MMHUB_INSTANCE_REGISTER_OFFSET, tmp); } -/* Set snoop bit for SDMA so that SDMA writes probe-invalidates RW lines */ -static void mmhub_v9_4_init_snoop_override_regs(struct amdgpu_device *adev, int hubid) -{ - uint32_t tmp; - int i; - uint32_t distance = mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE - - mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE; - uint32_t huboffset = hubid * MMHUB_INSTANCE_REGISTER_OFFSET; - - for (i = 0; i < 5 - (2 * hubid); i++) { - /* DAGB instances 0 to 4 are in hub0 and 5 to 7 are in hub1 */ - tmp = RREG32_SOC15_OFFSET(MMHUB, 0, - mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, - huboffset + i * distance); - tmp |= (1 << 15); /* SDMA client is BIT15 */ - WREG32_SOC15_OFFSET(MMHUB, 0, - mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, - huboffset + i * distance, tmp); - - tmp = RREG32_SOC15_OFFSET(MMHUB, 0, - mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, - huboffset + i * distance); - tmp |= (1 << 15); - WREG32_SOC15_OFFSET(MMHUB, 0, - mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, - huboffset + i * distance, tmp); - } - -} - static void mmhub_v9_4_init_cache_regs(struct amdgpu_device *adev, int hubid) { uint32_t tmp; @@ -422,7 +392,6 @@ static int mmhub_v9_4_gart_enable(struct amdgpu_device *adev) if (!amdgpu_sriov_vf(adev)) mmhub_v9_4_init_cache_regs(adev, i); - mmhub_v9_4_init_snoop_override_regs(adev, i); mmhub_v9_4_enable_system_domain(adev, i); if (!amdgpu_sriov_vf(adev)) mmhub_v9_4_disable_identity_aperture(adev, i); diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c index 2b07c0000df6ebb2a37502964d14293033a1a2b2..0f58be65132fc0370fec5f87ec4658f915a347d6 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c @@ -1287,7 +1287,6 @@ void kfd_signal_poison_consumed_event(struct kfd_node *dev, u32 pasid) user_gpu_id = kfd_process_get_user_gpu_id(p, dev->id); if (unlikely(user_gpu_id == -EINVAL)) { WARN_ONCE(1, "Could not get user_gpu_id from dev->id:%x\n", dev->id); - kfd_unref_process(p); return; } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c index 18e82d0da75bcde341cb53fdab9e58a31b8e0ef8..1a03173e23133799d1d6be4a064a7fde0bb25923 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c @@ -225,7 +225,7 @@ static int pm_map_queues_v9(struct packet_manager *pm, uint32_t *buffer, packet->bitfields2.engine_sel = engine_sel__mes_map_queues__compute_vi; - packet->bitfields2.gws_control_queue = q->properties.is_gws ? 1 : 0; + packet->bitfields2.gws_control_queue = q->gws ? 1 : 0; packet->bitfields2.extended_engine_sel = extended_engine_sel__mes_map_queues__legacy_engine_sel; packet->bitfields2.queue_type = diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c index b77b472332316494258fe00f41ed15e4f29079d6..6b7c6f45a80a86ae91fd77f787dea64a62484e49 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c @@ -1130,12 +1130,13 @@ svm_range_split_head(struct svm_range *prange, } static void -svm_range_add_child(struct svm_range *prange, struct svm_range *pchild, enum svm_work_list_ops op) +svm_range_add_child(struct svm_range *prange, struct mm_struct *mm, + struct svm_range *pchild, enum svm_work_list_ops op) { pr_debug("add child 0x%p [0x%lx 0x%lx] to prange 0x%p child list %d\n", pchild, pchild->start, pchild->last, prange, op); - pchild->work_item.mm = NULL; + pchild->work_item.mm = mm; pchild->work_item.op = op; list_add_tail(&pchild->child_list, &prange->child_list); } @@ -1181,14 +1182,14 @@ svm_range_split_by_granularity(struct kfd_process *p, struct mm_struct *mm, r = svm_range_split(prange, start, prange->last, &head); if (r) return r; - svm_range_add_child(parent, head, SVM_OP_ADD_RANGE); + svm_range_add_child(parent, mm, head, SVM_OP_ADD_RANGE); } if (last < prange->last) { r = svm_range_split(prange, prange->start, last, &tail); if (r) return r; - svm_range_add_child(parent, tail, SVM_OP_ADD_RANGE); + svm_range_add_child(parent, mm, tail, SVM_OP_ADD_RANGE); } /* xnack on, update mapping on GPUs with ACCESS_IN_PLACE */ @@ -2392,17 +2393,15 @@ svm_range_add_list_work(struct svm_range_list *svms, struct svm_range *prange, prange->work_item.op != SVM_OP_UNMAP_RANGE) prange->work_item.op = op; } else { - /* Pairs with mmput in deferred_list_work. - * If process is exiting and mm is gone, don't update mmu notifier. - */ - if (mmget_not_zero(mm)) { - prange->work_item.mm = mm; - prange->work_item.op = op; - list_add_tail(&prange->deferred_list, - &prange->svms->deferred_range_list); - pr_debug("add prange 0x%p [0x%lx 0x%lx] to work list op %d\n", - prange, prange->start, prange->last, op); - } + prange->work_item.op = op; + + /* Pairs with mmput in deferred_list_work */ + mmget(mm); + prange->work_item.mm = mm; + list_add_tail(&prange->deferred_list, + &prange->svms->deferred_range_list); + pr_debug("add prange 0x%p [0x%lx 0x%lx] to work list op %d\n", + prange, prange->start, prange->last, op); } spin_unlock(&svms->deferred_list_lock); } @@ -2416,7 +2415,8 @@ void schedule_deferred_list_work(struct svm_range_list *svms) } static void -svm_range_unmap_split(struct svm_range *parent, struct svm_range *prange, unsigned long start, +svm_range_unmap_split(struct mm_struct *mm, struct svm_range *parent, + struct svm_range *prange, unsigned long start, unsigned long last) { struct svm_range *head; @@ -2437,12 +2437,12 @@ svm_range_unmap_split(struct svm_range *parent, struct svm_range *prange, unsign svm_range_split(tail, last + 1, tail->last, &head); if (head != prange && tail != prange) { - svm_range_add_child(parent, head, SVM_OP_UNMAP_RANGE); - svm_range_add_child(parent, tail, SVM_OP_ADD_RANGE); + svm_range_add_child(parent, mm, head, SVM_OP_UNMAP_RANGE); + svm_range_add_child(parent, mm, tail, SVM_OP_ADD_RANGE); } else if (tail != prange) { - svm_range_add_child(parent, tail, SVM_OP_UNMAP_RANGE); + svm_range_add_child(parent, mm, tail, SVM_OP_UNMAP_RANGE); } else if (head != prange) { - svm_range_add_child(parent, head, SVM_OP_UNMAP_RANGE); + svm_range_add_child(parent, mm, head, SVM_OP_UNMAP_RANGE); } else if (parent != prange) { prange->work_item.op = SVM_OP_UNMAP_RANGE; } @@ -2481,14 +2481,14 @@ svm_range_unmap_from_cpu(struct mm_struct *mm, struct svm_range *prange, l = min(last, pchild->last); if (l >= s) svm_range_unmap_from_gpus(pchild, s, l, trigger); - svm_range_unmap_split(prange, pchild, start, last); + svm_range_unmap_split(mm, prange, pchild, start, last); mutex_unlock(&pchild->lock); } s = max(start, prange->start); l = min(last, prange->last); if (l >= s) svm_range_unmap_from_gpus(prange, s, l, trigger); - svm_range_unmap_split(prange, prange, start, last); + svm_range_unmap_split(mm, prange, prange, start, last); if (unmap_parent) svm_range_add_list_work(svms, prange, mm, SVM_OP_UNMAP_RANGE); @@ -2531,6 +2531,8 @@ svm_range_cpu_invalidate_pagetables(struct mmu_interval_notifier *mni, if (range->event == MMU_NOTIFY_RELEASE) return true; + if (!mmget_not_zero(mni->mm)) + return true; start = mni->interval_tree.start; last = mni->interval_tree.last; @@ -2557,6 +2559,7 @@ svm_range_cpu_invalidate_pagetables(struct mmu_interval_notifier *mni, } svm_range_unlock(prange); + mmput(mni->mm); return true; } diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index d4edddaa23dd3e07d9bbbe63cc4d2754d40bdbeb..bcf0dc05c7676546750fcf3dea76af460aa6a6a3 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -610,15 +610,21 @@ static void dm_crtc_high_irq(void *interrupt_params) spin_lock_irqsave(&adev_to_drm(adev)->event_lock, flags); if (acrtc->dm_irq_params.stream && - acrtc->dm_irq_params.vrr_params.supported && - acrtc->dm_irq_params.freesync_config.state == - VRR_STATE_ACTIVE_VARIABLE) { + acrtc->dm_irq_params.vrr_params.supported) { + bool replay_en = acrtc->dm_irq_params.stream->link->replay_settings.replay_feature_enabled; + bool psr_en = acrtc->dm_irq_params.stream->link->psr_settings.psr_feature_enabled; + bool fs_active_var_en = acrtc->dm_irq_params.freesync_config.state == VRR_STATE_ACTIVE_VARIABLE; + mod_freesync_handle_v_update(adev->dm.freesync_module, acrtc->dm_irq_params.stream, &acrtc->dm_irq_params.vrr_params); - dc_stream_adjust_vmin_vmax(adev->dm.dc, acrtc->dm_irq_params.stream, - &acrtc->dm_irq_params.vrr_params.adjust); + /* update vmin_vmax only if freesync is enabled, or only if PSR and REPLAY are disabled */ + if (fs_active_var_en || (!fs_active_var_en && !replay_en && !psr_en)) { + dc_stream_adjust_vmin_vmax(adev->dm.dc, + acrtc->dm_irq_params.stream, + &acrtc->dm_irq_params.vrr_params.adjust); + } } /* @@ -2890,6 +2896,11 @@ static int dm_resume(void *handle) return 0; } + + /* leave display off for S4 sequence */ + if (adev->in_s4) + return 0; + /* Recreate dc_state - DC invalidates it when setting power state to S3. */ dc_release_state(dm_state->context); dm_state->context = dc_create_state(dm->dc); @@ -7463,7 +7474,7 @@ static int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap, int i; int result = -EIO; - if (!ddc_service->ddc_pin) + if (!ddc_service->ddc_pin || !ddc_service->ddc_pin->hw_info.hw_supported) return result; cmd.payloads = kcalloc(num, sizeof(struct i2c_payload), GFP_KERNEL); diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index 640d010b52bec3e3d32f7ca5c277ca4da7eb8d08..c2efe18ceacd072aa666299b8c403db90bfc0851 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -266,7 +266,6 @@ static bool create_links( link->link_id.type = OBJECT_TYPE_CONNECTOR; link->link_id.id = CONNECTOR_ID_VIRTUAL; link->link_id.enum_id = ENUM_ID_1; - link->psr_settings.psr_version = DC_PSR_VERSION_UNSUPPORTED; link->link_enc = kzalloc(sizeof(*link->link_enc), GFP_KERNEL); if (!link->link_enc) { diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h index 4b284ce669ae522bb16838abca9fe168a375e2f4..eaad1260bfd1808c40bea358ed410051ef5440d8 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h +++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h @@ -532,7 +532,7 @@ struct dc_state { */ struct bw_context bw_ctx; - struct block_sequence block_sequence[100]; + struct block_sequence block_sequence[50]; unsigned int block_sequence_steps; struct dc_dmub_cmd dc_dmub_cmd[10]; unsigned int dmub_cmd_count; diff --git a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c index 9b470812d96a5f21b436bcbf984428c8e6c6ab64..4901e27f678bcf1271255622c5cf09aeea062a4e 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c @@ -145,7 +145,6 @@ void link_blank_dp_stream(struct dc_link *link, bool hw_init) void link_set_all_streams_dpms_off_for_link(struct dc_link *link) { struct pipe_ctx *pipes[MAX_PIPES]; - struct dc_stream_state *streams[MAX_PIPES]; struct dc_state *state = link->dc->current_state; uint8_t count; int i; @@ -158,18 +157,10 @@ void link_set_all_streams_dpms_off_for_link(struct dc_link *link) link_get_master_pipes_with_dpms_on(link, state, &count, pipes); - /* The subsequent call to dc_commit_updates_for_stream for a full update - * will release the current state and swap to a new state. Releasing the - * current state results in the stream pointers in the pipe_ctx structs - * to be zero'd. Hence, cache all streams prior to dc_commit_updates_for_stream. - */ - for (i = 0; i < count; i++) - streams[i] = pipes[i]->stream; - for (i = 0; i < count; i++) { - stream_update.stream = streams[i]; + stream_update.stream = pipes[i]->stream; dc_commit_updates_for_stream(link->ctx->dc, NULL, 0, - streams[i], &stream_update, + pipes[i]->stream, &stream_update, state); } diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c index f01a3df584552f25b41786023b0a488a13825062..9bde0c8bf914a6ce48d4bcd2e7f246fbbef4f7fc 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c @@ -74,8 +74,7 @@ void dp_disable_link_phy(struct dc_link *link, struct dc *dc = link->ctx->dc; if (!link->wa_flags.dp_keep_receiver_powered && - !link->skip_implict_edp_power_control && - link->type != dc_connection_none) + !link->skip_implict_edp_power_control) dpcd_write_rx_power_ctrl(link, false); dc->hwss.disable_link_output(link, link_res, signal); @@ -160,9 +159,8 @@ enum dc_status dp_set_fec_ready(struct dc_link *link, const struct link_resource } else { if (link->fec_state == dc_link_fec_ready) { fec_config = 0; - if (link->type != dc_connection_none) - core_link_write_dpcd(link, DP_FEC_CONFIGURATION, - &fec_config, sizeof(fec_config)); + core_link_write_dpcd(link, DP_FEC_CONFIGURATION, + &fec_config, sizeof(fec_config)); link_enc->funcs->fec_set_ready(link_enc, false); link->fec_state = dc_link_fec_not_ready; diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c index 52261e7c11c0b437589e5cdb4d42d876cdd47133..2b4c15b0b407084618748f64ce7d31a12cfc4338 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c @@ -36,8 +36,7 @@ link->ctx->logger static int32_t get_cr_training_aux_rd_interval(struct dc_link *link, - const struct dc_link_settings *link_settings, - enum lttpr_mode lttpr_mode) + const struct dc_link_settings *link_settings) { union training_aux_rd_interval training_rd_interval; uint32_t wait_in_micro_secs = 100; @@ -50,8 +49,6 @@ static int32_t get_cr_training_aux_rd_interval(struct dc_link *link, DP_TRAINING_AUX_RD_INTERVAL, (uint8_t *)&training_rd_interval, sizeof(training_rd_interval)); - if (lttpr_mode != LTTPR_MODE_NON_TRANSPARENT) - wait_in_micro_secs = 400; if (training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL) wait_in_micro_secs = training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL * 4000; } @@ -113,6 +110,7 @@ void decide_8b_10b_training_settings( */ lt_settings->link_settings.link_spread = link->dp_ss_off ? LINK_SPREAD_DISABLED : LINK_SPREAD_05_DOWNSPREAD_30KHZ; + lt_settings->cr_pattern_time = get_cr_training_aux_rd_interval(link, link_setting); lt_settings->eq_pattern_time = get_eq_training_aux_rd_interval(link, link_setting); lt_settings->pattern_for_cr = decide_cr_training_pattern(link_setting); lt_settings->pattern_for_eq = decide_eq_training_pattern(link, link_setting); @@ -121,7 +119,6 @@ void decide_8b_10b_training_settings( lt_settings->disallow_per_lane_settings = true; lt_settings->always_match_dpcd_with_hw_lane_settings = true; lt_settings->lttpr_mode = dp_decide_8b_10b_lttpr_mode(link); - lt_settings->cr_pattern_time = get_cr_training_aux_rd_interval(link, link_setting, lt_settings->lttpr_mode); dp_hw_to_dpcd_lane_settings(lt_settings, lt_settings->hw_lane_settings, lt_settings->dpcd_lane_settings); } diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c index 7f8f127e7722de259e563af6555d8d6b08a8bbfa..ff930a71e496a94399fe5c05f46cb187f3e1d440 100644 --- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c +++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c @@ -368,9 +368,6 @@ enum mod_hdcp_status mod_hdcp_hdcp1_enable_encryption(struct mod_hdcp *hdcp) struct mod_hdcp_display *display = get_first_active_display(hdcp); enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS; - if (!display) - return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND; - mutex_lock(&psp->hdcp_context.mutex); hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf; memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory)); diff --git a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_offset.h b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_offset.h index b2252deabc17a46fa7f57888a534f1cc20171182..c488d4a50cf46af76daf410d55101c1e63270f4f 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_offset.h +++ b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_offset.h @@ -203,10 +203,6 @@ #define mmDAGB0_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB0_WR_MISC_CREDIT 0x0058 #define mmDAGB0_WR_MISC_CREDIT_BASE_IDX 1 -#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE 0x005b -#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 -#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x005c -#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB0_WRCLI_ASK_PENDING 0x005d #define mmDAGB0_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB0_WRCLI_GO_PENDING 0x005e @@ -459,10 +455,6 @@ #define mmDAGB1_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB1_WR_MISC_CREDIT 0x00d8 #define mmDAGB1_WR_MISC_CREDIT_BASE_IDX 1 -#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE 0x00db -#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 -#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x00dc -#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB1_WRCLI_ASK_PENDING 0x00dd #define mmDAGB1_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB1_WRCLI_GO_PENDING 0x00de @@ -715,10 +707,6 @@ #define mmDAGB2_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB2_WR_MISC_CREDIT 0x0158 #define mmDAGB2_WR_MISC_CREDIT_BASE_IDX 1 -#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE 0x015b -#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 -#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x015c -#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB2_WRCLI_ASK_PENDING 0x015d #define mmDAGB2_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB2_WRCLI_GO_PENDING 0x015e @@ -971,10 +959,6 @@ #define mmDAGB3_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB3_WR_MISC_CREDIT 0x01d8 #define mmDAGB3_WR_MISC_CREDIT_BASE_IDX 1 -#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE 0x01db -#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 -#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x01dc -#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB3_WRCLI_ASK_PENDING 0x01dd #define mmDAGB3_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB3_WRCLI_GO_PENDING 0x01de @@ -1227,10 +1211,6 @@ #define mmDAGB4_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB4_WR_MISC_CREDIT 0x0258 #define mmDAGB4_WR_MISC_CREDIT_BASE_IDX 1 -#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE 0x025b -#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 -#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x025c -#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB4_WRCLI_ASK_PENDING 0x025d #define mmDAGB4_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB4_WRCLI_GO_PENDING 0x025e @@ -4813,10 +4793,6 @@ #define mmDAGB5_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB5_WR_MISC_CREDIT 0x3058 #define mmDAGB5_WR_MISC_CREDIT_BASE_IDX 1 -#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE 0x305b -#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 -#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x305c -#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB5_WRCLI_ASK_PENDING 0x305d #define mmDAGB5_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB5_WRCLI_GO_PENDING 0x305e @@ -5069,10 +5045,6 @@ #define mmDAGB6_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB6_WR_MISC_CREDIT 0x30d8 #define mmDAGB6_WR_MISC_CREDIT_BASE_IDX 1 -#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE 0x30db -#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 -#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x30dc -#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB6_WRCLI_ASK_PENDING 0x30dd #define mmDAGB6_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB6_WRCLI_GO_PENDING 0x30de @@ -5325,10 +5297,6 @@ #define mmDAGB7_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB7_WR_MISC_CREDIT 0x3158 #define mmDAGB7_WR_MISC_CREDIT_BASE_IDX 1 -#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE 0x315b -#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 -#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x315c -#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB7_WRCLI_ASK_PENDING 0x315d #define mmDAGB7_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB7_WRCLI_GO_PENDING 0x315e diff --git a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_sh_mask.h index 5069d2fd467f2b7c5fc0f9c3fe42b56376a9f9f7..2969fbf282b7d066c5d34b406ea182950ff5c1ca 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_sh_mask.h +++ b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_sh_mask.h @@ -1532,12 +1532,6 @@ //DAGB0_WRCLI_DBUS_GO_PENDING #define DAGB0_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB0_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL -//DAGB0_WRCLI_GPU_SNOOP_OVERRIDE -#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 -#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL -//DAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE -#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 -#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB0_DAGB_DLY #define DAGB0_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB0_DAGB_DLY__CLI__SHIFT 0x8 @@ -3213,12 +3207,6 @@ //DAGB1_WRCLI_DBUS_GO_PENDING #define DAGB1_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB1_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL -//DAGB1_WRCLI_GPU_SNOOP_OVERRIDE -#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 -#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL -//DAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE -#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 -#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB1_DAGB_DLY #define DAGB1_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB1_DAGB_DLY__CLI__SHIFT 0x8 @@ -4894,12 +4882,6 @@ //DAGB2_WRCLI_DBUS_GO_PENDING #define DAGB2_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB2_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL -//DAGB2_WRCLI_GPU_SNOOP_OVERRIDE -#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 -#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL -//DAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE -#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 -#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB2_DAGB_DLY #define DAGB2_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB2_DAGB_DLY__CLI__SHIFT 0x8 @@ -6575,12 +6557,6 @@ //DAGB3_WRCLI_DBUS_GO_PENDING #define DAGB3_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB3_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL -//DAGB3_WRCLI_GPU_SNOOP_OVERRIDE -#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 -#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL -//DAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE -#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 -#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB3_DAGB_DLY #define DAGB3_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB3_DAGB_DLY__CLI__SHIFT 0x8 @@ -8256,12 +8232,6 @@ //DAGB4_WRCLI_DBUS_GO_PENDING #define DAGB4_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB4_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL -//DAGB4_WRCLI_GPU_SNOOP_OVERRIDE -#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 -#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL -//DAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE -#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 -#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB4_DAGB_DLY #define DAGB4_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB4_DAGB_DLY__CLI__SHIFT 0x8 @@ -28767,12 +28737,6 @@ //DAGB5_WRCLI_DBUS_GO_PENDING #define DAGB5_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB5_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL -//DAGB5_WRCLI_GPU_SNOOP_OVERRIDE -#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 -#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL -//DAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE -#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 -#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB5_DAGB_DLY #define DAGB5_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB5_DAGB_DLY__CLI__SHIFT 0x8 @@ -30448,12 +30412,6 @@ //DAGB6_WRCLI_DBUS_GO_PENDING #define DAGB6_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB6_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL -//DAGB6_WRCLI_GPU_SNOOP_OVERRIDE -#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 -#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL -//DAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE -#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 -#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB6_DAGB_DLY #define DAGB6_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB6_DAGB_DLY__CLI__SHIFT 0x8 @@ -32129,12 +32087,6 @@ //DAGB7_WRCLI_DBUS_GO_PENDING #define DAGB7_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB7_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL -//DAGB7_WRCLI_GPU_SNOOP_OVERRIDE -#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 -#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL -//DAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE -#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 -#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB7_DAGB_DLY #define DAGB7_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB7_DAGB_DLY__CLI__SHIFT 0x8 diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c index 7e37354a03411d3be30168495fd1336f61cdf56a..1fbd23922082ae2e83c6d14b599ab28e0efb3fe9 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c @@ -144,10 +144,6 @@ int atomctrl_initialize_mc_reg_table( vram_info = (ATOM_VRAM_INFO_HEADER_V2_1 *) smu_atom_get_data_table(hwmgr->adev, GetIndexIntoMasterTable(DATA, VRAM_Info), &size, &frev, &crev); - if (!vram_info) { - pr_err("Could not retrieve the VramInfo table!"); - return -EINVAL; - } if (module_index >= vram_info->ucNumOfVRAMModule) { pr_err("Invalid VramInfo table."); @@ -185,10 +181,6 @@ int atomctrl_initialize_mc_reg_table_v2_2( vram_info = (ATOM_VRAM_INFO_HEADER_V2_2 *) smu_atom_get_data_table(hwmgr->adev, GetIndexIntoMasterTable(DATA, VRAM_Info), &size, &frev, &crev); - if (!vram_info) { - pr_err("Could not retrieve the VramInfo table!"); - return -EINVAL; - } if (module_index >= vram_info->ucNumOfVRAMModule) { pr_err("Invalid VramInfo table."); diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 27e660e92489f6bb9c5f4790fe3aa37b8d332b36..3de0f457fff6abbc52e5d040386a1fb3eeb5902d 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -132,7 +132,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, return false; } - switch (mode->hdisplay) { + switch (mode->crtc_hdisplay) { case 640: vbios_mode->enh_table = &res_640x480[refresh_rate_index]; break; @@ -146,7 +146,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, vbios_mode->enh_table = &res_1152x864[refresh_rate_index]; break; case 1280: - if (mode->vdisplay == 800) + if (mode->crtc_vdisplay == 800) vbios_mode->enh_table = &res_1280x800[refresh_rate_index]; else vbios_mode->enh_table = &res_1280x1024[refresh_rate_index]; @@ -158,7 +158,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, vbios_mode->enh_table = &res_1440x900[refresh_rate_index]; break; case 1600: - if (mode->vdisplay == 900) + if (mode->crtc_vdisplay == 900) vbios_mode->enh_table = &res_1600x900[refresh_rate_index]; else vbios_mode->enh_table = &res_1600x1200[refresh_rate_index]; @@ -167,7 +167,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, vbios_mode->enh_table = &res_1680x1050[refresh_rate_index]; break; case 1920: - if (mode->vdisplay == 1080) + if (mode->crtc_vdisplay == 1080) vbios_mode->enh_table = &res_1920x1080[refresh_rate_index]; else vbios_mode->enh_table = &res_1920x1200[refresh_rate_index]; @@ -211,7 +211,6 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, hborder = (vbios_mode->enh_table->flags & HBorder) ? 8 : 0; vborder = (vbios_mode->enh_table->flags & VBorder) ? 8 : 0; - adjusted_mode->crtc_hdisplay = vbios_mode->enh_table->hde; adjusted_mode->crtc_htotal = vbios_mode->enh_table->ht; adjusted_mode->crtc_hblank_start = vbios_mode->enh_table->hde + hborder; adjusted_mode->crtc_hblank_end = vbios_mode->enh_table->ht - hborder; @@ -221,7 +220,6 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, vbios_mode->enh_table->hfp + vbios_mode->enh_table->hsync); - adjusted_mode->crtc_vdisplay = vbios_mode->enh_table->vde; adjusted_mode->crtc_vtotal = vbios_mode->enh_table->vt; adjusted_mode->crtc_vblank_start = vbios_mode->enh_table->vde + vborder; adjusted_mode->crtc_vblank_end = vbios_mode->enh_table->vt - vborder; @@ -1868,9 +1866,9 @@ static void ast_mode_config_helper_atomic_commit_tail(struct drm_atomic_state *s /* * Concurrent operations could possibly trigger a call to - * drm_connector_helper_funcs.get_modes by reading the display - * modes. Protect access to registers by acquiring the modeset - * lock. + * drm_connector_helper_funcs.get_modes by trying to read the + * display modes. Protect access to I/O registers by acquiring + * the I/O-register lock. Released in atomic_flush(). */ mutex_lock(&ast->ioregs_lock); drm_atomic_helper_commit_tail_rpm(state); diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c b/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c index 24e1e11acf697836ae3f3b8951b03029731a4ecf..8f786592143b6c81e5a434768b51508d5e5f3c73 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c @@ -244,9 +244,7 @@ static const struct hdmi_codec_pdata codec_data = { .ops = &adv7511_codec_ops, .max_i2s_channels = 2, .i2s = 1, - .no_i2s_capture = 1, .spdif = 1, - .no_spdif_capture = 1, }; int adv7511_audio_init(struct device *dev, struct adv7511 *adv7511) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c index 89eed0668bfb24ca1f6e03260a0169cc60410f0d..7457d38622b0c76928d1b6220bfe7ce76759bb98 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c @@ -568,18 +568,15 @@ static int cdns_dsi_check_conf(struct cdns_dsi *dsi, struct phy_configure_opts_mipi_dphy *phy_cfg = &output->phy_opts.mipi_dphy; unsigned long dsi_hss_hsa_hse_hbp; unsigned int nlanes = output->dev->lanes; - int mode_clock = (mode_valid_check ? mode->clock : mode->crtc_clock); int ret; ret = cdns_dsi_mode2cfg(dsi, mode, dsi_cfg, mode_valid_check); if (ret) return ret; - ret = phy_mipi_dphy_get_default_config(mode_clock * 1000, - mipi_dsi_pixel_format_to_bpp(output->dev->format), - nlanes, phy_cfg); - if (ret) - return ret; + phy_mipi_dphy_get_default_config(mode->crtc_clock * 1000, + mipi_dsi_pixel_format_to_bpp(output->dev->format), + nlanes, phy_cfg); ret = cdns_dsi_adjust_phy_config(dsi, dsi_cfg, phy_cfg, mode, mode_valid_check); if (ret) @@ -683,11 +680,6 @@ static void cdns_dsi_bridge_post_disable(struct drm_bridge *bridge) struct cdns_dsi_input *input = bridge_to_cdns_dsi_input(bridge); struct cdns_dsi *dsi = input_to_dsi(input); - dsi->phy_initialized = false; - dsi->link_initialized = false; - phy_power_off(dsi->dphy); - phy_exit(dsi->dphy); - pm_runtime_put(dsi->base.dev); } @@ -769,7 +761,7 @@ static void cdns_dsi_bridge_enable(struct drm_bridge *bridge) struct phy_configure_opts_mipi_dphy *phy_cfg = &output->phy_opts.mipi_dphy; unsigned long tx_byte_period; struct cdns_dsi_cfg dsi_cfg; - u32 tmp, reg_wakeup, div, status; + u32 tmp, reg_wakeup, div; int nlanes; if (WARN_ON(pm_runtime_get_sync(dsi->base.dev) < 0)) @@ -786,19 +778,6 @@ static void cdns_dsi_bridge_enable(struct drm_bridge *bridge) cdns_dsi_hs_init(dsi); cdns_dsi_init_link(dsi); - /* - * Now that the DSI Link and DSI Phy are initialized, - * wait for the CLK and Data Lanes to be ready. - */ - tmp = CLK_LANE_RDY; - for (int i = 0; i < nlanes; i++) - tmp |= DATA_LANE_RDY(i); - - if (readl_poll_timeout(dsi->regs + MCTL_MAIN_STS, status, - (tmp == (status & tmp)), 100, 500000)) - dev_err(dsi->base.dev, - "Timed Out: DSI-DPhy Clock and Data Lanes not ready.\n"); - writel(HBP_LEN(dsi_cfg.hbp) | HSA_LEN(dsi_cfg.hsa), dsi->regs + VID_HSIZE1); writel(HFP_LEN(dsi_cfg.hfp) | HACT_LEN(dsi_cfg.hact), @@ -973,7 +952,7 @@ static int cdns_dsi_attach(struct mipi_dsi_host *host, bridge = drm_panel_bridge_add_typed(panel, DRM_MODE_CONNECTOR_DSI); } else { - bridge = of_drm_find_bridge(np); + bridge = of_drm_find_bridge(dev->dev.of_node); if (!bridge) bridge = ERR_PTR(-EINVAL); } @@ -1173,6 +1152,7 @@ static int __maybe_unused cdns_dsi_suspend(struct device *dev) clk_disable_unprepare(dsi->dsi_sys_clk); clk_disable_unprepare(dsi->dsi_p_clk); reset_control_assert(dsi->dsi_p_rst); + dsi->link_initialized = false; return 0; } diff --git a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c index d458a4f37ac8faa4c865573a6bc5dbace1d3f87e..c41ffd0bc04941f4dc38d063b0794d3a4f1ef1be 100644 --- a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c +++ b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c @@ -962,11 +962,7 @@ static int lt9611uxc_probe(struct i2c_client *client) } } - ret = lt9611uxc_audio_init(dev, lt9611uxc); - if (ret) - goto err_remove_bridge; - - return 0; + return lt9611uxc_audio_init(dev, lt9611uxc); err_remove_bridge: free_irq(client->irq, lt9611uxc); diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c index 59cbff209acd6e3fae174bf12cae50fd4e60bc64..bfbd3fee125671819162d0ccf46184104cc85f2f 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -331,18 +331,12 @@ static void ti_sn65dsi86_enable_comms(struct ti_sn65dsi86 *pdata) * 200 ms. We'll assume that the panel driver will have the hardcoded * delay in its prepare and always disable HPD. * - * For DisplayPort bridge type, we need HPD. So we use the bridge type - * to conditionally disable HPD. - * NOTE: The bridge type is set in ti_sn_bridge_probe() but enable_comms() - * can be called before. So for DisplayPort, HPD will be enabled once - * bridge type is set. We are using bridge type instead of "no-hpd" - * property because it is not used properly in devicetree description - * and hence is unreliable. + * If HPD somehow makes sense on some future panel we'll have to + * change this to be conditional on someone specifying that HPD should + * be used. */ - - if (pdata->bridge.type != DRM_MODE_CONNECTOR_DisplayPort) - regmap_update_bits(pdata->regmap, SN_HPD_DISABLE_REG, HPD_DISABLE, - HPD_DISABLE); + regmap_update_bits(pdata->regmap, SN_HPD_DISABLE_REG, HPD_DISABLE, + HPD_DISABLE); pdata->comms_enabled = true; @@ -430,8 +424,36 @@ static int status_show(struct seq_file *s, void *data) return 0; } + DEFINE_SHOW_ATTRIBUTE(status); +static void ti_sn65dsi86_debugfs_remove(void *data) +{ + debugfs_remove_recursive(data); +} + +static void ti_sn65dsi86_debugfs_init(struct ti_sn65dsi86 *pdata) +{ + struct device *dev = pdata->dev; + struct dentry *debugfs; + int ret; + + debugfs = debugfs_create_dir(dev_name(dev), NULL); + + /* + * We might get an error back if debugfs wasn't enabled in the kernel + * so let's just silently return upon failure. + */ + if (IS_ERR_OR_NULL(debugfs)) + return; + + ret = devm_add_action_or_reset(dev, ti_sn65dsi86_debugfs_remove, debugfs); + if (ret) + return; + + debugfs_create_file("status", 0600, debugfs, pdata, &status_fops); +} + /* ----------------------------------------------------------------------------- * Auxiliary Devices (*not* AUX) */ @@ -1179,14 +1201,9 @@ static enum drm_connector_status ti_sn_bridge_detect(struct drm_bridge *bridge) struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge); int val = 0; - /* - * Runtime reference is grabbed in ti_sn_bridge_hpd_enable() - * as the chip won't report HPD just after being powered on. - * HPD_DEBOUNCED_STATE reflects correct state only after the - * debounce time (~100-400 ms). - */ - + pm_runtime_get_sync(pdata->dev); regmap_read(pdata->regmap, SN_HPD_DISABLE_REG, &val); + pm_runtime_put_autosuspend(pdata->dev); return val & HPD_DEBOUNCED_STATE ? connector_status_connected : connector_status_disconnected; @@ -1200,35 +1217,6 @@ static struct edid *ti_sn_bridge_get_edid(struct drm_bridge *bridge, return drm_get_edid(connector, &pdata->aux.ddc); } -static void ti_sn65dsi86_debugfs_init(struct drm_bridge *bridge, struct dentry *root) -{ - struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge); - struct dentry *debugfs; - - debugfs = debugfs_create_dir(dev_name(pdata->dev), root); - debugfs_create_file("status", 0600, debugfs, pdata, &status_fops); -} - -static void ti_sn_bridge_hpd_enable(struct drm_bridge *bridge) -{ - struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge); - - /* - * Device needs to be powered on before reading the HPD state - * for reliable hpd detection in ti_sn_bridge_detect() due to - * the high debounce time. - */ - - pm_runtime_get_sync(pdata->dev); -} - -static void ti_sn_bridge_hpd_disable(struct drm_bridge *bridge) -{ - struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge); - - pm_runtime_put_autosuspend(pdata->dev); -} - static const struct drm_bridge_funcs ti_sn_bridge_funcs = { .attach = ti_sn_bridge_attach, .detach = ti_sn_bridge_detach, @@ -1242,9 +1230,6 @@ static const struct drm_bridge_funcs ti_sn_bridge_funcs = { .atomic_reset = drm_atomic_helper_bridge_reset, .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, - .debugfs_init = ti_sn65dsi86_debugfs_init, - .hpd_enable = ti_sn_bridge_hpd_enable, - .hpd_disable = ti_sn_bridge_hpd_disable, }; static void ti_sn_bridge_parse_lanes(struct ti_sn65dsi86 *pdata, @@ -1333,26 +1318,8 @@ static int ti_sn_bridge_probe(struct auxiliary_device *adev, pdata->bridge.type = pdata->next_bridge->type == DRM_MODE_CONNECTOR_DisplayPort ? DRM_MODE_CONNECTOR_DisplayPort : DRM_MODE_CONNECTOR_eDP; - if (pdata->bridge.type == DRM_MODE_CONNECTOR_DisplayPort) { - pdata->bridge.ops = DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_DETECT | - DRM_BRIDGE_OP_HPD; - /* - * If comms were already enabled they would have been enabled - * with the wrong value of HPD_DISABLE. Update it now. Comms - * could be enabled if anyone is holding a pm_runtime reference - * (like if a GPIO is in use). Note that in most cases nobody - * is doing AUX channel xfers before the bridge is added so - * HPD doesn't _really_ matter then. The only exception is in - * the eDP case where the panel wants to read the EDID before - * the bridge is added. We always consistently have HPD disabled - * for eDP. - */ - mutex_lock(&pdata->comms_mutex); - if (pdata->comms_enabled) - regmap_update_bits(pdata->regmap, SN_HPD_DISABLE_REG, - HPD_DISABLE, 0); - mutex_unlock(&pdata->comms_mutex); - } + if (pdata->bridge.type == DRM_MODE_CONNECTOR_DisplayPort) + pdata->bridge.ops = DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_DETECT; drm_bridge_add(&pdata->bridge); @@ -1968,6 +1935,8 @@ static int ti_sn65dsi86_probe(struct i2c_client *client) if (ret) return ret; + ti_sn65dsi86_debugfs_init(pdata); + /* * Break ourselves up into a collection of aux devices. The only real * motiviation here is to solve the chicken-and-egg problem of probe diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 1aa59586c8f81a130b447fe2226b874fae2c865f..f3681970887cc87a03830beba1eff5de70d8d3a2 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -573,30 +573,6 @@ mode_valid(struct drm_atomic_state *state) return 0; } -static int drm_atomic_check_valid_clones(struct drm_atomic_state *state, - struct drm_crtc *crtc) -{ - struct drm_encoder *drm_enc; - struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, - crtc); - - drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask) { - if (!drm_enc->possible_clones) { - DRM_DEBUG("enc%d possible_clones is 0\n", drm_enc->base.id); - continue; - } - - if ((crtc_state->encoder_mask & drm_enc->possible_clones) != - crtc_state->encoder_mask) { - DRM_DEBUG("crtc%d failed valid clone check for mask 0x%x\n", - crtc->base.id, crtc_state->encoder_mask); - return -EINVAL; - } - } - - return 0; -} - /** * drm_atomic_helper_check_modeset - validate state object for modeset changes * @dev: DRM device @@ -768,10 +744,6 @@ drm_atomic_helper_check_modeset(struct drm_device *dev, ret = drm_atomic_add_affected_planes(state, crtc); if (ret != 0) return ret; - - ret = drm_atomic_check_valid_clones(state, crtc); - if (ret != 0) - return ret; } /* diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index c6e6e4766c8bf63e948e8e2292a7c8711a04e665..ad872c61aac0e32a3c4186dbf97cc8087f474638 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -6471,7 +6471,6 @@ static void drm_reset_display_info(struct drm_connector *connector) info->has_hdmi_infoframe = false; info->rgb_quant_range_selectable = false; memset(&info->hdmi, 0, sizeof(info->hdmi)); - memset(&connector->hdr_sink_metadata, 0, sizeof(connector->hdr_sink_metadata)); info->edid_hdmi_rgb444_dc_modes = 0; info->edid_hdmi_ycbcr444_dc_modes = 0; diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c index 4ef05c8c75e652de98169c901780fcc06673a72b..1955eaeba0ab7cfc80ca87484db6bcabf0af6ee0 100644 --- a/drivers/gpu/drm/drm_framebuffer.c +++ b/drivers/gpu/drm/drm_framebuffer.c @@ -844,23 +844,11 @@ void drm_framebuffer_free(struct kref *kref) int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb, const struct drm_framebuffer_funcs *funcs) { - unsigned int i; int ret; - bool exists; if (WARN_ON_ONCE(fb->dev != dev || !fb->format)) return -EINVAL; - for (i = 0; i < fb->format->num_planes; i++) { - if (drm_WARN_ON_ONCE(dev, fb->internal_flags & DRM_FRAMEBUFFER_HAS_HANDLE_REF(i))) - fb->internal_flags &= ~DRM_FRAMEBUFFER_HAS_HANDLE_REF(i); - if (fb->obj[i]) { - exists = drm_gem_object_handle_get_if_exists_unlocked(fb->obj[i]); - if (exists) - fb->internal_flags |= DRM_FRAMEBUFFER_HAS_HANDLE_REF(i); - } - } - INIT_LIST_HEAD(&fb->filp_head); fb->funcs = funcs; @@ -869,7 +857,7 @@ int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb, ret = __drm_mode_object_add(dev, &fb->base, DRM_MODE_OBJECT_FB, false, drm_framebuffer_free); if (ret) - goto err; + goto out; mutex_lock(&dev->mode_config.fb_lock); dev->mode_config.num_fb++; @@ -877,16 +865,7 @@ int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb, mutex_unlock(&dev->mode_config.fb_lock); drm_mode_object_register(dev, &fb->base); - - return 0; - -err: - for (i = 0; i < fb->format->num_planes; i++) { - if (fb->internal_flags & DRM_FRAMEBUFFER_HAS_HANDLE_REF(i)) { - drm_gem_object_handle_put_unlocked(fb->obj[i]); - fb->internal_flags &= ~DRM_FRAMEBUFFER_HAS_HANDLE_REF(i); - } - } +out: return ret; } EXPORT_SYMBOL(drm_framebuffer_init); @@ -963,12 +942,6 @@ EXPORT_SYMBOL(drm_framebuffer_unregister_private); void drm_framebuffer_cleanup(struct drm_framebuffer *fb) { struct drm_device *dev = fb->dev; - unsigned int i; - - for (i = 0; i < fb->format->num_planes; i++) { - if (fb->internal_flags & DRM_FRAMEBUFFER_HAS_HANDLE_REF(i)) - drm_gem_object_handle_put_unlocked(fb->obj[i]); - } mutex_lock(&dev->mode_config.fb_lock); list_del(&fb->head); diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index a3370c77e949dc3636a10edf0049d13be0e955f8..deb93f78ce34428fb148666893a2794a6488c066 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -186,46 +186,6 @@ void drm_gem_private_object_fini(struct drm_gem_object *obj) } EXPORT_SYMBOL(drm_gem_private_object_fini); -static void drm_gem_object_handle_get(struct drm_gem_object *obj) -{ - struct drm_device *dev = obj->dev; - - drm_WARN_ON(dev, !mutex_is_locked(&dev->object_name_lock)); - - if (obj->handle_count++ == 0) - drm_gem_object_get(obj); -} - -/** - * drm_gem_object_handle_get_if_exists_unlocked - acquire reference on user-space handle, if any - * @obj: GEM object - * - * Acquires a reference on the GEM buffer object's handle. Required to keep - * the GEM object alive. Call drm_gem_object_handle_put_if_exists_unlocked() - * to release the reference. Does nothing if the buffer object has no handle. - * - * Returns: - * True if a handle exists, or false otherwise - */ -bool drm_gem_object_handle_get_if_exists_unlocked(struct drm_gem_object *obj) -{ - struct drm_device *dev = obj->dev; - - guard(mutex)(&dev->object_name_lock); - - /* - * First ref taken during GEM object creation, if any. Some - * drivers set up internal framebuffers with GEM objects that - * do not have a GEM handle. Hence, this counter can be zero. - */ - if (!obj->handle_count) - return false; - - drm_gem_object_handle_get(obj); - - return true; -} - /** * drm_gem_object_handle_free - release resources bound to userspace handles * @obj: GEM object to clean up. @@ -256,26 +216,20 @@ static void drm_gem_object_exported_dma_buf_free(struct drm_gem_object *obj) } } -/** - * drm_gem_object_handle_put_unlocked - releases reference on user-space handle - * @obj: GEM object - * - * Releases a reference on the GEM buffer object's handle. Possibly releases - * the GEM buffer object and associated dma-buf objects. - */ -void drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj) +static void +drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj) { struct drm_device *dev = obj->dev; bool final = false; - if (drm_WARN_ON(dev, READ_ONCE(obj->handle_count) == 0)) + if (WARN_ON(READ_ONCE(obj->handle_count) == 0)) return; /* - * Must bump handle count first as this may be the last - * ref, in which case the object would disappear before - * we checked for a name. - */ + * Must bump handle count first as this may be the last + * ref, in which case the object would disappear before we + * checked for a name + */ mutex_lock(&dev->object_name_lock); if (--obj->handle_count == 0) { @@ -299,9 +253,6 @@ drm_gem_object_release_handle(int id, void *ptr, void *data) struct drm_file *file_priv = data; struct drm_gem_object *obj = ptr; - if (drm_WARN_ON(obj->dev, !data)) - return 0; - if (obj->funcs->close) obj->funcs->close(obj, file_priv); @@ -412,8 +363,8 @@ drm_gem_handle_create_tail(struct drm_file *file_priv, int ret; WARN_ON(!mutex_is_locked(&dev->object_name_lock)); - - drm_gem_object_handle_get(obj); + if (obj->handle_count++ == 0) + drm_gem_object_get(obj); /* * Get the user-visible handle using idr. Preload and perform @@ -422,7 +373,7 @@ drm_gem_handle_create_tail(struct drm_file *file_priv, idr_preload(GFP_KERNEL); spin_lock(&file_priv->table_lock); - ret = idr_alloc(&file_priv->object_idr, NULL, 1, 0, GFP_NOWAIT); + ret = idr_alloc(&file_priv->object_idr, obj, 1, 0, GFP_NOWAIT); spin_unlock(&file_priv->table_lock); idr_preload_end(); @@ -443,11 +394,6 @@ drm_gem_handle_create_tail(struct drm_file *file_priv, goto err_revoke; } - /* mirrors drm_gem_handle_delete to avoid races */ - spin_lock(&file_priv->table_lock); - obj = idr_replace(&file_priv->object_idr, obj, handle); - WARN_ON(obj != NULL); - spin_unlock(&file_priv->table_lock); *handlep = handle; return 0; diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h index 8d433fe37e8fa878ffca15cbc70468547a93cead..0ef5fc2a61f194607718ccf640b5a99b44d6e614 100644 --- a/drivers/gpu/drm/drm_internal.h +++ b/drivers/gpu/drm/drm_internal.h @@ -155,8 +155,6 @@ void drm_sysfs_lease_event(struct drm_device *dev); /* drm_gem.c */ int drm_gem_init(struct drm_device *dev); -bool drm_gem_object_handle_get_if_exists_unlocked(struct drm_gem_object *obj); -void drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj); int drm_gem_handle_create_tail(struct drm_file *file_priv, struct drm_gem_object *obj, u32 *handlep); diff --git a/drivers/gpu/drm/etnaviv/etnaviv_sched.c b/drivers/gpu/drm/etnaviv/etnaviv_sched.c index a3bd396c9d829d826961597b2f982feef3c429b8..97e406d9ac06f4684f6de64a6e9df002db2bda41 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_sched.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_sched.c @@ -34,7 +34,6 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job *sched_job) { struct etnaviv_gem_submit *submit = to_etnaviv_submit(sched_job); - struct drm_gpu_scheduler *sched = sched_job->sched; struct etnaviv_gpu *gpu = submit->gpu; u32 dma_addr; int change; @@ -77,9 +76,7 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job return DRM_GPU_SCHED_STAT_NOMINAL; out_no_timeout: - spin_lock(&sched->job_list_lock); - list_add(&sched_job->list, &sched->pending_list); - spin_unlock(&sched->job_list_lock); + list_add(&sched_job->list, &sched_job->sched->pending_list); return DRM_GPU_SCHED_STAT_NOMINAL; } diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c index 5f8e5e87d7cd63c89ff650bb0418e1dfbe034a80..0156a5e9443594711d9286f25e0d9ca747a02e7d 100644 --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c @@ -601,10 +601,6 @@ static irqreturn_t decon_irq_handler(int irq, void *dev_id) if (!ctx->drm_dev) goto out; - /* check if crtc and vblank have been initialized properly */ - if (!drm_dev_has_vblank(ctx->drm_dev)) - goto out; - if (!ctx->i80_if) { drm_crtc_handle_vblank(&ctx->crtc->base); diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 341e95269836e08b96592aa70191833ea4cf7f1b..5bdc246f5fad09b39fba9d35ce0dd90763be73a1 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -187,7 +187,6 @@ struct fimd_context { u32 i80ifcon; bool i80_if; bool suspended; - bool dp_clk_enabled; wait_queue_head_t wait_vsync_queue; atomic_t wait_vsync_event; atomic_t win_updated; @@ -1048,18 +1047,7 @@ static void fimd_dp_clock_enable(struct exynos_drm_clk *clk, bool enable) struct fimd_context *ctx = container_of(clk, struct fimd_context, dp_clk); u32 val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE; - - if (enable == ctx->dp_clk_enabled) - return; - - if (enable) - pm_runtime_resume_and_get(ctx->dev); - - ctx->dp_clk_enabled = enable; writel(val, ctx->regs + DP_MIE_CLKCON); - - if (!enable) - pm_runtime_put(ctx->dev); } static const struct exynos_drm_crtc_ops fimd_crtc_ops = { diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 9a894e234f62395cc714da377c3c69ae47dce602..c8b6d0f79c9b41489da1d0eac974f0877f08dd8d 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -1293,12 +1293,6 @@ int intel_dp_rate_select(struct intel_dp *intel_dp, int rate) void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock, u8 *link_bw, u8 *rate_select) { - struct drm_i915_private *i915 = dp_to_i915(intel_dp); - - /* FIXME g4x can't generate an exact 2.7GHz with the 96MHz non-SSC refclk */ - if (IS_G4X(i915) && port_clock == 268800) - port_clock = 270000; - /* eDP 1.4 rate select method. */ if (intel_dp->use_rate_select) { *link_bw = 0; diff --git a/drivers/gpu/drm/i915/gt/intel_gsc.c b/drivers/gpu/drm/i915/gt/intel_gsc.c index 27420ed631d850674856037892ff6b74df04e884..bcc3605158dbde43fbac73bd5dd24c9a873549c0 100644 --- a/drivers/gpu/drm/i915/gt/intel_gsc.c +++ b/drivers/gpu/drm/i915/gt/intel_gsc.c @@ -298,7 +298,7 @@ static void gsc_irq_handler(struct intel_gt *gt, unsigned int intf_id) if (gt->gsc.intf[intf_id].irq < 0) return; - ret = generic_handle_irq_safe(gt->gsc.intf[intf_id].irq); + ret = generic_handle_irq(gt->gsc.intf[intf_id].irq); if (ret) drm_err_ratelimited(>->i915->drm, "error handling GSC irq: %d\n", ret); } diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c index 4eb78895773f6f6b7775e5758030de913d88043b..92085ffd23de0e054ec18583a444eab98a59fc7d 100644 --- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c +++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c @@ -573,6 +573,7 @@ static int ring_context_alloc(struct intel_context *ce) /* One ringbuffer to rule them all */ GEM_BUG_ON(!engine->legacy.ring); ce->ring = engine->legacy.ring; + ce->timeline = intel_timeline_get(engine->legacy.timeline); GEM_BUG_ON(ce->state); if (engine->context_size) { @@ -585,8 +586,6 @@ static int ring_context_alloc(struct intel_context *ce) ce->state = vma; } - ce->timeline = intel_timeline_get(engine->legacy.timeline); - return 0; } diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c index 461aafc2ae9afaa3cbf481d7f0ac439f5c0d2d25..7b1076b5e748c54f068cf66ad75f695134d413d4 100644 --- a/drivers/gpu/drm/i915/i915_pmu.c +++ b/drivers/gpu/drm/i915/i915_pmu.c @@ -101,11 +101,11 @@ static unsigned int config_bit(const u64 config) return other_bit(config); } -static __always_inline u32 config_mask(const u64 config) +static u32 config_mask(const u64 config) { unsigned int bit = config_bit(config); - if (__builtin_constant_p(bit)) + if (__builtin_constant_p(config)) BUILD_BUG_ON(bit > BITS_PER_TYPE(typeof_member(struct i915_pmu, enable)) - 1); @@ -114,7 +114,7 @@ static __always_inline u32 config_mask(const u64 config) BITS_PER_TYPE(typeof_member(struct i915_pmu, enable)) - 1); - return BIT(bit); + return BIT(config_bit(config)); } static bool is_engine_event(struct perf_event *event) diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c index c7ce2c570ad1f8b48d408315a08599be6ce15cea..a9b79888c19316853520f32a3d090b8ab615348f 100644 --- a/drivers/gpu/drm/i915/selftests/i915_request.c +++ b/drivers/gpu/drm/i915/selftests/i915_request.c @@ -73,8 +73,8 @@ static int igt_add_request(void *arg) /* Basic preliminary test to create a request and let it loose! */ request = mock_request(rcs0(i915)->kernel_context, HZ / 10); - if (IS_ERR(request)) - return PTR_ERR(request); + if (!request) + return -ENOMEM; i915_request_add(request); @@ -91,8 +91,8 @@ static int igt_wait_request(void *arg) /* Submit a request, then wait upon it */ request = mock_request(rcs0(i915)->kernel_context, T); - if (IS_ERR(request)) - return PTR_ERR(request); + if (!request) + return -ENOMEM; i915_request_get(request); @@ -160,8 +160,8 @@ static int igt_fence_wait(void *arg) /* Submit a request, treat it as a fence and wait upon it */ request = mock_request(rcs0(i915)->kernel_context, T); - if (IS_ERR(request)) - return PTR_ERR(request); + if (!request) + return -ENOMEM; if (dma_fence_wait_timeout(&request->fence, false, T) != -ETIME) { pr_err("fence wait success before submit (expected timeout)!\n"); @@ -219,8 +219,8 @@ static int igt_request_rewind(void *arg) GEM_BUG_ON(IS_ERR(ce)); request = mock_request(ce, 2 * HZ); intel_context_put(ce); - if (IS_ERR(request)) { - err = PTR_ERR(request); + if (!request) { + err = -ENOMEM; goto err_context_0; } @@ -237,8 +237,8 @@ static int igt_request_rewind(void *arg) GEM_BUG_ON(IS_ERR(ce)); vip = mock_request(ce, 0); intel_context_put(ce); - if (IS_ERR(vip)) { - err = PTR_ERR(vip); + if (!vip) { + err = -ENOMEM; goto err_context_1; } diff --git a/drivers/gpu/drm/i915/selftests/mock_request.c b/drivers/gpu/drm/i915/selftests/mock_request.c index 1b0cf073e9643ff4569d45ffaac91644800f81ab..09f747228dff575a1fd7684cc8d348b949fc9b64 100644 --- a/drivers/gpu/drm/i915/selftests/mock_request.c +++ b/drivers/gpu/drm/i915/selftests/mock_request.c @@ -35,7 +35,7 @@ mock_request(struct intel_context *ce, unsigned long delay) /* NB the i915->requests slab cache is enlarged to fit mock_request */ request = intel_context_create_request(ce); if (IS_ERR(request)) - return request; + return NULL; request->mock.delay = delay; return request; diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c index ef4fa70119de1a4cae7dff3422462fa527e2f3f1..8b41a07c3641f5703ee84d1b9a66cb3dd7b2ba8e 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c @@ -431,7 +431,7 @@ static int mtk_drm_kms_init(struct drm_device *drm) ret = drmm_mode_config_init(drm); if (ret) - return ret; + goto put_mutex_dev; drm->mode_config.min_width = 64; drm->mode_config.min_height = 64; @@ -449,11 +449,8 @@ static int mtk_drm_kms_init(struct drm_device *drm) for (i = 0; i < private->data->mmsys_dev_num; i++) { drm->dev_private = private->all_drm_private[i]; ret = component_bind_all(private->all_drm_private[i]->dev, drm); - if (ret) { - while (--i >= 0) - component_unbind_all(private->all_drm_private[i]->dev, drm); - return ret; - } + if (ret) + goto put_mutex_dev; } /* @@ -535,6 +532,9 @@ static int mtk_drm_kms_init(struct drm_device *drm) err_component_unbind: for (i = 0; i < private->data->mmsys_dev_num; i++) component_unbind_all(private->all_drm_private[i]->dev, drm); +put_mutex_dev: + for (i = 0; i < private->data->mmsys_dev_num; i++) + put_device(private->all_drm_private[i]->mutex_dev); return ret; } @@ -608,10 +608,8 @@ static int mtk_drm_bind(struct device *dev) return 0; drm = drm_dev_alloc(&mtk_drm_driver, dev); - if (IS_ERR(drm)) { - ret = PTR_ERR(drm); - goto err_put_dev; - } + if (IS_ERR(drm)) + return PTR_ERR(drm); private->drm_master = true; drm->dev_private = private; @@ -637,31 +635,18 @@ static int mtk_drm_bind(struct device *dev) drm_dev_put(drm); for (i = 0; i < private->data->mmsys_dev_num; i++) private->all_drm_private[i]->drm = NULL; -err_put_dev: - for (i = 0; i < private->data->mmsys_dev_num; i++) { - /* For device_find_child in mtk_drm_get_all_priv() */ - put_device(private->all_drm_private[i]->dev); - } - put_device(private->mutex_dev); return ret; } static void mtk_drm_unbind(struct device *dev) { struct mtk_drm_private *private = dev_get_drvdata(dev); - int i; /* for multi mmsys dev, unregister drm dev in mmsys master */ if (private->drm_master) { drm_dev_unregister(private->drm); mtk_drm_kms_deinit(private->drm); drm_dev_put(private->drm); - - for (i = 0; i < private->data->mmsys_dev_num; i++) { - /* For device_find_child in mtk_drm_get_all_priv() */ - put_device(private->all_drm_private[i]->dev); - } - put_device(private->mutex_dev); } private->mtk_drm_bound = false; private->drm_master = false; diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c index 27441e571630040164d8b73b8a6d89ba921ee5ce..095f634ff7c79910b3da608a01d3f95ce714280e 100644 --- a/drivers/gpu/drm/meson/meson_drv.c +++ b/drivers/gpu/drm/meson/meson_drv.c @@ -168,7 +168,7 @@ static const struct meson_drm_soc_attr meson_drm_soc_attrs[] = { /* S805X/S805Y HDMI PLL won't lock for HDMI PHY freq > 1,65GHz */ { .limits = { - .max_hdmi_phy_freq = 1650000000, + .max_hdmi_phy_freq = 1650000, }, .attrs = (const struct soc_device_attribute []) { { .soc_id = "GXL (S805*)", }, diff --git a/drivers/gpu/drm/meson/meson_drv.h b/drivers/gpu/drm/meson/meson_drv.h index be4b0e4df6e13e0826761faff9a5f05cd67bbbef..3f9345c14f31c13b071f420533fe8a450d3e0f36 100644 --- a/drivers/gpu/drm/meson/meson_drv.h +++ b/drivers/gpu/drm/meson/meson_drv.h @@ -37,7 +37,7 @@ struct meson_drm_match_data { }; struct meson_drm_soc_limits { - unsigned long long max_hdmi_phy_freq; + unsigned int max_hdmi_phy_freq; }; struct meson_drm { diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c index 0b7e8e0ba4fc138598c7371dba85972996b90e85..c4686568c9ca5d81b4066315681263e0fbd848a2 100644 --- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c +++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c @@ -70,12 +70,12 @@ static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi, { struct meson_drm *priv = encoder_hdmi->priv; int vic = drm_match_cea_mode(mode); - unsigned long long phy_freq; - unsigned long long vclk_freq; - unsigned long long venc_freq; - unsigned long long hdmi_freq; + unsigned int phy_freq; + unsigned int vclk_freq; + unsigned int venc_freq; + unsigned int hdmi_freq; - vclk_freq = mode->clock * 1000ULL; + vclk_freq = mode->clock; /* For 420, pixel clock is half unlike venc clock */ if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYYVYY8_0_5X24) @@ -107,8 +107,7 @@ static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi, if (mode->flags & DRM_MODE_FLAG_DBLCLK) venc_freq /= 2; - dev_dbg(priv->dev, - "phy:%lluHz vclk=%lluHz venc=%lluHz hdmi=%lluHz enci=%d\n", + dev_dbg(priv->dev, "vclk:%d phy=%d venc=%d hdmi=%d enci=%d\n", phy_freq, vclk_freq, venc_freq, hdmi_freq, priv->venc.hdmi_use_enci); @@ -123,11 +122,10 @@ static enum drm_mode_status meson_encoder_hdmi_mode_valid(struct drm_bridge *bri struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge); struct meson_drm *priv = encoder_hdmi->priv; bool is_hdmi2_sink = display_info->hdmi.scdc.supported; - unsigned long long clock = mode->clock * 1000ULL; - unsigned long long phy_freq; - unsigned long long vclk_freq; - unsigned long long venc_freq; - unsigned long long hdmi_freq; + unsigned int phy_freq; + unsigned int vclk_freq; + unsigned int venc_freq; + unsigned int hdmi_freq; int vic = drm_match_cea_mode(mode); enum drm_mode_status status; @@ -146,12 +144,12 @@ static enum drm_mode_status meson_encoder_hdmi_mode_valid(struct drm_bridge *bri if (status != MODE_OK) return status; - return meson_vclk_dmt_supported_freq(priv, clock); + return meson_vclk_dmt_supported_freq(priv, mode->clock); /* Check against supported VIC modes */ } else if (!meson_venc_hdmi_supported_vic(vic)) return MODE_BAD; - vclk_freq = clock; + vclk_freq = mode->clock; /* For 420, pixel clock is half unlike venc clock */ if (drm_mode_is_420_only(display_info, mode) || @@ -181,8 +179,7 @@ static enum drm_mode_status meson_encoder_hdmi_mode_valid(struct drm_bridge *bri if (mode->flags & DRM_MODE_FLAG_DBLCLK) venc_freq /= 2; - dev_dbg(priv->dev, - "%s: vclk:%lluHz phy=%lluHz venc=%lluHz hdmi=%lluHz\n", + dev_dbg(priv->dev, "%s: vclk:%d phy=%d venc=%d hdmi=%d\n", __func__, phy_freq, vclk_freq, venc_freq, hdmi_freq); return meson_vclk_vic_supported_freq(priv, phy_freq, vclk_freq); diff --git a/drivers/gpu/drm/meson/meson_vclk.c b/drivers/gpu/drm/meson/meson_vclk.c index dfe0c28a0f054c7274be1805d8d23f1c862873ea..2a82119eb58ed847061d27fa3b1c182ba520e0ff 100644 --- a/drivers/gpu/drm/meson/meson_vclk.c +++ b/drivers/gpu/drm/meson/meson_vclk.c @@ -110,7 +110,7 @@ #define HDMI_PLL_LOCK BIT(31) #define HDMI_PLL_LOCK_G12A (3 << 30) -#define FREQ_1000_1001(_freq) DIV_ROUND_CLOSEST_ULL((_freq) * 1000ULL, 1001ULL) +#define FREQ_1000_1001(_freq) DIV_ROUND_CLOSEST(_freq * 1000, 1001) /* VID PLL Dividers */ enum { @@ -360,11 +360,11 @@ enum { }; struct meson_vclk_params { - unsigned long long pll_freq; - unsigned long long phy_freq; - unsigned long long vclk_freq; - unsigned long long venc_freq; - unsigned long long pixel_freq; + unsigned int pll_freq; + unsigned int phy_freq; + unsigned int vclk_freq; + unsigned int venc_freq; + unsigned int pixel_freq; unsigned int pll_od1; unsigned int pll_od2; unsigned int pll_od3; @@ -372,11 +372,11 @@ struct meson_vclk_params { unsigned int vclk_div; } params[] = { [MESON_VCLK_HDMI_ENCI_54000] = { - .pll_freq = 4320000000, - .phy_freq = 270000000, - .vclk_freq = 54000000, - .venc_freq = 54000000, - .pixel_freq = 54000000, + .pll_freq = 4320000, + .phy_freq = 270000, + .vclk_freq = 54000, + .venc_freq = 54000, + .pixel_freq = 54000, .pll_od1 = 4, .pll_od2 = 4, .pll_od3 = 1, @@ -384,11 +384,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_DDR_54000] = { - .pll_freq = 4320000000, - .phy_freq = 270000000, - .vclk_freq = 54000000, - .venc_freq = 54000000, - .pixel_freq = 27000000, + .pll_freq = 4320000, + .phy_freq = 270000, + .vclk_freq = 54000, + .venc_freq = 54000, + .pixel_freq = 27000, .pll_od1 = 4, .pll_od2 = 4, .pll_od3 = 1, @@ -396,11 +396,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_DDR_148500] = { - .pll_freq = 2970000000, - .phy_freq = 742500000, - .vclk_freq = 148500000, - .venc_freq = 148500000, - .pixel_freq = 74250000, + .pll_freq = 2970000, + .phy_freq = 742500, + .vclk_freq = 148500, + .venc_freq = 148500, + .pixel_freq = 74250, .pll_od1 = 4, .pll_od2 = 1, .pll_od3 = 1, @@ -408,11 +408,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_74250] = { - .pll_freq = 2970000000, - .phy_freq = 742500000, - .vclk_freq = 74250000, - .venc_freq = 74250000, - .pixel_freq = 74250000, + .pll_freq = 2970000, + .phy_freq = 742500, + .vclk_freq = 74250, + .venc_freq = 74250, + .pixel_freq = 74250, .pll_od1 = 2, .pll_od2 = 2, .pll_od3 = 2, @@ -420,11 +420,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_148500] = { - .pll_freq = 2970000000, - .phy_freq = 1485000000, - .vclk_freq = 148500000, - .venc_freq = 148500000, - .pixel_freq = 148500000, + .pll_freq = 2970000, + .phy_freq = 1485000, + .vclk_freq = 148500, + .venc_freq = 148500, + .pixel_freq = 148500, .pll_od1 = 1, .pll_od2 = 2, .pll_od3 = 2, @@ -432,11 +432,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_297000] = { - .pll_freq = 5940000000, - .phy_freq = 2970000000, - .venc_freq = 297000000, - .vclk_freq = 297000000, - .pixel_freq = 297000000, + .pll_freq = 5940000, + .phy_freq = 2970000, + .venc_freq = 297000, + .vclk_freq = 297000, + .pixel_freq = 297000, .pll_od1 = 2, .pll_od2 = 1, .pll_od3 = 1, @@ -444,11 +444,11 @@ struct meson_vclk_params { .vclk_div = 2, }, [MESON_VCLK_HDMI_594000] = { - .pll_freq = 5940000000, - .phy_freq = 5940000000, - .venc_freq = 594000000, - .vclk_freq = 594000000, - .pixel_freq = 594000000, + .pll_freq = 5940000, + .phy_freq = 5940000, + .venc_freq = 594000, + .vclk_freq = 594000, + .pixel_freq = 594000, .pll_od1 = 1, .pll_od2 = 1, .pll_od3 = 2, @@ -456,11 +456,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_594000_YUV420] = { - .pll_freq = 5940000000, - .phy_freq = 2970000000, - .venc_freq = 594000000, - .vclk_freq = 594000000, - .pixel_freq = 297000000, + .pll_freq = 5940000, + .phy_freq = 2970000, + .venc_freq = 594000, + .vclk_freq = 594000, + .pixel_freq = 297000, .pll_od1 = 2, .pll_od2 = 1, .pll_od3 = 1, @@ -617,16 +617,16 @@ static void meson_hdmi_pll_set_params(struct meson_drm *priv, unsigned int m, 3 << 20, pll_od_to_reg(od3) << 20); } -#define XTAL_FREQ (24 * 1000 * 1000) +#define XTAL_FREQ 24000 static unsigned int meson_hdmi_pll_get_m(struct meson_drm *priv, - unsigned long long pll_freq) + unsigned int pll_freq) { /* The GXBB PLL has a /2 pre-multiplier */ if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) - pll_freq = DIV_ROUND_DOWN_ULL(pll_freq, 2); + pll_freq /= 2; - return DIV_ROUND_DOWN_ULL(pll_freq, XTAL_FREQ); + return pll_freq / XTAL_FREQ; } #define HDMI_FRAC_MAX_GXBB 4096 @@ -635,13 +635,12 @@ static unsigned int meson_hdmi_pll_get_m(struct meson_drm *priv, static unsigned int meson_hdmi_pll_get_frac(struct meson_drm *priv, unsigned int m, - unsigned long long pll_freq) + unsigned int pll_freq) { - unsigned long long parent_freq = XTAL_FREQ; + unsigned int parent_freq = XTAL_FREQ; unsigned int frac_max = HDMI_FRAC_MAX_GXL; unsigned int frac_m; unsigned int frac; - u32 remainder; /* The GXBB PLL has a /2 pre-multiplier and a larger FRAC width */ if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { @@ -653,11 +652,11 @@ static unsigned int meson_hdmi_pll_get_frac(struct meson_drm *priv, frac_max = HDMI_FRAC_MAX_G12A; /* We can have a perfect match !*/ - if (div_u64_rem(pll_freq, m, &remainder) == parent_freq && - remainder == 0) + if (pll_freq / m == parent_freq && + pll_freq % m == 0) return 0; - frac = mul_u64_u64_div_u64(pll_freq, frac_max, parent_freq); + frac = div_u64((u64)pll_freq * (u64)frac_max, parent_freq); frac_m = m * frac_max; if (frac_m > frac) return frac_max; @@ -667,7 +666,7 @@ static unsigned int meson_hdmi_pll_get_frac(struct meson_drm *priv, } static bool meson_hdmi_pll_validate_params(struct meson_drm *priv, - unsigned long long m, + unsigned int m, unsigned int frac) { if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { @@ -695,7 +694,7 @@ static bool meson_hdmi_pll_validate_params(struct meson_drm *priv, } static bool meson_hdmi_pll_find_params(struct meson_drm *priv, - unsigned long long freq, + unsigned int freq, unsigned int *m, unsigned int *frac, unsigned int *od) @@ -707,7 +706,7 @@ static bool meson_hdmi_pll_find_params(struct meson_drm *priv, continue; *frac = meson_hdmi_pll_get_frac(priv, *m, freq * *od); - DRM_DEBUG_DRIVER("PLL params for %lluHz: m=%x frac=%x od=%d\n", + DRM_DEBUG_DRIVER("PLL params for %dkHz: m=%x frac=%x od=%d\n", freq, *m, *frac, *od); if (meson_hdmi_pll_validate_params(priv, *m, *frac)) @@ -719,7 +718,7 @@ static bool meson_hdmi_pll_find_params(struct meson_drm *priv, /* pll_freq is the frequency after the OD dividers */ enum drm_mode_status -meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned long long freq) +meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned int freq) { unsigned int od, m, frac; @@ -742,7 +741,7 @@ EXPORT_SYMBOL_GPL(meson_vclk_dmt_supported_freq); /* pll_freq is the frequency after the OD dividers */ static void meson_hdmi_pll_generic_set(struct meson_drm *priv, - unsigned long long pll_freq) + unsigned int pll_freq) { unsigned int od, m, frac, od1, od2, od3; @@ -757,7 +756,7 @@ static void meson_hdmi_pll_generic_set(struct meson_drm *priv, od1 = od / od2; } - DRM_DEBUG_DRIVER("PLL params for %lluHz: m=%x frac=%x od=%d/%d/%d\n", + DRM_DEBUG_DRIVER("PLL params for %dkHz: m=%x frac=%x od=%d/%d/%d\n", pll_freq, m, frac, od1, od2, od3); meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3); @@ -765,48 +764,17 @@ static void meson_hdmi_pll_generic_set(struct meson_drm *priv, return; } - DRM_ERROR("Fatal, unable to find parameters for PLL freq %lluHz\n", + DRM_ERROR("Fatal, unable to find parameters for PLL freq %d\n", pll_freq); } -static bool meson_vclk_freqs_are_matching_param(unsigned int idx, - unsigned long long phy_freq, - unsigned long long vclk_freq) -{ - DRM_DEBUG_DRIVER("i = %d vclk_freq = %lluHz alt = %lluHz\n", - idx, params[idx].vclk_freq, - FREQ_1000_1001(params[idx].vclk_freq)); - DRM_DEBUG_DRIVER("i = %d phy_freq = %lluHz alt = %lluHz\n", - idx, params[idx].phy_freq, - FREQ_1000_1001(params[idx].phy_freq)); - - /* Match strict frequency */ - if (phy_freq == params[idx].phy_freq && - vclk_freq == params[idx].vclk_freq) - return true; - - /* Match 1000/1001 variant: vclk deviation has to be less than 1kHz - * (drm EDID is defined in 1kHz steps, so everything smaller must be - * rounding error) and the PHY freq deviation has to be less than - * 10kHz (as the TMDS clock is 10 times the pixel clock, so anything - * smaller must be rounding error as well). - */ - if (abs(vclk_freq - FREQ_1000_1001(params[idx].vclk_freq)) < 1000 && - abs(phy_freq - FREQ_1000_1001(params[idx].phy_freq)) < 10000) - return true; - - /* no match */ - return false; -} - enum drm_mode_status -meson_vclk_vic_supported_freq(struct meson_drm *priv, - unsigned long long phy_freq, - unsigned long long vclk_freq) +meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq, + unsigned int vclk_freq) { int i; - DRM_DEBUG_DRIVER("phy_freq = %lluHz vclk_freq = %lluHz\n", + DRM_DEBUG_DRIVER("phy_freq = %d vclk_freq = %d\n", phy_freq, vclk_freq); /* Check against soc revision/package limits */ @@ -817,7 +785,19 @@ meson_vclk_vic_supported_freq(struct meson_drm *priv, } for (i = 0 ; params[i].pixel_freq ; ++i) { - if (meson_vclk_freqs_are_matching_param(i, phy_freq, vclk_freq)) + DRM_DEBUG_DRIVER("i = %d pixel_freq = %d alt = %d\n", + i, params[i].pixel_freq, + FREQ_1000_1001(params[i].pixel_freq)); + DRM_DEBUG_DRIVER("i = %d phy_freq = %d alt = %d\n", + i, params[i].phy_freq, + FREQ_1000_1001(params[i].phy_freq/10)*10); + /* Match strict frequency */ + if (phy_freq == params[i].phy_freq && + vclk_freq == params[i].vclk_freq) + return MODE_OK; + /* Match 1000/1001 variant */ + if (phy_freq == (FREQ_1000_1001(params[i].phy_freq/10)*10) && + vclk_freq == FREQ_1000_1001(params[i].vclk_freq)) return MODE_OK; } @@ -825,9 +805,8 @@ meson_vclk_vic_supported_freq(struct meson_drm *priv, } EXPORT_SYMBOL_GPL(meson_vclk_vic_supported_freq); -static void meson_vclk_set(struct meson_drm *priv, - unsigned long long pll_base_freq, unsigned int od1, - unsigned int od2, unsigned int od3, +static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq, + unsigned int od1, unsigned int od2, unsigned int od3, unsigned int vid_pll_div, unsigned int vclk_div, unsigned int hdmi_tx_div, unsigned int venc_div, bool hdmi_use_enci, bool vic_alternate_clock) @@ -847,15 +826,15 @@ static void meson_vclk_set(struct meson_drm *priv, meson_hdmi_pll_generic_set(priv, pll_base_freq); } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { switch (pll_base_freq) { - case 2970000000: + case 2970000: m = 0x3d; frac = vic_alternate_clock ? 0xd02 : 0xe00; break; - case 4320000000: + case 4320000: m = vic_alternate_clock ? 0x59 : 0x5a; frac = vic_alternate_clock ? 0xe8f : 0; break; - case 5940000000: + case 5940000: m = 0x7b; frac = vic_alternate_clock ? 0xa05 : 0xc00; break; @@ -865,15 +844,15 @@ static void meson_vclk_set(struct meson_drm *priv, } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXM) || meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXL)) { switch (pll_base_freq) { - case 2970000000: + case 2970000: m = 0x7b; frac = vic_alternate_clock ? 0x281 : 0x300; break; - case 4320000000: + case 4320000: m = vic_alternate_clock ? 0xb3 : 0xb4; frac = vic_alternate_clock ? 0x347 : 0; break; - case 5940000000: + case 5940000: m = 0xf7; frac = vic_alternate_clock ? 0x102 : 0x200; break; @@ -882,15 +861,15 @@ static void meson_vclk_set(struct meson_drm *priv, meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3); } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A)) { switch (pll_base_freq) { - case 2970000000: + case 2970000: m = 0x7b; frac = vic_alternate_clock ? 0x140b4 : 0x18000; break; - case 4320000000: + case 4320000: m = vic_alternate_clock ? 0xb3 : 0xb4; frac = vic_alternate_clock ? 0x1a3ee : 0; break; - case 5940000000: + case 5940000: m = 0xf7; frac = vic_alternate_clock ? 0x8148 : 0x10000; break; @@ -1046,14 +1025,14 @@ static void meson_vclk_set(struct meson_drm *priv, } void meson_vclk_setup(struct meson_drm *priv, unsigned int target, - unsigned long long phy_freq, unsigned long long vclk_freq, - unsigned long long venc_freq, unsigned long long dac_freq, + unsigned int phy_freq, unsigned int vclk_freq, + unsigned int venc_freq, unsigned int dac_freq, bool hdmi_use_enci) { bool vic_alternate_clock = false; - unsigned long long freq; - unsigned long long hdmi_tx_div; - unsigned long long venc_div; + unsigned int freq; + unsigned int hdmi_tx_div; + unsigned int venc_div; if (target == MESON_VCLK_TARGET_CVBS) { meson_venci_cvbs_clock_config(priv); @@ -1073,25 +1052,27 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target, return; } - hdmi_tx_div = DIV_ROUND_DOWN_ULL(vclk_freq, dac_freq); + hdmi_tx_div = vclk_freq / dac_freq; if (hdmi_tx_div == 0) { - pr_err("Fatal Error, invalid HDMI-TX freq %lluHz\n", + pr_err("Fatal Error, invalid HDMI-TX freq %d\n", dac_freq); return; } - venc_div = DIV_ROUND_DOWN_ULL(vclk_freq, venc_freq); + venc_div = vclk_freq / venc_freq; if (venc_div == 0) { - pr_err("Fatal Error, invalid HDMI venc freq %lluHz\n", + pr_err("Fatal Error, invalid HDMI venc freq %d\n", venc_freq); return; } for (freq = 0 ; params[freq].pixel_freq ; ++freq) { - if (meson_vclk_freqs_are_matching_param(freq, phy_freq, - vclk_freq)) { + if ((phy_freq == params[freq].phy_freq || + phy_freq == FREQ_1000_1001(params[freq].phy_freq/10)*10) && + (vclk_freq == params[freq].vclk_freq || + vclk_freq == FREQ_1000_1001(params[freq].vclk_freq))) { if (vclk_freq != params[freq].vclk_freq) vic_alternate_clock = true; else @@ -1117,8 +1098,7 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target, } if (!params[freq].pixel_freq) { - pr_err("Fatal Error, invalid HDMI vclk freq %lluHz\n", - vclk_freq); + pr_err("Fatal Error, invalid HDMI vclk freq %d\n", vclk_freq); return; } diff --git a/drivers/gpu/drm/meson/meson_vclk.h b/drivers/gpu/drm/meson/meson_vclk.h index 7ac55744e5749440c8755b8714edbb2e160602c3..60617aaf18dd1cedfab315cecb7d435e0d121e41 100644 --- a/drivers/gpu/drm/meson/meson_vclk.h +++ b/drivers/gpu/drm/meson/meson_vclk.h @@ -20,18 +20,17 @@ enum { }; /* 27MHz is the CVBS Pixel Clock */ -#define MESON_VCLK_CVBS (27 * 1000 * 1000) +#define MESON_VCLK_CVBS 27000 enum drm_mode_status -meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned long long freq); +meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned int freq); enum drm_mode_status -meson_vclk_vic_supported_freq(struct meson_drm *priv, - unsigned long long phy_freq, - unsigned long long vclk_freq); +meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq, + unsigned int vclk_freq); void meson_vclk_setup(struct meson_drm *priv, unsigned int target, - unsigned long long phy_freq, unsigned long long vclk_freq, - unsigned long long venc_freq, unsigned long long dac_freq, + unsigned int phy_freq, unsigned int vclk_freq, + unsigned int venc_freq, unsigned int dac_freq, bool hdmi_use_enci); #endif /* __MESON_VCLK_H */ diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c index 2cda9bbf68f965a39582528b8654c9d2c7d5a4ac..20c8b9af7a2199b4d1d6fa8c978f067e3e23f706 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c @@ -93,21 +93,17 @@ static void drm_mode_to_intf_timing_params( timing->vsync_polarity = 0; } - timing->wide_bus_en = dpu_encoder_is_widebus_enabled(phys_enc->parent); - timing->compression_en = dpu_encoder_is_dsc_enabled(phys_enc->parent); - - /* - * For DP/EDP, Shift timings to align it to bottom right. - * wide_bus_en is set for everything excluding SDM845 & - * porch changes cause DisplayPort failure and HDMI tearing. - */ - if (phys_enc->hw_intf->cap->type == INTF_DP && timing->wide_bus_en) { + /* for DP/EDP, Shift timings to align it to bottom right */ + if (phys_enc->hw_intf->cap->type == INTF_DP) { timing->h_back_porch += timing->h_front_porch; timing->h_front_porch = 0; timing->v_back_porch += timing->v_front_porch; timing->v_front_porch = 0; } + timing->wide_bus_en = dpu_encoder_is_widebus_enabled(phys_enc->parent); + timing->compression_en = dpu_encoder_is_dsc_enabled(phys_enc->parent); + /* * for DP, divide the horizonal parameters by 2 when * widebus is enabled diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c index 1c111969342a77ab6ce324cf21d875e302f2db89..27b592c776a300de9ada408615add978d6345ed1 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c @@ -716,13 +716,6 @@ static int dsi_pll_10nm_init(struct msm_dsi_phy *phy) /* TODO: Remove this when we have proper display handover support */ msm_dsi_phy_pll_save_state(phy); - /* - * Store also proper vco_current_rate, because its value will be used in - * dsi_10nm_pll_restore_state(). - */ - if (!dsi_pll_10nm_vco_recalc_rate(&pll_10nm->clk_hw, VCO_REF_CLK_RATE)) - pll_10nm->vco_current_rate = pll_10nm->phy->cfg->min_pll_rate; - return 0; } diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index bbe4f1665b6039f6fbdf9e7bcfd3157621863aa3..018b39546fc1dd9751346be72dcc33a64943eabe 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -85,15 +85,6 @@ void __msm_gem_submit_destroy(struct kref *kref) container_of(kref, struct msm_gem_submit, ref); unsigned i; - /* - * In error paths, we could unref the submit without calling - * drm_sched_entity_push_job(), so msm_job_free() will never - * get called. Since drm_sched_job_cleanup() will NULL out - * s_fence, we can use that to detect this case. - */ - if (submit->base.s_fence) - drm_sched_job_cleanup(&submit->base); - if (submit->fence_id) { spin_lock(&submit->queue->idr_lock); idr_remove(&submit->queue->fence_idr, submit->fence_id); @@ -763,7 +754,6 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, struct msm_ringbuffer *ring; struct msm_submit_post_dep *post_deps = NULL; struct drm_syncobj **syncobjs_to_reset = NULL; - struct sync_file *sync_file = NULL; int out_fence_fd = -1; bool has_ww_ticket = false; unsigned i; @@ -980,7 +970,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, } if (ret == 0 && args->flags & MSM_SUBMIT_FENCE_FD_OUT) { - sync_file = sync_file_create(submit->user_fence); + struct sync_file *sync_file = sync_file_create(submit->user_fence); if (!sync_file) { ret = -ENOMEM; } else { @@ -1013,11 +1003,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, out_unlock: mutex_unlock(&queue->lock); out_post_unlock: - if (ret && (out_fence_fd >= 0)) { + if (ret && (out_fence_fd >= 0)) put_unused_fd(out_fence_fd); - if (sync_file) - fput(sync_file->file); - } if (!IS_ERR_OR_NULL(submit)) { msm_gem_submit_put(submit); diff --git a/drivers/gpu/drm/msm/msm_gpu_devfreq.c b/drivers/gpu/drm/msm/msm_gpu_devfreq.c index 2e1d5c3432728cde15d91f69da22bb915588fe86..6970b0f7f457c8535ecfeaa705db871594ae5fc4 100644 --- a/drivers/gpu/drm/msm/msm_gpu_devfreq.c +++ b/drivers/gpu/drm/msm/msm_gpu_devfreq.c @@ -156,7 +156,6 @@ void msm_devfreq_init(struct msm_gpu *gpu) priv->gpu_devfreq_config.downdifferential = 10; mutex_init(&df->lock); - df->suspended = true; ret = dev_pm_qos_add_request(&gpu->pdev->dev, &df->boost_freq, DEV_PM_QOS_MIN_FREQUENCY, 0); diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c index 4e6f305c9e504d57b64119283a61b623aef276cc..91b5ecc57538083f7be573fbc25ec3a91ce0c9dd 100644 --- a/drivers/gpu/drm/nouveau/nouveau_backlight.c +++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c @@ -42,7 +42,7 @@ #include "nouveau_acpi.h" static struct ida bl_ida; -#define BL_NAME_SIZE 24 // 12 for name + 11 for digits + 1 for '\0' +#define BL_NAME_SIZE 15 // 12 for name + 2 for digits + 1 for '\0' static bool nouveau_get_backlight_name(char backlight_name[BL_NAME_SIZE], diff --git a/drivers/gpu/drm/panel/panel-edp.c b/drivers/gpu/drm/panel/panel-edp.c index 53b3b24d7d7c05508708574c1ebeefe97c1ca882..94fe2f3836a9a3c6e5eefd68b1ec521bfc500ae1 100644 --- a/drivers/gpu/drm/panel/panel-edp.c +++ b/drivers/gpu/drm/panel/panel-edp.c @@ -1923,7 +1923,6 @@ static const struct edp_panel_entry edp_panels[] = { EDP_PANEL_ENTRY('S', 'H', 'P', 0x1523, &sharp_lq140m1jw46.delay, "LQ140M1JW46"), EDP_PANEL_ENTRY('S', 'H', 'P', 0x154c, &delay_200_500_p2e100, "LQ116M1JW10"), - EDP_PANEL_ENTRY('S', 'T', 'A', 0x0004, &delay_200_500_e200, "116KHD024006"), EDP_PANEL_ENTRY('S', 'T', 'A', 0x0100, &delay_100_500_e200, "2081116HHD028001-51D"), { /* sentinal */ } diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c index 4c8fe83dd6101b657d0d8020e54fdeeafc57909b..70d8ad065bfa1df87dbcbce16795d5ab07469810 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c @@ -705,7 +705,7 @@ static int rcar_du_vsps_init(struct rcar_du_device *rcdu) ret = of_parse_phandle_with_fixed_args(np, vsps_prop_name, cells, i, &args); if (ret < 0) - goto done; + goto error; /* * Add the VSP to the list or update the corresponding existing @@ -743,11 +743,13 @@ static int rcar_du_vsps_init(struct rcar_du_device *rcdu) vsp->dev = rcdu; ret = rcar_du_vsp_init(vsp, vsps[i].np, vsps[i].crtcs_mask); - if (ret) - goto done; + if (ret < 0) + goto error; } -done: + return 0; + +error: for (i = 0; i < ARRAY_SIZE(vsps); ++i) of_node_put(vsps[i].np); diff --git a/drivers/gpu/drm/scheduler/sched_entity.c b/drivers/gpu/drm/scheduler/sched_entity.c index 245a1ef5278e88687917bfa1efbfff6e2304a40f..53130a50584ca09ccc740315c45cc4bfb431f173 100644 --- a/drivers/gpu/drm/scheduler/sched_entity.c +++ b/drivers/gpu/drm/scheduler/sched_entity.c @@ -167,7 +167,6 @@ static void drm_sched_entity_kill_jobs_work(struct work_struct *wrk) { struct drm_sched_job *job = container_of(wrk, typeof(*job), work); - drm_sched_fence_scheduled(job->s_fence, NULL); drm_sched_fence_finished(job->s_fence, -ESRCH); WARN_ON(job->s_fence->parent); job->sched->ops->free_job(job); @@ -346,9 +345,20 @@ void drm_sched_entity_destroy(struct drm_sched_entity *entity) } EXPORT_SYMBOL(drm_sched_entity_destroy); +/* drm_sched_entity_clear_dep - callback to clear the entities dependency */ +static void drm_sched_entity_clear_dep(struct dma_fence *f, + struct dma_fence_cb *cb) +{ + struct drm_sched_entity *entity = + container_of(cb, struct drm_sched_entity, cb); + + entity->dependency = NULL; + dma_fence_put(f); +} + /* - * drm_sched_entity_wakeup - callback to clear the entity's dependency and - * wake up the scheduler + * drm_sched_entity_clear_dep - callback to clear the entities dependency and + * wake up scheduler */ static void drm_sched_entity_wakeup(struct dma_fence *f, struct dma_fence_cb *cb) @@ -356,8 +366,7 @@ static void drm_sched_entity_wakeup(struct dma_fence *f, struct drm_sched_entity *entity = container_of(cb, struct drm_sched_entity, cb); - entity->dependency = NULL; - dma_fence_put(f); + drm_sched_entity_clear_dep(f, cb); drm_sched_wakeup_if_can_queue(entity->rq->sched); } @@ -410,6 +419,13 @@ static bool drm_sched_entity_add_dependency_cb(struct drm_sched_entity *entity) fence = dma_fence_get(&s_fence->scheduled); dma_fence_put(entity->dependency); entity->dependency = fence; + if (!dma_fence_add_callback(fence, &entity->cb, + drm_sched_entity_clear_dep)) + return true; + + /* Ignore it when it is already scheduled */ + dma_fence_put(fence); + return false; } if (!dma_fence_add_callback(entity->dependency, &entity->cb, diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index 980d85bc7f3745d5884f106e48a3053febb4025c..13b182ab905fb0b46287465a67eb6bd9d1093d1c 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c @@ -1320,16 +1320,10 @@ static struct drm_plane *tegra_dc_add_shared_planes(struct drm_device *drm, if (wgrp->dc == dc->pipe) { for (j = 0; j < wgrp->num_windows; j++) { unsigned int index = wgrp->windows[j]; - enum drm_plane_type type; - - if (primary) - type = DRM_PLANE_TYPE_OVERLAY; - else - type = DRM_PLANE_TYPE_PRIMARY; plane = tegra_shared_plane_create(drm, dc, wgrp->index, - index, type); + index); if (IS_ERR(plane)) return plane; @@ -1337,8 +1331,10 @@ static struct drm_plane *tegra_dc_add_shared_planes(struct drm_device *drm, * Choose the first shared plane owned by this * head as the primary plane. */ - if (!primary) + if (!primary) { + plane->type = DRM_PLANE_TYPE_PRIMARY; primary = plane; + } } } } @@ -1392,10 +1388,7 @@ static void tegra_crtc_reset(struct drm_crtc *crtc) if (crtc->state) tegra_crtc_atomic_destroy_state(crtc, crtc->state); - if (state) - __drm_atomic_helper_crtc_reset(crtc, &state->base); - else - __drm_atomic_helper_crtc_reset(crtc, NULL); + __drm_atomic_helper_crtc_reset(crtc, &state->base); } static struct drm_crtc_state * diff --git a/drivers/gpu/drm/tegra/hub.c b/drivers/gpu/drm/tegra/hub.c index 0f88cbb3331706b46ee5fc98cb6aba4466cb5686..1af5f8318d914679ee1b32a87d004af82cbd1c6a 100644 --- a/drivers/gpu/drm/tegra/hub.c +++ b/drivers/gpu/drm/tegra/hub.c @@ -756,9 +756,9 @@ static const struct drm_plane_helper_funcs tegra_shared_plane_helper_funcs = { struct drm_plane *tegra_shared_plane_create(struct drm_device *drm, struct tegra_dc *dc, unsigned int wgrp, - unsigned int index, - enum drm_plane_type type) + unsigned int index) { + enum drm_plane_type type = DRM_PLANE_TYPE_OVERLAY; struct tegra_drm *tegra = drm->dev_private; struct tegra_display_hub *hub = tegra->hub; struct tegra_shared_plane *plane; diff --git a/drivers/gpu/drm/tegra/hub.h b/drivers/gpu/drm/tegra/hub.h index a66f18c4facc9df96ea8b9f54239b52f06536d12..23c4b2115ed1e36e8d2d6ed614a6ead97eb4c441 100644 --- a/drivers/gpu/drm/tegra/hub.h +++ b/drivers/gpu/drm/tegra/hub.h @@ -80,8 +80,7 @@ void tegra_display_hub_cleanup(struct tegra_display_hub *hub); struct drm_plane *tegra_shared_plane_create(struct drm_device *drm, struct tegra_dc *dc, unsigned int wgrp, - unsigned int index, - enum drm_plane_type type); + unsigned int index); int tegra_display_hub_atomic_check(struct drm_device *drm, struct drm_atomic_state *state); diff --git a/drivers/gpu/drm/tegra/nvdec.c b/drivers/gpu/drm/tegra/nvdec.c index 14ef61b44f47cd8306d8d635af207df58c781a87..4860790666af51de98a34942c61856bf3c766c8b 100644 --- a/drivers/gpu/drm/tegra/nvdec.c +++ b/drivers/gpu/drm/tegra/nvdec.c @@ -261,8 +261,10 @@ static int nvdec_load_falcon_firmware(struct nvdec *nvdec) if (!client->group) { virt = dma_alloc_coherent(nvdec->dev, size, &iova, GFP_KERNEL); - if (!virt) - return -ENOMEM; + + err = dma_mapping_error(nvdec->dev, iova); + if (err < 0) + return err; } else { virt = tegra_drm_alloc(tegra, size, &iova); if (IS_ERR(virt)) diff --git a/drivers/gpu/drm/tegra/rgb.c b/drivers/gpu/drm/tegra/rgb.c index 8930460ba6282339e09b705cfbd28bb45ba07985..d6424abd3c45d3938bef978f88a8fead291d6ce1 100644 --- a/drivers/gpu/drm/tegra/rgb.c +++ b/drivers/gpu/drm/tegra/rgb.c @@ -190,11 +190,6 @@ static const struct drm_encoder_helper_funcs tegra_rgb_encoder_helper_funcs = { .atomic_check = tegra_rgb_encoder_atomic_check, }; -static void tegra_dc_of_node_put(void *data) -{ - of_node_put(data); -} - int tegra_dc_rgb_probe(struct tegra_dc *dc) { struct device_node *np; @@ -202,14 +197,7 @@ int tegra_dc_rgb_probe(struct tegra_dc *dc) int err; np = of_get_child_by_name(dc->dev->of_node, "rgb"); - if (!np) - return -ENODEV; - - err = devm_add_action_or_reset(dc->dev, tegra_dc_of_node_put, np); - if (err < 0) - return err; - - if (!of_device_is_available(np)) + if (!np || !of_device_is_available(np)) return -ENODEV; rgb = devm_kzalloc(dc->dev, sizeof(*rgb), GFP_KERNEL); diff --git a/drivers/gpu/drm/tiny/cirrus.c b/drivers/gpu/drm/tiny/cirrus.c index b0361ef53c4635b9d56492fe672f323cb6f26c04..594bc472862fe674a267507ec670501986252a7c 100644 --- a/drivers/gpu/drm/tiny/cirrus.c +++ b/drivers/gpu/drm/tiny/cirrus.c @@ -318,6 +318,7 @@ static void cirrus_pitch_set(struct cirrus_device *cirrus, unsigned int pitch) /* Enable extended blanking and pitch bits, and enable full memory */ cr1b = 0x22; cr1b |= (pitch >> 7) & 0x10; + cr1b |= (pitch >> 6) & 0x40; wreg_crt(cirrus, 0x1b, cr1b); cirrus_set_start_address(cirrus, 0); diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c index 30676b1073034e4caacb4f2ec8ba97a35bf8ca5e..8ea120eb8674bd41f48b4405cb784d87d356eeba 100644 --- a/drivers/gpu/drm/tiny/simpledrm.c +++ b/drivers/gpu/drm/tiny/simpledrm.c @@ -276,7 +276,7 @@ static struct simpledrm_device *simpledrm_device_of_dev(struct drm_device *dev) static void simpledrm_device_release_clocks(void *res) { - struct simpledrm_device *sdev = res; + struct simpledrm_device *sdev = simpledrm_device_of_dev(res); unsigned int i; for (i = 0; i < sdev->clk_count; ++i) { @@ -374,7 +374,7 @@ static int simpledrm_device_init_clocks(struct simpledrm_device *sdev) static void simpledrm_device_release_regulators(void *res) { - struct simpledrm_device *sdev = res; + struct simpledrm_device *sdev = simpledrm_device_of_dev(res); unsigned int i; for (i = 0; i < sdev->regulator_count; ++i) { diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 64606104551cd851c04c96c2b66af4aef5e67ac5..0b3f4267130c4569fa04ae8eba4a5b5eefe6a176 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -254,13 +254,6 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo, ret = dma_resv_trylock(&fbo->base.base._resv); WARN_ON(!ret); - ret = dma_resv_reserve_fences(&fbo->base.base._resv, 1); - if (ret) { - dma_resv_unlock(&fbo->base.base._resv); - kfree(fbo); - return ret; - } - if (fbo->base.resource) { ttm_resource_set_bo(fbo->base.resource, &fbo->base); bo->resource = NULL; @@ -269,6 +262,12 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo, fbo->base.bulk_move = NULL; } + ret = dma_resv_reserve_fences(&fbo->base.base._resv, 1); + if (ret) { + kfree(fbo); + return ret; + } + ttm_bo_get(bo); fbo->bo = bo; diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c index ac357ab1aee544bb4b2e7b1935135483ea758bdd..1506094a800983b7ca1de2e55b895830b1cf879a 100644 --- a/drivers/gpu/drm/udl/udl_drv.c +++ b/drivers/gpu/drm/udl/udl_drv.c @@ -126,9 +126,9 @@ static void udl_usb_disconnect(struct usb_interface *interface) { struct drm_device *dev = usb_get_intfdata(interface); - drm_dev_unplug(dev); drm_kms_helper_poll_fini(dev); udl_drop_usb(dev); + drm_dev_unplug(dev); } /* diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c index 0e8ea990118844cc2130bc1b900acdf0f2f976fb..ffbbe9d527d324fca46f63656b12d0684fcd64bd 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.c +++ b/drivers/gpu/drm/v3d/v3d_drv.c @@ -226,21 +226,11 @@ static int v3d_platform_drm_probe(struct platform_device *pdev) if (ret) return ret; - v3d->clk = devm_clk_get_optional(dev, NULL); - if (IS_ERR(v3d->clk)) - return dev_err_probe(dev, PTR_ERR(v3d->clk), "Failed to get V3D clock\n"); - - ret = clk_prepare_enable(v3d->clk); - if (ret) { - dev_err(&pdev->dev, "Couldn't enable the V3D clock\n"); - return ret; - } - mmu_debug = V3D_READ(V3D_MMU_DEBUG_INFO); mask = DMA_BIT_MASK(30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_PA_WIDTH)); ret = dma_set_mask_and_coherent(dev, mask); if (ret) - goto clk_disable; + return ret; v3d->va_width = 30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_VA_WIDTH); @@ -255,29 +245,28 @@ static int v3d_platform_drm_probe(struct platform_device *pdev) ret = PTR_ERR(v3d->reset); if (ret == -EPROBE_DEFER) - goto clk_disable; + return ret; v3d->reset = NULL; ret = map_regs(v3d, &v3d->bridge_regs, "bridge"); if (ret) { dev_err(dev, "Failed to get reset control or bridge regs\n"); - goto clk_disable; + return ret; } } if (v3d->ver < 41) { ret = map_regs(v3d, &v3d->gca_regs, "gca"); if (ret) - goto clk_disable; + return ret; } v3d->mmu_scratch = dma_alloc_wc(dev, 4096, &v3d->mmu_scratch_paddr, GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO); if (!v3d->mmu_scratch) { dev_err(dev, "Failed to allocate MMU scratch page\n"); - ret = -ENOMEM; - goto clk_disable; + return -ENOMEM; } ret = v3d_gem_init(drm); @@ -300,8 +289,6 @@ static int v3d_platform_drm_probe(struct platform_device *pdev) v3d_gem_destroy(drm); dma_free: dma_free_wc(dev, 4096, v3d->mmu_scratch, v3d->mmu_scratch_paddr); -clk_disable: - clk_disable_unprepare(v3d->clk); return ret; } @@ -316,8 +303,6 @@ static void v3d_platform_drm_remove(struct platform_device *pdev) dma_free_wc(v3d->drm.dev, 4096, v3d->mmu_scratch, v3d->mmu_scratch_paddr); - - clk_disable_unprepare(v3d->clk); } static struct platform_driver v3d_platform_driver = { diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h index bcef978ba9c4ca88b04968d40f9763690c12038a..7f664a4b2a752156a13ef0e667b535e0b77afc8e 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.h +++ b/drivers/gpu/drm/v3d/v3d_drv.h @@ -62,12 +62,6 @@ struct v3d_perfmon { u64 values[]; }; -enum v3d_irq { - V3D_CORE_IRQ, - V3D_HUB_IRQ, - V3D_MAX_IRQS, -}; - struct v3d_dev { struct drm_device drm; @@ -77,8 +71,6 @@ struct v3d_dev { int ver; bool single_irq_line; - int irq[V3D_MAX_IRQS]; - void __iomem *hub_regs; void __iomem *core_regs[3]; void __iomem *bridge_regs; diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c index ef991a9b1c6c4657c5888ee6186094fb87217c3b..2e94ce788c714bcb886c1c028e5d38edccc2a598 100644 --- a/drivers/gpu/drm/v3d/v3d_gem.c +++ b/drivers/gpu/drm/v3d/v3d_gem.c @@ -120,8 +120,6 @@ v3d_reset(struct v3d_dev *v3d) if (false) v3d_idle_axi(v3d, 0); - v3d_irq_disable(v3d); - v3d_idle_gca(v3d); v3d_reset_v3d(v3d); diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c index 641315dbee8b2958579f9c4f1e49c10e4f1fb253..b2d59a1686972844cd95c14194de4d2081a39513 100644 --- a/drivers/gpu/drm/v3d/v3d_irq.c +++ b/drivers/gpu/drm/v3d/v3d_irq.c @@ -215,7 +215,7 @@ v3d_hub_irq(int irq, void *arg) int v3d_irq_init(struct v3d_dev *v3d) { - int irq, ret, core; + int irq1, ret, core; INIT_WORK(&v3d->overflow_mem_work, v3d_overflow_mem_work); @@ -226,24 +226,17 @@ v3d_irq_init(struct v3d_dev *v3d) V3D_CORE_WRITE(core, V3D_CTL_INT_CLR, V3D_CORE_IRQS); V3D_WRITE(V3D_HUB_INT_CLR, V3D_HUB_IRQS); - irq = platform_get_irq_optional(v3d_to_pdev(v3d), 1); - if (irq == -EPROBE_DEFER) - return irq; - if (irq > 0) { - v3d->irq[V3D_CORE_IRQ] = irq; - - ret = devm_request_irq(v3d->drm.dev, v3d->irq[V3D_CORE_IRQ], + irq1 = platform_get_irq_optional(v3d_to_pdev(v3d), 1); + if (irq1 == -EPROBE_DEFER) + return irq1; + if (irq1 > 0) { + ret = devm_request_irq(v3d->drm.dev, irq1, v3d_irq, IRQF_SHARED, "v3d_core0", v3d); if (ret) goto fail; - - irq = platform_get_irq(v3d_to_pdev(v3d), 0); - if (irq < 0) - return irq; - v3d->irq[V3D_HUB_IRQ] = irq; - - ret = devm_request_irq(v3d->drm.dev, v3d->irq[V3D_HUB_IRQ], + ret = devm_request_irq(v3d->drm.dev, + platform_get_irq(v3d_to_pdev(v3d), 0), v3d_hub_irq, IRQF_SHARED, "v3d_hub", v3d); if (ret) @@ -251,12 +244,8 @@ v3d_irq_init(struct v3d_dev *v3d) } else { v3d->single_irq_line = true; - irq = platform_get_irq(v3d_to_pdev(v3d), 0); - if (irq < 0) - return irq; - v3d->irq[V3D_CORE_IRQ] = irq; - - ret = devm_request_irq(v3d->drm.dev, v3d->irq[V3D_CORE_IRQ], + ret = devm_request_irq(v3d->drm.dev, + platform_get_irq(v3d_to_pdev(v3d), 0), v3d_irq, IRQF_SHARED, "v3d", v3d); if (ret) @@ -297,12 +286,6 @@ v3d_irq_disable(struct v3d_dev *v3d) V3D_CORE_WRITE(core, V3D_CTL_INT_MSK_SET, ~0); V3D_WRITE(V3D_HUB_INT_MSK_SET, ~0); - /* Finish any interrupt handler still in flight. */ - for (int i = 0; i < V3D_MAX_IRQS; i++) { - if (v3d->irq[i]) - synchronize_irq(v3d->irq[i]); - } - /* Clear any pending interrupts we might have left. */ for (core = 0; core < v3d->cores; core++) V3D_CORE_WRITE(core, V3D_CTL_INT_CLR, V3D_CORE_IRQS); diff --git a/drivers/gpu/drm/vc4/tests/vc4_mock_output.c b/drivers/gpu/drm/vc4/tests/vc4_mock_output.c index f0ddc223c1f839e8a14f37fdcbb72e7b2c836aa1..e70d7c3076acf168782c48301f3b3dfb9be21f22 100644 --- a/drivers/gpu/drm/vc4/tests/vc4_mock_output.c +++ b/drivers/gpu/drm/vc4/tests/vc4_mock_output.c @@ -75,30 +75,24 @@ int vc4_mock_atomic_add_output(struct kunit *test, int ret; encoder = vc4_find_encoder_by_type(drm, type); - if (!encoder) - return -ENODEV; + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder); crtc = vc4_find_crtc_for_encoder(test, drm, encoder); - if (!crtc) - return -ENODEV; + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc); output = encoder_to_vc4_dummy_output(encoder); conn = &output->connector; conn_state = drm_atomic_get_connector_state(state, conn); - if (IS_ERR(conn_state)) - return PTR_ERR(conn_state); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); ret = drm_atomic_set_crtc_for_connector(conn_state, crtc); - if (ret) - return ret; + KUNIT_EXPECT_EQ(test, ret, 0); crtc_state = drm_atomic_get_crtc_state(state, crtc); - if (IS_ERR(crtc_state)) - return PTR_ERR(crtc_state); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); ret = drm_atomic_set_mode_for_crtc(crtc_state, &default_mode); - if (ret) - return ret; + KUNIT_EXPECT_EQ(test, ret, 0); crtc_state->active = true; @@ -119,32 +113,26 @@ int vc4_mock_atomic_del_output(struct kunit *test, int ret; encoder = vc4_find_encoder_by_type(drm, type); - if (!encoder) - return -ENODEV; + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder); crtc = vc4_find_crtc_for_encoder(test, drm, encoder); - if (!crtc) - return -ENODEV; + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc); crtc_state = drm_atomic_get_crtc_state(state, crtc); - if (IS_ERR(crtc_state)) - return PTR_ERR(crtc_state); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); crtc_state->active = false; ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL); - if (ret) - return ret; + KUNIT_ASSERT_EQ(test, ret, 0); output = encoder_to_vc4_dummy_output(encoder); conn = &output->connector; conn_state = drm_atomic_get_connector_state(state, conn); - if (IS_ERR(conn_state)) - return PTR_ERR(conn_state); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); ret = drm_atomic_set_crtc_for_connector(conn_state, NULL); - if (ret) - return ret; + KUNIT_ASSERT_EQ(test, ret, 0); return 0; } diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c index 894c484f99e950210a8b2ca8283f86a5b3261bd8..61e500b8c9da2397b17fe07a98d469e25bc6d846 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -201,7 +201,7 @@ static int vkms_crtc_atomic_check(struct drm_crtc *crtc, i++; } - vkms_state->active_planes = kcalloc(i, sizeof(*vkms_state->active_planes), GFP_KERNEL); + vkms_state->active_planes = kcalloc(i, sizeof(plane), GFP_KERNEL); if (!vkms_state->active_planes) return -ENOMEM; vkms_state->num_active_planes = i; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c index b129ce873af3f2aa557869a56d3cfab22f8cc74a..5fef0b31c11798e06696420fada0c799c166a0bd 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c @@ -4083,23 +4083,6 @@ static int vmw_execbuf_tie_context(struct vmw_private *dev_priv, return 0; } -/* - * DMA fence callback to remove a seqno_waiter - */ -struct seqno_waiter_rm_context { - struct dma_fence_cb base; - struct vmw_private *dev_priv; -}; - -static void seqno_waiter_rm_cb(struct dma_fence *f, struct dma_fence_cb *cb) -{ - struct seqno_waiter_rm_context *ctx = - container_of(cb, struct seqno_waiter_rm_context, base); - - vmw_seqno_waiter_remove(ctx->dev_priv); - kfree(ctx); -} - int vmw_execbuf_process(struct drm_file *file_priv, struct vmw_private *dev_priv, void __user *user_commands, void *kernel_commands, @@ -4280,15 +4263,6 @@ int vmw_execbuf_process(struct drm_file *file_priv, } else { /* Link the fence with the FD created earlier */ fd_install(out_fence_fd, sync_file->file); - struct seqno_waiter_rm_context *ctx = - kmalloc(sizeof(*ctx), GFP_KERNEL); - ctx->dev_priv = dev_priv; - vmw_seqno_waiter_add(dev_priv); - if (dma_fence_add_callback(&fence->base, &ctx->base, - seqno_waiter_rm_cb) < 0) { - vmw_seqno_waiter_remove(dev_priv); - kfree(ctx); - } } } diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 266cd56dec505651a88e1a407cd4c41aa78bfe5b..8f156a69912c8921193a11b0fe32fe257bedf8cd 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -1873,12 +1873,9 @@ u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags) /* * 7 extra bytes are necessary to achieve proper functionality * of implement() working on 8 byte chunks - * 1 extra byte for the report ID if it is null (not used) so - * we can reserve that extra byte in the first position of the buffer - * when sending it to .raw_request() */ - u32 len = hid_report_len(report) + 7 + (report->id == 0); + u32 len = hid_report_len(report) + 7; return kzalloc(len, flags); } @@ -1941,7 +1938,7 @@ static struct hid_report *hid_get_report(struct hid_report_enum *report_enum, int __hid_request(struct hid_device *hid, struct hid_report *report, enum hid_class_request reqtype) { - char *buf, *data_buf; + char *buf; int ret; u32 len; @@ -1949,19 +1946,13 @@ int __hid_request(struct hid_device *hid, struct hid_report *report, if (!buf) return -ENOMEM; - data_buf = buf; len = hid_report_len(report); - if (report->id == 0) { - /* reserve the first byte for the report ID */ - data_buf++; - len++; - } - if (reqtype == HID_REQ_SET_REPORT) - hid_output_report(report, data_buf); + hid_output_report(report, buf); - ret = hid_hw_raw_request(hid, report->id, buf, len, report->type, reqtype); + ret = hid->ll_driver->raw_request(hid, report->id, buf, len, + report->type, reqtype); if (ret < 0) { dbg_hid("unable to complete request: %d\n", ret); goto out; diff --git a/drivers/hid/hid-hyperv.c b/drivers/hid/hid-hyperv.c index 9eafff0b6ea4c3f670e501e8bbd2595bdde45f25..0fb210e40a41272fdb20f80dc814d47bd49a8091 100644 --- a/drivers/hid/hid-hyperv.c +++ b/drivers/hid/hid-hyperv.c @@ -192,7 +192,7 @@ static void mousevsc_on_receive_device_info(struct mousevsc_dev *input_device, goto cleanup; input_device->report_desc_size = le16_to_cpu( - desc->rpt_desc.wDescriptorLength); + desc->desc[0].wDescriptorLength); if (input_device->report_desc_size == 0) { input_device->dev_info_status = -EINVAL; goto cleanup; @@ -210,7 +210,7 @@ static void mousevsc_on_receive_device_info(struct mousevsc_dev *input_device, memcpy(input_device->report_desc, ((unsigned char *)desc) + desc->bLength, - le16_to_cpu(desc->rpt_desc.wDescriptorLength)); + le16_to_cpu(desc->desc[0].wDescriptorLength)); /* Send the ack */ memset(&ack, 0, sizeof(struct mousevsc_prt_msg)); diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 0d1d7162814f322c074b8a4fc322c65cc5d50721..8e721ec3faaff3cf7a7e35114a7f214e56b2a708 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -41,10 +41,6 @@ #define USB_VENDOR_ID_ACTIONSTAR 0x2101 #define USB_DEVICE_ID_ACTIONSTAR_1011 0x1011 -#define USB_VENDOR_ID_ADATA_XPG 0x125f -#define USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE 0x7505 -#define USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE_DONGLE 0x7506 - #define USB_VENDOR_ID_ADS_TECH 0x06e1 #define USB_DEVICE_ID_ADS_TECH_RADIO_SI470X 0xa155 @@ -305,8 +301,6 @@ #define USB_DEVICE_ID_ASUS_AK1D 0x1125 #define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A 0x1408 #define USB_DEVICE_ID_CHICONY_ACER_SWITCH12 0x1421 -#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA 0xb824 -#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA2 0xb82c #define USB_VENDOR_ID_CHUNGHWAT 0x2247 #define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001 @@ -809,7 +803,6 @@ #define USB_DEVICE_ID_LENOVO_TPPRODOCK 0x6067 #define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085 #define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3 -#define USB_DEVICE_ID_LENOVO_X1_TAB2 0x60a4 #define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5 #define USB_DEVICE_ID_LENOVO_X12_TAB 0x60fe #define USB_DEVICE_ID_LENOVO_X12_TAB2 0x61ae @@ -1504,7 +1497,4 @@ #define USB_VENDOR_ID_SIGNOTEC 0x2133 #define USB_DEVICE_ID_SIGNOTEC_VIEWSONIC_PD1011 0x0018 -#define USB_VENDOR_ID_SMARTLINKTECHNOLOGY 0x4c4a -#define USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155 0x4155 - #endif diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c index 32cb2e75228c4b6ca1cd8c3216989721855ca752..a4062f617ba202e5e908fd455d9ac7ff81cf96c3 100644 --- a/drivers/hid/hid-lenovo.c +++ b/drivers/hid/hid-lenovo.c @@ -473,7 +473,6 @@ static int lenovo_input_mapping(struct hid_device *hdev, return lenovo_input_mapping_tp10_ultrabook_kbd(hdev, hi, field, usage, bit, max); case USB_DEVICE_ID_LENOVO_X1_TAB: - case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max); default: @@ -530,14 +529,11 @@ static void lenovo_features_set_cptkbd(struct hid_device *hdev) /* * Tell the keyboard a driver understands it, and turn F7, F9, F11 into - * regular keys (Compact only) + * regular keys */ - if (hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD || - hdev->product == USB_DEVICE_ID_LENOVO_CBTKBD) { - ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03); - if (ret) - hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret); - } + ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03); + if (ret) + hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret); /* Switch middle button to native mode */ ret = lenovo_send_cmd_cptkbd(hdev, 0x09, 0x01); @@ -588,7 +584,6 @@ static ssize_t attr_fn_lock_store(struct device *dev, break; case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_X1_TAB: - case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value); if (ret) @@ -784,7 +779,6 @@ static int lenovo_event(struct hid_device *hdev, struct hid_field *field, return lenovo_event_cptkbd(hdev, field, usage, value); case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_X1_TAB: - case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: return lenovo_event_tp10ubkbd(hdev, field, usage, value); default: @@ -1068,7 +1062,6 @@ static int lenovo_led_brightness_set(struct led_classdev *led_cdev, break; case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_X1_TAB: - case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value); break; @@ -1300,7 +1293,6 @@ static int lenovo_probe(struct hid_device *hdev, break; case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_X1_TAB: - case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: ret = lenovo_probe_tp10ubkbd(hdev); break; @@ -1388,7 +1380,6 @@ static void lenovo_remove(struct hid_device *hdev) break; case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_X1_TAB: - case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: lenovo_remove_tp10ubkbd(hdev); break; @@ -1439,8 +1430,6 @@ static const struct hid_device_id lenovo_devices[] = { */ { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) }, - { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, - USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB2) }, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB3) }, { } diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index becd4c1ccf93c1176847004a2f5643c0ebaec63a..6386043aab0bbf6ad4dfb51dbba44d6c428eac37 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -2110,17 +2110,11 @@ static const struct hid_device_id mt_devices[] = { HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC, USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_7010) }, - /* Lenovo X1 TAB Gen 1 */ - { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, - HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, - USB_VENDOR_ID_LENOVO, - USB_DEVICE_ID_LENOVO_X1_TAB) }, - /* Lenovo X1 TAB Gen 2 */ { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, USB_VENDOR_ID_LENOVO, - USB_DEVICE_ID_LENOVO_X1_TAB2) }, + USB_DEVICE_ID_LENOVO_X1_TAB) }, /* Lenovo X1 TAB Gen 3 */ { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index 80372342c176afc2d143bf402075218bc0b17b57..5d7a418ccdbecf987f9625fbfaf7c807d8d53212 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -27,8 +27,6 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD), HID_QUIRK_BADPAD }, { HID_USB_DEVICE(USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR), HID_QUIRK_BADPAD }, - { HID_USB_DEVICE(USB_VENDOR_ID_ADATA_XPG, USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE), HID_QUIRK_ALWAYS_POLL }, - { HID_USB_DEVICE(USB_VENDOR_ID_ADATA_XPG, USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE_DONGLE), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016), HID_QUIRK_FULLSPEED_INTERVAL }, { HID_USB_DEVICE(USB_VENDOR_ID_AIREN, USB_DEVICE_ID_AIREN_SLIMPLUS), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_AKAI_09E8, USB_DEVICE_ID_AKAI_09E8_MIDIMIX), HID_QUIRK_NO_INIT_REPORTS }, @@ -747,8 +745,6 @@ static const struct hid_device_id hid_ignore_list[] = { { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) }, { HID_USB_DEVICE(USB_VENDOR_ID_AXENTIA, USB_DEVICE_ID_AXENTIA_FM_RADIO) }, { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) }, - { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA) }, - { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA2) }, { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) }, { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) }, { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI4713) }, @@ -896,7 +892,6 @@ static const struct hid_device_id hid_ignore_list[] = { #endif { HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) }, { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_HP_5MP_CAMERA_5473) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SMARTLINKTECHNOLOGY, USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155) }, { } }; diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index a8e8da002b9bbde769f996afd5a7f1dbc835234d..257dd73e37bf5756d18e05ad46c9476c2baa1554 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -982,11 +982,12 @@ static int usbhid_parse(struct hid_device *hid) struct usb_host_interface *interface = intf->cur_altsetting; struct usb_device *dev = interface_to_usbdev (intf); struct hid_descriptor *hdesc; - struct hid_class_descriptor *hcdesc; u32 quirks = 0; unsigned int rsize = 0; char *rdesc; - int ret; + int ret, n; + int num_descriptors; + size_t offset = offsetof(struct hid_descriptor, desc); quirks = hid_lookup_quirk(hid); @@ -1008,19 +1009,20 @@ static int usbhid_parse(struct hid_device *hid) return -ENODEV; } - if (!hdesc->bNumDescriptors || - hdesc->bLength != sizeof(*hdesc) + - (hdesc->bNumDescriptors - 1) * sizeof(*hcdesc)) { - dbg_hid("hid descriptor invalid, bLen=%hhu bNum=%hhu\n", - hdesc->bLength, hdesc->bNumDescriptors); + if (hdesc->bLength < sizeof(struct hid_descriptor)) { + dbg_hid("hid descriptor is too short\n"); return -EINVAL; } hid->version = le16_to_cpu(hdesc->bcdHID); hid->country = hdesc->bCountryCode; - if (hdesc->rpt_desc.bDescriptorType == HID_DT_REPORT) - rsize = le16_to_cpu(hdesc->rpt_desc.wDescriptorLength); + num_descriptors = min_t(int, hdesc->bNumDescriptors, + (hdesc->bLength - offset) / sizeof(struct hid_class_descriptor)); + + for (n = 0; n < num_descriptors; n++) + if (hdesc->desc[n].bDescriptorType == HID_DT_REPORT) + rsize = le16_to_cpu(hdesc->desc[n].wDescriptorLength); if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE) { dbg_hid("weird size of report descriptor (%u)\n", rsize); @@ -1048,11 +1050,6 @@ static int usbhid_parse(struct hid_device *hid) goto err; } - if (hdesc->bNumDescriptors > 1) - hid_warn(intf, - "%u unsupported optional hid class descriptors\n", - (int)(hdesc->bNumDescriptors - 1)); - hid->quirks |= quirks; return 0; diff --git a/drivers/hid/usbhid/usbkbd.c b/drivers/hid/usbhid/usbkbd.c index af6bc76dbf64939a614279536b50d9308f9980d1..c439ed2f16dbca3bbd229c2a631b41b8af7415fd 100644 --- a/drivers/hid/usbhid/usbkbd.c +++ b/drivers/hid/usbhid/usbkbd.c @@ -160,7 +160,7 @@ static int usb_kbd_event(struct input_dev *dev, unsigned int type, return -1; spin_lock_irqsave(&kbd->leds_lock, flags); - kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 4) | (!!test_bit(LED_COMPOSE, dev->led) << 3) | + kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 3) | (!!test_bit(LED_COMPOSE, dev->led) << 3) | (!!test_bit(LED_SCROLLL, dev->led) << 2) | (!!test_bit(LED_CAPSL, dev->led) << 1) | (!!test_bit(LED_NUML, dev->led)); diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index 52011503ff3bac89bf223315da11245587d9c944..5a72cf8d6944fa890c565ece3e68043837d005db 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -2012,18 +2012,14 @@ static int wacom_initialize_remotes(struct wacom *wacom) remote->remote_dir = kobject_create_and_add("wacom_remote", &wacom->hdev->dev.kobj); - if (!remote->remote_dir) { - kfifo_free(&remote->remote_fifo); + if (!remote->remote_dir) return -ENOMEM; - } error = sysfs_create_files(remote->remote_dir, remote_unpair_attrs); if (error) { hid_err(wacom->hdev, "cannot create sysfs group err: %d\n", error); - kfifo_free(&remote->remote_fifo); - kobject_put(remote->remote_dir); return error; } diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c index 3c6011a48dabe749325782ea90d9de228eb3e761..2f4d09ce027a3f6b07132da55c6b31cdbbfaf25b 100644 --- a/drivers/hv/channel_mgmt.c +++ b/drivers/hv/channel_mgmt.c @@ -120,9 +120,7 @@ const struct vmbus_device vmbus_devs[] = { }, /* File copy */ - /* fcopy always uses 16KB ring buffer size and is working well for last many years */ - { .pref_ring_size = 0x4000, - .dev_type = HV_FCOPY, + { .dev_type = HV_FCOPY, HV_FCOPY_GUID, .perf_device = false, .allowed_in_isolated = false, @@ -142,19 +140,12 @@ const struct vmbus_device vmbus_devs[] = { .allowed_in_isolated = false, }, - /* - * Unknown GUID - * 64 KB ring buffer + 4 KB header should be sufficient size for any Hyper-V device apart - * from HV_NIC and HV_SCSI. This case avoid the fallback for unknown devices to allocate - * much bigger (2 MB) of ring size. - */ - { .pref_ring_size = 0x11000, - .dev_type = HV_UNKNOWN, + /* Unknown GUID */ + { .dev_type = HV_UNKNOWN, .perf_device = false, .allowed_in_isolated = false, }, }; -EXPORT_SYMBOL_GPL(vmbus_devs); static const struct { guid_t guid; diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c index 27306c17b0c4e4e35bc4958a97de41f3db259001..f001ae880e1dbefc6243e6d902e529db43291987 100644 --- a/drivers/hv/connection.c +++ b/drivers/hv/connection.c @@ -206,20 +206,11 @@ int vmbus_connect(void) INIT_LIST_HEAD(&vmbus_connection.chn_list); mutex_init(&vmbus_connection.channel_mutex); - /* - * The following Hyper-V interrupt and monitor pages can be used by - * UIO for mapping to user-space, so they should always be allocated on - * system page boundaries. The system page size must be >= the Hyper-V - * page size. - */ - BUILD_BUG_ON(PAGE_SIZE < HV_HYP_PAGE_SIZE); - /* * Setup the vmbus event connection for channel interrupt * abstraction stuff */ - vmbus_connection.int_page = - (void *)__get_free_page(GFP_KERNEL | __GFP_ZERO); + vmbus_connection.int_page = hv_alloc_hyperv_zeroed_page(); if (vmbus_connection.int_page == NULL) { ret = -ENOMEM; goto cleanup; @@ -234,8 +225,8 @@ int vmbus_connect(void) * Setup the monitor notification facility. The 1st page for * parent->child and the 2nd page for child->parent */ - vmbus_connection.monitor_pages[0] = (void *)__get_free_page(GFP_KERNEL); - vmbus_connection.monitor_pages[1] = (void *)__get_free_page(GFP_KERNEL); + vmbus_connection.monitor_pages[0] = hv_alloc_hyperv_page(); + vmbus_connection.monitor_pages[1] = hv_alloc_hyperv_page(); if ((vmbus_connection.monitor_pages[0] == NULL) || (vmbus_connection.monitor_pages[1] == NULL)) { ret = -ENOMEM; @@ -351,23 +342,21 @@ void vmbus_disconnect(void) destroy_workqueue(vmbus_connection.work_queue); if (vmbus_connection.int_page) { - free_page((unsigned long)vmbus_connection.int_page); + hv_free_hyperv_page(vmbus_connection.int_page); vmbus_connection.int_page = NULL; } if (vmbus_connection.monitor_pages[0]) { if (!set_memory_encrypted( (unsigned long)vmbus_connection.monitor_pages[0], 1)) - free_page((unsigned long) - vmbus_connection.monitor_pages[0]); + hv_free_hyperv_page(vmbus_connection.monitor_pages[0]); vmbus_connection.monitor_pages[0] = NULL; } if (vmbus_connection.monitor_pages[1]) { if (!set_memory_encrypted( (unsigned long)vmbus_connection.monitor_pages[1], 1)) - free_page((unsigned long) - vmbus_connection.monitor_pages[1]); + hv_free_hyperv_page(vmbus_connection.monitor_pages[1]); vmbus_connection.monitor_pages[1] = NULL; } } diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h index 34b60009114a69e0e308d91011036e1c2850c3b2..787b15068641885abce3c254aa46d71f2c9bb51a 100644 --- a/drivers/hv/hyperv_vmbus.h +++ b/drivers/hv/hyperv_vmbus.h @@ -419,11 +419,6 @@ static inline bool hv_is_perf_channel(struct vmbus_channel *channel) return vmbus_devs[channel->device_id].perf_device; } -static inline size_t hv_dev_ring_size(struct vmbus_channel *channel) -{ - return vmbus_devs[channel->device_id].pref_ring_size; -} - static inline bool hv_is_allocated_cpu(unsigned int cpu) { struct vmbus_channel *channel, *sc; diff --git a/drivers/hwmon/asus-ec-sensors.c b/drivers/hwmon/asus-ec-sensors.c index ce2f14a62754ee80ccc0725302c8566ba054934f..f20b864c1bb2010757a5456aea45a054979bbc00 100644 --- a/drivers/hwmon/asus-ec-sensors.c +++ b/drivers/hwmon/asus-ec-sensors.c @@ -888,10 +888,6 @@ static int asus_ec_hwmon_read_string(struct device *dev, { struct ec_sensors_data *state = dev_get_drvdata(dev); int sensor_index = find_ec_sensor_index(state, type, channel); - - if (sensor_index < 0) - return sensor_index; - *str = get_sensor_info(state, sensor_index)->label; return 0; diff --git a/drivers/hwmon/corsair-cpro.c b/drivers/hwmon/corsair-cpro.c index b37f36f55f88a57b9e07c8cb1a1e7b4ea2ccf6be..280b90646a87355d55279a6c4100fe996d9b99db 100644 --- a/drivers/hwmon/corsair-cpro.c +++ b/drivers/hwmon/corsair-cpro.c @@ -84,7 +84,6 @@ struct ccp_device { struct mutex mutex; /* whenever buffer is used, lock before send_usb_cmd */ u8 *cmd_buffer; u8 *buffer; - int buffer_recv_size; /* number of received bytes in buffer */ int target[6]; DECLARE_BITMAP(temp_cnct, NUM_TEMP_SENSORS); DECLARE_BITMAP(fan_cnct, NUM_FANS); @@ -140,9 +139,6 @@ static int send_usb_cmd(struct ccp_device *ccp, u8 command, u8 byte1, u8 byte2, if (!t) return -ETIMEDOUT; - if (ccp->buffer_recv_size != IN_BUFFER_SIZE) - return -EPROTO; - return ccp_get_errno(ccp); } @@ -154,7 +150,6 @@ static int ccp_raw_event(struct hid_device *hdev, struct hid_report *report, u8 spin_lock(&ccp->wait_input_report_lock); if (!completion_done(&ccp->wait_input_report)) { memcpy(ccp->buffer, data, min(IN_BUFFER_SIZE, size)); - ccp->buffer_recv_size = size; complete_all(&ccp->wait_input_report); } spin_unlock(&ccp->wait_input_report_lock); diff --git a/drivers/hwmon/ftsteutates.c b/drivers/hwmon/ftsteutates.c index 27e5dd94b04f2c3911b723689a9f6a7537773244..b74a2665e73321c39854e6627f639e33739e31e3 100644 --- a/drivers/hwmon/ftsteutates.c +++ b/drivers/hwmon/ftsteutates.c @@ -423,16 +423,13 @@ static int fts_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, break; case hwmon_pwm: switch (attr) { - case hwmon_pwm_auto_channels_temp: { - u8 fan_source = data->fan_source[channel]; - - if (fan_source == FTS_FAN_SOURCE_INVALID || fan_source >= BITS_PER_LONG) + case hwmon_pwm_auto_channels_temp: + if (data->fan_source[channel] == FTS_FAN_SOURCE_INVALID) *val = 0; else - *val = BIT(fan_source); + *val = BIT(data->fan_source[channel]); return 0; - } default: break; } diff --git a/drivers/hwmon/occ/common.c b/drivers/hwmon/occ/common.c index 483f79b394298fbd0f52380fd7a9be4d361b210a..dd690f700d4990e5f11785f8777b936061f9215a 100644 --- a/drivers/hwmon/occ/common.c +++ b/drivers/hwmon/occ/common.c @@ -459,10 +459,12 @@ static ssize_t occ_show_power_1(struct device *dev, return sysfs_emit(buf, "%llu\n", val); } -static u64 occ_get_powr_avg(u64 accum, u32 samples) +static u64 occ_get_powr_avg(u64 *accum, u32 *samples) { - return (samples == 0) ? 0 : - mul_u64_u32_div(accum, 1000000UL, samples); + u64 divisor = get_unaligned_be32(samples); + + return (divisor == 0) ? 0 : + div64_u64(get_unaligned_be64(accum) * 1000000ULL, divisor); } static ssize_t occ_show_power_2(struct device *dev, @@ -487,8 +489,8 @@ static ssize_t occ_show_power_2(struct device *dev, get_unaligned_be32(&power->sensor_id), power->function_id, power->apss_channel); case 1: - val = occ_get_powr_avg(get_unaligned_be64(&power->accumulator), - get_unaligned_be32(&power->update_tag)); + val = occ_get_powr_avg(&power->accumulator, + &power->update_tag); break; case 2: val = (u64)get_unaligned_be32(&power->update_tag) * @@ -525,8 +527,8 @@ static ssize_t occ_show_power_a0(struct device *dev, return sysfs_emit(buf, "%u_system\n", get_unaligned_be32(&power->sensor_id)); case 1: - val = occ_get_powr_avg(get_unaligned_be64(&power->system.accumulator), - get_unaligned_be32(&power->system.update_tag)); + val = occ_get_powr_avg(&power->system.accumulator, + &power->system.update_tag); break; case 2: val = (u64)get_unaligned_be32(&power->system.update_tag) * @@ -539,8 +541,8 @@ static ssize_t occ_show_power_a0(struct device *dev, return sysfs_emit(buf, "%u_proc\n", get_unaligned_be32(&power->sensor_id)); case 5: - val = occ_get_powr_avg(get_unaligned_be64(&power->proc.accumulator), - get_unaligned_be32(&power->proc.update_tag)); + val = occ_get_powr_avg(&power->proc.accumulator, + &power->proc.update_tag); break; case 6: val = (u64)get_unaligned_be32(&power->proc.update_tag) * @@ -553,8 +555,8 @@ static ssize_t occ_show_power_a0(struct device *dev, return sysfs_emit(buf, "%u_vdd\n", get_unaligned_be32(&power->sensor_id)); case 9: - val = occ_get_powr_avg(get_unaligned_be64(&power->vdd.accumulator), - get_unaligned_be32(&power->vdd.update_tag)); + val = occ_get_powr_avg(&power->vdd.accumulator, + &power->vdd.update_tag); break; case 10: val = (u64)get_unaligned_be32(&power->vdd.update_tag) * @@ -567,8 +569,8 @@ static ssize_t occ_show_power_a0(struct device *dev, return sysfs_emit(buf, "%u_vdn\n", get_unaligned_be32(&power->sensor_id)); case 13: - val = occ_get_powr_avg(get_unaligned_be64(&power->vdn.accumulator), - get_unaligned_be32(&power->vdn.update_tag)); + val = occ_get_powr_avg(&power->vdn.accumulator, + &power->vdn.update_tag); break; case 14: val = (u64)get_unaligned_be32(&power->vdn.update_tag) * @@ -745,30 +747,29 @@ static ssize_t occ_show_extended(struct device *dev, } /* - * A helper to make it easier to define an occ_attribute. Since these - * are dynamically allocated, we cannot use the existing kernel macros which + * Some helper macros to make it easier to define an occ_attribute. Since these + * are dynamically allocated, we shouldn't use the existing kernel macros which * stringify the name argument. */ -static void occ_init_attribute(struct occ_attribute *attr, int mode, - ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf), - ssize_t (*store)(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count), - int nr, int index, const char *fmt, ...) -{ - va_list args; - - va_start(args, fmt); - vsnprintf(attr->name, sizeof(attr->name), fmt, args); - va_end(args); - - attr->sensor.dev_attr.attr.name = attr->name; - attr->sensor.dev_attr.attr.mode = mode; - attr->sensor.dev_attr.show = show; - attr->sensor.dev_attr.store = store; - attr->sensor.index = index; - attr->sensor.nr = nr; +#define ATTR_OCC(_name, _mode, _show, _store) { \ + .attr = { \ + .name = _name, \ + .mode = VERIFY_OCTAL_PERMISSIONS(_mode), \ + }, \ + .show = _show, \ + .store = _store, \ } +#define SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index) { \ + .dev_attr = ATTR_OCC(_name, _mode, _show, _store), \ + .index = _index, \ + .nr = _nr, \ +} + +#define OCC_INIT_ATTR(_name, _mode, _show, _store, _nr, _index) \ + ((struct sensor_device_attribute_2) \ + SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index)) + /* * Allocate and instatiate sensor_device_attribute_2s. It's most efficient to * use our own instead of the built-in hwmon attribute types. @@ -854,15 +855,14 @@ static int occ_setup_sensor_attrs(struct occ *occ) sensors->extended.num_sensors = 0; } - occ->attrs = devm_kcalloc(dev, num_attrs, sizeof(*occ->attrs), + occ->attrs = devm_kzalloc(dev, sizeof(*occ->attrs) * num_attrs, GFP_KERNEL); if (!occ->attrs) return -ENOMEM; /* null-terminated list */ - occ->group.attrs = devm_kcalloc(dev, num_attrs + 1, - sizeof(*occ->group.attrs), - GFP_KERNEL); + occ->group.attrs = devm_kzalloc(dev, sizeof(*occ->group.attrs) * + num_attrs + 1, GFP_KERNEL); if (!occ->group.attrs) return -ENOMEM; @@ -872,33 +872,43 @@ static int occ_setup_sensor_attrs(struct occ *occ) s = i + 1; temp = ((struct temp_sensor_2 *)sensors->temp.data) + i; - occ_init_attribute(attr, 0444, show_temp, NULL, - 0, i, "temp%d_label", s); + snprintf(attr->name, sizeof(attr->name), "temp%d_label", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL, + 0, i); attr++; if (sensors->temp.version == 2 && temp->fru_type == OCC_FRU_TYPE_VRM) { - occ_init_attribute(attr, 0444, show_temp, NULL, - 1, i, "temp%d_alarm", s); + snprintf(attr->name, sizeof(attr->name), + "temp%d_alarm", s); } else { - occ_init_attribute(attr, 0444, show_temp, NULL, - 1, i, "temp%d_input", s); + snprintf(attr->name, sizeof(attr->name), + "temp%d_input", s); } + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL, + 1, i); attr++; if (sensors->temp.version > 1) { - occ_init_attribute(attr, 0444, show_temp, NULL, - 2, i, "temp%d_fru_type", s); + snprintf(attr->name, sizeof(attr->name), + "temp%d_fru_type", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_temp, NULL, 2, i); attr++; - occ_init_attribute(attr, 0444, show_temp, NULL, - 3, i, "temp%d_fault", s); + snprintf(attr->name, sizeof(attr->name), + "temp%d_fault", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_temp, NULL, 3, i); attr++; if (sensors->temp.version == 0x10) { - occ_init_attribute(attr, 0444, show_temp, NULL, - 4, i, "temp%d_max", s); + snprintf(attr->name, sizeof(attr->name), + "temp%d_max", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_temp, NULL, + 4, i); attr++; } } @@ -907,12 +917,14 @@ static int occ_setup_sensor_attrs(struct occ *occ) for (i = 0; i < sensors->freq.num_sensors; ++i) { s = i + 1; - occ_init_attribute(attr, 0444, show_freq, NULL, - 0, i, "freq%d_label", s); + snprintf(attr->name, sizeof(attr->name), "freq%d_label", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL, + 0, i); attr++; - occ_init_attribute(attr, 0444, show_freq, NULL, - 1, i, "freq%d_input", s); + snprintf(attr->name, sizeof(attr->name), "freq%d_input", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL, + 1, i); attr++; } @@ -928,24 +940,32 @@ static int occ_setup_sensor_attrs(struct occ *occ) s = (i * 4) + 1; for (j = 0; j < 4; ++j) { - occ_init_attribute(attr, 0444, show_power, - NULL, nr++, i, - "power%d_label", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_label", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_power, NULL, + nr++, i); attr++; - occ_init_attribute(attr, 0444, show_power, - NULL, nr++, i, - "power%d_average", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_average", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_power, NULL, + nr++, i); attr++; - occ_init_attribute(attr, 0444, show_power, - NULL, nr++, i, - "power%d_average_interval", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_average_interval", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_power, NULL, + nr++, i); attr++; - occ_init_attribute(attr, 0444, show_power, - NULL, nr++, i, - "power%d_input", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_input", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_power, NULL, + nr++, i); attr++; s++; @@ -957,20 +977,28 @@ static int occ_setup_sensor_attrs(struct occ *occ) for (i = 0; i < sensors->power.num_sensors; ++i) { s = i + 1; - occ_init_attribute(attr, 0444, show_power, NULL, - 0, i, "power%d_label", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_label", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_power, NULL, 0, i); attr++; - occ_init_attribute(attr, 0444, show_power, NULL, - 1, i, "power%d_average", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_average", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_power, NULL, 1, i); attr++; - occ_init_attribute(attr, 0444, show_power, NULL, - 2, i, "power%d_average_interval", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_average_interval", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_power, NULL, 2, i); attr++; - occ_init_attribute(attr, 0444, show_power, NULL, - 3, i, "power%d_input", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_input", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_power, NULL, 3, i); attr++; } @@ -978,43 +1006,56 @@ static int occ_setup_sensor_attrs(struct occ *occ) } if (sensors->caps.num_sensors >= 1) { - occ_init_attribute(attr, 0444, show_caps, NULL, - 0, 0, "power%d_label", s); + snprintf(attr->name, sizeof(attr->name), "power%d_label", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, + 0, 0); attr++; - occ_init_attribute(attr, 0444, show_caps, NULL, - 1, 0, "power%d_cap", s); + snprintf(attr->name, sizeof(attr->name), "power%d_cap", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, + 1, 0); attr++; - occ_init_attribute(attr, 0444, show_caps, NULL, - 2, 0, "power%d_input", s); + snprintf(attr->name, sizeof(attr->name), "power%d_input", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, + 2, 0); attr++; - occ_init_attribute(attr, 0444, show_caps, NULL, - 3, 0, "power%d_cap_not_redundant", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_cap_not_redundant", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, + 3, 0); attr++; - occ_init_attribute(attr, 0444, show_caps, NULL, - 4, 0, "power%d_cap_max", s); + snprintf(attr->name, sizeof(attr->name), "power%d_cap_max", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, + 4, 0); attr++; - occ_init_attribute(attr, 0444, show_caps, NULL, - 5, 0, "power%d_cap_min", s); + snprintf(attr->name, sizeof(attr->name), "power%d_cap_min", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, + 5, 0); attr++; - occ_init_attribute(attr, 0644, show_caps, occ_store_caps_user, - 6, 0, "power%d_cap_user", s); + snprintf(attr->name, sizeof(attr->name), "power%d_cap_user", + s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0644, show_caps, + occ_store_caps_user, 6, 0); attr++; if (sensors->caps.version > 1) { - occ_init_attribute(attr, 0444, show_caps, NULL, - 7, 0, "power%d_cap_user_source", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_cap_user_source", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_caps, NULL, 7, 0); attr++; if (sensors->caps.version > 2) { - occ_init_attribute(attr, 0444, show_caps, NULL, - 8, 0, - "power%d_cap_min_soft", s); + snprintf(attr->name, sizeof(attr->name), + "power%d_cap_min_soft", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + show_caps, NULL, + 8, 0); attr++; } } @@ -1023,16 +1064,19 @@ static int occ_setup_sensor_attrs(struct occ *occ) for (i = 0; i < sensors->extended.num_sensors; ++i) { s = i + 1; - occ_init_attribute(attr, 0444, occ_show_extended, NULL, - 0, i, "extn%d_label", s); + snprintf(attr->name, sizeof(attr->name), "extn%d_label", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + occ_show_extended, NULL, 0, i); attr++; - occ_init_attribute(attr, 0444, occ_show_extended, NULL, - 1, i, "extn%d_flags", s); + snprintf(attr->name, sizeof(attr->name), "extn%d_flags", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + occ_show_extended, NULL, 1, i); attr++; - occ_init_attribute(attr, 0444, occ_show_extended, NULL, - 2, i, "extn%d_input", s); + snprintf(attr->name, sizeof(attr->name), "extn%d_input", s); + attr->sensor = OCC_INIT_ATTR(attr->name, 0444, + occ_show_extended, NULL, 2, i); attr++; } diff --git a/drivers/hwmon/pmbus/max34440.c b/drivers/hwmon/pmbus/max34440.c index e14be8ebaad30eea0d5d9115fbf8444f82e7dc55..fe7f6b1b09851e725c0d6f2f5616f9aa470d9339 100644 --- a/drivers/hwmon/pmbus/max34440.c +++ b/drivers/hwmon/pmbus/max34440.c @@ -34,21 +34,16 @@ enum chips { max34440, max34441, max34446, max34451, max34460, max34461 }; /* * The whole max344* family have IOUT_OC_WARN_LIMIT and IOUT_OC_FAULT_LIMIT * swapped from the standard pmbus spec addresses. - * For max34451, version MAX34451ETNA6+ and later has this issue fixed. */ #define MAX34440_IOUT_OC_WARN_LIMIT 0x46 #define MAX34440_IOUT_OC_FAULT_LIMIT 0x4A -#define MAX34451ETNA6_MFR_REV 0x0012 - #define MAX34451_MFR_CHANNEL_CONFIG 0xe4 #define MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK 0x3f struct max34440_data { int id; struct pmbus_driver_info info; - u8 iout_oc_warn_limit; - u8 iout_oc_fault_limit; }; #define to_max34440_data(x) container_of(x, struct max34440_data, info) @@ -65,11 +60,11 @@ static int max34440_read_word_data(struct i2c_client *client, int page, switch (reg) { case PMBUS_IOUT_OC_FAULT_LIMIT: ret = pmbus_read_word_data(client, page, phase, - data->iout_oc_fault_limit); + MAX34440_IOUT_OC_FAULT_LIMIT); break; case PMBUS_IOUT_OC_WARN_LIMIT: ret = pmbus_read_word_data(client, page, phase, - data->iout_oc_warn_limit); + MAX34440_IOUT_OC_WARN_LIMIT); break; case PMBUS_VIRT_READ_VOUT_MIN: ret = pmbus_read_word_data(client, page, phase, @@ -138,11 +133,11 @@ static int max34440_write_word_data(struct i2c_client *client, int page, switch (reg) { case PMBUS_IOUT_OC_FAULT_LIMIT: - ret = pmbus_write_word_data(client, page, data->iout_oc_fault_limit, + ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_FAULT_LIMIT, word); break; case PMBUS_IOUT_OC_WARN_LIMIT: - ret = pmbus_write_word_data(client, page, data->iout_oc_warn_limit, + ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_WARN_LIMIT, word); break; case PMBUS_VIRT_RESET_POUT_HISTORY: @@ -240,25 +235,6 @@ static int max34451_set_supported_funcs(struct i2c_client *client, */ int page, rv; - bool max34451_na6 = false; - - rv = i2c_smbus_read_word_data(client, PMBUS_MFR_REVISION); - if (rv < 0) - return rv; - - if (rv >= MAX34451ETNA6_MFR_REV) { - max34451_na6 = true; - data->info.format[PSC_VOLTAGE_IN] = direct; - data->info.format[PSC_CURRENT_IN] = direct; - data->info.m[PSC_VOLTAGE_IN] = 1; - data->info.b[PSC_VOLTAGE_IN] = 0; - data->info.R[PSC_VOLTAGE_IN] = 3; - data->info.m[PSC_CURRENT_IN] = 1; - data->info.b[PSC_CURRENT_IN] = 0; - data->info.R[PSC_CURRENT_IN] = 2; - data->iout_oc_fault_limit = PMBUS_IOUT_OC_FAULT_LIMIT; - data->iout_oc_warn_limit = PMBUS_IOUT_OC_WARN_LIMIT; - } for (page = 0; page < 16; page++) { rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page); @@ -275,30 +251,16 @@ static int max34451_set_supported_funcs(struct i2c_client *client, case 0x20: data->info.func[page] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; - - if (max34451_na6) - data->info.func[page] |= PMBUS_HAVE_VIN | - PMBUS_HAVE_STATUS_INPUT; break; case 0x21: data->info.func[page] = PMBUS_HAVE_VOUT; - - if (max34451_na6) - data->info.func[page] |= PMBUS_HAVE_VIN; break; case 0x22: data->info.func[page] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT; - - if (max34451_na6) - data->info.func[page] |= PMBUS_HAVE_IIN | - PMBUS_HAVE_STATUS_INPUT; break; case 0x23: data->info.func[page] = PMBUS_HAVE_IOUT; - - if (max34451_na6) - data->info.func[page] |= PMBUS_HAVE_IIN; break; default: break; @@ -532,8 +494,6 @@ static int max34440_probe(struct i2c_client *client) return -ENOMEM; data->id = i2c_match_id(max34440_id, client)->driver_data; data->info = max34440_info[data->id]; - data->iout_oc_fault_limit = MAX34440_IOUT_OC_FAULT_LIMIT; - data->iout_oc_warn_limit = MAX34440_IOUT_OC_WARN_LIMIT; if (data->id == max34451) { rv = max34451_set_supported_funcs(client, data); diff --git a/drivers/hwmon/xgene-hwmon.c b/drivers/hwmon/xgene-hwmon.c index 6768dbf39039063f28eaa1c85ba8c14b1be675c2..207084d55044a19b4ad7c9c4c96fd892f0a52e79 100644 --- a/drivers/hwmon/xgene-hwmon.c +++ b/drivers/hwmon/xgene-hwmon.c @@ -111,7 +111,7 @@ struct xgene_hwmon_dev { phys_addr_t comm_base_addr; void *pcc_comm_addr; - unsigned int usecs_lat; + u64 usecs_lat; }; /* diff --git a/drivers/hwtracing/coresight/coresight-config.h b/drivers/hwtracing/coresight/coresight-config.h index 84cdde6f0e4db26074d0ffb63a1a5eefa0551e10..6ba0139757418293f3308ab98a83961ac0ee3eda 100644 --- a/drivers/hwtracing/coresight/coresight-config.h +++ b/drivers/hwtracing/coresight/coresight-config.h @@ -228,7 +228,7 @@ struct cscfg_feature_csdev { * @feats_csdev:references to the device features to enable. */ struct cscfg_config_csdev { - struct cscfg_config_desc *config_desc; + const struct cscfg_config_desc *config_desc; struct coresight_device *csdev; bool enabled; struct list_head node; diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c index 3b57851869eaae89225b339cfc082cd907d5f984..783e259c3761217b5184835eca837f7db4ec4e53 100644 --- a/drivers/hwtracing/coresight/coresight-core.c +++ b/drivers/hwtracing/coresight/coresight-core.c @@ -135,8 +135,7 @@ coresight_find_out_connection(struct coresight_device *src_dev, static inline u32 coresight_read_claim_tags(struct coresight_device *csdev) { - return FIELD_GET(CORESIGHT_CLAIM_MASK, - csdev_access_relaxed_read32(&csdev->access, CORESIGHT_CLAIMCLR)); + return csdev_access_relaxed_read32(&csdev->access, CORESIGHT_CLAIMCLR); } static inline bool coresight_is_claimed_self_hosted(struct coresight_device *csdev) diff --git a/drivers/hwtracing/coresight/coresight-priv.h b/drivers/hwtracing/coresight/coresight-priv.h index b758a42ed8c734c01a811033ea485390ce106cd4..30c051055e54b35d8e4fcb6f816fd79cbfdcc669 100644 --- a/drivers/hwtracing/coresight/coresight-priv.h +++ b/drivers/hwtracing/coresight/coresight-priv.h @@ -32,7 +32,6 @@ * Coresight device CLAIM protocol. * See PSCI - ARM DEN 0022D, Section: 6.8.1 Debug and Trace save and restore. */ -#define CORESIGHT_CLAIM_MASK GENMASK(1, 0) #define CORESIGHT_CLAIM_SELF_HOSTED BIT(1) #define TIMEOUT_US 100 diff --git a/drivers/hwtracing/coresight/coresight-syscfg.c b/drivers/hwtracing/coresight/coresight-syscfg.c index 30a561d874819bbdf36a12a42eba80d2c47d9180..11138a9762b0150f674440f54bcaa438241d770b 100644 --- a/drivers/hwtracing/coresight/coresight-syscfg.c +++ b/drivers/hwtracing/coresight/coresight-syscfg.c @@ -867,25 +867,6 @@ void cscfg_csdev_reset_feats(struct coresight_device *csdev) } EXPORT_SYMBOL_GPL(cscfg_csdev_reset_feats); -static bool cscfg_config_desc_get(struct cscfg_config_desc *config_desc) -{ - if (!atomic_fetch_inc(&config_desc->active_cnt)) { - /* must ensure that config cannot be unloaded in use */ - if (unlikely(cscfg_owner_get(config_desc->load_owner))) { - atomic_dec(&config_desc->active_cnt); - return false; - } - } - - return true; -} - -static void cscfg_config_desc_put(struct cscfg_config_desc *config_desc) -{ - if (!atomic_dec_return(&config_desc->active_cnt)) - cscfg_owner_put(config_desc->load_owner); -} - /* * This activate configuration for either perf or sysfs. Perf can have multiple * active configs, selected per event, sysfs is limited to one. @@ -909,17 +890,22 @@ static int _cscfg_activate_config(unsigned long cfg_hash) if (config_desc->available == false) return -EBUSY; - if (!cscfg_config_desc_get(config_desc)) { - err = -EINVAL; + /* must ensure that config cannot be unloaded in use */ + err = cscfg_owner_get(config_desc->load_owner); + if (err) break; - } - /* * increment the global active count - control changes to * active configurations */ atomic_inc(&cscfg_mgr->sys_active_cnt); + /* + * mark the descriptor as active so enable config on a + * device instance will use it + */ + atomic_inc(&config_desc->active_cnt); + err = 0; dev_dbg(cscfg_device(), "Activate config %s.\n", config_desc->name); break; @@ -934,8 +920,9 @@ static void _cscfg_deactivate_config(unsigned long cfg_hash) list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) { if ((unsigned long)config_desc->event_ea->var == cfg_hash) { + atomic_dec(&config_desc->active_cnt); atomic_dec(&cscfg_mgr->sys_active_cnt); - cscfg_config_desc_put(config_desc); + cscfg_owner_put(config_desc->load_owner); dev_dbg(cscfg_device(), "Deactivate config %s.\n", config_desc->name); break; } @@ -1060,7 +1047,7 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev, unsigned long cfg_hash, int preset) { struct cscfg_config_csdev *config_csdev_active = NULL, *config_csdev_item; - struct cscfg_config_desc *config_desc; + const struct cscfg_config_desc *config_desc; unsigned long flags; int err = 0; @@ -1075,8 +1062,8 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev, spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags); list_for_each_entry(config_csdev_item, &csdev->config_csdev_list, node) { config_desc = config_csdev_item->config_desc; - if (((unsigned long)config_desc->event_ea->var == cfg_hash) && - cscfg_config_desc_get(config_desc)) { + if ((atomic_read(&config_desc->active_cnt)) && + ((unsigned long)config_desc->event_ea->var == cfg_hash)) { config_csdev_active = config_csdev_item; csdev->active_cscfg_ctxt = (void *)config_csdev_active; break; @@ -1110,11 +1097,7 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev, err = -EBUSY; spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags); } - - if (err) - cscfg_config_desc_put(config_desc); } - return err; } EXPORT_SYMBOL_GPL(cscfg_csdev_enable_active_config); @@ -1153,10 +1136,8 @@ void cscfg_csdev_disable_active_config(struct coresight_device *csdev) spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags); /* true if there was an enabled active config */ - if (config_csdev) { + if (config_csdev) cscfg_csdev_disable_config(config_csdev); - cscfg_config_desc_put(config_csdev->config_desc); - } } EXPORT_SYMBOL_GPL(cscfg_csdev_disable_active_config); diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 8d4270664ebd1142bcb84d5b3f7f457458203149..982007a112c2a082d1d201eb9116684623f7c3a3 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig @@ -899,7 +899,6 @@ config I2C_OMAP tristate "OMAP I2C adapter" depends on ARCH_OMAP || ARCH_K3 || COMPILE_TEST default MACH_OMAP_OSK - select MULTIPLEXER help If you say yes to this option, support will be included for the I2C interface on the Texas Instruments OMAP1/2 family of processors. diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c index e865869ccc50ee6711b9c01be76305f48d2fbe6b..51f5491648c0773e6c8c02a216cb793196c6b9de 100644 --- a/drivers/i2c/busses/i2c-designware-master.c +++ b/drivers/i2c/busses/i2c-designware-master.c @@ -327,7 +327,6 @@ static int amd_i2c_dw_xfer_quirk(struct i2c_adapter *adap, struct i2c_msg *msgs, dev->msgs = msgs; dev->msgs_num = num_msgs; - dev->msg_write_idx = 0; i2c_dw_xfer_init(dev); regmap_write(dev->map, DW_IC_INTR_MASK, 0); diff --git a/drivers/i2c/busses/i2c-designware-slave.c b/drivers/i2c/busses/i2c-designware-slave.c index ea4c4955fe2646eaad11070bed8758fe0156e95e..345b532a2b455de57b0e773a102787adbb58f571 100644 --- a/drivers/i2c/busses/i2c-designware-slave.c +++ b/drivers/i2c/busses/i2c-designware-slave.c @@ -91,7 +91,7 @@ static int i2c_dw_unreg_slave(struct i2c_client *slave) i2c_dw_disable(dev); synchronize_irq(dev->irq); dev->slave = NULL; - pm_runtime_put_sync_suspend(dev->dev); + pm_runtime_put(dev->dev); return 0; } diff --git a/drivers/i2c/busses/i2c-npcm7xx.c b/drivers/i2c/busses/i2c-npcm7xx.c index 5b3987460976e3a5640b2acd1f79df9ea01fb62b..91f508d50e7ab4b3bcdd74334457c15326e204dd 100644 --- a/drivers/i2c/busses/i2c-npcm7xx.c +++ b/drivers/i2c/busses/i2c-npcm7xx.c @@ -1971,14 +1971,10 @@ static int npcm_i2c_init_module(struct npcm_i2c *bus, enum i2c_mode mode, /* Check HW is OK: SDA and SCL should be high at this point. */ if ((npcm_i2c_get_SDA(&bus->adap) == 0) || (npcm_i2c_get_SCL(&bus->adap) == 0)) { - dev_warn(bus->dev, " I2C%d SDA=%d SCL=%d, attempting to recover\n", bus->num, - npcm_i2c_get_SDA(&bus->adap), npcm_i2c_get_SCL(&bus->adap)); - if (npcm_i2c_recovery_tgclk(&bus->adap)) { - dev_err(bus->dev, "I2C%d init fail: SDA=%d SCL=%d\n", - bus->num, npcm_i2c_get_SDA(&bus->adap), - npcm_i2c_get_SCL(&bus->adap)); - return -ENXIO; - } + dev_err(bus->dev, "I2C%d init fail: lines are low\n", bus->num); + dev_err(bus->dev, "SDA=%d SCL=%d\n", npcm_i2c_get_SDA(&bus->adap), + npcm_i2c_get_SCL(&bus->adap)); + return -ENXIO; } npcm_i2c_int_enable(bus, true); diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index fad88ab32716f0a070efb6bb57a2c635c1b86a41..22975bfd6b252bff8efa4fa597d3f01b4190608b 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -212,7 +211,6 @@ struct omap_i2c_dev { u16 syscstate; u16 westate; u16 errata; - struct mux_state *mux_state; }; static const u8 reg_map_ip_v1[] = { @@ -1457,27 +1455,8 @@ omap_i2c_probe(struct platform_device *pdev) (1000 * omap->speed / 8); } - if (of_property_present(node, "mux-states")) { - struct mux_state *mux_state; - - mux_state = devm_mux_state_get(&pdev->dev, NULL); - if (IS_ERR(mux_state)) { - r = PTR_ERR(mux_state); - dev_dbg(&pdev->dev, "failed to get I2C mux: %d\n", r); - goto err_put_pm; - } - omap->mux_state = mux_state; - r = mux_state_select(omap->mux_state); - if (r) { - dev_err(&pdev->dev, "failed to select I2C mux: %d\n", r); - goto err_put_pm; - } - } - /* reset ASAP, clearing any IRQs */ - r = omap_i2c_init(omap); - if (r) - goto err_mux_state_deselect; + omap_i2c_init(omap); if (omap->rev < OMAP_I2C_OMAP1_REV_2) r = devm_request_irq(&pdev->dev, omap->irq, omap_i2c_omap1_isr, @@ -1520,10 +1499,6 @@ omap_i2c_probe(struct platform_device *pdev) err_unuse_clocks: omap_i2c_write_reg(omap, OMAP_I2C_CON_REG, 0); -err_mux_state_deselect: - if (omap->mux_state) - mux_state_deselect(omap->mux_state); -err_put_pm: pm_runtime_dont_use_autosuspend(omap->dev); pm_runtime_put_sync(omap->dev); err_disable_pm: @@ -1539,9 +1514,6 @@ static void omap_i2c_remove(struct platform_device *pdev) i2c_del_adapter(&omap->adapter); - if (omap->mux_state) - mux_state_deselect(omap->mux_state); - ret = pm_runtime_get_sync(&pdev->dev); if (ret < 0) dev_err(omap->dev, "Failed to resume hardware, skip disable\n"); diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c index f324f397356c2b25c9aedba44159a6f75b5cd64c..ee92a315f074fe200ffd7dceb27072606c53f807 100644 --- a/drivers/i2c/busses/i2c-qup.c +++ b/drivers/i2c/busses/i2c-qup.c @@ -452,10 +452,8 @@ static int qup_i2c_bus_active(struct qup_i2c_dev *qup, int len) if (!(status & I2C_STATUS_BUS_ACTIVE)) break; - if (time_after(jiffies, timeout)) { + if (time_after(jiffies, timeout)) ret = -ETIMEDOUT; - break; - } usleep_range(len, len * 2); } diff --git a/drivers/i2c/busses/i2c-robotfuzz-osif.c b/drivers/i2c/busses/i2c-robotfuzz-osif.c index 8e4cf9028b234246cbfba0e997c34237d337ff38..66dfa211e736b1a8a7d0e9392f8dfad95eeac569 100644 --- a/drivers/i2c/busses/i2c-robotfuzz-osif.c +++ b/drivers/i2c/busses/i2c-robotfuzz-osif.c @@ -111,11 +111,6 @@ static u32 osif_func(struct i2c_adapter *adapter) return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; } -/* prevent invalid 0-length usb_control_msg */ -static const struct i2c_adapter_quirks osif_quirks = { - .flags = I2C_AQ_NO_ZERO_LEN_READ, -}; - static const struct i2c_algorithm osif_algorithm = { .master_xfer = osif_xfer, .functionality = osif_func, @@ -148,7 +143,6 @@ static int osif_probe(struct usb_interface *interface, priv->adapter.owner = THIS_MODULE; priv->adapter.class = I2C_CLASS_HWMON; - priv->adapter.quirks = &osif_quirks; priv->adapter.algo = &osif_algorithm; priv->adapter.algo_data = priv; snprintf(priv->adapter.name, sizeof(priv->adapter.name), diff --git a/drivers/i2c/busses/i2c-stm32.c b/drivers/i2c/busses/i2c-stm32.c index f84ec056e36dfedb2d72fe34c0b179604943708e..157c64e27d0bd3ca44b6e38be9caa96f9a41d784 100644 --- a/drivers/i2c/busses/i2c-stm32.c +++ b/drivers/i2c/busses/i2c-stm32.c @@ -102,6 +102,7 @@ int stm32_i2c_prep_dma_xfer(struct device *dev, struct stm32_i2c_dma *dma, void *dma_async_param) { struct dma_async_tx_descriptor *txdesc; + struct device *chan_dev; int ret; if (rd_wr) { @@ -115,10 +116,11 @@ int stm32_i2c_prep_dma_xfer(struct device *dev, struct stm32_i2c_dma *dma, } dma->dma_len = len; + chan_dev = dma->chan_using->device->dev; - dma->dma_buf = dma_map_single(dev, buf, dma->dma_len, + dma->dma_buf = dma_map_single(chan_dev, buf, dma->dma_len, dma->dma_data_dir); - if (dma_mapping_error(dev, dma->dma_buf)) { + if (dma_mapping_error(chan_dev, dma->dma_buf)) { dev_err(dev, "DMA mapping failed\n"); return -EINVAL; } @@ -148,7 +150,7 @@ int stm32_i2c_prep_dma_xfer(struct device *dev, struct stm32_i2c_dma *dma, return 0; err: - dma_unmap_single(dev, dma->dma_buf, dma->dma_len, + dma_unmap_single(chan_dev, dma->dma_buf, dma->dma_len, dma->dma_data_dir); return ret; } diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c index 85f8fd6a21ec4d67ff996b20a2e598bb78b05054..b4f10ff31102b63c101714ddbdcfee01821df3aa 100644 --- a/drivers/i2c/busses/i2c-stm32f7.c +++ b/drivers/i2c/busses/i2c-stm32f7.c @@ -728,10 +728,10 @@ static void stm32f7_i2c_dma_callback(void *arg) { struct stm32f7_i2c_dev *i2c_dev = (struct stm32f7_i2c_dev *)arg; struct stm32_i2c_dma *dma = i2c_dev->dma; + struct device *dev = dma->chan_using->device->dev; stm32f7_i2c_disable_dma_req(i2c_dev); - dma_unmap_single(i2c_dev->dev, dma->dma_buf, dma->dma_len, - dma->dma_data_dir); + dma_unmap_single(dev, dma->dma_buf, dma->dma_len, dma->dma_data_dir); complete(&dma->dma_complete); } diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 5766231b13cd171aea01cf00762ae18f941e351e..91be04b534fe61d23f1c3ef2cdd69e6c46f8a723 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -607,6 +607,7 @@ static int tegra_i2c_wait_for_config_load(struct tegra_i2c_dev *i2c_dev) static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) { u32 val, clk_divisor, clk_multiplier, tsu_thd, tlow, thigh, non_hs_mode; + acpi_handle handle = ACPI_HANDLE(i2c_dev->dev); struct i2c_timings *t = &i2c_dev->timings; int err; @@ -618,7 +619,11 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) * emit a noisy warning on error, which won't stay unnoticed and * won't hose machine entirely. */ - err = device_reset(i2c_dev->dev); + if (handle) + err = acpi_evaluate_object(handle, "_RST", NULL, NULL); + else + err = reset_control_reset(i2c_dev->rst); + WARN_ON_ONCE(err); if (IS_DVC(i2c_dev)) @@ -1392,11 +1397,6 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], ret = tegra_i2c_xfer_msg(i2c_dev, &msgs[i], MSG_END_CONTINUE); if (ret) break; - - /* Validate message length before proceeding */ - if (msgs[i].buf[0] == 0 || msgs[i].buf[0] > I2C_SMBUS_BLOCK_MAX) - break; - /* Set the msg length from first byte */ msgs[i].len += msgs[i].buf[0]; dev_dbg(i2c_dev->dev, "reading %d bytes\n", msgs[i].len); @@ -1663,6 +1663,19 @@ static void tegra_i2c_parse_dt(struct tegra_i2c_dev *i2c_dev) i2c_dev->is_vi = true; } +static int tegra_i2c_init_reset(struct tegra_i2c_dev *i2c_dev) +{ + if (ACPI_HANDLE(i2c_dev->dev)) + return 0; + + i2c_dev->rst = devm_reset_control_get_exclusive(i2c_dev->dev, "i2c"); + if (IS_ERR(i2c_dev->rst)) + return dev_err_probe(i2c_dev->dev, PTR_ERR(i2c_dev->rst), + "failed to get reset control\n"); + + return 0; +} + static int tegra_i2c_init_clocks(struct tegra_i2c_dev *i2c_dev) { int err; @@ -1772,6 +1785,10 @@ static int tegra_i2c_probe(struct platform_device *pdev) tegra_i2c_parse_dt(i2c_dev); + err = tegra_i2c_init_reset(i2c_dev); + if (err) + return err; + err = tegra_i2c_init_clocks(i2c_dev); if (err) return err; diff --git a/drivers/i2c/busses/i2c-tiny-usb.c b/drivers/i2c/busses/i2c-tiny-usb.c index d984b90b352701b0bf3f44bb2439174d946ce925..1bffe36c40ad890d68f7a482b1a8dbbed94f3ef4 100644 --- a/drivers/i2c/busses/i2c-tiny-usb.c +++ b/drivers/i2c/busses/i2c-tiny-usb.c @@ -140,11 +140,6 @@ static u32 usb_func(struct i2c_adapter *adapter) return ret; } -/* prevent invalid 0-length usb_control_msg */ -static const struct i2c_adapter_quirks usb_quirks = { - .flags = I2C_AQ_NO_ZERO_LEN_READ, -}; - /* This is the actual algorithm we define */ static const struct i2c_algorithm usb_algorithm = { .master_xfer = usb_xfer, @@ -253,7 +248,6 @@ static int i2c_tiny_usb_probe(struct usb_interface *interface, /* setup i2c adapter description */ dev->adapter.owner = THIS_MODULE; dev->adapter.class = I2C_CLASS_HWMON; - dev->adapter.quirks = &usb_quirks; dev->adapter.algo = &usb_algorithm; dev->adapter.algo_data = dev; snprintf(dev->adapter.name, sizeof(dev->adapter.name), diff --git a/drivers/i2c/busses/i2c-virtio.c b/drivers/i2c/busses/i2c-virtio.c index 726c162cabd8681796ca14aae1858bc272d881b5..c60ae531ba57c7f0a5f830267e0d0bbb044da2b7 100644 --- a/drivers/i2c/busses/i2c-virtio.c +++ b/drivers/i2c/busses/i2c-virtio.c @@ -116,16 +116,15 @@ static int virtio_i2c_complete_reqs(struct virtqueue *vq, for (i = 0; i < num; i++) { struct virtio_i2c_req *req = &reqs[i]; - if (!failed) { - if (wait_for_completion_interruptible(&req->completion)) - failed = true; - else if (req->in_hdr.status != VIRTIO_I2C_MSG_OK) - failed = true; - else - j++; - } + wait_for_completion(&req->completion); + + if (!failed && req->in_hdr.status != VIRTIO_I2C_MSG_OK) + failed = true; i2c_put_dma_safe_msg_buf(reqs[i].buf, &msgs[i], !failed); + + if (!failed) + j++; } return j; diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c index d1630d47ef6fcfa1849c7d67fd1746bf64f0a6b3..3d1734849e0d941db4642f02d71a0984edc56e5b 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -504,7 +504,6 @@ static void svc_i3c_master_ibi_work(struct work_struct *work) break; case SVC_I3C_MSTATUS_IBITYPE_MASTER_REQUEST: svc_i3c_master_emit_stop(master); - break; default: break; } diff --git a/drivers/iio/accel/fxls8962af-core.c b/drivers/iio/accel/fxls8962af-core.c index f4e253c6c7d70cc8e43ab00f7a6ff6214f4ea93c..be8a15cb945fdf9c007eac135347e2af3c7b7b09 100644 --- a/drivers/iio/accel/fxls8962af-core.c +++ b/drivers/iio/accel/fxls8962af-core.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -435,16 +434,8 @@ static int fxls8962af_read_raw(struct iio_dev *indio_dev, *val = FXLS8962AF_TEMP_CENTER_VAL; return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: - switch (chan->type) { - case IIO_TEMP: - *val = MILLIDEGREE_PER_DEGREE; - return IIO_VAL_INT; - case IIO_ACCEL: - *val = 0; - return fxls8962af_read_full_scale(data, val2); - default: - return -EINVAL; - } + *val = 0; + return fxls8962af_read_full_scale(data, val2); case IIO_CHAN_INFO_SAMP_FREQ: return fxls8962af_read_samp_freq(data, val, val2); default: @@ -743,11 +734,9 @@ static const struct iio_event_spec fxls8962af_event[] = { .type = IIO_TEMP, \ .address = FXLS8962AF_TEMP_OUT, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ - BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_OFFSET),\ .scan_index = -1, \ .scan_type = { \ - .sign = 's', \ .realbits = 8, \ .storagebits = 8, \ }, \ @@ -865,8 +854,6 @@ static int fxls8962af_buffer_predisable(struct iio_dev *indio_dev) if (ret) return ret; - synchronize_irq(data->irq); - ret = __fxls8962af_fifo_set_mode(data, false); if (data->enable_event) diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c index f631351eef97b92b9a882b5f69640228fa4e39d6..0e6baf017bfd1e0c7d07efb48406a0ab95c28037 100644 --- a/drivers/iio/adc/ad7124.c +++ b/drivers/iio/adc/ad7124.c @@ -300,9 +300,9 @@ static int ad7124_get_3db_filter_freq(struct ad7124_state *st, switch (st->channels[channel].cfg.filter_type) { case AD7124_SINC3_FILTER: - return DIV_ROUND_CLOSEST(fadc * 272, 1000); - case AD7124_SINC4_FILTER: return DIV_ROUND_CLOSEST(fadc * 230, 1000); + case AD7124_SINC4_FILTER: + return DIV_ROUND_CLOSEST(fadc * 262, 1000); default: return -EINVAL; } diff --git a/drivers/iio/adc/ad7606_spi.c b/drivers/iio/adc/ad7606_spi.c index df48464a115d03f7778105846b867b0a01a08e28..67c96572cecc4017b68567ae53a48311c7de98d2 100644 --- a/drivers/iio/adc/ad7606_spi.c +++ b/drivers/iio/adc/ad7606_spi.c @@ -151,7 +151,7 @@ static int ad7606_spi_reg_write(struct ad7606_state *st, struct spi_device *spi = to_spi_device(st->dev); st->d16[0] = cpu_to_be16((st->bops->rd_wr_cmd(addr, 1) << 8) | - (val & 0xFF)); + (val & 0x1FF)); return spi_write(spi, &st->d16[0], sizeof(st->d16[0])); } diff --git a/drivers/iio/adc/ad7949.c b/drivers/iio/adc/ad7949.c index 202561cad4012b67e23ad6d3623c913cfef35e68..edd0c3a35ab73cca5ff87632e4d588eb5d712b47 100644 --- a/drivers/iio/adc/ad7949.c +++ b/drivers/iio/adc/ad7949.c @@ -308,6 +308,7 @@ static void ad7949_disable_reg(void *reg) static int ad7949_spi_probe(struct spi_device *spi) { + u32 spi_ctrl_mask = spi->controller->bits_per_word_mask; struct device *dev = &spi->dev; const struct ad7949_adc_spec *spec; struct ad7949_adc_chip *ad7949_adc; @@ -336,11 +337,11 @@ static int ad7949_spi_probe(struct spi_device *spi) ad7949_adc->resolution = spec->resolution; /* Set SPI bits per word */ - if (spi_is_bpw_supported(spi, ad7949_adc->resolution)) { + if (spi_ctrl_mask & SPI_BPW_MASK(ad7949_adc->resolution)) { spi->bits_per_word = ad7949_adc->resolution; - } else if (spi_is_bpw_supported(spi, 16)) { + } else if (spi_ctrl_mask == SPI_BPW_MASK(16)) { spi->bits_per_word = 16; - } else if (spi_is_bpw_supported(spi, 8)) { + } else if (spi_ctrl_mask == SPI_BPW_MASK(8)) { spi->bits_per_word = 8; } else { dev_err(dev, "unable to find common BPW with spi controller\n"); diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c index 533667eefe419c1ee1604b0359940e15c9633e8f..7e21928707437baf9a2522f265d72194745205e6 100644 --- a/drivers/iio/adc/ad_sigma_delta.c +++ b/drivers/iio/adc/ad_sigma_delta.c @@ -476,10 +476,6 @@ static irqreturn_t ad_sd_trigger_handler(int irq, void *p) * byte set to zero. */ ad_sd_read_reg_raw(sigma_delta, data_reg, transfer_size, &data[1]); break; - - default: - dev_err_ratelimited(&indio_dev->dev, "Unsupported reg_size: %u\n", reg_size); - goto irq_handled; } /* diff --git a/drivers/iio/adc/max1363.c b/drivers/iio/adc/max1363.c index 5304235d733f18e4c21cc66b8983f0844b5bb168..b31581616ce34ea9af3a44a6284d052cb8bb8a88 100644 --- a/drivers/iio/adc/max1363.c +++ b/drivers/iio/adc/max1363.c @@ -510,10 +510,10 @@ static const struct iio_event_spec max1363_events[] = { MAX1363_CHAN_U(1, _s1, 1, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_U(2, _s2, 2, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_U(3, _s3, 3, bits, ev_spec, num_ev_spec), \ - MAX1363_CHAN_B(0, 1, d0m1, 12, bits, ev_spec, num_ev_spec), \ - MAX1363_CHAN_B(2, 3, d2m3, 13, bits, ev_spec, num_ev_spec), \ - MAX1363_CHAN_B(1, 0, d1m0, 18, bits, ev_spec, num_ev_spec), \ - MAX1363_CHAN_B(3, 2, d3m2, 19, bits, ev_spec, num_ev_spec), \ + MAX1363_CHAN_B(0, 1, d0m1, 4, bits, ev_spec, num_ev_spec), \ + MAX1363_CHAN_B(2, 3, d2m3, 5, bits, ev_spec, num_ev_spec), \ + MAX1363_CHAN_B(1, 0, d1m0, 6, bits, ev_spec, num_ev_spec), \ + MAX1363_CHAN_B(3, 2, d3m2, 7, bits, ev_spec, num_ev_spec), \ IIO_CHAN_SOFT_TIMESTAMP(8) \ } @@ -531,23 +531,23 @@ static const struct iio_chan_spec max1363_channels[] = /* Applies to max1236, max1237 */ static const enum max1363_modes max1236_mode_list[] = { _s0, _s1, _s2, _s3, - s0to1, s0to2, s2to3, s0to3, + s0to1, s0to2, s0to3, d0m1, d2m3, d1m0, d3m2, d0m1to2m3, d1m0to3m2, + s2to3, }; /* Applies to max1238, max1239 */ static const enum max1363_modes max1238_mode_list[] = { _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11, s0to1, s0to2, s0to3, s0to4, s0to5, s0to6, - s6to7, s6to8, s6to9, s6to10, s6to11, s0to7, s0to8, s0to9, s0to10, s0to11, d0m1, d2m3, d4m5, d6m7, d8m9, d10m11, d1m0, d3m2, d5m4, d7m6, d9m8, d11m10, - d0m1to2m3, d0m1to4m5, d0m1to6m7, d6m7to8m9, - d0m1to8m9, d6m7to10m11, d0m1to10m11, d1m0to3m2, - d1m0to5m4, d1m0to7m6, d7m6to9m8, d1m0to9m8, - d7m6to11m10, d1m0to11m10, + d0m1to2m3, d0m1to4m5, d0m1to6m7, d0m1to8m9, d0m1to10m11, + d1m0to3m2, d1m0to5m4, d1m0to7m6, d1m0to9m8, d1m0to11m10, + s6to7, s6to8, s6to9, s6to10, s6to11, + d6m7to8m9, d6m7to10m11, d7m6to9m8, d7m6to11m10, }; #define MAX1363_12X_CHANS(bits) { \ @@ -583,15 +583,16 @@ static const struct iio_chan_spec max1238_channels[] = MAX1363_12X_CHANS(12); static const enum max1363_modes max11607_mode_list[] = { _s0, _s1, _s2, _s3, - s0to1, s0to2, s2to3, - s0to3, + s0to1, s0to2, s0to3, + s2to3, d0m1, d2m3, d1m0, d3m2, d0m1to2m3, d1m0to3m2, }; static const enum max1363_modes max11608_mode_list[] = { _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, - s0to1, s0to2, s0to3, s0to4, s0to5, s0to6, s6to7, s0to7, + s0to1, s0to2, s0to3, s0to4, s0to5, s0to6, s0to7, + s6to7, d0m1, d2m3, d4m5, d6m7, d1m0, d3m2, d5m4, d7m6, d0m1to2m3, d0m1to4m5, d0m1to6m7, @@ -607,14 +608,14 @@ static const enum max1363_modes max11608_mode_list[] = { MAX1363_CHAN_U(5, _s5, 5, bits, NULL, 0), \ MAX1363_CHAN_U(6, _s6, 6, bits, NULL, 0), \ MAX1363_CHAN_U(7, _s7, 7, bits, NULL, 0), \ - MAX1363_CHAN_B(0, 1, d0m1, 12, bits, NULL, 0), \ - MAX1363_CHAN_B(2, 3, d2m3, 13, bits, NULL, 0), \ - MAX1363_CHAN_B(4, 5, d4m5, 14, bits, NULL, 0), \ - MAX1363_CHAN_B(6, 7, d6m7, 15, bits, NULL, 0), \ - MAX1363_CHAN_B(1, 0, d1m0, 18, bits, NULL, 0), \ - MAX1363_CHAN_B(3, 2, d3m2, 19, bits, NULL, 0), \ - MAX1363_CHAN_B(5, 4, d5m4, 20, bits, NULL, 0), \ - MAX1363_CHAN_B(7, 6, d7m6, 21, bits, NULL, 0), \ + MAX1363_CHAN_B(0, 1, d0m1, 8, bits, NULL, 0), \ + MAX1363_CHAN_B(2, 3, d2m3, 9, bits, NULL, 0), \ + MAX1363_CHAN_B(4, 5, d4m5, 10, bits, NULL, 0), \ + MAX1363_CHAN_B(6, 7, d6m7, 11, bits, NULL, 0), \ + MAX1363_CHAN_B(1, 0, d1m0, 12, bits, NULL, 0), \ + MAX1363_CHAN_B(3, 2, d3m2, 13, bits, NULL, 0), \ + MAX1363_CHAN_B(5, 4, d5m4, 14, bits, NULL, 0), \ + MAX1363_CHAN_B(7, 6, d7m6, 15, bits, NULL, 0), \ IIO_CHAN_SOFT_TIMESTAMP(16) \ } static const struct iio_chan_spec max11602_channels[] = MAX1363_8X_CHANS(8); diff --git a/drivers/iio/adc/stm32-adc-core.c b/drivers/iio/adc/stm32-adc-core.c index 9f1566a378de47e6699c6c3ca957235cfbfe0926..bbd5bdd732f01b519d829c1ec89117ff08a3da0e 100644 --- a/drivers/iio/adc/stm32-adc-core.c +++ b/drivers/iio/adc/stm32-adc-core.c @@ -428,9 +428,10 @@ static int stm32_adc_irq_probe(struct platform_device *pdev, return -ENOMEM; } - for (i = 0; i < priv->cfg->num_irqs; i++) - irq_set_chained_handler_and_data(priv->irq[i], - stm32_adc_irq_handler, priv); + for (i = 0; i < priv->cfg->num_irqs; i++) { + irq_set_chained_handler(priv->irq[i], stm32_adc_irq_handler); + irq_set_handler_data(priv->irq[i], priv); + } return 0; } diff --git a/drivers/iio/filter/admv8818.c b/drivers/iio/filter/admv8818.c index cc8ce0fe74e7c6e738accd1e5f2035ccfee299db..d85b7d3de86604b0cfc9d4e2aab566819f96b4b3 100644 --- a/drivers/iio/filter/admv8818.c +++ b/drivers/iio/filter/admv8818.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -71,16 +70,6 @@ #define ADMV8818_HPF_WR0_MSK GENMASK(7, 4) #define ADMV8818_LPF_WR0_MSK GENMASK(3, 0) -#define ADMV8818_BAND_BYPASS 0 -#define ADMV8818_BAND_MIN 1 -#define ADMV8818_BAND_MAX 4 -#define ADMV8818_BAND_CORNER_LOW 0 -#define ADMV8818_BAND_CORNER_HIGH 1 - -#define ADMV8818_STATE_MIN 0 -#define ADMV8818_STATE_MAX 15 -#define ADMV8818_NUM_STATES 16 - enum { ADMV8818_BW_FREQ, ADMV8818_CENTER_FREQ @@ -101,24 +90,20 @@ struct admv8818_state { struct mutex lock; unsigned int filter_mode; u64 cf_hz; - u64 lpf_margin_hz; - u64 hpf_margin_hz; }; -static const unsigned long long freq_range_hpf[5][2] = { - {0ULL, 0ULL}, /* bypass */ +static const unsigned long long freq_range_hpf[4][2] = { {1750000000ULL, 3550000000ULL}, {3400000000ULL, 7250000000ULL}, {6600000000, 12000000000}, {12500000000, 19900000000} }; -static const unsigned long long freq_range_lpf[5][2] = { - {U64_MAX, U64_MAX}, /* bypass */ +static const unsigned long long freq_range_lpf[4][2] = { {2050000000ULL, 3850000000ULL}, {3350000000ULL, 7250000000ULL}, {7000000000, 13000000000}, - {12550000000, 18850000000} + {12550000000, 18500000000} }; static const struct regmap_config admv8818_regmap_config = { @@ -136,59 +121,44 @@ static const char * const admv8818_modes[] = { static int __admv8818_hpf_select(struct admv8818_state *st, u64 freq) { - int band, state, ret; - unsigned int hpf_state = ADMV8818_STATE_MIN, hpf_band = ADMV8818_BAND_BYPASS; - u64 freq_error, min_freq_error, freq_corner, freq_step; + unsigned int hpf_step = 0, hpf_band = 0, i, j; + u64 freq_step; + int ret; - if (freq < freq_range_hpf[ADMV8818_BAND_MIN][ADMV8818_BAND_CORNER_LOW]) + if (freq < freq_range_hpf[0][0]) goto hpf_write; - if (freq >= freq_range_hpf[ADMV8818_BAND_MAX][ADMV8818_BAND_CORNER_HIGH]) { - hpf_state = ADMV8818_STATE_MAX; - hpf_band = ADMV8818_BAND_MAX; - goto hpf_write; - } + if (freq > freq_range_hpf[3][1]) { + hpf_step = 15; + hpf_band = 4; - /* Close HPF frequency gap between 12 and 12.5 GHz */ - if (freq >= 12000ULL * HZ_PER_MHZ && freq < 12500ULL * HZ_PER_MHZ) { - hpf_state = ADMV8818_STATE_MAX; - hpf_band = 3; goto hpf_write; } - min_freq_error = U64_MAX; - for (band = ADMV8818_BAND_MIN; band <= ADMV8818_BAND_MAX; band++) { - /* - * This (and therefore all other ranges) have a corner - * frequency higher than the target frequency. - */ - if (freq_range_hpf[band][ADMV8818_BAND_CORNER_LOW] > freq) - break; + for (i = 0; i < 4; i++) { + freq_step = div_u64((freq_range_hpf[i][1] - + freq_range_hpf[i][0]), 15); + + if (freq > freq_range_hpf[i][0] && + (freq < freq_range_hpf[i][1] + freq_step)) { + hpf_band = i + 1; - freq_step = freq_range_hpf[band][ADMV8818_BAND_CORNER_HIGH] - - freq_range_hpf[band][ADMV8818_BAND_CORNER_LOW]; - freq_step = div_u64(freq_step, ADMV8818_NUM_STATES - 1); - - for (state = ADMV8818_STATE_MIN; state <= ADMV8818_STATE_MAX; state++) { - freq_corner = freq_range_hpf[band][ADMV8818_BAND_CORNER_LOW] + - freq_step * state; - - /* - * This (and therefore all other states) have a corner - * frequency higher than the target frequency. - */ - if (freq_corner > freq) - break; - - freq_error = freq - freq_corner; - if (freq_error < min_freq_error) { - min_freq_error = freq_error; - hpf_state = state; - hpf_band = band; + for (j = 1; j <= 16; j++) { + if (freq < (freq_range_hpf[i][0] + (freq_step * j))) { + hpf_step = j - 1; + break; + } } + break; } } + /* Close HPF frequency gap between 12 and 12.5 GHz */ + if (freq >= 12000 * HZ_PER_MHZ && freq <= 12500 * HZ_PER_MHZ) { + hpf_band = 3; + hpf_step = 15; + } + hpf_write: ret = regmap_update_bits(st->regmap, ADMV8818_REG_WR0_SW, ADMV8818_SW_IN_SET_WR0_MSK | @@ -200,7 +170,7 @@ static int __admv8818_hpf_select(struct admv8818_state *st, u64 freq) return regmap_update_bits(st->regmap, ADMV8818_REG_WR0_FILTER, ADMV8818_HPF_WR0_MSK, - FIELD_PREP(ADMV8818_HPF_WR0_MSK, hpf_state)); + FIELD_PREP(ADMV8818_HPF_WR0_MSK, hpf_step)); } static int admv8818_hpf_select(struct admv8818_state *st, u64 freq) @@ -216,52 +186,31 @@ static int admv8818_hpf_select(struct admv8818_state *st, u64 freq) static int __admv8818_lpf_select(struct admv8818_state *st, u64 freq) { - int band, state, ret; - unsigned int lpf_state = ADMV8818_STATE_MIN, lpf_band = ADMV8818_BAND_BYPASS; - u64 freq_error, min_freq_error, freq_corner, freq_step; + unsigned int lpf_step = 0, lpf_band = 0, i, j; + u64 freq_step; + int ret; - if (freq > freq_range_lpf[ADMV8818_BAND_MAX][ADMV8818_BAND_CORNER_HIGH]) + if (freq > freq_range_lpf[3][1]) goto lpf_write; - if (freq < freq_range_lpf[ADMV8818_BAND_MIN][ADMV8818_BAND_CORNER_LOW]) { - lpf_state = ADMV8818_STATE_MIN; - lpf_band = ADMV8818_BAND_MIN; + if (freq < freq_range_lpf[0][0]) { + lpf_band = 1; + goto lpf_write; } - min_freq_error = U64_MAX; - for (band = ADMV8818_BAND_MAX; band >= ADMV8818_BAND_MIN; --band) { - /* - * At this point the highest corner frequency of - * all remaining ranges is below the target. - * LPF corner should be >= the target. - */ - if (freq > freq_range_lpf[band][ADMV8818_BAND_CORNER_HIGH]) - break; - - freq_step = freq_range_lpf[band][ADMV8818_BAND_CORNER_HIGH] - - freq_range_lpf[band][ADMV8818_BAND_CORNER_LOW]; - freq_step = div_u64(freq_step, ADMV8818_NUM_STATES - 1); - - for (state = ADMV8818_STATE_MAX; state >= ADMV8818_STATE_MIN; --state) { - - freq_corner = freq_range_lpf[band][ADMV8818_BAND_CORNER_LOW] + - state * freq_step; + for (i = 0; i < 4; i++) { + if (freq > freq_range_lpf[i][0] && freq < freq_range_lpf[i][1]) { + lpf_band = i + 1; + freq_step = div_u64((freq_range_lpf[i][1] - freq_range_lpf[i][0]), 15); - /* - * At this point all other states in range will - * place the corner frequency below the target - * LPF corner should >= the target. - */ - if (freq > freq_corner) - break; - - freq_error = freq_corner - freq; - if (freq_error < min_freq_error) { - min_freq_error = freq_error; - lpf_state = state; - lpf_band = band; + for (j = 0; j <= 15; j++) { + if (freq < (freq_range_lpf[i][0] + (freq_step * j))) { + lpf_step = j; + break; + } } + break; } } @@ -276,7 +225,7 @@ static int __admv8818_lpf_select(struct admv8818_state *st, u64 freq) return regmap_update_bits(st->regmap, ADMV8818_REG_WR0_FILTER, ADMV8818_LPF_WR0_MSK, - FIELD_PREP(ADMV8818_LPF_WR0_MSK, lpf_state)); + FIELD_PREP(ADMV8818_LPF_WR0_MSK, lpf_step)); } static int admv8818_lpf_select(struct admv8818_state *st, u64 freq) @@ -293,28 +242,16 @@ static int admv8818_lpf_select(struct admv8818_state *st, u64 freq) static int admv8818_rfin_band_select(struct admv8818_state *st) { int ret; - u64 hpf_corner_target, lpf_corner_target; st->cf_hz = clk_get_rate(st->clkin); - /* Check for underflow */ - if (st->cf_hz > st->hpf_margin_hz) - hpf_corner_target = st->cf_hz - st->hpf_margin_hz; - else - hpf_corner_target = 0; - - /* Check for overflow */ - lpf_corner_target = st->cf_hz + st->lpf_margin_hz; - if (lpf_corner_target < st->cf_hz) - lpf_corner_target = U64_MAX; - mutex_lock(&st->lock); - ret = __admv8818_hpf_select(st, hpf_corner_target); + ret = __admv8818_hpf_select(st, st->cf_hz); if (ret) goto exit; - ret = __admv8818_lpf_select(st, lpf_corner_target); + ret = __admv8818_lpf_select(st, st->cf_hz); exit: mutex_unlock(&st->lock); return ret; @@ -341,11 +278,8 @@ static int __admv8818_read_hpf_freq(struct admv8818_state *st, u64 *hpf_freq) hpf_state = FIELD_GET(ADMV8818_HPF_WR0_MSK, data); - *hpf_freq = freq_range_hpf[hpf_band][ADMV8818_BAND_CORNER_HIGH] - - freq_range_hpf[hpf_band][ADMV8818_BAND_CORNER_LOW]; - *hpf_freq = div_u64(*hpf_freq, ADMV8818_NUM_STATES - 1); - *hpf_freq = freq_range_hpf[hpf_band][ADMV8818_BAND_CORNER_LOW] + - (*hpf_freq * hpf_state); + *hpf_freq = div_u64(freq_range_hpf[hpf_band - 1][1] - freq_range_hpf[hpf_band - 1][0], 15); + *hpf_freq = freq_range_hpf[hpf_band - 1][0] + (*hpf_freq * hpf_state); return ret; } @@ -382,11 +316,8 @@ static int __admv8818_read_lpf_freq(struct admv8818_state *st, u64 *lpf_freq) lpf_state = FIELD_GET(ADMV8818_LPF_WR0_MSK, data); - *lpf_freq = freq_range_lpf[lpf_band][ADMV8818_BAND_CORNER_HIGH] - - freq_range_lpf[lpf_band][ADMV8818_BAND_CORNER_LOW]; - *lpf_freq = div_u64(*lpf_freq, ADMV8818_NUM_STATES - 1); - *lpf_freq = freq_range_lpf[lpf_band][ADMV8818_BAND_CORNER_LOW] + - (*lpf_freq * lpf_state); + *lpf_freq = div_u64(freq_range_lpf[lpf_band - 1][1] - freq_range_lpf[lpf_band - 1][0], 15); + *lpf_freq = freq_range_lpf[lpf_band - 1][0] + (*lpf_freq * lpf_state); return ret; } @@ -402,19 +333,6 @@ static int admv8818_read_lpf_freq(struct admv8818_state *st, u64 *lpf_freq) return ret; } -static int admv8818_write_raw_get_fmt(struct iio_dev *indio_dev, - struct iio_chan_spec const *chan, - long mask) -{ - switch (mask) { - case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: - case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY: - return IIO_VAL_INT_64; - default: - return -EINVAL; - } -} - static int admv8818_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long info) @@ -423,9 +341,6 @@ static int admv8818_write_raw(struct iio_dev *indio_dev, u64 freq = ((u64)val2 << 32 | (u32)val); - if ((s64)freq < 0) - return -EINVAL; - switch (info) { case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: return admv8818_lpf_select(st, freq); @@ -587,7 +502,6 @@ static int admv8818_set_mode(struct iio_dev *indio_dev, static const struct iio_info admv8818_info = { .write_raw = admv8818_write_raw, - .write_raw_get_fmt = admv8818_write_raw_get_fmt, .read_raw = admv8818_read_raw, .debugfs_reg_access = &admv8818_reg_access, }; @@ -727,32 +641,6 @@ static int admv8818_clk_setup(struct admv8818_state *st) return devm_add_action_or_reset(&spi->dev, admv8818_clk_notifier_unreg, st); } -static int admv8818_read_properties(struct admv8818_state *st) -{ - struct spi_device *spi = st->spi; - u32 mhz; - int ret; - - ret = device_property_read_u32(&spi->dev, "adi,lpf-margin-mhz", &mhz); - if (ret == 0) - st->lpf_margin_hz = (u64)mhz * HZ_PER_MHZ; - else if (ret == -EINVAL) - st->lpf_margin_hz = 0; - else - return ret; - - - ret = device_property_read_u32(&spi->dev, "adi,hpf-margin-mhz", &mhz); - if (ret == 0) - st->hpf_margin_hz = (u64)mhz * HZ_PER_MHZ; - else if (ret == -EINVAL) - st->hpf_margin_hz = 0; - else if (ret < 0) - return ret; - - return 0; -} - static int admv8818_probe(struct spi_device *spi) { struct iio_dev *indio_dev; @@ -784,10 +672,6 @@ static int admv8818_probe(struct spi_device *spi) mutex_init(&st->lock); - ret = admv8818_read_properties(st); - if (ret) - return ret; - ret = admv8818_init(st); if (ret) return ret; diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c index 91f0f381082bda3dbb95dfe1a38adcdc4eaf5419..213cce1c31110e669e7191c8b42c9524c0d3e5db 100644 --- a/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c @@ -67,18 +67,16 @@ int inv_icm42600_temp_read_raw(struct iio_dev *indio_dev, return IIO_VAL_INT; /* * T°C = (temp / 132.48) + 25 - * Tm°C = 1000 * ((temp / 132.48) + 25) - * Tm°C = 7.548309 * temp + 25000 - * Tm°C = (temp + 3312) * 7.548309 + * Tm°C = 1000 * ((temp * 100 / 13248) + 25) * scale: 100000 / 13248 ~= 7.548309 - * offset: 3312 + * offset: 25000 */ case IIO_CHAN_INFO_SCALE: *val = 7; *val2 = 548309; return IIO_VAL_INT_PLUS_MICRO; case IIO_CHAN_INFO_OFFSET: - *val = 3312; + *val = 25000; return IIO_VAL_INT; default: return -EINVAL; diff --git a/drivers/iio/light/hid-sensor-prox.c b/drivers/iio/light/hid-sensor-prox.c index 24f7327907539348e6bfea197e037015376706e1..a47591e1bad9daaf1cd2bf6e0ad36e0a91e04fa8 100644 --- a/drivers/iio/light/hid-sensor-prox.c +++ b/drivers/iio/light/hid-sensor-prox.c @@ -102,7 +102,8 @@ static int prox_read_raw(struct iio_dev *indio_dev, ret_type = prox_state->scale_precision; break; case IIO_CHAN_INFO_OFFSET: - *val = 0; + *val = hid_sensor_convert_exponent( + prox_state->prox_attr.unit_expo); ret_type = IIO_VAL_INT; break; case IIO_CHAN_INFO_SAMP_FREQ: @@ -226,11 +227,6 @@ static int prox_parse_report(struct platform_device *pdev, dev_dbg(&pdev->dev, "prox %x:%x\n", st->prox_attr.index, st->prox_attr.report_id); - st->scale_precision = hid_sensor_format_scale(hsdev->usage, - &st->prox_attr, - &st->scale_pre_decml, - &st->scale_post_decml); - return ret; } diff --git a/drivers/iio/pressure/zpa2326.c b/drivers/iio/pressure/zpa2326.c index a1c694199c98960e201ba5ed52ea35781e7bb77e..ef1d0349f4247de478ea1b8578aca1541e1c7f20 100644 --- a/drivers/iio/pressure/zpa2326.c +++ b/drivers/iio/pressure/zpa2326.c @@ -582,7 +582,7 @@ static int zpa2326_fill_sample_buffer(struct iio_dev *indio_dev, struct { u32 pressure; u16 temperature; - aligned_s64 timestamp; + u64 timestamp; } sample; int err; diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index 77c0b89259911fdb8366662fe0397943c50765a7..0b88203720b05911aca7355a68a07f5ad0f29f85 100644 --- a/drivers/infiniband/core/cache.c +++ b/drivers/infiniband/core/cache.c @@ -582,8 +582,8 @@ static int __ib_cache_gid_add(struct ib_device *ib_dev, u32 port, out_unlock: mutex_unlock(&table->lock); if (ret) - pr_warn_ratelimited("%s: unable to add gid %pI6 error=%d\n", - __func__, gid->raw, ret); + pr_warn("%s: unable to add gid %pI6 error=%d\n", + __func__, gid->raw, ret); return ret; } diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index d45e3909dafe1d516173a07e4d7996ad603c665a..07fb8d3c037f004ccd34c5393a95c48bffdd8298 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c @@ -166,7 +166,7 @@ struct cm_port { struct cm_device { struct kref kref; struct list_head list; - rwlock_t mad_agent_lock; + spinlock_t mad_agent_lock; struct ib_device *ib_device; u8 ack_delay; int going_down; @@ -284,7 +284,7 @@ static struct ib_mad_send_buf *cm_alloc_msg(struct cm_id_private *cm_id_priv) if (!cm_id_priv->av.port) return ERR_PTR(-EINVAL); - read_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); + spin_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); mad_agent = cm_id_priv->av.port->mad_agent; if (!mad_agent) { m = ERR_PTR(-EINVAL); @@ -315,7 +315,7 @@ static struct ib_mad_send_buf *cm_alloc_msg(struct cm_id_private *cm_id_priv) m->context[0] = cm_id_priv; out: - read_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); + spin_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); return m; } @@ -1294,10 +1294,10 @@ static __be64 cm_form_tid(struct cm_id_private *cm_id_priv) if (!cm_id_priv->av.port) return cpu_to_be64(low_tid); - read_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); + spin_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); if (cm_id_priv->av.port->mad_agent) hi_tid = ((u64)cm_id_priv->av.port->mad_agent->hi_tid) << 32; - read_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); + spin_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); return cpu_to_be64(hi_tid | low_tid); } @@ -4374,7 +4374,7 @@ static int cm_add_one(struct ib_device *ib_device) return -ENOMEM; kref_init(&cm_dev->kref); - rwlock_init(&cm_dev->mad_agent_lock); + spin_lock_init(&cm_dev->mad_agent_lock); cm_dev->ib_device = ib_device; cm_dev->ack_delay = ib_device->attrs.local_ca_ack_delay; cm_dev->going_down = 0; @@ -4490,9 +4490,9 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data) * The above ensures no call paths from the work are running, * the remaining paths all take the mad_agent_lock. */ - write_lock(&cm_dev->mad_agent_lock); + spin_lock(&cm_dev->mad_agent_lock); port->mad_agent = NULL; - write_unlock(&cm_dev->mad_agent_lock); + spin_unlock(&cm_dev->mad_agent_lock); ib_unregister_mad_agent(mad_agent); ib_port_unregister_client_groups(ib_device, i, cm_counter_groups); diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index a5ceae2e075ad62f55248ca2eaaca2fae34efc69..348527cf1e7bfcf85c154f47917e12ab85d4b01d 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -5215,8 +5215,7 @@ static int cma_netevent_callback(struct notifier_block *self, neigh->ha, ETH_ALEN)) continue; cma_id_get(current_id); - if (!queue_work(cma_wq, ¤t_id->id.net_work)) - cma_id_put(current_id); + queue_work(cma_wq, ¤t_id->id.net_work); } out: spin_unlock_irqrestore(&id_table_lock, flags); diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c index ce41f235af253c1d8288be607b29bfe94b5656fd..3e4941754b48d07a424441b289cc247ea6efaf51 100644 --- a/drivers/infiniband/core/iwcm.c +++ b/drivers/infiniband/core/iwcm.c @@ -367,9 +367,12 @@ EXPORT_SYMBOL(iw_cm_disconnect); /* * CM_ID <-- DESTROYING * - * Clean up all resources associated with the connection. + * Clean up all resources associated with the connection and release + * the initial reference taken by iw_create_cm_id. + * + * Returns true if and only if the last cm_id_priv reference has been dropped. */ -static void destroy_cm_id(struct iw_cm_id *cm_id) +static bool destroy_cm_id(struct iw_cm_id *cm_id) { struct iwcm_id_private *cm_id_priv; struct ib_qp *qp; @@ -438,22 +441,20 @@ static void destroy_cm_id(struct iw_cm_id *cm_id) iwpm_remove_mapinfo(&cm_id->local_addr, &cm_id->m_local_addr); iwpm_remove_mapping(&cm_id->local_addr, RDMA_NL_IWCM); } + + return iwcm_deref_id(cm_id_priv); } /* - * Destroy cm_id. If the cm_id still has other references, wait for all - * references to be released on the cm_id and then release the initial - * reference taken by iw_create_cm_id. + * This function is only called by the application thread and cannot + * be called by the event thread. The function will wait for all + * references to be released on the cm_id and then kfree the cm_id + * object. */ void iw_destroy_cm_id(struct iw_cm_id *cm_id) { - struct iwcm_id_private *cm_id_priv; - - cm_id_priv = container_of(cm_id, struct iwcm_id_private, id); - destroy_cm_id(cm_id); - if (refcount_read(&cm_id_priv->refcount) > 1) + if (!destroy_cm_id(cm_id)) flush_workqueue(iwcm_wq); - iwcm_deref_id(cm_id_priv); } EXPORT_SYMBOL(iw_destroy_cm_id); @@ -1036,10 +1037,8 @@ static void cm_work_handler(struct work_struct *_work) if (!test_bit(IWCM_F_DROP_EVENTS, &cm_id_priv->flags)) { ret = process_event(cm_id_priv, &levent); - if (ret) { - destroy_cm_id(&cm_id_priv->id); - WARN_ON_ONCE(iwcm_deref_id(cm_id_priv)); - } + if (ret) + WARN_ON_ONCE(destroy_cm_id(&cm_id_priv->id)); } else pr_debug("dropping event %d\n", levent.event); if (iwcm_deref_id(cm_id_priv)) diff --git a/drivers/infiniband/hw/hns/hns_roce_ah.c b/drivers/infiniband/hw/hns/hns_roce_ah.c index e99890e0c8c37b470a16b6209d6b99b31e5f61e6..3df032ddda1891980a8ea8eb652b5f0d283e7218 100644 --- a/drivers/infiniband/hw/hns/hns_roce_ah.c +++ b/drivers/infiniband/hw/hns/hns_roce_ah.c @@ -33,6 +33,7 @@ #include #include #include +#include "hnae3.h" #include "hns_roce_device.h" #include "hns_roce_hw_v2.h" diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index 9d23d4b5c1285f8097e346b33a33d5da50e351c0..aded0a7f42838d9d3c49967f091629c551d4e0de 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c @@ -42,6 +42,7 @@ #include #include +#include "hnae3.h" #include "hns_roce_common.h" #include "hns_roce_device.h" #include "hns_roce_cmd.h" diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h index 7875283eb9d631b1d07e4c56f0aac99fa5959df8..b8e17721f6fdea870504e36db15abc6977f3b7d2 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h @@ -34,7 +34,6 @@ #define _HNS_ROCE_HW_V2_H #include -#include "hnae3.h" #define HNS_ROCE_V2_MAX_RC_INL_INN_SZ 32 #define HNS_ROCE_V2_MTT_ENTRY_SZ 64 diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c index 5f39a25064d10d136235fe9f277d6383fca4cac3..a7e4c951f8fe4075296a87251360221ea2c0e110 100644 --- a/drivers/infiniband/hw/hns/hns_roce_main.c +++ b/drivers/infiniband/hw/hns/hns_roce_main.c @@ -37,6 +37,7 @@ #include #include #include +#include "hnae3.h" #include "hns_roce_common.h" #include "hns_roce_device.h" #include "hns_roce_hem.h" diff --git a/drivers/infiniband/hw/hns/hns_roce_restrack.c b/drivers/infiniband/hw/hns/hns_roce_restrack.c index 1fb5e246836479c7604441c8da6b54ec4813f6d9..081a01de305535cd3bb3d41d585e47249ab5486e 100644 --- a/drivers/infiniband/hw/hns/hns_roce_restrack.c +++ b/drivers/infiniband/hw/hns/hns_roce_restrack.c @@ -4,6 +4,7 @@ #include #include #include +#include "hnae3.h" #include "hns_roce_common.h" #include "hns_roce_device.h" #include "hns_roce_hw_v2.h" diff --git a/drivers/infiniband/hw/mlx5/counters.c b/drivers/infiniband/hw/mlx5/counters.c index d06128501ce4e7dfe37e2878734d72803b01b91d..b049bba215790568aa62c9fdbe2fd86ec7480fad 100644 --- a/drivers/infiniband/hw/mlx5/counters.c +++ b/drivers/infiniband/hw/mlx5/counters.c @@ -387,7 +387,7 @@ static int do_get_hw_stats(struct ib_device *ibdev, return ret; /* We don't expose device counters over Vports */ - if (is_mdev_switchdev_mode(dev->mdev) && dev->is_rep && port_num != 0) + if (is_mdev_switchdev_mode(dev->mdev) && port_num != 0) goto done; if (MLX5_CAP_PCAM_FEATURE(dev->mdev, rx_icrc_encapsulated_counter)) { @@ -407,7 +407,7 @@ static int do_get_hw_stats(struct ib_device *ibdev, */ goto done; } - ret = mlx5_lag_query_cong_counters(mdev, + ret = mlx5_lag_query_cong_counters(dev->mdev, stats->value + cnts->num_q_counters, cnts->num_cong_counters, diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c index 3f1fa45d9368214957e5d751a09bcbc776e9b0ed..6e19974ecf6e71e0843e71c873d92d96ba0fb116 100644 --- a/drivers/infiniband/hw/mlx5/devx.c +++ b/drivers/infiniband/hw/mlx5/devx.c @@ -1914,7 +1914,6 @@ subscribe_event_xa_alloc(struct mlx5_devx_event_table *devx_event_table, /* Level1 is valid for future use, no need to free */ return -ENOMEM; - INIT_LIST_HEAD(&obj_event->obj_sub_list); err = xa_insert(&event->object_ids, key_level2, obj_event, @@ -1923,6 +1922,7 @@ subscribe_event_xa_alloc(struct mlx5_devx_event_table *devx_event_table, kfree(obj_event); return err; } + INIT_LIST_HEAD(&obj_event->obj_sub_list); } return 0; diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index e922fb87286547deb74d810eb90349194c5ca7b8..ada7dbf8eb1cf5d6620aa6c645a2e21d10d51868 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -1690,33 +1690,6 @@ static void deallocate_uars(struct mlx5_ib_dev *dev, context->devx_uid); } -static int mlx5_ib_enable_lb_mp(struct mlx5_core_dev *master, - struct mlx5_core_dev *slave) -{ - int err; - - err = mlx5_nic_vport_update_local_lb(master, true); - if (err) - return err; - - err = mlx5_nic_vport_update_local_lb(slave, true); - if (err) - goto out; - - return 0; - -out: - mlx5_nic_vport_update_local_lb(master, false); - return err; -} - -static void mlx5_ib_disable_lb_mp(struct mlx5_core_dev *master, - struct mlx5_core_dev *slave) -{ - mlx5_nic_vport_update_local_lb(slave, false); - mlx5_nic_vport_update_local_lb(master, false); -} - int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp) { int err = 0; @@ -3251,8 +3224,6 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev, lockdep_assert_held(&mlx5_ib_multiport_mutex); - mlx5_ib_disable_lb_mp(ibdev->mdev, mpi->mdev); - mlx5_core_mp_event_replay(ibdev->mdev, MLX5_DRIVER_EVENT_AFFILIATION_REMOVED, NULL); @@ -3348,10 +3319,6 @@ static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev, MLX5_DRIVER_EVENT_AFFILIATION_DONE, &key); - err = mlx5_ib_enable_lb_mp(ibdev->mdev, mpi->mdev); - if (err) - goto unbind; - return true; unbind: diff --git a/drivers/infiniband/hw/mlx5/qpc.c b/drivers/infiniband/hw/mlx5/qpc.c index 9de9bea1025e2648071fbfd5fbee06c7d81979b7..d9cf6982d645ed38fd084dfdca1e74a0564c9156 100644 --- a/drivers/infiniband/hw/mlx5/qpc.c +++ b/drivers/infiniband/hw/mlx5/qpc.c @@ -21,10 +21,8 @@ mlx5_get_rsc(struct mlx5_qp_table *table, u32 rsn) spin_lock_irqsave(&table->lock, flags); common = radix_tree_lookup(&table->tree, rsn); - if (common && !common->invalid) + if (common) refcount_inc(&common->refcount); - else - common = NULL; spin_unlock_irqrestore(&table->lock, flags); @@ -180,18 +178,6 @@ static int create_resource_common(struct mlx5_ib_dev *dev, return 0; } -static void modify_resource_common_state(struct mlx5_ib_dev *dev, - struct mlx5_core_qp *qp, - bool invalid) -{ - struct mlx5_qp_table *table = &dev->qp_table; - unsigned long flags; - - spin_lock_irqsave(&table->lock, flags); - qp->common.invalid = invalid; - spin_unlock_irqrestore(&table->lock, flags); -} - static void destroy_resource_common(struct mlx5_ib_dev *dev, struct mlx5_core_qp *qp) { @@ -618,20 +604,8 @@ int mlx5_core_create_rq_tracked(struct mlx5_ib_dev *dev, u32 *in, int inlen, int mlx5_core_destroy_rq_tracked(struct mlx5_ib_dev *dev, struct mlx5_core_qp *rq) { - int ret; - - /* The rq destruction can be called again in case it fails, hence we - * mark the common resource as invalid and only once FW destruction - * is completed successfully we actually destroy the resources. - */ - modify_resource_common_state(dev, rq, true); - ret = destroy_rq_tracked(dev, rq->qpn, rq->uid); - if (ret) { - modify_resource_common_state(dev, rq, false); - return ret; - } destroy_resource_common(dev, rq); - return 0; + return destroy_rq_tracked(dev, rq->qpn, rq->uid); } static void destroy_sq_tracked(struct mlx5_ib_dev *dev, u32 sqn, u16 uid) diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 09fcc14051f28570a383fa71655bbea5be37f943..c65321964131cf824c156c2680406759e8021693 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c @@ -169,7 +169,6 @@ static const struct xpad_device { { 0x046d, 0xca88, "Logitech Compact Controller for Xbox", 0, XTYPE_XBOX }, { 0x046d, 0xca8a, "Logitech Precision Vibration Feedback Wheel", 0, XTYPE_XBOX }, { 0x046d, 0xcaa3, "Logitech DriveFx Racing Wheel", 0, XTYPE_XBOX360 }, - { 0x0502, 0x1305, "Acer NGR200", 0, XTYPE_XBOX360 }, { 0x056e, 0x2004, "Elecom JC-U3613M", 0, XTYPE_XBOX360 }, { 0x05fd, 0x1007, "Mad Catz Controller (unverified)", 0, XTYPE_XBOX }, { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", 0, XTYPE_XBOX }, @@ -290,8 +289,6 @@ static const struct xpad_device { { 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, { 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, { 0x10f5, 0x7005, "Turtle Beach Recon Controller", 0, XTYPE_XBOXONE }, - { 0x10f5, 0x7008, "Turtle Beach Recon Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, - { 0x10f5, 0x7073, "Turtle Beach Stealth Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, { 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 }, { 0x11ff, 0x0511, "PXN V900", 0, XTYPE_XBOX360 }, { 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 }, @@ -356,7 +353,6 @@ static const struct xpad_device { { 0x1ee9, 0x1590, "ZOTAC Gaming Zone", 0, XTYPE_XBOX360 }, { 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE }, { 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE }, - { 0x20d6, 0x2064, "PowerA Wired Controller for Xbox", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, { 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 }, { 0x24c6, 0x5000, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, { 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 }, @@ -515,7 +511,6 @@ static const struct usb_device_id xpad_table[] = { XPAD_XBOX360_VENDOR(0x045e), /* Microsoft Xbox 360 controllers */ XPAD_XBOXONE_VENDOR(0x045e), /* Microsoft Xbox One controllers */ XPAD_XBOX360_VENDOR(0x046d), /* Logitech Xbox 360-style controllers */ - XPAD_XBOX360_VENDOR(0x0502), /* Acer Inc. Xbox 360 style controllers */ XPAD_XBOX360_VENDOR(0x056e), /* Elecom JC-U3613M */ XPAD_XBOX360_VENDOR(0x06a3), /* Saitek P3600 */ XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz Xbox 360 controllers */ diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 14ead0fbb80fd40d6b4030918cab1b8c8b753012..aad2d75c03678185168beb1f2c409a427aa0d261 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -826,7 +826,7 @@ static int atkbd_probe(struct atkbd *atkbd) if (atkbd_skip_getid(atkbd)) { atkbd->id = 0xab83; - goto deactivate_kbd; + return 0; } /* @@ -863,7 +863,6 @@ static int atkbd_probe(struct atkbd *atkbd) return -1; } -deactivate_kbd: /* * Make sure nothing is coming from the keyboard and disturbs our * internal state. diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index a34b9533d8f18e08ed7a5fd8f70c9aca51696ee5..2e7c2c046e675f8ae21a6fe668e9b7dfa23c1a9a 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -455,8 +455,6 @@ static enum hrtimer_restart gpio_keys_irq_timer(struct hrtimer *t) release_timer); struct input_dev *input = bdata->input; - guard(spinlock_irqsave)(&bdata->lock); - if (bdata->key_pressed) { input_report_key(input, *bdata->code, 0); input_sync(input); @@ -495,7 +493,7 @@ static irqreturn_t gpio_keys_irq_isr(int irq, void *dev_id) if (bdata->release_delay) hrtimer_start(&bdata->release_timer, ms_to_ktime(bdata->release_delay), - HRTIMER_MODE_REL); + HRTIMER_MODE_REL_HARD); out: spin_unlock_irqrestore(&bdata->lock, flags); return IRQ_HANDLED; @@ -632,7 +630,7 @@ static int gpio_keys_setup_key(struct platform_device *pdev, bdata->release_delay = button->debounce_interval; hrtimer_init(&bdata->release_timer, - CLOCK_REALTIME, HRTIMER_MODE_REL); + CLOCK_REALTIME, HRTIMER_MODE_REL_HARD); bdata->release_timer.function = gpio_keys_irq_timer; isr = gpio_keys_irq_isr; diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c index 5cfe9b56978da0587b042cbb0096ec6ad2f3bdd8..180d90e46061e70131c68f68b30f638ba15f2dbc 100644 --- a/drivers/input/misc/ims-pcu.c +++ b/drivers/input/misc/ims-pcu.c @@ -845,12 +845,6 @@ static int ims_pcu_flash_firmware(struct ims_pcu *pcu, addr = be32_to_cpu(rec->addr) / 2; len = be16_to_cpu(rec->len); - if (len > sizeof(pcu->cmd_buf) - 1 - sizeof(*fragment)) { - dev_err(pcu->dev, - "Invalid record length in firmware: %d\n", len); - return -EINVAL; - } - fragment = (void *)&pcu->cmd_buf[1]; put_unaligned_le32(addr, &fragment->addr); fragment->len = len; diff --git a/drivers/input/misc/iqs7222.c b/drivers/input/misc/iqs7222.c index ce7e977cc8a7a1711f69962f37c944d704f1b317..b98529568eeb8335f9ae40286ce873872913fb0c 100644 --- a/drivers/input/misc/iqs7222.c +++ b/drivers/input/misc/iqs7222.c @@ -301,7 +301,6 @@ struct iqs7222_dev_desc { int allow_offset; int event_offset; int comms_offset; - int ext_chan; bool legacy_gesture; struct iqs7222_reg_grp_desc reg_grps[IQS7222_NUM_REG_GRPS]; }; @@ -316,7 +315,6 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = { .allow_offset = 9, .event_offset = 10, .comms_offset = 12, - .ext_chan = 10, .reg_grps = { [IQS7222_REG_GRP_STAT] = { .base = IQS7222_SYS_STATUS, @@ -375,7 +373,6 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = { .allow_offset = 9, .event_offset = 10, .comms_offset = 12, - .ext_chan = 10, .legacy_gesture = true, .reg_grps = { [IQS7222_REG_GRP_STAT] = { @@ -2247,7 +2244,7 @@ static int iqs7222_parse_chan(struct iqs7222_private *iqs7222, const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; struct i2c_client *client = iqs7222->client; int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row; - int ext_chan = dev_desc->ext_chan ? : num_chan; + int ext_chan = rounddown(num_chan, 10); int error, i; u16 *chan_setup = iqs7222->chan_setup[chan_index]; u16 *sys_setup = iqs7222->sys_setup; @@ -2451,7 +2448,7 @@ static int iqs7222_parse_sldr(struct iqs7222_private *iqs7222, const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; struct i2c_client *client = iqs7222->client; int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row; - int ext_chan = dev_desc->ext_chan ? : num_chan; + int ext_chan = rounddown(num_chan, 10); int count, error, reg_offset, i; u16 *event_mask = &iqs7222->sys_setup[dev_desc->event_offset]; u16 *sldr_setup = iqs7222->sldr_setup[sldr_index]; diff --git a/drivers/input/misc/sparcspkr.c b/drivers/input/misc/sparcspkr.c index d715fd736426d1f0a27d259ef3b8bcfd3ff9f8e8..e5dd84725c6e74737ca4a080d6ac4b1129330623 100644 --- a/drivers/input/misc/sparcspkr.c +++ b/drivers/input/misc/sparcspkr.c @@ -75,14 +75,9 @@ static int bbc_spkr_event(struct input_dev *dev, unsigned int type, unsigned int return -1; switch (code) { - case SND_BELL: - if (value) - value = 1000; - break; - case SND_TONE: - break; - default: - return -1; + case SND_BELL: if (value) value = 1000; + case SND_TONE: break; + default: return -1; } if (value > 20 && value < 32767) @@ -118,14 +113,9 @@ static int grover_spkr_event(struct input_dev *dev, unsigned int type, unsigned return -1; switch (code) { - case SND_BELL: - if (value) - value = 1000; - break; - case SND_TONE: - break; - default: - return -1; + case SND_BELL: if (value) value = 1000; + case SND_TONE: break; + default: return -1; } if (value > 20 && value < 32767) diff --git a/drivers/input/rmi4/rmi_f34.c b/drivers/input/rmi4/rmi_f34.c index cae1e416649214da387bd0588d075dbe9502a0bb..0d9a5756e3f5934ba8df6e4b0518687c74bc3a16 100644 --- a/drivers/input/rmi4/rmi_f34.c +++ b/drivers/input/rmi4/rmi_f34.c @@ -4,7 +4,6 @@ * Copyright (C) 2016 Zodiac Inflight Innovations */ -#include "linux/device.h" #include #include #include @@ -299,30 +298,39 @@ static int rmi_f34_update_firmware(struct f34_data *f34, return ret; } +static int rmi_f34_status(struct rmi_function *fn) +{ + struct f34_data *f34 = dev_get_drvdata(&fn->dev); + + /* + * The status is the percentage complete, or once complete, + * zero for success or a negative return code. + */ + return f34->update_status; +} + static ssize_t rmi_driver_bootloader_id_show(struct device *dev, struct device_attribute *dattr, char *buf) { struct rmi_driver_data *data = dev_get_drvdata(dev); - struct rmi_function *fn; + struct rmi_function *fn = data->f34_container; struct f34_data *f34; - fn = data->f34_container; - if (!fn) - return -ENODEV; - - f34 = dev_get_drvdata(&fn->dev); - if (!f34) - return -ENODEV; + if (fn) { + f34 = dev_get_drvdata(&fn->dev); + + if (f34->bl_version == 5) + return sysfs_emit(buf, "%c%c\n", + f34->bootloader_id[0], + f34->bootloader_id[1]); + else + return sysfs_emit(buf, "V%d.%d\n", + f34->bootloader_id[1], + f34->bootloader_id[0]); + } - if (f34->bl_version == 5) - return sysfs_emit(buf, "%c%c\n", - f34->bootloader_id[0], - f34->bootloader_id[1]); - else - return sysfs_emit(buf, "V%d.%d\n", - f34->bootloader_id[1], - f34->bootloader_id[0]); + return 0; } static DEVICE_ATTR(bootloader_id, 0444, rmi_driver_bootloader_id_show, NULL); @@ -335,16 +343,13 @@ static ssize_t rmi_driver_configuration_id_show(struct device *dev, struct rmi_function *fn = data->f34_container; struct f34_data *f34; - fn = data->f34_container; - if (!fn) - return -ENODEV; - - f34 = dev_get_drvdata(&fn->dev); - if (!f34) - return -ENODEV; + if (fn) { + f34 = dev_get_drvdata(&fn->dev); + return sysfs_emit(buf, "%s\n", f34->configuration_id); + } - return sysfs_emit(buf, "%s\n", f34->configuration_id); + return 0; } static DEVICE_ATTR(configuration_id, 0444, @@ -360,14 +365,10 @@ static int rmi_firmware_update(struct rmi_driver_data *data, if (!data->f34_container) { dev_warn(dev, "%s: No F34 present!\n", __func__); - return -ENODEV; + return -EINVAL; } f34 = dev_get_drvdata(&data->f34_container->dev); - if (!f34) { - dev_warn(dev, "%s: No valid F34 present!\n", __func__); - return -ENODEV; - } if (f34->bl_version >= 7) { if (data->pdt_props & HAS_BSR) { @@ -493,18 +494,10 @@ static ssize_t rmi_driver_update_fw_status_show(struct device *dev, char *buf) { struct rmi_driver_data *data = dev_get_drvdata(dev); - struct f34_data *f34; - int update_status = -ENODEV; + int update_status = 0; - /* - * The status is the percentage complete, or once complete, - * zero for success or a negative return code. - */ - if (data->f34_container) { - f34 = dev_get_drvdata(&data->f34_container->dev); - if (f34) - update_status = f34->update_status; - } + if (data->f34_container) + update_status = rmi_f34_status(data->f34_container); return sysfs_emit(buf, "%d\n", update_status); } @@ -524,21 +517,33 @@ static const struct attribute_group rmi_firmware_attr_group = { .attrs = rmi_firmware_attrs, }; -static int rmi_f34v5_probe(struct f34_data *f34) +static int rmi_f34_probe(struct rmi_function *fn) { - struct rmi_function *fn = f34->fn; - u8 f34_queries[9]; + struct f34_data *f34; + unsigned char f34_queries[9]; bool has_config_id; - int error; + u8 version = fn->fd.function_version; + int ret; + + f34 = devm_kzalloc(&fn->dev, sizeof(struct f34_data), GFP_KERNEL); + if (!f34) + return -ENOMEM; + + f34->fn = fn; + dev_set_drvdata(&fn->dev, f34); + + /* v5 code only supported version 0, try V7 probe */ + if (version > 0) + return rmi_f34v7_probe(f34); f34->bl_version = 5; - error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, - f34_queries, sizeof(f34_queries)); - if (error) { + ret = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, + f34_queries, sizeof(f34_queries)); + if (ret) { dev_err(&fn->dev, "%s: Failed to query properties\n", __func__); - return error; + return ret; } snprintf(f34->bootloader_id, sizeof(f34->bootloader_id), @@ -564,11 +569,11 @@ static int rmi_f34v5_probe(struct f34_data *f34) f34->v5.config_blocks); if (has_config_id) { - error = rmi_read_block(fn->rmi_dev, fn->fd.control_base_addr, - f34_queries, sizeof(f34_queries)); - if (error) { + ret = rmi_read_block(fn->rmi_dev, fn->fd.control_base_addr, + f34_queries, sizeof(f34_queries)); + if (ret) { dev_err(&fn->dev, "Failed to read F34 config ID\n"); - return error; + return ret; } snprintf(f34->configuration_id, sizeof(f34->configuration_id), @@ -577,34 +582,12 @@ static int rmi_f34v5_probe(struct f34_data *f34) f34_queries[2], f34_queries[3]); rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Configuration ID: %s\n", - f34->configuration_id); + f34->configuration_id); } return 0; } -static int rmi_f34_probe(struct rmi_function *fn) -{ - struct f34_data *f34; - u8 version = fn->fd.function_version; - int error; - - f34 = devm_kzalloc(&fn->dev, sizeof(struct f34_data), GFP_KERNEL); - if (!f34) - return -ENOMEM; - - f34->fn = fn; - - /* v5 code only supported version 0 */ - error = version == 0 ? rmi_f34v5_probe(f34) : rmi_f34v7_probe(f34); - if (error) - return error; - - dev_set_drvdata(&fn->dev, f34); - - return 0; -} - int rmi_f34_create_sysfs(struct rmi_device *rmi_dev) { return sysfs_create_group(&rmi_dev->dev.kobj, &rmi_firmware_attr_group); diff --git a/drivers/interconnect/qcom/sc7280.c b/drivers/interconnect/qcom/sc7280.c index 728589ec802641cf5da2c0f7b38db83aa1201e6e..a626dbc719995fa1737a7f3c3be64c793a0b95cb 100644 --- a/drivers/interconnect/qcom/sc7280.c +++ b/drivers/interconnect/qcom/sc7280.c @@ -165,7 +165,6 @@ static struct qcom_icc_node xm_pcie3_1 = { .id = SC7280_MASTER_PCIE_1, .channels = 1, .buswidth = 8, - .num_links = 1, .links = { SC7280_SLAVE_ANOC_PCIE_GEM_NOC }, }; diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig index 20aa5ed80aa387dc907a713f953934231011c95c..d57c5adf932e3676ee9b790c582fd2f4ca8118fe 100644 --- a/drivers/iommu/Kconfig +++ b/drivers/iommu/Kconfig @@ -191,6 +191,7 @@ source "drivers/iommu/iommufd/Kconfig" config IRQ_REMAP bool "Support for Interrupt Remapping" depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI + select DMAR_TABLE if INTEL_IOMMU help Supports Interrupt remapping for IO-APIC and MSI devices. To use x2apic mode in the CPU's which support x2APIC enhancements or diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index a5d6d786dba5238bc5fbdd6e74a7ded65858871c..83c5d786686d079f52897bdc3f774c48f76e4f00 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -780,14 +780,6 @@ int amd_iommu_register_ga_log_notifier(int (*notifier)(u32)) { iommu_ga_log_notifier = notifier; - /* - * Ensure all in-flight IRQ handlers run to completion before returning - * to the caller, e.g. to ensure module code isn't unloaded while it's - * being executed in the IRQ handler. - */ - if (!notifier) - synchronize_rcu(); - return 0; } EXPORT_SYMBOL(amd_iommu_register_ga_log_notifier); diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 3fa5699b9ff191e57d2ef629f18128874f96b7e0..f2b3a4e2e54fc81a56e53368e3f3f6ad90476b46 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -2382,7 +2382,6 @@ static size_t iommu_pgsize(struct iommu_domain *domain, unsigned long iova, unsigned int pgsize_idx, pgsize_idx_next; unsigned long pgsizes; size_t offset, pgsize, pgsize_next; - size_t offset_end; unsigned long addr_merge = paddr | iova; /* Page sizes supported by the hardware and small enough for @size */ @@ -2423,8 +2422,7 @@ static size_t iommu_pgsize(struct iommu_domain *domain, unsigned long iova, * If size is big enough to accommodate the larger page, reduce * the number of smaller pages. */ - if (!check_add_overflow(offset, pgsize_next, &offset_end) && - offset_end <= size) + if (offset + pgsize_next <= size) size = offset; out_set_count: diff --git a/drivers/leds/led-class-multicolor.c b/drivers/leds/led-class-multicolor.c index e0785935f4ba671621af8bb305229a780bf72504..ec62a48116135c5cf8069bfdbd4aa23aa9dcca39 100644 --- a/drivers/leds/led-class-multicolor.c +++ b/drivers/leds/led-class-multicolor.c @@ -61,8 +61,7 @@ static ssize_t multi_intensity_store(struct device *dev, for (i = 0; i < mcled_cdev->num_colors; i++) mcled_cdev->subled_info[i].intensity = intensity_value[i]; - if (!test_bit(LED_BLINK_SW, &led_cdev->work_flags)) - led_set_brightness(led_cdev, led_cdev->brightness); + led_set_brightness(led_cdev, led_cdev->brightness); ret = size; err_out: mutex_unlock(&led_cdev->led_access); diff --git a/drivers/leds/trigger/ledtrig-netdev.c b/drivers/leds/trigger/ledtrig-netdev.c index f8912fa60c4988786a7423d2c6d8fe5ab0a22f4c..79719fc8a08fb495ab1ca50d7a401011d2f062d1 100644 --- a/drivers/leds/trigger/ledtrig-netdev.c +++ b/drivers/leds/trigger/ledtrig-netdev.c @@ -54,7 +54,6 @@ struct led_netdev_data { unsigned int last_activity; unsigned long mode; - unsigned long blink_delay; int link_speed; u8 duplex; @@ -70,10 +69,6 @@ static void set_baseline_state(struct led_netdev_data *trigger_data) /* Already validated, hw control is possible with the requested mode */ if (trigger_data->hw_control) { led_cdev->hw_control_set(led_cdev, trigger_data->mode); - if (led_cdev->blink_set) { - led_cdev->blink_set(led_cdev, &trigger_data->blink_delay, - &trigger_data->blink_delay); - } return; } @@ -391,11 +386,10 @@ static ssize_t interval_store(struct device *dev, size_t size) { struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev); - struct led_classdev *led_cdev = trigger_data->led_cdev; unsigned long value; int ret; - if (trigger_data->hw_control && !led_cdev->blink_set) + if (trigger_data->hw_control) return -EINVAL; ret = kstrtoul(buf, 0, &value); @@ -404,13 +398,9 @@ static ssize_t interval_store(struct device *dev, /* impose some basic bounds on the timer interval */ if (value >= 5 && value <= 10000) { - if (trigger_data->hw_control) { - trigger_data->blink_delay = value; - } else { - cancel_delayed_work_sync(&trigger_data->work); + cancel_delayed_work_sync(&trigger_data->work); - atomic_set(&trigger_data->interval, msecs_to_jiffies(value)); - } + atomic_set(&trigger_data->interval, msecs_to_jiffies(value)); set_baseline_state(trigger_data); /* resets timer */ } diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c index cb59b4dbad6269df9d9f768a3e7d25ce2bf0ae81..f13d705f7861af0b34eef7697a203bfd8efb41c4 100644 --- a/drivers/mailbox/mailbox.c +++ b/drivers/mailbox/mailbox.c @@ -500,8 +500,8 @@ void mbox_free_channel(struct mbox_chan *chan) if (chan->txdone_method == TXDONE_BY_ACK) chan->txdone_method = TXDONE_BY_POLL; - spin_unlock_irqrestore(&chan->lock, flags); module_put(chan->mbox->dev->driver->owner); + spin_unlock_irqrestore(&chan->lock, flags); } EXPORT_SYMBOL_GPL(mbox_free_channel); diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index b9dfebaa9eae55d2749373746eae13fb668deb62..8440b56e385d5c0301a54eed8de748097984c6ee 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -1739,12 +1739,7 @@ static void cache_set_flush(struct closure *cl) mutex_unlock(&b->write_lock); } - /* - * If the register_cache_set() call to bch_cache_set_alloc() failed, - * ca has not been assigned a value and return error. - * So we need check ca is not NULL during bch_cache_set_unregister(). - */ - if (ca && ca->alloc_thread) + if (ca->alloc_thread) kthread_stop(ca->alloc_thread); if (c->journal.cur) { diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index 02838beee9d12115b667b298a901f24843cf6a72..2d3afeaf88687754e55a06c974da0ac8a89e1f4f 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -2708,11 +2708,7 @@ static unsigned long __evict_many(struct dm_bufio_client *c, __make_buffer_clean(b); __free_buffer_wake(b); - if (need_resched()) { - dm_bufio_unlock(c); - cond_resched(); - dm_bufio_lock(c); - } + cond_resched(); } return count; diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c index ada679f4fca671f35ab87ccad4bbaf855a9eda42..dc491dc771d71209fe3525b1b000d32e7e3a3caf 100644 --- a/drivers/md/dm-flakey.c +++ b/drivers/md/dm-flakey.c @@ -47,15 +47,14 @@ enum feature_flag_bits { }; struct per_bio_data { - bool bio_can_corrupt; - struct bvec_iter saved_iter; + bool bio_submitted; }; static int parse_features(struct dm_arg_set *as, struct flakey_c *fc, struct dm_target *ti) { - int r = 0; - unsigned int argc = 0; + int r; + unsigned int argc; const char *arg_name; static const struct dm_arg _args[] = { @@ -66,12 +65,13 @@ static int parse_features(struct dm_arg_set *as, struct flakey_c *fc, {0, PROBABILITY_BASE, "Invalid random corrupt argument"}, }; - if (as->argc && (r = dm_read_arg_group(_args, as, &argc, &ti->error))) - return r; - /* No feature arguments supplied. */ - if (!argc) - goto error_all_io; + if (!as->argc) + return 0; + + r = dm_read_arg_group(_args, as, &argc, &ti->error); + if (r) + return r; while (argc) { arg_name = dm_shift_arg(as); @@ -217,7 +217,6 @@ static int parse_features(struct dm_arg_set *as, struct flakey_c *fc, if (!fc->corrupt_bio_byte && !test_bit(ERROR_READS, &fc->flags) && !test_bit(DROP_WRITES, &fc->flags) && !test_bit(ERROR_WRITES, &fc->flags) && !fc->random_read_corrupt && !fc->random_write_corrupt) { -error_all_io: set_bit(ERROR_WRITES, &fc->flags); set_bit(ERROR_READS, &fc->flags); } @@ -340,8 +339,7 @@ static void flakey_map_bio(struct dm_target *ti, struct bio *bio) } static void corrupt_bio_common(struct bio *bio, unsigned int corrupt_bio_byte, - unsigned char corrupt_bio_value, - struct bvec_iter start) + unsigned char corrupt_bio_value) { struct bvec_iter iter; struct bio_vec bvec; @@ -350,7 +348,7 @@ static void corrupt_bio_common(struct bio *bio, unsigned int corrupt_bio_byte, * Overwrite the Nth byte of the bio's data, on whichever page * it falls. */ - __bio_for_each_segment(bvec, bio, iter, start) { + bio_for_each_segment(bvec, bio, iter) { if (bio_iter_len(bio, iter) > corrupt_bio_byte) { unsigned char *segment = bvec_kmap_local(&bvec); segment[corrupt_bio_byte] = corrupt_bio_value; @@ -359,31 +357,36 @@ static void corrupt_bio_common(struct bio *bio, unsigned int corrupt_bio_byte, "(rw=%c bi_opf=%u bi_sector=%llu size=%u)\n", bio, corrupt_bio_value, corrupt_bio_byte, (bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_opf, - (unsigned long long)start.bi_sector, - start.bi_size); + (unsigned long long)bio->bi_iter.bi_sector, + bio->bi_iter.bi_size); break; } corrupt_bio_byte -= bio_iter_len(bio, iter); } } -static void corrupt_bio_data(struct bio *bio, struct flakey_c *fc, - struct bvec_iter start) +static void corrupt_bio_data(struct bio *bio, struct flakey_c *fc) { unsigned int corrupt_bio_byte = fc->corrupt_bio_byte - 1; - corrupt_bio_common(bio, corrupt_bio_byte, fc->corrupt_bio_value, start); + if (!bio_has_data(bio)) + return; + + corrupt_bio_common(bio, corrupt_bio_byte, fc->corrupt_bio_value); } -static void corrupt_bio_random(struct bio *bio, struct bvec_iter start) +static void corrupt_bio_random(struct bio *bio) { unsigned int corrupt_byte; unsigned char corrupt_value; - corrupt_byte = get_random_u32() % start.bi_size; + if (!bio_has_data(bio)) + return; + + corrupt_byte = get_random_u32() % bio->bi_iter.bi_size; corrupt_value = get_random_u8(); - corrupt_bio_common(bio, corrupt_byte, corrupt_value, start); + corrupt_bio_common(bio, corrupt_byte, corrupt_value); } static void clone_free(struct bio *clone) @@ -478,7 +481,7 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) unsigned int elapsed; struct per_bio_data *pb = dm_per_bio_data(bio, sizeof(struct per_bio_data)); - pb->bio_can_corrupt = false; + pb->bio_submitted = false; if (op_is_zone_mgmt(bio_op(bio))) goto map_bio; @@ -487,11 +490,10 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) elapsed = (jiffies - fc->start_time) / HZ; if (elapsed % (fc->up_interval + fc->down_interval) >= fc->up_interval) { bool corrupt_fixed, corrupt_random; - - if (bio_has_data(bio)) { - pb->bio_can_corrupt = true; - pb->saved_iter = bio->bi_iter; - } + /* + * Flag this bio as submitted while down. + */ + pb->bio_submitted = true; /* * Error reads if neither corrupt_bio_byte or drop_writes or error_writes are set. @@ -514,8 +516,6 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) return DM_MAPIO_SUBMITTED; } - if (!pb->bio_can_corrupt) - goto map_bio; /* * Corrupt matching writes. */ @@ -535,11 +535,9 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) struct bio *clone = clone_bio(ti, fc, bio); if (clone) { if (corrupt_fixed) - corrupt_bio_data(clone, fc, - clone->bi_iter); + corrupt_bio_data(clone, fc); if (corrupt_random) - corrupt_bio_random(clone, - clone->bi_iter); + corrupt_bio_random(clone); submit_bio(clone); return DM_MAPIO_SUBMITTED; } @@ -561,21 +559,21 @@ static int flakey_end_io(struct dm_target *ti, struct bio *bio, if (op_is_zone_mgmt(bio_op(bio))) return DM_ENDIO_DONE; - if (!*error && pb->bio_can_corrupt && (bio_data_dir(bio) == READ)) { + if (!*error && pb->bio_submitted && (bio_data_dir(bio) == READ)) { if (fc->corrupt_bio_byte) { if ((fc->corrupt_bio_rw == READ) && all_corrupt_bio_flags_match(bio, fc)) { /* * Corrupt successful matching READs while in down state. */ - corrupt_bio_data(bio, fc, pb->saved_iter); + corrupt_bio_data(bio, fc); } } if (fc->random_read_corrupt) { u64 rnd = get_random_u64(); u32 rem = do_div(rnd, PROBABILITY_BASE); if (rem < fc->random_read_corrupt) - corrupt_bio_random(bio, pb->saved_iter); + corrupt_bio_random(bio); } if (test_bit(ERROR_READS, &fc->flags)) { /* diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index f23edd79df45e54e8f847207f60d497e518a10cd..385e24f55ec00208b1b7cea0d135d87db6c58a3b 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -2378,7 +2378,7 @@ static int super_init_validation(struct raid_set *rs, struct md_rdev *rdev) */ sb_retrieve_failed_devices(sb, failed_devices); rdev_for_each(r, mddev) { - if (test_bit(Journal, &r->flags) || + if (test_bit(Journal, &rdev->flags) || !r->sb_page) continue; sb2 = page_address(r->sb_page); diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 94b6c43dfa5cbd2289a09cbeb7ae054080c9446e..9511dae5b556a9994501392cac3766aa129f15a7 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -133,9 +133,10 @@ static void queue_bio(struct mirror_set *ms, struct bio *bio, int rw) spin_lock_irqsave(&ms->lock, flags); should_wake = !(bl->head); bio_list_add(bl, bio); + spin_unlock_irqrestore(&ms->lock, flags); + if (should_wake) wakeup_mirrord(ms); - spin_unlock_irqrestore(&ms->lock, flags); } static void dispatch_bios(void *context, struct bio_list *bio_list) @@ -645,9 +646,9 @@ static void write_callback(unsigned long error, void *context) if (!ms->failures.head) should_wake = 1; bio_list_add(&ms->failures, bio); + spin_unlock_irqrestore(&ms->lock, flags); if (should_wake) wakeup_mirrord(ms); - spin_unlock_irqrestore(&ms->lock, flags); } static void do_write(struct mirror_set *ms, struct bio *bio) diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c index 8007e2e2197295e8a47106a9a1887d61b8ec47a3..6a7a17c489c99847e3100ebb2355e3c1a7c8bd9e 100644 --- a/drivers/md/dm-verity-fec.c +++ b/drivers/md/dm-verity-fec.c @@ -624,10 +624,6 @@ int verity_fec_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v, (*argc)--; if (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_DEV)) { - if (v->fec->dev) { - ti->error = "FEC device already specified"; - return -EINVAL; - } r = dm_get_device(ti, arg_value, BLK_OPEN_READ, &v->fec->dev); if (r) { ti->error = "FEC device lookup failed"; diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 60e74c0e02f1ab65e9d18649d28a2ce3d91194e8..6ae97da741bba31653203173e45e1c6f8aa10634 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -1043,9 +1043,6 @@ static int verity_alloc_most_once(struct dm_verity *v) { struct dm_target *ti = v->ti; - if (v->validated_blocks) - return 0; - /* the bitset can only handle INT_MAX blocks */ if (v->data_blocks > INT_MAX) { ti->error = "device too large to use check_at_most_once"; @@ -1069,9 +1066,6 @@ static int verity_alloc_zero_digest(struct dm_verity *v) struct ahash_request *req; u8 *zero_data; - if (v->zero_digest) - return 0; - v->zero_digest = kmalloc(v->digest_size, GFP_KERNEL); if (!v->zero_digest) @@ -1411,7 +1405,7 @@ static int verity_ctr(struct dm_target *ti, unsigned int argc, char **argv) goto bad; } - /* Root hash signature is an optional parameter */ + /* Root hash signature is a optional parameter*/ r = verity_verify_root_hash(root_hash_digest_to_validate, strlen(root_hash_digest_to_validate), verify_args.sig, diff --git a/drivers/md/dm-verity-verify-sig.c b/drivers/md/dm-verity-verify-sig.c index 1ced2ef255f325f05c6bfc4e6194b254b347b204..4836508ea50c075b1d0f84ce8037c35656172a94 100644 --- a/drivers/md/dm-verity-verify-sig.c +++ b/drivers/md/dm-verity-verify-sig.c @@ -71,14 +71,9 @@ int verity_verify_sig_parse_opt_args(struct dm_arg_set *as, const char *arg_name) { struct dm_target *ti = v->ti; - int ret; + int ret = 0; const char *sig_key = NULL; - if (v->signature_key_desc) { - ti->error = DM_VERITY_VERIFY_ERR("root_hash_sig_key_desc already specified"); - return -EINVAL; - } - if (!*argc) { ti->error = DM_VERITY_VERIFY_ERR("Signature key not specified"); return -EINVAL; @@ -88,18 +83,14 @@ int verity_verify_sig_parse_opt_args(struct dm_arg_set *as, (*argc)--; ret = verity_verify_get_sig_from_key(sig_key, sig_opts); - if (ret < 0) { + if (ret < 0) ti->error = DM_VERITY_VERIFY_ERR("Invalid key specified"); - return ret; - } v->signature_key_desc = kstrdup(sig_key, GFP_KERNEL); - if (!v->signature_key_desc) { - ti->error = DM_VERITY_VERIFY_ERR("Could not allocate memory for signature key"); + if (!v->signature_key_desc) return -ENOMEM; - } - return 0; + return ret; } /* diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 44424554e6b52a15204241ab67d80eb198ff03d6..9ea868bd0d1293a228b79287ee60cee2306ef0a2 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2195,29 +2195,21 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t, struct queue_limits *limits) { struct dm_table *old_map; - sector_t size, old_size; + sector_t size; int ret; lockdep_assert_held(&md->suspend_lock); size = dm_table_get_size(t); - old_size = dm_get_size(md); - set_capacity(md->disk, size); - - ret = dm_table_set_restrictions(t, md->queue, limits); - if (ret) { - set_capacity(md->disk, old_size); - old_map = ERR_PTR(ret); - goto out; - } - /* * Wipe any geometry if the size of the table changed. */ - if (size != old_size) + if (size != dm_get_size(md)) memset(&md->geometry, 0, sizeof(md->geometry)); + set_capacity(md->disk, size); + dm_table_event_callback(t, event_callback, md); if (dm_table_request_based(t)) { @@ -2235,10 +2227,10 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t, * requests in the queue may refer to bio from the old bioset, * so you must walk through the queue to unprep. */ - if (!md->mempools) + if (!md->mempools) { md->mempools = t->mempools; - else - dm_free_md_mempools(t->mempools); + t->mempools = NULL; + } } else { /* * The md may already have mempools that need changing. @@ -2247,8 +2239,14 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t, */ dm_free_md_mempools(md->mempools); md->mempools = t->mempools; + t->mempools = NULL; + } + + ret = dm_table_set_restrictions(t, md->queue, limits); + if (ret) { + old_map = ERR_PTR(ret); + goto out; } - t->mempools = NULL; old_map = rcu_dereference_protected(md->map, lockdep_is_held(&md->suspend_lock)); rcu_assign_pointer(md->map, (void *)t); diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 1f1991634d0a21d3287c0ce412777014f729ab02..8317e07b326d0d51544faa5ee34695457214598f 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -589,7 +589,7 @@ static int md_bitmap_new_disk_sb(struct bitmap *bitmap) * is a good choice? We choose COUNTER_MAX / 2 arbitrarily. */ write_behind = bitmap->mddev->bitmap_info.max_write_behind; - if (write_behind > COUNTER_MAX / 2) + if (write_behind > COUNTER_MAX) write_behind = COUNTER_MAX / 2; sb->write_behind = cpu_to_le32(write_behind); bitmap->mddev->bitmap_info.max_write_behind = write_behind; @@ -2119,7 +2119,8 @@ int md_bitmap_get_stats(struct bitmap *bitmap, struct md_bitmap_stats *stats) if (!bitmap) return -ENOENT; - if (!bitmap->storage.sb_page) + if (!bitmap->mddev->bitmap_info.external && + !bitmap->storage.sb_page) return -EINVAL; sb = kmap_local_page(bitmap->storage.sb_page); stats->sync_size = le64_to_cpu(sb->sync_size); diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 4c1f86ca55208c3961006fd6e375f553bb5ae889..8b25287c89ed6d96dcaa8efb49fb8cc287b6d3e1 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -3297,7 +3297,6 @@ static int raid1_reshape(struct mddev *mddev) /* ok, everything is stopped */ oldpool = conf->r1bio_pool; conf->r1bio_pool = newpool; - init_waitqueue_head(&conf->r1bio_pool.wait); for (d = d2 = 0; d < conf->raid_disks; d++) { struct md_rdev *rdev = conf->mirrors[d].rdev; diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index a75d090a7fa15adf381a5bff0cde853d72cbd000..36b6bf3f8b29fd060f9514ecd696325692c7d344 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1205,11 +1205,8 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio, rcu_read_unlock(); } - if (!regular_request_wait(mddev, conf, bio, r10_bio->sectors)) { - raid_end_bio_io(r10_bio); + if (!regular_request_wait(mddev, conf, bio, r10_bio->sectors)) return; - } - rdev = read_balance(conf, r10_bio, &max_sectors); if (!rdev) { if (err_rdev) { @@ -1431,11 +1428,8 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio, } sectors = r10_bio->sectors; - if (!regular_request_wait(mddev, conf, bio, sectors)) { - raid_end_bio_io(r10_bio); + if (!regular_request_wait(mddev, conf, bio, sectors)) return; - } - if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && (mddev->reshape_backwards ? (bio->bi_iter.bi_sector < conf->reshape_safe && diff --git a/drivers/media/common/videobuf2/videobuf2-dma-sg.c b/drivers/media/common/videobuf2/videobuf2-dma-sg.c index a5aa6a2a028cb2b70667e0960f7a874f7b64a131..6975a71d740f6d70c139eca739ae665d51007af2 100644 --- a/drivers/media/common/videobuf2/videobuf2-dma-sg.c +++ b/drivers/media/common/videobuf2/videobuf2-dma-sg.c @@ -469,7 +469,7 @@ vb2_dma_sg_dmabuf_ops_begin_cpu_access(struct dma_buf *dbuf, struct vb2_dma_sg_buf *buf = dbuf->priv; struct sg_table *sgt = buf->dma_sgt; - dma_sync_sgtable_for_cpu(buf->dev, sgt, buf->dma_dir); + dma_sync_sg_for_cpu(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir); return 0; } @@ -480,7 +480,7 @@ vb2_dma_sg_dmabuf_ops_end_cpu_access(struct dma_buf *dbuf, struct vb2_dma_sg_buf *buf = dbuf->priv; struct sg_table *sgt = buf->dma_sgt; - dma_sync_sgtable_for_device(buf->dev, sgt, buf->dma_dir); + dma_sync_sg_for_device(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir); return 0; } diff --git a/drivers/media/i2c/ccs-pll.c b/drivers/media/i2c/ccs-pll.c index 611c9823be8578b3d16b4cd276f0c9d35e6adeb3..cf8858cb13d4ce85c68107cad60809e13240afc6 100644 --- a/drivers/media/i2c/ccs-pll.c +++ b/drivers/media/i2c/ccs-pll.c @@ -312,11 +312,6 @@ __ccs_pll_calculate_vt_tree(struct device *dev, dev_dbg(dev, "more_mul2: %u\n", more_mul); pll_fr->pll_multiplier = mul * more_mul; - if (pll_fr->pll_multiplier > lim_fr->max_pll_multiplier) { - dev_dbg(dev, "pll multiplier %u too high\n", - pll_fr->pll_multiplier); - return -EINVAL; - } if (pll_fr->pll_multiplier * pll_fr->pll_ip_clk_freq_hz > lim_fr->max_pll_op_clk_freq_hz) @@ -402,8 +397,6 @@ static int ccs_pll_calculate_vt_tree(struct device *dev, min_pre_pll_clk_div = max_t(u16, min_pre_pll_clk_div, pll->ext_clk_freq_hz / lim_fr->max_pll_ip_clk_freq_hz); - if (!(pll->flags & CCS_PLL_FLAG_EXT_IP_PLL_DIVIDER)) - min_pre_pll_clk_div = clk_div_even(min_pre_pll_clk_div); dev_dbg(dev, "vt min/max_pre_pll_clk_div: %u,%u\n", min_pre_pll_clk_div, max_pre_pll_clk_div); @@ -799,7 +792,7 @@ int ccs_pll_calculate(struct device *dev, const struct ccs_pll_limits *lim, op_lim_fr->min_pre_pll_clk_div, op_lim_fr->max_pre_pll_clk_div); max_op_pre_pll_clk_div = min_t(u16, op_lim_fr->max_pre_pll_clk_div, - DIV_ROUND_UP(pll->ext_clk_freq_hz, + clk_div_even(pll->ext_clk_freq_hz / op_lim_fr->min_pll_ip_clk_freq_hz)); min_op_pre_pll_clk_div = max_t(u16, op_lim_fr->min_pre_pll_clk_div, @@ -822,8 +815,6 @@ int ccs_pll_calculate(struct device *dev, const struct ccs_pll_limits *lim, one_or_more( DIV_ROUND_UP(op_lim_fr->max_pll_op_clk_freq_hz, pll->ext_clk_freq_hz)))); - if (!(pll->flags & CCS_PLL_FLAG_EXT_IP_PLL_DIVIDER)) - min_op_pre_pll_clk_div = clk_div_even(min_op_pre_pll_clk_div); dev_dbg(dev, "pll_op check: min / max op_pre_pll_clk_div: %u / %u\n", min_op_pre_pll_clk_div, max_op_pre_pll_clk_div); diff --git a/drivers/media/i2c/ds90ub913.c b/drivers/media/i2c/ds90ub913.c index 6ec960d7914e9a4800bff0d2ff86be7f4edd441b..ae33d1ecf835df66ec018bb15e9b148c576aec72 100644 --- a/drivers/media/i2c/ds90ub913.c +++ b/drivers/media/i2c/ds90ub913.c @@ -453,9 +453,9 @@ static int ub913_set_fmt(struct v4l2_subdev *sd, if (!fmt) return -EINVAL; - *fmt = format->format; + format->format.code = finfo->outcode; - fmt->code = finfo->outcode; + *fmt = format->format; return 0; } diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index a3d5a8a7c660b0f3da2c327e9330fe0c47458612..a14e571dc62bc500d896646e8bc4576aa7245939 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -77,7 +77,7 @@ #define IMX219_VTS_30FPS_640x480 0x06e3 #define IMX219_VTS_MAX 0xffff -#define IMX219_VBLANK_MIN 32 +#define IMX219_VBLANK_MIN 4 /*Frame Length Line*/ #define IMX219_FLL_MIN 0x08a6 diff --git a/drivers/media/i2c/ov5675.c b/drivers/media/i2c/ov5675.c index 92c3e7951ee727dcc8c06ab241ab6314277aa51a..c499e7e93c54b94229cb60be5018629c0ef1e14e 100644 --- a/drivers/media/i2c/ov5675.c +++ b/drivers/media/i2c/ov5675.c @@ -1339,8 +1339,11 @@ static int ov5675_probe(struct i2c_client *client) return -ENOMEM; ret = ov5675_get_hwcfg(ov5675, &client->dev); - if (ret) + if (ret) { + dev_err(&client->dev, "failed to get HW configuration: %d", + ret); return ret; + } v4l2_i2c_subdev_init(&ov5675->sd, client, &ov5675_subdev_ops); diff --git a/drivers/media/i2c/ov8856.c b/drivers/media/i2c/ov8856.c index 8c93fe6285f80945f9012c0f17c97bce8688f6c5..f053c3a7676a09e171830c716088dbef6842c7ad 100644 --- a/drivers/media/i2c/ov8856.c +++ b/drivers/media/i2c/ov8856.c @@ -2323,8 +2323,8 @@ static int ov8856_get_hwcfg(struct ov8856 *ov8856, struct device *dev) if (!is_acpi_node(fwnode)) { ov8856->xvclk = devm_clk_get(dev, "xvclk"); if (IS_ERR(ov8856->xvclk)) { - dev_err_probe(dev, PTR_ERR(ov8856->xvclk), - "could not get xvclk clock\n"); + dev_err(dev, "could not get xvclk clock (%pe)\n", + ov8856->xvclk); return PTR_ERR(ov8856->xvclk); } @@ -2429,8 +2429,11 @@ static int ov8856_probe(struct i2c_client *client) return -ENOMEM; ret = ov8856_get_hwcfg(ov8856, &client->dev); - if (ret) + if (ret) { + dev_err(&client->dev, "failed to get HW configuration: %d", + ret); return ret; + } v4l2_i2c_subdev_init(&ov8856->sd, client, &ov8856_subdev_ops); diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c index bbf56016f70a228e3045412aa4709632948e3a8d..21836dd6ef85a36f4bfc7e781f0a5b57f6c1962d 100644 --- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c +++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c @@ -821,7 +821,7 @@ static int vdec_hevc_slice_setup_core_buffer(struct vdec_hevc_slice_inst *inst, inst->vsi_core->fb.y.dma_addr = y_fb_dma; inst->vsi_core->fb.y.size = ctx->picinfo.fb_sz[0]; inst->vsi_core->fb.c.dma_addr = c_fb_dma; - inst->vsi_core->fb.c.size = ctx->picinfo.fb_sz[1]; + inst->vsi_core->fb.y.size = ctx->picinfo.fb_sz[1]; inst->vsi_core->dec.vdec_fb_va = (unsigned long)fb; diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c index dc3e0d2928104c42f3355c8c23ea4ccffb60d549..092d83b7e79549bab108f8160615a0714e939d6e 100644 --- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c +++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c @@ -752,32 +752,6 @@ static int mxc_get_free_slot(struct mxc_jpeg_slot_data *slot_data) return -1; } -static void mxc_jpeg_free_slot_data(struct mxc_jpeg_dev *jpeg) -{ - /* free descriptor for decoding/encoding phase */ - dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), - jpeg->slot_data.desc, - jpeg->slot_data.desc_handle); - jpeg->slot_data.desc = NULL; - jpeg->slot_data.desc_handle = 0; - - /* free descriptor for encoder configuration phase / decoder DHT */ - dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), - jpeg->slot_data.cfg_desc, - jpeg->slot_data.cfg_desc_handle); - jpeg->slot_data.cfg_desc_handle = 0; - jpeg->slot_data.cfg_desc = NULL; - - /* free configuration stream */ - dma_free_coherent(jpeg->dev, MXC_JPEG_MAX_CFG_STREAM, - jpeg->slot_data.cfg_stream_vaddr, - jpeg->slot_data.cfg_stream_handle); - jpeg->slot_data.cfg_stream_vaddr = NULL; - jpeg->slot_data.cfg_stream_handle = 0; - - jpeg->slot_data.used = false; -} - static bool mxc_jpeg_alloc_slot_data(struct mxc_jpeg_dev *jpeg) { struct mxc_jpeg_desc *desc; @@ -820,11 +794,30 @@ static bool mxc_jpeg_alloc_slot_data(struct mxc_jpeg_dev *jpeg) return true; err: dev_err(jpeg->dev, "Could not allocate descriptors for slot %d", jpeg->slot_data.slot); - mxc_jpeg_free_slot_data(jpeg); return false; } +static void mxc_jpeg_free_slot_data(struct mxc_jpeg_dev *jpeg) +{ + /* free descriptor for decoding/encoding phase */ + dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), + jpeg->slot_data.desc, + jpeg->slot_data.desc_handle); + + /* free descriptor for encoder configuration phase / decoder DHT */ + dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), + jpeg->slot_data.cfg_desc, + jpeg->slot_data.cfg_desc_handle); + + /* free configuration stream */ + dma_free_coherent(jpeg->dev, MXC_JPEG_MAX_CFG_STREAM, + jpeg->slot_data.cfg_stream_vaddr, + jpeg->slot_data.cfg_stream_handle); + + jpeg->slot_data.used = false; +} + static void mxc_jpeg_check_and_set_last_buffer(struct mxc_jpeg_ctx *ctx, struct vb2_v4l2_buffer *src_buf, struct vb2_v4l2_buffer *dst_buf) @@ -1920,19 +1913,9 @@ static void mxc_jpeg_buf_queue(struct vb2_buffer *vb) jpeg_src_buf = vb2_to_mxc_buf(vb); jpeg_src_buf->jpeg_parse_error = false; ret = mxc_jpeg_parse(ctx, vb); - if (ret) { + if (ret) jpeg_src_buf->jpeg_parse_error = true; - /* - * if the capture queue is not setup, the device_run() won't be scheduled, - * need to drop the error buffer, so that the decoding can continue - */ - if (!vb2_is_streaming(v4l2_m2m_get_dst_vq(ctx->fh.m2m_ctx))) { - v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); - return; - } - } - end: v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); } diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c index cd6c52e9d158a784d4701c2b6ccf42dd8d2dc4c2..9745d6219a1667f28c2b290ded1c7739bee8c2ba 100644 --- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c +++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c @@ -43,7 +43,6 @@ struct mxc_isi_m2m_ctx_queue_data { struct v4l2_pix_format_mplane format; const struct mxc_isi_format_info *info; u32 sequence; - bool streaming; }; struct mxc_isi_m2m_ctx { @@ -487,17 +486,14 @@ static int mxc_isi_m2m_streamon(struct file *file, void *fh, enum v4l2_buf_type type) { struct mxc_isi_m2m_ctx *ctx = to_isi_m2m_ctx(fh); - struct mxc_isi_m2m_ctx_queue_data *q = mxc_isi_m2m_ctx_qdata(ctx, type); const struct v4l2_pix_format_mplane *out_pix = &ctx->queues.out.format; const struct v4l2_pix_format_mplane *cap_pix = &ctx->queues.cap.format; const struct mxc_isi_format_info *cap_info = ctx->queues.cap.info; const struct mxc_isi_format_info *out_info = ctx->queues.out.info; struct mxc_isi_m2m *m2m = ctx->m2m; bool bypass; - int ret; - if (q->streaming) - return 0; + int ret; mutex_lock(&m2m->lock); @@ -551,8 +547,6 @@ static int mxc_isi_m2m_streamon(struct file *file, void *fh, goto unchain; } - q->streaming = true; - return 0; unchain: @@ -575,14 +569,10 @@ static int mxc_isi_m2m_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) { struct mxc_isi_m2m_ctx *ctx = to_isi_m2m_ctx(fh); - struct mxc_isi_m2m_ctx_queue_data *q = mxc_isi_m2m_ctx_qdata(ctx, type); struct mxc_isi_m2m *m2m = ctx->m2m; v4l2_m2m_ioctl_streamoff(file, fh, type); - if (!q->streaming) - return 0; - mutex_lock(&m2m->lock); /* @@ -608,8 +598,6 @@ static int mxc_isi_m2m_streamoff(struct file *file, void *fh, mutex_unlock(&m2m->lock); - q->streaming = false; - return 0; } diff --git a/drivers/media/platform/qcom/camss/camss-csid.c b/drivers/media/platform/qcom/camss/camss-csid.c index b90e2e690f3aa15e4a96f1db1add28c830aaec79..6360314f04a636f1addd249d84f986f0b73fe703 100644 --- a/drivers/media/platform/qcom/camss/camss-csid.c +++ b/drivers/media/platform/qcom/camss/camss-csid.c @@ -239,13 +239,11 @@ static int csid_set_stream(struct v4l2_subdev *sd, int enable) int ret; if (enable) { - if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) { - ret = v4l2_ctrl_handler_setup(&csid->ctrls); - if (ret < 0) { - dev_err(csid->camss->dev, - "could not sync v4l2 controls: %d\n", ret); - return ret; - } + ret = v4l2_ctrl_handler_setup(&csid->ctrls); + if (ret < 0) { + dev_err(csid->camss->dev, + "could not sync v4l2 controls: %d\n", ret); + return ret; } if (!csid->testgen.enabled && @@ -320,8 +318,7 @@ static void csid_try_format(struct csid_device *csid, break; case MSM_CSID_PAD_SRC: - if (csid->testgen.nmodes == CSID_PAYLOAD_MODE_DISABLED || - csid->testgen_mode->cur.val == 0) { + if (csid->testgen_mode->cur.val == 0) { /* Test generator is disabled, */ /* keep pad formats in sync */ u32 code = fmt->code; @@ -371,8 +368,7 @@ static int csid_enum_mbus_code(struct v4l2_subdev *sd, code->code = csid->formats[code->index].code; } else { - if (csid->testgen.nmodes == CSID_PAYLOAD_MODE_DISABLED || - csid->testgen_mode->cur.val == 0) { + if (csid->testgen_mode->cur.val == 0) { struct v4l2_mbus_framefmt *sink_fmt; sink_fmt = __csid_get_format(csid, sd_state, @@ -754,8 +750,7 @@ static int csid_link_setup(struct media_entity *entity, /* If test generator is enabled */ /* do not allow a link from CSIPHY to CSID */ - if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED && - csid->testgen_mode->cur.val != 0) + if (csid->testgen_mode->cur.val != 0) return -EBUSY; sd = media_entity_to_v4l2_subdev(remote->entity); @@ -848,28 +843,25 @@ int msm_csid_register_entity(struct csid_device *csid, MSM_CSID_NAME, csid->id); v4l2_set_subdevdata(sd, csid); - if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) { - ret = v4l2_ctrl_handler_init(&csid->ctrls, 1); - if (ret < 0) { - dev_err(dev, "Failed to init ctrl handler: %d\n", ret); - return ret; - } + ret = v4l2_ctrl_handler_init(&csid->ctrls, 1); + if (ret < 0) { + dev_err(dev, "Failed to init ctrl handler: %d\n", ret); + return ret; + } - csid->testgen_mode = - v4l2_ctrl_new_std_menu_items(&csid->ctrls, - &csid_ctrl_ops, V4L2_CID_TEST_PATTERN, - csid->testgen.nmodes, 0, 0, - csid->testgen.modes); + csid->testgen_mode = v4l2_ctrl_new_std_menu_items(&csid->ctrls, + &csid_ctrl_ops, V4L2_CID_TEST_PATTERN, + csid->testgen.nmodes, 0, 0, + csid->testgen.modes); - if (csid->ctrls.error) { - dev_err(dev, "Failed to init ctrl: %d\n", csid->ctrls.error); - ret = csid->ctrls.error; - goto free_ctrl; - } - - csid->subdev.ctrl_handler = &csid->ctrls; + if (csid->ctrls.error) { + dev_err(dev, "Failed to init ctrl: %d\n", csid->ctrls.error); + ret = csid->ctrls.error; + goto free_ctrl; } + csid->subdev.ctrl_handler = &csid->ctrls; + ret = csid_init_formats(sd, NULL); if (ret < 0) { dev_err(dev, "Failed to init format: %d\n", ret); @@ -899,8 +891,7 @@ int msm_csid_register_entity(struct csid_device *csid, media_cleanup: media_entity_cleanup(&sd->entity); free_ctrl: - if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) - v4l2_ctrl_handler_free(&csid->ctrls); + v4l2_ctrl_handler_free(&csid->ctrls); return ret; } @@ -913,6 +904,5 @@ void msm_csid_unregister_entity(struct csid_device *csid) { v4l2_device_unregister_subdev(&csid->subdev); media_entity_cleanup(&csid->subdev.entity); - if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) - v4l2_ctrl_handler_free(&csid->ctrls); + v4l2_ctrl_handler_free(&csid->ctrls); } diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c index 47ce3365451d37fd9e492a5cb1a273766c7cc1aa..b570eb8c37568f194b23d44a9bcccb2f8ffcd7aa 100644 --- a/drivers/media/platform/qcom/venus/core.c +++ b/drivers/media/platform/qcom/venus/core.c @@ -348,7 +348,7 @@ static int venus_probe(struct platform_device *pdev) ret = v4l2_device_register(dev, &core->v4l2_dev); if (ret) - goto err_hfi_destroy; + goto err_core_deinit; platform_set_drvdata(pdev, core); @@ -380,24 +380,24 @@ static int venus_probe(struct platform_device *pdev) ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC); if (ret) - goto err_core_deinit; + goto err_venus_shutdown; ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_ENC); if (ret) - goto err_core_deinit; + goto err_venus_shutdown; ret = pm_runtime_put_sync(dev); if (ret) { pm_runtime_get_noresume(dev); - goto err_core_deinit; + goto err_dev_unregister; } venus_dbgfs_init(core); return 0; -err_core_deinit: - hfi_core_deinit(core, false); +err_dev_unregister: + v4l2_device_unregister(&core->v4l2_dev); err_venus_shutdown: venus_shutdown(core); err_firmware_deinit: @@ -408,9 +408,9 @@ static int venus_probe(struct platform_device *pdev) pm_runtime_put_noidle(dev); pm_runtime_disable(dev); pm_runtime_set_suspended(dev); - v4l2_device_unregister(&core->v4l2_dev); -err_hfi_destroy: hfi_destroy(core); +err_core_deinit: + hfi_core_deinit(core, false); err_core_put: if (core->pm_ops->core_put) core->pm_ops->core_put(core); diff --git a/drivers/media/platform/ti/davinci/vpif.c b/drivers/media/platform/ti/davinci/vpif.c index fa9679abf7a4833b294a743aca03fa57b11ac533..63cdfed37bc9bcbff5492aa4f0b5a631c451759b 100644 --- a/drivers/media/platform/ti/davinci/vpif.c +++ b/drivers/media/platform/ti/davinci/vpif.c @@ -505,7 +505,7 @@ static int vpif_probe(struct platform_device *pdev) pdev_display = kzalloc(sizeof(*pdev_display), GFP_KERNEL); if (!pdev_display) { ret = -ENOMEM; - goto err_del_pdev_capture; + goto err_put_pdev_capture; } pdev_display->name = "vpif_display"; @@ -528,8 +528,6 @@ static int vpif_probe(struct platform_device *pdev) err_put_pdev_display: platform_device_put(pdev_display); -err_del_pdev_capture: - platform_device_del(pdev_capture); err_put_pdev_capture: platform_device_put(pdev_capture); err_put_rpm: diff --git a/drivers/media/platform/ti/omap3isp/ispccdc.c b/drivers/media/platform/ti/omap3isp/ispccdc.c index 6eb387ea1dae105674738b9d19b2f3c77271a9ba..2fe42aa91800492a37a6fdbed165f5b3f8762c06 100644 --- a/drivers/media/platform/ti/omap3isp/ispccdc.c +++ b/drivers/media/platform/ti/omap3isp/ispccdc.c @@ -446,8 +446,8 @@ static int ccdc_lsc_config(struct isp_ccdc_device *ccdc, if (ret < 0) goto done; - dma_sync_sgtable_for_cpu(isp->dev, &req->table.sgt, - DMA_TO_DEVICE); + dma_sync_sg_for_cpu(isp->dev, req->table.sgt.sgl, + req->table.sgt.nents, DMA_TO_DEVICE); if (copy_from_user(req->table.addr, config->lsc, req->config.size)) { @@ -455,8 +455,8 @@ static int ccdc_lsc_config(struct isp_ccdc_device *ccdc, goto done; } - dma_sync_sgtable_for_device(isp->dev, &req->table.sgt, - DMA_TO_DEVICE); + dma_sync_sg_for_device(isp->dev, req->table.sgt.sgl, + req->table.sgt.nents, DMA_TO_DEVICE); } spin_lock_irqsave(&ccdc->lsc.req_lock, flags); diff --git a/drivers/media/platform/ti/omap3isp/ispstat.c b/drivers/media/platform/ti/omap3isp/ispstat.c index dc496ca9748a6c8a5d81c1f6093c9b5a9d4caf0a..68cf68dbcace281090e81f44ee9ec100a2c6187d 100644 --- a/drivers/media/platform/ti/omap3isp/ispstat.c +++ b/drivers/media/platform/ti/omap3isp/ispstat.c @@ -161,7 +161,8 @@ static void isp_stat_buf_sync_for_device(struct ispstat *stat, if (ISP_STAT_USES_DMAENGINE(stat)) return; - dma_sync_sgtable_for_device(stat->isp->dev, &buf->sgt, DMA_FROM_DEVICE); + dma_sync_sg_for_device(stat->isp->dev, buf->sgt.sgl, + buf->sgt.nents, DMA_FROM_DEVICE); } static void isp_stat_buf_sync_for_cpu(struct ispstat *stat, @@ -170,7 +171,8 @@ static void isp_stat_buf_sync_for_cpu(struct ispstat *stat, if (ISP_STAT_USES_DMAENGINE(stat)) return; - dma_sync_sgtable_for_cpu(stat->isp->dev, &buf->sgt, DMA_FROM_DEVICE); + dma_sync_sg_for_cpu(stat->isp->dev, buf->sgt.sgl, + buf->sgt.nents, DMA_FROM_DEVICE); } static void isp_stat_buf_clear(struct ispstat *stat) diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c index f3023e91b3ebc8003fda4cd0049c1f0accd8727b..7838e62727128fca89e07cfa691b7671f3cf0e58 100644 --- a/drivers/media/test-drivers/vidtv/vidtv_channel.c +++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c @@ -497,7 +497,7 @@ int vidtv_channel_si_init(struct vidtv_mux *m) vidtv_psi_sdt_table_destroy(m->si.sdt); free_pat: vidtv_psi_pat_table_destroy(m->si.pat); - return -EINVAL; + return 0; } void vidtv_channel_si_destroy(struct vidtv_mux *m) diff --git a/drivers/media/test-drivers/vivid/vivid-vid-cap.c b/drivers/media/test-drivers/vivid/vivid-vid-cap.c index 0ab47fb8696bd0b515780ff35941a47423c8c8d4..9443dbb04699a38064187ccdf6fc06c7f5ac552b 100644 --- a/drivers/media/test-drivers/vivid/vivid-vid-cap.c +++ b/drivers/media/test-drivers/vivid/vivid-vid-cap.c @@ -954,8 +954,8 @@ int vivid_vid_cap_s_selection(struct file *file, void *fh, struct v4l2_selection if (dev->has_compose_cap) { v4l2_rect_set_min_size(compose, &min_rect); v4l2_rect_set_max_size(compose, &max_rect); + v4l2_rect_map_inside(compose, &fmt); } - v4l2_rect_map_inside(compose, &fmt); dev->fmt_cap_rect = fmt; tpg_s_buf_height(&dev->tpg, fmt.height); } else if (dev->has_compose_cap) { diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c index ce52c936cb931066f1f4f7d2831cdbbf831498b4..1d98d3465e28d4020d126169c155b2de8c880269 100644 --- a/drivers/media/usb/dvb-usb/cxusb.c +++ b/drivers/media/usb/dvb-usb/cxusb.c @@ -119,8 +119,9 @@ static void cxusb_gpio_tuner(struct dvb_usb_device *d, int onoff) o[0] = GPIO_TUNER; o[1] = onoff; + cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1); - if (!cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1) && i != 0x01) + if (i != 0x01) dev_info(&d->udev->dev, "gpio_write failed.\n"); st->gpio_write_state[GPIO_TUNER] = onoff; diff --git a/drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.c b/drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.c index 303b055fefea986736865d102219421a601dc312..5a47dcbf1c8e55650fc6bc3fa826ce10baac415d 100644 --- a/drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.c +++ b/drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.c @@ -520,13 +520,12 @@ static int hdcs_init(struct sd *sd) static int hdcs_dump(struct sd *sd) { u16 reg, val; - int err = 0; pr_info("Dumping sensor registers:\n"); - for (reg = HDCS_IDENT; reg <= HDCS_ROWEXPH && !err; reg++) { - err = stv06xx_read_sensor(sd, reg, &val); + for (reg = HDCS_IDENT; reg <= HDCS_ROWEXPH; reg++) { + stv06xx_read_sensor(sd, reg, &val); pr_info("reg 0x%02x = 0x%02x\n", reg, val); } - return (err < 0) ? err : 0; + return 0; } diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index bd90d8bacd5ef1184ada02804fae33c0140c4a91..5926a9dfb0b1f8cb11cebc0886c728c5f00029dd 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1642,9 +1642,7 @@ static bool uvc_ctrl_xctrls_has_control(const struct v4l2_ext_control *xctrls, } static void uvc_ctrl_send_events(struct uvc_fh *handle, - struct uvc_entity *entity, - const struct v4l2_ext_control *xctrls, - unsigned int xctrls_count) + const struct v4l2_ext_control *xctrls, unsigned int xctrls_count) { struct uvc_control_mapping *mapping; struct uvc_control *ctrl; @@ -1655,9 +1653,6 @@ static void uvc_ctrl_send_events(struct uvc_fh *handle, u32 changes = V4L2_EVENT_CTRL_CH_VALUE; ctrl = uvc_find_control(handle->chain, xctrls[i].id, &mapping); - if (ctrl->entity != entity) - continue; - if (ctrl->info.flags & UVC_CTRL_FLAG_ASYNCHRONOUS) /* Notification will be sent from an Interrupt event. */ continue; @@ -1788,20 +1783,15 @@ int uvc_ctrl_begin(struct uvc_video_chain *chain) return mutex_lock_interruptible(&chain->ctrl_mutex) ? -ERESTARTSYS : 0; } -/* - * Returns the number of uvc controls that have been correctly set, or a - * negative number if there has been an error. - */ static int uvc_ctrl_commit_entity(struct uvc_device *dev, struct uvc_fh *handle, struct uvc_entity *entity, int rollback, struct uvc_control **err_ctrl) { - unsigned int processed_ctrls = 0; struct uvc_control *ctrl; unsigned int i; - int ret = 0; + int ret; if (entity == NULL) return 0; @@ -1830,9 +1820,8 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev, dev->intfnum, ctrl->info.selector, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), ctrl->info.size); - - if (!ret) - processed_ctrls++; + else + ret = 0; if (rollback || ret < 0) memcpy(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), @@ -1841,26 +1830,18 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev, ctrl->dirty = 0; - if (!rollback && handle && - ctrl->info.flags & UVC_CTRL_FLAG_ASYNCHRONOUS) - uvc_ctrl_set_handle(handle, ctrl, handle); - - if (ret < 0 && !rollback) { + if (ret < 0) { if (err_ctrl) *err_ctrl = ctrl; - /* - * If we fail to set a control, we need to rollback - * the next ones. - */ - rollback = 1; + return ret; } + if (!rollback && handle && + ctrl->info.flags & UVC_CTRL_FLAG_ASYNCHRONOUS) + uvc_ctrl_set_handle(handle, ctrl, handle); } - if (ret) - return ret; - - return processed_ctrls; + return 0; } static int uvc_ctrl_find_ctrl_idx(struct uvc_entity *entity, @@ -1890,8 +1871,7 @@ int __uvc_ctrl_commit(struct uvc_fh *handle, int rollback, struct uvc_video_chain *chain = handle->chain; struct uvc_control *err_ctrl; struct uvc_entity *entity; - int ret_out = 0; - int ret; + int ret = 0; /* Find the control. */ list_for_each_entry(entity, &chain->entities, chain) { @@ -1902,23 +1882,15 @@ int __uvc_ctrl_commit(struct uvc_fh *handle, int rollback, ctrls->error_idx = uvc_ctrl_find_ctrl_idx(entity, ctrls, err_ctrl); - /* - * When we fail to commit an entity, we need to - * restore the UVC_CTRL_DATA_BACKUP for all the - * controls in the other entities, otherwise our cache - * and the hardware will be out of sync. - */ - rollback = 1; - - ret_out = ret; - } else if (ret > 0 && !rollback) { - uvc_ctrl_send_events(handle, entity, - ctrls->controls, ctrls->count); + goto done; } } + if (!rollback) + uvc_ctrl_send_events(handle, ctrls->controls, ctrls->count); +done: mutex_unlock(&chain->ctrl_mutex); - return ret_out; + return ret; } int uvc_ctrl_get(struct uvc_video_chain *chain, diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c index 76f18557f37bd467815b83e4d70479ca46f92f99..02cfa12b9cb902631e8265f60b91bf95e8d498d9 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2217,16 +2217,13 @@ static int uvc_probe(struct usb_interface *intf, #endif /* Parse the Video Class control descriptor. */ - ret = uvc_parse_control(dev); - if (ret < 0) { - ret = -ENODEV; + if (uvc_parse_control(dev) < 0) { uvc_dbg(dev, PROBE, "Unable to parse UVC descriptors\n"); goto error; } /* Parse the associated GPIOs. */ - ret = uvc_gpio_parse(dev); - if (ret < 0) { + if (uvc_gpio_parse(dev) < 0) { uvc_dbg(dev, PROBE, "Unable to parse UVC GPIOs\n"); goto error; } @@ -2252,32 +2249,24 @@ static int uvc_probe(struct usb_interface *intf, } /* Register the V4L2 device. */ - ret = v4l2_device_register(&intf->dev, &dev->vdev); - if (ret < 0) + if (v4l2_device_register(&intf->dev, &dev->vdev) < 0) goto error; /* Scan the device for video chains. */ - if (uvc_scan_device(dev) < 0) { - ret = -ENODEV; + if (uvc_scan_device(dev) < 0) goto error; - } /* Initialize controls. */ - if (uvc_ctrl_init_device(dev) < 0) { - ret = -ENODEV; + if (uvc_ctrl_init_device(dev) < 0) goto error; - } /* Register video device nodes. */ - if (uvc_register_chains(dev) < 0) { - ret = -ENODEV; + if (uvc_register_chains(dev) < 0) goto error; - } #ifdef CONFIG_MEDIA_CONTROLLER /* Register the media device node */ - ret = media_device_register(&dev->mdev); - if (ret < 0) + if (media_device_register(&dev->mdev) < 0) goto error; #endif /* Save our data pointer in the interface data. */ @@ -2311,7 +2300,7 @@ static int uvc_probe(struct usb_interface *intf, error: uvc_unregister_video(dev); kref_put(&dev->ref, uvc_delete); - return ret; + return -ENODEV; } static void uvc_disconnect(struct usb_interface *intf) diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index c4d3d110c5007eda4711e04a0e989c1b05c141da..77bbf276ae89dfcfdbc14f9aff87734b85f7dd14 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -1033,25 +1033,25 @@ int __video_register_device(struct video_device *vdev, vdev->dev.class = &video_class; vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor); vdev->dev.parent = vdev->dev_parent; - vdev->dev.release = v4l2_device_release; dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num); - - /* Increase v4l2_device refcount */ - v4l2_device_get(vdev->v4l2_dev); - mutex_lock(&videodev_lock); ret = device_register(&vdev->dev); if (ret < 0) { mutex_unlock(&videodev_lock); pr_err("%s: device_register failed\n", __func__); - put_device(&vdev->dev); - return ret; + goto cleanup; } + /* Register the release callback that will be called when the last + reference to the device goes away. */ + vdev->dev.release = v4l2_device_release; if (nr != -1 && nr != vdev->num && warn_if_nr_in_use) pr_warn("%s: requested %s%d, got %s\n", __func__, name_base, nr, video_device_node_name(vdev)); + /* Increase v4l2_device refcount */ + v4l2_device_get(vdev->v4l2_dev); + /* Part 5: Register the entity. */ ret = video_register_media_controller(vdev); diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index cb3ad72a3e54a6f44c74545c7096ab26777b84dc..5f115438d07228abfa8d95c732c70800e2f509c0 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -351,8 +351,6 @@ static int call_enum_dv_timings(struct v4l2_subdev *sd, static int call_get_mbus_config(struct v4l2_subdev *sd, unsigned int pad, struct v4l2_mbus_config *config) { - memset(config, 0, sizeof(*config)); - return check_pad(sd, pad) ? : sd->ops->pad->get_mbus_config(sd, pad, config); } diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c index ac71abdce1b254aaa6f499980327690be98abb4a..bbfaf6536903d35c704fced42859fb4fb3e54afe 100644 --- a/drivers/memstick/core/memstick.c +++ b/drivers/memstick/core/memstick.c @@ -323,7 +323,7 @@ EXPORT_SYMBOL(memstick_init_req); static int h_memstick_read_dev_id(struct memstick_dev *card, struct memstick_request **mrq) { - struct ms_id_register id_reg = {}; + struct ms_id_register id_reg; if (!(*mrq)) { memstick_init_req(&card->current_mrq, MS_TPC_READ_REG, &id_reg, diff --git a/drivers/mfd/exynos-lpass.c b/drivers/mfd/exynos-lpass.c index 5e39d91b728fc318827a4096669d7109245422d6..1506d8d352b19be4f1e13192c5964fb8e81708c6 100644 --- a/drivers/mfd/exynos-lpass.c +++ b/drivers/mfd/exynos-lpass.c @@ -141,6 +141,7 @@ static int exynos_lpass_remove(struct platform_device *pdev) { struct exynos_lpass *lpass = platform_get_drvdata(pdev); + exynos_lpass_disable(lpass); pm_runtime_disable(&pdev->dev); if (!pm_runtime_status_suspended(&pdev->dev)) exynos_lpass_disable(lpass); diff --git a/drivers/mfd/max14577.c b/drivers/mfd/max14577.c index 17672eeb1732a2e2191cac143e1137de5eb94e8d..1f4f5002595c0ae43a306217d3483e72b355353a 100644 --- a/drivers/mfd/max14577.c +++ b/drivers/mfd/max14577.c @@ -463,7 +463,6 @@ static void max14577_i2c_remove(struct i2c_client *i2c) { struct max14577 *max14577 = i2c_get_clientdata(i2c); - device_init_wakeup(max14577->dev, false); mfd_remove_devices(max14577->dev); regmap_del_irq_chip(max14577->irq, max14577->irq_data); if (max14577->dev_type == MAXIM_DEVICE_TYPE_MAX77836) diff --git a/drivers/mfd/stmpe-spi.c b/drivers/mfd/stmpe-spi.c index b9cc85ea2c40195cd5ebad7c898d26ed44809c69..792236f56399af133a3f5b1c03e789661a1e25d5 100644 --- a/drivers/mfd/stmpe-spi.c +++ b/drivers/mfd/stmpe-spi.c @@ -129,7 +129,7 @@ static const struct spi_device_id stmpe_spi_id[] = { { "stmpe2403", STMPE2403 }, { } }; -MODULE_DEVICE_TABLE(spi, stmpe_spi_id); +MODULE_DEVICE_TABLE(spi, stmpe_id); static struct spi_driver stmpe_spi_driver = { .driver = { diff --git a/drivers/misc/tps6594-pfsm.c b/drivers/misc/tps6594-pfsm.c index 71fbe31542e562152ac292c348d1a03d9cbc3c04..88dcac8148922c7f5dc8fcf7147f7dc218c26728 100644 --- a/drivers/misc/tps6594-pfsm.c +++ b/drivers/misc/tps6594-pfsm.c @@ -260,9 +260,6 @@ static int tps6594_pfsm_probe(struct platform_device *pdev) pfsm->miscdev.minor = MISC_DYNAMIC_MINOR; pfsm->miscdev.name = devm_kasprintf(dev, GFP_KERNEL, "pfsm-%ld-0x%02x", tps->chip_id, tps->reg); - if (!pfsm->miscdev.name) - return -ENOMEM; - pfsm->miscdev.fops = &tps6594_pfsm_fops; pfsm->miscdev.parent = dev->parent; diff --git a/drivers/misc/vmw_vmci/vmci_host.c b/drivers/misc/vmw_vmci/vmci_host.c index b64944367ac5337c65636a9cb0b01c7bcdee4c5b..abe79f6fd2a79b043bd6cce0de66a35bb76ed8bf 100644 --- a/drivers/misc/vmw_vmci/vmci_host.c +++ b/drivers/misc/vmw_vmci/vmci_host.c @@ -227,7 +227,6 @@ static int drv_cp_harray_to_user(void __user *user_buf_uva, static int vmci_host_setup_notify(struct vmci_ctx *context, unsigned long uva) { - struct page *page; int retval; if (context->notify_page) { @@ -244,11 +243,13 @@ static int vmci_host_setup_notify(struct vmci_ctx *context, /* * Lock physical page backing a given user VA. */ - retval = get_user_pages_fast(uva, 1, FOLL_WRITE, &page); - if (retval != 1) + retval = get_user_pages_fast(uva, 1, FOLL_WRITE, &context->notify_page); + if (retval != 1) { + context->notify_page = NULL; return VMCI_ERROR_GENERIC; - - context->notify_page = page; + } + if (context->notify_page == NULL) + return VMCI_ERROR_UNAVAILABLE; /* * Map the locked page and set up notify pointer. diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h index fe0b2fa3bb89dc68cd196e1d65a74e2b18d84ee2..8476754b1b170c5698ea7da3d4e1008a70ead1c6 100644 --- a/drivers/mmc/core/card.h +++ b/drivers/mmc/core/card.h @@ -86,7 +86,6 @@ struct mmc_fixup { #define CID_MANFID_MICRON 0x13 #define CID_MANFID_SAMSUNG 0x15 #define CID_MANFID_APACER 0x27 -#define CID_MANFID_SWISSBIT 0x5D #define CID_MANFID_KINGSTON 0x70 #define CID_MANFID_HYNIX 0x90 #define CID_MANFID_KINGSTON_SD 0x9F @@ -292,9 +291,4 @@ static inline int mmc_card_broken_sd_poweroff_notify(const struct mmc_card *c) return c->quirks & MMC_QUIRK_BROKEN_SD_POWEROFF_NOTIFY; } -static inline int mmc_card_no_uhs_ddr50_tuning(const struct mmc_card *c) -{ - return c->quirks & MMC_QUIRK_NO_UHS_DDR50_TUNING; -} - #endif diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h index c417ed34c05767dbb4818aa153683b04577a32dc..89b512905be1400334322484805c3cca01dc69c6 100644 --- a/drivers/mmc/core/quirks.h +++ b/drivers/mmc/core/quirks.h @@ -34,22 +34,6 @@ static const struct mmc_fixup __maybe_unused mmc_sd_fixups[] = { MMC_QUIRK_BROKEN_SD_CACHE | MMC_QUIRK_BROKEN_SD_POWEROFF_NOTIFY, EXT_CSD_REV_ANY), - /* - * Swissbit series S46-u cards throw I/O errors during tuning requests - * after the initial tuning request expectedly times out. This has - * only been observed on cards manufactured on 01/2019 that are using - * Bay Trail host controllers. - */ - _FIXUP_EXT("0016G", CID_MANFID_SWISSBIT, 0x5342, 2019, 1, - 0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd, - MMC_QUIRK_NO_UHS_DDR50_TUNING, EXT_CSD_REV_ANY), - - /* - * Some SD cards reports discard support while they don't - */ - MMC_FIXUP(CID_NAME_ANY, CID_MANFID_SANDISK_SD, 0x5344, add_quirk_sd, - MMC_QUIRK_BROKEN_SD_DISCARD), - END_FIXUP }; @@ -153,6 +137,12 @@ static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = { MMC_FIXUP("M62704", CID_MANFID_KINGSTON, 0x0100, add_quirk_mmc, MMC_QUIRK_TRIM_BROKEN), + /* + * Some SD cards reports discard support while they don't + */ + MMC_FIXUP(CID_NAME_ANY, CID_MANFID_SANDISK_SD, 0x5344, add_quirk_sd, + MMC_QUIRK_BROKEN_SD_DISCARD), + END_FIXUP }; diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index a06f3011e2b58ccdcfe30484e1be203c267566b2..f02c3e5eb5c851d6550d9cdf7995b33c0994936f 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -618,29 +618,6 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status) return 0; } -/* - * Determine if the card should tune or not. - */ -static bool mmc_sd_use_tuning(struct mmc_card *card) -{ - /* - * SPI mode doesn't define CMD19 and tuning is only valid for SDR50 and - * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. - */ - if (mmc_host_is_spi(card->host)) - return false; - - switch (card->host->ios.timing) { - case MMC_TIMING_UHS_SDR50: - case MMC_TIMING_UHS_SDR104: - return true; - case MMC_TIMING_UHS_DDR50: - return !mmc_card_no_uhs_ddr50_tuning(card); - } - - return false; -} - /* * UHS-I specific initialization procedure */ @@ -684,7 +661,14 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card) if (err) goto out; - if (mmc_sd_use_tuning(card)) { + /* + * SPI mode doesn't define CMD19 and tuning is only valid for SDR50 and + * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. + */ + if (!mmc_host_is_spi(card->host) && + (card->host->ios.timing == MMC_TIMING_UHS_SDR50 || + card->host->ios.timing == MMC_TIMING_UHS_DDR50 || + card->host->ios.timing == MMC_TIMING_UHS_SDR104)) { err = mmc_execute_tuning(card); /* diff --git a/drivers/mmc/host/bcm2835.c b/drivers/mmc/host/bcm2835.c index f923447ed2ce23eafed1df881cdfd7de2ba1ed13..35d8fdea668b913d723fe021dda3d344d3ba14b5 100644 --- a/drivers/mmc/host/bcm2835.c +++ b/drivers/mmc/host/bcm2835.c @@ -502,8 +502,7 @@ void bcm2835_prepare_dma(struct bcm2835_host *host, struct mmc_data *data) DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!desc) { - dma_unmap_sg(dma_chan->device->dev, data->sg, data->sg_len, - dir_data); + dma_unmap_sg(dma_chan->device->dev, data->sg, sg_len, dir_data); return; } diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index cf685c0a17edc0f69f02e9bed51365e2a8382727..02f3748e46c144ab561bf76030601c4d456c9dd2 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -770,18 +770,12 @@ static inline void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, static void msdc_prepare_data(struct msdc_host *host, struct mmc_data *data) { if (!(data->host_cookie & MSDC_PREPARE_FLAG)) { + data->host_cookie |= MSDC_PREPARE_FLAG; data->sg_count = dma_map_sg(host->dev, data->sg, data->sg_len, mmc_get_dma_dir(data)); - if (data->sg_count) - data->host_cookie |= MSDC_PREPARE_FLAG; } } -static bool msdc_data_prepared(struct mmc_data *data) -{ - return data->host_cookie & MSDC_PREPARE_FLAG; -} - static void msdc_unprepare_data(struct msdc_host *host, struct mmc_data *data) { if (data->host_cookie & MSDC_ASYNC_FLAG) @@ -1344,19 +1338,8 @@ static void msdc_ops_request(struct mmc_host *mmc, struct mmc_request *mrq) WARN_ON(host->mrq); host->mrq = mrq; - if (mrq->data) { + if (mrq->data) msdc_prepare_data(host, mrq->data); - if (!msdc_data_prepared(mrq->data)) { - host->mrq = NULL; - /* - * Failed to prepare DMA area, fail fast before - * starting any commands. - */ - mrq->cmd->error = -ENOSPC; - mmc_request_done(mmc_from_priv(host), mrq); - return; - } - } /* if SBC is required, we have HW option and SW option. * if HW option is enabled, and SBC does not have "special" flags, diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c index 2ea5357e3bf0eab9cfdaa940ff56f1a071e1fade..dbfe0a5324eaf07eec0ee1889bc6f65cfa628325 100644 --- a/drivers/mmc/host/sdhci-pci-core.c +++ b/drivers/mmc/host/sdhci-pci-core.c @@ -911,8 +911,7 @@ static bool glk_broken_cqhci(struct sdhci_pci_slot *slot) { return slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_GLK_EMMC && (dmi_match(DMI_BIOS_VENDOR, "LENOVO") || - dmi_match(DMI_SYS_VENDOR, "IRBIS") || - dmi_match(DMI_SYS_VENDOR, "Positivo Tecnologia SA")); + dmi_match(DMI_SYS_VENDOR, "IRBIS")); } static bool jsl_broken_hs400es(struct sdhci_pci_slot *slot) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 9796a3cb3ca62c58750791c8e945a7bf2885b15d..f32429ff905ff66ecca6cc35d277aa19b55b7aa1 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -2035,10 +2035,15 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) host->mmc->actual_clock = 0; - sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL); + clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); + if (clk & SDHCI_CLOCK_CARD_EN) + sdhci_writew(host, clk & ~SDHCI_CLOCK_CARD_EN, + SDHCI_CLOCK_CONTROL); - if (clock == 0) + if (clock == 0) { + sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL); return; + } clk = sdhci_calc_clk(host, clock, &host->mmc->actual_clock); sdhci_enable_clk(host, clk); diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 16d7bff9eae562d578f666df1193cb20ffd4fa84..a315cee698094f6d034a4618373cbb92f6c1cfff 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -825,20 +825,4 @@ void sdhci_switch_external_dma(struct sdhci_host *host, bool en); void sdhci_set_data_timeout_irq(struct sdhci_host *host, bool enable); void __sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd); -#if defined(CONFIG_DYNAMIC_DEBUG) || \ - (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) -#define SDHCI_DBG_ANYWAY 0 -#elif defined(DEBUG) -#define SDHCI_DBG_ANYWAY 1 -#else -#define SDHCI_DBG_ANYWAY 0 -#endif - -#define sdhci_dbg_dumpregs(host, fmt) \ -do { \ - DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \ - if (DYNAMIC_DEBUG_BRANCH(descriptor) || SDHCI_DBG_ANYWAY) \ - sdhci_dumpregs(host); \ -} while (0) - #endif /* __SDHCI_HW_H */ diff --git a/drivers/mmc/host/sdhci_am654.c b/drivers/mmc/host/sdhci_am654.c index fb89b6062351adeb89989b3c87a401dcef8d8f88..562034af653ebbff3ab8347a28a8f8e83930e8c4 100644 --- a/drivers/mmc/host/sdhci_am654.c +++ b/drivers/mmc/host/sdhci_am654.c @@ -559,8 +559,7 @@ static struct sdhci_ops sdhci_am654_ops = { static const struct sdhci_pltfm_data sdhci_am654_pdata = { .ops = &sdhci_am654_ops, .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12, - .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN | - SDHCI_QUIRK2_DISABLE_HW_TIMEOUT, + .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN, }; static const struct sdhci_am654_driver_data sdhci_am654_sr1_drvdata = { @@ -590,8 +589,7 @@ static struct sdhci_ops sdhci_j721e_8bit_ops = { static const struct sdhci_pltfm_data sdhci_j721e_8bit_pdata = { .ops = &sdhci_j721e_8bit_ops, .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12, - .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN | - SDHCI_QUIRK2_DISABLE_HW_TIMEOUT, + .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN, }; static const struct sdhci_am654_driver_data sdhci_j721e_8bit_drvdata = { @@ -615,8 +613,7 @@ static struct sdhci_ops sdhci_j721e_4bit_ops = { static const struct sdhci_pltfm_data sdhci_j721e_4bit_pdata = { .ops = &sdhci_j721e_4bit_ops, .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12, - .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN | - SDHCI_QUIRK2_DISABLE_HW_TIMEOUT, + .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN, }; static const struct sdhci_am654_driver_data sdhci_j721e_4bit_drvdata = { diff --git a/drivers/mtd/nand/ecc-mxic.c b/drivers/mtd/nand/ecc-mxic.c index 63cb206269dd9ddd6c742e77b823b9f5543f6bdd..47e10945b8d27171b5b316d192da51fb6a6f333c 100644 --- a/drivers/mtd/nand/ecc-mxic.c +++ b/drivers/mtd/nand/ecc-mxic.c @@ -614,7 +614,7 @@ static int mxic_ecc_finish_io_req_external(struct nand_device *nand, { struct mxic_ecc_engine *mxic = nand_to_mxic(nand); struct mxic_ecc_ctx *ctx = nand_to_ecc_ctx(nand); - int nents, step, ret = 0; + int nents, step, ret; if (req->mode == MTD_OPS_RAW) return 0; diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c index 275d34119acdcb8bfc8f017cbe64edd6996f864a..b8cff9240b286c7ac789bf4216611b54bee05dd3 100644 --- a/drivers/mtd/nand/raw/qcom_nandc.c +++ b/drivers/mtd/nand/raw/qcom_nandc.c @@ -2858,12 +2858,7 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_ const struct nand_op_instr *instr = NULL; unsigned int op_id = 0; unsigned int len = 0; - int ret, reg_base; - - reg_base = NAND_READ_LOCATION_0; - - if (nandc->props->qpic_v2) - reg_base = NAND_READ_LOCATION_LAST_CW_0; + int ret; ret = qcom_parse_instructions(chip, subop, &q_op); if (ret) @@ -2915,17 +2910,14 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_ op_id = q_op.data_instr_idx; len = nand_subop_get_data_len(subop, op_id); - if (nandc->props->qpic_v2) - nandc_set_read_loc_last(chip, reg_base, 0, len, 1); - else - nandc_set_read_loc_first(chip, reg_base, 0, len, 1); + nandc_set_read_loc(chip, 0, 0, 0, len, 1); if (!nandc->props->qpic_v2) { write_reg_dma(nandc, NAND_DEV_CMD_VLD, 1, 0); write_reg_dma(nandc, NAND_DEV_CMD1, 1, NAND_BAM_NEXT_SGL); } - nandc->buf_count = 512; + nandc->buf_count = len; memset(nandc->data_buffer, 0xff, nandc->buf_count); config_nand_single_cw_page_read(chip, false, 0); diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/sunxi_nand.c index 4469618ee60331f125cdab9e5460f342a9025a27..9abf38049d35f3a25e22a5cd82f440e88a2c9cdd 100644 --- a/drivers/mtd/nand/raw/sunxi_nand.c +++ b/drivers/mtd/nand/raw/sunxi_nand.c @@ -817,7 +817,6 @@ static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand, if (ret) return ret; - sunxi_nfc_randomizer_config(nand, page, false); sunxi_nfc_randomizer_enable(nand); writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP, nfc->regs + NFC_REG_CMD); @@ -1050,7 +1049,6 @@ static int sunxi_nfc_hw_ecc_write_chunk(struct nand_chip *nand, if (ret) return ret; - sunxi_nfc_randomizer_config(nand, page, false); sunxi_nfc_randomizer_enable(nand); sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand, oob, 0, bbm, page); diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index cd21bf8f254a75cbf9c347aac6ae1a1c1abcfe43..393ff37f0d23c15567765457a248ac9c0cbbdb77 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -1316,7 +1316,6 @@ static void spinand_cleanup(struct spinand_device *spinand) { struct nand_device *nand = spinand_to_nand(spinand); - nanddev_ecc_engine_cleanup(nand); nanddev_cleanup(nand); spinand_manufacturer_cleanup(spinand); kfree(spinand->databuf); diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 85ab6925716272f1316d8dbace779be562ded468..56c241246d1af45a8ae022e019a5f22e4c0ad9f5 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -2040,26 +2040,15 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev, * set the master's mac address to that of the first slave */ memcpy(ss.__data, bond_dev->dev_addr, bond_dev->addr_len); - } else if (bond->params.fail_over_mac == BOND_FOM_FOLLOW && - BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP && - memcmp(slave_dev->dev_addr, bond_dev->dev_addr, bond_dev->addr_len) == 0) { - /* Set slave to random address to avoid duplicate mac - * address in later fail over. - */ - eth_random_addr(ss.__data); - } else { - goto skip_mac_set; - } - - ss.ss_family = slave_dev->type; - res = dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, extack); - if (res) { - slave_err(bond_dev, slave_dev, "Error %d calling set_mac_address\n", res); - goto err_restore_mtu; + ss.ss_family = slave_dev->type; + res = dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, + extack); + if (res) { + slave_err(bond_dev, slave_dev, "Error %d calling set_mac_address\n", res); + goto err_restore_mtu; + } } -skip_mac_set: - /* set no_addrconf flag before open to prevent IPv6 addrconf */ slave_dev->priv_flags |= IFF_NO_ADDRCONF; diff --git a/drivers/net/can/dev/dev.c b/drivers/net/can/dev/dev.c index 6018444a76b9bcd05d83334a1fda8c9b149b43d1..7d9a7c92d4cf63c85da768831204ee9aab8ae040 100644 --- a/drivers/net/can/dev/dev.c +++ b/drivers/net/can/dev/dev.c @@ -125,16 +125,13 @@ void can_change_state(struct net_device *dev, struct can_frame *cf, EXPORT_SYMBOL_GPL(can_change_state); /* CAN device restart for bus-off recovery */ -static int can_restart(struct net_device *dev) +static void can_restart(struct net_device *dev) { struct can_priv *priv = netdev_priv(dev); struct sk_buff *skb; struct can_frame *cf; int err; - if (!priv->do_set_mode) - return -EOPNOTSUPP; - if (netif_carrier_ok(dev)) netdev_err(dev, "Attempt to restart for bus-off recovery, but carrier is OK?\n"); @@ -145,25 +142,24 @@ static int can_restart(struct net_device *dev) /* send restart message upstream */ skb = alloc_can_err_skb(dev, &cf); - if (skb) { - cf->can_id |= CAN_ERR_RESTARTED; - netif_rx(skb); - } + if (!skb) + goto restart; + + cf->can_id |= CAN_ERR_RESTARTED; + + netif_rx(skb); + +restart: + netdev_dbg(dev, "restarted\n"); + priv->can_stats.restarts++; /* Now restart the device */ netif_carrier_on(dev); err = priv->do_set_mode(dev, CAN_MODE_START); if (err) { - netdev_err(dev, "Restart failed, error %pe\n", ERR_PTR(err)); + netdev_err(dev, "Error %d during restart", err); netif_carrier_off(dev); - - return err; - } else { - netdev_dbg(dev, "Restarted\n"); - priv->can_stats.restarts++; } - - return 0; } static void can_restart_work(struct work_struct *work) @@ -188,8 +184,9 @@ int can_restart_now(struct net_device *dev) return -EBUSY; cancel_delayed_work_sync(&priv->restart_work); + can_restart(dev); - return can_restart(dev); + return 0; } /* CAN bus-off diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c index abe8dc051d94f1ebc22f261cadf2ad0e4f87ca56..01aacdcda26066e0679337a4342dc2ff817f2071 100644 --- a/drivers/net/can/dev/netlink.c +++ b/drivers/net/can/dev/netlink.c @@ -285,12 +285,6 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[], } if (data[IFLA_CAN_RESTART_MS]) { - if (!priv->do_set_mode) { - NL_SET_ERR_MSG(extack, - "Device doesn't support restart from Bus Off"); - return -EOPNOTSUPP; - } - /* Do not allow changing restart delay while running */ if (dev->flags & IFF_UP) return -EBUSY; @@ -298,12 +292,6 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[], } if (data[IFLA_CAN_RESTART]) { - if (!priv->do_set_mode) { - NL_SET_ERR_MSG(extack, - "Device doesn't support restart from Bus Off"); - return -EOPNOTSUPP; - } - /* Do not allow a restart while not running */ if (!(dev->flags & IFF_UP)) return -EINVAL; diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c index 73b448cd00f29f5ed1e27e09ac3af74a9b3f5211..c490b4ba065ba46b8b923ff482b546e0ba6f0742 100644 --- a/drivers/net/can/kvaser_pciefd.c +++ b/drivers/net/can/kvaser_pciefd.c @@ -1137,7 +1137,7 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie, skb = alloc_canfd_skb(priv->dev, &cf); if (!skb) { priv->dev->stats.rx_dropped++; - return 0; + return -ENOMEM; } cf->len = can_fd_dlc2len(dlc); @@ -1149,7 +1149,7 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie, skb = alloc_can_skb(priv->dev, (struct can_frame **)&cf); if (!skb) { priv->dev->stats.rx_dropped++; - return 0; + return -ENOMEM; } can_frame_set_cc_len((struct can_frame *)cf, dlc, priv->ctrlmode); } @@ -1167,9 +1167,7 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie, priv->dev->stats.rx_packets++; kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp); - netif_rx(skb); - - return 0; + return netif_rx(skb); } static void kvaser_pciefd_change_state(struct kvaser_pciefd_can *can, @@ -1582,28 +1580,24 @@ static int kvaser_pciefd_read_buffer(struct kvaser_pciefd *pcie, int dma_buf) return res; } -static void kvaser_pciefd_receive_irq(struct kvaser_pciefd *pcie) +static u32 kvaser_pciefd_receive_irq(struct kvaser_pciefd *pcie) { - void __iomem *srb_cmd_reg = KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG; u32 irq = ioread32(KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IRQ_REG); - iowrite32(irq, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IRQ_REG); - - if (irq & KVASER_PCIEFD_SRB_IRQ_DPD0) { + if (irq & KVASER_PCIEFD_SRB_IRQ_DPD0) kvaser_pciefd_read_buffer(pcie, 0); - iowrite32(KVASER_PCIEFD_SRB_CMD_RDB0, srb_cmd_reg); /* Rearm buffer */ - } - if (irq & KVASER_PCIEFD_SRB_IRQ_DPD1) { + if (irq & KVASER_PCIEFD_SRB_IRQ_DPD1) kvaser_pciefd_read_buffer(pcie, 1); - iowrite32(KVASER_PCIEFD_SRB_CMD_RDB1, srb_cmd_reg); /* Rearm buffer */ - } if (irq & KVASER_PCIEFD_SRB_IRQ_DOF0 || irq & KVASER_PCIEFD_SRB_IRQ_DOF1 || irq & KVASER_PCIEFD_SRB_IRQ_DUF0 || irq & KVASER_PCIEFD_SRB_IRQ_DUF1) dev_err(&pcie->pci->dev, "DMA IRQ error 0x%08X\n", irq); + + iowrite32(irq, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IRQ_REG); + return irq; } static void kvaser_pciefd_transmit_irq(struct kvaser_pciefd_can *can) @@ -1631,22 +1625,29 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev) struct kvaser_pciefd *pcie = (struct kvaser_pciefd *)dev; const struct kvaser_pciefd_irq_mask *irq_mask = pcie->driver_data->irq_mask; u32 pci_irq = ioread32(KVASER_PCIEFD_PCI_IRQ_ADDR(pcie)); + u32 srb_irq = 0; + u32 srb_release = 0; int i; if (!(pci_irq & irq_mask->all)) return IRQ_NONE; - iowrite32(0, KVASER_PCIEFD_PCI_IEN_ADDR(pcie)); - if (pci_irq & irq_mask->kcan_rx0) - kvaser_pciefd_receive_irq(pcie); + srb_irq = kvaser_pciefd_receive_irq(pcie); for (i = 0; i < pcie->nr_channels; i++) { if (pci_irq & irq_mask->kcan_tx[i]) kvaser_pciefd_transmit_irq(pcie->can[i]); } - iowrite32(irq_mask->all, KVASER_PCIEFD_PCI_IEN_ADDR(pcie)); + if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD0) + srb_release |= KVASER_PCIEFD_SRB_CMD_RDB0; + + if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD1) + srb_release |= KVASER_PCIEFD_SRB_CMD_RDB1; + + if (srb_release) + iowrite32(srb_release, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG); return IRQ_HANDLED; } @@ -1666,22 +1667,13 @@ static void kvaser_pciefd_teardown_can_ctrls(struct kvaser_pciefd *pcie) } } -static void kvaser_pciefd_disable_irq_srcs(struct kvaser_pciefd *pcie) -{ - unsigned int i; - - /* Masking PCI_IRQ is insufficient as running ISR will unmask it */ - iowrite32(0, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IEN_REG); - for (i = 0; i < pcie->nr_channels; ++i) - iowrite32(0, pcie->can[i]->reg_base + KVASER_PCIEFD_KCAN_IEN_REG); -} - static int kvaser_pciefd_probe(struct pci_dev *pdev, const struct pci_device_id *id) { int err; struct kvaser_pciefd *pcie; const struct kvaser_pciefd_irq_mask *irq_mask; + void __iomem *irq_en_base; pcie = devm_kzalloc(&pdev->dev, sizeof(*pcie), GFP_KERNEL); if (!pcie) @@ -1734,7 +1726,8 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IEN_REG); /* Enable PCI interrupts */ - iowrite32(irq_mask->all, KVASER_PCIEFD_PCI_IEN_ADDR(pcie)); + irq_en_base = KVASER_PCIEFD_PCI_IEN_ADDR(pcie); + iowrite32(irq_mask->all, irq_en_base); /* Ready the DMA buffers */ iowrite32(KVASER_PCIEFD_SRB_CMD_RDB0, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG); @@ -1748,7 +1741,8 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev, return 0; err_free_irq: - kvaser_pciefd_disable_irq_srcs(pcie); + /* Disable PCI interrupts */ + iowrite32(0, irq_en_base); free_irq(pcie->pci->irq, pcie); err_teardown_can_ctrls: @@ -1768,24 +1762,34 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev, return err; } -static void kvaser_pciefd_remove(struct pci_dev *pdev) +static void kvaser_pciefd_remove_all_ctrls(struct kvaser_pciefd *pcie) { - struct kvaser_pciefd *pcie = pci_get_drvdata(pdev); - unsigned int i; + int i; - for (i = 0; i < pcie->nr_channels; ++i) { + for (i = 0; i < pcie->nr_channels; i++) { struct kvaser_pciefd_can *can = pcie->can[i]; - unregister_candev(can->can.dev); - del_timer(&can->bec_poll_timer); - kvaser_pciefd_pwm_stop(can); + if (can) { + iowrite32(0, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG); + unregister_candev(can->can.dev); + del_timer(&can->bec_poll_timer); + kvaser_pciefd_pwm_stop(can); + free_candev(can->can.dev); + } } +} - kvaser_pciefd_disable_irq_srcs(pcie); - free_irq(pcie->pci->irq, pcie); +static void kvaser_pciefd_remove(struct pci_dev *pdev) +{ + struct kvaser_pciefd *pcie = pci_get_drvdata(pdev); + + kvaser_pciefd_remove_all_ctrls(pcie); - for (i = 0; i < pcie->nr_channels; ++i) - free_candev(pcie->can[i]->can.dev); + /* Disable interrupts */ + iowrite32(0, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CTRL_REG); + iowrite32(0, KVASER_PCIEFD_PCI_IEN_ADDR(pcie)); + + free_irq(pcie->pci->irq, pcie); pci_iounmap(pdev, pcie->reg_base); pci_release_regions(pdev); diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index e6a74d66f0d8ca2dca5c5929cafe2d4b99247d70..ba7f7de25c85295583fe70450b665b15f714cafd 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c @@ -606,7 +606,7 @@ static int m_can_handle_lost_msg(struct net_device *dev) struct can_frame *frame; u32 timestamp = 0; - netdev_dbg(dev, "msg lost in rxf0\n"); + netdev_err(dev, "msg lost in rxf0\n"); stats->rx_errors++; stats->rx_over_errors++; diff --git a/drivers/net/can/m_can/tcan4x5x-core.c b/drivers/net/can/m_can/tcan4x5x-core.c index 4d440ecfc211c1977d382f4057419913a641f8a9..ae8c42f5debd4dee37d60ee8224a2ce4572e76b4 100644 --- a/drivers/net/can/m_can/tcan4x5x-core.c +++ b/drivers/net/can/m_can/tcan4x5x-core.c @@ -385,11 +385,10 @@ static int tcan4x5x_can_probe(struct spi_device *spi) priv = cdev_to_priv(mcan_class); priv->power = devm_regulator_get_optional(&spi->dev, "vsup"); - if (IS_ERR(priv->power)) { - if (PTR_ERR(priv->power) == -EPROBE_DEFER) { - ret = -EPROBE_DEFER; - goto out_m_can_class_free_dev; - } + if (PTR_ERR(priv->power) == -EPROBE_DEFER) { + ret = -EPROBE_DEFER; + goto out_m_can_class_free_dev; + } else { priv->power = NULL; } diff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slcan-core.c index 58ff2ec1d9757e0ce55ce73b85e1884937a73d72..24c6622d36bd853c3ae422128ff391a0adfb695f 100644 --- a/drivers/net/can/slcan/slcan-core.c +++ b/drivers/net/can/slcan/slcan-core.c @@ -71,21 +71,12 @@ MODULE_AUTHOR("Dario Binacchi "); #define SLCAN_CMD_LEN 1 #define SLCAN_SFF_ID_LEN 3 #define SLCAN_EFF_ID_LEN 8 -#define SLCAN_DATA_LENGTH_LEN 1 -#define SLCAN_ERROR_LEN 1 #define SLCAN_STATE_LEN 1 #define SLCAN_STATE_BE_RXCNT_LEN 3 #define SLCAN_STATE_BE_TXCNT_LEN 3 -#define SLCAN_STATE_MSG_LEN (SLCAN_CMD_LEN + \ - SLCAN_STATE_LEN + \ - SLCAN_STATE_BE_RXCNT_LEN + \ - SLCAN_STATE_BE_TXCNT_LEN) -#define SLCAN_ERROR_MSG_LEN_MIN (SLCAN_CMD_LEN + \ - SLCAN_ERROR_LEN + \ - SLCAN_DATA_LENGTH_LEN) -#define SLCAN_FRAME_MSG_LEN_MIN (SLCAN_CMD_LEN + \ - SLCAN_SFF_ID_LEN + \ - SLCAN_DATA_LENGTH_LEN) +#define SLCAN_STATE_FRAME_LEN (1 + SLCAN_CMD_LEN + \ + SLCAN_STATE_BE_RXCNT_LEN + \ + SLCAN_STATE_BE_TXCNT_LEN) struct slcan { struct can_priv can; @@ -185,9 +176,6 @@ static void slcan_bump_frame(struct slcan *sl) u32 tmpid; char *cmd = sl->rbuff; - if (sl->rcount < SLCAN_FRAME_MSG_LEN_MIN) - return; - skb = alloc_can_skb(sl->dev, &cf); if (unlikely(!skb)) { sl->dev->stats.rx_dropped++; @@ -293,7 +281,7 @@ static void slcan_bump_state(struct slcan *sl) return; } - if (state == sl->can.state || sl->rcount != SLCAN_STATE_MSG_LEN) + if (state == sl->can.state || sl->rcount < SLCAN_STATE_FRAME_LEN) return; cmd += SLCAN_STATE_BE_RXCNT_LEN + SLCAN_CMD_LEN + 1; @@ -340,9 +328,6 @@ static void slcan_bump_err(struct slcan *sl) bool rx_errors = false, tx_errors = false, rx_over_errors = false; int i, len; - if (sl->rcount < SLCAN_ERROR_MSG_LEN_MIN) - return; - /* get len from sanitized ASCII value */ len = cmd[1]; if (len >= '0' && len < '9') @@ -471,7 +456,8 @@ static void slcan_bump(struct slcan *sl) static void slcan_unesc(struct slcan *sl, unsigned char s) { if ((s == '\r') || (s == '\a')) { /* CR or BEL ends the pdu */ - if (!test_and_clear_bit(SLF_ERROR, &sl->flags)) + if (!test_and_clear_bit(SLF_ERROR, &sl->flags) && + sl->rcount > 4) slcan_bump(sl); sl->rcount = 0; diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 004d2c988ff097cce2e120ab7c07b3bfc291de1b..d2ff2c2fcbbfc4e00bfae003a418e01eef85dd3d 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1237,7 +1237,24 @@ static void b53_adjust_63xx_rgmii(struct dsa_switch *ds, int port, off = B53_RGMII_CTRL_P(port); b53_read8(dev, B53_CTRL_PAGE, off, &rgmii_ctrl); - rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); + + switch (interface) { + case PHY_INTERFACE_MODE_RGMII_ID: + rgmii_ctrl |= (RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); + break; + case PHY_INTERFACE_MODE_RGMII_RXID: + rgmii_ctrl &= ~(RGMII_CTRL_DLL_TXC); + rgmii_ctrl |= RGMII_CTRL_DLL_RXC; + break; + case PHY_INTERFACE_MODE_RGMII_TXID: + rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC); + rgmii_ctrl |= RGMII_CTRL_DLL_TXC; + break; + case PHY_INTERFACE_MODE_RGMII: + default: + rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); + break; + } if (port != dev->imp_port) { if (is63268(dev)) @@ -1377,10 +1394,6 @@ static void b53_phylink_get_caps(struct dsa_switch *ds, int port, __set_bit(PHY_INTERFACE_MODE_MII, config->supported_interfaces); __set_bit(PHY_INTERFACE_MODE_REVMII, config->supported_interfaces); - /* BCM63xx RGMII ports support RGMII */ - if (is63xx(dev) && in_range(port, B53_63XX_RGMII0, 4)) - phy_interface_set_rgmii(config->supported_interfaces); - config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | MAC_10 | MAC_100; diff --git a/drivers/net/ethernet/amd/pds_core/core.c b/drivers/net/ethernet/amd/pds_core/core.c index c2ef55cff6b3ec8cfc32f1006ff9baa55a2eba9d..b3fa867c8ccd9188d58cc18a856fbb3f3e39f665 100644 --- a/drivers/net/ethernet/amd/pds_core/core.c +++ b/drivers/net/ethernet/amd/pds_core/core.c @@ -413,7 +413,10 @@ int pdsc_setup(struct pdsc *pdsc, bool init) if (err) return err; - numdescs = PDSC_ADMINQ_MAX_LENGTH; + /* Scale the descriptor ring length based on number of CPUs and VFs */ + numdescs = max_t(int, PDSC_ADMINQ_MIN_LENGTH, num_online_cpus()); + numdescs += 2 * pci_sriov_get_totalvfs(pdsc->pdev); + numdescs = roundup_pow_of_two(numdescs); err = pdsc_qcq_alloc(pdsc, PDS_CORE_QTYPE_ADMINQ, 0, "adminq", PDS_CORE_QCQ_F_CORE | PDS_CORE_QCQ_F_INTR, numdescs, diff --git a/drivers/net/ethernet/amd/pds_core/core.h b/drivers/net/ethernet/amd/pds_core/core.h index 42137140850314e41e9519795416f06df1bbf796..61ee607ee48ace9a80e3171149868998d5a79ce2 100644 --- a/drivers/net/ethernet/amd/pds_core/core.h +++ b/drivers/net/ethernet/amd/pds_core/core.h @@ -16,7 +16,7 @@ #define PDSC_WATCHDOG_SECS 5 #define PDSC_QUEUE_NAME_MAX_SZ 16 -#define PDSC_ADMINQ_MAX_LENGTH 16 /* must be a power of two */ +#define PDSC_ADMINQ_MIN_LENGTH 16 /* must be a power of two */ #define PDSC_NOTIFYQ_LENGTH 64 /* must be a power of two */ #define PDSC_TEARDOWN_RECOVERY false #define PDSC_TEARDOWN_REMOVING true diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h index aa25a8a0a106f64fb0ff4803244fdc835090741a..3b70f67376331ed2a42367919c2ac92534d62ae3 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h @@ -1373,8 +1373,6 @@ #define MDIO_VEND2_CTRL1_SS13 BIT(13) #endif -#define XGBE_VEND2_MAC_AUTO_SW BIT(9) - /* MDIO mask values */ #define XGBE_AN_CL73_INT_CMPLT BIT(0) #define XGBE_AN_CL73_INC_LINK BIT(1) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c index 8345d439184ebe8fbd28627f5806d0630b3ac0f0..4a2dc705b52801792652c3ba6a9c945b306c3198 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c @@ -375,10 +375,6 @@ static void xgbe_an37_set(struct xgbe_prv_data *pdata, bool enable, reg |= MDIO_VEND2_CTRL1_AN_RESTART; XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_CTRL1, reg); - - reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_PCS_DIG_CTRL); - reg |= XGBE_VEND2_MAC_AUTO_SW; - XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_PCS_DIG_CTRL, reg); } static void xgbe_an37_restart(struct xgbe_prv_data *pdata) @@ -1007,11 +1003,6 @@ static void xgbe_an37_init(struct xgbe_prv_data *pdata) netif_dbg(pdata, link, pdata->netdev, "CL37 AN (%s) initialized\n", (pdata->an_mode == XGBE_AN_MODE_CL37) ? "BaseX" : "SGMII"); - - reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_CTRL1); - reg &= ~MDIO_AN_CTRL1_ENABLE; - XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_CTRL1, reg); - } static void xgbe_an73_init(struct xgbe_prv_data *pdata) @@ -1413,10 +1404,6 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata) pdata->phy.link = pdata->phy_if.phy_impl.link_status(pdata, &an_restart); - /* bail out if the link status register read fails */ - if (pdata->phy.link < 0) - return; - if (an_restart) { xgbe_phy_config_aneg(pdata); goto adjust_link; diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c index 32e633d11348438a0f36997f573d3f86ae901e86..268399dfcf22f0313348327bfa806be11eebdb25 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c @@ -2855,7 +2855,8 @@ static bool xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed) static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart) { struct xgbe_phy_data *phy_data = pdata->phy_data; - int reg, ret; + unsigned int reg; + int ret; *an_restart = 0; @@ -2889,20 +2890,11 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart) return 0; } - reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1); - if (reg < 0) - return reg; - - /* Link status is latched low so that momentary link drops - * can be detected. If link was already down read again - * to get the latest state. + /* Link status is latched low, so read once to clear + * and then read again to get current state */ - - if (!pdata->phy.link && !(reg & MDIO_STAT1_LSTATUS)) { - reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1); - if (reg < 0) - return reg; - } + reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1); + reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1); if (pdata->en_rx_adap) { /* if the link is available and adaptation is done, @@ -2921,7 +2913,9 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart) xgbe_phy_set_mode(pdata, phy_data->cur_mode); } - if (pdata->rx_adapt_done) + /* check again for the link and adaptation status */ + reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1); + if ((reg & MDIO_STAT1_LSTATUS) && pdata->rx_adapt_done) return 1; } else if (reg & MDIO_STAT1_LSTATUS) return 1; diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index a596cd08124fa44e890df2789096ab808e608c1e..173f4dad470f556a642e3d62c48be41de55a4aab 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h @@ -292,12 +292,12 @@ #define XGBE_LINK_TIMEOUT 5 #define XGBE_KR_TRAINING_WAIT_ITER 50 -#define XGBE_SGMII_AN_LINK_DUPLEX BIT(1) +#define XGBE_SGMII_AN_LINK_STATUS BIT(1) #define XGBE_SGMII_AN_LINK_SPEED (BIT(2) | BIT(3)) #define XGBE_SGMII_AN_LINK_SPEED_10 0x00 #define XGBE_SGMII_AN_LINK_SPEED_100 0x04 #define XGBE_SGMII_AN_LINK_SPEED_1000 0x08 -#define XGBE_SGMII_AN_LINK_STATUS BIT(4) +#define XGBE_SGMII_AN_LINK_DUPLEX BIT(4) /* ECC correctable error notification window (seconds) */ #define XGBE_ECC_LIMIT 60 diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_main.c b/drivers/net/ethernet/aquantia/atlantic/aq_main.c index 75d436c90696895d06363fba3ff6a9f669037f49..0b2a52199914b718d6091b53a9494e3466cc5786 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_main.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.c @@ -123,6 +123,7 @@ static netdev_tx_t aq_ndev_start_xmit(struct sk_buff *skb, struct net_device *nd } #endif + skb_tx_timestamp(skb); return aq_nic_xmit(aq_nic, skb); } diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index 07392174f6437ebc1b33a0a4f1c0d072cbc9f9a6..c9b0d57696a4871c735fe5aa6bd8d68b20471304 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c @@ -898,8 +898,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb) frags = aq_nic_map_skb(self, skb, ring); - skb_tx_timestamp(skb); - if (likely(frags)) { err = self->aq_hw_ops->hw_ring_tx_xmit(self->aq_hw, ring, frags); diff --git a/drivers/net/ethernet/atheros/atlx/atl1.c b/drivers/net/ethernet/atheros/atlx/atl1.c index 4ed165702d58ebfc90f94ff2ae9b15f7ed2ffcba..02aa6fd8ebc2d47f5752eec49199b6cc41d6c1f1 100644 --- a/drivers/net/ethernet/atheros/atlx/atl1.c +++ b/drivers/net/ethernet/atheros/atlx/atl1.c @@ -1861,21 +1861,14 @@ static u16 atl1_alloc_rx_buffers(struct atl1_adapter *adapter) break; } + buffer_info->alloced = 1; + buffer_info->skb = skb; + buffer_info->length = (u16) adapter->rx_buffer_len; page = virt_to_page(skb->data); offset = offset_in_page(skb->data); buffer_info->dma = dma_map_page(&pdev->dev, page, offset, adapter->rx_buffer_len, DMA_FROM_DEVICE); - if (dma_mapping_error(&pdev->dev, buffer_info->dma)) { - kfree_skb(skb); - adapter->soft_stats.rx_dropped++; - break; - } - - buffer_info->alloced = 1; - buffer_info->skb = skb; - buffer_info->length = (u16)adapter->rx_buffer_len; - rfd_desc->buffer_addr = cpu_to_le64(buffer_info->dma); rfd_desc->buf_len = cpu_to_le16(adapter->rx_buffer_len); rfd_desc->coalese = 0; @@ -2190,8 +2183,8 @@ static int atl1_tx_csum(struct atl1_adapter *adapter, struct sk_buff *skb, return 0; } -static bool atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, - struct tx_packet_desc *ptpd) +static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, + struct tx_packet_desc *ptpd) { struct atl1_tpd_ring *tpd_ring = &adapter->tpd_ring; struct atl1_buffer *buffer_info; @@ -2201,7 +2194,6 @@ static bool atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, unsigned int nr_frags; unsigned int f; int retval; - u16 first_mapped; u16 next_to_use; u16 data_len; u8 hdr_len; @@ -2209,7 +2201,6 @@ static bool atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, buf_len -= skb->data_len; nr_frags = skb_shinfo(skb)->nr_frags; next_to_use = atomic_read(&tpd_ring->next_to_use); - first_mapped = next_to_use; buffer_info = &tpd_ring->buffer_info[next_to_use]; BUG_ON(buffer_info->skb); /* put skb in last TPD */ @@ -2225,8 +2216,6 @@ static bool atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, buffer_info->dma = dma_map_page(&adapter->pdev->dev, page, offset, hdr_len, DMA_TO_DEVICE); - if (dma_mapping_error(&adapter->pdev->dev, buffer_info->dma)) - goto dma_err; if (++next_to_use == tpd_ring->count) next_to_use = 0; @@ -2253,9 +2242,6 @@ static bool atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, page, offset, buffer_info->length, DMA_TO_DEVICE); - if (dma_mapping_error(&adapter->pdev->dev, - buffer_info->dma)) - goto dma_err; if (++next_to_use == tpd_ring->count) next_to_use = 0; } @@ -2268,8 +2254,6 @@ static bool atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, buffer_info->dma = dma_map_page(&adapter->pdev->dev, page, offset, buf_len, DMA_TO_DEVICE); - if (dma_mapping_error(&adapter->pdev->dev, buffer_info->dma)) - goto dma_err; if (++next_to_use == tpd_ring->count) next_to_use = 0; } @@ -2293,9 +2277,6 @@ static bool atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, buffer_info->dma = skb_frag_dma_map(&adapter->pdev->dev, frag, i * ATL1_MAX_TX_BUF_LEN, buffer_info->length, DMA_TO_DEVICE); - if (dma_mapping_error(&adapter->pdev->dev, - buffer_info->dma)) - goto dma_err; if (++next_to_use == tpd_ring->count) next_to_use = 0; @@ -2304,22 +2285,6 @@ static bool atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, /* last tpd's buffer-info */ buffer_info->skb = skb; - - return true; - - dma_err: - while (first_mapped != next_to_use) { - buffer_info = &tpd_ring->buffer_info[first_mapped]; - dma_unmap_page(&adapter->pdev->dev, - buffer_info->dma, - buffer_info->length, - DMA_TO_DEVICE); - buffer_info->dma = 0; - - if (++first_mapped == tpd_ring->count) - first_mapped = 0; - } - return false; } static void atl1_tx_queue(struct atl1_adapter *adapter, u16 count, @@ -2390,8 +2355,10 @@ static netdev_tx_t atl1_xmit_frame(struct sk_buff *skb, len = skb_headlen(skb); - if (unlikely(skb->len <= 0)) - goto drop_packet; + if (unlikely(skb->len <= 0)) { + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; + } nr_frags = skb_shinfo(skb)->nr_frags; for (f = 0; f < nr_frags; f++) { @@ -2404,9 +2371,10 @@ static netdev_tx_t atl1_xmit_frame(struct sk_buff *skb, if (mss) { if (skb->protocol == htons(ETH_P_IP)) { proto_hdr_len = skb_tcp_all_headers(skb); - if (unlikely(proto_hdr_len > len)) - goto drop_packet; - + if (unlikely(proto_hdr_len > len)) { + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; + } /* need additional TPD ? */ if (proto_hdr_len != len) count += (len - proto_hdr_len + @@ -2438,26 +2406,23 @@ static netdev_tx_t atl1_xmit_frame(struct sk_buff *skb, } tso = atl1_tso(adapter, skb, ptpd); - if (tso < 0) - goto drop_packet; + if (tso < 0) { + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; + } if (!tso) { ret_val = atl1_tx_csum(adapter, skb, ptpd); - if (ret_val < 0) - goto drop_packet; + if (ret_val < 0) { + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; + } } - if (!atl1_tx_map(adapter, skb, ptpd)) - goto drop_packet; - + atl1_tx_map(adapter, skb, ptpd); atl1_tx_queue(adapter, count, ptpd); atl1_update_mailbox(adapter); return NETDEV_TX_OK; - -drop_packet: - adapter->soft_stats.tx_errors++; - dev_kfree_skb_any(skb); - return NETDEV_TX_OK; } static int atl1_rings_clean(struct napi_struct *napi, int budget) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 8e4e8291d8c66f236e7058d067a3db978361a181..6bf4a21853858f04c6cd0880f8c79b97ae358c38 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -2491,7 +2491,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, { struct bnxt_napi *bnapi = cpr->bnapi; u32 raw_cons = cpr->cp_raw_cons; - bool flush_xdp = false; u32 cons; int tx_pkts = 0; int rx_pkts = 0; @@ -2529,8 +2528,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, else rc = bnxt_force_rx_discard(bp, cpr, &raw_cons, &event); - if (event & BNXT_REDIRECT_EVENT) - flush_xdp = true; if (likely(rc >= 0)) rx_pkts += rc; /* Increment rx_pkts when rc is -ENOMEM to count towards @@ -2558,10 +2555,8 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, } } - if (flush_xdp) { + if (event & BNXT_REDIRECT_EVENT) xdp_do_flush(); - event &= ~BNXT_REDIRECT_EVENT; - } if (event & BNXT_TX_EVENT) { struct bnxt_tx_ring_info *txr = bnapi->tx_ring; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c index 1727e9bb1479d579c60631dc3c2b486188d34f5a..63e0670383852af5b6ab4a7c28c9d25e0ea64a1b 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c @@ -487,9 +487,7 @@ static int bnxt_ets_validate(struct bnxt *bp, struct ieee_ets *ets, u8 *tc) if ((ets->tc_tx_bw[i] || ets->tc_tsa[i]) && i > bp->max_tc) return -EINVAL; - } - for (i = 0; i < max_tc; i++) { switch (ets->tc_tsa[i]) { case IEEE_8021QAZ_TSA_STRICT: break; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c index 07a458ecb7cc939c6debb0c86d38ff5499377188..758f51366ef0325dfd54b6a095f1536d3af0312a 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c @@ -115,7 +115,7 @@ static void __bnxt_xmit_xdp_redirect(struct bnxt *bp, tx_buf->action = XDP_REDIRECT; tx_buf->xdpf = xdpf; dma_unmap_addr_set(tx_buf, mapping, mapping); - dma_unmap_len_set(tx_buf, len, len); + dma_unmap_len_set(tx_buf, len, 0); } void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget) diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c index 534e7f7bca4c2fa113a8668d8ce25ed005c24c2d..6f45f4d9fba71f7c5f2ef3deb5a2f45eea21b205 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c @@ -5070,11 +5070,7 @@ static int macb_probe(struct platform_device *pdev) #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) { - err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44)); - if (err) { - dev_err(&pdev->dev, "failed to set DMA mask\n"); - goto err_out_free_netdev; - } + dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44)); bp->hw_dma_cap |= HW_DMA_CAP_64B; } #endif diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index 48701032c20c56ad805a86b768c4de7d543fd47a..cccf0db2fb4e5806671054e299a50960590e592a 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c @@ -2057,10 +2057,10 @@ static int enic_change_mtu(struct net_device *netdev, int new_mtu) if (enic_is_dynamic(enic) || enic_is_sriov_vf(enic)) return -EOPNOTSUPP; - if (new_mtu > enic->port_mtu) + if (netdev->mtu > enic->port_mtu) netdev_warn(netdev, "interface MTU (%d) set higher than port MTU (%d)\n", - new_mtu, enic->port_mtu); + netdev->mtu, enic->port_mtu); return _enic_change_mtu(netdev, new_mtu); } diff --git a/drivers/net/ethernet/cortina/gemini.c b/drivers/net/ethernet/cortina/gemini.c index fce2ff1e1d834842f0926d4b75808a6bc8fd4c71..5af98fba74803ee928ef6604888a056a01c928ca 100644 --- a/drivers/net/ethernet/cortina/gemini.c +++ b/drivers/net/ethernet/cortina/gemini.c @@ -1148,7 +1148,6 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb, struct gmac_txdesc *txd; skb_frag_t *skb_frag; dma_addr_t mapping; - bool tcp = false; void *buffer; u16 mss; int ret; @@ -1156,13 +1155,6 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb, word1 = skb->len; word3 = SOF_BIT; - /* Determine if we are doing TCP */ - if (skb->protocol == htons(ETH_P_IP)) - tcp = (ip_hdr(skb)->protocol == IPPROTO_TCP); - else - /* IPv6 */ - tcp = (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP); - mss = skb_shinfo(skb)->gso_size; if (mss) { /* This means we are dealing with TCP and skb->len is the @@ -1175,26 +1167,8 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb, mss, skb->len); word1 |= TSS_MTU_ENABLE_BIT; word3 |= mss; - } else if (tcp) { - /* Even if we are not using TSO, use the hardware offloader - * for transferring the TCP frame: this hardware has partial - * TCP awareness (called TOE - TCP Offload Engine) and will - * according to the datasheet put packets belonging to the - * same TCP connection in the same queue for the TOE/TSO - * engine to process. The engine will deal with chopping - * up frames that exceed ETH_DATA_LEN which the - * checksumming engine cannot handle (see below) into - * manageable chunks. It flawlessly deals with quite big - * frames and frames containing custom DSA EtherTypes. - */ - mss = netdev->mtu + skb_tcp_all_headers(skb); - mss = min(mss, skb->len); - netdev_dbg(netdev, "TOE/TSO len %04x mtu %04x mss %04x\n", - skb->len, netdev->mtu, mss); - word1 |= TSS_MTU_ENABLE_BIT; - word3 |= mss; } else if (skb->len >= ETH_FRAME_LEN) { - /* Hardware offloaded checksumming isn't working on non-TCP frames + /* Hardware offloaded checksumming isn't working on frames * bigger than 1514 bytes. A hypothesis about this is that the * checksum buffer is only 1518 bytes, so when the frames get * bigger they get truncated, or the last few bytes get @@ -1211,16 +1185,21 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb, } if (skb->ip_summed == CHECKSUM_PARTIAL) { + int tcp = 0; + /* We do not switch off the checksumming on non TCP/UDP * frames: as is shown from tests, the checksumming engine * is smart enough to see that a frame is not actually TCP * or UDP and then just pass it through without any changes * to the frame. */ - if (skb->protocol == htons(ETH_P_IP)) + if (skb->protocol == htons(ETH_P_IP)) { word1 |= TSS_IP_CHKSUM_BIT; - else + tcp = ip_hdr(skb)->protocol == IPPROTO_TCP; + } else { /* IPv6 */ word1 |= TSS_IPV6_ENABLE_BIT; + tcp = ipv6_hdr(skb)->nexthdr == IPPROTO_TCP; + } word1 |= tcp ? TSS_TCP_CHKSUM_BIT : TSS_UDP_CHKSUM_BIT; } diff --git a/drivers/net/ethernet/dlink/dl2k.c b/drivers/net/ethernet/dlink/dl2k.c index fad5a72d3b1671632a1ec33847d83e2a328b677c..ce46f3ac3b5a1839ace30ba95b108a3083b30754 100644 --- a/drivers/net/ethernet/dlink/dl2k.c +++ b/drivers/net/ethernet/dlink/dl2k.c @@ -146,8 +146,6 @@ rio_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent) np->ioaddr = ioaddr; np->chip_id = chip_idx; np->pdev = pdev; - - spin_lock_init(&np->stats_lock); spin_lock_init (&np->tx_lock); spin_lock_init (&np->rx_lock); @@ -868,6 +866,7 @@ tx_error (struct net_device *dev, int tx_status) frame_id = (tx_status & 0xffff0000); printk (KERN_ERR "%s: Transmit error, TxStatus %4.4x, FrameId %d.\n", dev->name, tx_status, frame_id); + dev->stats.tx_errors++; /* Ttransmit Underrun */ if (tx_status & 0x10) { dev->stats.tx_fifo_errors++; @@ -904,15 +903,9 @@ tx_error (struct net_device *dev, int tx_status) rio_set_led_mode(dev); /* Let TxStartThresh stay default value */ } - - spin_lock(&np->stats_lock); /* Maximum Collisions */ if (tx_status & 0x08) dev->stats.collisions++; - - dev->stats.tx_errors++; - spin_unlock(&np->stats_lock); - /* Restart the Tx */ dw32(MACCtrl, dr16(MACCtrl) | TxEnable); } @@ -1081,9 +1074,7 @@ get_stats (struct net_device *dev) int i; #endif unsigned int stat_reg; - unsigned long flags; - spin_lock_irqsave(&np->stats_lock, flags); /* All statistics registers need to be acknowledged, else statistic overflow could cause problems */ @@ -1133,9 +1124,6 @@ get_stats (struct net_device *dev) dr16(TCPCheckSumErrors); dr16(UDPCheckSumErrors); dr16(IPCheckSumErrors); - - spin_unlock_irqrestore(&np->stats_lock, flags); - return &dev->stats; } diff --git a/drivers/net/ethernet/dlink/dl2k.h b/drivers/net/ethernet/dlink/dl2k.h index 56aff2f0bdbfa0c660ebc79934c13b029dddd92b..0e33e2eaae96062baf34e779c10bde2ac4a84f94 100644 --- a/drivers/net/ethernet/dlink/dl2k.h +++ b/drivers/net/ethernet/dlink/dl2k.h @@ -372,8 +372,6 @@ struct netdev_private { struct pci_dev *pdev; void __iomem *ioaddr; void __iomem *eeprom_addr; - // To ensure synchronization when stats are updated. - spinlock_t stats_lock; spinlock_t tx_lock; spinlock_t rx_lock; unsigned int rx_buf_sz; /* Based on MTU+slack. */ diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index a89aa4ac0a064a0599f4f465cc8bd9e5a176e74d..51b8377edd1d04250d879fe78d9afd2774acc6f4 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c @@ -1609,7 +1609,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd) /* version 1 of the cmd is not supported only by BE2 */ if (BE2_chip(adapter)) hdr->version = 0; - else if (BE3_chip(adapter) || lancer_chip(adapter)) + if (BE3_chip(adapter) || lancer_chip(adapter)) hdr->version = 1; else hdr->version = 2; diff --git a/drivers/net/ethernet/faraday/Kconfig b/drivers/net/ethernet/faraday/Kconfig index 474073c7f94d74e8fb7f6d3c6e69085baa13af4c..c699bd6bcbb9380d42791e2316fc59881ed04587 100644 --- a/drivers/net/ethernet/faraday/Kconfig +++ b/drivers/net/ethernet/faraday/Kconfig @@ -31,7 +31,6 @@ config FTGMAC100 depends on ARM || COMPILE_TEST depends on !64BIT || BROKEN select PHYLIB - select FIXED_PHY select MDIO_ASPEED if MACH_ASPEED_G6 select CRC32 help diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c index 81a99f4824d054bd2c7276fb1210d778b5a1328c..40e8818295951988e24eaceca78e6fa8116c793a 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c @@ -3928,7 +3928,6 @@ static int dpaa2_eth_setup_rx_flow(struct dpaa2_eth_priv *priv, MEM_TYPE_PAGE_ORDER0, NULL); if (err) { dev_err(dev, "xdp_rxq_info_reg_mem_model failed\n"); - xdp_rxq_info_unreg(&fq->channel->xdp_rxq); return err; } @@ -4422,25 +4421,17 @@ static int dpaa2_eth_bind_dpni(struct dpaa2_eth_priv *priv) return -EINVAL; } if (err) - goto out; + return err; } err = dpni_get_qdid(priv->mc_io, 0, priv->mc_token, DPNI_QUEUE_TX, &priv->tx_qdid); if (err) { dev_err(dev, "dpni_get_qdid() failed\n"); - goto out; + return err; } return 0; - -out: - while (i--) { - if (priv->fq[i].type == DPAA2_RX_FQ && - xdp_rxq_info_is_reg(&priv->fq[i].channel->xdp_rxq)) - xdp_rxq_info_unreg(&priv->fq[i].channel->xdp_rxq); - } - return err; } /* Allocate rings for storing incoming frame descriptors */ @@ -4654,19 +4645,12 @@ static int dpaa2_eth_connect_mac(struct dpaa2_eth_priv *priv) return PTR_ERR(dpmac_dev); } - if (IS_ERR(dpmac_dev)) + if (IS_ERR(dpmac_dev) || dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type) return 0; - if (dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type) { - err = 0; - goto out_put_device; - } - mac = kzalloc(sizeof(struct dpaa2_mac), GFP_KERNEL); - if (!mac) { - err = -ENOMEM; - goto out_put_device; - } + if (!mac) + return -ENOMEM; mac->mc_dev = dpmac_dev; mac->mc_io = priv->mc_io; @@ -4700,8 +4684,6 @@ static int dpaa2_eth_connect_mac(struct dpaa2_eth_priv *priv) dpaa2_mac_close(mac); err_free_mac: kfree(mac); -out_put_device: - put_device(&dpmac_dev->dev); return err; } @@ -4831,17 +4813,6 @@ static void dpaa2_eth_del_ch_napi(struct dpaa2_eth_priv *priv) } } -static void dpaa2_eth_free_rx_xdp_rxq(struct dpaa2_eth_priv *priv) -{ - int i; - - for (i = 0; i < priv->num_fqs; i++) { - if (priv->fq[i].type == DPAA2_RX_FQ && - xdp_rxq_info_is_reg(&priv->fq[i].channel->xdp_rxq)) - xdp_rxq_info_unreg(&priv->fq[i].channel->xdp_rxq); - } -} - static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev) { struct device *dev; @@ -5045,7 +5016,6 @@ static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev) free_percpu(priv->percpu_stats); err_alloc_percpu_stats: dpaa2_eth_del_ch_napi(priv); - dpaa2_eth_free_rx_xdp_rxq(priv); err_bind: dpaa2_eth_free_dpbps(priv); err_dpbp_setup: @@ -5098,7 +5068,6 @@ static void dpaa2_eth_remove(struct fsl_mc_device *ls_dev) free_percpu(priv->percpu_extras); dpaa2_eth_del_ch_napi(priv); - dpaa2_eth_free_rx_xdp_rxq(priv); dpaa2_eth_free_dpbps(priv); dpaa2_eth_free_dpio(priv); dpaa2_eth_free_dpni(priv); diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c index 76795bb0b564b76d9c12b1c644aea77d4be85997..a05a8525caa459efbecdc1760cfd0a74bca9e81b 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c @@ -1447,19 +1447,12 @@ static int dpaa2_switch_port_connect_mac(struct ethsw_port_priv *port_priv) if (PTR_ERR(dpmac_dev) == -EPROBE_DEFER) return PTR_ERR(dpmac_dev); - if (IS_ERR(dpmac_dev)) + if (IS_ERR(dpmac_dev) || dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type) return 0; - if (dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type) { - err = 0; - goto out_put_device; - } - mac = kzalloc(sizeof(*mac), GFP_KERNEL); - if (!mac) { - err = -ENOMEM; - goto out_put_device; - } + if (!mac) + return -ENOMEM; mac->mc_dev = dpmac_dev; mac->mc_io = port_priv->ethsw_data->mc_io; @@ -1489,8 +1482,6 @@ static int dpaa2_switch_port_connect_mac(struct ethsw_port_priv *port_priv) dpaa2_mac_close(mac); err_free_mac: kfree(mac); -out_put_device: - put_device(&dpmac_dev->dev); return err; } diff --git a/drivers/net/ethernet/freescale/enetc/enetc_hw.h b/drivers/net/ethernet/freescale/enetc/enetc_hw.h index 4e8881b479e487e0651cba78a3310c40617bbe74..1619943fb2637aa2248375230181a4334e28f2f9 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc_hw.h +++ b/drivers/net/ethernet/freescale/enetc/enetc_hw.h @@ -485,7 +485,7 @@ static inline u64 _enetc_rd_reg64(void __iomem *reg) tmp = ioread32(reg + 4); } while (high != tmp); - return (u64)high << 32 | low; + return le64_to_cpu((__le64)high << 32 | low); } #endif diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 291c88a76a27f4cae529c77f79d8572ce34ce455..7261838a09db6302bcfc7d821c52f58a830a941a 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1079,29 +1079,6 @@ static void fec_enet_enable_ring(struct net_device *ndev) } } -/* Whack a reset. We should wait for this. - * For i.MX6SX SOC, enet use AXI bus, we use disable MAC - * instead of reset MAC itself. - */ -static void fec_ctrl_reset(struct fec_enet_private *fep, bool allow_wol) -{ - u32 val; - - if (!allow_wol || !(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) { - if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES || - ((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) { - writel(0, fep->hwp + FEC_ECNTRL); - } else { - writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL); - udelay(10); - } - } else { - val = readl(fep->hwp + FEC_ECNTRL); - val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP); - writel(val, fep->hwp + FEC_ECNTRL); - } -} - /* * This function is called to start or restart the FEC during a link * change, transmit timeout, or to reconfigure the FEC. The network @@ -1118,7 +1095,17 @@ fec_restart(struct net_device *ndev) if (fep->bufdesc_ex) fec_ptp_save_state(fep); - fec_ctrl_reset(fep, false); + /* Whack a reset. We should wait for this. + * For i.MX6SX SOC, enet use AXI bus, we use disable MAC + * instead of reset MAC itself. + */ + if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES || + ((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) { + writel(0, fep->hwp + FEC_ECNTRL); + } else { + writel(1, fep->hwp + FEC_ECNTRL); + udelay(10); + } /* * enet-mac reset will reset mac address registers too, @@ -1372,7 +1359,22 @@ fec_stop(struct net_device *ndev) if (fep->bufdesc_ex) fec_ptp_save_state(fep); - fec_ctrl_reset(fep, true); + /* Whack a reset. We should wait for this. + * For i.MX6SX SOC, enet use AXI bus, we use disable MAC + * instead of reset MAC itself. + */ + if (!(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) { + if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES) { + writel(0, fep->hwp + FEC_ECNTRL); + } else { + writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL); + udelay(10); + } + } else { + val = readl(fep->hwp + FEC_ECNTRL); + val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP); + writel(val, fep->hwp + FEC_ECNTRL); + } writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK); diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c index ec189f0703f99e682913b0cf62b89c312a0e95fd..8cd098fe88ef263fd52c3b151823896a31e7f417 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -1801,56 +1801,49 @@ static void gve_turnup(struct gve_priv *priv) gve_set_napi_enabled(priv); } -static struct gve_notify_block *gve_get_tx_notify_block(struct gve_priv *priv, - unsigned int txqueue) +static void gve_tx_timeout(struct net_device *dev, unsigned int txqueue) { + struct gve_notify_block *block; + struct gve_tx_ring *tx = NULL; + struct gve_priv *priv; + u32 last_nic_done; + u32 current_time; u32 ntfy_idx; + netdev_info(dev, "Timeout on tx queue, %d", txqueue); + priv = netdev_priv(dev); if (txqueue > priv->tx_cfg.num_queues) - return NULL; + goto reset; ntfy_idx = gve_tx_idx_to_ntfy(priv, txqueue); if (ntfy_idx >= priv->num_ntfy_blks) - return NULL; - - return &priv->ntfy_blocks[ntfy_idx]; -} - -static bool gve_tx_timeout_try_q_kick(struct gve_priv *priv, - unsigned int txqueue) -{ - struct gve_notify_block *block; - u32 current_time; - - block = gve_get_tx_notify_block(priv, txqueue); + goto reset; - if (!block) - return false; + block = &priv->ntfy_blocks[ntfy_idx]; + tx = block->tx; current_time = jiffies_to_msecs(jiffies); - if (block->tx->last_kick_msec + MIN_TX_TIMEOUT_GAP > current_time) - return false; - - netdev_info(priv->dev, "Kicking queue %d", txqueue); - napi_schedule(&block->napi); - block->tx->last_kick_msec = current_time; - return true; -} - -static void gve_tx_timeout(struct net_device *dev, unsigned int txqueue) -{ - struct gve_notify_block *block; - struct gve_priv *priv; + if (tx->last_kick_msec + MIN_TX_TIMEOUT_GAP > current_time) + goto reset; - netdev_info(dev, "Timeout on tx queue, %d", txqueue); - priv = netdev_priv(dev); + /* Check to see if there are missed completions, which will allow us to + * kick the queue. + */ + last_nic_done = gve_tx_load_event_counter(priv, tx); + if (last_nic_done - tx->done) { + netdev_info(dev, "Kicking queue %d", txqueue); + iowrite32be(GVE_IRQ_MASK, gve_irq_doorbell(priv, block)); + napi_schedule(&block->napi); + tx->last_kick_msec = current_time; + goto out; + } // Else reset. - if (!gve_tx_timeout_try_q_kick(priv, txqueue)) - gve_schedule_reset(priv); +reset: + gve_schedule_reset(priv); - block = gve_get_tx_notify_block(priv, txqueue); - if (block) - block->tx->queue_timeout++; +out: + if (tx) + tx->queue_timeout++; priv->tx_timeo_cnt++; } @@ -1999,7 +1992,7 @@ void gve_handle_report_stats(struct gve_priv *priv) }; stats[stats_idx++] = (struct stats) { .stat_name = cpu_to_be32(RX_BUFFERS_POSTED), - .value = cpu_to_be64(priv->rx[idx].fill_cnt), + .value = cpu_to_be64(priv->rx[0].fill_cnt), .queue_id = cpu_to_be32(idx), }; } diff --git a/drivers/net/ethernet/google/gve/gve_tx_dqo.c b/drivers/net/ethernet/google/gve/gve_tx_dqo.c index 857749fef37cf2c9e341d72125cd2b51fab61c3e..89b62b8d16e14b31c0ca33afe9f83ea591b6f654 100644 --- a/drivers/net/ethernet/google/gve/gve_tx_dqo.c +++ b/drivers/net/ethernet/google/gve/gve_tx_dqo.c @@ -716,9 +716,6 @@ static int gve_tx_add_skb_dqo(struct gve_tx_ring *tx, s16 completion_tag; pkt = gve_alloc_pending_packet(tx); - if (!pkt) - return -ENOMEM; - pkt->skb = skb; completion_tag = pkt - tx->dqo.pending_packets; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index dbf44a17987eb4338ca5c0e7f23223db9b85e7ea..0ed01f4d680618933a0766d25fdce4525ea44e94 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -1040,8 +1039,6 @@ static bool hns3_can_use_tx_sgl(struct hns3_enet_ring *ring, static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring) { u32 alloc_size = ring->tqp->handle->kinfo.tx_spare_buf_size; - struct net_device *netdev = ring_to_netdev(ring); - struct hns3_nic_priv *priv = netdev_priv(netdev); struct hns3_tx_spare *tx_spare; struct page *page; dma_addr_t dma; @@ -1083,7 +1080,6 @@ static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring) tx_spare->buf = page_address(page); tx_spare->len = PAGE_SIZE << order; ring->tx_spare = tx_spare; - ring->tx_copybreak = priv->tx_copybreak; return; dma_mapping_error: @@ -4883,30 +4879,6 @@ static void hns3_nic_dealloc_vector_data(struct hns3_nic_priv *priv) devm_kfree(&pdev->dev, priv->tqp_vector); } -static void hns3_update_tx_spare_buf_config(struct hns3_nic_priv *priv) -{ -#define HNS3_MIN_SPARE_BUF_SIZE (2 * 1024 * 1024) -#define HNS3_MAX_PACKET_SIZE (64 * 1024) - - struct iommu_domain *domain = iommu_get_domain_for_dev(priv->dev); - struct hnae3_ae_dev *ae_dev = hns3_get_ae_dev(priv->ae_handle); - struct hnae3_handle *handle = priv->ae_handle; - - if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V3) - return; - - if (!(domain && iommu_is_dma_domain(domain))) - return; - - priv->min_tx_copybreak = HNS3_MAX_PACKET_SIZE; - priv->min_tx_spare_buf_size = HNS3_MIN_SPARE_BUF_SIZE; - - if (priv->tx_copybreak < priv->min_tx_copybreak) - priv->tx_copybreak = priv->min_tx_copybreak; - if (handle->kinfo.tx_spare_buf_size < priv->min_tx_spare_buf_size) - handle->kinfo.tx_spare_buf_size = priv->min_tx_spare_buf_size; -} - static void hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv, unsigned int ring_type) { @@ -5141,7 +5113,6 @@ int hns3_init_all_ring(struct hns3_nic_priv *priv) int i, j; int ret; - hns3_update_tx_spare_buf_config(priv); for (i = 0; i < ring_num; i++) { ret = hns3_alloc_ring_memory(&priv->ring[i]); if (ret) { @@ -5346,8 +5317,6 @@ static int hns3_client_init(struct hnae3_handle *handle) priv->ae_handle = handle; priv->tx_timeout_count = 0; priv->max_non_tso_bd_num = ae_dev->dev_specs.max_non_tso_bd_num; - priv->min_tx_copybreak = 0; - priv->min_tx_spare_buf_size = 0; set_bit(HNS3_NIC_STATE_DOWN, &priv->state); handle->msg_enable = netif_msg_init(debug, DEFAULT_MSG_LEVEL); diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h index caf7a4df8585275c8ae47b5f78d613bf26d5a425..d36c4ed16d8dd25251df92377f91a24cf3961e01 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h @@ -596,8 +596,6 @@ struct hns3_nic_priv { struct hns3_enet_coalesce rx_coal; u32 tx_copybreak; u32 rx_copybreak; - u32 min_tx_copybreak; - u32 min_tx_spare_buf_size; }; union l3_hdr_info { diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 789f72d1067f8a7d06570eac5b57e16ed6548d28..4d318af748a0b7d2d0a90edf581ddd3ff7f8833c 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -9493,36 +9493,33 @@ static bool hclge_need_enable_vport_vlan_filter(struct hclge_vport *vport) return false; } -static int __hclge_enable_vport_vlan_filter(struct hclge_vport *vport, - bool request_en) +int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en) { + struct hclge_dev *hdev = vport->back; bool need_en; int ret; + mutex_lock(&hdev->vport_lock); + + vport->req_vlan_fltr_en = request_en; + need_en = hclge_need_enable_vport_vlan_filter(vport); - if (need_en == vport->cur_vlan_fltr_en) + if (need_en == vport->cur_vlan_fltr_en) { + mutex_unlock(&hdev->vport_lock); return 0; + } ret = hclge_set_vport_vlan_filter(vport, need_en); - if (ret) + if (ret) { + mutex_unlock(&hdev->vport_lock); return ret; + } vport->cur_vlan_fltr_en = need_en; - return 0; -} - -int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en) -{ - struct hclge_dev *hdev = vport->back; - int ret; - - mutex_lock(&hdev->vport_lock); - vport->req_vlan_fltr_en = request_en; - ret = __hclge_enable_vport_vlan_filter(vport, request_en); mutex_unlock(&hdev->vport_lock); - return ret; + return 0; } static int hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable) @@ -10543,19 +10540,16 @@ static void hclge_sync_vlan_fltr_state(struct hclge_dev *hdev) &vport->state)) continue; - mutex_lock(&hdev->vport_lock); - ret = __hclge_enable_vport_vlan_filter(vport, - vport->req_vlan_fltr_en); + ret = hclge_enable_vport_vlan_filter(vport, + vport->req_vlan_fltr_en); if (ret) { dev_err(&hdev->pdev->dev, "failed to sync vlan filter state for vport%u, ret = %d\n", vport->vport_id, ret); set_bit(HCLGE_VPORT_STATE_VLAN_FLTR_CHANGE, &vport->state); - mutex_unlock(&hdev->vport_lock); return; } - mutex_unlock(&hdev->vport_lock); } } diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c index c1e88e67ebb657b54819d81f032bfa2b89a420e9..9a806ac727cf5bebc17a553417cf582e782e34da 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c @@ -497,14 +497,14 @@ int hclge_ptp_init(struct hclge_dev *hdev) if (ret) { dev_err(&hdev->pdev->dev, "failed to init freq, ret = %d\n", ret); - goto out_clear_int; + goto out; } ret = hclge_ptp_set_ts_mode(hdev, &hdev->ptp->ts_cfg); if (ret) { dev_err(&hdev->pdev->dev, "failed to init ts mode, ret = %d\n", ret); - goto out_clear_int; + goto out; } ktime_get_real_ts64(&ts); @@ -512,7 +512,7 @@ int hclge_ptp_init(struct hclge_dev *hdev) if (ret) { dev_err(&hdev->pdev->dev, "failed to init ts time, ret = %d\n", ret); - goto out_clear_int; + goto out; } set_bit(HCLGE_STATE_PTP_EN, &hdev->state); @@ -520,9 +520,6 @@ int hclge_ptp_init(struct hclge_dev *hdev) return 0; -out_clear_int: - clear_bit(HCLGE_PTP_FLAG_EN, &hdev->ptp->flags); - hclge_ptp_int_en(hdev, false); out: hclge_ptp_destroy_clock(hdev); diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c index 68a9aeeed3da06499c5f99fa8766dc0639276604..1ba0b57c7a72d77a7f11fcbe517fea31408f6d44 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c @@ -3029,7 +3029,11 @@ static void hclgevf_uninit_ae_dev(struct hnae3_ae_dev *ae_dev) static u32 hclgevf_get_max_channels(struct hclgevf_dev *hdev) { - return min(hdev->rss_size_max, hdev->num_tqps); + struct hnae3_handle *nic = &hdev->nic; + struct hnae3_knic_private_info *kinfo = &nic->kinfo; + + return min_t(u32, hdev->rss_size_max, + hdev->num_tqps / kinfo->tc_info.num_tc); } /** diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h index dfbda2e5ec88aa55b0d65150b25fdaeed1527109..b3fc18db4f4c394b667addf4013ae63fdc5f7955 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.h +++ b/drivers/net/ethernet/ibm/ibmvnic.h @@ -211,6 +211,7 @@ struct ibmvnic_statistics { u8 reserved[72]; } __packed __aligned(8); +#define NUM_TX_STATS 3 struct ibmvnic_tx_queue_stats { u64 batched_packets; u64 direct_packets; @@ -218,18 +219,13 @@ struct ibmvnic_tx_queue_stats { u64 dropped_packets; }; -#define NUM_TX_STATS \ - (sizeof(struct ibmvnic_tx_queue_stats) / sizeof(u64)) - +#define NUM_RX_STATS 3 struct ibmvnic_rx_queue_stats { u64 packets; u64 bytes; u64 interrupts; }; -#define NUM_RX_STATS \ - (sizeof(struct ibmvnic_rx_queue_stats) / sizeof(u64)) - struct ibmvnic_acl_buffer { __be32 len; __be32 version; diff --git a/drivers/net/ethernet/intel/e1000e/defines.h b/drivers/net/ethernet/intel/e1000e/defines.h index 955bb11618572807ede5535e6582377fe14f2eb8..0a35d36c2c8571641e0fabe523b3d13ce8565785 100644 --- a/drivers/net/ethernet/intel/e1000e/defines.h +++ b/drivers/net/ethernet/intel/e1000e/defines.h @@ -638,9 +638,6 @@ /* For checksumming, the sum of all words in the NVM should equal 0xBABA. */ #define NVM_SUM 0xBABA -/* Uninitialized ("empty") checksum word value */ -#define NVM_CHECKSUM_UNINITIALIZED 0xFFFF - /* PBA (printed board assembly) number words */ #define NVM_PBA_OFFSET_0 8 #define NVM_PBA_OFFSET_1 9 diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c index df4e7d781cb1cb86b878ff345b000c384bb74b33..364378133526a17ea5fb18538ccc315545d7fff7 100644 --- a/drivers/net/ethernet/intel/e1000e/ich8lan.c +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c @@ -4274,8 +4274,6 @@ static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw) ret_val = e1000e_update_nvm_checksum(hw); if (ret_val) return ret_val; - } else if (hw->mac.type == e1000_pch_tgp) { - return 0; } } diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 7e4fea0e186b6ec9d2b0edcae1fc3cf8b159392b..721c098f2bb1b24796be74a94f0d0f1674e3ea2b 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -3540,6 +3540,9 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca) case e1000_pch_cnp: case e1000_pch_tgp: case e1000_pch_adp: + case e1000_pch_mtp: + case e1000_pch_lnp: + case e1000_pch_ptp: case e1000_pch_nvp: if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) { /* Stable 24MHz frequency */ @@ -3555,17 +3558,6 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca) adapter->cc.shift = shift; } break; - case e1000_pch_mtp: - case e1000_pch_lnp: - case e1000_pch_ptp: - /* System firmware can misreport this value, so set it to a - * stable 38400KHz frequency. - */ - incperiod = INCPERIOD_38400KHZ; - incvalue = INCVALUE_38400KHZ; - shift = INCVALUE_SHIFT_38400KHZ; - adapter->cc.shift = shift; - break; case e1000_82574: case e1000_82583: /* Stable 25MHz frequency */ diff --git a/drivers/net/ethernet/intel/e1000e/nvm.c b/drivers/net/ethernet/intel/e1000e/nvm.c index 16369e6d245a4a40b454eedc27e9ecc7e45fc839..e609f4df86f4554f560a8585b943ba7749067672 100644 --- a/drivers/net/ethernet/intel/e1000e/nvm.c +++ b/drivers/net/ethernet/intel/e1000e/nvm.c @@ -558,12 +558,6 @@ s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw) checksum += nvm_data; } - if (hw->mac.type == e1000_pch_tgp && - nvm_data == NVM_CHECKSUM_UNINITIALIZED) { - e_dbg("Uninitialized NVM Checksum on TGP platform - ignoring\n"); - return 0; - } - if (checksum != (u16)NVM_SUM) { e_dbg("NVM Checksum Invalid\n"); return -E1000_ERR_NVM; diff --git a/drivers/net/ethernet/intel/e1000e/ptp.c b/drivers/net/ethernet/intel/e1000e/ptp.c index d039dea48ca324f470243879a7d0efb1ee43d835..bbcfd529399b0fa938037858b1e2f7912f8e5a58 100644 --- a/drivers/net/ethernet/intel/e1000e/ptp.c +++ b/drivers/net/ethernet/intel/e1000e/ptp.c @@ -294,17 +294,15 @@ void e1000e_ptp_init(struct e1000_adapter *adapter) case e1000_pch_cnp: case e1000_pch_tgp: case e1000_pch_adp: + case e1000_pch_mtp: + case e1000_pch_lnp: + case e1000_pch_ptp: case e1000_pch_nvp: if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) adapter->ptp_clock_info.max_adj = MAX_PPB_24MHZ; else adapter->ptp_clock_info.max_adj = MAX_PPB_38400KHZ; break; - case e1000_pch_mtp: - case e1000_pch_lnp: - case e1000_pch_ptp: - adapter->ptp_clock_info.max_adj = MAX_PPB_38400KHZ; - break; case e1000_82574: case e1000_82583: adapter->ptp_clock_info.max_adj = MAX_PPB_25MHZ; diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c index 5d46a8e5376dacfeefcb1bc0195b8bb6db8b5e52..4d7caa11997199a835f8fc4c24a23bde8c210862 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_common.c +++ b/drivers/net/ethernet/intel/i40e/i40e_common.c @@ -1067,11 +1067,10 @@ int i40e_pf_reset(struct i40e_hw *hw) void i40e_clear_hw(struct i40e_hw *hw) { u32 num_queues, base_queue; - s32 num_pf_int; - s32 num_vf_int; + u32 num_pf_int; + u32 num_vf_int; u32 num_vfs; - s32 i; - u32 j; + u32 i, j; u32 val; u32 eol = 0x7ff; diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c index a89f7ca510fdb8e720a27fbb4abd6dde2ae41fef..4e90570ba7803aaec60f704f8693158bfe716e63 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c @@ -246,7 +246,6 @@ static const struct i40e_stats i40e_gstrings_net_stats[] = { I40E_NETDEV_STAT(rx_errors), I40E_NETDEV_STAT(tx_errors), I40E_NETDEV_STAT(rx_dropped), - I40E_NETDEV_STAT(rx_missed_errors), I40E_NETDEV_STAT(tx_dropped), I40E_NETDEV_STAT(collisions), I40E_NETDEV_STAT(rx_length_errors), @@ -323,7 +322,7 @@ static const struct i40e_stats i40e_gstrings_stats[] = { I40E_PF_STAT("port.rx_broadcast", stats.eth.rx_broadcast), I40E_PF_STAT("port.tx_broadcast", stats.eth.tx_broadcast), I40E_PF_STAT("port.tx_errors", stats.eth.tx_errors), - I40E_PF_STAT("port.rx_discards", stats.eth.rx_discards), + I40E_PF_STAT("port.rx_dropped", stats.eth.rx_discards), I40E_PF_STAT("port.tx_dropped_link_down", stats.tx_dropped_link_down), I40E_PF_STAT("port.rx_crc_errors", stats.crc_errors), I40E_PF_STAT("port.illegal_bytes", stats.illegal_bytes), diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index b749aa3e783ffea6c21138f6a4469fa61f4bf589..806cec458a0726e1ae88beb6e4c1e2c1096ea5fb 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -509,7 +509,6 @@ static void i40e_get_netdev_stats_struct(struct net_device *netdev, stats->tx_dropped = vsi_stats->tx_dropped; stats->rx_errors = vsi_stats->rx_errors; stats->rx_dropped = vsi_stats->rx_dropped; - stats->rx_missed_errors = vsi_stats->rx_missed_errors; stats->rx_crc_errors = vsi_stats->rx_crc_errors; stats->rx_length_errors = vsi_stats->rx_length_errors; } @@ -701,13 +700,17 @@ i40e_stats_update_rx_discards(struct i40e_vsi *vsi, struct i40e_hw *hw, struct i40e_eth_stats *stat_offset, struct i40e_eth_stats *stat) { + u64 rx_rdpc, rx_rxerr; + i40e_stat_update32(hw, I40E_GLV_RDPC(stat_idx), offset_loaded, - &stat_offset->rx_discards, &stat->rx_discards); + &stat_offset->rx_discards, &rx_rdpc); i40e_stat_update64(hw, I40E_GL_RXERR1H(i40e_compute_pci_to_hw_id(vsi, hw)), I40E_GL_RXERR1L(i40e_compute_pci_to_hw_id(vsi, hw)), offset_loaded, &stat_offset->rx_discards_other, - &stat->rx_discards_other); + &rx_rxerr); + + stat->rx_discards = rx_rdpc + rx_rxerr; } /** @@ -729,6 +732,9 @@ void i40e_update_eth_stats(struct i40e_vsi *vsi) i40e_stat_update32(hw, I40E_GLV_TEPC(stat_idx), vsi->stat_offsets_loaded, &oes->tx_errors, &es->tx_errors); + i40e_stat_update32(hw, I40E_GLV_RDPC(stat_idx), + vsi->stat_offsets_loaded, + &oes->rx_discards, &es->rx_discards); i40e_stat_update32(hw, I40E_GLV_RUPP(stat_idx), vsi->stat_offsets_loaded, &oes->rx_unknown_protocol, &es->rx_unknown_protocol); @@ -985,10 +991,8 @@ static void i40e_update_vsi_stats(struct i40e_vsi *vsi) ns->tx_errors = es->tx_errors; ons->multicast = oes->rx_multicast; ns->multicast = es->rx_multicast; - ons->rx_dropped = oes->rx_discards_other; - ns->rx_dropped = es->rx_discards_other; - ons->rx_missed_errors = oes->rx_discards; - ns->rx_missed_errors = es->rx_discards; + ons->rx_dropped = oes->rx_discards; + ns->rx_dropped = es->rx_discards; ons->tx_dropped = oes->tx_discards; ns->tx_dropped = es->tx_discards; diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index 6d7a4f2c3a49b776ef0c450c8cbbc9ca8aef6a4b..d5509bc16d0d57a3e66eb6cf1aac51342835cfdc 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c @@ -1552,8 +1552,8 @@ static void i40e_cleanup_reset_vf(struct i40e_vf *vf) * @vf: pointer to the VF structure * @flr: VFLR was issued or not * - * Return: True if reset was performed successfully or if resets are disabled. - * False if reset is already in progress. + * Returns true if the VF is in reset, resets successfully, or resets + * are disabled and false otherwise. **/ bool i40e_reset_vf(struct i40e_vf *vf, bool flr) { @@ -1572,7 +1572,7 @@ bool i40e_reset_vf(struct i40e_vf *vf, bool flr) /* If VF is being reset already we don't need to continue. */ if (test_and_set_bit(I40E_VF_STATE_RESETTING, &vf->vf_states)) - return false; + return true; i40e_trigger_vf_reset(vf, flr); @@ -3143,10 +3143,10 @@ static int i40e_vc_del_mac_addr_msg(struct i40e_vf *vf, u8 *msg) const u8 *addr = al->list[i].addr; /* Allow to delete VF primary MAC only if it was not set - * administratively by PF. + * administratively by PF or if VF is trusted. */ if (ether_addr_equal(addr, vf->default_lan_addr.addr)) { - if (!vf->pf_set_mac) + if (i40e_can_vf_change_mac(vf)) was_unimac_deleted = true; else continue; @@ -4332,10 +4332,7 @@ int i40e_vc_process_vflr_event(struct i40e_pf *pf) reg = rd32(hw, I40E_GLGEN_VFLRSTAT(reg_idx)); if (reg & BIT(bit_idx)) /* i40e_reset_vf will clear the bit in GLGEN_VFLRSTAT */ - if (!i40e_reset_vf(vf, true)) { - /* At least one VF did not finish resetting, retry next time */ - set_bit(__I40E_VFLR_EVENT_PENDING, pf->state); - } + i40e_reset_vf(vf, true); } return 0; @@ -5010,8 +5007,8 @@ int i40e_get_vf_stats(struct net_device *netdev, int vf_id, vf_stats->tx_bytes = stats->tx_bytes; vf_stats->broadcast = stats->rx_broadcast; vf_stats->multicast = stats->rx_multicast; - vf_stats->rx_dropped = stats->rx_discards + stats->rx_discards_other; - vf_stats->tx_dropped = stats->tx_errors; + vf_stats->rx_dropped = stats->rx_discards; + vf_stats->tx_dropped = stats->tx_discards; return 0; } diff --git a/drivers/net/ethernet/intel/ice/ice_arfs.c b/drivers/net/ethernet/intel/ice/ice_arfs.c index 7036070bc0208b7b071bafce1c3c1ba363f51741..d7e0116f67737b88b5405960d09c53a9b0eb57c8 100644 --- a/drivers/net/ethernet/intel/ice/ice_arfs.c +++ b/drivers/net/ethernet/intel/ice/ice_arfs.c @@ -376,50 +376,6 @@ ice_arfs_is_perfect_flow_set(struct ice_hw *hw, __be16 l3_proto, u8 l4_proto) return false; } -/** - * ice_arfs_cmp - Check if aRFS filter matches this flow. - * @fltr_info: filter info of the saved ARFS entry. - * @fk: flow dissector keys. - * @n_proto: One of htons(ETH_P_IP) or htons(ETH_P_IPV6). - * @ip_proto: One of IPPROTO_TCP or IPPROTO_UDP. - * - * Since this function assumes limited values for n_proto and ip_proto, it - * is meant to be called only from ice_rx_flow_steer(). - * - * Return: - * * true - fltr_info refers to the same flow as fk. - * * false - fltr_info and fk refer to different flows. - */ -static bool -ice_arfs_cmp(const struct ice_fdir_fltr *fltr_info, const struct flow_keys *fk, - __be16 n_proto, u8 ip_proto) -{ - /* Determine if the filter is for IPv4 or IPv6 based on flow_type, - * which is one of ICE_FLTR_PTYPE_NONF_IPV{4,6}_{TCP,UDP}. - */ - bool is_v4 = fltr_info->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || - fltr_info->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP; - - /* Following checks are arranged in the quickest and most discriminative - * fields first for early failure. - */ - if (is_v4) - return n_proto == htons(ETH_P_IP) && - fltr_info->ip.v4.src_port == fk->ports.src && - fltr_info->ip.v4.dst_port == fk->ports.dst && - fltr_info->ip.v4.src_ip == fk->addrs.v4addrs.src && - fltr_info->ip.v4.dst_ip == fk->addrs.v4addrs.dst && - fltr_info->ip.v4.proto == ip_proto; - - return fltr_info->ip.v6.src_port == fk->ports.src && - fltr_info->ip.v6.dst_port == fk->ports.dst && - fltr_info->ip.v6.proto == ip_proto && - !memcmp(&fltr_info->ip.v6.src_ip, &fk->addrs.v6addrs.src, - sizeof(struct in6_addr)) && - !memcmp(&fltr_info->ip.v6.dst_ip, &fk->addrs.v6addrs.dst, - sizeof(struct in6_addr)); -} - /** * ice_rx_flow_steer - steer the Rx flow to where application is being run * @netdev: ptr to the netdev being adjusted @@ -491,10 +447,6 @@ ice_rx_flow_steer(struct net_device *netdev, const struct sk_buff *skb, continue; fltr_info = &arfs_entry->fltr_info; - - if (!ice_arfs_cmp(fltr_info, &fk, n_proto, ip_proto)) - continue; - ret = fltr_info->fltr_id; if (fltr_info->q_index == rxq_idx || diff --git a/drivers/net/ethernet/intel/ice/ice_ddp.c b/drivers/net/ethernet/intel/ice/ice_ddp.c index cd97974b451a04ba8f28dde89e4568e1a7ca40bf..b27ec93638b6b471df4be8d81158799da2ec8a27 100644 --- a/drivers/net/ethernet/intel/ice/ice_ddp.c +++ b/drivers/net/ethernet/intel/ice/ice_ddp.c @@ -1884,8 +1884,6 @@ enum ice_ddp_state ice_copy_and_init_pkg(struct ice_hw *hw, const u8 *buf, return ICE_DDP_PKG_ERR; buf_copy = devm_kmemdup(ice_hw_to_dev(hw), buf, len, GFP_KERNEL); - if (!buf_copy) - return ICE_DDP_PKG_ERR; state = ice_init_pkg(hw, buf_copy, len); if (!ice_is_init_pkg_successful(state)) { diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c index dd58b2372dc0c7eb8c14622dfea5bb0e73ba5cbf..39b5f24be7e4fcaada4de5edaee6bfe0c18440ee 100644 --- a/drivers/net/ethernet/intel/ice/ice_ethtool.c +++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c @@ -3329,7 +3329,8 @@ static u32 ice_get_combined_cnt(struct ice_vsi *vsi) ice_for_each_q_vector(vsi, q_idx) { struct ice_q_vector *q_vector = vsi->q_vectors[q_idx]; - combined += min(q_vector->num_ring_tx, q_vector->num_ring_rx); + if (q_vector->rx.rx_ring && q_vector->tx.tx_ring) + combined++; } return combined; diff --git a/drivers/net/ethernet/intel/ice/ice_irq.c b/drivers/net/ethernet/intel/ice/ice_irq.c index 09f9c7ba52795bc3658634706f2a71334b21e175..ad82ff7d199570fe219fb95669a2488517d7ce7c 100644 --- a/drivers/net/ethernet/intel/ice/ice_irq.c +++ b/drivers/net/ethernet/intel/ice/ice_irq.c @@ -45,7 +45,7 @@ static void ice_free_irq_res(struct ice_pf *pf, u16 index) /** * ice_get_irq_res - get an interrupt resource * @pf: board private structure - * @dyn_allowed: allow entry to be dynamically allocated + * @dyn_only: force entry to be dynamically allocated * * Allocate new irq entry in the free slot of the tracker. Since xarray * is used, always allocate new entry at the lowest possible index. Set @@ -53,12 +53,11 @@ static void ice_free_irq_res(struct ice_pf *pf, u16 index) * * Returns allocated irq entry or NULL on failure. */ -static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, - bool dyn_allowed) +static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, bool dyn_only) { - struct xa_limit limit = { .max = pf->irq_tracker.num_entries - 1, + struct xa_limit limit = { .max = pf->irq_tracker.num_entries, .min = 0 }; - unsigned int num_static = pf->irq_tracker.num_static - 1; + unsigned int num_static = pf->irq_tracker.num_static; struct ice_irq_entry *entry; unsigned int index; int ret; @@ -67,9 +66,9 @@ static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, if (!entry) return NULL; - /* only already allocated if the caller says so */ - if (!dyn_allowed) - limit.max = num_static; + /* skip preallocated entries if the caller says so */ + if (dyn_only) + limit.min = num_static; ret = xa_alloc(&pf->irq_tracker.entries, &index, entry, limit, GFP_KERNEL); @@ -79,7 +78,7 @@ static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, entry = NULL; } else { entry->index = index; - entry->dynamic = index > num_static; + entry->dynamic = index >= num_static; } return entry; @@ -273,7 +272,7 @@ int ice_init_interrupt_scheme(struct ice_pf *pf) /** * ice_alloc_irq - Allocate new interrupt vector * @pf: board private structure - * @dyn_allowed: allow dynamic allocation of the interrupt + * @dyn_only: force dynamic allocation of the interrupt * * Allocate new interrupt vector for a given owner id. * return struct msi_map with interrupt details and track @@ -286,20 +285,20 @@ int ice_init_interrupt_scheme(struct ice_pf *pf) * interrupt will be allocated with pci_msix_alloc_irq_at. * * Some callers may only support dynamically allocated interrupts. - * This is indicated with dyn_allowed flag. + * This is indicated with dyn_only flag. * * On failure, return map with negative .index. The caller * is expected to check returned map index. * */ -struct msi_map ice_alloc_irq(struct ice_pf *pf, bool dyn_allowed) +struct msi_map ice_alloc_irq(struct ice_pf *pf, bool dyn_only) { int sriov_base_vector = pf->sriov_base_vector; struct msi_map map = { .index = -ENOENT }; struct device *dev = ice_pf_to_dev(pf); struct ice_irq_entry *entry; - entry = ice_get_irq_res(pf, dyn_allowed); + entry = ice_get_irq_res(pf, dyn_only); if (!entry) return map; diff --git a/drivers/net/ethernet/intel/ice/ice_lag.c b/drivers/net/ethernet/intel/ice/ice_lag.c index 8ed9918ea4e894786fe93cf3eb6ec48e67aa87a4..4e675c7c199fa1f41b339144651250ce33759e67 100644 --- a/drivers/net/ethernet/intel/ice/ice_lag.c +++ b/drivers/net/ethernet/intel/ice/ice_lag.c @@ -1229,18 +1229,12 @@ static void ice_lag_changeupper_event(struct ice_lag *lag, void *ptr) */ if (!primary_lag) { lag->primary = true; - if (!ice_is_switchdev_running(lag->pf)) - return; - /* Configure primary's SWID to be shared */ ice_lag_primary_swid(lag, true); primary_lag = lag; } else { u16 swid; - if (!ice_is_switchdev_running(primary_lag->pf)) - return; - swid = primary_lag->pf->hw.port_info->sw_id; ice_lag_set_swid(swid, lag, true); ice_lag_add_prune_list(primary_lag, lag->pf); @@ -2129,8 +2123,7 @@ bool ice_lag_is_switchdev_running(struct ice_pf *pf) struct ice_lag *lag = pf->lag; struct net_device *tmp_nd; - if (!ice_is_feature_supported(pf, ICE_F_SRIOV_LAG) || - !lag || !lag->upper_netdev) + if (!ice_is_feature_supported(pf, ICE_F_SRIOV_LAG) || !lag) return false; rcu_read_lock(); diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c index a6a290514e5484ce35169d6e83f5fcc9df0aaa32..1fc4805353eb586e99fc13fb32dfb47e555dc0b7 100644 --- a/drivers/net/ethernet/intel/ice/ice_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_lib.c @@ -587,8 +587,6 @@ ice_vsi_alloc_def(struct ice_vsi *vsi, struct ice_channel *ch) return -ENOMEM; } - vsi->irq_dyn_alloc = pci_msix_can_alloc_dyn(vsi->back->pdev); - switch (vsi->type) { case ICE_VSI_SWITCHDEV_CTRL: /* Setup eswitch MSIX irq handler for VSI */ diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index e1a68fb5e9fff028d48e4227600aac292d5df8c8..0ae7bdfff83fb22de27630c89c1bebd75e472408 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -2650,27 +2650,6 @@ static void ice_vsi_assign_bpf_prog(struct ice_vsi *vsi, struct bpf_prog *prog) bpf_prog_put(old_prog); } -/** - * ice_unmap_xdp_rings - Unmap XDP rings from interrupt vectors - * @vsi: the VSI with XDP rings being unmapped - */ -static void ice_unmap_xdp_rings(struct ice_vsi *vsi) -{ - int v_idx; - - ice_for_each_q_vector(vsi, v_idx) { - struct ice_q_vector *q_vector = vsi->q_vectors[v_idx]; - struct ice_tx_ring *ring; - - ice_for_each_tx_ring(ring, q_vector->tx) - if (!ring->tx_buf || !ice_ring_is_xdp(ring)) - break; - - /* restore the value of last node prior to XDP setup */ - q_vector->tx.tx_ring = ring; - } -} - /** * ice_prepare_xdp_rings - Allocate, configure and setup Tx rings for XDP * @vsi: VSI to bring up Tx rings used by XDP @@ -2770,7 +2749,7 @@ int ice_prepare_xdp_rings(struct ice_vsi *vsi, struct bpf_prog *prog, if (status) { dev_err(dev, "Failed VSI LAN queue config for XDP, error: %d\n", status); - goto unmap_xdp_rings; + goto clear_xdp_rings; } /* assign the prog only when it's not already present on VSI; @@ -2786,8 +2765,6 @@ int ice_prepare_xdp_rings(struct ice_vsi *vsi, struct bpf_prog *prog, ice_vsi_assign_bpf_prog(vsi, prog); return 0; -unmap_xdp_rings: - ice_unmap_xdp_rings(vsi); clear_xdp_rings: ice_for_each_xdp_txq(vsi, i) if (vsi->xdp_rings[i]) { @@ -2804,8 +2781,6 @@ int ice_prepare_xdp_rings(struct ice_vsi *vsi, struct bpf_prog *prog, mutex_unlock(&pf->avail_q_mutex); devm_kfree(dev, vsi->xdp_rings); - vsi->xdp_rings = NULL; - return -ENOMEM; } @@ -2821,7 +2796,7 @@ int ice_destroy_xdp_rings(struct ice_vsi *vsi, enum ice_xdp_cfg cfg_type) { u16 max_txqs[ICE_MAX_TRAFFIC_CLASS] = { 0 }; struct ice_pf *pf = vsi->back; - int i; + int i, v_idx; /* q_vectors are freed in reset path so there's no point in detaching * rings @@ -2829,7 +2804,17 @@ int ice_destroy_xdp_rings(struct ice_vsi *vsi, enum ice_xdp_cfg cfg_type) if (cfg_type == ICE_XDP_CFG_PART) goto free_qmap; - ice_unmap_xdp_rings(vsi); + ice_for_each_q_vector(vsi, v_idx) { + struct ice_q_vector *q_vector = vsi->q_vectors[v_idx]; + struct ice_tx_ring *ring; + + ice_for_each_tx_ring(ring, q_vector->tx) + if (!ring->tx_buf || !ice_ring_is_xdp(ring)) + break; + + /* restore the value of last node prior to XDP setup */ + q_vector->tx.tx_ring = ring; + } free_qmap: mutex_lock(&pf->avail_q_mutex); @@ -2971,14 +2956,11 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog, xdp_ring_err = ice_vsi_determine_xdp_res(vsi); if (xdp_ring_err) { NL_SET_ERR_MSG_MOD(extack, "Not enough Tx resources for XDP"); - goto resume_if; } else { xdp_ring_err = ice_prepare_xdp_rings(vsi, prog, ICE_XDP_CFG_FULL); - if (xdp_ring_err) { + if (xdp_ring_err) NL_SET_ERR_MSG_MOD(extack, "Setting up XDP Tx resources failed"); - goto resume_if; - } } xdp_features_set_redirect_target(vsi->netdev, true); /* reallocate Rx queues that are used for zero-copy */ @@ -2996,7 +2978,6 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog, NL_SET_ERR_MSG_MOD(extack, "Freeing XDP Rx resources failed"); } -resume_if: if (if_running) ret = ice_up(vsi); diff --git a/drivers/net/ethernet/intel/ice/ice_sched.c b/drivers/net/ethernet/intel/ice/ice_sched.c index c2de166f05515050e647115206753ad54e97f50d..908bcd07380333857b773e232b1001acdc274664 100644 --- a/drivers/net/ethernet/intel/ice/ice_sched.c +++ b/drivers/net/ethernet/intel/ice/ice_sched.c @@ -84,27 +84,6 @@ ice_sched_find_node_by_teid(struct ice_sched_node *start_node, u32 teid) return NULL; } -/** - * ice_sched_find_next_vsi_node - find the next node for a given VSI - * @vsi_node: VSI support node to start search with - * - * Return: Next VSI support node, or NULL. - * - * The function returns a pointer to the next node from the VSI layer - * assigned to the given VSI, or NULL if there is no such a node. - */ -static struct ice_sched_node * -ice_sched_find_next_vsi_node(struct ice_sched_node *vsi_node) -{ - unsigned int vsi_handle = vsi_node->vsi_handle; - - while ((vsi_node = vsi_node->sibling) != NULL) - if (vsi_node->vsi_handle == vsi_handle) - break; - - return vsi_node; -} - /** * ice_aqc_send_sched_elem_cmd - send scheduling elements cmd * @hw: pointer to the HW struct @@ -1117,10 +1096,8 @@ ice_sched_add_nodes_to_layer(struct ice_port_info *pi, if (parent->num_children < max_child_nodes) { new_num_nodes = max_child_nodes - parent->num_children; } else { - /* This parent is full, - * try the next available sibling. - */ - parent = ice_sched_find_next_vsi_node(parent); + /* This parent is full, try the next sibling */ + parent = parent->sibling; /* Don't modify the first node TEID memory if the * first node was added already in the above call. * Instead send some temp memory for all other @@ -1561,23 +1538,12 @@ ice_sched_get_free_qparent(struct ice_port_info *pi, u16 vsi_handle, u8 tc, /* get the first queue group node from VSI sub-tree */ qgrp_node = ice_sched_get_first_node(pi, vsi_node, qgrp_layer); while (qgrp_node) { - struct ice_sched_node *next_vsi_node; - /* make sure the qgroup node is part of the VSI subtree */ if (ice_sched_find_node_in_subtree(pi->hw, vsi_node, qgrp_node)) if (qgrp_node->num_children < max_children && qgrp_node->owner == owner) break; qgrp_node = qgrp_node->sibling; - if (qgrp_node) - continue; - - next_vsi_node = ice_sched_find_next_vsi_node(vsi_node); - if (!next_vsi_node) - break; - - vsi_node = next_vsi_node; - qgrp_node = ice_sched_get_first_node(pi, vsi_node, qgrp_layer); } /* Select the best queue group */ @@ -1648,16 +1614,16 @@ ice_sched_get_agg_node(struct ice_port_info *pi, struct ice_sched_node *tc_node, /** * ice_sched_calc_vsi_child_nodes - calculate number of VSI child nodes * @hw: pointer to the HW struct - * @num_new_qs: number of new queues that will be added to the tree + * @num_qs: number of queues * @num_nodes: num nodes array * * This function calculates the number of VSI child nodes based on the * number of queues. */ static void -ice_sched_calc_vsi_child_nodes(struct ice_hw *hw, u16 num_new_qs, u16 *num_nodes) +ice_sched_calc_vsi_child_nodes(struct ice_hw *hw, u16 num_qs, u16 *num_nodes) { - u16 num = num_new_qs; + u16 num = num_qs; u8 i, qgl, vsil; qgl = ice_sched_get_qgrp_layer(hw); @@ -1823,11 +1789,7 @@ ice_sched_add_vsi_support_nodes(struct ice_port_info *pi, u16 vsi_handle, if (!parent) return -EIO; - /* Do not modify the VSI handle for already existing VSI nodes, - * (if no new VSI node was added to the tree). - * Assign the VSI handle only to newly added VSI nodes. - */ - if (i == vsil && num_added) + if (i == vsil) parent->vsi_handle = vsi_handle; } @@ -1860,41 +1822,6 @@ ice_sched_add_vsi_to_topo(struct ice_port_info *pi, u16 vsi_handle, u8 tc) num_nodes); } -/** - * ice_sched_recalc_vsi_support_nodes - recalculate VSI support nodes count - * @hw: pointer to the HW struct - * @vsi_node: pointer to the leftmost VSI node that needs to be extended - * @new_numqs: new number of queues that has to be handled by the VSI - * @new_num_nodes: pointer to nodes count table to modify the VSI layer entry - * - * This function recalculates the number of supported nodes that need to - * be added after adding more Tx queues for a given VSI. - * The number of new VSI support nodes that shall be added will be saved - * to the @new_num_nodes table for the VSI layer. - */ -static void -ice_sched_recalc_vsi_support_nodes(struct ice_hw *hw, - struct ice_sched_node *vsi_node, - unsigned int new_numqs, u16 *new_num_nodes) -{ - u32 vsi_nodes_cnt = 1; - u32 max_queue_cnt = 1; - u32 qgl, vsil; - - qgl = ice_sched_get_qgrp_layer(hw); - vsil = ice_sched_get_vsi_layer(hw); - - for (u32 i = vsil; i <= qgl; i++) - max_queue_cnt *= hw->max_children[i]; - - while ((vsi_node = ice_sched_find_next_vsi_node(vsi_node)) != NULL) - vsi_nodes_cnt++; - - if (new_numqs > (max_queue_cnt * vsi_nodes_cnt)) - new_num_nodes[vsil] = DIV_ROUND_UP(new_numqs, max_queue_cnt) - - vsi_nodes_cnt; -} - /** * ice_sched_update_vsi_child_nodes - update VSI child nodes * @pi: port information structure @@ -1946,25 +1873,15 @@ ice_sched_update_vsi_child_nodes(struct ice_port_info *pi, u16 vsi_handle, return status; } - ice_sched_recalc_vsi_support_nodes(hw, vsi_node, - new_numqs, new_num_nodes); - ice_sched_calc_vsi_child_nodes(hw, new_numqs - prev_numqs, - new_num_nodes); - - /* Never decrease the number of queues in the tree. Update the tree - * only if number of queues > previous number of queues. This may + if (new_numqs) + ice_sched_calc_vsi_child_nodes(hw, new_numqs, new_num_nodes); + /* Keep the max number of queue configuration all the time. Update the + * tree only if number of queues > previous number of queues. This may * leave some extra nodes in the tree if number of queues < previous * number but that wouldn't harm anything. Removing those extra nodes * may complicate the code if those nodes are part of SRL or * individually rate limited. - * Also, add the required VSI support nodes if the existing ones cannot - * handle the requested new number of queues. */ - status = ice_sched_add_vsi_support_nodes(pi, vsi_handle, tc_node, - new_num_nodes); - if (status) - return status; - status = ice_sched_add_vsi_child_nodes(pi, vsi_handle, tc_node, new_num_nodes, owner); if (status) @@ -2105,58 +2022,6 @@ static bool ice_sched_is_leaf_node_present(struct ice_sched_node *node) return (node->info.data.elem_type == ICE_AQC_ELEM_TYPE_LEAF); } -/** - * ice_sched_rm_vsi_subtree - remove all nodes assigned to a given VSI - * @pi: port information structure - * @vsi_node: pointer to the leftmost node of the VSI to be removed - * @owner: LAN or RDMA - * @tc: TC number - * - * Return: Zero in case of success, or -EBUSY if the VSI has leaf nodes in TC. - * - * This function removes all the VSI support nodes associated with a given VSI - * and its LAN or RDMA children nodes from the scheduler tree. - */ -static int -ice_sched_rm_vsi_subtree(struct ice_port_info *pi, - struct ice_sched_node *vsi_node, u8 owner, u8 tc) -{ - u16 vsi_handle = vsi_node->vsi_handle; - bool all_vsi_nodes_removed = true; - int j = 0; - - while (vsi_node) { - struct ice_sched_node *next_vsi_node; - - if (ice_sched_is_leaf_node_present(vsi_node)) { - ice_debug(pi->hw, ICE_DBG_SCHED, "VSI has leaf nodes in TC %d\n", tc); - return -EBUSY; - } - while (j < vsi_node->num_children) { - if (vsi_node->children[j]->owner == owner) - ice_free_sched_node(pi, vsi_node->children[j]); - else - j++; - } - - next_vsi_node = ice_sched_find_next_vsi_node(vsi_node); - - /* remove the VSI if it has no children */ - if (!vsi_node->num_children) - ice_free_sched_node(pi, vsi_node); - else - all_vsi_nodes_removed = false; - - vsi_node = next_vsi_node; - } - - /* clean up aggregator related VSI info if any */ - if (all_vsi_nodes_removed) - ice_sched_rm_agg_vsi_info(pi, vsi_handle); - - return 0; -} - /** * ice_sched_rm_vsi_cfg - remove the VSI and its children nodes * @pi: port information structure @@ -2183,6 +2048,7 @@ ice_sched_rm_vsi_cfg(struct ice_port_info *pi, u16 vsi_handle, u8 owner) ice_for_each_traffic_class(i) { struct ice_sched_node *vsi_node, *tc_node; + u8 j = 0; tc_node = ice_sched_get_tc_node(pi, i); if (!tc_node) @@ -2192,12 +2058,31 @@ ice_sched_rm_vsi_cfg(struct ice_port_info *pi, u16 vsi_handle, u8 owner) if (!vsi_node) continue; - status = ice_sched_rm_vsi_subtree(pi, vsi_node, owner, i); - if (status) + if (ice_sched_is_leaf_node_present(vsi_node)) { + ice_debug(pi->hw, ICE_DBG_SCHED, "VSI has leaf nodes in TC %d\n", i); + status = -EBUSY; goto exit_sched_rm_vsi_cfg; + } + while (j < vsi_node->num_children) { + if (vsi_node->children[j]->owner == owner) { + ice_free_sched_node(pi, vsi_node->children[j]); - vsi_ctx->sched.vsi_node[i] = NULL; + /* reset the counter again since the num + * children will be updated after node removal + */ + j = 0; + } else { + j++; + } + } + /* remove the VSI if it has no children */ + if (!vsi_node->num_children) { + ice_free_sched_node(pi, vsi_node); + vsi_ctx->sched.vsi_node[i] = NULL; + /* clean up aggregator related VSI info if any */ + ice_sched_rm_agg_vsi_info(pi, vsi_handle); + } if (owner == ICE_SCHED_NODE_OWNER_LAN) vsi_ctx->sched.max_lanq[i] = 0; else diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c index ac004ef1d724d32229b824173d26fd12035c7cf8..19f730a68fa21c4f7ebe00af47de1d7e49a0a9d5 100644 --- a/drivers/net/ethernet/intel/ice/ice_switch.c +++ b/drivers/net/ethernet/intel/ice/ice_switch.c @@ -3024,7 +3024,7 @@ ice_add_update_vsi_list(struct ice_hw *hw, u16 vsi_handle_arr[2]; /* A rule already exists with the new VSI being added */ - if (cur_fltr->vsi_handle == new_fltr->vsi_handle) + if (cur_fltr->fwd_id.hw_vsi_id == new_fltr->fwd_id.hw_vsi_id) return -EEXIST; vsi_handle_arr[0] = cur_fltr->vsi_handle; @@ -5991,7 +5991,7 @@ ice_adv_add_update_vsi_list(struct ice_hw *hw, /* A rule already exists with the new VSI being added */ if (test_bit(vsi_handle, m_entry->vsi_list_info->vsi_map)) - return -EEXIST; + return 0; /* Update the previously created VSI list set with * the new VSI ID passed in diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl.c b/drivers/net/ethernet/intel/ice/ice_virtchnl.c index 1edcf93031831513015667d75f228b45e75867ae..e709b10a29761b4268aa3c549eb311dbf2913956 100644 --- a/drivers/net/ethernet/intel/ice/ice_virtchnl.c +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl.c @@ -3769,6 +3769,7 @@ static int ice_vc_repr_add_mac(struct ice_vf *vf, u8 *msg) } ice_vfhw_mac_add(vf, &al->list[i]); + vf->num_mac++; break; } diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 11543db4c47f0ed365acde9d64fb2faa4f974e72..e2f5c4384455e0950b872b40b64391e325d95955 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -6772,10 +6772,6 @@ static int igc_probe(struct pci_dev *pdev, adapter->port_num = hw->bus.func; adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); - /* Disable ASPM L1.2 on I226 devices to avoid packet loss */ - if (igc_is_device_id_i226(hw)) - pci_disable_link_state(pdev, PCIE_LINK_STATE_L1_2); - err = pci_save_state(pdev); if (err) goto err_ioremap; @@ -7148,9 +7144,6 @@ static int __maybe_unused igc_resume(struct device *dev) pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3cold, 0); - if (igc_is_device_id_i226(hw)) - pci_disable_link_state(pdev, PCIE_LINK_STATE_L1_2); - if (igc_init_interrupt_scheme(adapter, true)) { netdev_err(netdev, "Unable to allocate memory for queues\n"); return -ENOMEM; @@ -7266,9 +7259,6 @@ static pci_ers_result_t igc_io_slot_reset(struct pci_dev *pdev) pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3cold, 0); - if (igc_is_device_id_i226(hw)) - pci_disable_link_state_locked(pdev, PCIE_LINK_STATE_L1_2); - /* In case of PCI error, adapter loses its HW address * so we should re-assign it here. */ diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c index 1e4cd4f7d0cfd4b8ea48ef1c048b17cbd02c0d85..0e74c5a2231e63ba48e463650adfccd0bb0f4cd0 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c @@ -13,26 +13,19 @@ /* RVU LMTST */ #define LMT_TBL_OP_READ 0 #define LMT_TBL_OP_WRITE 1 +#define LMT_MAP_TABLE_SIZE (128 * 1024) #define LMT_MAPTBL_ENTRY_SIZE 16 -#define LMT_MAX_VFS 256 - -#define LMT_MAP_ENTRY_ENA BIT_ULL(20) -#define LMT_MAP_ENTRY_LINES GENMASK_ULL(18, 16) /* Function to perform operations (read/write) on lmtst map table */ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val, int lmt_tbl_op) { void __iomem *lmt_map_base; - u64 tbl_base, cfg; - int pfs, vfs; + u64 tbl_base; tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE); - cfg = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_CFG); - vfs = 1 << (cfg & 0xF); - pfs = 1 << ((cfg >> 4) & 0x7); - lmt_map_base = ioremap_wc(tbl_base, pfs * vfs * LMT_MAPTBL_ENTRY_SIZE); + lmt_map_base = ioremap_wc(tbl_base, LMT_MAP_TABLE_SIZE); if (!lmt_map_base) { dev_err(rvu->dev, "Failed to setup lmt map table mapping!!\n"); return -ENOMEM; @@ -42,13 +35,6 @@ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val, *val = readq(lmt_map_base + index); } else { writeq((*val), (lmt_map_base + index)); - - cfg = FIELD_PREP(LMT_MAP_ENTRY_ENA, 0x1); - /* 2048 LMTLINES */ - cfg |= FIELD_PREP(LMT_MAP_ENTRY_LINES, 0x6); - - writeq(cfg, (lmt_map_base + (index + 8))); - /* Flushing the AP interceptor cache to make APR_LMT_MAP_ENTRY_S * changes effective. Write 1 for flush and read is being used as a * barrier and sets up a data dependency. Write to 0 after a write @@ -66,7 +52,7 @@ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val, #define LMT_MAP_TBL_W1_OFF 8 static u32 rvu_get_lmtst_tbl_index(struct rvu *rvu, u16 pcifunc) { - return ((rvu_get_pf(pcifunc) * LMT_MAX_VFS) + + return ((rvu_get_pf(pcifunc) * rvu->hw->total_vfs) + (pcifunc & RVU_PFVF_FUNC_MASK)) * LMT_MAPTBL_ENTRY_SIZE; } @@ -83,7 +69,7 @@ static int rvu_get_lmtaddr(struct rvu *rvu, u16 pcifunc, mutex_lock(&rvu->rsrc_lock); rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_SMMU_ADDR_REQ, iova); - pf = rvu_get_pf(pcifunc) & RVU_PFVF_PF_MASK; + pf = rvu_get_pf(pcifunc) & 0x1F; val = BIT_ULL(63) | BIT_ULL(14) | BIT_ULL(13) | pf << 8 | ((pcifunc & RVU_PFVF_FUNC_MASK) & 0xFF); rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_SMMU_TXN_REQ, val); diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c index 56dab11833b533af3d060e9aa5675683c405c59f..feca86e429df20551c5d6da6a9b7bcacdc1578ed 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c @@ -580,7 +580,6 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp, u64 lmt_addr, val, tbl_base; int pf, vf, num_vfs, hw_vfs; void __iomem *lmt_map_base; - int apr_pfs, apr_vfs; int buf_size = 10240; size_t off = 0; int index = 0; @@ -596,12 +595,8 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp, return -ENOMEM; tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE); - val = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_CFG); - apr_vfs = 1 << (val & 0xF); - apr_pfs = 1 << ((val >> 4) & 0x7); - lmt_map_base = ioremap_wc(tbl_base, apr_pfs * apr_vfs * - LMT_MAPTBL_ENTRY_SIZE); + lmt_map_base = ioremap_wc(tbl_base, 128 * 1024); if (!lmt_map_base) { dev_err(rvu->dev, "Failed to setup lmt map table mapping!!\n"); kfree(buf); @@ -623,7 +618,7 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp, off += scnprintf(&buf[off], buf_size - 1 - off, "PF%d \t\t\t", pf); - index = pf * apr_vfs * LMT_MAPTBL_ENTRY_SIZE; + index = pf * rvu->hw->total_vfs * LMT_MAPTBL_ENTRY_SIZE; off += scnprintf(&buf[off], buf_size - 1 - off, " 0x%llx\t\t", (tbl_base + index)); lmt_addr = readq(lmt_map_base + index); @@ -636,7 +631,7 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp, /* Reading num of VFs per PF */ rvu_get_pf_numvfs(rvu, pf, &num_vfs, &hw_vfs); for (vf = 0; vf < num_vfs; vf++) { - index = (pf * apr_vfs * LMT_MAPTBL_ENTRY_SIZE) + + index = (pf * rvu->hw->total_vfs * 16) + ((vf + 1) * LMT_MAPTBL_ENTRY_SIZE); off += scnprintf(&buf[off], buf_size - 1 - off, "PF%d:VF%d \t\t", pf, vf); diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c b/drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c index a2807a1e4f4a62c5c7f56af68452c5c5ec4a2ffc..7417087b6db597b6f577b066cf9856732f587153 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c @@ -352,12 +352,9 @@ int cn10k_free_matchall_ipolicer(struct otx2_nic *pfvf) mutex_lock(&pfvf->mbox.lock); /* Remove RQ's policer mapping */ - for (qidx = 0; qidx < hw->rx_queues; qidx++) { - rc = cn10k_map_unmap_rq_policer(pfvf, qidx, hw->matchall_ipolicer, false); - if (rc) - dev_warn(pfvf->dev, "Failed to unmap RQ %d's policer (error %d).", - qidx, rc); - } + for (qidx = 0; qidx < hw->rx_queues; qidx++) + cn10k_map_unmap_rq_policer(pfvf, qidx, + hw->matchall_ipolicer, false); rc = cn10k_free_leaf_profile(pfvf, hw->matchall_ipolicer); diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c index 1999918ca500faa984dfffe7879d9d72c83946af..47adccf7a7776539d95f8a6b0e46d4579770ac8c 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c @@ -988,7 +988,6 @@ static int otx2_cq_init(struct otx2_nic *pfvf, u16 qidx) int err, pool_id, non_xdp_queues; struct nix_aq_enq_req *aq; struct otx2_cq_queue *cq; - struct otx2_pool *pool; cq = &qset->cq[qidx]; cq->cq_idx = qidx; @@ -997,13 +996,8 @@ static int otx2_cq_init(struct otx2_nic *pfvf, u16 qidx) cq->cq_type = CQ_RX; cq->cint_idx = qidx; cq->cqe_cnt = qset->rqe_cnt; - if (pfvf->xdp_prog) { - pool = &qset->pool[qidx]; + if (pfvf->xdp_prog) xdp_rxq_info_reg(&cq->xdp_rxq, pfvf->netdev, qidx, 0); - xdp_rxq_info_reg_mem_model(&cq->xdp_rxq, - MEM_TYPE_PAGE_POOL, - pool->page_pool); - } } else if (qidx < non_xdp_queues) { cq->cq_type = CQ_TX; cq->cint_idx = qidx - pfvf->hw.rx_queues; diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/qos.c b/drivers/net/ethernet/marvell/octeontx2/nic/qos.c index 92861f102590fead9210217b81369f739e9c7ee1..37db19584c1431410257e1af79c64938e7d55d5d 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/qos.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/qos.c @@ -1560,7 +1560,6 @@ static int otx2_qos_leaf_del_last(struct otx2_nic *pfvf, u16 classid, bool force if (!node->is_static) dwrr_del_node = true; - WRITE_ONCE(node->qid, OTX2_QOS_QID_INNER); /* destroy the leaf node */ otx2_qos_disable_sq(pfvf, qid); otx2_qos_destroy_node(pfvf, node); @@ -1605,6 +1604,9 @@ static int otx2_qos_leaf_del_last(struct otx2_nic *pfvf, u16 classid, bool force } kfree(new_cfg); + /* update tx_real_queues */ + otx2_qos_update_tx_netdev_queues(pfvf); + return 0; } diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c index 5eb7a97e7eb177b9e49e0bcf17d9ef47e1c8e911..c2ab87828d85896bce4cce8386ef46f48eb7ccc3 100644 --- a/drivers/net/ethernet/mediatek/mtk_star_emac.c +++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c @@ -1468,8 +1468,6 @@ static __maybe_unused int mtk_star_suspend(struct device *dev) if (netif_running(ndev)) mtk_star_disable(ndev); - netif_device_detach(ndev); - clk_bulk_disable_unprepare(MTK_STAR_NCLKS, priv->clks); return 0; @@ -1494,8 +1492,6 @@ static __maybe_unused int mtk_star_resume(struct device *dev) clk_bulk_disable_unprepare(MTK_STAR_NCLKS, priv->clks); } - netif_device_attach(ndev); - return ret; } diff --git a/drivers/net/ethernet/mellanox/mlx4/alloc.c b/drivers/net/ethernet/mellanox/mlx4/alloc.c index f2bded847e61d128aac83e4ad743b6b33307ecbf..b330020dc0d674ee103c0651a0d48e8f7a2ea0b2 100644 --- a/drivers/net/ethernet/mellanox/mlx4/alloc.c +++ b/drivers/net/ethernet/mellanox/mlx4/alloc.c @@ -682,9 +682,9 @@ static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device) } static int mlx4_alloc_db_from_pgdir(struct mlx4_db_pgdir *pgdir, - struct mlx4_db *db, unsigned int order) + struct mlx4_db *db, int order) { - unsigned int o; + int o; int i; for (o = order; o <= 1; ++o) { @@ -712,7 +712,7 @@ static int mlx4_alloc_db_from_pgdir(struct mlx4_db_pgdir *pgdir, return 0; } -int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, unsigned int order) +int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order) { struct mlx4_priv *priv = mlx4_priv(dev); struct mlx4_db_pgdir *pgdir; diff --git a/drivers/net/ethernet/mellanox/mlx4/en_clock.c b/drivers/net/ethernet/mellanox/mlx4/en_clock.c index 2d5b86207e0795202827bc573d25d48230027c36..9e3b761820881e85181bc2ad50e4372102bc2ddb 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_clock.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_clock.c @@ -249,7 +249,7 @@ static const struct ptp_clock_info mlx4_en_ptp_clock_info = { static u32 freq_to_shift(u16 freq) { u32 freq_khz = freq * 1000; - u64 max_val_cycles = freq_khz * 1000ULL * MLX4_EN_WRAP_AROUND_SEC; + u64 max_val_cycles = freq_khz * 1000 * MLX4_EN_WRAP_AROUND_SEC; u64 max_val_cycles_rounded = 1ULL << fls64(max_val_cycles - 1); /* calculate max possible multiplier in order to fit in 64bit */ u64 max_mul = div64_u64(ULLONG_MAX, max_val_cycles_rounded); diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index 07dced3c2b1c00eba190bf87c9ede784029c051f..164a13272faa2f6ca9e2317d746ba47edb3189bd 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c @@ -1916,7 +1916,6 @@ static int mlx4_en_get_ts_info(struct net_device *dev, if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS) { info->so_timestamping |= SOF_TIMESTAMPING_TX_HARDWARE | - SOF_TIMESTAMPING_TX_SOFTWARE | SOF_TIMESTAMPING_RX_HARDWARE | SOF_TIMESTAMPING_RAW_HARDWARE; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c index 5a2126679415c7125f56575ebdc6f3813fffb459..3e6bd27f6315d806c298cddfc5bf8a8ccd7db3d5 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c @@ -1916,8 +1916,8 @@ static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out, err = mlx5_cmd_invoke(dev, inb, outb, out, out_size, callback, context, pages_queue, token, force_polling); - if (callback && !err) - return 0; + if (callback) + return err; if (err > 0) /* Failed in FW, command didn't execute */ err = deliv_status_to_err(err); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index 9cf33ae48c216fc8876a64c9af5964c94f26752f..20a6bc1a234f4eae3080843c6069e774b75e8061 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h @@ -93,6 +93,8 @@ struct page_pool; #define MLX5_MPWRQ_DEF_LOG_STRIDE_SZ(mdev) \ MLX5_MPWRQ_LOG_STRIDE_SZ(mdev, order_base_2(MLX5E_RX_MAX_HEAD)) +#define MLX5_MPWRQ_MAX_LOG_WQE_SZ 18 + /* Keep in sync with mlx5e_mpwrq_log_wqe_sz. * These are theoretical maximums, which can be further restricted by * capabilities. These values are used for static resource allocations and diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/params.c b/drivers/net/ethernet/mellanox/mlx5/core/en/params.c index dcd5db907f1028ad7ab00e0b6780a6b95d0df5ba..775010e94cb7c66bb13f6792ac0045d51e47aa20 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/params.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/params.c @@ -9,9 +9,6 @@ #include #include -#define MLX5_MPWRQ_MAX_LOG_WQE_SZ 18 -#define MLX5_REP_MPWRQ_MAX_LOG_WQE_SZ 17 - static u8 mlx5e_mpwrq_min_page_shift(struct mlx5_core_dev *mdev) { u8 min_page_shift = MLX5_CAP_GEN_2(mdev, log_min_mkey_entity_size); @@ -105,22 +102,18 @@ u8 mlx5e_mpwrq_log_wqe_sz(struct mlx5_core_dev *mdev, u8 page_shift, enum mlx5e_mpwrq_umr_mode umr_mode) { u8 umr_entry_size = mlx5e_mpwrq_umr_entry_size(umr_mode); - u8 max_pages_per_wqe, max_log_wqe_size_calc; - u8 max_log_wqe_size_cap; + u8 max_pages_per_wqe, max_log_mpwqe_size; u16 max_wqe_size; /* Keep in sync with MLX5_MPWRQ_MAX_PAGES_PER_WQE. */ max_wqe_size = mlx5e_get_max_sq_aligned_wqebbs(mdev) * MLX5_SEND_WQE_BB; max_pages_per_wqe = ALIGN_DOWN(max_wqe_size - sizeof(struct mlx5e_umr_wqe), MLX5_UMR_FLEX_ALIGNMENT) / umr_entry_size; - max_log_wqe_size_calc = ilog2(max_pages_per_wqe) + page_shift; - - WARN_ON_ONCE(max_log_wqe_size_calc < MLX5E_ORDER2_MAX_PACKET_MTU); + max_log_mpwqe_size = ilog2(max_pages_per_wqe) + page_shift; - max_log_wqe_size_cap = mlx5_core_is_ecpf(mdev) ? - MLX5_REP_MPWRQ_MAX_LOG_WQE_SZ : MLX5_MPWRQ_MAX_LOG_WQE_SZ; + WARN_ON_ONCE(max_log_mpwqe_size < MLX5E_ORDER2_MAX_PACKET_MTU); - return min_t(u8, max_log_wqe_size_calc, max_log_wqe_size_cap); + return min_t(u8, max_log_mpwqe_size, MLX5_MPWRQ_MAX_LOG_WQE_SZ); } u8 mlx5e_mpwrq_pages_per_wqe(struct mlx5_core_dev *mdev, u8 page_shift, diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c index 5161bf51fa110c64838bef5765198468367913fa..463c23ae0ad1ecc7628a5f85642b9c25ca01f63a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c @@ -1093,7 +1093,7 @@ mlx5e_ipsec_build_accel_pol_attrs(struct mlx5e_ipsec_pol_entry *pol_entry, static int mlx5e_xfrm_add_policy(struct xfrm_policy *x, struct netlink_ext_ack *extack) { - struct net_device *netdev = x->xdo.dev; + struct net_device *netdev = x->xdo.real_dev; struct mlx5e_ipsec_pol_entry *pol_entry; struct mlx5e_priv *priv; int err; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 5c6f01abdcb91d4345e821c4ecc27187040e4a7e..d9dc7280302eb71f69ce3d904c2a2a7ed1893f6d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -3627,11 +3627,8 @@ static int mlx5e_setup_tc_mqprio(struct mlx5e_priv *priv, /* MQPRIO is another toplevel qdisc that can't be attached * simultaneously with the offloaded HTB. */ - if (mlx5e_selq_is_htb_enabled(&priv->selq)) { - NL_SET_ERR_MSG_MOD(mqprio->extack, - "MQPRIO cannot be configured when HTB offload is enabled."); - return -EOPNOTSUPP; - } + if (WARN_ON(mlx5e_selq_is_htb_enabled(&priv->selq))) + return -EINVAL; switch (mqprio->mode) { case TC_MQPRIO_MODE_DCB: diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index 851c499faa7954ccfcdd43ab94ffd610313d7e55..751d3ffcd2f6ce3237a691c55166b6dca44b6a38 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c @@ -63,7 +63,6 @@ #define MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE \ max(0x7, MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE) #define MLX5E_REP_PARAMS_DEF_NUM_CHANNELS 1 -#define MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE 0x8 static const char mlx5e_rep_driver_name[] = "mlx5e_rep"; @@ -799,8 +798,6 @@ static void mlx5e_build_rep_params(struct net_device *netdev) /* RQ */ mlx5e_build_rq_params(mdev, params); - if (!mlx5e_is_uplink_rep(priv) && mlx5_core_is_ecpf(mdev)) - params->log_rq_mtu_frames = MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE; /* If netdev is already registered (e.g. move from nic profile to uplink, * RTNL lock must be held before triggering netdev notifiers. @@ -832,8 +829,6 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev, netdev->ethtool_ops = &mlx5e_rep_ethtool_ops; netdev->watchdog_timeo = 15 * HZ; - if (mlx5_core_is_ecpf(mdev)) - netdev->tx_queue_len = 1 << MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE; #if IS_ENABLED(CONFIG_MLX5_CLS_ACT) netdev->hw_features |= NETIF_F_HW_TC; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c index d5731f7be04fd1e0348e5468f8cf47122acee4a4..57b0e26696e306f8fd78977cd04c5a9ce030c1e8 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c @@ -1159,9 +1159,8 @@ static void mlx5e_lro_update_tcp_hdr(struct mlx5_cqe64 *cqe, struct tcphdr *tcp) } } -static unsigned int mlx5e_lro_update_hdr(struct sk_buff *skb, - struct mlx5_cqe64 *cqe, - u32 cqe_bcnt) +static void mlx5e_lro_update_hdr(struct sk_buff *skb, struct mlx5_cqe64 *cqe, + u32 cqe_bcnt) { struct ethhdr *eth = (struct ethhdr *)(skb->data); struct tcphdr *tcp; @@ -1212,8 +1211,6 @@ static unsigned int mlx5e_lro_update_hdr(struct sk_buff *skb, tcp->check = csum_ipv6_magic(&ipv6->saddr, &ipv6->daddr, payload_len, IPPROTO_TCP, check); } - - return (unsigned int)((unsigned char *)tcp + tcp->doff * 4 - skb->data); } static void *mlx5e_shampo_get_packet_hd(struct mlx5e_rq *rq, u16 header_index) @@ -1570,9 +1567,8 @@ static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe, mlx5e_macsec_offload_handle_rx_skb(netdev, skb, cqe); if (lro_num_seg > 1) { - unsigned int hdrlen = mlx5e_lro_update_hdr(skb, cqe, cqe_bcnt); - - skb_shinfo(skb)->gso_size = DIV_ROUND_UP(cqe_bcnt - hdrlen, lro_num_seg); + mlx5e_lro_update_hdr(skb, cqe, cqe_bcnt); + skb_shinfo(skb)->gso_size = DIV_ROUND_UP(cqe_bcnt, lro_num_seg); /* Subtract one since we already counted this as one * "regular" packet in mlx5e_complete_rx_cqe() */ diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c b/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c index c170503b3aace1fc60788488b7a2b7e99959a435..08a75654f5f188ca96a04c3920416e3c9b0eab5f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c @@ -165,9 +165,6 @@ mlx5e_test_loopback_validate(struct sk_buff *skb, struct udphdr *udph; struct iphdr *iph; - if (skb_linearize(skb)) - goto out; - /* We are only going to peek, no need to clone the SKB */ if (MLX5E_TEST_PKT_SIZE - ETH_HLEN > skb_headlen(skb)) goto out; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index 2be9c69daad5fea29603f69f71dcfddf7707bff5..dc9b157a449935dc3f50cc4fa3b54879c37ecfd2 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c @@ -1915,8 +1915,9 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv, return err; } -static bool mlx5_flow_has_geneve_opt(struct mlx5_flow_spec *spec) +static bool mlx5_flow_has_geneve_opt(struct mlx5e_tc_flow *flow) { + struct mlx5_flow_spec *spec = &flow->attr->parse_attr->spec; void *headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters_3); @@ -1955,7 +1956,7 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv, } complete_all(&flow->del_hw_done); - if (mlx5_flow_has_geneve_opt(&attr->parse_attr->spec)) + if (mlx5_flow_has_geneve_opt(flow)) mlx5_geneve_tlv_option_del(priv->mdev->geneve); if (flow->decap_route) @@ -2455,13 +2456,12 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, err = mlx5e_tc_tun_parse(filter_dev, priv, tmp_spec, f, match_level); if (err) { + kvfree(tmp_spec); NL_SET_ERR_MSG_MOD(extack, "Failed to parse tunnel attributes"); netdev_warn(priv->netdev, "Failed to parse tunnel attributes"); - } else { - err = mlx5e_tc_set_attr_rx_tun(flow, tmp_spec); + return err; } - if (mlx5_flow_has_geneve_opt(tmp_spec)) - mlx5_geneve_tlv_option_del(priv->mdev->geneve); + err = mlx5e_tc_set_attr_rx_tun(flow, tmp_spec); kvfree(tmp_spec); if (err) return err; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c index 914b380fd3eeb5b95eea9ce24e5907423e61b702..f6022c135ec023200b06ee61a166a3a79f192e7a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c @@ -1295,15 +1295,12 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw, ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_ECPF, enabled_events); if (ret) goto ecpf_err; - } - - /* Enable ECVF vports */ - if (mlx5_core_ec_sriov_enabled(esw->dev)) { - ret = mlx5_eswitch_load_ec_vf_vports(esw, - esw->esw_funcs.num_ec_vfs, - enabled_events); - if (ret) - goto ec_vf_err; + if (mlx5_core_ec_sriov_enabled(esw->dev)) { + ret = mlx5_eswitch_load_ec_vf_vports(esw, esw->esw_funcs.num_ec_vfs, + enabled_events); + if (ret) + goto ec_vf_err; + } } /* Enable VF vports */ @@ -1334,11 +1331,9 @@ void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw) { mlx5_eswitch_unload_vf_vports(esw, esw->esw_funcs.num_vfs); - if (mlx5_core_ec_sriov_enabled(esw->dev)) - mlx5_eswitch_unload_ec_vf_vports(esw, - esw->esw_funcs.num_ec_vfs); - if (mlx5_ecpf_vport_exists(esw->dev)) { + if (mlx5_core_ec_sriov_enabled(esw->dev)) + mlx5_eswitch_unload_ec_vf_vports(esw, esw->esw_funcs.num_vfs); mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF); } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c index 86fb8197594f5e1fe185b1905fc0db2d0f259f71..326c72b3df86710cbbc482f195bd8bfa26d4c083 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c @@ -1170,19 +1170,19 @@ static void esw_set_peer_miss_rule_source_port(struct mlx5_eswitch *esw, static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw, struct mlx5_core_dev *peer_dev) { - struct mlx5_eswitch *peer_esw = peer_dev->priv.eswitch; struct mlx5_flow_destination dest = {}; struct mlx5_flow_act flow_act = {0}; struct mlx5_flow_handle **flows; + /* total vports is the same for both e-switches */ + int nvports = esw->total_vports; struct mlx5_flow_handle *flow; - struct mlx5_vport *peer_vport; struct mlx5_flow_spec *spec; + struct mlx5_vport *vport; int err, pfindex; unsigned long i; void *misc; - if (!MLX5_VPORT_MANAGER(peer_dev) && - !mlx5_core_is_ecpf_esw_manager(peer_dev)) + if (!MLX5_VPORT_MANAGER(esw->dev) && !mlx5_core_is_ecpf_esw_manager(esw->dev)) return 0; spec = kvzalloc(sizeof(*spec), GFP_KERNEL); @@ -1191,7 +1191,7 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw, peer_miss_rules_setup(esw, peer_dev, spec, &dest); - flows = kvcalloc(peer_esw->total_vports, sizeof(*flows), GFP_KERNEL); + flows = kvcalloc(nvports, sizeof(*flows), GFP_KERNEL); if (!flows) { err = -ENOMEM; goto alloc_flows_err; @@ -1201,10 +1201,10 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw, misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters); - if (mlx5_core_is_ecpf_esw_manager(peer_dev)) { - peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF); - esw_set_peer_miss_rule_source_port(esw, peer_esw, spec, - MLX5_VPORT_PF); + if (mlx5_core_is_ecpf_esw_manager(esw->dev)) { + vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_PF); + esw_set_peer_miss_rule_source_port(esw, peer_dev->priv.eswitch, + spec, MLX5_VPORT_PF); flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw), spec, &flow_act, &dest, 1); @@ -1212,11 +1212,11 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw, err = PTR_ERR(flow); goto add_pf_flow_err; } - flows[peer_vport->index] = flow; + flows[vport->index] = flow; } - if (mlx5_ecpf_vport_exists(peer_dev)) { - peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_ECPF); + if (mlx5_ecpf_vport_exists(esw->dev)) { + vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_ECPF); MLX5_SET(fte_match_set_misc, misc, source_port, MLX5_VPORT_ECPF); flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw), spec, &flow_act, &dest, 1); @@ -1224,14 +1224,13 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw, err = PTR_ERR(flow); goto add_ecpf_flow_err; } - flows[peer_vport->index] = flow; + flows[vport->index] = flow; } - mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport, - mlx5_core_max_vfs(peer_dev)) { + mlx5_esw_for_each_vf_vport(esw, i, vport, mlx5_core_max_vfs(esw->dev)) { esw_set_peer_miss_rule_source_port(esw, - peer_esw, - spec, peer_vport->vport); + peer_dev->priv.eswitch, + spec, vport->vport); flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw), spec, &flow_act, &dest, 1); @@ -1239,22 +1238,22 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw, err = PTR_ERR(flow); goto add_vf_flow_err; } - flows[peer_vport->index] = flow; + flows[vport->index] = flow; } - if (mlx5_core_ec_sriov_enabled(peer_dev)) { - mlx5_esw_for_each_ec_vf_vport(peer_esw, i, peer_vport, - mlx5_core_max_ec_vfs(peer_dev)) { - esw_set_peer_miss_rule_source_port(esw, peer_esw, - spec, - peer_vport->vport); + if (mlx5_core_ec_sriov_enabled(esw->dev)) { + mlx5_esw_for_each_ec_vf_vport(esw, i, vport, mlx5_core_max_ec_vfs(esw->dev)) { + if (i >= mlx5_core_max_ec_vfs(peer_dev)) + break; + esw_set_peer_miss_rule_source_port(esw, peer_dev->priv.eswitch, + spec, vport->vport); flow = mlx5_add_flow_rules(esw->fdb_table.offloads.slow_fdb, spec, &flow_act, &dest, 1); if (IS_ERR(flow)) { err = PTR_ERR(flow); goto add_ec_vf_flow_err; } - flows[peer_vport->index] = flow; + flows[vport->index] = flow; } } @@ -1271,27 +1270,25 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw, return 0; add_ec_vf_flow_err: - mlx5_esw_for_each_ec_vf_vport(peer_esw, i, peer_vport, - mlx5_core_max_ec_vfs(peer_dev)) { - if (!flows[peer_vport->index]) + mlx5_esw_for_each_ec_vf_vport(esw, i, vport, mlx5_core_max_ec_vfs(esw->dev)) { + if (!flows[vport->index]) continue; - mlx5_del_flow_rules(flows[peer_vport->index]); + mlx5_del_flow_rules(flows[vport->index]); } add_vf_flow_err: - mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport, - mlx5_core_max_vfs(peer_dev)) { - if (!flows[peer_vport->index]) + mlx5_esw_for_each_vf_vport(esw, i, vport, mlx5_core_max_vfs(esw->dev)) { + if (!flows[vport->index]) continue; - mlx5_del_flow_rules(flows[peer_vport->index]); + mlx5_del_flow_rules(flows[vport->index]); } - if (mlx5_ecpf_vport_exists(peer_dev)) { - peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_ECPF); - mlx5_del_flow_rules(flows[peer_vport->index]); + if (mlx5_ecpf_vport_exists(esw->dev)) { + vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_ECPF); + mlx5_del_flow_rules(flows[vport->index]); } add_ecpf_flow_err: - if (mlx5_core_is_ecpf_esw_manager(peer_dev)) { - peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF); - mlx5_del_flow_rules(flows[peer_vport->index]); + if (mlx5_core_is_ecpf_esw_manager(esw->dev)) { + vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_PF); + mlx5_del_flow_rules(flows[vport->index]); } add_pf_flow_err: esw_warn(esw->dev, "FDB: Failed to add peer miss flow rule err %d\n", err); @@ -1304,34 +1301,37 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw, static void esw_del_fdb_peer_miss_rules(struct mlx5_eswitch *esw, struct mlx5_core_dev *peer_dev) { - struct mlx5_eswitch *peer_esw = peer_dev->priv.eswitch; u16 peer_index = mlx5_get_dev_index(peer_dev); struct mlx5_flow_handle **flows; - struct mlx5_vport *peer_vport; + struct mlx5_vport *vport; unsigned long i; flows = esw->fdb_table.offloads.peer_miss_rules[peer_index]; if (!flows) return; - if (mlx5_core_ec_sriov_enabled(peer_dev)) { - mlx5_esw_for_each_ec_vf_vport(peer_esw, i, peer_vport, - mlx5_core_max_ec_vfs(peer_dev)) - mlx5_del_flow_rules(flows[peer_vport->index]); + if (mlx5_core_ec_sriov_enabled(esw->dev)) { + mlx5_esw_for_each_ec_vf_vport(esw, i, vport, mlx5_core_max_ec_vfs(esw->dev)) { + /* The flow for a particular vport could be NULL if the other ECPF + * has fewer or no VFs enabled + */ + if (!flows[vport->index]) + continue; + mlx5_del_flow_rules(flows[vport->index]); + } } - mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport, - mlx5_core_max_vfs(peer_dev)) - mlx5_del_flow_rules(flows[peer_vport->index]); + mlx5_esw_for_each_vf_vport(esw, i, vport, mlx5_core_max_vfs(esw->dev)) + mlx5_del_flow_rules(flows[vport->index]); - if (mlx5_ecpf_vport_exists(peer_dev)) { - peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_ECPF); - mlx5_del_flow_rules(flows[peer_vport->index]); + if (mlx5_ecpf_vport_exists(esw->dev)) { + vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_ECPF); + mlx5_del_flow_rules(flows[vport->index]); } - if (mlx5_core_is_ecpf_esw_manager(peer_dev)) { - peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF); - mlx5_del_flow_rules(flows[peer_vport->index]); + if (mlx5_core_is_ecpf_esw_manager(esw->dev)) { + vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_PF); + mlx5_del_flow_rules(flows[vport->index]); } kvfree(flows); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c index 5f35a6fc030544f9409666abb3d7f85dffb0a45d..d2dc375f5e49cb51d5507d650d7fe238970e0791 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c @@ -1984,7 +1984,6 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft, struct mlx5_flow_handle *rule; struct match_list *iter; bool take_write = false; - bool try_again = false; struct fs_fte *fte; u64 version = 0; int err; @@ -2044,7 +2043,6 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft, nested_down_write_ref_node(&g->node, FS_LOCK_PARENT); if (!g->node.active) { - try_again = true; up_write_ref_node(&g->node, false); continue; } @@ -2066,8 +2064,7 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft, tree_put_node(&fte->node, false); return rule; } - err = try_again ? -EAGAIN : -ENOENT; - rule = ERR_PTR(err); + rule = ERR_PTR(-ENOENT); out: kmem_cache_free(steering->ftes_cache, fte); return rule; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index 32fa789a696056f5e83f98ba09b07b7a889626e9..96136229b1b0709ac70c88aa2bc0980ca5a21346 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c @@ -2206,7 +2206,6 @@ static const struct pci_device_id mlx5_core_pci_table[] = { { PCI_VDEVICE(MELLANOX, 0x1021) }, /* ConnectX-7 */ { PCI_VDEVICE(MELLANOX, 0x1023) }, /* ConnectX-8 */ { PCI_VDEVICE(MELLANOX, 0x1025) }, /* ConnectX-9 */ - { PCI_VDEVICE(MELLANOX, 0x1027) }, /* ConnectX-10 */ { PCI_VDEVICE(MELLANOX, 0xa2d2) }, /* BlueField integrated ConnectX-5 network controller */ { PCI_VDEVICE(MELLANOX, 0xa2d3), MLX5_PCI_DEV_IS_VF}, /* BlueField integrated ConnectX-5 network controller VF */ { PCI_VDEVICE(MELLANOX, 0xa2d6) }, /* BlueField-2 integrated ConnectX-6 Dx network controller */ diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c index e0581c6f9cecd5cba768bed9a1dfb56df8393e49..dcf58efac159cf7286fd11483330c6750e290a19 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c @@ -291,7 +291,7 @@ static void free_4k(struct mlx5_core_dev *dev, u64 addr, u32 function) static int alloc_system_page(struct mlx5_core_dev *dev, u32 function) { struct device *device = mlx5_core_dma_dev(dev); - int nid = dev->priv.numa_node; + int nid = dev_to_node(device); struct page *page; u64 zero_addr = 1; u64 addr; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/vport.c b/drivers/net/ethernet/mellanox/mlx5/core/vport.c index 06b5265b6e6db2a2e308c34c62b36c4a404f8210..21753f32786850bd010bded5a13db6eb83fa3ade 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/vport.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/vport.c @@ -444,22 +444,19 @@ int mlx5_query_nic_vport_node_guid(struct mlx5_core_dev *mdev, u64 *node_guid) { u32 *out; int outlen = MLX5_ST_SZ_BYTES(query_nic_vport_context_out); - int err; out = kvzalloc(outlen, GFP_KERNEL); if (!out) return -ENOMEM; - err = mlx5_query_nic_vport_context(mdev, 0, out); - if (err) - goto out; + mlx5_query_nic_vport_context(mdev, 0, out); *node_guid = MLX5_GET64(query_nic_vport_context_out, out, nic_vport_context.node_guid); -out: + kvfree(out); - return err; + return 0; } EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_node_guid); @@ -501,22 +498,19 @@ int mlx5_query_nic_vport_qkey_viol_cntr(struct mlx5_core_dev *mdev, { u32 *out; int outlen = MLX5_ST_SZ_BYTES(query_nic_vport_context_out); - int err; out = kvzalloc(outlen, GFP_KERNEL); if (!out) return -ENOMEM; - err = mlx5_query_nic_vport_context(mdev, 0, out); - if (err) - goto out; + mlx5_query_nic_vport_context(mdev, 0, out); *qkey_viol_cntr = MLX5_GET(query_nic_vport_context_out, out, nic_vport_context.qkey_violation_counter); -out: + kvfree(out); - return err; + return 0; } EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_qkey_viol_cntr); diff --git a/drivers/net/ethernet/microchip/lan743x_ethtool.c b/drivers/net/ethernet/microchip/lan743x_ethtool.c index 39a58c3578a028f747c8e578238a3ee709b63e17..72b3092d35f712f1088994c2cb5ea72fab64c9b4 100644 --- a/drivers/net/ethernet/microchip/lan743x_ethtool.c +++ b/drivers/net/ethernet/microchip/lan743x_ethtool.c @@ -18,8 +18,6 @@ #define EEPROM_MAC_OFFSET (0x01) #define MAX_EEPROM_SIZE (512) #define MAX_OTP_SIZE (1024) -#define MAX_HS_OTP_SIZE (8 * 1024) -#define MAX_HS_EEPROM_SIZE (64 * 1024) #define OTP_INDICATOR_1 (0xF3) #define OTP_INDICATOR_2 (0xF7) @@ -274,9 +272,6 @@ static int lan743x_hs_otp_read(struct lan743x_adapter *adapter, u32 offset, int ret; int i; - if (offset + length > MAX_HS_OTP_SIZE) - return -EINVAL; - ret = lan743x_hs_syslock_acquire(adapter, LOCK_TIMEOUT_MAX_CNT); if (ret < 0) return ret; @@ -325,9 +320,6 @@ static int lan743x_hs_otp_write(struct lan743x_adapter *adapter, u32 offset, int ret; int i; - if (offset + length > MAX_HS_OTP_SIZE) - return -EINVAL; - ret = lan743x_hs_syslock_acquire(adapter, LOCK_TIMEOUT_MAX_CNT); if (ret < 0) return ret; @@ -505,9 +497,6 @@ static int lan743x_hs_eeprom_read(struct lan743x_adapter *adapter, u32 val; int i; - if (offset + length > MAX_HS_EEPROM_SIZE) - return -EINVAL; - retval = lan743x_hs_syslock_acquire(adapter, LOCK_TIMEOUT_MAX_CNT); if (retval < 0) return retval; @@ -550,9 +539,6 @@ static int lan743x_hs_eeprom_write(struct lan743x_adapter *adapter, u32 val; int i; - if (offset + length > MAX_HS_EEPROM_SIZE) - return -EINVAL; - retval = lan743x_hs_syslock_acquire(adapter, LOCK_TIMEOUT_MAX_CNT); if (retval < 0) return retval; @@ -618,9 +604,9 @@ static int lan743x_ethtool_get_eeprom_len(struct net_device *netdev) struct lan743x_adapter *adapter = netdev_priv(netdev); if (adapter->flags & LAN743X_ADAPTER_FLAG_OTP) - return adapter->is_pci11x1x ? MAX_HS_OTP_SIZE : MAX_OTP_SIZE; + return MAX_OTP_SIZE; - return adapter->is_pci11x1x ? MAX_HS_EEPROM_SIZE : MAX_EEPROM_SIZE; + return MAX_EEPROM_SIZE; } static int lan743x_ethtool_get_eeprom(struct net_device *netdev, diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c index 781440d5756f34a7a6776724bc866cf79272e900..5d2ceff72784f23d4af0a57b0a80900a2b631c69 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -1373,7 +1373,7 @@ static int lan743x_mac_set_mtu(struct lan743x_adapter *adapter, int new_mtu) } /* PHY */ -static int lan743x_hw_reset_phy(struct lan743x_adapter *adapter) +static int lan743x_phy_reset(struct lan743x_adapter *adapter) { u32 data; @@ -1407,7 +1407,7 @@ static void lan743x_phy_update_flowcontrol(struct lan743x_adapter *adapter, static int lan743x_phy_init(struct lan743x_adapter *adapter) { - return lan743x_hw_reset_phy(adapter); + return lan743x_phy_reset(adapter); } static void lan743x_phy_link_status_change(struct net_device *netdev) @@ -3259,7 +3259,6 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter, struct pci_dev *pdev) { struct lan743x_tx *tx; - u32 sgmii_ctl; int index; int ret; @@ -3272,15 +3271,6 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter, spin_lock_init(&adapter->eth_syslock_spinlock); mutex_init(&adapter->sgmii_rw_lock); pci11x1x_set_rfe_rd_fifo_threshold(adapter); - sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL); - if (adapter->is_sgmii_en) { - sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_; - sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_; - } else { - sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_; - sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_; - } - lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl); } else { adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS; adapter->used_tx_channels = LAN743X_USED_TX_CHANNELS; @@ -3329,6 +3319,7 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter, static int lan743x_mdiobus_init(struct lan743x_adapter *adapter) { + u32 sgmii_ctl; int ret; adapter->mdiobus = devm_mdiobus_alloc(&adapter->pdev->dev); @@ -3340,6 +3331,10 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter) adapter->mdiobus->priv = (void *)adapter; if (adapter->is_pci11x1x) { if (adapter->is_sgmii_en) { + sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL); + sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_; + sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_; + lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl); netif_dbg(adapter, drv, adapter->netdev, "SGMII operation\n"); adapter->mdiobus->read = lan743x_mdiobus_read_c22; @@ -3350,6 +3345,10 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter) netif_dbg(adapter, drv, adapter->netdev, "lan743x-mdiobus-c45\n"); } else { + sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL); + sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_; + sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_; + lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl); netif_dbg(adapter, drv, adapter->netdev, "RGMII operation\n"); // Only C22 support when RGMII I/F diff --git a/drivers/net/ethernet/microchip/lan743x_ptp.c b/drivers/net/ethernet/microchip/lan743x_ptp.c index 47f2531198f62af0da3e654bda645b11bc03f162..39e1066ecd5ff0e80792547ab7569a62c647e37e 100644 --- a/drivers/net/ethernet/microchip/lan743x_ptp.c +++ b/drivers/net/ethernet/microchip/lan743x_ptp.c @@ -58,7 +58,7 @@ int lan743x_gpio_init(struct lan743x_adapter *adapter) static void lan743x_ptp_wait_till_cmd_done(struct lan743x_adapter *adapter, u32 bit_mask) { - int timeout = PTP_CMD_CTL_TIMEOUT_CNT; + int timeout = 1000; u32 data = 0; while (timeout && diff --git a/drivers/net/ethernet/microchip/lan743x_ptp.h b/drivers/net/ethernet/microchip/lan743x_ptp.h index 225e8232474d73957e4caed9f75a72c6dd82483a..e26d4eff713361eceadbd169bdc664339d7b66da 100644 --- a/drivers/net/ethernet/microchip/lan743x_ptp.h +++ b/drivers/net/ethernet/microchip/lan743x_ptp.h @@ -18,10 +18,9 @@ */ #define LAN743X_PTP_N_EVENT_CHAN 2 #define LAN743X_PTP_N_PEROUT LAN743X_PTP_N_EVENT_CHAN -#define PCI11X1X_PTP_IO_MAX_CHANNELS 8 -#define LAN743X_PTP_N_EXTTS PCI11X1X_PTP_IO_MAX_CHANNELS +#define LAN743X_PTP_N_EXTTS 4 #define LAN743X_PTP_N_PPS 0 -#define PTP_CMD_CTL_TIMEOUT_CNT 50 +#define PCI11X1X_PTP_IO_MAX_CHANNELS 8 struct lan743x_adapter; diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_main.c b/drivers/net/ethernet/microchip/lan966x/lan966x_main.c index b424e75fd40c46e3d0dbd6e2a3981a7be738d801..c3f6c10bc23936e549c471b0c49e748c7a96e47c 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_main.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_main.c @@ -353,11 +353,6 @@ static void lan966x_ifh_set_rew_op(void *ifh, u64 rew_op) lan966x_ifh_set(ifh, rew_op, IFH_POS_REW_CMD, IFH_WID_REW_CMD); } -static void lan966x_ifh_set_oam_type(void *ifh, u64 oam_type) -{ - lan966x_ifh_set(ifh, oam_type, IFH_POS_PDU_TYPE, IFH_WID_PDU_TYPE); -} - static void lan966x_ifh_set_timestamp(void *ifh, u64 timestamp) { lan966x_ifh_set(ifh, timestamp, IFH_POS_TIMESTAMP, IFH_WID_TIMESTAMP); @@ -385,7 +380,6 @@ static netdev_tx_t lan966x_port_xmit(struct sk_buff *skb, return err; lan966x_ifh_set_rew_op(ifh, LAN966X_SKB_CB(skb)->rew_op); - lan966x_ifh_set_oam_type(ifh, LAN966X_SKB_CB(skb)->pdu_type); lan966x_ifh_set_timestamp(ifh, LAN966X_SKB_CB(skb)->ts_id); } @@ -881,7 +875,6 @@ static int lan966x_probe_port(struct lan966x *lan966x, u32 p, lan966x_vlan_port_set_vlan_aware(port, 0); lan966x_vlan_port_set_vid(port, HOST_PVID, false, false); lan966x_vlan_port_apply(port); - lan966x_vlan_port_rew_host(port); return 0; } diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_main.h b/drivers/net/ethernet/microchip/lan966x/lan966x_main.h index 5a16d76eb000d64df5e1a95a846f460f0dce9ae3..caa9e0533c96b3c31d956ee3f01eb7e59bab591c 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_main.h +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_main.h @@ -74,10 +74,6 @@ #define IFH_REW_OP_ONE_STEP_PTP 0x3 #define IFH_REW_OP_TWO_STEP_PTP 0x4 -#define IFH_PDU_TYPE_NONE 0 -#define IFH_PDU_TYPE_IPV4 7 -#define IFH_PDU_TYPE_IPV6 8 - #define FDMA_RX_DCB_MAX_DBS 1 #define FDMA_TX_DCB_MAX_DBS 1 #define FDMA_DCB_INFO_DATAL(x) ((x) & GENMASK(15, 0)) @@ -310,7 +306,6 @@ struct lan966x_phc { struct lan966x_skb_cb { u8 rew_op; - u8 pdu_type; u16 ts_id; unsigned long jiffies; }; @@ -549,7 +544,6 @@ void lan966x_vlan_port_apply(struct lan966x_port *port); bool lan966x_vlan_cpu_member_cpu_vlan_mask(struct lan966x *lan966x, u16 vid); void lan966x_vlan_port_set_vlan_aware(struct lan966x_port *port, bool vlan_aware); -void lan966x_vlan_port_rew_host(struct lan966x_port *port); int lan966x_vlan_port_set_vid(struct lan966x_port *port, u16 vid, bool pvid, diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c b/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c index 87e5e81d40dc68674f784dc8316533d8a0e1011d..63905bb5a63a838516f394ca051a00202c9a82a7 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c @@ -322,55 +322,34 @@ void lan966x_ptp_hwtstamp_get(struct lan966x_port *port, *cfg = phc->hwtstamp_config; } -static void lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb, - u8 *rew_op, u8 *pdu_type) +static int lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb) { struct ptp_header *header; u8 msgtype; int type; - if (port->ptp_tx_cmd == IFH_REW_OP_NOOP) { - *rew_op = IFH_REW_OP_NOOP; - *pdu_type = IFH_PDU_TYPE_NONE; - return; - } + if (port->ptp_tx_cmd == IFH_REW_OP_NOOP) + return IFH_REW_OP_NOOP; type = ptp_classify_raw(skb); - if (type == PTP_CLASS_NONE) { - *rew_op = IFH_REW_OP_NOOP; - *pdu_type = IFH_PDU_TYPE_NONE; - return; - } + if (type == PTP_CLASS_NONE) + return IFH_REW_OP_NOOP; header = ptp_parse_header(skb, type); - if (!header) { - *rew_op = IFH_REW_OP_NOOP; - *pdu_type = IFH_PDU_TYPE_NONE; - return; - } + if (!header) + return IFH_REW_OP_NOOP; - if (type & PTP_CLASS_L2) - *pdu_type = IFH_PDU_TYPE_NONE; - if (type & PTP_CLASS_IPV4) - *pdu_type = IFH_PDU_TYPE_IPV4; - if (type & PTP_CLASS_IPV6) - *pdu_type = IFH_PDU_TYPE_IPV6; - - if (port->ptp_tx_cmd == IFH_REW_OP_TWO_STEP_PTP) { - *rew_op = IFH_REW_OP_TWO_STEP_PTP; - return; - } + if (port->ptp_tx_cmd == IFH_REW_OP_TWO_STEP_PTP) + return IFH_REW_OP_TWO_STEP_PTP; /* If it is sync and run 1 step then set the correct operation, * otherwise run as 2 step */ msgtype = ptp_get_msgtype(header, type); - if ((msgtype & 0xf) == 0) { - *rew_op = IFH_REW_OP_ONE_STEP_PTP; - return; - } + if ((msgtype & 0xf) == 0) + return IFH_REW_OP_ONE_STEP_PTP; - *rew_op = IFH_REW_OP_TWO_STEP_PTP; + return IFH_REW_OP_TWO_STEP_PTP; } static void lan966x_ptp_txtstamp_old_release(struct lan966x_port *port) @@ -395,12 +374,10 @@ int lan966x_ptp_txtstamp_request(struct lan966x_port *port, { struct lan966x *lan966x = port->lan966x; unsigned long flags; - u8 pdu_type; u8 rew_op; - lan966x_ptp_classify(port, skb, &rew_op, &pdu_type); + rew_op = lan966x_ptp_classify(port, skb); LAN966X_SKB_CB(skb)->rew_op = rew_op; - LAN966X_SKB_CB(skb)->pdu_type = pdu_type; if (rew_op != IFH_REW_OP_TWO_STEP_PTP) return 0; diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c b/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c index bcb4db76b75cd5c39559f7db7e579d1bf709068d..1c88120eb291a2bc8efc7982c09af4fab5975c0e 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c @@ -297,7 +297,6 @@ static void lan966x_port_bridge_leave(struct lan966x_port *port, lan966x_vlan_port_set_vlan_aware(port, false); lan966x_vlan_port_set_vid(port, HOST_PVID, false, false); lan966x_vlan_port_apply(port); - lan966x_vlan_port_rew_host(port); } int lan966x_port_changeupper(struct net_device *dev, diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_vlan.c b/drivers/net/ethernet/microchip/lan966x/lan966x_vlan.c index ffb245fb7d678639710defac3c7e74e68c00d0c8..3c44660128daedada078e565419542dce2f5bd8e 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_vlan.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_vlan.c @@ -149,27 +149,6 @@ void lan966x_vlan_port_set_vlan_aware(struct lan966x_port *port, port->vlan_aware = vlan_aware; } -/* When the interface is in host mode, the interface should not be vlan aware - * but it should insert all the tags that it gets from the network stack. - * The tags are not in the data of the frame but actually in the skb and the ifh - * is configured already to get this tag. So what we need to do is to update the - * rewriter to insert the vlan tag for all frames which have a vlan tag - * different than 0. - */ -void lan966x_vlan_port_rew_host(struct lan966x_port *port) -{ - struct lan966x *lan966x = port->lan966x; - u32 val; - - /* Tag all frames except when VID=0*/ - val = REW_TAG_CFG_TAG_CFG_SET(2); - - /* Update only some bits in the register */ - lan_rmw(val, - REW_TAG_CFG_TAG_CFG, - lan966x, REW_TAG_CFG(port->chip_port)); -} - void lan966x_vlan_port_apply(struct lan966x_port *port) { struct lan966x *lan966x = port->lan966x; diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c index d3c9a3020fbf6eeab2c2a0ea808de6d454d7b003..ae014e21eb6056199a6fb952aa074c0e6cbbe406 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c @@ -28,9 +28,6 @@ static void mana_gd_init_pf_regs(struct pci_dev *pdev) gc->db_page_base = gc->bar0_va + mana_gd_r64(gc, GDMA_PF_REG_DB_PAGE_OFF); - gc->phys_db_page_base = gc->bar0_pa + - mana_gd_r64(gc, GDMA_PF_REG_DB_PAGE_OFF); - sriov_base_off = mana_gd_r64(gc, GDMA_SRIOV_REG_CFG_BASE_OFF); sriov_base_va = gc->bar0_va + sriov_base_off; @@ -1039,7 +1036,7 @@ static u32 mana_gd_write_client_oob(const struct gdma_wqe_request *wqe_req, header->inline_oob_size_div4 = client_oob_size / sizeof(u32); if (oob_in_sgl) { - WARN_ON_ONCE(wqe_req->num_sge < 2); + WARN_ON_ONCE(!pad_data || wqe_req->num_sge < 2); header->client_oob_in_sgl = 1; diff --git a/drivers/net/ethernet/pensando/ionic/ionic_main.c b/drivers/net/ethernet/pensando/ionic/ionic_main.c index 2869922cffe2e14a0b48ca387ee2dff6730d3bdf..3ca6893d1bf26afef3614b5f05b0aede7402afd1 100644 --- a/drivers/net/ethernet/pensando/ionic/ionic_main.c +++ b/drivers/net/ethernet/pensando/ionic/ionic_main.c @@ -464,9 +464,9 @@ static int __ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds, unsigned long start_time; unsigned long max_wait; unsigned long duration; + int done = 0; bool fw_up; int opcode; - bool done; int err; /* Wait for dev cmd to complete, retrying if we get EAGAIN, @@ -474,7 +474,6 @@ static int __ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds, */ max_wait = jiffies + (max_seconds * HZ); try_again: - done = false; opcode = idev->opcode; start_time = jiffies; for (fw_up = ionic_is_fw_running(idev); diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c index 5af932a5e70c449a958b576d7d493f5cc4bc5f7e..7e5258b2c4290b5d2534e207648f7e04e5ad9a3b 100644 --- a/drivers/net/ethernet/realtek/r8169_main.c +++ b/drivers/net/ethernet/realtek/r8169_main.c @@ -5125,7 +5125,6 @@ static int r8169_mdio_register(struct rtl8169_private *tp) new_bus->priv = tp; new_bus->parent = &pdev->dev; new_bus->irq[0] = PHY_MAC_INTERRUPT; - new_bus->phy_mask = GENMASK(31, 1); snprintf(new_bus->id, MII_BUS_ID_SIZE, "r8169-%x-%x", pci_domain_nr(pdev->bus), pci_dev_id(pdev)); diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c index 9377b05bfc71e1fe515a5141f7f9ced1ee58414a..63998d65fef8eb2696dda0c9f32ef4a64a8dd7db 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c @@ -966,7 +966,7 @@ static int sun8i_dwmac_set_syscon(struct device *dev, /* of_mdio_parse_addr returns a valid (0 ~ 31) PHY * address. No need to mask it again. */ - reg |= ret << H3_EPHY_ADDR_SHIFT; + reg |= 1 << H3_EPHY_ADDR_SHIFT; } else { /* For SoCs without internal PHY the PHY selection bit should be * set to 0 (external PHY). diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c index 05ea74e9379399fdcf255275f1f43a90c59016ab..dd2ab6185c40e813ee4401857875d3e8478303e7 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c @@ -364,17 +364,19 @@ static int dwxgmac2_dma_interrupt(struct stmmac_priv *priv, } /* TX/RX NORMAL interrupts */ - if (likely(intr_status & XGMAC_RI)) { - u64_stats_update_begin(&stats->syncp); - u64_stats_inc(&stats->rx_normal_irq_n[chan]); - u64_stats_update_end(&stats->syncp); - ret |= handle_rx; - } - if (likely(intr_status & (XGMAC_TI | XGMAC_TBU))) { - u64_stats_update_begin(&stats->syncp); - u64_stats_inc(&stats->tx_normal_irq_n[chan]); - u64_stats_update_end(&stats->syncp); - ret |= handle_tx; + if (likely(intr_status & XGMAC_NIS)) { + if (likely(intr_status & XGMAC_RI)) { + u64_stats_update_begin(&stats->syncp); + u64_stats_inc(&stats->rx_normal_irq_n[chan]); + u64_stats_update_end(&stats->syncp); + ret |= handle_rx; + } + if (likely(intr_status & (XGMAC_TI | XGMAC_TBU))) { + u64_stats_update_begin(&stats->syncp); + u64_stats_inc(&stats->tx_normal_irq_n[chan]); + u64_stats_update_end(&stats->syncp); + ret |= handle_tx; + } } /* Clear interrupts */ diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 7bb530ab09e315db866eac0a5219bbbf304bae42..902d4c8da48db022a13437f46dac37bbe292553f 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -842,11 +842,6 @@ int stmmac_init_tstamp_counter(struct stmmac_priv *priv, u32 systime_flags) if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp)) return -EOPNOTSUPP; - if (!priv->plat->clk_ptp_rate) { - netdev_err(priv->dev, "Invalid PTP clock rate"); - return -EINVAL; - } - stmmac_config_hw_tstamping(priv, priv->ptpaddr, systime_flags); priv->systime_flags = systime_flags; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 6c684f6ee84be9e25858c4f5d069e23133d888b7..4d570efd9d4bbec7db8405529c8c1fe918657887 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -419,7 +419,6 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) struct device_node *np = pdev->dev.of_node; struct plat_stmmacenet_data *plat; struct stmmac_dma_cfg *dma_cfg; - static int bus_id = -ENODEV; int phy_mode; void *ret; int rc; @@ -455,14 +454,8 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) of_property_read_u32(np, "max-speed", &plat->max_speed); plat->bus_id = of_alias_get_id(np, "ethernet"); - if (plat->bus_id < 0) { - if (bus_id < 0) - bus_id = of_alias_get_highest_id("ethernet"); - /* No ethernet alias found, init at -1 so first bus_id is 0 */ - if (bus_id < 0) - bus_id = -1; - plat->bus_id = ++bus_id; - } + if (plat->bus_id < 0) + plat->bus_id = 0; /* Default to phy auto-detection */ plat->phy_addr = -1; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c index 80ecbd73333d9cece770d7fa31825672eb31529f..a04bb2e42c4ee15050049a2eb38c0c2831ade483 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c @@ -295,7 +295,7 @@ void stmmac_ptp_register(struct stmmac_priv *priv) /* Calculate the clock domain crossing (CDC) error if necessary */ priv->plat->cdc_error_adj = 0; - if (priv->plat->has_gmac4) + if (priv->plat->has_gmac4 && priv->plat->clk_ptp_rate) priv->plat->cdc_error_adj = (2 * NSEC_PER_SEC) / priv->plat->clk_ptp_rate; stmmac_ptp_clock_ops.n_per_out = priv->dma_cap.pps_out_num; diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c index fc6217917fc22b8453b2fd40596eb39628c1ac0e..011d74087f860dfa40d21d456fe770ea462a0af1 100644 --- a/drivers/net/ethernet/sun/niu.c +++ b/drivers/net/ethernet/sun/niu.c @@ -3336,7 +3336,7 @@ static int niu_rbr_add_page(struct niu *np, struct rx_ring_info *rp, addr = np->ops->map_page(np->device, page, 0, PAGE_SIZE, DMA_FROM_DEVICE); - if (np->ops->mapping_error(np->device, addr)) { + if (!addr) { __free_page(page); return -ENOMEM; } @@ -6672,8 +6672,6 @@ static netdev_tx_t niu_start_xmit(struct sk_buff *skb, len = skb_headlen(skb); mapping = np->ops->map_single(np->device, skb->data, len, DMA_TO_DEVICE); - if (np->ops->mapping_error(np->device, mapping)) - goto out_drop; prod = rp->prod; @@ -6715,8 +6713,6 @@ static netdev_tx_t niu_start_xmit(struct sk_buff *skb, mapping = np->ops->map_page(np->device, skb_frag_page(frag), skb_frag_off(frag), len, DMA_TO_DEVICE); - if (np->ops->mapping_error(np->device, mapping)) - goto out_unmap; rp->tx_buffs[prod].skb = NULL; rp->tx_buffs[prod].mapping = mapping; @@ -6741,19 +6737,6 @@ static netdev_tx_t niu_start_xmit(struct sk_buff *skb, out: return NETDEV_TX_OK; -out_unmap: - while (i--) { - const skb_frag_t *frag; - - prod = PREVIOUS_TX(rp, prod); - frag = &skb_shinfo(skb)->frags[i]; - np->ops->unmap_page(np->device, rp->tx_buffs[prod].mapping, - skb_frag_size(frag), DMA_TO_DEVICE); - } - - np->ops->unmap_single(np->device, rp->tx_buffs[rp->prod].mapping, - skb_headlen(skb), DMA_TO_DEVICE); - out_drop: rp->tx_errors++; kfree_skb(skb); @@ -9653,11 +9636,6 @@ static void niu_pci_unmap_single(struct device *dev, u64 dma_address, dma_unmap_single(dev, dma_address, size, direction); } -static int niu_pci_mapping_error(struct device *dev, u64 addr) -{ - return dma_mapping_error(dev, addr); -} - static const struct niu_ops niu_pci_ops = { .alloc_coherent = niu_pci_alloc_coherent, .free_coherent = niu_pci_free_coherent, @@ -9665,7 +9643,6 @@ static const struct niu_ops niu_pci_ops = { .unmap_page = niu_pci_unmap_page, .map_single = niu_pci_map_single, .unmap_single = niu_pci_unmap_single, - .mapping_error = niu_pci_mapping_error, }; static void niu_driver_version(void) @@ -10032,11 +10009,6 @@ static void niu_phys_unmap_single(struct device *dev, u64 dma_address, /* Nothing to do. */ } -static int niu_phys_mapping_error(struct device *dev, u64 dma_address) -{ - return false; -} - static const struct niu_ops niu_phys_ops = { .alloc_coherent = niu_phys_alloc_coherent, .free_coherent = niu_phys_free_coherent, @@ -10044,7 +10016,6 @@ static const struct niu_ops niu_phys_ops = { .unmap_page = niu_phys_unmap_page, .map_single = niu_phys_map_single, .unmap_single = niu_phys_unmap_single, - .mapping_error = niu_phys_mapping_error, }; static int niu_of_probe(struct platform_device *op) diff --git a/drivers/net/ethernet/sun/niu.h b/drivers/net/ethernet/sun/niu.h index 0b169c08b0f2d1001a9f56bad4fae24debe9c330..04c215f91fc08e004c4781feb646d7cd4b1e8f83 100644 --- a/drivers/net/ethernet/sun/niu.h +++ b/drivers/net/ethernet/sun/niu.h @@ -2879,9 +2879,6 @@ struct tx_ring_info { #define NEXT_TX(tp, index) \ (((index) + 1) < (tp)->pending ? ((index) + 1) : 0) -#define PREVIOUS_TX(tp, index) \ - (((index) - 1) >= 0 ? ((index) - 1) : (((tp)->pending) - 1)) - static inline u32 niu_tx_avail(struct tx_ring_info *tp) { return (tp->pending - @@ -3143,7 +3140,6 @@ struct niu_ops { enum dma_data_direction direction); void (*unmap_single)(struct device *dev, u64 dma_address, size_t size, enum dma_data_direction direction); - int (*mapping_error)(struct device *dev, u64 dma_address); }; struct niu_link_config { diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c index 28cc23736a69bb46fecce40d0dc68529b71d1b1c..9c8376b2718916054069fc579c1fea6110b5b465 100644 --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c @@ -2089,15 +2089,13 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common) goto of_node_put; ret = of_get_mac_address(port_np, port->slave.mac_addr); - if (ret == -EPROBE_DEFER) { - goto of_node_put; - } else if (ret) { + if (ret) { am65_cpsw_am654_get_efuse_macid(port_np, port->port_id, port->slave.mac_addr); if (!is_valid_ether_addr(port->slave.mac_addr)) { eth_random_addr(port->slave.mac_addr); - dev_info(dev, "Use random MAC address\n"); + dev_err(dev, "Use random MAC address\n"); } } } @@ -2951,16 +2949,6 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev) return ret; } - am65_cpsw_nuss_get_ver(common); - - ret = am65_cpsw_nuss_init_host_p(common); - if (ret) - goto err_pm_clear; - - ret = am65_cpsw_nuss_init_slave_ports(common); - if (ret) - goto err_pm_clear; - node = of_get_child_by_name(dev->of_node, "mdio"); if (!node) { dev_warn(dev, "MDIO node not found\n"); @@ -2977,6 +2965,16 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev) } of_node_put(node); + am65_cpsw_nuss_get_ver(common); + + ret = am65_cpsw_nuss_init_host_p(common); + if (ret) + goto err_of_clear; + + ret = am65_cpsw_nuss_init_slave_ports(common); + if (ret) + goto err_of_clear; + /* init common data */ ale_params.dev = dev; ale_params.ale_ageout = AM65_CPSW_ALE_AGEOUT_DEFAULT; diff --git a/drivers/net/ethernet/vertexcom/mse102x.c b/drivers/net/ethernet/vertexcom/mse102x.c index c902f8761d5d4ddb797f515b6f726fc5c6cb8cf5..060a566bc6aae153d001a50f831941ef17e60fda 100644 --- a/drivers/net/ethernet/vertexcom/mse102x.c +++ b/drivers/net/ethernet/vertexcom/mse102x.c @@ -306,7 +306,7 @@ static void mse102x_dump_packet(const char *msg, int len, const char *data) data, len, true); } -static irqreturn_t mse102x_rx_pkt_spi(struct mse102x_net *mse) +static void mse102x_rx_pkt_spi(struct mse102x_net *mse) { struct sk_buff *skb; unsigned int rxalign; @@ -327,7 +327,7 @@ static irqreturn_t mse102x_rx_pkt_spi(struct mse102x_net *mse) mse102x_tx_cmd_spi(mse, CMD_CTR); ret = mse102x_rx_cmd_spi(mse, (u8 *)&rx); if (ret) - return IRQ_NONE; + return; cmd_resp = be16_to_cpu(rx); if ((cmd_resp & CMD_MASK) != CMD_RTS) { @@ -360,7 +360,7 @@ static irqreturn_t mse102x_rx_pkt_spi(struct mse102x_net *mse) rxalign = ALIGN(rxlen + DET_SOF_LEN + DET_DFT_LEN, 4); skb = netdev_alloc_skb_ip_align(mse->ndev, rxalign); if (!skb) - return IRQ_NONE; + return; /* 2 bytes Start of frame (before ethernet header) * 2 bytes Data frame tail (after ethernet frame) @@ -370,7 +370,7 @@ static irqreturn_t mse102x_rx_pkt_spi(struct mse102x_net *mse) if (mse102x_rx_frame_spi(mse, rxpkt, rxlen, drop)) { mse->ndev->stats.rx_errors++; dev_kfree_skb(skb); - return IRQ_HANDLED; + return; } if (netif_msg_pktdata(mse)) @@ -381,8 +381,6 @@ static irqreturn_t mse102x_rx_pkt_spi(struct mse102x_net *mse) mse->ndev->stats.rx_packets++; mse->ndev->stats.rx_bytes += rxlen; - - return IRQ_HANDLED; } static int mse102x_tx_pkt_spi(struct mse102x_net *mse, struct sk_buff *txb, @@ -514,13 +512,12 @@ static irqreturn_t mse102x_irq(int irq, void *_mse) { struct mse102x_net *mse = _mse; struct mse102x_net_spi *mses = to_mse102x_spi(mse); - irqreturn_t ret; mutex_lock(&mses->lock); - ret = mse102x_rx_pkt_spi(mse); + mse102x_rx_pkt_spi(mse); mutex_unlock(&mses->lock); - return ret; + return IRQ_HANDLED; } static int mse102x_net_open(struct net_device *ndev) diff --git a/drivers/net/ethernet/wangxun/libwx/wx_hw.c b/drivers/net/ethernet/wangxun/libwx/wx_hw.c index 663a8988d27a7328ee0f644e20cd013758b91229..d6bc2309d2a388c4ff1c0f213e8d09f39f6e795c 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_hw.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_hw.c @@ -1348,6 +1348,7 @@ static void wx_configure_rx_ring(struct wx *wx, struct wx_ring *ring) { u16 reg_idx = ring->reg_idx; + union wx_rx_desc *rx_desc; u64 rdba = ring->dma; u32 rxdctl; @@ -1377,9 +1378,9 @@ static void wx_configure_rx_ring(struct wx *wx, memset(ring->rx_buffer_info, 0, sizeof(struct wx_rx_buffer) * ring->count); - /* reset ntu and ntc to place SW in sync with hardware */ - ring->next_to_clean = 0; - ring->next_to_use = 0; + /* initialize Rx descriptor 0 */ + rx_desc = WX_RX_DESC(ring, 0); + rx_desc->wb.upper.length = 0; /* enable receive descriptor ring */ wr32m(wx, WX_PX_RR_CFG(reg_idx), diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_lib.c index 23dbe4e4b36c04d9c221a674b3230579b6c6272a..c019fe964eceaf9f29dea827ed9230a0f21a15bc 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c @@ -171,6 +171,10 @@ static void wx_dma_sync_frag(struct wx_ring *rx_ring, skb_frag_off(frag), skb_frag_size(frag), DMA_FROM_DEVICE); + + /* If the page was released, just unmap it. */ + if (unlikely(WX_CB(skb)->page_released)) + page_pool_put_full_page(rx_ring->page_pool, rx_buffer->page, false); } static struct wx_rx_buffer *wx_get_rx_buffer(struct wx_ring *rx_ring, @@ -220,6 +224,10 @@ static void wx_put_rx_buffer(struct wx_ring *rx_ring, struct sk_buff *skb, int rx_buffer_pgcnt) { + if (!IS_ERR(skb) && WX_CB(skb)->dma == rx_buffer->dma) + /* the page has been released from the ring */ + WX_CB(skb)->page_released = true; + /* clear contents of rx_buffer */ rx_buffer->page = NULL; rx_buffer->skb = NULL; @@ -307,7 +315,7 @@ static bool wx_alloc_mapped_page(struct wx_ring *rx_ring, return false; dma = page_pool_get_dma_addr(page); - bi->dma = dma; + bi->page_dma = dma; bi->page = page; bi->page_offset = 0; @@ -344,7 +352,7 @@ void wx_alloc_rx_buffers(struct wx_ring *rx_ring, u16 cleaned_count) DMA_FROM_DEVICE); rx_desc->read.pkt_addr = - cpu_to_le64(bi->dma + bi->page_offset); + cpu_to_le64(bi->page_dma + bi->page_offset); rx_desc++; bi++; @@ -357,8 +365,6 @@ void wx_alloc_rx_buffers(struct wx_ring *rx_ring, u16 cleaned_count) /* clear the status bits for the next_to_use descriptor */ rx_desc->wb.upper.status_error = 0; - /* clear the length for the next_to_use descriptor */ - rx_desc->wb.upper.length = 0; cleaned_count--; } while (cleaned_count); @@ -2152,6 +2158,9 @@ static void wx_clean_rx_ring(struct wx_ring *rx_ring) if (rx_buffer->skb) { struct sk_buff *skb = rx_buffer->skb; + if (WX_CB(skb)->page_released) + page_pool_put_full_page(rx_ring->page_pool, rx_buffer->page, false); + dev_kfree_skb(skb); } @@ -2175,9 +2184,6 @@ static void wx_clean_rx_ring(struct wx_ring *rx_ring) } } - /* Zero out the descriptor ring */ - memset(rx_ring->desc, 0, rx_ring->size); - rx_ring->next_to_alloc = 0; rx_ring->next_to_clean = 0; rx_ring->next_to_use = 0; @@ -2362,7 +2368,7 @@ static int wx_alloc_page_pool(struct wx_ring *rx_ring) struct page_pool_params pp_params = { .flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV, .order = 0, - .pool_size = rx_ring->count, + .pool_size = rx_ring->size, .nid = dev_to_node(rx_ring->dev), .dev = rx_ring->dev, .dma_dir = DMA_FROM_DEVICE, diff --git a/drivers/net/ethernet/wangxun/libwx/wx_type.h b/drivers/net/ethernet/wangxun/libwx/wx_type.h index 0fef9dfdd9a6b7364488abef2191c671a4657f25..c555af9ed51b29e1b8b069c9c020fb182a2aadfe 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_type.h +++ b/drivers/net/ethernet/wangxun/libwx/wx_type.h @@ -668,6 +668,7 @@ enum wx_reset_type { struct wx_cb { dma_addr_t dma; u16 append_cnt; /* number of skb's appended */ + bool page_released; bool dma_released; }; @@ -755,6 +756,7 @@ struct wx_tx_buffer { struct wx_rx_buffer { struct sk_buff *skb; dma_addr_t dma; + dma_addr_t page_dma; struct page *page; unsigned int page_offset; }; diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c index 3d622634e82aad440166c6ddd07a819d33e22da2..c10f94d69dad3b616912e510003466c25a912e2a 100644 --- a/drivers/net/ethernet/xilinx/ll_temac_main.c +++ b/drivers/net/ethernet/xilinx/ll_temac_main.c @@ -1309,7 +1309,7 @@ ll_temac_ethtools_set_ringparam(struct net_device *ndev, if (ering->rx_pending > RX_BD_NUM_MAX || ering->rx_mini_pending || ering->rx_jumbo_pending || - ering->tx_pending > TX_BD_NUM_MAX) + ering->rx_pending > TX_BD_NUM_MAX) return -EINVAL; if (netif_running(ndev)) diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c index 0eff5d4fe35dffad4af0f6bb76463b6e91a49306..b358ecc6722781fd1cdae077f3fbc79a2b583053 100644 --- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c +++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c @@ -285,7 +285,7 @@ static void xemaclite_aligned_read(u32 *src_ptr, u8 *dest_ptr, /* Read the remaining data */ for (; length > 0; length--) - *to_u8_ptr++ = *from_u8_ptr++; + *to_u8_ptr = *from_u8_ptr; } } diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index f33f9167ba6b6ee833ecf4bd7a96f6b622adb6a8..ce6ac26131b347c4735239720736240fe9440376 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -2313,11 +2313,8 @@ static int netvsc_prepare_bonding(struct net_device *vf_netdev) if (!ndev) return NOTIFY_DONE; - /* Set slave flag and no addrconf flag before open - * to prevent IPv6 addrconf. - */ + /* set slave flag before open to prevent IPv6 addrconf */ vf_netdev->flags |= IFF_SLAVE; - vf_netdev->priv_flags |= IFF_NO_ADDRCONF; return NOTIFY_DONE; } diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 767053d6c6b6f917901a38e7477b7b196864ecba..7c96493a367bffc421b36c95f6877d7a17f788d8 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -243,39 +243,15 @@ static sci_t make_sci(const u8 *addr, __be16 port) return sci; } -static sci_t macsec_active_sci(struct macsec_secy *secy) +static sci_t macsec_frame_sci(struct macsec_eth_header *hdr, bool sci_present) { - struct macsec_rx_sc *rx_sc = rcu_dereference_bh(secy->rx_sc); - - /* Case single RX SC */ - if (rx_sc && !rcu_dereference_bh(rx_sc->next)) - return (rx_sc->active) ? rx_sc->sci : 0; - /* Case no RX SC or multiple */ - else - return 0; -} - -static sci_t macsec_frame_sci(struct macsec_eth_header *hdr, bool sci_present, - struct macsec_rxh_data *rxd) -{ - struct macsec_dev *macsec; - sci_t sci = 0; + sci_t sci; - /* SC = 1 */ - if (sci_present) { + if (sci_present) memcpy(&sci, hdr->secure_channel_id, sizeof(hdr->secure_channel_id)); - /* SC = 0; ES = 0 */ - } else if ((!(hdr->tci_an & (MACSEC_TCI_ES | MACSEC_TCI_SC))) && - (list_is_singular(&rxd->secys))) { - /* Only one SECY should exist on this scenario */ - macsec = list_first_or_null_rcu(&rxd->secys, struct macsec_dev, - secys); - if (macsec) - return macsec_active_sci(&macsec->secy); - } else { + else sci = make_sci(hdr->eth.h_source, MACSEC_PORT_ES); - } return sci; } @@ -1129,7 +1105,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) struct macsec_rxh_data *rxd; struct macsec_dev *macsec; unsigned int len; - sci_t sci = 0; + sci_t sci; u32 hdr_pn; bool cbit; struct pcpu_rx_sc_stats *rxsc_stats; @@ -1176,14 +1152,11 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) macsec_skb_cb(skb)->has_sci = !!(hdr->tci_an & MACSEC_TCI_SC); macsec_skb_cb(skb)->assoc_num = hdr->tci_an & MACSEC_AN_MASK; + sci = macsec_frame_sci(hdr, macsec_skb_cb(skb)->has_sci); rcu_read_lock(); rxd = macsec_data_rcu(skb->dev); - sci = macsec_frame_sci(hdr, macsec_skb_cb(skb)->has_sci, rxd); - if (!sci) - goto drop_nosc; - list_for_each_entry_rcu(macsec, &rxd->secys, secys) { struct macsec_rx_sc *sc = find_rx_sc(&macsec->secy, sci); @@ -1306,7 +1279,6 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) macsec_rxsa_put(rx_sa); drop_nosa: macsec_rxsc_put(rx_sc); -drop_nosc: rcu_read_unlock(); drop_direct: kfree_skb(skb); diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index e02706b7cc1ed65d5111f0e53e2c325146691d10..25dcaa49ab8be9d2ea75ae46a38a4bf3b69dca3a 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -850,9 +850,6 @@ int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) lockdep_assert_held_once(&bus->mdio_lock); - if (addr >= PHY_MAX_ADDR) - return -ENXIO; - if (bus->read) retval = bus->read(bus, addr, regnum); else @@ -882,9 +879,6 @@ int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) lockdep_assert_held_once(&bus->mdio_lock); - if (addr >= PHY_MAX_ADDR) - return -ENXIO; - if (bus->write) err = bus->write(bus, addr, regnum, val); else @@ -946,9 +940,6 @@ int __mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum) lockdep_assert_held_once(&bus->mdio_lock); - if (addr >= PHY_MAX_ADDR) - return -ENXIO; - if (bus->read_c45) retval = bus->read_c45(bus, addr, devad, regnum); else @@ -980,9 +971,6 @@ int __mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum, lockdep_assert_held_once(&bus->mdio_lock); - if (addr >= PHY_MAX_ADDR) - return -ENXIO; - if (bus->write_c45) err = bus->write_c45(bus, addr, devad, regnum, val); else diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c index cb8306cd98260cd9afd503b90507192900b5e279..623607fd2cefd34a1a8868a237939e6647669184 100644 --- a/drivers/net/phy/microchip.c +++ b/drivers/net/phy/microchip.c @@ -310,7 +310,7 @@ static void lan88xx_link_change_notify(struct phy_device *phydev) * As workaround, set to 10 before setting to 100 * at forced 100 F/H mode. */ - if (phydev->state == PHY_NOLINK && !phydev->autoneg && phydev->speed == 100) { + if (!phydev->autoneg && phydev->speed == 100) { /* disable phy interrupt */ temp = phy_read(phydev, LAN88XX_INT_MASK); temp &= ~LAN88XX_INT_MASK_MDINTPIN_EN_; diff --git a/drivers/net/phy/mscc/mscc_ptp.c b/drivers/net/phy/mscc/mscc_ptp.c index 7e7ce79eadffb94fcf7574df30c65e2d11711648..cf728bfd83e22c53ebba22d056f376322b63875c 100644 --- a/drivers/net/phy/mscc/mscc_ptp.c +++ b/drivers/net/phy/mscc/mscc_ptp.c @@ -943,9 +943,7 @@ static int vsc85xx_ip1_conf(struct phy_device *phydev, enum ts_blk blk, /* UDP checksum offset in IPv4 packet * according to: https://tools.ietf.org/html/rfc768 */ - val |= IP1_NXT_PROT_UDP_CHKSUM_OFF(26); - if (enable) - val |= IP1_NXT_PROT_UDP_CHKSUM_CLEAR; + val |= IP1_NXT_PROT_UDP_CHKSUM_OFF(26) | IP1_NXT_PROT_UDP_CHKSUM_CLEAR; vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM, val); @@ -1167,24 +1165,18 @@ static void vsc85xx_txtstamp(struct mii_timestamper *mii_ts, container_of(mii_ts, struct vsc8531_private, mii_ts); if (!vsc8531->ptp->configured) - goto out; - - if (vsc8531->ptp->tx_type == HWTSTAMP_TX_OFF) - goto out; + return; - if (vsc8531->ptp->tx_type == HWTSTAMP_TX_ONESTEP_SYNC) - if (ptp_msg_is_sync(skb, type)) - goto out; + if (vsc8531->ptp->tx_type == HWTSTAMP_TX_OFF) { + kfree_skb(skb); + return; + } skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; mutex_lock(&vsc8531->ts_lock); __skb_queue_tail(&vsc8531->ptp->tx_queue, skb); mutex_unlock(&vsc8531->ts_lock); - return; - -out: - kfree_skb(skb); } static bool vsc85xx_rxtstamp(struct mii_timestamper *mii_ts, diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 59f0f3a534e453c9db5e48794d7bbf0b30542900..ee43f4dbf6a738da7f6dc8a435a7dc66cbf80cef 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -1833,10 +1833,8 @@ void phy_detach(struct phy_device *phydev) struct module *ndev_owner = NULL; struct mii_bus *bus; - if (phydev->devlink) { + if (phydev->devlink) device_link_del(phydev->devlink); - phydev->devlink = NULL; - } if (phydev->sysfs_links) { if (dev) @@ -3404,8 +3402,7 @@ static int phy_probe(struct device *dev) /* Get the LEDs from the device tree, and instantiate standard * LEDs for them. */ - if (IS_ENABLED(CONFIG_PHYLIB_LEDS) && !phy_driver_is_genphy(phydev) && - !phy_driver_is_genphy_10g(phydev)) + if (IS_ENABLED(CONFIG_PHYLIB_LEDS)) err = of_phy_leds(phydev); out: @@ -3422,8 +3419,7 @@ static int phy_remove(struct device *dev) cancel_delayed_work_sync(&phydev->state_queue); - if (IS_ENABLED(CONFIG_PHYLIB_LEDS) && !phy_driver_is_genphy(phydev) && - !phy_driver_is_genphy_10g(phydev)) + if (IS_ENABLED(CONFIG_PHYLIB_LEDS)) phy_leds_unregister(phydev); phydev->state = PHY_DOWN; diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c index 4ca813c009476ad864c4ff5c88327e7d5dadb235..c88edb19d2e7101a3a7d52e2110f60d03e7c7db6 100644 --- a/drivers/net/phy/smsc.c +++ b/drivers/net/phy/smsc.c @@ -155,29 +155,10 @@ static int smsc_phy_reset(struct phy_device *phydev) static int lan87xx_config_aneg(struct phy_device *phydev) { - u8 mdix_ctrl; - int val; int rc; + int val; - /* When auto-negotiation is disabled (forced mode), the PHY's - * Auto-MDIX will continue toggling the TX/RX pairs. - * - * To establish a stable link, we must select a fixed MDI mode. - * If the user has not specified a fixed MDI mode (i.e., mdix_ctrl is - * 'auto'), we default to ETH_TP_MDI. This choice of a ETH_TP_MDI mode - * mirrors the behavior the hardware would exhibit if the AUTOMDIX_EN - * strap were configured for a fixed MDI connection. - */ - if (phydev->autoneg == AUTONEG_DISABLE) { - if (phydev->mdix_ctrl == ETH_TP_MDI_AUTO) - mdix_ctrl = ETH_TP_MDI; - else - mdix_ctrl = phydev->mdix_ctrl; - } else { - mdix_ctrl = phydev->mdix_ctrl; - } - - switch (mdix_ctrl) { + switch (phydev->mdix_ctrl) { case ETH_TP_MDI: val = SPECIAL_CTRL_STS_OVRRD_AMDIX_; break; @@ -186,8 +167,7 @@ static int lan87xx_config_aneg(struct phy_device *phydev) SPECIAL_CTRL_STS_AMDIX_STATE_; break; case ETH_TP_MDI_AUTO: - val = SPECIAL_CTRL_STS_OVRRD_AMDIX_ | - SPECIAL_CTRL_STS_AMDIX_ENABLE_; + val = SPECIAL_CTRL_STS_AMDIX_ENABLE_; break; default: return genphy_config_aneg(phydev); @@ -203,7 +183,7 @@ static int lan87xx_config_aneg(struct phy_device *phydev) rc |= val; phy_write(phydev, SPECIAL_CTRL_STS, rc); - phydev->mdix = mdix_ctrl; + phydev->mdix = phydev->mdix_ctrl; return genphy_config_aneg(phydev); } @@ -281,33 +261,6 @@ int lan87xx_read_status(struct phy_device *phydev) } EXPORT_SYMBOL_GPL(lan87xx_read_status); -static int lan87xx_phy_config_init(struct phy_device *phydev) -{ - int rc; - - /* The LAN87xx PHY's initial MDI-X mode is determined by the AUTOMDIX_EN - * hardware strap, but the driver cannot read the strap's status. This - * creates an unpredictable initial state. - * - * To ensure consistent and reliable behavior across all boards, - * override the strap configuration on initialization and force the PHY - * into a known state with Auto-MDIX enabled, which is the expected - * default for modern hardware. - */ - rc = phy_modify(phydev, SPECIAL_CTRL_STS, - SPECIAL_CTRL_STS_OVRRD_AMDIX_ | - SPECIAL_CTRL_STS_AMDIX_ENABLE_ | - SPECIAL_CTRL_STS_AMDIX_STATE_, - SPECIAL_CTRL_STS_OVRRD_AMDIX_ | - SPECIAL_CTRL_STS_AMDIX_ENABLE_); - if (rc < 0) - return rc; - - phydev->mdix_ctrl = ETH_TP_MDI_AUTO; - - return smsc_phy_config_init(phydev); -} - static int lan874x_phy_config_init(struct phy_device *phydev) { u16 val; @@ -743,7 +696,7 @@ static struct phy_driver smsc_phy_driver[] = { /* basic functions */ .read_status = lan87xx_read_status, - .config_init = lan87xx_phy_config_init, + .config_init = smsc_phy_config_init, .soft_reset = smsc_phy_reset, .config_aneg = lan87xx_config_aneg, diff --git a/drivers/net/usb/aqc111.c b/drivers/net/usb/aqc111.c index 3ebb1f84d302550304fe41b5faf6fa10e92928f0..284375f662f1e03b68f12752c76d6f1081a09d9a 100644 --- a/drivers/net/usb/aqc111.c +++ b/drivers/net/usb/aqc111.c @@ -30,14 +30,11 @@ static int aqc111_read_cmd_nopm(struct usbnet *dev, u8 cmd, u16 value, ret = usbnet_read_cmd_nopm(dev, cmd, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, value, index, data, size); - if (unlikely(ret < size)) { + if (unlikely(ret < 0)) netdev_warn(dev->net, "Failed to read(0x%x) reg index 0x%04x: %d\n", cmd, index, ret); - ret = ret < 0 ? ret : -ENODATA; - } - return ret; } @@ -49,14 +46,11 @@ static int aqc111_read_cmd(struct usbnet *dev, u8 cmd, u16 value, ret = usbnet_read_cmd(dev, cmd, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, value, index, data, size); - if (unlikely(ret < size)) { + if (unlikely(ret < 0)) netdev_warn(dev->net, "Failed to read(0x%x) reg index 0x%04x: %d\n", cmd, index, ret); - ret = ret < 0 ? ret : -ENODATA; - } - return ret; } diff --git a/drivers/net/usb/asix.h b/drivers/net/usb/asix.h index 8531b804021aa4f7e4bba8a8f2c5e5e7173daa9e..74162190bccc10e37232bbc3b698b112a96b5af6 100644 --- a/drivers/net/usb/asix.h +++ b/drivers/net/usb/asix.h @@ -224,6 +224,7 @@ int asix_write_rx_ctl(struct usbnet *dev, u16 mode, int in_pm); u16 asix_read_medium_status(struct usbnet *dev, int in_pm); int asix_write_medium_mode(struct usbnet *dev, u16 mode, int in_pm); +void asix_adjust_link(struct net_device *netdev); int asix_write_gpio(struct usbnet *dev, u16 value, int sleep, int in_pm); diff --git a/drivers/net/usb/asix_common.c b/drivers/net/usb/asix_common.c index 7fd763917ae2cf6f4242a054416130ba820c8c73..72ffc89b477ad81b2cd810b43f3cccedd8044b1e 100644 --- a/drivers/net/usb/asix_common.c +++ b/drivers/net/usb/asix_common.c @@ -414,6 +414,28 @@ int asix_write_medium_mode(struct usbnet *dev, u16 mode, int in_pm) return ret; } +/* set MAC link settings according to information from phylib */ +void asix_adjust_link(struct net_device *netdev) +{ + struct phy_device *phydev = netdev->phydev; + struct usbnet *dev = netdev_priv(netdev); + u16 mode = 0; + + if (phydev->link) { + mode = AX88772_MEDIUM_DEFAULT; + + if (phydev->duplex == DUPLEX_HALF) + mode &= ~AX_MEDIUM_FD; + + if (phydev->speed != SPEED_100) + mode &= ~AX_MEDIUM_PS; + } + + asix_write_medium_mode(dev, mode, 0); + phy_print_status(phydev); + usbnet_link_change(dev, phydev->link, 0); +} + int asix_write_gpio(struct usbnet *dev, u16 value, int sleep, int in_pm) { int ret; diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c index 119295f5f3b351a7236e4a39b53dd5a845ae45ef..ec4dcf89cbedd2832b3a5d65129952380a0934c0 100644 --- a/drivers/net/usb/asix_devices.c +++ b/drivers/net/usb/asix_devices.c @@ -752,6 +752,7 @@ static void ax88772_mac_link_down(struct phylink_config *config, struct usbnet *dev = netdev_priv(to_net_dev(config->dev)); asix_write_medium_mode(dev, 0, 0); + usbnet_link_change(dev, false, false); } static void ax88772_mac_link_up(struct phylink_config *config, @@ -782,6 +783,7 @@ static void ax88772_mac_link_up(struct phylink_config *config, m |= AX_MEDIUM_RFC; asix_write_medium_mode(dev, m, 0); + usbnet_link_change(dev, true, false); } static const struct phylink_mac_ops ax88772_phylink_mac_ops = { @@ -1348,9 +1350,10 @@ static const struct driver_info ax88772_info = { .description = "ASIX AX88772 USB 2.0 Ethernet", .bind = ax88772_bind, .unbind = ax88772_unbind, + .status = asix_status, .reset = ax88772_reset, .stop = ax88772_stop, - .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_MULTI_PACKET, + .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | FLAG_MULTI_PACKET, .rx_fixup = asix_rx_fixup_common, .tx_fixup = asix_tx_fixup, }; @@ -1359,9 +1362,11 @@ static const struct driver_info ax88772b_info = { .description = "ASIX AX88772B USB 2.0 Ethernet", .bind = ax88772_bind, .unbind = ax88772_unbind, + .status = asix_status, .reset = ax88772_reset, .stop = ax88772_stop, - .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_MULTI_PACKET, + .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | + FLAG_MULTI_PACKET, .rx_fixup = asix_rx_fixup_common, .tx_fixup = asix_tx_fixup, .data = FLAG_EEPROM_MAC, @@ -1371,9 +1376,11 @@ static const struct driver_info lxausb_t1l_info = { .description = "Linux Automation GmbH USB 10Base-T1L", .bind = ax88772_bind, .unbind = ax88772_unbind, + .status = asix_status, .reset = ax88772_reset, .stop = ax88772_stop, - .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_MULTI_PACKET, + .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | + FLAG_MULTI_PACKET, .rx_fixup = asix_rx_fixup_common, .tx_fixup = asix_tx_fixup, .data = FLAG_EEPROM_MAC, @@ -1405,8 +1412,10 @@ static const struct driver_info hg20f9_info = { .description = "HG20F9 USB 2.0 Ethernet", .bind = ax88772_bind, .unbind = ax88772_unbind, + .status = asix_status, .reset = ax88772_reset, - .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_MULTI_PACKET, + .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | + FLAG_MULTI_PACKET, .rx_fixup = asix_rx_fixup_common, .tx_fixup = asix_tx_fixup, .data = FLAG_EEPROM_MAC, diff --git a/drivers/net/usb/ch9200.c b/drivers/net/usb/ch9200.c index a206ffa76f1b93a780b88b5fa619da68f1736209..f69d9b902da04a88fdacb85baba32cec09a24fd9 100644 --- a/drivers/net/usb/ch9200.c +++ b/drivers/net/usb/ch9200.c @@ -178,7 +178,6 @@ static int ch9200_mdio_read(struct net_device *netdev, int phy_id, int loc) { struct usbnet *dev = netdev_priv(netdev); unsigned char buff[2]; - int ret; netdev_dbg(netdev, "%s phy_id:%02x loc:%02x\n", __func__, phy_id, loc); @@ -186,10 +185,8 @@ static int ch9200_mdio_read(struct net_device *netdev, int phy_id, int loc) if (phy_id != 0) return -ENODEV; - ret = control_read(dev, REQUEST_READ, 0, loc * 2, buff, 0x02, - CONTROL_TIMEOUT_MS); - if (ret < 0) - return ret; + control_read(dev, REQUEST_READ, 0, loc * 2, buff, 0x02, + CONTROL_TIMEOUT_MS); return (buff[0] | buff[1] << 8); } diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index ec5689cd240aafdc1d6f8fdf7df16494da5b9ccf..09173d7b87ed5c9b799347d6b41c21aa05069153 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -4229,6 +4229,8 @@ static void lan78xx_disconnect(struct usb_interface *intf) if (!dev) return; + netif_napi_del(&dev->napi); + udev = interface_to_usbdev(intf); net = dev->net; diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 3976bc4295dd190a3c83044c3e4bc2450ca6b3f4..dc84d9029c2c79e9117eac1ff87f59ee7e9abed7 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c @@ -1432,7 +1432,6 @@ static const struct usb_device_id products[] = { {QMI_QUIRK_SET_DTR(0x22de, 0x9051, 2)}, /* Hucom Wireless HM-211S/K */ {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ {QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}, /* SIMCom 7100E, 7230E, 7600E ++ */ - {QMI_QUIRK_SET_DTR(0x1e0e, 0x9071, 3)}, /* SIMCom 8230C ++ */ {QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */ {QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)}, /* Quectel EG91 */ {QMI_QUIRK_SET_DTR(0x2c7c, 0x0195, 4)}, /* Quectel EG95 */ diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 1e85cfe524e8750aac6149b646c66ee6f4f66d65..bbcefcc7ef8f06bd4b3675bdf13f3c8f6756f454 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -10032,7 +10032,6 @@ static const struct usb_device_id rtl8152_table[] = { { USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) }, { USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) }, { USB_DEVICE(VENDOR_ID_DLINK, 0xb301) }, - { USB_DEVICE(VENDOR_ID_DELL, 0xb097) }, { USB_DEVICE(VENDOR_ID_ASUS, 0x1976) }, {} }; diff --git a/drivers/net/usb/sierra_net.c b/drivers/net/usb/sierra_net.c index 42b66adb35f1bca706d66302df53682b0fb14fda..673d3aa8379267832749fca8450f443a601ce4fc 100644 --- a/drivers/net/usb/sierra_net.c +++ b/drivers/net/usb/sierra_net.c @@ -689,10 +689,6 @@ static int sierra_net_bind(struct usbnet *dev, struct usb_interface *intf) status); return -ENODEV; } - if (!dev->status) { - dev_err(&dev->udev->dev, "No status endpoint found"); - return -ENODEV; - } /* Initialize sierra private data */ priv = kzalloc(sizeof *priv, GFP_KERNEL); if (!priv) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 5a949f9446a8ed0e9f53d668104ebce30ec6d811..3bf394b24d97115a81f27885272d7d14cc86dd30 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -487,26 +487,6 @@ static unsigned int mergeable_ctx_to_truesize(void *mrg_ctx) return (unsigned long)mrg_ctx & ((1 << MRG_CTX_HEADER_SHIFT) - 1); } -static int check_mergeable_len(struct net_device *dev, void *mrg_ctx, - unsigned int len) -{ - unsigned int headroom, tailroom, room, truesize; - - truesize = mergeable_ctx_to_truesize(mrg_ctx); - headroom = mergeable_ctx_to_headroom(mrg_ctx); - tailroom = headroom ? sizeof(struct skb_shared_info) : 0; - room = SKB_DATA_ALIGN(headroom + tailroom); - - if (len > truesize - room) { - pr_debug("%s: rx error: len %u exceeds truesize %lu\n", - dev->name, len, (unsigned long)(truesize - room)); - DEV_STATS_INC(dev, rx_length_errors); - return -1; - } - - return 0; -} - static struct sk_buff *virtnet_build_skb(void *buf, unsigned int buflen, unsigned int headroom, unsigned int len) @@ -1104,8 +1084,7 @@ static unsigned int virtnet_get_headroom(struct virtnet_info *vi) * across multiple buffers (num_buf > 1), and we make sure buffers * have enough headroom. */ -static struct page *xdp_linearize_page(struct net_device *dev, - struct receive_queue *rq, +static struct page *xdp_linearize_page(struct receive_queue *rq, int *num_buf, struct page *p, int offset, @@ -1125,27 +1104,18 @@ static struct page *xdp_linearize_page(struct net_device *dev, memcpy(page_address(page) + page_off, page_address(p) + offset, *len); page_off += *len; - /* Only mergeable mode can go inside this while loop. In small mode, - * *num_buf == 1, so it cannot go inside. - */ while (--*num_buf) { unsigned int buflen; void *buf; - void *ctx; int off; - buf = virtnet_rq_get_buf(rq, &buflen, &ctx); + buf = virtnet_rq_get_buf(rq, &buflen, NULL); if (unlikely(!buf)) goto err_buf; p = virt_to_head_page(buf); off = buf - page_address(p); - if (check_mergeable_len(dev, ctx, buflen)) { - put_page(p); - goto err_buf; - } - /* guard against a misconfigured or uncooperative backend that * is sending packet larger than the MTU. */ @@ -1234,7 +1204,7 @@ static struct sk_buff *receive_small_xdp(struct net_device *dev, headroom = vi->hdr_len + header_offset; buflen = SKB_DATA_ALIGN(GOOD_PACKET_LEN + headroom) + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); - xdp_page = xdp_linearize_page(dev, rq, &num_buf, page, + xdp_page = xdp_linearize_page(rq, &num_buf, page, offset, header_offset, &tlen); if (!xdp_page) @@ -1569,7 +1539,7 @@ static void *mergeable_xdp_get_buf(struct virtnet_info *vi, */ if (!xdp_prog->aux->xdp_has_frags) { /* linearize data for XDP */ - xdp_page = xdp_linearize_page(vi->dev, rq, num_buf, + xdp_page = xdp_linearize_page(rq, num_buf, *page, offset, VIRTIO_XDP_HEADROOM, len); diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index afd78324f3aa3924fd0a04985ba3029545526f85..beebe09eb88ff3c350c55172d47ed33654c915bb 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c @@ -1499,30 +1499,6 @@ vmxnet3_get_hdr_len(struct vmxnet3_adapter *adapter, struct sk_buff *skb, return (hlen + (hdr.tcp->doff << 2)); } -static void -vmxnet3_lro_tunnel(struct sk_buff *skb, __be16 ip_proto) -{ - struct udphdr *uh = NULL; - - if (ip_proto == htons(ETH_P_IP)) { - struct iphdr *iph = (struct iphdr *)skb->data; - - if (iph->protocol == IPPROTO_UDP) - uh = (struct udphdr *)(iph + 1); - } else { - struct ipv6hdr *iph = (struct ipv6hdr *)skb->data; - - if (iph->nexthdr == IPPROTO_UDP) - uh = (struct udphdr *)(iph + 1); - } - if (uh) { - if (uh->check) - skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL_CSUM; - else - skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL; - } -} - static int vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, struct vmxnet3_adapter *adapter, int quota) @@ -1827,8 +1803,6 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, if (segCnt != 0 && mss != 0) { skb_shinfo(skb)->gso_type = rcd->v4 ? SKB_GSO_TCPV4 : SKB_GSO_TCPV6; - if (encap_lro) - vmxnet3_lro_tunnel(skb, skb->protocol); skb_shinfo(skb)->gso_size = mss; skb_shinfo(skb)->gso_segs = segCnt; } else if ((segCnt != 0 || skb->len > mtu) && !encap_lro) { diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c index 1b6b6acd34894bef237ebe41ae92f2ec04da3349..822cf49d826760bea4f861c015c483f851142008 100644 --- a/drivers/net/vxlan/vxlan_core.c +++ b/drivers/net/vxlan/vxlan_core.c @@ -227,9 +227,9 @@ static int vxlan_fdb_info(struct sk_buff *skb, struct vxlan_dev *vxlan, be32_to_cpu(fdb->vni))) goto nla_put_failure; - ci.ndm_used = jiffies_to_clock_t(now - READ_ONCE(fdb->used)); + ci.ndm_used = jiffies_to_clock_t(now - fdb->used); ci.ndm_confirmed = 0; - ci.ndm_updated = jiffies_to_clock_t(now - READ_ONCE(fdb->updated)); + ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated); ci.ndm_refcnt = 0; if (nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci)) @@ -435,8 +435,8 @@ static struct vxlan_fdb *vxlan_find_mac(struct vxlan_dev *vxlan, struct vxlan_fdb *f; f = __vxlan_find_mac(vxlan, mac, vni); - if (f && READ_ONCE(f->used) != jiffies) - WRITE_ONCE(f->used, jiffies); + if (f && f->used != jiffies) + f->used = jiffies; return f; } @@ -606,10 +606,10 @@ static int vxlan_fdb_append(struct vxlan_fdb *f, if (rd == NULL) return -ENOMEM; - /* The driver can work correctly without a dst cache, so do not treat - * dst cache initialization errors as fatal. - */ - dst_cache_init(&rd->dst_cache, GFP_ATOMIC | __GFP_NOWARN); + if (dst_cache_init(&rd->dst_cache, GFP_ATOMIC)) { + kfree(rd); + return -ENOMEM; + } rd->remote_ip = *ip; rd->remote_port = port; @@ -1010,12 +1010,12 @@ static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan, !(f->flags & NTF_VXLAN_ADDED_BY_USER)) { if (f->state != state) { f->state = state; - WRITE_ONCE(f->updated, jiffies); + f->updated = jiffies; notify = 1; } if (f->flags != fdb_flags) { f->flags = fdb_flags; - WRITE_ONCE(f->updated, jiffies); + f->updated = jiffies; notify = 1; } } @@ -1049,7 +1049,7 @@ static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan, } if (ndm_flags & NTF_USE) - WRITE_ONCE(f->used, jiffies); + f->used = jiffies; if (notify) { if (rd == NULL) @@ -1478,7 +1478,7 @@ static bool vxlan_snoop(struct net_device *dev, src_mac, &rdst->remote_ip.sa, &src_ip->sa); rdst->remote_ip = *src_ip; - WRITE_ONCE(f->updated, jiffies); + f->updated = jiffies; vxlan_fdb_notify(vxlan, f, rdst, RTM_NEWNEIGH, true, NULL); } else { u32 hash_index = fdb_head_index(vxlan, src_mac, vni); @@ -2920,7 +2920,7 @@ static void vxlan_cleanup(struct timer_list *t) if (f->flags & NTF_EXT_LEARNED) continue; - timeout = READ_ONCE(f->used) + vxlan->cfg.age_interval * HZ; + timeout = f->used + vxlan->cfg.age_interval * HZ; if (time_before_eq(timeout, jiffies)) { netdev_dbg(vxlan->dev, "garbage collect %pM\n", diff --git a/drivers/net/wireguard/device.c b/drivers/net/wireguard/device.c index f98e0f027a05424a4e423fd5677b16ea89513cd3..deb9636b0ecf8f47e832a0b07e9e049ba19bdf16 100644 --- a/drivers/net/wireguard/device.c +++ b/drivers/net/wireguard/device.c @@ -369,7 +369,6 @@ static int wg_newlink(struct net *src_net, struct net_device *dev, if (ret < 0) goto err_free_handshake_queue; - dev_set_threaded(dev, true); ret = register_netdevice(dev); if (ret < 0) goto err_uninit_ratelimiter; diff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c index 1d06d4125992da5edf486311041ea056bb8db71d..2c39bad7ebfb9acab22a2d06e5434883814cf15e 100644 --- a/drivers/net/wireless/ath/ath10k/snoc.c +++ b/drivers/net/wireless/ath/ath10k/snoc.c @@ -937,9 +937,7 @@ static int ath10k_snoc_hif_start(struct ath10k *ar) dev_set_threaded(&ar->napi_dev, true); ath10k_core_napi_enable(ar); - /* IRQs are left enabled when we restart due to a firmware crash */ - if (!test_bit(ATH10K_SNOC_FLAG_RECOVERY, &ar_snoc->flags)) - ath10k_snoc_irq_enable(ar); + ath10k_snoc_irq_enable(ar); ath10k_snoc_rx_post(ar); clear_bit(ATH10K_SNOC_FLAG_RECOVERY, &ar_snoc->flags); diff --git a/drivers/net/wireless/ath/ath11k/ce.c b/drivers/net/wireless/ath/ath11k/ce.c index 9d8efec46508a1bda1c4345fe352517fa287586a..e66e86bdec20ff5b5228108bcdd30efada63cea4 100644 --- a/drivers/net/wireless/ath/ath11k/ce.c +++ b/drivers/net/wireless/ath/ath11k/ce.c @@ -393,10 +393,11 @@ static int ath11k_ce_completed_recv_next(struct ath11k_ce_pipe *pipe, goto err; } - /* Make sure descriptor is read after the head pointer. */ - dma_rmb(); - *nbytes = ath11k_hal_ce_dst_status_get_length(desc); + if (*nbytes == 0) { + ret = -EIO; + goto err; + } *skb = pipe->dest_ring->skb[sw_index]; pipe->dest_ring->skb[sw_index] = NULL; @@ -429,8 +430,8 @@ static void ath11k_ce_recv_process_cb(struct ath11k_ce_pipe *pipe) dma_unmap_single(ab->dev, ATH11K_SKB_RXCB(skb)->paddr, max_nbytes, DMA_FROM_DEVICE); - if (unlikely(max_nbytes < nbytes || nbytes == 0)) { - ath11k_warn(ab, "unexpected rx length (nbytes %d, max %d)", + if (unlikely(max_nbytes < nbytes)) { + ath11k_warn(ab, "rxed more than expected (nbytes %d, max %d)", nbytes, max_nbytes); dev_kfree_skb_any(skb); continue; diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index 0e8ff839cae2346aa790b084a71a2696bea16cc1..fc7c4564a715cf1ece03a22fe35be9d562cbb38f 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -704,52 +704,6 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { }, }; -static const struct dmi_system_id ath11k_pm_quirk_table[] = { - { - .driver_data = (void *)ATH11K_PM_WOW, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_NAME, "21J4"), - }, - }, - { - .driver_data = (void *)ATH11K_PM_WOW, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_NAME, "21K4"), - }, - }, - { - .driver_data = (void *)ATH11K_PM_WOW, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_NAME, "21K6"), - }, - }, - { - .driver_data = (void *)ATH11K_PM_WOW, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_NAME, "21K8"), - }, - }, - { - .driver_data = (void *)ATH11K_PM_WOW, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_NAME, "21KA"), - }, - }, - { - .driver_data = (void *)ATH11K_PM_WOW, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_NAME, "21F9"), - }, - }, - {} -}; - static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct ath11k_base *ab) { WARN_ON(!ab->hw_params.single_pdev_only); @@ -794,7 +748,6 @@ void ath11k_fw_stats_init(struct ath11k *ar) INIT_LIST_HEAD(&ar->fw_stats.bcn); init_completion(&ar->fw_stats_complete); - init_completion(&ar->fw_stats_done); } void ath11k_fw_stats_free(struct ath11k_fw_stats *stats) @@ -1684,20 +1637,6 @@ int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab) { int ret; - switch (ath11k_crypto_mode) { - case ATH11K_CRYPT_MODE_SW: - set_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags); - set_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags); - break; - case ATH11K_CRYPT_MODE_HW: - clear_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags); - clear_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags); - break; - default: - ath11k_info(ab, "invalid crypto_mode: %d\n", ath11k_crypto_mode); - return -EINVAL; - } - ret = ath11k_core_start_firmware(ab, ab->fw_mode); if (ret) { ath11k_err(ab, "failed to start firmware: %d\n", ret); @@ -1716,6 +1655,20 @@ int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab) goto err_firmware_stop; } + switch (ath11k_crypto_mode) { + case ATH11K_CRYPT_MODE_SW: + set_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags); + set_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags); + break; + case ATH11K_CRYPT_MODE_HW: + clear_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags); + clear_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags); + break; + default: + ath11k_info(ab, "invalid crypto_mode: %d\n", ath11k_crypto_mode); + return -EINVAL; + } + if (ath11k_frame_mode == ATH11K_HW_TXRX_RAW) set_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags); @@ -1789,7 +1742,6 @@ static int ath11k_core_reconfigure_on_crash(struct ath11k_base *ab) void ath11k_core_halt(struct ath11k *ar) { struct ath11k_base *ab = ar->ab; - struct list_head *pos, *n; lockdep_assert_held(&ar->conf_mutex); @@ -1804,12 +1756,7 @@ void ath11k_core_halt(struct ath11k *ar) rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], NULL); synchronize_rcu(); - - spin_lock_bh(&ar->data_lock); - list_for_each_safe(pos, n, &ar->arvifs) - list_del_init(pos); - spin_unlock_bh(&ar->data_lock); - + INIT_LIST_HEAD(&ar->arvifs); idr_init(&ar->txmgmt_idr); } @@ -2064,17 +2011,8 @@ EXPORT_SYMBOL(ath11k_core_pre_init); int ath11k_core_init(struct ath11k_base *ab) { - const struct dmi_system_id *dmi_id; int ret; - dmi_id = dmi_first_match(ath11k_pm_quirk_table); - if (dmi_id) - ab->pm_policy = (kernel_ulong_t)dmi_id->driver_data; - else - ab->pm_policy = ATH11K_PM_DEFAULT; - - ath11k_dbg(ab, ATH11K_DBG_BOOT, "pm policy %u\n", ab->pm_policy); - ret = ath11k_core_soc_create(ab); if (ret) { ath11k_err(ab, "failed to create soc core: %d\n", ret); diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h index 812a174f74c0b38f7cbdf6dd0aa7a9c3be2f18de..b04447762483767ace826fe2cb4f934bc82584ae 100644 --- a/drivers/net/wireless/ath/ath11k/core.h +++ b/drivers/net/wireless/ath/ath11k/core.h @@ -550,8 +550,6 @@ struct ath11k_fw_stats { struct list_head pdevs; struct list_head vdevs; struct list_head bcn; - u32 num_vdev_recvd; - u32 num_bcn_recvd; }; struct ath11k_dbg_htt_stats { @@ -734,7 +732,7 @@ struct ath11k { u8 alpha2[REG_ALPHA2_LEN + 1]; struct ath11k_fw_stats fw_stats; struct completion fw_stats_complete; - struct completion fw_stats_done; + bool fw_stats_done; /* protected by conf_mutex */ bool ps_state_enable; @@ -842,11 +840,6 @@ struct ath11k_msi_config { u16 hw_rev; }; -enum ath11k_pm_policy { - ATH11K_PM_DEFAULT, - ATH11K_PM_WOW, -}; - /* Master structure to hold the hw data which may be used in core module */ struct ath11k_base { enum ath11k_hw_rev hw_rev; @@ -999,8 +992,6 @@ struct ath11k_base { } testmode; #endif - enum ath11k_pm_policy pm_policy; - /* must be last */ u8 drv_priv[] __aligned(sizeof(void *)); }; diff --git a/drivers/net/wireless/ath/ath11k/debugfs.c b/drivers/net/wireless/ath/ath11k/debugfs.c index 50bc17127e68a36cf42aa793efa22cb802d25634..8cda73b78ebf4187140aae32e3ef3bec2fbd4f67 100644 --- a/drivers/net/wireless/ath/ath11k/debugfs.c +++ b/drivers/net/wireless/ath/ath11k/debugfs.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear /* * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -96,10 +96,9 @@ void ath11k_debugfs_add_dbring_entry(struct ath11k *ar, static void ath11k_debugfs_fw_stats_reset(struct ath11k *ar) { spin_lock_bh(&ar->data_lock); + ar->fw_stats_done = false; ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); ath11k_fw_stats_vdevs_free(&ar->fw_stats.vdevs); - ar->fw_stats.num_vdev_recvd = 0; - ar->fw_stats.num_bcn_recvd = 0; spin_unlock_bh(&ar->data_lock); } @@ -107,14 +106,15 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * { struct ath11k_base *ab = ar->ab; struct ath11k_pdev *pdev; - bool is_end = true; + bool is_end; + static unsigned int num_vdev, num_bcn; size_t total_vdevs_started = 0; int i; /* WMI_REQUEST_PDEV_STAT request has been already processed */ if (stats->stats_id == WMI_REQUEST_RSSI_PER_CHAIN_STAT) { - complete(&ar->fw_stats_done); + ar->fw_stats_done = true; return; } @@ -132,16 +132,15 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * total_vdevs_started += ar->num_started_vdevs; } - if (total_vdevs_started) - is_end = ((++ar->fw_stats.num_vdev_recvd) == - total_vdevs_started); + is_end = ((++num_vdev) == total_vdevs_started); list_splice_tail_init(&stats->vdevs, &ar->fw_stats.vdevs); - if (is_end) - complete(&ar->fw_stats_done); - + if (is_end) { + ar->fw_stats_done = true; + num_vdev = 0; + } return; } @@ -153,15 +152,15 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * /* Mark end until we reached the count of all started VDEVs * within the PDEV */ - if (ar->num_started_vdevs) - is_end = ((++ar->fw_stats.num_bcn_recvd) == - ar->num_started_vdevs); + is_end = ((++num_bcn) == ar->num_started_vdevs); list_splice_tail_init(&stats->bcn, &ar->fw_stats.bcn); - if (is_end) - complete(&ar->fw_stats_done); + if (is_end) { + ar->fw_stats_done = true; + num_bcn = 0; + } } } @@ -169,15 +168,21 @@ static int ath11k_debugfs_fw_stats_request(struct ath11k *ar, struct stats_request_params *req_param) { struct ath11k_base *ab = ar->ab; - unsigned long time_left; + unsigned long timeout, time_left; int ret; lockdep_assert_held(&ar->conf_mutex); + /* FW stats can get split when exceeding the stats data buffer limit. + * In that case, since there is no end marking for the back-to-back + * received 'update stats' event, we keep a 3 seconds timeout in case, + * fw_stats_done is not marked yet + */ + timeout = jiffies + msecs_to_jiffies(3 * 1000); + ath11k_debugfs_fw_stats_reset(ar); reinit_completion(&ar->fw_stats_complete); - reinit_completion(&ar->fw_stats_done); ret = ath11k_wmi_send_stats_request_cmd(ar, req_param); @@ -188,18 +193,21 @@ static int ath11k_debugfs_fw_stats_request(struct ath11k *ar, } time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ); - if (!time_left) - return -ETIMEDOUT; - /* FW stats can get split when exceeding the stats data buffer limit. - * In that case, since there is no end marking for the back-to-back - * received 'update stats' event, we keep a 3 seconds timeout in case, - * fw_stats_done is not marked yet - */ - time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ); if (!time_left) return -ETIMEDOUT; + for (;;) { + if (time_after(jiffies, timeout)) + break; + + spin_lock_bh(&ar->data_lock); + if (ar->fw_stats_done) { + spin_unlock_bh(&ar->data_lock); + break; + } + spin_unlock_bh(&ar->data_lock); + } return 0; } @@ -972,7 +980,7 @@ int ath11k_debugfs_pdev_create(struct ath11k_base *ab) debugfs_create_file("simulate_fw_crash", 0600, ab->debugfs_soc, ab, &fops_simulate_fw_crash); - debugfs_create_file("soc_dp_stats", 0400, ab->debugfs_soc, ab, + debugfs_create_file("soc_dp_stats", 0600, ab->debugfs_soc, ab, &fops_soc_dp_stats); if (ab->hw_params.sram_dump.start != 0) diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.c b/drivers/net/wireless/ath/ath11k/dp_rx.c index 2b7bee6664728619dda1c1e6981088a59c6ca19f..4c70366ac56eb0f153cc5943a56382e67a89b316 100644 --- a/drivers/net/wireless/ath/ath11k/dp_rx.c +++ b/drivers/net/wireless/ath/ath11k/dp_rx.c @@ -2649,7 +2649,7 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id, struct ath11k *ar; struct hal_reo_dest_ring *desc; enum hal_reo_dest_ring_push_reason push_reason; - u32 cookie, info0, rx_msdu_info0, rx_mpdu_info0; + u32 cookie; int i; for (i = 0; i < MAX_RADIOS; i++) @@ -2662,14 +2662,11 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id, try_again: ath11k_hal_srng_access_begin(ab, srng); - /* Make sure descriptor is read after the head pointer. */ - dma_rmb(); - while (likely(desc = (struct hal_reo_dest_ring *)ath11k_hal_srng_dst_get_next_entry(ab, srng))) { cookie = FIELD_GET(BUFFER_ADDR_INFO1_SW_COOKIE, - READ_ONCE(desc->buf_addr_info.info1)); + desc->buf_addr_info.info1); buf_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_BUF_ID, cookie); mac_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_PDEV_ID, cookie); @@ -2698,9 +2695,8 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id, num_buffs_reaped[mac_id]++; - info0 = READ_ONCE(desc->info0); push_reason = FIELD_GET(HAL_REO_DEST_RING_INFO0_PUSH_REASON, - info0); + desc->info0); if (unlikely(push_reason != HAL_REO_DEST_RING_PUSH_REASON_ROUTING_INSTRUCTION)) { dev_kfree_skb_any(msdu); @@ -2708,21 +2704,18 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id, continue; } - rx_msdu_info0 = READ_ONCE(desc->rx_msdu_info.info0); - rx_mpdu_info0 = READ_ONCE(desc->rx_mpdu_info.info0); - - rxcb->is_first_msdu = !!(rx_msdu_info0 & + rxcb->is_first_msdu = !!(desc->rx_msdu_info.info0 & RX_MSDU_DESC_INFO0_FIRST_MSDU_IN_MPDU); - rxcb->is_last_msdu = !!(rx_msdu_info0 & + rxcb->is_last_msdu = !!(desc->rx_msdu_info.info0 & RX_MSDU_DESC_INFO0_LAST_MSDU_IN_MPDU); - rxcb->is_continuation = !!(rx_msdu_info0 & + rxcb->is_continuation = !!(desc->rx_msdu_info.info0 & RX_MSDU_DESC_INFO0_MSDU_CONTINUATION); rxcb->peer_id = FIELD_GET(RX_MPDU_DESC_META_DATA_PEER_ID, - READ_ONCE(desc->rx_mpdu_info.meta_data)); + desc->rx_mpdu_info.meta_data); rxcb->seq_no = FIELD_GET(RX_MPDU_DESC_INFO0_SEQ_NUM, - rx_mpdu_info0); + desc->rx_mpdu_info.info0); rxcb->tid = FIELD_GET(HAL_REO_DEST_RING_INFO0_RX_QUEUE_NUM, - info0); + desc->info0); rxcb->mac_id = mac_id; __skb_queue_tail(&msdu_list[mac_id], msdu); diff --git a/drivers/net/wireless/ath/ath11k/hal.c b/drivers/net/wireless/ath/ath11k/hal.c index f32fa104ded9de008f640d0c4a72de8371106bbf..ae5f7e401e21b73e10a2c1031ccd4197572823f7 100644 --- a/drivers/net/wireless/ath/ath11k/hal.c +++ b/drivers/net/wireless/ath/ath11k/hal.c @@ -601,7 +601,7 @@ u32 ath11k_hal_ce_dst_status_get_length(void *buf) (struct hal_ce_srng_dst_status_desc *)buf; u32 len; - len = FIELD_GET(HAL_CE_DST_STATUS_DESC_FLAGS_LEN, READ_ONCE(desc->flags)); + len = FIELD_GET(HAL_CE_DST_STATUS_DESC_FLAGS_LEN, desc->flags); desc->flags &= ~HAL_CE_DST_STATUS_DESC_FLAGS_LEN; return len; @@ -802,7 +802,7 @@ void ath11k_hal_srng_access_begin(struct ath11k_base *ab, struct hal_srng *srng) srng->u.src_ring.cached_tp = *(volatile u32 *)srng->u.src_ring.tp_addr; } else { - srng->u.dst_ring.cached_hp = READ_ONCE(*srng->u.dst_ring.hp_addr); + srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr; /* Try to prefetch the next descriptor in the ring */ if (srng->flags & HAL_SRNG_FLAGS_CACHED) diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c index 9df3f6449f76896fb66c92e8c21da454863306f0..4247c0f840a4826ef36be78fbf69d070c68f3b9b 100644 --- a/drivers/net/wireless/ath/ath11k/mac.c +++ b/drivers/net/wireless/ath/ath11k/mac.c @@ -9010,13 +9010,11 @@ static int ath11k_fw_stats_request(struct ath11k *ar, lockdep_assert_held(&ar->conf_mutex); spin_lock_bh(&ar->data_lock); + ar->fw_stats_done = false; ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); - ar->fw_stats.num_vdev_recvd = 0; - ar->fw_stats.num_bcn_recvd = 0; spin_unlock_bh(&ar->data_lock); reinit_completion(&ar->fw_stats_complete); - reinit_completion(&ar->fw_stats_done); ret = ath11k_wmi_send_stats_request_cmd(ar, req_param); if (ret) { diff --git a/drivers/net/wireless/ath/ath11k/qmi.c b/drivers/net/wireless/ath/ath11k/qmi.c index 91e31f30d2c80fdc8773cac0dd404bf4be76c174..fa46e645009cf66470fea289c7cd0e3eaf2ee1bd 100644 --- a/drivers/net/wireless/ath/ath11k/qmi.c +++ b/drivers/net/wireless/ath/ath11k/qmi.c @@ -1989,15 +1989,6 @@ static int ath11k_qmi_alloc_target_mem_chunk(struct ath11k_base *ab) chunk->prev_size == chunk->size) continue; - if (ab->qmi.mem_seg_count <= ATH11K_QMI_FW_MEM_REQ_SEGMENT_CNT) { - ath11k_dbg(ab, ATH11K_DBG_QMI, - "size/type mismatch (current %d %u) (prev %d %u), try later with small size\n", - chunk->size, chunk->type, - chunk->prev_size, chunk->prev_type); - ab->qmi.target_mem_delayed = true; - return 0; - } - /* cannot reuse the existing chunk */ dma_free_coherent(ab->dev, chunk->prev_size, chunk->vaddr, chunk->paddr); diff --git a/drivers/net/wireless/ath/ath11k/wmi.c b/drivers/net/wireless/ath/ath11k/wmi.c index 9a829b8282420a0083865f214fa86ecd263b3dfb..2cc13e60f422f772dfa8979ca16f7365736c4e56 100644 --- a/drivers/net/wireless/ath/ath11k/wmi.c +++ b/drivers/net/wireless/ath/ath11k/wmi.c @@ -8183,7 +8183,7 @@ static void ath11k_update_stats_event(struct ath11k_base *ab, struct sk_buff *sk */ if (stats.stats_id == WMI_REQUEST_PDEV_STAT) { list_splice_tail_init(&stats.pdevs, &ar->fw_stats.pdevs); - complete(&ar->fw_stats_done); + ar->fw_stats_done = true; goto complete; } diff --git a/drivers/net/wireless/ath/ath12k/ce.c b/drivers/net/wireless/ath/ath12k/ce.c index 740586fe49d1f9b7f46f0b4ed8865ca7aa158459..be0d669d31fcce659ec4cd00b20fef72ef03e459 100644 --- a/drivers/net/wireless/ath/ath12k/ce.c +++ b/drivers/net/wireless/ath/ath12k/ce.c @@ -343,10 +343,11 @@ static int ath12k_ce_completed_recv_next(struct ath12k_ce_pipe *pipe, goto err; } - /* Make sure descriptor is read after the head pointer. */ - dma_rmb(); - *nbytes = ath12k_hal_ce_dst_status_get_length(desc); + if (*nbytes == 0) { + ret = -EIO; + goto err; + } *skb = pipe->dest_ring->skb[sw_index]; pipe->dest_ring->skb[sw_index] = NULL; @@ -379,8 +380,8 @@ static void ath12k_ce_recv_process_cb(struct ath12k_ce_pipe *pipe) dma_unmap_single(ab->dev, ATH12K_SKB_RXCB(skb)->paddr, max_nbytes, DMA_FROM_DEVICE); - if (unlikely(max_nbytes < nbytes || nbytes == 0)) { - ath12k_warn(ab, "unexpected rx length (nbytes %d, max %d)", + if (unlikely(max_nbytes < nbytes)) { + ath12k_warn(ab, "rxed more than expected (nbytes %d, max %d)", nbytes, max_nbytes); dev_kfree_skb_any(skb); continue; diff --git a/drivers/net/wireless/ath/ath12k/ce.h b/drivers/net/wireless/ath/ath12k/ce.h index f9547a3945e44b39410a2225c91b0550da61c98b..857bc5f9e946a9ab3f100987a7f7822bcbf66f56 100644 --- a/drivers/net/wireless/ath/ath12k/ce.h +++ b/drivers/net/wireless/ath/ath12k/ce.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022, 2024-2025 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef ATH12K_CE_H @@ -39,8 +39,8 @@ #define PIPEDIR_INOUT_H2H 4 /* bidirectional, host to host */ /* CE address/mask */ -#define CE_HOST_IE_ADDRESS 0x75804C -#define CE_HOST_IE_2_ADDRESS 0x758050 +#define CE_HOST_IE_ADDRESS 0x00A1803C +#define CE_HOST_IE_2_ADDRESS 0x00A18040 #define CE_HOST_IE_3_ADDRESS CE_HOST_IE_ADDRESS #define CE_HOST_IE_3_SHIFT 0xC diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c index 1b07a183aaedc03114f92510f52d0d637da31568..3df8059d55129b13e10b3898b7b5b52b533e9379 100644 --- a/drivers/net/wireless/ath/ath12k/core.c +++ b/drivers/net/wireless/ath/ath12k/core.c @@ -657,7 +657,6 @@ static int ath12k_core_reconfigure_on_crash(struct ath12k_base *ab) void ath12k_core_halt(struct ath12k *ar) { - struct list_head *pos, *n; struct ath12k_base *ab = ar->ab; lockdep_assert_held(&ar->conf_mutex); @@ -672,12 +671,7 @@ void ath12k_core_halt(struct ath12k *ar) rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], NULL); synchronize_rcu(); - - spin_lock_bh(&ar->data_lock); - list_for_each_safe(pos, n, &ar->arvifs) - list_del_init(pos); - spin_unlock_bh(&ar->data_lock); - + INIT_LIST_HEAD(&ar->arvifs); idr_init(&ar->txmgmt_idr); } diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h index 18dfd7aab610c9e7d89597b294dbd3dbda586066..33f4706af880d15d6f4d7af53921e5b048f6c175 100644 --- a/drivers/net/wireless/ath/ath12k/core.h +++ b/drivers/net/wireless/ath/ath12k/core.h @@ -125,7 +125,6 @@ struct ath12k_ext_irq_grp { u32 num_irq; u32 grp_id; u64 timestamp; - bool napi_enabled; struct napi_struct napi; struct net_device napi_ndev; }; diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c index 69bf75ebd7518a19b2757e0dec5ba5611df20222..35f22a4a16cf20e6d50dccb50ee3feb51f352fcd 100644 --- a/drivers/net/wireless/ath/ath12k/dp_mon.c +++ b/drivers/net/wireless/ath/ath12k/dp_mon.c @@ -1077,8 +1077,6 @@ static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct bool is_mcbc = rxcb->is_mcbc; bool is_eapol_tkip = rxcb->is_eapol; - status->link_valid = 0; - if ((status->encoding == RX_ENC_HE) && !(status->flag & RX_FLAG_RADIOTAP_HE) && !(status->flag & RX_FLAG_SKIP_MONITOR)) { he = skb_push(msdu, sizeof(known)); diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c index 56dda76d066c31db57b233e1904aa906a842287d..8d9315038a75e4ff96dd3543e63ae2ba296cddc3 100644 --- a/drivers/net/wireless/ath/ath12k/dp_rx.c +++ b/drivers/net/wireless/ath/ath12k/dp_rx.c @@ -3683,15 +3683,6 @@ static bool ath12k_dp_rx_h_tkip_mic_err(struct ath12k *ar, struct sk_buff *msdu, l3pad_bytes = ath12k_dp_rx_h_l3pad(ab, desc); msdu_len = ath12k_dp_rx_h_msdu_len(ab, desc); - - if ((hal_rx_desc_sz + l3pad_bytes + msdu_len) > DP_RX_BUFFER_SIZE) { - ath12k_dbg(ab, ATH12K_DBG_DATA, - "invalid msdu len in tkip mic err %u\n", msdu_len); - ath12k_dbg_dump(ab, ATH12K_DBG_DATA, NULL, "", desc, - sizeof(*desc)); - return true; - } - skb_put(msdu, hal_rx_desc_sz + l3pad_bytes + msdu_len); skb_pull(msdu, hal_rx_desc_sz + l3pad_bytes); diff --git a/drivers/net/wireless/ath/ath12k/dp_tx.c b/drivers/net/wireless/ath/ath12k/dp_tx.c index 474e0d4d406ea128310c0e2cbefd1edc87449f10..25a9d4c4fae76f66bb817307ee7b046e03c079db 100644 --- a/drivers/net/wireless/ath/ath12k/dp_tx.c +++ b/drivers/net/wireless/ath/ath12k/dp_tx.c @@ -118,7 +118,7 @@ static void ath12k_hal_tx_cmd_ext_desc_setup(struct ath12k_base *ab, void *cmd, le32_encode_bits(ti->data_len, HAL_TX_MSDU_EXT_INFO1_BUF_LEN); - tcl_ext_cmd->info1 |= le32_encode_bits(1, HAL_TX_MSDU_EXT_INFO1_EXTN_OVERRIDE) | + tcl_ext_cmd->info1 = le32_encode_bits(1, HAL_TX_MSDU_EXT_INFO1_EXTN_OVERRIDE) | le32_encode_bits(ti->encap_type, HAL_TX_MSDU_EXT_INFO1_ENCAP_TYPE) | le32_encode_bits(ti->encrypt_type, diff --git a/drivers/net/wireless/ath/ath12k/hal.c b/drivers/net/wireless/ath/ath12k/hal.c index 169e16c6ed650f04087cb5edc953a66015e465cb..0b5a91ab0df49c7537d36609f27a8c9cca30b567 100644 --- a/drivers/net/wireless/ath/ath12k/hal.c +++ b/drivers/net/wireless/ath/ath12k/hal.c @@ -1565,7 +1565,7 @@ u32 ath12k_hal_ce_dst_status_get_length(struct hal_ce_srng_dst_status_desc *desc { u32 len; - len = le32_get_bits(READ_ONCE(desc->flags), HAL_CE_DST_STATUS_DESC_FLAGS_LEN); + len = le32_get_bits(desc->flags, HAL_CE_DST_STATUS_DESC_FLAGS_LEN); desc->flags &= ~cpu_to_le32(HAL_CE_DST_STATUS_DESC_FLAGS_LEN); return len; @@ -1734,7 +1734,7 @@ void ath12k_hal_srng_access_begin(struct ath12k_base *ab, struct hal_srng *srng) srng->u.src_ring.cached_tp = *(volatile u32 *)srng->u.src_ring.tp_addr; else - srng->u.dst_ring.cached_hp = READ_ONCE(*srng->u.dst_ring.hp_addr); + srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr; } /* Update cached ring head/tail pointers to HW. ath12k_hal_srng_access_begin() diff --git a/drivers/net/wireless/ath/ath12k/hal_desc.h b/drivers/net/wireless/ath/ath12k/hal_desc.h index 5fd9232ad101ee85df9f29df8d3e01ec059f1e82..6c17adc6d60b563f5c745a7be6f45c88991333d1 100644 --- a/drivers/net/wireless/ath/ath12k/hal_desc.h +++ b/drivers/net/wireless/ath/ath12k/hal_desc.h @@ -683,7 +683,7 @@ enum hal_rx_msdu_desc_reo_dest_ind { #define RX_MSDU_DESC_INFO0_DECAP_FORMAT GENMASK(30, 29) #define HAL_RX_MSDU_PKT_LENGTH_GET(val) \ - (le32_get_bits((val), RX_MSDU_DESC_INFO0_MSDU_LENGTH)) + (u32_get_bits((val), RX_MSDU_DESC_INFO0_MSDU_LENGTH)) struct rx_msdu_desc { __le32 info0; @@ -2918,7 +2918,7 @@ struct hal_mon_buf_ring { #define HAL_MON_DEST_COOKIE_BUF_ID GENMASK(17, 0) -#define HAL_MON_DEST_INFO0_END_OFFSET GENMASK(11, 0) +#define HAL_MON_DEST_INFO0_END_OFFSET GENMASK(15, 0) #define HAL_MON_DEST_INFO0_FLUSH_DETECTED BIT(16) #define HAL_MON_DEST_INFO0_END_OF_PPDU BIT(17) #define HAL_MON_DEST_INFO0_INITIATOR BIT(18) diff --git a/drivers/net/wireless/ath/ath12k/pci.c b/drivers/net/wireless/ath/ath12k/pci.c index 7dfbabf0637d238ed95a493fb22d30e8921a118f..041a9602f0e15fa30306328da85c852db84fb85a 100644 --- a/drivers/net/wireless/ath/ath12k/pci.c +++ b/drivers/net/wireless/ath/ath12k/pci.c @@ -442,11 +442,8 @@ static void __ath12k_pci_ext_irq_disable(struct ath12k_base *ab) ath12k_pci_ext_grp_disable(irq_grp); - if (irq_grp->napi_enabled) { - napi_synchronize(&irq_grp->napi); - napi_disable(&irq_grp->napi); - irq_grp->napi_enabled = false; - } + napi_synchronize(&irq_grp->napi); + napi_disable(&irq_grp->napi); } } @@ -979,11 +976,7 @@ void ath12k_pci_ext_irq_enable(struct ath12k_base *ab) for (i = 0; i < ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) { struct ath12k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; - if (!irq_grp->napi_enabled) { - napi_enable(&irq_grp->napi); - irq_grp->napi_enabled = true; - } - + napi_enable(&irq_grp->napi); ath12k_pci_ext_grp_enable(irq_grp); } } @@ -1153,9 +1146,6 @@ void ath12k_pci_power_down(struct ath12k_base *ab) { struct ath12k_pci *ab_pci = ath12k_pci_priv(ab); - if (!test_bit(ATH12K_PCI_FLAG_INIT_DONE, &ab_pci->flags)) - return; - /* restore aspm in case firmware bootup fails */ ath12k_pci_aspm_restore(ab_pci); diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c index 958ac4ed5c34915f36beaa505aeaaf579e1075c2..d87d5980325e8f1c7cdb0f5ac0f23b125c6ba0bf 100644 --- a/drivers/net/wireless/ath/ath12k/wmi.c +++ b/drivers/net/wireless/ath/ath12k/wmi.c @@ -951,24 +951,14 @@ int ath12k_wmi_vdev_down(struct ath12k *ar, u8 vdev_id) static void ath12k_wmi_put_wmi_channel(struct ath12k_wmi_channel_params *chan, struct wmi_vdev_start_req_arg *arg) { - u32 center_freq1 = arg->band_center_freq1; - memset(chan, 0, sizeof(*chan)); chan->mhz = cpu_to_le32(arg->freq); - chan->band_center_freq1 = cpu_to_le32(center_freq1); - if (arg->mode == MODE_11BE_EHT160) { - if (arg->freq > center_freq1) - chan->band_center_freq1 = cpu_to_le32(center_freq1 + 40); - else - chan->band_center_freq1 = cpu_to_le32(center_freq1 - 40); - - chan->band_center_freq2 = cpu_to_le32(center_freq1); - } else if (arg->mode == MODE_11BE_EHT80_80) { + chan->band_center_freq1 = cpu_to_le32(arg->band_center_freq1); + if (arg->mode == MODE_11AC_VHT80_80) chan->band_center_freq2 = cpu_to_le32(arg->band_center_freq2); - } else { + else chan->band_center_freq2 = 0; - } chan->info |= le32_encode_bits(arg->mode, WMI_CHAN_INFO_MODE); if (arg->passive) @@ -2076,7 +2066,7 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar, for (i = 0; i < arg->peer_eht_mcs_count; i++) { eht_mcs = ptr; - eht_mcs->tlv_header = ath12k_wmi_tlv_cmd_hdr(WMI_TAG_EHT_RATE_SET, + eht_mcs->tlv_header = ath12k_wmi_tlv_cmd_hdr(WMI_TAG_HE_RATE_SET, sizeof(*eht_mcs)); eht_mcs->rx_mcs_set = cpu_to_le32(arg->peer_eht_rx_mcs_set[i]); @@ -4138,7 +4128,6 @@ static int ath12k_service_ready_ext_event(struct ath12k_base *ab, return 0; err: - kfree(svc_rdy_ext.mac_phy_caps); ath12k_wmi_free_dbring_caps(ab); return ret; } @@ -5513,7 +5502,7 @@ static int ath12k_reg_chan_list_event(struct ath12k_base *ab, struct sk_buff *sk goto fallback; } - spin_lock_bh(&ab->base_lock); + spin_lock(&ab->base_lock); if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags)) { /* Once mac is registered, ar is valid and all CC events from * fw is considered to be received due to user requests @@ -5537,7 +5526,7 @@ static int ath12k_reg_chan_list_event(struct ath12k_base *ab, struct sk_buff *sk ab->default_regd[pdev_idx] = regd; } ab->dfs_region = reg_info->dfs_region; - spin_unlock_bh(&ab->base_lock); + spin_unlock(&ab->base_lock); goto mem_free; diff --git a/drivers/net/wireless/ath/ath6kl/bmi.c b/drivers/net/wireless/ath/ath6kl/bmi.c index 5a9e93fd1ef42a92975507ed773b86ed0d068f6c..af98e871199d317f3807dc1e333920cd3b003b7a 100644 --- a/drivers/net/wireless/ath/ath6kl/bmi.c +++ b/drivers/net/wireless/ath/ath6kl/bmi.c @@ -87,9 +87,7 @@ int ath6kl_bmi_get_target_info(struct ath6kl *ar, * We need to do some backwards compatibility to make this work. */ if (le32_to_cpu(targ_info->byte_count) != sizeof(*targ_info)) { - ath6kl_err("mismatched byte count %d vs. expected %zd\n", - le32_to_cpu(targ_info->byte_count), - sizeof(*targ_info)); + WARN_ON(1); return -EINVAL; } diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c index 18c7654bc539d173a3b4cb93018feba4ea25e3a6..533471e694007e32f07396c5e23b28ad52e7e64f 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c @@ -290,9 +290,6 @@ void ath9k_htc_swba(struct ath9k_htc_priv *priv, struct ath_common *common = ath9k_hw_common(priv->ah); int slot; - if (!priv->cur_beacon_conf.enable_beacon) - return; - if (swba->beacon_pending != 0) { priv->beacon.bmisscnt++; if (priv->beacon.bmisscnt > BSTUCK_THRESHOLD) { diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index 58386906598a7357557cda6cb4ec6bf2ec93a965..4f00400c7ffb83545d461c623f055b73481efb02 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c @@ -691,9 +691,7 @@ static int ath9k_of_init(struct ath_softc *sc) ah->ah_flags |= AH_NO_EEP_SWAP; } - ret = of_get_mac_address(np, common->macaddr); - if (ret == -EPROBE_DEFER) - return ret; + of_get_mac_address(np, common->macaddr); return 0; } diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c index debac4699687e1265f0b663c7f2797fb85c87ba0..a5265997b5767cb725339eac2fd0768d04d803ef 100644 --- a/drivers/net/wireless/ath/carl9170/usb.c +++ b/drivers/net/wireless/ath/carl9170/usb.c @@ -438,21 +438,14 @@ static void carl9170_usb_rx_complete(struct urb *urb) if (atomic_read(&ar->rx_anch_urbs) == 0) { /* - * At this point, either the system is too slow to - * cope with the enormous workload (so we have simply - * run out of active rx urbs and this unfortunately - * leads to an unpredictable device), or the device - * is not fully functional after an unsuccessful - * firmware loading attempts (so it doesn't pass - * ieee80211_register_hw() and there is no internal - * workqueue at all). + * The system is too slow to cope with + * the enormous workload. We have simply + * run out of active rx urbs and this + * unfortunately leads to an unpredictable + * device. */ - if (ar->registered) - ieee80211_queue_work(ar->hw, &ar->ping_work); - else - pr_warn_once("device %s is not registered\n", - dev_name(&ar->udev->dev)); + ieee80211_queue_work(ar->hw, &ar->ping_work); } } else { /* diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c index 906f2790f56197bfb9febf736e412f68f850991a..d594694206b33aaa2846071991dbb2e106cfb48b 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c @@ -44,8 +44,6 @@ IWL_QU_C_HR_B_FW_PRE "-" __stringify(api) ".ucode" #define IWL_QU_B_JF_B_MODULE_FIRMWARE(api) \ IWL_QU_B_JF_B_FW_PRE "-" __stringify(api) ".ucode" -#define IWL_QU_C_JF_B_MODULE_FIRMWARE(api) \ - IWL_QU_C_JF_B_FW_PRE "-" __stringify(api) ".ucode" #define IWL_CC_A_MODULE_FIRMWARE(api) \ IWL_CC_A_FW_PRE "-" __stringify(api) ".ucode" @@ -425,7 +423,6 @@ const struct iwl_cfg iwl_cfg_quz_a0_hr_b0 = { MODULE_FIRMWARE(IWL_QU_B_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL_QU_C_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); -MODULE_FIRMWARE(IWL_QU_C_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL_QUZ_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL_CC_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c index c01a9a6f06a4d0a900722671cbbef3a4e61b9f05..4a2de79f2e864b308fa48a80547f13d8dc92e792 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c @@ -580,8 +580,6 @@ static const struct iwl_dev_info iwl_dev_info_table[] = { IWL_DEV_INFO(0x7A70, 0x1692, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690i_name), IWL_DEV_INFO(0x7AF0, 0x1691, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690s_name), IWL_DEV_INFO(0x7AF0, 0x1692, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690i_name), - IWL_DEV_INFO(0x7F70, 0x1691, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690s_name), - IWL_DEV_INFO(0x7F70, 0x1692, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690i_name), IWL_DEV_INFO(0x271C, 0x0214, iwl9260_2ac_cfg, iwl9260_1_name), IWL_DEV_INFO(0x7E40, 0x1691, iwl_cfg_ma, iwl_ax411_killer_1690s_name), diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c index 5c2e8d28839765f493348f11b68238d3f0e61694..e9807fcca6ad105315a629d84be0d5948899557e 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c @@ -2701,8 +2701,6 @@ static ssize_t iwl_dbgfs_rx_queue_read(struct file *file, for (i = 0; i < trans->num_rx_queues && pos < bufsz; i++) { struct iwl_rxq *rxq = &trans_pcie->rxq[i]; - spin_lock_bh(&rxq->lock); - pos += scnprintf(buf + pos, bufsz - pos, "queue#: %2d\n", i); pos += scnprintf(buf + pos, bufsz - pos, "\tread: %u\n", @@ -2723,7 +2721,6 @@ static ssize_t iwl_dbgfs_rx_queue_read(struct file *file, pos += scnprintf(buf + pos, bufsz - pos, "\tclosed_rb_num: Not Allocated\n"); } - spin_unlock_bh(&rxq->lock); } ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); kfree(buf); @@ -3388,11 +3385,8 @@ iwl_trans_pcie_dump_data(struct iwl_trans *trans, /* Dump RBs is supported only for pre-9000 devices (1 queue) */ struct iwl_rxq *rxq = &trans_pcie->rxq[0]; /* RBs */ - spin_lock_bh(&rxq->lock); num_rbs = iwl_get_closed_rb_stts(trans, rxq); num_rbs = (num_rbs - rxq->read) & RX_QUEUE_MASK; - spin_unlock_bh(&rxq->lock); - len += num_rbs * (sizeof(*data) + sizeof(struct iwl_fw_error_dump_rb) + (PAGE_SIZE << trans_pcie->rx_page_order)); diff --git a/drivers/net/wireless/intersil/p54/fwio.c b/drivers/net/wireless/intersil/p54/fwio.c index 06e5df90b43ece874ff2b0d33754cc182d8c93d1..b52cce38115d0a9e5e7655af324fdc3e266f6011 100644 --- a/drivers/net/wireless/intersil/p54/fwio.c +++ b/drivers/net/wireless/intersil/p54/fwio.c @@ -231,7 +231,6 @@ int p54_download_eeprom(struct p54_common *priv, void *buf, mutex_lock(&priv->eeprom_mutex); priv->eeprom = buf; - priv->eeprom_slice_size = len; eeprom_hdr = skb_put(skb, eeprom_hdr_size + len); if (priv->fw_var < 0x509) { @@ -254,7 +253,6 @@ int p54_download_eeprom(struct p54_common *priv, void *buf, ret = -EBUSY; } priv->eeprom = NULL; - priv->eeprom_slice_size = 0; mutex_unlock(&priv->eeprom_mutex); return ret; } diff --git a/drivers/net/wireless/intersil/p54/p54.h b/drivers/net/wireless/intersil/p54/p54.h index 97fc863fef810f94d721bd7ecc634b92201064f8..3356ea708d81632732312e6f49add55847f1bdab 100644 --- a/drivers/net/wireless/intersil/p54/p54.h +++ b/drivers/net/wireless/intersil/p54/p54.h @@ -258,7 +258,6 @@ struct p54_common { /* eeprom handling */ void *eeprom; - size_t eeprom_slice_size; struct completion eeprom_comp; struct mutex eeprom_mutex; }; diff --git a/drivers/net/wireless/intersil/p54/txrx.c b/drivers/net/wireless/intersil/p54/txrx.c index 2deb1bb54f24bdd4bfead8a4a466df5304a4dd9d..8414aa208655f696c011ac8bf44f7c3422ec86b9 100644 --- a/drivers/net/wireless/intersil/p54/txrx.c +++ b/drivers/net/wireless/intersil/p54/txrx.c @@ -496,19 +496,14 @@ static void p54_rx_eeprom_readback(struct p54_common *priv, return ; if (priv->fw_var >= 0x509) { - if (le16_to_cpu(eeprom->v2.len) != priv->eeprom_slice_size) - return; - - memcpy(priv->eeprom, eeprom->v2.data, priv->eeprom_slice_size); + memcpy(priv->eeprom, eeprom->v2.data, + le16_to_cpu(eeprom->v2.len)); } else { - if (le16_to_cpu(eeprom->v1.len) != priv->eeprom_slice_size) - return; - - memcpy(priv->eeprom, eeprom->v1.data, priv->eeprom_slice_size); + memcpy(priv->eeprom, eeprom->v1.data, + le16_to_cpu(eeprom->v1.len)); } priv->eeprom = NULL; - priv->eeprom_slice_size = 0; tmp = p54_find_and_unlink_skb(priv, hdr->req_id); dev_kfree_skb_any(tmp); complete(&priv->eeprom_comp); diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c index 00248e2b21ea708fbb923ce08e9c427bbf27a0f8..70d3895762b4cd8d392b0cfd1cdc0c9c99b8be7d 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c @@ -17,8 +17,6 @@ static const struct usb_device_id mt76x2u_device_table[] = { { USB_DEVICE(0x057c, 0x8503) }, /* Avm FRITZ!WLAN AC860 */ { USB_DEVICE(0x7392, 0xb711) }, /* Edimax EW 7722 UAC */ { USB_DEVICE(0x0e8d, 0x7632) }, /* HC-M7662BU1 */ - { USB_DEVICE(0x0471, 0x2126) }, /* LiteOn WN4516R module, nonstandard USB connector */ - { USB_DEVICE(0x0471, 0x7600) }, /* LiteOn WN4519R module, nonstandard USB connector */ { USB_DEVICE(0x2c4e, 0x0103) }, /* Mercury UD13 */ { USB_DEVICE(0x0846, 0x9053) }, /* Netgear A6210 */ { USB_DEVICE(0x045e, 0x02e6) }, /* XBox One Wireless Adapter */ diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c index 3b5562811511587ac8d54f8045b127a27a83b9e4..33a14365ec9b981d25ca677bbf57ba76f7447e73 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c @@ -191,7 +191,6 @@ int mt76x2u_register_device(struct mt76x02_dev *dev) { struct ieee80211_hw *hw = mt76_hw(dev); struct mt76_usb *usb = &dev->mt76.usb; - bool vht; int err; INIT_DELAYED_WORK(&dev->cal_work, mt76x2u_phy_calibrate); @@ -218,17 +217,7 @@ int mt76x2u_register_device(struct mt76x02_dev *dev) /* check hw sg support in order to enable AMSDU */ hw->max_tx_fragments = dev->mt76.usb.sg_en ? MT_TX_SG_MAX_SIZE : 1; - switch (dev->mt76.rev) { - case 0x76320044: - /* these ASIC revisions do not support VHT */ - vht = false; - break; - default: - vht = true; - break; - } - - err = mt76_register_device(&dev->mt76, vht, mt76x02_rates, + err = mt76_register_device(&dev->mt76, true, mt76x02_rates, ARRAY_SIZE(mt76x02_rates)); if (err) goto fail; diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c index f4850c6daeb728994920f0344d1db8112bc1a818..7db436d908a39bd9b795783602ad454ab1883bae 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c @@ -755,9 +755,6 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr, wed->wlan.base = devm_ioremap(dev->mt76.dev, pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); - if (!wed->wlan.base) - return -ENOMEM; - wed->wlan.phy_base = pci_resource_start(pci_dev, 0); wed->wlan.wpdma_int = pci_resource_start(pci_dev, 0) + MT_INT_WED_SOURCE_CSR; @@ -785,9 +782,6 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr, wed->wlan.bus_type = MTK_WED_BUS_AXI; wed->wlan.base = devm_ioremap(dev->mt76.dev, res->start, resource_size(res)); - if (!wed->wlan.base) - return -ENOMEM; - wed->wlan.phy_base = res->start; wed->wlan.wpdma_int = res->start + MT_INT_SOURCE_CSR; wed->wlan.wpdma_mask = res->start + MT_INT_MASK_CSR; diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c index 15b7d22d3639f255fb5ef784abff1511f7f89839..31ef58e2a3d2a34052ef32cea52ce881692bcf24 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c @@ -83,11 +83,6 @@ mt7921_init_he_caps(struct mt792x_phy *phy, enum nl80211_band band, he_cap_elem->phy_cap_info[9] |= IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU | IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU; - - if (is_mt7922(phy->mt76->dev)) { - he_cap_elem->phy_cap_info[0] |= - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; - } break; case NL80211_IFTYPE_STATION: he_cap_elem->mac_cap_info[1] |= @@ -1087,9 +1082,6 @@ static void mt7921_sta_set_decap_offload(struct ieee80211_hw *hw, struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv; struct mt792x_dev *dev = mt792x_hw_dev(hw); - if (!msta->wcid.sta) - return; - mt792x_mutex_acquire(dev); if (enabled) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/dma.c b/drivers/net/wireless/mediatek/mt76/mt7996/dma.c index 04c9fd0e6b002a00ea344ead98501c484e19bf42..586e247a1e06485912f213cb3d9e9adc23665938 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/dma.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/dma.c @@ -300,7 +300,7 @@ int mt7996_dma_init(struct mt7996_dev *dev) ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU], MT_RXQ_ID(MT_RXQ_MCU), MT7996_RX_MCU_RING_SIZE, - MT7996_RX_MCU_BUF_SIZE, + MT_RX_BUF_SIZE, MT_RXQ_RING_BASE(MT_RXQ_MCU)); if (ret) return ret; @@ -309,7 +309,7 @@ int mt7996_dma_init(struct mt7996_dev *dev) ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA], MT_RXQ_ID(MT_RXQ_MCU_WA), MT7996_RX_MCU_RING_SIZE_WA, - MT7996_RX_MCU_BUF_SIZE, + MT_RX_BUF_SIZE, MT_RXQ_RING_BASE(MT_RXQ_MCU_WA)); if (ret) return ret; diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c index 375a3d6f4b384b3d3315797e1d9a8bc57cff952b..0a701dcb8a92c5bc96052057bceeba9117486b71 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c @@ -735,9 +735,6 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band, u8_encode_bits(IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_11454, IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_MASK); - eht_cap_elem->mac_cap_info[1] |= - IEEE80211_EHT_MAC_CAP1_MAX_AMPDU_LEN_MASK; - eht_cap_elem->phy_cap_info[0] = IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI | IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER | diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c index 8fa16f95e6a7b311c41662339c18b8c95cbf53de..35d9673ec0d8fc6ac88b84c149aee00fa871b8f1 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c @@ -650,14 +650,6 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, struct sk_buff *skb) status->last_amsdu = amsdu_info == MT_RXD4_LAST_AMSDU_FRAME; } - /* IEEE 802.11 fragmentation can only be applied to unicast frames. - * Hence, drop fragments with multicast/broadcast RA. - * This check fixes vulnerabilities, like CVE-2020-26145. - */ - if ((ieee80211_has_morefrags(fc) || seq_ctrl & IEEE80211_SCTL_FRAG) && - FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, rxd3) != MT_RXD3_NORMAL_U2M) - return -EINVAL; - hdr_gap = (u8 *)rxd - skb->data + 2 * remove_pad; if (hdr_trans && ieee80211_has_morefrags(fc)) { if (mt7996_reverse_frag0_hdr_trans(skb, hdr_gap)) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h index 7d2074e2b635ec8b2e5b3e6fcd5c6e55ae661d91..25bb3656123141dfa22d3198d52b945ae020c151 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h @@ -27,9 +27,6 @@ #define MT7996_RX_RING_SIZE 1536 #define MT7996_RX_MCU_RING_SIZE 512 #define MT7996_RX_MCU_RING_SIZE_WA 1024 -/* scatter-gather of mcu event is not supported in connac3 */ -#define MT7996_RX_MCU_BUF_SIZE (2048 + \ - SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) #define MT7996_FIRMWARE_WA "mediatek/mt7996/mt7996_wa.bin" #define MT7996_FIRMWARE_WM "mediatek/mt7996/mt7996_wm.bin" diff --git a/drivers/net/wireless/purelifi/plfxlc/usb.c b/drivers/net/wireless/purelifi/plfxlc/usb.c index 8151bc5e00ccc8245fcf9b6475685f752349de8b..311676c1ece0acbdfccf9ada7e926ae8f4b96897 100644 --- a/drivers/net/wireless/purelifi/plfxlc/usb.c +++ b/drivers/net/wireless/purelifi/plfxlc/usb.c @@ -503,10 +503,8 @@ int plfxlc_usb_wreq_async(struct plfxlc_usb *usb, const u8 *buffer, (void *)buffer, buffer_len, complete_fn, context); r = usb_submit_urb(urb, GFP_ATOMIC); - if (r) { - usb_free_urb(urb); + if (r) dev_err(&udev->dev, "Async write submit failed (%d)\n", r); - } return r; } diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c index 05e77d2bda3738ebd18fbb6084752bf5b9370ec5..6e47dde938909264e86cd2e1cc8e6b7192823379 100644 --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c @@ -900,10 +900,9 @@ rtl8xxxu_writeN(struct rtl8xxxu_priv *priv, u16 addr, u8 *buf, u16 len) return len; write_error: - if (rtl8xxxu_debug & RTL8XXXU_DEBUG_REG_WRITE) - dev_info(&udev->dev, - "%s: Failed to write block at addr: %04x size: %04x\n", - __func__, addr, blocksize); + dev_info(&udev->dev, + "%s: Failed to write block at addr: %04x size: %04x\n", + __func__, addr, blocksize); return -EAGAIN; } @@ -4074,14 +4073,8 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw) */ rtl8xxxu_write16(priv, REG_TRXFF_BNDY + 2, fops->trxff_boundary); - for (int retry = 5; retry >= 0 ; retry--) { - ret = rtl8xxxu_download_firmware(priv); - dev_dbg(dev, "%s: download_firmware %i\n", __func__, ret); - if (ret != -EAGAIN) - break; - if (retry) - dev_dbg(dev, "%s: retry firmware download\n", __func__); - } + ret = rtl8xxxu_download_firmware(priv); + dev_dbg(dev, "%s: download_firmware %i\n", __func__, ret); if (ret) goto exit; ret = rtl8xxxu_start_firmware(priv); diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c index 3645f212021f929dd582be5161b08891146f1028..3abd0c4c954bc1663095d33577aa627b30a7e336 100644 --- a/drivers/net/wireless/realtek/rtlwifi/pci.c +++ b/drivers/net/wireless/realtek/rtlwifi/pci.c @@ -155,16 +155,6 @@ static void _rtl_pci_update_default_setting(struct ieee80211_hw *hw) if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8192SE && init_aspm == 0x43) ppsc->support_aspm = false; - - /* RTL8723BE found on some ASUSTek laptops, such as F441U and - * X555UQ with subsystem ID 11ad:1723 are known to output large - * amounts of PCIe AER errors during and after boot up, causing - * heavy lags, poor network throughput, and occasional lock-ups. - */ - if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8723BE && - (rtlpci->pdev->subsystem_vendor == 0x11ad && - rtlpci->pdev->subsystem_device == 0x1723)) - ppsc->support_aspm = false; } static bool _rtl_pci_platform_switch_device_pci_aspm( diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c index c45c7b596ffe921a2a3e8aab615a826f0905db09..d35f26919806a7eb7ec987095e54a30d87b56d8c 100644 --- a/drivers/net/wireless/realtek/rtw88/coex.c +++ b/drivers/net/wireless/realtek/rtw88/coex.c @@ -309,7 +309,7 @@ static void rtw_coex_tdma_timer_base(struct rtw_dev *rtwdev, u8 type) { struct rtw_coex *coex = &rtwdev->coex; struct rtw_coex_stat *coex_stat = &coex->stat; - u8 para[6] = {}; + u8 para[2] = {0}; u8 times; u16 tbtt_interval = coex_stat->wl_beacon_interval; diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c index 929182424b8b8791d8cac680f68e7fe59296fe0c..0c1c1ff31085cf44a723ae8ec9de5de1a85d2d31 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c @@ -783,8 +783,7 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev, if (!check_firmware_size(data, size)) return -EINVAL; - if (rtwdev->chip->ltecoex_addr && - !ltecoex_read_reg(rtwdev, 0x38, <ecoex_bckp)) + if (!ltecoex_read_reg(rtwdev, 0x38, <ecoex_bckp)) return -EBUSY; wlan_cpu_enable(rtwdev, false); @@ -802,8 +801,7 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev, wlan_cpu_enable(rtwdev, true); - if (rtwdev->chip->ltecoex_addr && - !ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) { + if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) { ret = -EBUSY; goto dlfw_fail; } diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h index 0e76bc07bddef31c7a280726e72ec8682123cc4d..7c6c11d50ff30f966b895bb5594e18cf08d03888 100644 --- a/drivers/net/wireless/realtek/rtw88/reg.h +++ b/drivers/net/wireless/realtek/rtw88/reg.h @@ -108,7 +108,6 @@ #define BIT_SHIFT_ROM_PGE 16 #define BIT_FW_INIT_RDY BIT(15) #define BIT_FW_DW_RDY BIT(14) -#define BIT_CPU_CLK_SEL (BIT(12) | BIT(13)) #define BIT_RPWM_TOGGLE BIT(7) #define BIT_RAM_DL_SEL BIT(7) /* legacy only */ #define BIT_DMEM_CHKSUM_OK BIT(6) @@ -126,7 +125,7 @@ BIT_CHECK_SUM_OK) #define FW_READY_LEGACY (BIT_MCUFWDL_RDY | BIT_FWDL_CHK_RPT | \ BIT_WINTINI_RDY | BIT_RAM_DL_SEL) -#define FW_READY_MASK (0xffff & ~BIT_CPU_CLK_SEL) +#define FW_READY_MASK 0xffff #define REG_MCU_TST_CFG 0x84 #define VAL_FW_TRIGGER 0x1 diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c index 99318a82b43f4b6fbcefd63e0ab4403e76de9e1f..3017a9760da8dca8f982679336daafb081e0ef09 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c @@ -975,11 +975,11 @@ static void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc, } static void -rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, - u8 rs, u32 *phy_pwr_idx) +rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs) { struct rtw_hal *hal = &rtwdev->hal; static const u32 offset_txagc[2] = {0x1d00, 0x1d80}; + static u32 phy_pwr_idx; u8 rate, rate_idx, pwr_index, shift; int j; @@ -987,12 +987,12 @@ rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, rate = rtw_rate_section[rs][j]; pwr_index = hal->tx_pwr_tbl[path][rate]; shift = rate & 0x3; - *phy_pwr_idx |= ((u32)pwr_index << (shift * 8)); + phy_pwr_idx |= ((u32)pwr_index << (shift * 8)); if (shift == 0x3) { rate_idx = rate & 0xfc; rtw_write32(rtwdev, offset_txagc[path] + rate_idx, - *phy_pwr_idx); - *phy_pwr_idx = 0; + phy_pwr_idx); + phy_pwr_idx = 0; } } } @@ -1000,13 +1000,11 @@ rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, static void rtw8822b_set_tx_power_index(struct rtw_dev *rtwdev) { struct rtw_hal *hal = &rtwdev->hal; - u32 phy_pwr_idx = 0; int rs, path; for (path = 0; path < hal->rf_path_num; path++) { for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) - rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs, - &phy_pwr_idx); + rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs); } } diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c index f9b2527fbeee567a4ed9434827f4810a66baea1d..3fe5c70ce731be7c183af596a64750b652a40060 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c @@ -3991,8 +3991,7 @@ static void rtw8822c_dpk_cal_coef1(struct rtw_dev *rtwdev) rtw_write32(rtwdev, REG_NCTL0, 0x00001148); rtw_write32(rtwdev, REG_NCTL0, 0x00001149); - if (!check_hw_ready(rtwdev, 0x2d9c, MASKBYTE0, 0x55)) - rtw_warn(rtwdev, "DPK stuck, performance may be suboptimal"); + check_hw_ready(rtwdev, 0x2d9c, MASKBYTE0, 0x55); rtw_write8(rtwdev, 0x1b10, 0x0); rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x0000000c); diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c index 832a427279b40ac4c5dc2679de1f493dfe4cfd94..9043569935796bdba4e2b7f1811ba95cf9a9073c 100644 --- a/drivers/net/wireless/realtek/rtw88/sdio.c +++ b/drivers/net/wireless/realtek/rtw88/sdio.c @@ -718,7 +718,10 @@ static u8 rtw_sdio_get_tx_qsel(struct rtw_dev *rtwdev, struct sk_buff *skb, case RTW_TX_QUEUE_H2C: return TX_DESC_QSEL_H2C; case RTW_TX_QUEUE_MGMT: - return TX_DESC_QSEL_MGMT; + if (rtw_chip_wcpu_11n(rtwdev)) + return TX_DESC_QSEL_HIGH; + else + return TX_DESC_QSEL_MGMT; case RTW_TX_QUEUE_HI0: return TX_DESC_QSEL_HIGH; default: @@ -1223,7 +1226,10 @@ static void rtw_sdio_process_tx_queue(struct rtw_dev *rtwdev, return; } - rtw_sdio_indicate_tx_status(rtwdev, skb); + if (queue <= RTW_TX_QUEUE_VO) + rtw_sdio_indicate_tx_status(rtwdev, skb); + else + dev_kfree_skb_any(skb); } static void rtw_sdio_tx_handler(struct work_struct *work) diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c index eba3a2ee747f9cd3d2f32c7cc9968b4e49c97152..8f1d653282b7ecadf4750f490cb155fd917ee725 100644 --- a/drivers/net/wireless/realtek/rtw88/usb.c +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -133,7 +133,7 @@ static void rtw_usb_write(struct rtw_dev *rtwdev, u32 addr, u32 val, int len) ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTW_USB_CMD_REQ, RTW_USB_CMD_WRITE, - addr, 0, data, len, 500); + addr, 0, data, len, 30000); if (ret < 0 && ret != -ENODEV && count++ < 4) rtw_err(rtwdev, "write register 0x%x failed with %d\n", addr, ret); diff --git a/drivers/net/wireless/realtek/rtw89/cam.c b/drivers/net/wireless/realtek/rtw89/cam.c index 9a0ffaddb8360663d8164fe94942c28f5c3a6f3b..f5301c2bbf133df6995fc842b4e4b9f465e96ecc 100644 --- a/drivers/net/wireless/realtek/rtw89/cam.c +++ b/drivers/net/wireless/realtek/rtw89/cam.c @@ -6,7 +6,6 @@ #include "debug.h" #include "fw.h" #include "mac.h" -#include "ps.h" static struct sk_buff * rtw89_cam_get_sec_key_cmd(struct rtw89_dev *rtwdev, @@ -334,11 +333,9 @@ int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev, switch (key->cipher) { case WLAN_CIPHER_SUITE_WEP40: - rtw89_leave_ips_by_hwflags(rtwdev); hw_key_type = RTW89_SEC_KEY_TYPE_WEP40; break; case WLAN_CIPHER_SUITE_WEP104: - rtw89_leave_ips_by_hwflags(rtwdev); hw_key_type = RTW89_SEC_KEY_TYPE_WEP104; break; case WLAN_CIPHER_SUITE_CCMP: diff --git a/drivers/net/wireless/realtek/rtw89/pci.c b/drivers/net/wireless/realtek/rtw89/pci.c index 33b2543ee4d23086dd2ff79f2941bb41a44ec87e..30cc6e03c355e8719b006803d764d8b22b1dddc3 100644 --- a/drivers/net/wireless/realtek/rtw89/pci.c +++ b/drivers/net/wireless/realtek/rtw89/pci.c @@ -1822,87 +1822,22 @@ static int rtw89_write16_mdio_clr(struct rtw89_dev *rtwdev, u8 addr, u16 mask, u return 0; } -static int rtw89_dbi_write8(struct rtw89_dev *rtwdev, u16 addr, u8 data) -{ - u16 addr_2lsb = addr & B_AX_DBI_2LSB; - u16 write_addr; - u8 flag; - int ret; - - write_addr = addr & B_AX_DBI_ADDR_MSK; - write_addr |= u16_encode_bits(BIT(addr_2lsb), B_AX_DBI_WREN_MSK); - rtw89_write8(rtwdev, R_AX_DBI_WDATA + addr_2lsb, data); - rtw89_write16(rtwdev, R_AX_DBI_FLAG, write_addr); - rtw89_write8(rtwdev, R_AX_DBI_FLAG + 2, B_AX_DBI_WFLAG >> 16); - - ret = read_poll_timeout_atomic(rtw89_read8, flag, !flag, 10, - 10 * RTW89_PCI_WR_RETRY_CNT, false, - rtwdev, R_AX_DBI_FLAG + 2); - if (ret) - rtw89_err(rtwdev, "failed to write DBI register, addr=0x%X\n", - addr); - - return ret; -} - -static int rtw89_dbi_read8(struct rtw89_dev *rtwdev, u16 addr, u8 *value) -{ - u16 read_addr = addr & B_AX_DBI_ADDR_MSK; - u8 flag; - int ret; - - rtw89_write16(rtwdev, R_AX_DBI_FLAG, read_addr); - rtw89_write8(rtwdev, R_AX_DBI_FLAG + 2, B_AX_DBI_RFLAG >> 16); - - ret = read_poll_timeout_atomic(rtw89_read8, flag, !flag, 10, - 10 * RTW89_PCI_WR_RETRY_CNT, false, - rtwdev, R_AX_DBI_FLAG + 2); - if (ret) { - rtw89_err(rtwdev, "failed to read DBI register, addr=0x%X\n", - addr); - return ret; - } - - read_addr = R_AX_DBI_RDATA + (addr & 3); - *value = rtw89_read8(rtwdev, read_addr); - - return 0; -} - static int rtw89_pci_write_config_byte(struct rtw89_dev *rtwdev, u16 addr, u8 data) { struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; - enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; struct pci_dev *pdev = rtwpci->pdev; - int ret; - - ret = pci_write_config_byte(pdev, addr, data); - if (!ret) - return 0; - if (chip_id == RTL8852A || chip_id == RTL8852B || chip_id == RTL8851B) - ret = rtw89_dbi_write8(rtwdev, addr, data); - - return ret; + return pci_write_config_byte(pdev, addr, data); } static int rtw89_pci_read_config_byte(struct rtw89_dev *rtwdev, u16 addr, u8 *value) { struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; - enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; struct pci_dev *pdev = rtwpci->pdev; - int ret; - ret = pci_read_config_byte(pdev, addr, value); - if (!ret) - return 0; - - if (chip_id == RTL8852A || chip_id == RTL8852B || chip_id == RTL8851B) - ret = rtw89_dbi_read8(rtwdev, addr, value); - - return ret; + return pci_read_config_byte(pdev, addr, value); } static int rtw89_pci_config_byte_set(struct rtw89_dev *rtwdev, u16 addr, diff --git a/drivers/net/wireless/realtek/rtw89/pci.h b/drivers/net/wireless/realtek/rtw89/pci.h index 119c0608b91a8a3be428ebc8fcb613e253660d6d..4259b79b138fb4b787e911e365c5968942364eb1 100644 --- a/drivers/net/wireless/realtek/rtw89/pci.h +++ b/drivers/net/wireless/realtek/rtw89/pci.h @@ -42,7 +42,6 @@ #define B_AX_DBI_WFLAG BIT(16) #define B_AX_DBI_WREN_MSK GENMASK(15, 12) #define B_AX_DBI_ADDR_MSK GENMASK(11, 2) -#define B_AX_DBI_2LSB GENMASK(1, 0) #define R_AX_DBI_WDATA 0x1094 #define R_AX_DBI_RDATA 0x1098 diff --git a/drivers/net/wireless/realtek/rtw89/regd.c b/drivers/net/wireless/realtek/rtw89/regd.c index 91f0895d9f54046eec6255f67d9b880be7357af3..9e2328db1865603d2fb7597fdb2023ce8c4232c2 100644 --- a/drivers/net/wireless/realtek/rtw89/regd.c +++ b/drivers/net/wireless/realtek/rtw89/regd.c @@ -451,7 +451,6 @@ void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); struct rtw89_dev *rtwdev = hw->priv; - wiphy_lock(wiphy); mutex_lock(&rtwdev->mutex); rtw89_leave_ps_mode(rtwdev); @@ -469,7 +468,6 @@ void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request exit: mutex_unlock(&rtwdev->mutex); - wiphy_unlock(wiphy); } static void __rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev) diff --git a/drivers/net/wireless/realtek/rtw89/ser.c b/drivers/net/wireless/realtek/rtw89/ser.c index 45165cf3e824e6605a9df1192cb5ffd543fdcde2..01b17b8f4ff9dca996ba95dfcb06c986d0d14c0b 100644 --- a/drivers/net/wireless/realtek/rtw89/ser.c +++ b/drivers/net/wireless/realtek/rtw89/ser.c @@ -156,11 +156,9 @@ static void ser_state_run(struct rtw89_ser *ser, u8 evt) rtw89_debug(rtwdev, RTW89_DBG_SER, "ser: %s receive %s\n", ser_st_name(ser), ser_ev_name(ser, evt)); - wiphy_lock(rtwdev->hw->wiphy); mutex_lock(&rtwdev->mutex); rtw89_leave_lps(rtwdev); mutex_unlock(&rtwdev->mutex); - wiphy_unlock(rtwdev->hw->wiphy); ser->st_tbl[ser->state].st_func(ser, evt); } @@ -678,11 +676,9 @@ static void ser_l2_reset_st_hdl(struct rtw89_ser *ser, u8 evt) switch (evt) { case SER_EV_STATE_IN: - wiphy_lock(rtwdev->hw->wiphy); mutex_lock(&rtwdev->mutex); ser_l2_reset_st_pre_hdl(ser); mutex_unlock(&rtwdev->mutex); - wiphy_unlock(rtwdev->hw->wiphy); ieee80211_restart_hw(rtwdev->hw); ser_set_alarm(ser, SER_RECFG_TIMEOUT, SER_EV_L2_RECFG_TIMEOUT); diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c index f5f48f7e6d26e31ca6f9b64082e91fc7973de110..d86a1bd7aab089d9681508c2379f9c70443a5de5 100644 --- a/drivers/net/wireless/virtual/mac80211_hwsim.c +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c @@ -1201,11 +1201,6 @@ static void mac80211_hwsim_set_tsf(struct ieee80211_hw *hw, /* MLD not supported here */ u32 bcn_int = data->link_data[0].beacon_int; u64 delta = abs(tsf - now); - struct ieee80211_bss_conf *conf; - - conf = link_conf_dereference_protected(vif, data->link_data[0].link_id); - if (conf && !conf->enable_beacon) - return; /* adjust after beaconing with new timestamp at old TBTT */ if (tsf > now) { diff --git a/drivers/net/wireless/zydas/zd1211rw/zd_mac.c b/drivers/net/wireless/zydas/zd1211rw/zd_mac.c index 278875c02f41f83fc6ca710deca6a63f2fbda32f..5d534e15a844f7e9cb88d0cd2eb8477915c5465d 100644 --- a/drivers/net/wireless/zydas/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zydas/zd1211rw/zd_mac.c @@ -583,11 +583,7 @@ void zd_mac_tx_to_dev(struct sk_buff *skb, int error) skb_queue_tail(q, skb); while (skb_queue_len(q) > ZD_MAC_MAX_ACK_WAITERS) { - skb = skb_dequeue(q); - if (!skb) - break; - - zd_mac_tx_status(hw, skb, + zd_mac_tx_status(hw, skb_dequeue(q), mac->ack_pending ? mac->ack_signal : 0, NULL); mac->ack_pending = 0; diff --git a/drivers/net/wwan/t7xx/t7xx_netdev.c b/drivers/net/wwan/t7xx/t7xx_netdev.c index d879424093b78218ef47683aa88805a3d9387593..3ef4a8a4f8fdbced3b31115db04136292e9269c8 100644 --- a/drivers/net/wwan/t7xx/t7xx_netdev.c +++ b/drivers/net/wwan/t7xx/t7xx_netdev.c @@ -296,7 +296,7 @@ static int t7xx_ccmni_wwan_newlink(void *ctxt, struct net_device *dev, u32 if_id ccmni->ctlb = ctlb; ccmni->dev = dev; atomic_set(&ccmni->usage, 0); - WRITE_ONCE(ctlb->ccmni_inst[if_id], ccmni); + ctlb->ccmni_inst[if_id] = ccmni; ret = register_netdevice(dev); if (ret) @@ -318,7 +318,6 @@ static void t7xx_ccmni_wwan_dellink(void *ctxt, struct net_device *dev, struct l if (WARN_ON(ctlb->ccmni_inst[if_id] != ccmni)) return; - WRITE_ONCE(ctlb->ccmni_inst[if_id], NULL); unregister_netdevice(dev); } @@ -414,7 +413,7 @@ static void t7xx_ccmni_recv_skb(struct t7xx_ccmni_ctrl *ccmni_ctlb, struct sk_bu skb_cb = T7XX_SKB_CB(skb); netif_id = skb_cb->netif_idx; - ccmni = READ_ONCE(ccmni_ctlb->ccmni_inst[netif_id]); + ccmni = ccmni_ctlb->ccmni_inst[netif_id]; if (!ccmni) { dev_kfree_skb(skb); return; @@ -436,7 +435,7 @@ static void t7xx_ccmni_recv_skb(struct t7xx_ccmni_ctrl *ccmni_ctlb, struct sk_bu static void t7xx_ccmni_queue_tx_irq_notify(struct t7xx_ccmni_ctrl *ctlb, int qno) { - struct t7xx_ccmni *ccmni = READ_ONCE(ctlb->ccmni_inst[0]); + struct t7xx_ccmni *ccmni = ctlb->ccmni_inst[0]; struct netdev_queue *net_queue; if (netif_running(ccmni->dev) && atomic_read(&ccmni->usage) > 0) { @@ -448,7 +447,7 @@ static void t7xx_ccmni_queue_tx_irq_notify(struct t7xx_ccmni_ctrl *ctlb, int qno static void t7xx_ccmni_queue_tx_full_notify(struct t7xx_ccmni_ctrl *ctlb, int qno) { - struct t7xx_ccmni *ccmni = READ_ONCE(ctlb->ccmni_inst[0]); + struct t7xx_ccmni *ccmni = ctlb->ccmni_inst[0]; struct netdev_queue *net_queue; if (atomic_read(&ccmni->usage) > 0) { @@ -466,7 +465,7 @@ static void t7xx_ccmni_queue_state_notify(struct t7xx_pci_dev *t7xx_dev, if (ctlb->md_sta != MD_STATE_READY) return; - if (!READ_ONCE(ctlb->ccmni_inst[0])) { + if (!ctlb->ccmni_inst[0]) { dev_warn(&t7xx_dev->pdev->dev, "No netdev registered yet\n"); return; } diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 13221cc0d17d437be255da9dbe329e79a643a411..6e2d0fda3ba4aa885c0da5f4778aa495b5e3fe06 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -689,10 +689,6 @@ blk_status_t nvme_fail_nonready_command(struct nvme_ctrl *ctrl, !test_bit(NVME_CTRL_FAILFAST_EXPIRED, &ctrl->flags) && !blk_noretry_request(rq) && !(rq->cmd_flags & REQ_NVME_MPATH)) return BLK_STS_RESOURCE; - - if (!(rq->rq_flags & RQF_DONTPREP)) - nvme_clear_nvme_request(rq); - return nvme_host_path_error(rq); } EXPORT_SYMBOL_GPL(nvme_fail_nonready_command); @@ -3600,7 +3596,7 @@ static void nvme_ns_add_to_ctrl_list(struct nvme_ns *ns) return; } } - list_add_rcu(&ns->list, &ns->ctrl->namespaces); + list_add(&ns->list, &ns->ctrl->namespaces); } static void nvme_alloc_ns(struct nvme_ctrl *ctrl, struct nvme_ns_info *info) diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c index 5cf050e562b73442e6dd8a8dd29d1ad4f01c9c8e..4ce31f9f069475bcce369d348932ac13987f191d 100644 --- a/drivers/nvme/host/ioctl.c +++ b/drivers/nvme/host/ioctl.c @@ -526,14 +526,16 @@ static enum rq_end_io_ret nvme_uring_cmd_end_io(struct request *req, pdu->u.result = le64_to_cpu(nvme_req(req)->result.u64); /* - * IOPOLL could potentially complete this request directly, but - * if multiple rings are polling on the same queue, then it's possible - * for one ring to find completions for another ring. Punting the - * completion via task_work will always direct it to the right - * location, rather than potentially complete requests for ringA - * under iopoll invocations from ringB. + * For iopoll, complete it directly. + * Otherwise, move the completion to task work. */ - io_uring_cmd_do_in_task_lazy(ioucmd, nvme_uring_task_cb); + if (blk_rq_is_poll(req)) { + WRITE_ONCE(ioucmd->cookie, NULL); + nvme_uring_task_cb(ioucmd, IO_URING_F_UNLOCKED); + } else { + io_uring_cmd_do_in_task_lazy(ioucmd, nvme_uring_task_cb); + } + return RQ_END_IO_FREE; } diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 97ab91a479d112d1c62f443dad482b9e92d2e081..1e5c8220e365cad371da3a9364a1464366ff7d9e 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -3429,9 +3429,6 @@ static const struct pci_device_id nvme_id_table[] = { .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1217, 0x8760), /* O2 Micro 64GB Steam Deck */ .driver_data = NVME_QUIRK_DMAPOOL_ALIGN_512, }, - { PCI_DEVICE(0x126f, 0x1001), /* Silicon Motion generic */ - .driver_data = NVME_QUIRK_NO_DEEPEST_PS | - NVME_QUIRK_IGNORE_DEV_SUBNQN, }, { PCI_DEVICE(0x126f, 0x2262), /* Silicon Motion generic */ .driver_data = NVME_QUIRK_NO_DEEPEST_PS | NVME_QUIRK_BOGUS_NID, }, @@ -3455,9 +3452,6 @@ static const struct pci_device_id nvme_id_table[] = { NVME_QUIRK_IGNORE_DEV_SUBNQN, }, { PCI_DEVICE(0x15b7, 0x5008), /* Sandisk SN530 */ .driver_data = NVME_QUIRK_BROKEN_MSI }, - { PCI_DEVICE(0x15b7, 0x5009), /* Sandisk SN550 */ - .driver_data = NVME_QUIRK_BROKEN_MSI | - NVME_QUIRK_NO_DEEPEST_PS }, { PCI_DEVICE(0x1987, 0x5012), /* Phison E12 */ .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1987, 0x5016), /* Phison E16 */ @@ -3541,8 +3535,6 @@ static const struct pci_device_id nvme_id_table[] = { .driver_data = NVME_QUIRK_NO_DEEPEST_PS, }, { PCI_DEVICE(0x1e49, 0x0041), /* ZHITAI TiPro7000 NVMe SSD */ .driver_data = NVME_QUIRK_NO_DEEPEST_PS, }, - { PCI_DEVICE(0x025e, 0xf1ac), /* SOLIDIGM P44 pro SSDPFKKW020X7 */ - .driver_data = NVME_QUIRK_NO_DEEPEST_PS, }, { PCI_DEVICE(0xc0a9, 0x540a), /* Crucial P2 */ .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1d97, 0x2263), /* Lexar NM610 */ diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index aeeb7455fc2e7dc9a90fa0e124317e1bec3e469d..4b35bdcac185ff42be57dd6cacb1a686cf974b32 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -613,13 +613,12 @@ fcloop_fcp_recv_work(struct work_struct *work) { struct fcloop_fcpreq *tfcp_req = container_of(work, struct fcloop_fcpreq, fcp_rcv_work); - struct nvmefc_fcp_req *fcpreq; + struct nvmefc_fcp_req *fcpreq = tfcp_req->fcpreq; unsigned long flags; int ret = 0; bool aborted = false; spin_lock_irqsave(&tfcp_req->reqlock, flags); - fcpreq = tfcp_req->fcpreq; switch (tfcp_req->inistate) { case INI_IO_START: tfcp_req->inistate = INI_IO_ACTIVE; @@ -634,19 +633,16 @@ fcloop_fcp_recv_work(struct work_struct *work) } spin_unlock_irqrestore(&tfcp_req->reqlock, flags); - if (unlikely(aborted)) { - /* the abort handler will call fcloop_call_host_done */ - return; - } - - if (unlikely(check_for_drop(tfcp_req))) { - pr_info("%s: dropped command ********\n", __func__); - return; + if (unlikely(aborted)) + ret = -ECANCELED; + else { + if (likely(!check_for_drop(tfcp_req))) + ret = nvmet_fc_rcv_fcp_req(tfcp_req->tport->targetport, + &tfcp_req->tgt_fcp_req, + fcpreq->cmdaddr, fcpreq->cmdlen); + else + pr_info("%s: dropped command ********\n", __func__); } - - ret = nvmet_fc_rcv_fcp_req(tfcp_req->tport->targetport, - &tfcp_req->tgt_fcp_req, - fcpreq->cmdaddr, fcpreq->cmdlen); if (ret) fcloop_call_host_done(fcpreq, tfcp_req, ret); } @@ -661,10 +657,9 @@ fcloop_fcp_abort_recv_work(struct work_struct *work) unsigned long flags; spin_lock_irqsave(&tfcp_req->reqlock, flags); + fcpreq = tfcp_req->fcpreq; switch (tfcp_req->inistate) { case INI_IO_ABORTED: - fcpreq = tfcp_req->fcpreq; - tfcp_req->fcpreq = NULL; break; case INI_IO_COMPLETED: completed = true; @@ -686,6 +681,10 @@ fcloop_fcp_abort_recv_work(struct work_struct *work) nvmet_fc_rcv_fcp_abort(tfcp_req->tport->targetport, &tfcp_req->tgt_fcp_req); + spin_lock_irqsave(&tfcp_req->reqlock, flags); + tfcp_req->fcpreq = NULL; + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); + fcloop_call_host_done(fcpreq, tfcp_req, -ECANCELED); /* call_host_done releases reference for abort downcall */ } diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 6a539c3b8b530e4836ce8000950d82aa217c0b86..a0af659a4c4a2177a76c6853b8ddca81e93404b4 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -1456,9 +1456,6 @@ static void nvmet_tcp_restore_socket_callbacks(struct nvmet_tcp_queue *queue) { struct socket *sock = queue->sock; - if (!queue->state_change) - return; - write_lock_bh(&sock->sk->sk_callback_lock); sock->sk->sk_data_ready = queue->data_ready; sock->sk->sk_state_change = queue->state_change; diff --git a/drivers/nvmem/imx-ocotp-ele.c b/drivers/nvmem/imx-ocotp-ele.c index 66e468af0f2fe8a66e9fe8655eb6196a7af78817..1356ec93bfd00cacdc6840f4d294ef6b14da80a3 100644 --- a/drivers/nvmem/imx-ocotp-ele.c +++ b/drivers/nvmem/imx-ocotp-ele.c @@ -12,7 +12,6 @@ #include #include #include -#include /* ETH_ALEN */ enum fuse_type { FUSE_FSB = 1, @@ -115,11 +114,9 @@ static int imx_ocotp_cell_pp(void *context, const char *id, int index, int i; /* Deal with some post processing of nvmem cell data */ - if (id && !strcmp(id, "mac-address")) { - bytes = min(bytes, ETH_ALEN); + if (id && !strcmp(id, "mac-address")) for (i = 0; i < bytes / 2; i++) swap(buf[i], buf[bytes - i - 1]); - } return 0; } diff --git a/drivers/nvmem/imx-ocotp.c b/drivers/nvmem/imx-ocotp.c index 7bf7656d4f96318864fe12c21dbf60ead34fd55c..79dd4fda03295ac3e2574480c595e6c5d370ba50 100644 --- a/drivers/nvmem/imx-ocotp.c +++ b/drivers/nvmem/imx-ocotp.c @@ -23,7 +23,6 @@ #include #include #include -#include /* ETH_ALEN */ #define IMX_OCOTP_OFFSET_B0W0 0x400 /* Offset from base address of the * OTP Bank0 Word0 @@ -228,11 +227,9 @@ static int imx_ocotp_cell_pp(void *context, const char *id, int index, int i; /* Deal with some post processing of nvmem cell data */ - if (id && !strcmp(id, "mac-address")) { - bytes = min(bytes, ETH_ALEN); + if (id && !strcmp(id, "mac-address")) for (i = 0; i < bytes / 2; i++) swap(buf[i], buf[bytes - i - 1]); - } return 0; } diff --git a/drivers/nvmem/u-boot-env.c b/drivers/nvmem/u-boot-env.c index 8712d3709a2683469f58dc4601cd68cde43c4556..adabbfdad6fb6d13b9c3b2226b920f8ced66a3d2 100644 --- a/drivers/nvmem/u-boot-env.c +++ b/drivers/nvmem/u-boot-env.c @@ -132,7 +132,7 @@ static int u_boot_env_parse(struct u_boot_env *priv) size_t crc32_data_offset; size_t crc32_data_len; size_t crc32_offset; - uint32_t *crc32_addr; + __le32 *crc32_addr; size_t data_offset; size_t data_len; size_t dev_size; @@ -183,8 +183,8 @@ static int u_boot_env_parse(struct u_boot_env *priv) goto err_kfree; } - crc32_addr = (uint32_t *)(buf + crc32_offset); - crc32 = *crc32_addr; + crc32_addr = (__le32 *)(buf + crc32_offset); + crc32 = le32_to_cpu(*crc32_addr); crc32_data_len = dev_size - crc32_data_offset; data_len = dev_size - data_offset; diff --git a/drivers/pci/controller/cadence/pcie-cadence-ep.c b/drivers/pci/controller/cadence/pcie-cadence-ep.c index 08fb16918043f4d03eb5168eaabbe3ab1f59780a..a87dab9abba26fb8e056ef4815f23dcaa9bf0414 100644 --- a/drivers/pci/controller/cadence/pcie-cadence-ep.c +++ b/drivers/pci/controller/cadence/pcie-cadence-ep.c @@ -294,14 +294,13 @@ static int cdns_pcie_ep_set_msix(struct pci_epc *epc, u8 fn, u8 vfn, struct cdns_pcie *pcie = &ep->pcie; u32 cap = CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET; u32 val, reg; - u16 actual_interrupts = interrupts + 1; fn = cdns_pcie_get_fn_from_vfn(pcie, fn, vfn); reg = cap + PCI_MSIX_FLAGS; val = cdns_pcie_ep_fn_readw(pcie, fn, reg); val &= ~PCI_MSIX_FLAGS_QSIZE; - val |= interrupts; /* 0's based value */ + val |= interrupts; cdns_pcie_ep_fn_writew(pcie, fn, reg, val); /* Set MSIX BAR and offset */ @@ -311,7 +310,7 @@ static int cdns_pcie_ep_set_msix(struct pci_epc *epc, u8 fn, u8 vfn, /* Set PBA BAR and offset. BAR must match MSIX BAR */ reg = cap + PCI_MSIX_PBA; - val = (offset + (actual_interrupts * PCI_MSIX_ENTRY_SIZE)) | bir; + val = (offset + (interrupts * PCI_MSIX_ENTRY_SIZE)) | bir; cdns_pcie_ep_fn_writel(pcie, fn, reg, val); return 0; diff --git a/drivers/pci/controller/cadence/pcie-cadence-host.c b/drivers/pci/controller/cadence/pcie-cadence-host.c index 741e10a575ec7525f7d03f262ec90b8d54eb654f..8af95e9da7cec6031a50a58318b015f115bb0204 100644 --- a/drivers/pci/controller/cadence/pcie-cadence-host.c +++ b/drivers/pci/controller/cadence/pcie-cadence-host.c @@ -570,5 +570,14 @@ int cdns_pcie_host_setup(struct cdns_pcie_rc *rc) if (!bridge->ops) bridge->ops = &cdns_pcie_host_ops; - return pci_host_probe(bridge); + ret = pci_host_probe(bridge); + if (ret < 0) + goto err_init; + + return 0; + + err_init: + pm_runtime_put_sync(dev); + + return ret; } diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c index 717af1b757f0a5bda656f504bc97df95fc8728ce..2b60d20dfdf59d52e892cfcfab3a022a4535779a 100644 --- a/drivers/pci/controller/dwc/pcie-designware.c +++ b/drivers/pci/controller/dwc/pcie-designware.c @@ -748,19 +748,22 @@ static void dw_pcie_link_set_max_link_width(struct dw_pcie *pci, u32 num_lanes) /* Set link width speed control register */ lwsc = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL); lwsc &= ~PORT_LOGIC_LINK_WIDTH_MASK; - lwsc |= PORT_LOGIC_LINK_WIDTH_1_LANES; switch (num_lanes) { case 1: plc |= PORT_LINK_MODE_1_LANES; + lwsc |= PORT_LOGIC_LINK_WIDTH_1_LANES; break; case 2: plc |= PORT_LINK_MODE_2_LANES; + lwsc |= PORT_LOGIC_LINK_WIDTH_2_LANES; break; case 4: plc |= PORT_LINK_MODE_4_LANES; + lwsc |= PORT_LOGIC_LINK_WIDTH_4_LANES; break; case 8: plc |= PORT_LINK_MODE_8_LANES; + lwsc |= PORT_LOGIC_LINK_WIDTH_8_LANES; break; default: dev_err(pci->dev, "num-lanes %u: invalid value\n", num_lanes); diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c index 8af7a837a0612cdb25221046ae44f11106c4cf51..9b1256da096cb64e916132ec051c22747c34260c 100644 --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c @@ -275,8 +275,8 @@ static int rockchip_pcie_phy_init(struct rockchip_pcie *rockchip) static void rockchip_pcie_phy_deinit(struct rockchip_pcie *rockchip) { - phy_power_off(rockchip->phy); phy_exit(rockchip->phy); + phy_power_off(rockchip->phy); } static const struct dw_pcie_ops dw_pcie_ops = { diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c index 8dfea64a51e0f8e9bddb325ab02a85b6212f30e7..f7a248393a8f1609b76d93545bafb965f5e8ffb3 100644 --- a/drivers/pci/controller/pcie-apple.c +++ b/drivers/pci/controller/pcie-apple.c @@ -541,7 +541,7 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, rmw_set(PORT_APPCLK_EN, port->base + PORT_APPCLK); /* Assert PERST# before setting up the clock */ - gpiod_set_value_cansleep(reset, 1); + gpiod_set_value(reset, 1); ret = apple_pcie_setup_refclk(pcie, port); if (ret < 0) @@ -552,7 +552,7 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, /* Deassert PERST# */ rmw_set(PORT_PERST_OFF, port->base + PORT_PERST); - gpiod_set_value_cansleep(reset, 0); + gpiod_set_value(reset, 0); /* Wait for 100ms after PERST# deassertion (PCIe r5.0, 6.6.1) */ msleep(100); @@ -585,9 +585,6 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, list_add_tail(&port->entry, &pcie->ports); init_completion(&pcie->event); - /* In the success path, we keep a reference to np around */ - of_node_get(np); - ret = apple_pcie_port_register_irqs(port); WARN_ON(ret); @@ -767,6 +764,7 @@ static int apple_pcie_init(struct pci_config_window *cfg) { struct device *dev = cfg->parent; struct platform_device *platform = to_platform_device(dev); + struct device_node *of_port; struct apple_pcie *pcie; int ret; @@ -789,10 +787,11 @@ static int apple_pcie_init(struct pci_config_window *cfg) if (ret) return ret; - for_each_available_child_of_node_scoped(dev->of_node, of_port) { + for_each_child_of_node(dev->of_node, of_port) { ret = apple_pcie_setup_port(pcie, of_port); if (ret) { dev_err(pcie->dev, "Port %pOF setup fail: %d\n", of_port, ret); + of_node_put(of_port); return ret; } } diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 4541dfbf0e1b6387781c70f400b25e0c329c0404..095fa1910d36db2a82c6d3d1a316076a95b18877 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -5221,7 +5221,7 @@ int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type) delay); if (!pcie_wait_for_link_delay(dev, true, delay)) { /* Did not train, no need to wait any further */ - pci_info(dev, "Data Link Layer Link Active not set in %d msec\n", delay); + pci_info(dev, "Data Link Layer Link Active not set in 1000 msec\n"); return -ENOTTY; } @@ -5823,8 +5823,7 @@ static void pci_slot_unlock(struct pci_slot *slot) continue; if (dev->subordinate) pci_bus_unlock(dev->subordinate); - else - pci_dev_unlock(dev); + pci_dev_unlock(dev); } } diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c index 3c3ecb9cf57afb653e16ce5686ac11708195c77b..a5cec2a4e057d1e7a0d6302fbec52710fddd4f2f 100644 --- a/drivers/pci/pcie/dpc.c +++ b/drivers/pci/pcie/dpc.c @@ -263,7 +263,7 @@ static int dpc_get_aer_uncorrect_severity(struct pci_dev *dev, void dpc_process_error(struct pci_dev *pdev) { u16 cap = pdev->dpc_cap, status, source, reason, ext_reason; - struct aer_err_info info = {}; + struct aer_err_info info; pci_read_config_word(pdev, cap + PCI_EXP_DPC_STATUS, &status); pci_read_config_word(pdev, cap + PCI_EXP_DPC_SOURCE_ID, &source); diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index d67ea16e69e6ac09ea90de71a8670a4d5d075df8..70f484b811dea7e715a06e3ff6069bbc4b785b82 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -4988,18 +4988,6 @@ static int pci_quirk_brcm_acs(struct pci_dev *dev, u16 acs_flags) PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF); } -static int pci_quirk_loongson_acs(struct pci_dev *dev, u16 acs_flags) -{ - /* - * Loongson PCIe Root Ports don't advertise an ACS capability, but - * they do not allow peer-to-peer transactions between Root Ports. - * Allow each Root Port to be in a separate IOMMU group by masking - * SV/RR/CR/UF bits. - */ - return pci_acs_ctrl_enabled(acs_flags, - PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF); -} - /* * Wangxun 40G/25G/10G/1G NICs have no ACS capability, but on * multi-function devices, the hardware isolates the functions by @@ -5133,17 +5121,6 @@ static const struct pci_dev_acs_enabled { { PCI_VENDOR_ID_BROADCOM, 0x1762, pci_quirk_mf_endpoint_acs }, { PCI_VENDOR_ID_BROADCOM, 0x1763, pci_quirk_mf_endpoint_acs }, { PCI_VENDOR_ID_BROADCOM, 0xD714, pci_quirk_brcm_acs }, - /* Loongson PCIe Root Ports */ - { PCI_VENDOR_ID_LOONGSON, 0x3C09, pci_quirk_loongson_acs }, - { PCI_VENDOR_ID_LOONGSON, 0x3C19, pci_quirk_loongson_acs }, - { PCI_VENDOR_ID_LOONGSON, 0x3C29, pci_quirk_loongson_acs }, - { PCI_VENDOR_ID_LOONGSON, 0x7A09, pci_quirk_loongson_acs }, - { PCI_VENDOR_ID_LOONGSON, 0x7A19, pci_quirk_loongson_acs }, - { PCI_VENDOR_ID_LOONGSON, 0x7A29, pci_quirk_loongson_acs }, - { PCI_VENDOR_ID_LOONGSON, 0x7A39, pci_quirk_loongson_acs }, - { PCI_VENDOR_ID_LOONGSON, 0x7A49, pci_quirk_loongson_acs }, - { PCI_VENDOR_ID_LOONGSON, 0x7A59, pci_quirk_loongson_acs }, - { PCI_VENDOR_ID_LOONGSON, 0x7A69, pci_quirk_loongson_acs }, /* Amazon Annapurna Labs */ { PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS, 0x0031, pci_quirk_al_acs }, /* Zhaoxin multi-function devices */ diff --git a/drivers/perf/amlogic/meson_ddr_pmu_core.c b/drivers/perf/amlogic/meson_ddr_pmu_core.c index 5f8699612a9ad1df3b4b8515249237335c41b971..bbc7285fd934a3be5362d52c3e8c556da14e2fc2 100644 --- a/drivers/perf/amlogic/meson_ddr_pmu_core.c +++ b/drivers/perf/amlogic/meson_ddr_pmu_core.c @@ -510,7 +510,7 @@ int meson_ddr_pmu_create(struct platform_device *pdev) fmt_attr_fill(pmu->info.hw_info->fmt_attr); - pmu->cpu = raw_smp_processor_id(); + pmu->cpu = smp_processor_id(); name = devm_kasprintf(&pdev->dev, GFP_KERNEL, DDR_PERF_DEV_NAME); if (!name) diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c index 77aa37de59880f33eeb35f43747333dd5a34e2d5..7bd1733d79770319039c75c10ef64c67079599d2 100644 --- a/drivers/perf/arm-cmn.c +++ b/drivers/perf/arm-cmn.c @@ -684,8 +684,8 @@ static umode_t arm_cmn_event_attr_is_visible(struct kobject *kobj, if ((chan == 5 && cmn->rsp_vc_num < 2) || (chan == 6 && cmn->dat_vc_num < 2) || - (chan == 7 && cmn->req_vc_num < 2) || - (chan == 8 && cmn->snp_vc_num < 2)) + (chan == 7 && cmn->snp_vc_num < 2) || + (chan == 8 && cmn->req_vc_num < 2)) return 0; } @@ -841,8 +841,8 @@ static umode_t arm_cmn_event_attr_is_visible(struct kobject *kobj, _CMN_EVENT_XP(pub_##_name, (_event) | (4 << 5)), \ _CMN_EVENT_XP(rsp2_##_name, (_event) | (5 << 5)), \ _CMN_EVENT_XP(dat2_##_name, (_event) | (6 << 5)), \ - _CMN_EVENT_XP(req2_##_name, (_event) | (7 << 5)), \ - _CMN_EVENT_XP(snp2_##_name, (_event) | (8 << 5)) + _CMN_EVENT_XP(snp2_##_name, (_event) | (7 << 5)), \ + _CMN_EVENT_XP(req2_##_name, (_event) | (8 << 5)) #define CMN_EVENT_XP_DAT(_name, _event) \ _CMN_EVENT_XP_PORT(dat_##_name, (_event) | (3 << 5)), \ @@ -2443,7 +2443,6 @@ static int arm_cmn_probe(struct platform_device *pdev) cmn->dev = &pdev->dev; cmn->part = (unsigned long)device_get_match_data(cmn->dev); - cmn->cpu = cpumask_local_spread(0, dev_to_node(cmn->dev)); platform_set_drvdata(pdev, cmn); if (cmn->part == PART_CMN600 && has_acpi_companion(cmn->dev)) { @@ -2471,6 +2470,7 @@ static int arm_cmn_probe(struct platform_device *pdev) if (err) return err; + cmn->cpu = cpumask_local_spread(0, dev_to_node(cmn->dev)); cmn->pmu = (struct pmu) { .module = THIS_MODULE, .attr_groups = arm_cmn_attr_groups, diff --git a/drivers/phy/freescale/phy-fsl-imx8mq-usb.c b/drivers/phy/freescale/phy-fsl-imx8mq-usb.c index f914f016b3d2ce17ef15b3d8a05fbbab24dcc94d..adc6394626ce83df17d1859f98a0a213614515a4 100644 --- a/drivers/phy/freescale/phy-fsl-imx8mq-usb.c +++ b/drivers/phy/freescale/phy-fsl-imx8mq-usb.c @@ -95,12 +95,12 @@ static u32 phy_tx_preemp_amp_tune_from_property(u32 microamp) static u32 phy_tx_vboost_level_from_property(u32 microvolt) { switch (microvolt) { - case 1156: - return 5; - case 844: - return 3; + case 0 ... 960: + return 0; + case 961 ... 1160: + return 2; default: - return 4; + return 3; } } diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index 9417372a015547a41df15d79a21b4404cb17b8ee..a892e1d7e2d024609373d067342083571feb15a3 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c @@ -400,14 +400,13 @@ EXPORT_SYMBOL_GPL(phy_power_off); int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode) { - int ret = 0; + int ret; - if (!phy) + if (!phy || !phy->ops->set_mode) return 0; mutex_lock(&phy->mutex); - if (phy->ops->set_mode) - ret = phy->ops->set_mode(phy, mode, submode); + ret = phy->ops->set_mode(phy, mode, submode); if (!ret) phy->attrs.mode = mode; mutex_unlock(&phy->mutex); diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-usb.c b/drivers/phy/qualcomm/phy-qcom-qmp-usb.c index 5072bca0af7c5df2686d2fd324aa6332b3367169..c697d01b2a2a1e4caf2f76611a93a150c0347c02 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-usb.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-usb.c @@ -2044,16 +2044,12 @@ static void __iomem *qmp_usb_iomap(struct device *dev, struct device_node *np, int index, bool exclusive) { struct resource res; - void __iomem *mem; if (!exclusive) { if (of_address_to_resource(np, index, &res)) return IOMEM_ERR_PTR(-EINVAL); - mem = devm_ioremap(dev, res.start, resource_size(&res)); - if (!mem) - return IOMEM_ERR_PTR(-ENOMEM); - return mem; + return devm_ioremap(dev, res.start, resource_size(&res)); } return devm_of_iomap(dev, np, index, NULL); diff --git a/drivers/phy/starfive/phy-jh7110-usb.c b/drivers/phy/starfive/phy-jh7110-usb.c index bf52b41110db8e02fa6b4facacda93cb5740853c..633912f8a05d04e913eecf4ad5e4608dbace6f32 100644 --- a/drivers/phy/starfive/phy-jh7110-usb.c +++ b/drivers/phy/starfive/phy-jh7110-usb.c @@ -16,8 +16,6 @@ #include #define USB_125M_CLK_RATE 125000000 -#define USB_CLK_MODE_OFF 0x0 -#define USB_CLK_MODE_RX_NORMAL_PWR BIT(1) #define USB_LS_KEEPALIVE_OFF 0x4 #define USB_LS_KEEPALIVE_ENABLE BIT(4) @@ -70,7 +68,6 @@ static int jh7110_usb2_phy_init(struct phy *_phy) { struct jh7110_usb2_phy *phy = phy_get_drvdata(_phy); int ret; - unsigned int val; ret = clk_set_rate(phy->usb_125m_clk, USB_125M_CLK_RATE); if (ret) @@ -80,10 +77,6 @@ static int jh7110_usb2_phy_init(struct phy *_phy) if (ret) return ret; - val = readl(phy->regs + USB_CLK_MODE_OFF); - val |= USB_CLK_MODE_RX_NORMAL_PWR; - writel(val, phy->regs + USB_CLK_MODE_OFF); - return 0; } diff --git a/drivers/phy/tegra/xusb-tegra186.c b/drivers/phy/tegra/xusb-tegra186.c index e818f6c3980e6b9028567db09404b31e5a839b5d..23a23f2d64e5866fdbd81cabed9ea27e78ea1d6f 100644 --- a/drivers/phy/tegra/xusb-tegra186.c +++ b/drivers/phy/tegra/xusb-tegra186.c @@ -648,15 +648,14 @@ static void tegra186_utmi_bias_pad_power_on(struct tegra_xusb_padctl *padctl) udelay(100); } - value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL2); - if (padctl->soc->trk_update_on_idle) - value &= ~CYA_TRK_CODE_UPDATE_ON_IDLE; - if (padctl->soc->trk_hw_mode) + if (padctl->soc->trk_hw_mode) { + value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL2); value |= USB2_TRK_HW_MODE; - padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL2); - - if (!padctl->soc->trk_hw_mode) + value &= ~CYA_TRK_CODE_UPDATE_ON_IDLE; + padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL2); + } else { clk_disable_unprepare(priv->usb2_trk_clk); + } } static void tegra186_utmi_bias_pad_power_off(struct tegra_xusb_padctl *padctl) @@ -783,15 +782,13 @@ static int tegra186_xusb_padctl_vbus_override(struct tegra_xusb_padctl *padctl, } static int tegra186_xusb_padctl_id_override(struct tegra_xusb_padctl *padctl, - struct tegra_xusb_usb2_port *port, bool status) + bool status) { - u32 value, id_override; - int err = 0; + u32 value; dev_dbg(padctl->dev, "%s id override\n", status ? "set" : "clear"); value = padctl_readl(padctl, USB2_VBUS_ID); - id_override = value & ID_OVERRIDE(~0); if (status) { if (value & VBUS_OVERRIDE) { @@ -802,35 +799,15 @@ static int tegra186_xusb_padctl_id_override(struct tegra_xusb_padctl *padctl, value = padctl_readl(padctl, USB2_VBUS_ID); } - if (id_override != ID_OVERRIDE_GROUNDED) { - value &= ~ID_OVERRIDE(~0); - value |= ID_OVERRIDE_GROUNDED; - padctl_writel(padctl, value, USB2_VBUS_ID); - - err = regulator_enable(port->supply); - if (err) { - dev_err(padctl->dev, "Failed to enable regulator: %d\n", err); - return err; - } - } + value &= ~ID_OVERRIDE(~0); + value |= ID_OVERRIDE_GROUNDED; } else { - if (id_override == ID_OVERRIDE_GROUNDED) { - /* - * The regulator is disabled only when the role transitions - * from USB_ROLE_HOST to USB_ROLE_NONE. - */ - err = regulator_disable(port->supply); - if (err) { - dev_err(padctl->dev, "Failed to disable regulator: %d\n", err); - return err; - } - - value &= ~ID_OVERRIDE(~0); - value |= ID_OVERRIDE_FLOATING; - padctl_writel(padctl, value, USB2_VBUS_ID); - } + value &= ~ID_OVERRIDE(~0); + value |= ID_OVERRIDE_FLOATING; } + padctl_writel(padctl, value, USB2_VBUS_ID); + return 0; } @@ -849,20 +826,27 @@ static int tegra186_utmi_phy_set_mode(struct phy *phy, enum phy_mode mode, if (mode == PHY_MODE_USB_OTG) { if (submode == USB_ROLE_HOST) { - err = tegra186_xusb_padctl_id_override(padctl, port, true); - if (err) - goto out; + tegra186_xusb_padctl_id_override(padctl, true); + + err = regulator_enable(port->supply); } else if (submode == USB_ROLE_DEVICE) { tegra186_xusb_padctl_vbus_override(padctl, true); } else if (submode == USB_ROLE_NONE) { - err = tegra186_xusb_padctl_id_override(padctl, port, false); - if (err) - goto out; + /* + * When port is peripheral only or role transitions to + * USB_ROLE_NONE from USB_ROLE_DEVICE, regulator is not + * enabled. + */ + if (regulator_is_enabled(port->supply)) + regulator_disable(port->supply); + + tegra186_xusb_padctl_id_override(padctl, false); tegra186_xusb_padctl_vbus_override(padctl, false); } } -out: + mutex_unlock(&padctl->lock); + return err; } @@ -1726,8 +1710,7 @@ const struct tegra_xusb_padctl_soc tegra234_xusb_padctl_soc = { .num_supplies = ARRAY_SIZE(tegra194_xusb_padctl_supply_names), .supports_gen2 = true, .poll_trk_completed = true, - .trk_hw_mode = false, - .trk_update_on_idle = true, + .trk_hw_mode = true, .supports_lp_cfg_en = true, }; EXPORT_SYMBOL_GPL(tegra234_xusb_padctl_soc); diff --git a/drivers/phy/tegra/xusb.h b/drivers/phy/tegra/xusb.h index d2b5f95651324a85ec6cfea8075e591732edc530..6e45d194c68947618778dc132720ae757f5fd656 100644 --- a/drivers/phy/tegra/xusb.h +++ b/drivers/phy/tegra/xusb.h @@ -434,7 +434,6 @@ struct tegra_xusb_padctl_soc { bool need_fake_usb3_port; bool poll_trk_completed; bool trk_hw_mode; - bool trk_update_on_idle; bool supports_lp_cfg_en; }; diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c index 5cc00fdc48d840b74dfb14f94769e950096e619b..524424ee6c4e71ab47ff1490aecd281e32e0d764 100644 --- a/drivers/pinctrl/meson/pinctrl-meson.c +++ b/drivers/pinctrl/meson/pinctrl-meson.c @@ -486,7 +486,7 @@ static int meson_pinconf_get(struct pinctrl_dev *pcdev, unsigned int pin, case PIN_CONFIG_BIAS_PULL_DOWN: case PIN_CONFIG_BIAS_PULL_UP: if (meson_pinconf_get_pull(pc, pin) == param) - arg = 60000; + arg = 1; else return -EINVAL; break; diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c index ef87a6045e073a75fbdf2ae14cbe82b03f5c2a28..c34719b7506da6af00e56021716cb58709a2c3ca 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c @@ -358,7 +358,9 @@ static int armada_37xx_pmx_set_by_name(struct pinctrl_dev *pctldev, val = grp->val[func]; - return regmap_update_bits(info->regmap, reg, mask, val); + regmap_update_bits(info->regmap, reg, mask, val); + + return 0; } static int armada_37xx_pmx_set(struct pinctrl_dev *pctldev, @@ -400,13 +402,10 @@ static int armada_37xx_gpio_get_direction(struct gpio_chip *chip, struct armada_37xx_pinctrl *info = gpiochip_get_data(chip); unsigned int reg = OUTPUT_EN; unsigned int val, mask; - int ret; armada_37xx_update_reg(®, &offset); mask = BIT(offset); - ret = regmap_read(info->regmap, reg, &val); - if (ret) - return ret; + regmap_read(info->regmap, reg, &val); if (val & mask) return GPIO_LINE_DIRECTION_OUT; @@ -418,22 +417,20 @@ static int armada_37xx_gpio_direction_output(struct gpio_chip *chip, unsigned int offset, int value) { struct armada_37xx_pinctrl *info = gpiochip_get_data(chip); - unsigned int en_offset = offset; - unsigned int reg = OUTPUT_VAL; + unsigned int reg = OUTPUT_EN; unsigned int mask, val, ret; armada_37xx_update_reg(®, &offset); mask = BIT(offset); - val = value ? mask : 0; - ret = regmap_update_bits(info->regmap, reg, mask, val); + ret = regmap_update_bits(info->regmap, reg, mask, mask); + if (ret) return ret; - reg = OUTPUT_EN; - armada_37xx_update_reg(®, &en_offset); - - regmap_update_bits(info->regmap, reg, mask, mask); + reg = OUTPUT_VAL; + val = value ? mask : 0; + regmap_update_bits(info->regmap, reg, mask, val); return 0; } @@ -443,14 +440,11 @@ static int armada_37xx_gpio_get(struct gpio_chip *chip, unsigned int offset) struct armada_37xx_pinctrl *info = gpiochip_get_data(chip); unsigned int reg = INPUT_VAL; unsigned int val, mask; - int ret; armada_37xx_update_reg(®, &offset); mask = BIT(offset); - ret = regmap_read(info->regmap, reg, &val); - if (ret) - return ret; + regmap_read(info->regmap, reg, &val); return (val & mask) != 0; } @@ -475,17 +469,16 @@ static int armada_37xx_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, { struct armada_37xx_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); struct gpio_chip *chip = range->gc; - int ret; dev_dbg(info->dev, "gpio_direction for pin %u as %s-%d to %s\n", offset, range->name, offset, input ? "input" : "output"); if (input) - ret = armada_37xx_gpio_direction_input(chip, offset); + armada_37xx_gpio_direction_input(chip, offset); else - ret = armada_37xx_gpio_direction_output(chip, offset, 0); + armada_37xx_gpio_direction_output(chip, offset, 0); - return ret; + return 0; } static int armada_37xx_gpio_request_enable(struct pinctrl_dev *pctldev, diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c index ba38173d3ed3c504d3e8b116c910c44469555720..75bff325a42519115b532e53231ed9c932c2b537 100644 --- a/drivers/pinctrl/pinctrl-amd.c +++ b/drivers/pinctrl/pinctrl-amd.c @@ -933,17 +933,6 @@ static int amd_gpio_suspend_hibernate_common(struct device *dev, bool is_suspend pin, is_suspend ? "suspend" : "hibernate"); } - /* - * debounce enabled over suspend has shown issues with a GPIO - * being unable to wake the system, as we're only interested in - * the actual wakeup event, clear it. - */ - if (gpio_dev->saved_regs[i] & (DB_CNTRl_MASK << DB_CNTRL_OFF)) { - amd_gpio_set_debounce(gpio_dev, pin, 0); - pm_pr_dbg("Clearing debounce for GPIO #%d during %s.\n", - pin, is_suspend ? "suspend" : "hibernate"); - } - raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); } diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index 3c09f743b68c2eeb5a7b0adc2152d20c4289b840..d7b66928a4e50dd4e0e315684816348f4fe4db96 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -1825,16 +1825,12 @@ static int at91_gpio_probe(struct platform_device *pdev) struct at91_gpio_chip *at91_chip = NULL; struct gpio_chip *chip; struct pinctrl_gpio_range *range; - int alias_idx; int ret = 0; int irq, i; + int alias_idx = of_alias_get_id(np, "gpio"); uint32_t ngpio; char **names; - alias_idx = of_alias_get_id(np, "gpio"); - if (alias_idx < 0) - return alias_idx; - BUG_ON(alias_idx >= ARRAY_SIZE(gpio_chips)); if (gpio_chips[alias_idx]) return dev_err_probe(dev, -EBUSY, "%d slot is occupied.\n", alias_idx); diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c index ca45c1f36a89bdf635ef34733b076738ebba410a..fd97b6ee2a8d11a0d9f261482593b5168a853f57 100644 --- a/drivers/pinctrl/pinctrl-mcp23s08.c +++ b/drivers/pinctrl/pinctrl-mcp23s08.c @@ -612,14 +612,6 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, mcp->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); - /* - * Reset the chip - we don't really know what state it's in, so reset - * all pins to input first to prevent surprises. - */ - ret = mcp_write(mcp, MCP_IODIR, mcp->chip.ngpio == 16 ? 0xFFFF : 0xFF); - if (ret < 0) - return ret; - /* verify MCP_IOCON.SEQOP = 0, so sequential reads work, * and MCP_IOCON.HAEN = 1, so we work with all chips. */ diff --git a/drivers/pinctrl/qcom/pinctrl-apq8064.c b/drivers/pinctrl/qcom/pinctrl-apq8064.c index a18df416229993f44762d465b8332dd56a018543..20c3b9025044515477f39bc25f0202dcca561743 100644 --- a/drivers/pinctrl/qcom/pinctrl-apq8064.c +++ b/drivers/pinctrl/qcom/pinctrl-apq8064.c @@ -629,7 +629,7 @@ static struct platform_driver apq8064_pinctrl_driver = { .of_match_table = apq8064_pinctrl_of_match, }, .probe = apq8064_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init apq8064_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-apq8084.c b/drivers/pinctrl/qcom/pinctrl-apq8084.c index afada80e52a235b76da559e45cedc2bb385db106..3fc0a40762b631ad3dc15c9a7624ab705f367e74 100644 --- a/drivers/pinctrl/qcom/pinctrl-apq8084.c +++ b/drivers/pinctrl/qcom/pinctrl-apq8084.c @@ -1207,7 +1207,7 @@ static struct platform_driver apq8084_pinctrl_driver = { .of_match_table = apq8084_pinctrl_of_match, }, .probe = apq8084_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init apq8084_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-ipq4019.c b/drivers/pinctrl/qcom/pinctrl-ipq4019.c index cb13576ad6cfb4e553f9c01b238046338a5b323b..1f7944dd829d1b9cb8c445ee075e0e29a12294b9 100644 --- a/drivers/pinctrl/qcom/pinctrl-ipq4019.c +++ b/drivers/pinctrl/qcom/pinctrl-ipq4019.c @@ -710,7 +710,7 @@ static struct platform_driver ipq4019_pinctrl_driver = { .of_match_table = ipq4019_pinctrl_of_match, }, .probe = ipq4019_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init ipq4019_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-ipq5018.c b/drivers/pinctrl/qcom/pinctrl-ipq5018.c index 68f65b57003e9161bdb645d8e309a1b04550ab68..e2951f81c3eeb3f4d52c3941ab6f591da0254a23 100644 --- a/drivers/pinctrl/qcom/pinctrl-ipq5018.c +++ b/drivers/pinctrl/qcom/pinctrl-ipq5018.c @@ -754,7 +754,7 @@ static struct platform_driver ipq5018_pinctrl_driver = { .of_match_table = ipq5018_pinctrl_of_match, }, .probe = ipq5018_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init ipq5018_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-ipq5332.c b/drivers/pinctrl/qcom/pinctrl-ipq5332.c index 88217511897088bd5677692f20ee2e39a89d8c97..625f8014051f6acf8e6f91d48d0406b8c2bd8caf 100644 --- a/drivers/pinctrl/qcom/pinctrl-ipq5332.c +++ b/drivers/pinctrl/qcom/pinctrl-ipq5332.c @@ -834,7 +834,7 @@ static struct platform_driver ipq5332_pinctrl_driver = { .of_match_table = ipq5332_pinctrl_of_match, }, .probe = ipq5332_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init ipq5332_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-ipq6018.c b/drivers/pinctrl/qcom/pinctrl-ipq6018.c index ac330d8712b5cbbd3250d700219c6ffef1db77fa..0ad08647dbcdf0b1fa21a618310f150a1bde2fae 100644 --- a/drivers/pinctrl/qcom/pinctrl-ipq6018.c +++ b/drivers/pinctrl/qcom/pinctrl-ipq6018.c @@ -1080,7 +1080,7 @@ static struct platform_driver ipq6018_pinctrl_driver = { .of_match_table = ipq6018_pinctrl_of_match, }, .probe = ipq6018_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init ipq6018_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-ipq8064.c b/drivers/pinctrl/qcom/pinctrl-ipq8064.c index e10e1bc4c9113178238f0e5ede48f818dfebd0d1..e2bb94e86aef6e0055860794a1c64649c722aebc 100644 --- a/drivers/pinctrl/qcom/pinctrl-ipq8064.c +++ b/drivers/pinctrl/qcom/pinctrl-ipq8064.c @@ -631,7 +631,7 @@ static struct platform_driver ipq8064_pinctrl_driver = { .of_match_table = ipq8064_pinctrl_of_match, }, .probe = ipq8064_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init ipq8064_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-ipq8074.c b/drivers/pinctrl/qcom/pinctrl-ipq8074.c index fee32c1d1d3e9af7167e8bb9408269a7857121c1..337f3a1c92c19285f16f59a79f3e2b20561ae19a 100644 --- a/drivers/pinctrl/qcom/pinctrl-ipq8074.c +++ b/drivers/pinctrl/qcom/pinctrl-ipq8074.c @@ -1041,7 +1041,7 @@ static struct platform_driver ipq8074_pinctrl_driver = { .of_match_table = ipq8074_pinctrl_of_match, }, .probe = ipq8074_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init ipq8074_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-ipq9574.c b/drivers/pinctrl/qcom/pinctrl-ipq9574.c index 20ab59cb621bc3e1be9c43abd1eff1019b8a8ced..e2491617b2364a64169297426351e723c37f030c 100644 --- a/drivers/pinctrl/qcom/pinctrl-ipq9574.c +++ b/drivers/pinctrl/qcom/pinctrl-ipq9574.c @@ -799,7 +799,7 @@ static struct platform_driver ipq9574_pinctrl_driver = { .of_match_table = ipq9574_pinctrl_of_match, }, .probe = ipq9574_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init ipq9574_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-mdm9607.c b/drivers/pinctrl/qcom/pinctrl-mdm9607.c index 415d24e16267d0f2e6b7b1ed4a6514caa64a444f..e7cd3ef1cf3e815ae25aa9e0c6872fbbd2c8ac79 100644 --- a/drivers/pinctrl/qcom/pinctrl-mdm9607.c +++ b/drivers/pinctrl/qcom/pinctrl-mdm9607.c @@ -1059,7 +1059,7 @@ static struct platform_driver mdm9607_pinctrl_driver = { .of_match_table = mdm9607_pinctrl_of_match, }, .probe = mdm9607_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init mdm9607_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-mdm9615.c b/drivers/pinctrl/qcom/pinctrl-mdm9615.c index 3f2eafea0b2467368a3a673c32b17b055a95d6da..0a2ae383d3d57bd4101efb7a2093b68b8920b426 100644 --- a/drivers/pinctrl/qcom/pinctrl-mdm9615.c +++ b/drivers/pinctrl/qcom/pinctrl-mdm9615.c @@ -446,7 +446,7 @@ static struct platform_driver mdm9615_pinctrl_driver = { .of_match_table = mdm9615_pinctrl_of_match, }, .probe = mdm9615_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init mdm9615_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c index 13dc8bc1d0cff2191742be4d4b15e3ade14e4389..b252fc22f64e6bcc446b81da1d8ce70b94527373 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm.c +++ b/drivers/pinctrl/qcom/pinctrl-msm.c @@ -43,6 +43,7 @@ * @pctrl: pinctrl handle. * @chip: gpiochip handle. * @desc: pin controller descriptor + * @restart_nb: restart notifier block. * @irq: parent irq for the TLMM irq_chip. * @intr_target_use_scm: route irq to application cpu using scm calls * @lock: Spinlock to protect register resources as well @@ -62,6 +63,7 @@ struct msm_pinctrl { struct pinctrl_dev *pctrl; struct gpio_chip chip; struct pinctrl_desc desc; + struct notifier_block restart_nb; int irq; @@ -1031,25 +1033,6 @@ static bool msm_gpio_needs_dual_edge_parent_workaround(struct irq_data *d, test_bit(d->hwirq, pctrl->skip_wake_irqs); } -static void msm_gpio_irq_init_valid_mask(struct gpio_chip *gc, - unsigned long *valid_mask, - unsigned int ngpios) -{ - struct msm_pinctrl *pctrl = gpiochip_get_data(gc); - const struct msm_pingroup *g; - int i; - - bitmap_fill(valid_mask, ngpios); - - for (i = 0; i < ngpios; i++) { - g = &pctrl->soc->groups[i]; - - if (g->intr_detection_width != 1 && - g->intr_detection_width != 2) - clear_bit(i, valid_mask); - } -} - static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type) { struct gpio_chip *gc = irq_data_get_irq_chip_data(d); @@ -1411,7 +1394,6 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) girq->default_type = IRQ_TYPE_NONE; girq->handler = handle_bad_irq; girq->parents[0] = pctrl->irq; - girq->init_valid_mask = msm_gpio_irq_init_valid_mask; ret = gpiochip_add_data(&pctrl->chip, pctrl); if (ret) { @@ -1442,9 +1424,10 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) return 0; } -static int msm_ps_hold_restart(struct sys_off_data *data) +static int msm_ps_hold_restart(struct notifier_block *nb, unsigned long action, + void *data) { - struct msm_pinctrl *pctrl = data->cb_data; + struct msm_pinctrl *pctrl = container_of(nb, struct msm_pinctrl, restart_nb); writel(0, pctrl->regs[0] + PS_HOLD_OFFSET); mdelay(1000); @@ -1455,11 +1438,7 @@ static struct msm_pinctrl *poweroff_pctrl; static void msm_ps_hold_poweroff(void) { - struct sys_off_data data = { - .cb_data = poweroff_pctrl, - }; - - msm_ps_hold_restart(&data); + msm_ps_hold_restart(&poweroff_pctrl->restart_nb, 0, NULL); } static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl) @@ -1469,11 +1448,9 @@ static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl) for (i = 0; i < pctrl->soc->nfunctions; i++) if (!strcmp(func[i].name, "ps_hold")) { - if (devm_register_sys_off_handler(pctrl->dev, - SYS_OFF_MODE_RESTART, - 128, - msm_ps_hold_restart, - pctrl)) + pctrl->restart_nb.notifier_call = msm_ps_hold_restart; + pctrl->restart_nb.priority = 128; + if (register_restart_handler(&pctrl->restart_nb)) dev_err(pctrl->dev, "failed to setup restart handler.\n"); poweroff_pctrl = pctrl; @@ -1570,11 +1547,15 @@ int msm_pinctrl_probe(struct platform_device *pdev, } EXPORT_SYMBOL(msm_pinctrl_probe); -void msm_pinctrl_remove(struct platform_device *pdev) +int msm_pinctrl_remove(struct platform_device *pdev) { struct msm_pinctrl *pctrl = platform_get_drvdata(pdev); gpiochip_remove(&pctrl->chip); + + unregister_restart_handler(&pctrl->restart_nb); + + return 0; } EXPORT_SYMBOL(msm_pinctrl_remove); diff --git a/drivers/pinctrl/qcom/pinctrl-msm.h b/drivers/pinctrl/qcom/pinctrl-msm.h index 4968d08a384da90917dd3c1797311c5742d36ccd..1d2f2e904da19053d9f303e825a3c2479c54ae75 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm.h +++ b/drivers/pinctrl/qcom/pinctrl-msm.h @@ -166,6 +166,6 @@ extern const struct dev_pm_ops msm_pinctrl_dev_pm_ops; int msm_pinctrl_probe(struct platform_device *pdev, const struct msm_pinctrl_soc_data *soc_data); -void msm_pinctrl_remove(struct platform_device *pdev); +int msm_pinctrl_remove(struct platform_device *pdev); #endif diff --git a/drivers/pinctrl/qcom/pinctrl-msm8226.c b/drivers/pinctrl/qcom/pinctrl-msm8226.c index 90b4004e7faf182ec434684f63acf119595b29d3..994619840a706c810c340e55371849f6159f46c7 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8226.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8226.c @@ -638,7 +638,7 @@ static struct platform_driver msm8226_pinctrl_driver = { .of_match_table = msm8226_pinctrl_of_match, }, .probe = msm8226_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8226_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm8660.c b/drivers/pinctrl/qcom/pinctrl-msm8660.c index dba6d531b4a1466809905ec3471a92ab07cb3670..999a5f867eb5081232443a893773d73c8dc65d1b 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8660.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8660.c @@ -981,7 +981,7 @@ static struct platform_driver msm8660_pinctrl_driver = { .of_match_table = msm8660_pinctrl_of_match, }, .probe = msm8660_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8660_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm8909.c b/drivers/pinctrl/qcom/pinctrl-msm8909.c index 14b17ba9f9061a36d20a8e5fb8ae1abd20a26afc..756856d20d6b5f2d4e764ff32f2493de24ca677c 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8909.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8909.c @@ -929,7 +929,7 @@ static struct platform_driver msm8909_pinctrl_driver = { .of_match_table = msm8909_pinctrl_of_match, }, .probe = msm8909_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8909_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm8916.c b/drivers/pinctrl/qcom/pinctrl-msm8916.c index 184dcf8422735bc5d3c859e102358d9c94340948..cea5c54f92fec1829c5378a8441eb8710fd500f0 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8916.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8916.c @@ -969,7 +969,7 @@ static struct platform_driver msm8916_pinctrl_driver = { .of_match_table = msm8916_pinctrl_of_match, }, .probe = msm8916_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8916_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm8953.c b/drivers/pinctrl/qcom/pinctrl-msm8953.c index c2253821ae8d3651c89496d5778fd29e89db5998..998351bdfee1369fe0f369648d66a1a05493c8fb 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8953.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8953.c @@ -1816,7 +1816,7 @@ static struct platform_driver msm8953_pinctrl_driver = { .of_match_table = msm8953_pinctrl_of_match, }, .probe = msm8953_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8953_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm8960.c b/drivers/pinctrl/qcom/pinctrl-msm8960.c index 6b9148d226e9b8d18d0049bb431711c3ab2f0157..ebe230b3b437ccc63535fdf51639e64a67fe05eb 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8960.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8960.c @@ -1246,7 +1246,7 @@ static struct platform_driver msm8960_pinctrl_driver = { .of_match_table = msm8960_pinctrl_of_match, }, .probe = msm8960_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8960_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm8976.c b/drivers/pinctrl/qcom/pinctrl-msm8976.c index 9a951888e8a1b17531f77c6b65c6fb1d6e39f176..c30d80e4e98ca68ccede66001445967a47d6ec8f 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8976.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8976.c @@ -1096,7 +1096,7 @@ static struct platform_driver msm8976_pinctrl_driver = { .of_match_table = msm8976_pinctrl_of_match, }, .probe = msm8976_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8976_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm8994.c b/drivers/pinctrl/qcom/pinctrl-msm8994.c index 1ed1dd32d6c79520ccf07d11edc353d23dc0ce97..b1a6759ab4a5e70501aba4325e80db2359251204 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8994.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8994.c @@ -1343,7 +1343,7 @@ static struct platform_driver msm8994_pinctrl_driver = { .of_match_table = msm8994_pinctrl_of_match, }, .probe = msm8994_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8994_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm8996.c b/drivers/pinctrl/qcom/pinctrl-msm8996.c index 5f0e7f78fd517842f5dbff56875975f89b917ad2..46cc0b49dbab52bdff9012715ef7776edfe6b908 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8996.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8996.c @@ -1906,7 +1906,7 @@ static struct platform_driver msm8996_pinctrl_driver = { .of_match_table = msm8996_pinctrl_of_match, }, .probe = msm8996_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8996_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm8998.c b/drivers/pinctrl/qcom/pinctrl-msm8998.c index 4aaf45e54f3a79acb5e0ce0e40d21de2a3b16b19..b7cbf32b3125a91081c6644cd3d343e08499dd1f 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8998.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8998.c @@ -1535,7 +1535,7 @@ static struct platform_driver msm8998_pinctrl_driver = { .of_match_table = msm8998_pinctrl_of_match, }, .probe = msm8998_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8998_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-msm8x74.c b/drivers/pinctrl/qcom/pinctrl-msm8x74.c index 58b4f6f31ae6aeb29e4ac32954449788594f487a..d5fe62992849c994bb958f19dffe0dff4da7995e 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm8x74.c +++ b/drivers/pinctrl/qcom/pinctrl-msm8x74.c @@ -1071,7 +1071,7 @@ static struct platform_driver msm8x74_pinctrl_driver = { .of_match_table = msm8x74_pinctrl_of_match, }, .probe = msm8x74_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init msm8x74_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-qcm2290.c b/drivers/pinctrl/qcom/pinctrl-qcm2290.c index 61b7c22e963c2c1e8ef50183c468bf3fc0673022..ba699eac9ee8b2cb2172f3591a32709518eeb92e 100644 --- a/drivers/pinctrl/qcom/pinctrl-qcm2290.c +++ b/drivers/pinctrl/qcom/pinctrl-qcm2290.c @@ -165,10 +165,6 @@ static const struct pinctrl_pin_desc qcm2290_pins[] = { PINCTRL_PIN(62, "GPIO_62"), PINCTRL_PIN(63, "GPIO_63"), PINCTRL_PIN(64, "GPIO_64"), - PINCTRL_PIN(65, "GPIO_65"), - PINCTRL_PIN(66, "GPIO_66"), - PINCTRL_PIN(67, "GPIO_67"), - PINCTRL_PIN(68, "GPIO_68"), PINCTRL_PIN(69, "GPIO_69"), PINCTRL_PIN(70, "GPIO_70"), PINCTRL_PIN(71, "GPIO_71"), @@ -183,17 +179,12 @@ static const struct pinctrl_pin_desc qcm2290_pins[] = { PINCTRL_PIN(80, "GPIO_80"), PINCTRL_PIN(81, "GPIO_81"), PINCTRL_PIN(82, "GPIO_82"), - PINCTRL_PIN(83, "GPIO_83"), - PINCTRL_PIN(84, "GPIO_84"), - PINCTRL_PIN(85, "GPIO_85"), PINCTRL_PIN(86, "GPIO_86"), PINCTRL_PIN(87, "GPIO_87"), PINCTRL_PIN(88, "GPIO_88"), PINCTRL_PIN(89, "GPIO_89"), PINCTRL_PIN(90, "GPIO_90"), PINCTRL_PIN(91, "GPIO_91"), - PINCTRL_PIN(92, "GPIO_92"), - PINCTRL_PIN(93, "GPIO_93"), PINCTRL_PIN(94, "GPIO_94"), PINCTRL_PIN(95, "GPIO_95"), PINCTRL_PIN(96, "GPIO_96"), @@ -1122,7 +1113,7 @@ static struct platform_driver qcm2290_pinctrl_driver = { .of_match_table = qcm2290_pinctrl_of_match, }, .probe = qcm2290_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init qcm2290_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-qcs404.c b/drivers/pinctrl/qcom/pinctrl-qcs404.c index 9a875b7dc9989cb96b20121e01315f67c401943a..ae7224012f8aa00a41350b3ce670511aa8ce18bd 100644 --- a/drivers/pinctrl/qcom/pinctrl-qcs404.c +++ b/drivers/pinctrl/qcom/pinctrl-qcs404.c @@ -1644,7 +1644,7 @@ static struct platform_driver qcs404_pinctrl_driver = { .of_match_table = qcs404_pinctrl_of_match, }, .probe = qcs404_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init qcs404_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-qdf2xxx.c b/drivers/pinctrl/qcom/pinctrl-qdf2xxx.c index 4d2f6f495163bcc1a1f89c07cf6ef1ba42c9aad0..b5808fcfb13cdebd04c0c71b24043b924094a683 100644 --- a/drivers/pinctrl/qcom/pinctrl-qdf2xxx.c +++ b/drivers/pinctrl/qcom/pinctrl-qdf2xxx.c @@ -145,7 +145,7 @@ static struct platform_driver qdf2xxx_pinctrl_driver = { .acpi_match_table = qdf2xxx_acpi_ids, }, .probe = qdf2xxx_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init qdf2xxx_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-qdu1000.c b/drivers/pinctrl/qcom/pinctrl-qdu1000.c index da4f940bc8d4e88a405a05776b293804a6573cb6..47bc529ef550d2ab9a13341295eacc08faed24c4 100644 --- a/drivers/pinctrl/qcom/pinctrl-qdu1000.c +++ b/drivers/pinctrl/qcom/pinctrl-qdu1000.c @@ -1248,7 +1248,7 @@ static struct platform_driver qdu1000_tlmm_driver = { .of_match_table = qdu1000_tlmm_of_match, }, .probe = qdu1000_tlmm_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init qdu1000_tlmm_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sa8775p.c b/drivers/pinctrl/qcom/pinctrl-sa8775p.c index 5459c0c681a23f4d4b008d58a96060a02f1eb32b..8fdea25d8d67e1ef36868c552ba51da093e9d662 100644 --- a/drivers/pinctrl/qcom/pinctrl-sa8775p.c +++ b/drivers/pinctrl/qcom/pinctrl-sa8775p.c @@ -1530,7 +1530,7 @@ static struct platform_driver sa8775p_pinctrl_driver = { .of_match_table = sa8775p_pinctrl_of_match, }, .probe = sa8775p_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sa8775p_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sc7180.c b/drivers/pinctrl/qcom/pinctrl-sc7180.c index c27aaa599b917a6e1e375488bcbbeca08b5963c9..6eb0c73791c0bc9883bf0b740b8930fe7c7fced0 100644 --- a/drivers/pinctrl/qcom/pinctrl-sc7180.c +++ b/drivers/pinctrl/qcom/pinctrl-sc7180.c @@ -1159,7 +1159,7 @@ static struct platform_driver sc7180_pinctrl_driver = { .of_match_table = sc7180_pinctrl_of_match, }, .probe = sc7180_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sc7180_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sc7280.c b/drivers/pinctrl/qcom/pinctrl-sc7280.c index c2db663e396eb4986aafda7b860f07adb47ecdf4..0c10eeb60b55e742a73dfd43d647f7009471b1b0 100644 --- a/drivers/pinctrl/qcom/pinctrl-sc7280.c +++ b/drivers/pinctrl/qcom/pinctrl-sc7280.c @@ -1505,7 +1505,7 @@ static struct platform_driver sc7280_pinctrl_driver = { .of_match_table = sc7280_pinctrl_of_match, }, .probe = sc7280_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sc7280_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sc8180x.c b/drivers/pinctrl/qcom/pinctrl-sc8180x.c index cfa7c8be9770c95b1d49fd93e56fae5d43070fc1..d6a79ad41a40a804c503d97a6279db4b533f0047 100644 --- a/drivers/pinctrl/qcom/pinctrl-sc8180x.c +++ b/drivers/pinctrl/qcom/pinctrl-sc8180x.c @@ -1720,7 +1720,7 @@ static struct platform_driver sc8180x_pinctrl_driver = { .acpi_match_table = sc8180x_pinctrl_acpi_match, }, .probe = sc8180x_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sc8180x_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sc8280xp.c b/drivers/pinctrl/qcom/pinctrl-sc8280xp.c index 4b1c49697698de92595bc82ddf57634504f33fd2..96f4fb5a5d297f784e63f4335e294ebdee5f487f 100644 --- a/drivers/pinctrl/qcom/pinctrl-sc8280xp.c +++ b/drivers/pinctrl/qcom/pinctrl-sc8280xp.c @@ -1926,7 +1926,7 @@ static struct platform_driver sc8280xp_pinctrl_driver = { .of_match_table = sc8280xp_pinctrl_of_match, }, .probe = sc8280xp_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sc8280xp_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sdm660.c b/drivers/pinctrl/qcom/pinctrl-sdm660.c index b0c29a24b09b5a39eb4b9786d3faeea030f34cce..c2e0d5c034acf6af28fe267175c705ae25391672 100644 --- a/drivers/pinctrl/qcom/pinctrl-sdm660.c +++ b/drivers/pinctrl/qcom/pinctrl-sdm660.c @@ -1428,7 +1428,7 @@ static struct platform_driver sdm660_pinctrl_driver = { .of_match_table = sdm660_pinctrl_of_match, }, .probe = sdm660_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sdm660_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sdm670.c b/drivers/pinctrl/qcom/pinctrl-sdm670.c index 1e694a966953ac902eb26e4ca911366f65235774..cc3cce077de4e61934a114c263ebd1fd96432dfb 100644 --- a/drivers/pinctrl/qcom/pinctrl-sdm670.c +++ b/drivers/pinctrl/qcom/pinctrl-sdm670.c @@ -1318,7 +1318,7 @@ static struct platform_driver sdm670_pinctrl_driver = { .of_match_table = sdm670_pinctrl_of_match, }, .probe = sdm670_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sdm670_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sdm845.c b/drivers/pinctrl/qcom/pinctrl-sdm845.c index 3f3265e0018d6635f4e382f727c7d53c5e35eb93..cc05c415ed15512f1f99a598650d3adfdc795a6d 100644 --- a/drivers/pinctrl/qcom/pinctrl-sdm845.c +++ b/drivers/pinctrl/qcom/pinctrl-sdm845.c @@ -1351,7 +1351,7 @@ static struct platform_driver sdm845_pinctrl_driver = { .acpi_match_table = ACPI_PTR(sdm845_pinctrl_acpi_match), }, .probe = sdm845_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sdm845_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sdx55.c b/drivers/pinctrl/qcom/pinctrl-sdx55.c index c88b8bfcacb6a7ec703eee5eda0d3aecd28e6493..8826db9d21d04cecca844b0607984e21a500f15b 100644 --- a/drivers/pinctrl/qcom/pinctrl-sdx55.c +++ b/drivers/pinctrl/qcom/pinctrl-sdx55.c @@ -990,7 +990,7 @@ static struct platform_driver sdx55_pinctrl_driver = { .of_match_table = sdx55_pinctrl_of_match, }, .probe = sdx55_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sdx55_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sdx65.c b/drivers/pinctrl/qcom/pinctrl-sdx65.c index bd44ec0fcab43cbdb0b7066112da305401b7538d..f6f319c997fc7a39d672872c0df1fa2ea821b2d9 100644 --- a/drivers/pinctrl/qcom/pinctrl-sdx65.c +++ b/drivers/pinctrl/qcom/pinctrl-sdx65.c @@ -939,7 +939,7 @@ static struct platform_driver sdx65_pinctrl_driver = { .of_match_table = sdx65_pinctrl_of_match, }, .probe = sdx65_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sdx65_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sdx75.c b/drivers/pinctrl/qcom/pinctrl-sdx75.c index 396f6fc779a2e5c5445c9ea2fbed2ac0e342164e..3cfe8c7f04df816a93252a162ccfa502854411fe 100644 --- a/drivers/pinctrl/qcom/pinctrl-sdx75.c +++ b/drivers/pinctrl/qcom/pinctrl-sdx75.c @@ -1124,7 +1124,7 @@ static struct platform_driver sdx75_pinctrl_driver = { .of_match_table = sdx75_pinctrl_of_match, }, .probe = sdx75_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sdx75_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sm6115.c b/drivers/pinctrl/qcom/pinctrl-sm6115.c index 87057089b2b649f2af5ee988e20ac73295aadc39..2a06025f48858426c9bb5a9bd2d7eba279a98d46 100644 --- a/drivers/pinctrl/qcom/pinctrl-sm6115.c +++ b/drivers/pinctrl/qcom/pinctrl-sm6115.c @@ -895,7 +895,7 @@ static struct platform_driver sm6115_tlmm_driver = { .of_match_table = sm6115_tlmm_of_match, }, .probe = sm6115_tlmm_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sm6115_tlmm_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sm6125.c b/drivers/pinctrl/qcom/pinctrl-sm6125.c index e07339ba72bcacfe56401d5b1e67a20778d4bf75..d5e2b896954c220c13da2835aa32f5e288903205 100644 --- a/drivers/pinctrl/qcom/pinctrl-sm6125.c +++ b/drivers/pinctrl/qcom/pinctrl-sm6125.c @@ -1249,7 +1249,7 @@ static struct platform_driver sm6125_tlmm_driver = { .of_match_table = sm6125_tlmm_of_match, }, .probe = sm6125_tlmm_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sm6125_tlmm_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sm6350.c b/drivers/pinctrl/qcom/pinctrl-sm6350.c index 4aeb1ba43ee3d468a3980cb0a90f678c2919cc04..f3828c07b134500e4307db1d42aabae389a03360 100644 --- a/drivers/pinctrl/qcom/pinctrl-sm6350.c +++ b/drivers/pinctrl/qcom/pinctrl-sm6350.c @@ -1373,7 +1373,7 @@ static struct platform_driver sm6350_tlmm_driver = { .of_match_table = sm6350_tlmm_of_match, }, .probe = sm6350_tlmm_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sm6350_tlmm_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sm6375.c b/drivers/pinctrl/qcom/pinctrl-sm6375.c index d86630d7125c2a27f7e9f867376d446ff0e4dfa2..c82c8516932ea2e1880284fa86bdaf3683f024cc 100644 --- a/drivers/pinctrl/qcom/pinctrl-sm6375.c +++ b/drivers/pinctrl/qcom/pinctrl-sm6375.c @@ -1516,7 +1516,7 @@ static struct platform_driver sm6375_tlmm_driver = { .of_match_table = sm6375_tlmm_of_match, }, .probe = sm6375_tlmm_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sm6375_tlmm_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sm7150.c b/drivers/pinctrl/qcom/pinctrl-sm7150.c index b9f067de8ef0e41689092f2505fa846e1bbd0a62..edb5984cd35190105ed4622b1509d9ddf49b1495 100644 --- a/drivers/pinctrl/qcom/pinctrl-sm7150.c +++ b/drivers/pinctrl/qcom/pinctrl-sm7150.c @@ -1254,7 +1254,7 @@ static struct platform_driver sm7150_tlmm_driver = { .of_match_table = sm7150_tlmm_of_match, }, .probe = sm7150_tlmm_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sm7150_tlmm_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sm8150.c b/drivers/pinctrl/qcom/pinctrl-sm8150.c index f8f5bee74f1dc059fc39551423422f77e7ef3745..01aea9c70b7a78168ee063f5ac88afc0d7290bcb 100644 --- a/drivers/pinctrl/qcom/pinctrl-sm8150.c +++ b/drivers/pinctrl/qcom/pinctrl-sm8150.c @@ -1542,7 +1542,7 @@ static struct platform_driver sm8150_pinctrl_driver = { .of_match_table = sm8150_pinctrl_of_match, }, .probe = sm8150_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sm8150_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sm8250.c b/drivers/pinctrl/qcom/pinctrl-sm8250.c index 54fda77bf2968c6f91dc0a59a8eec0630ae86b74..e9961a49ff9811bfa3ed3c6c1a8f1cf90afa1d29 100644 --- a/drivers/pinctrl/qcom/pinctrl-sm8250.c +++ b/drivers/pinctrl/qcom/pinctrl-sm8250.c @@ -1351,7 +1351,7 @@ static struct platform_driver sm8250_pinctrl_driver = { .of_match_table = sm8250_pinctrl_of_match, }, .probe = sm8250_pinctrl_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sm8250_pinctrl_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sm8350.c b/drivers/pinctrl/qcom/pinctrl-sm8350.c index ac7f2820f2cbfba362ade516da2a08495eea94f6..9c69458bd9109119e7a88d1a92f633bbf188ed0c 100644 --- a/drivers/pinctrl/qcom/pinctrl-sm8350.c +++ b/drivers/pinctrl/qcom/pinctrl-sm8350.c @@ -1642,7 +1642,7 @@ static struct platform_driver sm8350_tlmm_driver = { .of_match_table = sm8350_tlmm_of_match, }, .probe = sm8350_tlmm_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sm8350_tlmm_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sm8450.c b/drivers/pinctrl/qcom/pinctrl-sm8450.c index 61728671169527012e93d952f70842fa9160a359..d11bb1ee9e3d8dfbb1e810051d5c854a959b428b 100644 --- a/drivers/pinctrl/qcom/pinctrl-sm8450.c +++ b/drivers/pinctrl/qcom/pinctrl-sm8450.c @@ -1677,7 +1677,7 @@ static struct platform_driver sm8450_tlmm_driver = { .of_match_table = sm8450_tlmm_of_match, }, .probe = sm8450_tlmm_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sm8450_tlmm_init(void) diff --git a/drivers/pinctrl/qcom/pinctrl-sm8550.c b/drivers/pinctrl/qcom/pinctrl-sm8550.c index 9184e0183755dabe30e0b930375a005fcdde3acb..3c847d9cb5d93bbc7bb5a9b0b2ee707e14de6387 100644 --- a/drivers/pinctrl/qcom/pinctrl-sm8550.c +++ b/drivers/pinctrl/qcom/pinctrl-sm8550.c @@ -1762,7 +1762,7 @@ static struct platform_driver sm8550_tlmm_driver = { .of_match_table = sm8550_tlmm_of_match, }, .probe = sm8550_tlmm_probe, - .remove_new = msm_pinctrl_remove, + .remove = msm_pinctrl_remove, }; static int __init sm8550_tlmm_init(void) diff --git a/drivers/pinctrl/tegra/pinctrl-tegra.c b/drivers/pinctrl/tegra/pinctrl-tegra.c index 637b89ebe0e455ffeedcbb71d1fd4e7f5a5c4fb4..1350ab56fbc039cd81e67644117244930783ea0b 100644 --- a/drivers/pinctrl/tegra/pinctrl-tegra.c +++ b/drivers/pinctrl/tegra/pinctrl-tegra.c @@ -307,7 +307,7 @@ static const struct tegra_pingroup *tegra_pinctrl_get_group(struct pinctrl_dev * { struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); - if (group_index < 0 || group_index >= pmx->soc->ngroups) + if (group_index < 0 || group_index > pmx->soc->ngroups) return NULL; return &pmx->soc->groups[group_index]; diff --git a/drivers/platform/loongarch/loongson-laptop.c b/drivers/platform/loongarch/loongson-laptop.c index 5fcfa3a7970b75f275a3b8da9f39f03cebbaf9f0..99203584949daa2af9e5013c7a8ed7d64b60bf0f 100644 --- a/drivers/platform/loongarch/loongson-laptop.c +++ b/drivers/platform/loongarch/loongson-laptop.c @@ -56,7 +56,8 @@ static struct input_dev *generic_inputdev; static acpi_handle hotkey_handle; static struct key_entry hotkey_keycode_map[GENERIC_HOTKEY_MAP_MAX]; -static bool bl_powered; +int loongson_laptop_turn_on_backlight(void); +int loongson_laptop_turn_off_backlight(void); static int loongson_laptop_backlight_update(struct backlight_device *bd); /* 2. ACPI Helpers and device model */ @@ -353,42 +354,16 @@ static int ec_backlight_level(u8 level) return level; } -static int ec_backlight_set_power(bool state) -{ - int status; - union acpi_object arg0 = { ACPI_TYPE_INTEGER }; - struct acpi_object_list args = { 1, &arg0 }; - - arg0.integer.value = state; - status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL); - if (ACPI_FAILURE(status)) { - pr_info("Loongson lvds error: 0x%x\n", status); - return -EIO; - } - - return 0; -} - static int loongson_laptop_backlight_update(struct backlight_device *bd) { - bool target_powered = !backlight_is_blank(bd); - int ret = 0, lvl = ec_backlight_level(bd->props.brightness); + int lvl = ec_backlight_level(bd->props.brightness); if (lvl < 0) return -EIO; - if (ec_set_brightness(lvl)) return -EIO; - if (target_powered != bl_powered) { - ret = ec_backlight_set_power(target_powered); - if (ret < 0) - return ret; - - bl_powered = target_powered; - } - - return ret; + return 0; } static int loongson_laptop_get_brightness(struct backlight_device *bd) @@ -409,7 +384,7 @@ static const struct backlight_ops backlight_laptop_ops = { static int laptop_backlight_register(void) { - int status = 0, ret; + int status = 0; struct backlight_properties props; memset(&props, 0, sizeof(props)); @@ -417,20 +392,44 @@ static int laptop_backlight_register(void) if (!acpi_evalf(hotkey_handle, &status, "ECLL", "d")) return -EIO; - ret = ec_backlight_set_power(true); - if (ret) - return ret; - - bl_powered = true; - + props.brightness = 1; props.max_brightness = status; - props.brightness = ec_get_brightness(); - props.power = FB_BLANK_UNBLANK; props.type = BACKLIGHT_PLATFORM; backlight_device_register("loongson_laptop", NULL, NULL, &backlight_laptop_ops, &props); + return 0; +} + +int loongson_laptop_turn_on_backlight(void) +{ + int status; + union acpi_object arg0 = { ACPI_TYPE_INTEGER }; + struct acpi_object_list args = { 1, &arg0 }; + + arg0.integer.value = 1; + status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL); + if (ACPI_FAILURE(status)) { + pr_info("Loongson lvds error: 0x%x\n", status); + return -ENODEV; + } + + return 0; +} + +int loongson_laptop_turn_off_backlight(void) +{ + int status; + union acpi_object arg0 = { ACPI_TYPE_INTEGER }; + struct acpi_object_list args = { 1, &arg0 }; + + arg0.integer.value = 0; + status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL); + if (ACPI_FAILURE(status)) { + pr_info("Loongson lvds error: 0x%x\n", status); + return -ENODEV; + } return 0; } @@ -612,17 +611,11 @@ static int __init generic_acpi_laptop_init(void) static void __exit generic_acpi_laptop_exit(void) { - int i; - if (generic_inputdev) { - if (!input_device_registered) { - input_free_device(generic_inputdev); - } else { + if (input_device_registered) input_unregister_device(generic_inputdev); - - for (i = 0; i < ARRAY_SIZE(generic_sub_drivers); i++) - generic_subdriver_exit(&generic_sub_drivers[i]); - } + else + input_free_device(generic_inputdev); } } diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c index 1015948ef43eb8ff86c4214aaf901821c5577644..39828eb84e0ba08835919c9fba4cf492287a5672 100644 --- a/drivers/platform/mellanox/mlxbf-tmfifo.c +++ b/drivers/platform/mellanox/mlxbf-tmfifo.c @@ -281,8 +281,7 @@ static int mlxbf_tmfifo_alloc_vrings(struct mlxbf_tmfifo *fifo, vring->align = SMP_CACHE_BYTES; vring->index = i; vring->vdev_id = tm_vdev->vdev.id.device; - vring->drop_desc.len = cpu_to_virtio32(&tm_vdev->vdev, - VRING_DROP_DESC_MAX_LEN); + vring->drop_desc.len = VRING_DROP_DESC_MAX_LEN; dev = &tm_vdev->vdev.dev; size = vring_size(vring->num, vring->align); diff --git a/drivers/platform/mellanox/mlxreg-lc.c b/drivers/platform/mellanox/mlxreg-lc.c index 74e9d78ff01efe3dff92556583e2326ba778afbf..8d833836a6d322c2a6331097cb27bb6349bc37cf 100644 --- a/drivers/platform/mellanox/mlxreg-lc.c +++ b/drivers/platform/mellanox/mlxreg-lc.c @@ -688,7 +688,7 @@ static int mlxreg_lc_completion_notify(void *handle, struct i2c_adapter *parent, if (regval & mlxreg_lc->data->mask) { mlxreg_lc->state |= MLXREG_LC_SYNCED; mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_SYNCED, 1); - if (!(mlxreg_lc->state & MLXREG_LC_POWERED)) { + if (mlxreg_lc->state & ~MLXREG_LC_POWERED) { err = mlxreg_lc_power_on_off(mlxreg_lc, 1); if (err) goto mlxreg_lc_regmap_power_on_off_fail; diff --git a/drivers/platform/mellanox/nvsw-sn2201.c b/drivers/platform/mellanox/nvsw-sn2201.c index 6b4d3c44d7bd96ec31e78cbae01e0015fe3040cc..1a7c45aa41bbf0669172db5e964d57c0af6642e3 100644 --- a/drivers/platform/mellanox/nvsw-sn2201.c +++ b/drivers/platform/mellanox/nvsw-sn2201.c @@ -1088,7 +1088,7 @@ static int nvsw_sn2201_i2c_completion_notify(void *handle, int id) if (!nvsw_sn2201->main_mux_devs->adapter) { err = -ENODEV; dev_err(nvsw_sn2201->dev, "Failed to get adapter for bus %d\n", - nvsw_sn2201->main_mux_devs->nr); + nvsw_sn2201->cpld_devs->nr); goto i2c_get_adapter_main_fail; } diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig index 1fd57eb867662aa785da3f0beb79bf228dff0f15..07eea525091b0854fce60a5d120cd7529407eba6 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig @@ -466,7 +466,6 @@ config LENOVO_YMC tristate "Lenovo Yoga Tablet Mode Control" depends on ACPI_WMI depends on INPUT - depends on IDEAPAD_LAPTOP select INPUT_SPARSEKMAP help This driver maps the Tablet Mode Control switch to SW_TABLET_MODE input diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile index 8012de299174ff365dd5718f4c42e977d3c4b6a0..b457de5abf7d798a2ea441976bfd81716e7550bd 100644 --- a/drivers/platform/x86/Makefile +++ b/drivers/platform/x86/Makefile @@ -58,8 +58,6 @@ obj-$(CONFIG_X86_PLATFORM_DRIVERS_HP) += hp/ # Hewlett Packard Enterprise obj-$(CONFIG_UV_SYSFS) += uv_sysfs.o -obj-$(CONFIG_FW_ATTR_CLASS) += firmware_attributes_class.o - # IBM Thinkpad and Lenovo obj-$(CONFIG_IBM_RTL) += ibm_rtl.o obj-$(CONFIG_IDEAPAD_LAPTOP) += ideapad-laptop.o @@ -110,6 +108,7 @@ obj-$(CONFIG_SYSTEM76_ACPI) += system76_acpi.o obj-$(CONFIG_TOPSTAR_LAPTOP) += topstar-laptop.o # Platform drivers +obj-$(CONFIG_FW_ATTR_CLASS) += firmware_attributes_class.o obj-$(CONFIG_SERIAL_MULTI_INSTANTIATE) += serial-multi-instantiate.o obj-$(CONFIG_MLX_PLATFORM) += mlx-platform.o obj-$(CONFIG_TOUCHSCREEN_DMI) += touchscreen_dmi.o diff --git a/drivers/platform/x86/amd/pmc/pmc-quirks.c b/drivers/platform/x86/amd/pmc/pmc-quirks.c index 7ed12c1d3b34c0d74148e5686a7a39bf57a6540c..2e3f6fc67c568d44030391f9bc5b4fd146d52b0d 100644 --- a/drivers/platform/x86/amd/pmc/pmc-quirks.c +++ b/drivers/platform/x86/amd/pmc/pmc-quirks.c @@ -224,15 +224,6 @@ static const struct dmi_system_id fwbug_list[] = { DMI_MATCH(DMI_BOARD_NAME, "WUJIE14-GX4HRXL"), } }, - /* https://bugzilla.kernel.org/show_bug.cgi?id=220116 */ - { - .ident = "PCSpecialist Lafite Pro V 14M", - .driver_data = &quirk_spurious_8042, - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "PCSpecialist"), - DMI_MATCH(DMI_PRODUCT_NAME, "Lafite Pro V 14M"), - } - }, {} }; diff --git a/drivers/platform/x86/amd/pmc/pmc.c b/drivers/platform/x86/amd/pmc/pmc.c index af5cc8aa7988c13a55b1330459fedaf1f2662839..946a546cd9dd014e37e3991f4d9406f43f4d6610 100644 --- a/drivers/platform/x86/amd/pmc/pmc.c +++ b/drivers/platform/x86/amd/pmc/pmc.c @@ -332,8 +332,6 @@ static int amd_pmc_setup_smu_logging(struct amd_pmc_dev *dev) return -ENOMEM; } - memset_io(dev->smu_virt_addr, 0, sizeof(struct smu_metrics)); - /* Start the logging */ amd_pmc_send_cmd(dev, 0, NULL, SMU_MSG_LOG_RESET, false); amd_pmc_send_cmd(dev, 0, NULL, SMU_MSG_LOG_START, false); diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h b/drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h index 817ee7ba07ca08cfe286d8ff5a6f864991c6522d..3ad33a094588c6a258786a02f952eaa6bf953234 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h +++ b/drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h @@ -89,11 +89,6 @@ extern struct wmi_sysman_priv wmi_priv; enum { ENUM, INT, STR, PO }; -#define ENUM_MIN_ELEMENTS 8 -#define INT_MIN_ELEMENTS 9 -#define STR_MIN_ELEMENTS 8 -#define PO_MIN_ELEMENTS 4 - enum { ATTR_NAME, DISPL_NAME_LANG_CODE, diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c b/drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c index fc2f58b4cbc6eff863f2c3293cb4322d28048bb8..8cc212c852668312096f756bc1fb1e3054a1f5c0 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c @@ -23,10 +23,9 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_ENUMERATION_ATTRIBUTE_GUID); if (!obj) return -EIO; - if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < ENUM_MIN_ELEMENTS || - obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) { + if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) { kfree(obj); - return -EIO; + return -EINVAL; } ret = snprintf(buf, PAGE_SIZE, "%s\n", obj->package.elements[CURRENT_VAL].string.pointer); kfree(obj); diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/int-attributes.c b/drivers/platform/x86/dell/dell-wmi-sysman/int-attributes.c index 73524806423914bf210b9b5f78c0b5b4f6a7984c..951e75b538fad42509614c2ebf2ef77aa05b614f 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/int-attributes.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/int-attributes.c @@ -25,10 +25,9 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_INTEGER_ATTRIBUTE_GUID); if (!obj) return -EIO; - if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < INT_MIN_ELEMENTS || - obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_INTEGER) { + if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_INTEGER) { kfree(obj); - return -EIO; + return -EINVAL; } ret = snprintf(buf, PAGE_SIZE, "%lld\n", obj->package.elements[CURRENT_VAL].integer.value); kfree(obj); diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c b/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c index 3167e06d416ede61cda5ad4c860dcb41b05cd5fa..230e6ee966366ad809d16f2f699f1a5fc08635a5 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c @@ -26,10 +26,9 @@ static ssize_t is_enabled_show(struct kobject *kobj, struct kobj_attribute *attr obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_PASSOBJ_ATTRIBUTE_GUID); if (!obj) return -EIO; - if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < PO_MIN_ELEMENTS || - obj->package.elements[IS_PASS_SET].type != ACPI_TYPE_INTEGER) { + if (obj->package.elements[IS_PASS_SET].type != ACPI_TYPE_INTEGER) { kfree(obj); - return -EIO; + return -EINVAL; } ret = snprintf(buf, PAGE_SIZE, "%lld\n", obj->package.elements[IS_PASS_SET].integer.value); kfree(obj); @@ -46,7 +45,7 @@ static ssize_t current_password_store(struct kobject *kobj, int length; length = strlen(buf); - if (length && buf[length - 1] == '\n') + if (buf[length-1] == '\n') length--; /* firmware does verifiation of min/max password length, diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/string-attributes.c b/drivers/platform/x86/dell/dell-wmi-sysman/string-attributes.c index 0d2c74f8d1aad7843effcd7b600dd42e6947dc15..c392f0ecf8b55ba722246d67ba0073772a4f0094 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/string-attributes.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/string-attributes.c @@ -25,10 +25,9 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_STRING_ATTRIBUTE_GUID); if (!obj) return -EIO; - if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < STR_MIN_ELEMENTS || - obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) { + if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) { kfree(obj); - return -EIO; + return -EINVAL; } ret = snprintf(buf, PAGE_SIZE, "%s\n", obj->package.elements[CURRENT_VAL].string.pointer); kfree(obj); diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c b/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c index f5402b714657297e0ab4bb52a988fcc4c787a5fb..af49dd6b31ade72d66dddc5b95f736492d377069 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c @@ -25,6 +25,7 @@ struct wmi_sysman_priv wmi_priv = { /* reset bios to defaults */ static const char * const reset_types[] = {"builtinsafe", "lastknowngood", "factory", "custom"}; static int reset_option = -1; +static struct class *fw_attr_class; /** @@ -407,10 +408,10 @@ static int init_bios_attributes(int attr_type, const char *guid) return retval; switch (attr_type) { - case ENUM: min_elements = ENUM_MIN_ELEMENTS; break; - case INT: min_elements = INT_MIN_ELEMENTS; break; - case STR: min_elements = STR_MIN_ELEMENTS; break; - case PO: min_elements = PO_MIN_ELEMENTS; break; + case ENUM: min_elements = 8; break; + case INT: min_elements = 9; break; + case STR: min_elements = 8; break; + case PO: min_elements = 4; break; default: pr_err("Error: Unknown attr_type: %d\n", attr_type); return -EINVAL; @@ -540,11 +541,15 @@ static int __init sysman_init(void) goto err_exit_bios_attr_pass_interface; } - wmi_priv.class_dev = device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), + ret = fw_attributes_class_get(&fw_attr_class); + if (ret) + goto err_exit_bios_attr_pass_interface; + + wmi_priv.class_dev = device_create(fw_attr_class, NULL, MKDEV(0, 0), NULL, "%s", DRIVER_NAME); if (IS_ERR(wmi_priv.class_dev)) { ret = PTR_ERR(wmi_priv.class_dev); - goto err_exit_bios_attr_pass_interface; + goto err_unregister_class; } wmi_priv.main_dir_kset = kset_create_and_add("attributes", NULL, @@ -597,7 +602,10 @@ static int __init sysman_init(void) release_attributes_data(); err_destroy_classdev: - device_unregister(wmi_priv.class_dev); + device_destroy(fw_attr_class, MKDEV(0, 0)); + +err_unregister_class: + fw_attributes_class_put(); err_exit_bios_attr_pass_interface: exit_bios_attr_pass_interface(); @@ -611,7 +619,8 @@ static int __init sysman_init(void) static void __exit sysman_exit(void) { release_attributes_data(); - device_unregister(wmi_priv.class_dev); + device_destroy(fw_attr_class, MKDEV(0, 0)); + fw_attributes_class_put(); exit_bios_attr_set_interface(); exit_bios_attr_pass_interface(); } diff --git a/drivers/platform/x86/dell/dell_rbu.c b/drivers/platform/x86/dell/dell_rbu.c index fee20866b41e413a80577a4292e2c3725f7b492b..9f51e0fcab04e1c61ce68b90b754b6b43a741b58 100644 --- a/drivers/platform/x86/dell/dell_rbu.c +++ b/drivers/platform/x86/dell/dell_rbu.c @@ -292,7 +292,7 @@ static int packet_read_list(char *data, size_t * pread_length) remaining_bytes = *pread_length; bytes_read = rbu_data.packet_read_count; - list_for_each_entry(newpacket, &packet_data_head.list, list) { + list_for_each_entry(newpacket, (&packet_data_head.list)->next, list) { bytes_copied = do_packet_read(pdest, newpacket, remaining_bytes, bytes_read, &temp_count); remaining_bytes -= bytes_copied; @@ -315,14 +315,14 @@ static void packet_empty_list(void) { struct packet_data *newpacket, *tmp; - list_for_each_entry_safe(newpacket, tmp, &packet_data_head.list, list) { + list_for_each_entry_safe(newpacket, tmp, (&packet_data_head.list)->next, list) { list_del(&newpacket->list); /* * zero out the RBU packet memory before freeing * to make sure there are no stale RBU packets left in memory */ - memset(newpacket->data, 0, newpacket->length); + memset(newpacket->data, 0, rbu_data.packetsize); set_memory_wb((unsigned long)newpacket->data, 1 << newpacket->ordernum); free_pages((unsigned long) newpacket->data, diff --git a/drivers/platform/x86/firmware_attributes_class.c b/drivers/platform/x86/firmware_attributes_class.c index e214efc97311e2e3ad954db4fe3af3d2c706fddb..fafe8eaf6e3e4e164c325584302f9389bfc4f737 100644 --- a/drivers/platform/x86/firmware_attributes_class.c +++ b/drivers/platform/x86/firmware_attributes_class.c @@ -2,35 +2,48 @@ /* Firmware attributes class helper module */ +#include +#include #include #include "firmware_attributes_class.h" -const struct class firmware_attributes_class = { +static DEFINE_MUTEX(fw_attr_lock); +static int fw_attr_inuse; + +static struct class firmware_attributes_class = { .name = "firmware-attributes", }; -EXPORT_SYMBOL_GPL(firmware_attributes_class); - -static __init int fw_attributes_class_init(void) -{ - return class_register(&firmware_attributes_class); -} -module_init(fw_attributes_class_init); - -static __exit void fw_attributes_class_exit(void) -{ - class_unregister(&firmware_attributes_class); -} -module_exit(fw_attributes_class_exit); -int fw_attributes_class_get(const struct class **fw_attr_class) +int fw_attributes_class_get(struct class **fw_attr_class) { + int err; + + mutex_lock(&fw_attr_lock); + if (!fw_attr_inuse) { /*first time class is being used*/ + err = class_register(&firmware_attributes_class); + if (err) { + mutex_unlock(&fw_attr_lock); + return err; + } + } + fw_attr_inuse++; *fw_attr_class = &firmware_attributes_class; + mutex_unlock(&fw_attr_lock); return 0; } EXPORT_SYMBOL_GPL(fw_attributes_class_get); int fw_attributes_class_put(void) { + mutex_lock(&fw_attr_lock); + if (!fw_attr_inuse) { + mutex_unlock(&fw_attr_lock); + return -EINVAL; + } + fw_attr_inuse--; + if (!fw_attr_inuse) /* No more consumers */ + class_unregister(&firmware_attributes_class); + mutex_unlock(&fw_attr_lock); return 0; } EXPORT_SYMBOL_GPL(fw_attributes_class_put); diff --git a/drivers/platform/x86/firmware_attributes_class.h b/drivers/platform/x86/firmware_attributes_class.h index ef6c3764a83497ad7e75b0102154c92ce476e5ae..486485cb1f54e3f5f89cb48ad0e65345d58b22a0 100644 --- a/drivers/platform/x86/firmware_attributes_class.h +++ b/drivers/platform/x86/firmware_attributes_class.h @@ -5,10 +5,7 @@ #ifndef FW_ATTR_CLASS_H #define FW_ATTR_CLASS_H -#include - -extern const struct class firmware_attributes_class; -int fw_attributes_class_get(const struct class **fw_attr_class); +int fw_attributes_class_get(struct class **fw_attr_class); int fw_attributes_class_put(void); #endif /* FW_ATTR_CLASS_H */ diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index d7ef4f046d99b596f818ce7ebd4a01f812497540..085e044e888e4e788fa99894841e4d538d042bca 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c @@ -17,13 +17,13 @@ /* * fujitsu-laptop.c - Fujitsu laptop support, providing access to additional * features made available on a range of Fujitsu laptops including the - * P2xxx/P5xxx/S2xxx/S6xxx/S7xxx series. + * P2xxx/P5xxx/S6xxx/S7xxx series. * * This driver implements a vendor-specific backlight control interface for * Fujitsu laptops and provides support for hotkeys present on certain Fujitsu * laptops. * - * This driver has been tested on a Fujitsu Lifebook S2110, S6410, S7020 and + * This driver has been tested on a Fujitsu Lifebook S6410, S7020 and * P8010. It should work on most P-series and S-series Lifebooks, but * YMMV. * @@ -102,11 +102,7 @@ #define KEY2_CODE 0x411 #define KEY3_CODE 0x412 #define KEY4_CODE 0x413 -#define KEY5_CODE 0x414 -#define KEY6_CODE 0x415 -#define KEY7_CODE 0x416 -#define KEY8_CODE 0x417 -#define KEY9_CODE 0x420 +#define KEY5_CODE 0x420 /* Hotkey ringbuffer limits */ #define MAX_HOTKEY_RINGBUFFER_SIZE 100 @@ -454,7 +450,7 @@ static const struct key_entry keymap_default[] = { { KE_KEY, KEY2_CODE, { KEY_PROG2 } }, { KE_KEY, KEY3_CODE, { KEY_PROG3 } }, { KE_KEY, KEY4_CODE, { KEY_PROG4 } }, - { KE_KEY, KEY9_CODE, { KEY_RFKILL } }, + { KE_KEY, KEY5_CODE, { KEY_RFKILL } }, /* Soft keys read from status flags */ { KE_KEY, FLAG_RFKILL, { KEY_RFKILL } }, { KE_KEY, FLAG_TOUCHPAD_TOGGLE, { KEY_TOUCHPAD_TOGGLE } }, @@ -478,18 +474,6 @@ static const struct key_entry keymap_p8010[] = { { KE_END, 0 } }; -static const struct key_entry keymap_s2110[] = { - { KE_KEY, KEY1_CODE, { KEY_PROG1 } }, /* "A" */ - { KE_KEY, KEY2_CODE, { KEY_PROG2 } }, /* "B" */ - { KE_KEY, KEY3_CODE, { KEY_WWW } }, /* "Internet" */ - { KE_KEY, KEY4_CODE, { KEY_EMAIL } }, /* "E-mail" */ - { KE_KEY, KEY5_CODE, { KEY_STOPCD } }, - { KE_KEY, KEY6_CODE, { KEY_PLAYPAUSE } }, - { KE_KEY, KEY7_CODE, { KEY_PREVIOUSSONG } }, - { KE_KEY, KEY8_CODE, { KEY_NEXTSONG } }, - { KE_END, 0 } -}; - static const struct key_entry *keymap = keymap_default; static int fujitsu_laptop_dmi_keymap_override(const struct dmi_system_id *id) @@ -527,15 +511,6 @@ static const struct dmi_system_id fujitsu_laptop_dmi_table[] = { }, .driver_data = (void *)keymap_p8010 }, - { - .callback = fujitsu_laptop_dmi_keymap_override, - .ident = "Fujitsu LifeBook S2110", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), - DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK S2110"), - }, - .driver_data = (void *)keymap_s2110 - }, {} }; diff --git a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c index b62b158cffd85a183d22774d2932e94618dd8f78..6ddca857cc4d1a02ca4664cb70865fc6df7d6e57 100644 --- a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c +++ b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c @@ -24,6 +24,8 @@ struct bioscfg_priv bioscfg_drv = { .mutex = __MUTEX_INITIALIZER(bioscfg_drv.mutex), }; +static struct class *fw_attr_class; + ssize_t display_name_language_code_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) @@ -972,7 +974,11 @@ static int __init hp_init(void) if (ret) return ret; - bioscfg_drv.class_dev = device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), + ret = fw_attributes_class_get(&fw_attr_class); + if (ret) + goto err_unregister_class; + + bioscfg_drv.class_dev = device_create(fw_attr_class, NULL, MKDEV(0, 0), NULL, "%s", DRIVER_NAME); if (IS_ERR(bioscfg_drv.class_dev)) { ret = PTR_ERR(bioscfg_drv.class_dev); @@ -1039,9 +1045,10 @@ static int __init hp_init(void) release_attributes_data(); err_destroy_classdev: - device_unregister(bioscfg_drv.class_dev); + device_destroy(fw_attr_class, MKDEV(0, 0)); err_unregister_class: + fw_attributes_class_put(); hp_exit_attr_set_interface(); return ret; @@ -1050,8 +1057,9 @@ static int __init hp_init(void) static void __exit hp_exit(void) { release_attributes_data(); - device_unregister(bioscfg_drv.class_dev); + device_destroy(fw_attr_class, MKDEV(0, 0)); + fw_attributes_class_put(); hp_exit_attr_set_interface(); } diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c index 17a9e4bd638dcc362ed578548737d5941bae8501..88eefccb6ed276a60a3c6d02b03f4716a48aea8f 100644 --- a/drivers/platform/x86/ideapad-laptop.c +++ b/drivers/platform/x86/ideapad-laptop.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -22,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -88,34 +86,6 @@ enum { SALS_FNLOCK_OFF = 0xf, }; -enum { - VPCCMD_R_VPC1 = 0x10, - VPCCMD_R_BL_MAX, - VPCCMD_R_BL, - VPCCMD_W_BL, - VPCCMD_R_WIFI, - VPCCMD_W_WIFI, - VPCCMD_R_BT, - VPCCMD_W_BT, - VPCCMD_R_BL_POWER, - VPCCMD_R_NOVO, - VPCCMD_R_VPC2, - VPCCMD_R_TOUCHPAD, - VPCCMD_W_TOUCHPAD, - VPCCMD_R_CAMERA, - VPCCMD_W_CAMERA, - VPCCMD_R_3G, - VPCCMD_W_3G, - VPCCMD_R_ODD, /* 0x21 */ - VPCCMD_W_FAN, - VPCCMD_R_RF, - VPCCMD_W_RF, - VPCCMD_W_YMC = 0x2A, - VPCCMD_R_FAN = 0x2B, - VPCCMD_R_SPECIAL_BUTTONS = 0x31, - VPCCMD_W_BL_POWER = 0x33, -}; - /* * These correspond to the number of supported states - 1 * Future keyboard types may need a new system, if there's a collision @@ -175,7 +145,6 @@ struct ideapad_private { bool touchpad_ctrl_via_ec : 1; bool ctrl_ps2_aux_port : 1; bool usb_charging : 1; - bool ymc_ec_trigger : 1; } features; struct { bool initialized; @@ -219,12 +188,6 @@ MODULE_PARM_DESC(touchpad_ctrl_via_ec, "Enable registering a 'touchpad' sysfs-attribute which can be used to manually " "tell the EC to enable/disable the touchpad. This may not work on all models."); -static bool ymc_ec_trigger __read_mostly; -module_param(ymc_ec_trigger, bool, 0444); -MODULE_PARM_DESC(ymc_ec_trigger, - "Enable EC triggering work-around to force emitting tablet mode events. " - "If you need this please report this to: platform-driver-x86@vger.kernel.org"); - /* * shared data */ @@ -264,21 +227,6 @@ static void ideapad_shared_exit(struct ideapad_private *priv) /* * ACPI Helpers */ -#define IDEAPAD_EC_TIMEOUT 200 /* in ms */ - -/* - * Some models (e.g., ThinkBook since 2024) have a low tolerance for being - * polled too frequently. Doing so may break the state machine in the EC, - * resulting in a hard shutdown. - * - * It is also observed that frequent polls may disturb the ongoing operation - * and notably delay the availability of EC response. - * - * These values are used as the delay before the first poll and the interval - * between subsequent polls to solve the above issues. - */ -#define IDEAPAD_EC_POLL_MIN_US 150 -#define IDEAPAD_EC_POLL_MAX_US 300 static int eval_int(acpi_handle handle, const char *name, unsigned long *res) { @@ -294,29 +242,6 @@ static int eval_int(acpi_handle handle, const char *name, unsigned long *res) return 0; } -static int eval_int_with_arg(acpi_handle handle, const char *name, unsigned long arg, - unsigned long *res) -{ - struct acpi_object_list params; - unsigned long long result; - union acpi_object in_obj; - acpi_status status; - - params.count = 1; - params.pointer = &in_obj; - in_obj.type = ACPI_TYPE_INTEGER; - in_obj.integer.value = arg; - - status = acpi_evaluate_integer(handle, (char *)name, ¶ms, &result); - if (ACPI_FAILURE(status)) - return -EIO; - - if (res) - *res = result; - - return 0; -} - static int exec_simple_method(acpi_handle handle, const char *name, unsigned long arg) { acpi_status status = acpi_execute_simple_method(handle, (char *)name, arg); @@ -359,89 +284,6 @@ static int eval_dytc(acpi_handle handle, unsigned long cmd, unsigned long *res) return eval_int_with_arg(handle, "DYTC", cmd, res); } -static int eval_vpcr(acpi_handle handle, unsigned long cmd, unsigned long *res) -{ - return eval_int_with_arg(handle, "VPCR", cmd, res); -} - -static int eval_vpcw(acpi_handle handle, unsigned long cmd, unsigned long data) -{ - struct acpi_object_list params; - union acpi_object in_obj[2]; - acpi_status status; - - params.count = 2; - params.pointer = in_obj; - in_obj[0].type = ACPI_TYPE_INTEGER; - in_obj[0].integer.value = cmd; - in_obj[1].type = ACPI_TYPE_INTEGER; - in_obj[1].integer.value = data; - - status = acpi_evaluate_object(handle, "VPCW", ¶ms, NULL); - if (ACPI_FAILURE(status)) - return -EIO; - - return 0; -} - -static int read_ec_data(acpi_handle handle, unsigned long cmd, unsigned long *data) -{ - unsigned long end_jiffies, val; - int err; - - err = eval_vpcw(handle, 1, cmd); - if (err) - return err; - - end_jiffies = jiffies + msecs_to_jiffies(IDEAPAD_EC_TIMEOUT) + 1; - - while (time_before(jiffies, end_jiffies)) { - usleep_range(IDEAPAD_EC_POLL_MIN_US, IDEAPAD_EC_POLL_MAX_US); - - err = eval_vpcr(handle, 1, &val); - if (err) - return err; - - if (val == 0) - return eval_vpcr(handle, 0, data); - } - - acpi_handle_err(handle, "timeout in %s\n", __func__); - - return -ETIMEDOUT; -} - -static int write_ec_cmd(acpi_handle handle, unsigned long cmd, unsigned long data) -{ - unsigned long end_jiffies, val; - int err; - - err = eval_vpcw(handle, 0, data); - if (err) - return err; - - err = eval_vpcw(handle, 1, cmd); - if (err) - return err; - - end_jiffies = jiffies + msecs_to_jiffies(IDEAPAD_EC_TIMEOUT) + 1; - - while (time_before(jiffies, end_jiffies)) { - usleep_range(IDEAPAD_EC_POLL_MIN_US, IDEAPAD_EC_POLL_MAX_US); - - err = eval_vpcr(handle, 1, &val); - if (err) - return err; - - if (val == 0) - return 0; - } - - acpi_handle_err(handle, "timeout in %s\n", __func__); - - return -ETIMEDOUT; -} - /* * debugfs */ @@ -1259,9 +1101,6 @@ static const struct key_entry ideapad_keymap[] = { { KE_KEY, 0x27 | IDEAPAD_WMI_KEY, { KEY_HELP } }, /* Refresh Rate Toggle */ { KE_KEY, 0x0a | IDEAPAD_WMI_KEY, { KEY_DISPLAYTOGGLE } }, - /* Specific to some newer models */ - { KE_KEY, 0x3e | IDEAPAD_WMI_KEY, { KEY_MICMUTE } }, - { KE_KEY, 0x3f | IDEAPAD_WMI_KEY, { KEY_RFKILL } }, { KE_END }, }; @@ -1600,7 +1439,7 @@ static int ideapad_kbd_bl_init(struct ideapad_private *priv) priv->kbd_bl.led.name = "platform::" LED_FUNCTION_KBD_BACKLIGHT; priv->kbd_bl.led.brightness_get = ideapad_kbd_bl_led_cdev_brightness_get; priv->kbd_bl.led.brightness_set_blocking = ideapad_kbd_bl_led_cdev_brightness_set; - priv->kbd_bl.led.flags = LED_BRIGHT_HW_CHANGED | LED_RETAIN_AT_SHUTDOWN; + priv->kbd_bl.led.flags = LED_BRIGHT_HW_CHANGED; err = led_classdev_register(&priv->platform_device->dev, &priv->kbd_bl.led); if (err) @@ -1659,79 +1498,6 @@ static void ideapad_sync_touchpad_state(struct ideapad_private *priv, bool send_ priv->r_touchpad_val = value; } -static const struct dmi_system_id ymc_ec_trigger_quirk_dmi_table[] = { - { - /* Lenovo Yoga 7 14ARB7 */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_NAME, "82QF"), - }, - }, - { - /* Lenovo Yoga 7 14ACN6 */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_NAME, "82N7"), - }, - }, - { } -}; - -static void ideapad_laptop_trigger_ec(void) -{ - struct ideapad_private *priv; - int ret; - - guard(mutex)(&ideapad_shared_mutex); - - priv = ideapad_shared; - if (!priv) - return; - - if (!priv->features.ymc_ec_trigger) - return; - - ret = write_ec_cmd(priv->adev->handle, VPCCMD_W_YMC, 1); - if (ret) - dev_warn(&priv->platform_device->dev, "Could not write YMC: %d\n", ret); -} - -static int ideapad_laptop_nb_notify(struct notifier_block *nb, - unsigned long action, void *data) -{ - switch (action) { - case IDEAPAD_LAPTOP_YMC_EVENT: - ideapad_laptop_trigger_ec(); - break; - } - - return 0; -} - -static struct notifier_block ideapad_laptop_notifier = { - .notifier_call = ideapad_laptop_nb_notify, -}; - -static BLOCKING_NOTIFIER_HEAD(ideapad_laptop_chain_head); - -int ideapad_laptop_register_notifier(struct notifier_block *nb) -{ - return blocking_notifier_chain_register(&ideapad_laptop_chain_head, nb); -} -EXPORT_SYMBOL_NS_GPL(ideapad_laptop_register_notifier, IDEAPAD_LAPTOP); - -int ideapad_laptop_unregister_notifier(struct notifier_block *nb) -{ - return blocking_notifier_chain_unregister(&ideapad_laptop_chain_head, nb); -} -EXPORT_SYMBOL_NS_GPL(ideapad_laptop_unregister_notifier, IDEAPAD_LAPTOP); - -void ideapad_laptop_call_notifier(unsigned long action, void *data) -{ - blocking_notifier_call_chain(&ideapad_laptop_chain_head, action, data); -} -EXPORT_SYMBOL_NS_GPL(ideapad_laptop_call_notifier, IDEAPAD_LAPTOP); - static void ideapad_acpi_notify(acpi_handle handle, u32 event, void *data) { struct ideapad_private *priv = data; @@ -1868,8 +1634,6 @@ static void ideapad_check_features(struct ideapad_private *priv) priv->features.ctrl_ps2_aux_port = ctrl_ps2_aux_port || dmi_check_system(ctrl_ps2_aux_port_list); priv->features.touchpad_ctrl_via_ec = touchpad_ctrl_via_ec; - priv->features.ymc_ec_trigger = - ymc_ec_trigger || dmi_check_system(ymc_ec_trigger_quirk_dmi_table); if (!read_ec_data(handle, VPCCMD_R_FAN, &val)) priv->features.fan_mode = true; @@ -2105,8 +1869,6 @@ static int ideapad_acpi_add(struct platform_device *pdev) if (err) goto shared_init_failed; - ideapad_laptop_register_notifier(&ideapad_laptop_notifier); - return 0; shared_init_failed: @@ -2138,8 +1900,6 @@ static void ideapad_acpi_remove(struct platform_device *pdev) struct ideapad_private *priv = dev_get_drvdata(&pdev->dev); int i; - ideapad_laptop_unregister_notifier(&ideapad_laptop_notifier); - ideapad_shared_exit(priv); acpi_remove_notify_handler(priv->adev->handle, diff --git a/drivers/platform/x86/ideapad-laptop.h b/drivers/platform/x86/ideapad-laptop.h index 1e52f2aa0aac38dc6c82104792a818c223632a4a..4498a96de59769e7ed9db5e021b3ed856a121a62 100644 --- a/drivers/platform/x86/ideapad-laptop.h +++ b/drivers/platform/x86/ideapad-laptop.h @@ -9,14 +9,144 @@ #ifndef _IDEAPAD_LAPTOP_H_ #define _IDEAPAD_LAPTOP_H_ -#include +#include +#include +#include -enum ideapad_laptop_notifier_actions { - IDEAPAD_LAPTOP_YMC_EVENT, +enum { + VPCCMD_R_VPC1 = 0x10, + VPCCMD_R_BL_MAX, + VPCCMD_R_BL, + VPCCMD_W_BL, + VPCCMD_R_WIFI, + VPCCMD_W_WIFI, + VPCCMD_R_BT, + VPCCMD_W_BT, + VPCCMD_R_BL_POWER, + VPCCMD_R_NOVO, + VPCCMD_R_VPC2, + VPCCMD_R_TOUCHPAD, + VPCCMD_W_TOUCHPAD, + VPCCMD_R_CAMERA, + VPCCMD_W_CAMERA, + VPCCMD_R_3G, + VPCCMD_W_3G, + VPCCMD_R_ODD, /* 0x21 */ + VPCCMD_W_FAN, + VPCCMD_R_RF, + VPCCMD_W_RF, + VPCCMD_W_YMC = 0x2A, + VPCCMD_R_FAN = 0x2B, + VPCCMD_R_SPECIAL_BUTTONS = 0x31, + VPCCMD_W_BL_POWER = 0x33, }; -int ideapad_laptop_register_notifier(struct notifier_block *nb); -int ideapad_laptop_unregister_notifier(struct notifier_block *nb); -void ideapad_laptop_call_notifier(unsigned long action, void *data); +static inline int eval_int_with_arg(acpi_handle handle, const char *name, unsigned long arg, unsigned long *res) +{ + struct acpi_object_list params; + unsigned long long result; + union acpi_object in_obj; + acpi_status status; + params.count = 1; + params.pointer = &in_obj; + in_obj.type = ACPI_TYPE_INTEGER; + in_obj.integer.value = arg; + + status = acpi_evaluate_integer(handle, (char *)name, ¶ms, &result); + if (ACPI_FAILURE(status)) + return -EIO; + + if (res) + *res = result; + + return 0; +} + +static inline int eval_vpcr(acpi_handle handle, unsigned long cmd, unsigned long *res) +{ + return eval_int_with_arg(handle, "VPCR", cmd, res); +} + +static inline int eval_vpcw(acpi_handle handle, unsigned long cmd, unsigned long data) +{ + struct acpi_object_list params; + union acpi_object in_obj[2]; + acpi_status status; + + params.count = 2; + params.pointer = in_obj; + in_obj[0].type = ACPI_TYPE_INTEGER; + in_obj[0].integer.value = cmd; + in_obj[1].type = ACPI_TYPE_INTEGER; + in_obj[1].integer.value = data; + + status = acpi_evaluate_object(handle, "VPCW", ¶ms, NULL); + if (ACPI_FAILURE(status)) + return -EIO; + + return 0; +} + +#define IDEAPAD_EC_TIMEOUT 200 /* in ms */ + +static inline int read_ec_data(acpi_handle handle, unsigned long cmd, unsigned long *data) +{ + unsigned long end_jiffies, val; + int err; + + err = eval_vpcw(handle, 1, cmd); + if (err) + return err; + + end_jiffies = jiffies + msecs_to_jiffies(IDEAPAD_EC_TIMEOUT) + 1; + + while (time_before(jiffies, end_jiffies)) { + schedule(); + + err = eval_vpcr(handle, 1, &val); + if (err) + return err; + + if (val == 0) + return eval_vpcr(handle, 0, data); + } + + acpi_handle_err(handle, "timeout in %s\n", __func__); + + return -ETIMEDOUT; +} + +static inline int write_ec_cmd(acpi_handle handle, unsigned long cmd, unsigned long data) +{ + unsigned long end_jiffies, val; + int err; + + err = eval_vpcw(handle, 0, data); + if (err) + return err; + + err = eval_vpcw(handle, 1, cmd); + if (err) + return err; + + end_jiffies = jiffies + msecs_to_jiffies(IDEAPAD_EC_TIMEOUT) + 1; + + while (time_before(jiffies, end_jiffies)) { + schedule(); + + err = eval_vpcr(handle, 1, &val); + if (err) + return err; + + if (val == 0) + return 0; + } + + acpi_handle_err(handle, "timeout in %s\n", __func__); + + return -ETIMEDOUT; +} + +#undef IDEAPAD_EC_TIMEOUT #endif /* !_IDEAPAD_LAPTOP_H_ */ diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c index 5be3b26876151c03d153413e7319104936582ee0..1050221645482456a6cb1714f851bd128a0ecc42 100644 --- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c +++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c @@ -269,13 +269,10 @@ static int uncore_probe(struct auxiliary_device *auxdev, const struct auxiliary_ /* Get the package ID from the TPMI core */ plat_info = tpmi_get_platform_data(auxdev); - if (unlikely(!plat_info)) { + if (plat_info) + pkg = plat_info->package_id; + else dev_info(&auxdev->dev, "Platform information is NULL\n"); - ret = -ENODEV; - goto err_rem_common; - } - - pkg = plat_info->package_id; for (i = 0; i < num_resources; ++i) { struct tpmi_uncore_power_domain_info *pd_info; diff --git a/drivers/platform/x86/lenovo-ymc.c b/drivers/platform/x86/lenovo-ymc.c index bd9f95404c7cb0cf901d64cc2da5ce82e2a49ff1..ef2c267ab485cd64fb8811534d72adcbd469b7ad 100644 --- a/drivers/platform/x86/lenovo-ymc.c +++ b/drivers/platform/x86/lenovo-ymc.c @@ -20,10 +20,32 @@ #define LENOVO_YMC_QUERY_INSTANCE 0 #define LENOVO_YMC_QUERY_METHOD 0x01 +static bool ec_trigger __read_mostly; +module_param(ec_trigger, bool, 0444); +MODULE_PARM_DESC(ec_trigger, "Enable EC triggering work-around to force emitting tablet mode events"); + static bool force; module_param(force, bool, 0444); MODULE_PARM_DESC(force, "Force loading on boards without a convertible DMI chassis-type"); +static const struct dmi_system_id ec_trigger_quirk_dmi_table[] = { + { + /* Lenovo Yoga 7 14ARB7 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "82QF"), + }, + }, + { + /* Lenovo Yoga 7 14ACN6 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "82N7"), + }, + }, + { } +}; + static const struct dmi_system_id allowed_chasis_types_dmi_table[] = { { .matches = { @@ -40,8 +62,21 @@ static const struct dmi_system_id allowed_chasis_types_dmi_table[] = { struct lenovo_ymc_private { struct input_dev *input_dev; + struct acpi_device *ec_acpi_dev; }; +static void lenovo_ymc_trigger_ec(struct wmi_device *wdev, struct lenovo_ymc_private *priv) +{ + int err; + + if (!priv->ec_acpi_dev) + return; + + err = write_ec_cmd(priv->ec_acpi_dev->handle, VPCCMD_W_YMC, 1); + if (err) + dev_warn(&wdev->dev, "Could not write YMC: %d\n", err); +} + static const struct key_entry lenovo_ymc_keymap[] = { /* Ignore the uninitialized state */ { KE_IGNORE, 0x00 }, @@ -92,9 +127,11 @@ static void lenovo_ymc_notify(struct wmi_device *wdev, union acpi_object *data) free_obj: kfree(obj); - ideapad_laptop_call_notifier(IDEAPAD_LAPTOP_YMC_EVENT, &code); + lenovo_ymc_trigger_ec(wdev, priv); } +static void acpi_dev_put_helper(void *p) { acpi_dev_put(p); } + static int lenovo_ymc_probe(struct wmi_device *wdev, const void *ctx) { struct lenovo_ymc_private *priv; @@ -108,10 +145,29 @@ static int lenovo_ymc_probe(struct wmi_device *wdev, const void *ctx) return -ENODEV; } + ec_trigger |= dmi_check_system(ec_trigger_quirk_dmi_table); + priv = devm_kzalloc(&wdev->dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; + if (ec_trigger) { + pr_debug("Lenovo YMC enable EC triggering.\n"); + priv->ec_acpi_dev = acpi_dev_get_first_match_dev("VPC2004", NULL, -1); + + if (!priv->ec_acpi_dev) { + dev_err(&wdev->dev, "Could not find EC ACPI device.\n"); + return -ENODEV; + } + err = devm_add_action_or_reset(&wdev->dev, + acpi_dev_put_helper, priv->ec_acpi_dev); + if (err) { + dev_err(&wdev->dev, + "Could not clean up EC ACPI device: %d\n", err); + return err; + } + } + input_dev = devm_input_allocate_device(&wdev->dev); if (!input_dev) return -ENOMEM; @@ -138,6 +194,7 @@ static int lenovo_ymc_probe(struct wmi_device *wdev, const void *ctx) dev_set_drvdata(&wdev->dev, priv); /* Report the state for the first time on probe */ + lenovo_ymc_trigger_ec(wdev, priv); lenovo_ymc_notify(wdev, NULL); return 0; } @@ -162,4 +219,3 @@ module_wmi_driver(lenovo_ymc_driver); MODULE_AUTHOR("Gergo Koteles "); MODULE_DESCRIPTION("Lenovo Yoga Mode Control driver"); MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IDEAPAD_LAPTOP); diff --git a/drivers/platform/x86/think-lmi.c b/drivers/platform/x86/think-lmi.c index d5319b4637e18df3869d846c8bb8aed107b7f684..2396decdb3cb3f4d65e1188313ab83d8882ea5e0 100644 --- a/drivers/platform/x86/think-lmi.c +++ b/drivers/platform/x86/think-lmi.c @@ -195,6 +195,7 @@ static const char * const level_options[] = { [TLMI_LEVEL_MASTER] = "master", }; static struct think_lmi tlmi_priv; +static struct class *fw_attr_class; static DEFINE_MUTEX(tlmi_mutex); /* ------ Utility functions ------------*/ @@ -916,7 +917,6 @@ static const struct attribute_group auth_attr_group = { .is_visible = auth_attr_is_visible, .attrs = auth_attrs, }; -__ATTRIBUTE_GROUPS(auth_attr); /* ---- Attributes sysfs --------------------------------------------------------- */ static ssize_t display_name_show(struct kobject *kobj, struct kobj_attribute *attr, @@ -1120,7 +1120,6 @@ static const struct attribute_group tlmi_attr_group = { .is_visible = attr_is_visible, .attrs = tlmi_attrs, }; -__ATTRIBUTE_GROUPS(tlmi_attr); static void tlmi_attr_setting_release(struct kobject *kobj) { @@ -1140,13 +1139,11 @@ static void tlmi_pwd_setting_release(struct kobject *kobj) static const struct kobj_type tlmi_attr_setting_ktype = { .release = &tlmi_attr_setting_release, .sysfs_ops = &kobj_sysfs_ops, - .default_groups = tlmi_attr_groups, }; static const struct kobj_type tlmi_pwd_setting_ktype = { .release = &tlmi_pwd_setting_release, .sysfs_ops = &kobj_sysfs_ops, - .default_groups = auth_attr_groups, }; static ssize_t pending_reboot_show(struct kobject *kobj, struct kobj_attribute *attr, @@ -1216,16 +1213,19 @@ static struct kobj_attribute debug_cmd = __ATTR_WO(debug_cmd); /* ---- Initialisation --------------------------------------------------------- */ static void tlmi_release_attr(void) { - struct kobject *pos, *n; + int i; /* Attribute structures */ + for (i = 0; i < TLMI_SETTINGS_COUNT; i++) { + if (tlmi_priv.setting[i]) { + sysfs_remove_group(&tlmi_priv.setting[i]->kobj, &tlmi_attr_group); + kobject_put(&tlmi_priv.setting[i]->kobj); + } + } sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &pending_reboot.attr); if (tlmi_priv.can_debug_cmd && debug_support) sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &debug_cmd.attr); - list_for_each_entry_safe(pos, n, &tlmi_priv.attribute_kset->list, entry) - kobject_put(pos); - kset_unregister(tlmi_priv.attribute_kset); /* Free up any saved signatures */ @@ -1233,8 +1233,19 @@ static void tlmi_release_attr(void) kfree(tlmi_priv.pwd_admin->save_signature); /* Authentication structures */ - list_for_each_entry_safe(pos, n, &tlmi_priv.authentication_kset->list, entry) - kobject_put(pos); + sysfs_remove_group(&tlmi_priv.pwd_admin->kobj, &auth_attr_group); + kobject_put(&tlmi_priv.pwd_admin->kobj); + sysfs_remove_group(&tlmi_priv.pwd_power->kobj, &auth_attr_group); + kobject_put(&tlmi_priv.pwd_power->kobj); + + if (tlmi_priv.opcode_support) { + sysfs_remove_group(&tlmi_priv.pwd_system->kobj, &auth_attr_group); + kobject_put(&tlmi_priv.pwd_system->kobj); + sysfs_remove_group(&tlmi_priv.pwd_hdd->kobj, &auth_attr_group); + kobject_put(&tlmi_priv.pwd_hdd->kobj); + sysfs_remove_group(&tlmi_priv.pwd_nvme->kobj, &auth_attr_group); + kobject_put(&tlmi_priv.pwd_nvme->kobj); + } kset_unregister(tlmi_priv.authentication_kset); } @@ -1261,7 +1272,11 @@ static int tlmi_sysfs_init(void) { int i, ret; - tlmi_priv.class_dev = device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), + ret = fw_attributes_class_get(&fw_attr_class); + if (ret) + return ret; + + tlmi_priv.class_dev = device_create(fw_attr_class, NULL, MKDEV(0, 0), NULL, "%s", "thinklmi"); if (IS_ERR(tlmi_priv.class_dev)) { ret = PTR_ERR(tlmi_priv.class_dev); @@ -1275,14 +1290,6 @@ static int tlmi_sysfs_init(void) goto fail_device_created; } - tlmi_priv.authentication_kset = kset_create_and_add("authentication", NULL, - &tlmi_priv.class_dev->kobj); - if (!tlmi_priv.authentication_kset) { - kset_unregister(tlmi_priv.attribute_kset); - ret = -ENOMEM; - goto fail_device_created; - } - for (i = 0; i < TLMI_SETTINGS_COUNT; i++) { /* Check if index is a valid setting - skip if it isn't */ if (!tlmi_priv.setting[i]) @@ -1299,8 +1306,12 @@ static int tlmi_sysfs_init(void) /* Build attribute */ tlmi_priv.setting[i]->kobj.kset = tlmi_priv.attribute_kset; - ret = kobject_init_and_add(&tlmi_priv.setting[i]->kobj, &tlmi_attr_setting_ktype, - NULL, "%s", tlmi_priv.setting[i]->display_name); + ret = kobject_add(&tlmi_priv.setting[i]->kobj, NULL, + "%s", tlmi_priv.setting[i]->display_name); + if (ret) + goto fail_create_attr; + + ret = sysfs_create_group(&tlmi_priv.setting[i]->kobj, &tlmi_attr_group); if (ret) goto fail_create_attr; } @@ -1316,34 +1327,55 @@ static int tlmi_sysfs_init(void) } /* Create authentication entries */ + tlmi_priv.authentication_kset = kset_create_and_add("authentication", NULL, + &tlmi_priv.class_dev->kobj); + if (!tlmi_priv.authentication_kset) { + ret = -ENOMEM; + goto fail_create_attr; + } tlmi_priv.pwd_admin->kobj.kset = tlmi_priv.authentication_kset; - ret = kobject_init_and_add(&tlmi_priv.pwd_admin->kobj, &tlmi_pwd_setting_ktype, - NULL, "%s", "Admin"); + ret = kobject_add(&tlmi_priv.pwd_admin->kobj, NULL, "%s", "Admin"); + if (ret) + goto fail_create_attr; + + ret = sysfs_create_group(&tlmi_priv.pwd_admin->kobj, &auth_attr_group); if (ret) goto fail_create_attr; tlmi_priv.pwd_power->kobj.kset = tlmi_priv.authentication_kset; - ret = kobject_init_and_add(&tlmi_priv.pwd_power->kobj, &tlmi_pwd_setting_ktype, - NULL, "%s", "Power-on"); + ret = kobject_add(&tlmi_priv.pwd_power->kobj, NULL, "%s", "Power-on"); + if (ret) + goto fail_create_attr; + + ret = sysfs_create_group(&tlmi_priv.pwd_power->kobj, &auth_attr_group); if (ret) goto fail_create_attr; if (tlmi_priv.opcode_support) { tlmi_priv.pwd_system->kobj.kset = tlmi_priv.authentication_kset; - ret = kobject_init_and_add(&tlmi_priv.pwd_system->kobj, &tlmi_pwd_setting_ktype, - NULL, "%s", "System"); + ret = kobject_add(&tlmi_priv.pwd_system->kobj, NULL, "%s", "System"); + if (ret) + goto fail_create_attr; + + ret = sysfs_create_group(&tlmi_priv.pwd_system->kobj, &auth_attr_group); if (ret) goto fail_create_attr; tlmi_priv.pwd_hdd->kobj.kset = tlmi_priv.authentication_kset; - ret = kobject_init_and_add(&tlmi_priv.pwd_hdd->kobj, &tlmi_pwd_setting_ktype, - NULL, "%s", "HDD"); + ret = kobject_add(&tlmi_priv.pwd_hdd->kobj, NULL, "%s", "HDD"); + if (ret) + goto fail_create_attr; + + ret = sysfs_create_group(&tlmi_priv.pwd_hdd->kobj, &auth_attr_group); if (ret) goto fail_create_attr; tlmi_priv.pwd_nvme->kobj.kset = tlmi_priv.authentication_kset; - ret = kobject_init_and_add(&tlmi_priv.pwd_nvme->kobj, &tlmi_pwd_setting_ktype, - NULL, "%s", "NVMe"); + ret = kobject_add(&tlmi_priv.pwd_nvme->kobj, NULL, "%s", "NVMe"); + if (ret) + goto fail_create_attr; + + ret = sysfs_create_group(&tlmi_priv.pwd_nvme->kobj, &auth_attr_group); if (ret) goto fail_create_attr; } @@ -1353,8 +1385,9 @@ static int tlmi_sysfs_init(void) fail_create_attr: tlmi_release_attr(); fail_device_created: - device_unregister(tlmi_priv.class_dev); + device_destroy(fw_attr_class, MKDEV(0, 0)); fail_class_created: + fw_attributes_class_put(); return ret; } @@ -1376,6 +1409,8 @@ static struct tlmi_pwd_setting *tlmi_create_auth(const char *pwd_type, new_pwd->maxlen = tlmi_priv.pwdcfg.core.max_length; new_pwd->index = 0; + kobject_init(&new_pwd->kobj, &tlmi_pwd_setting_ktype); + return new_pwd; } @@ -1479,6 +1514,7 @@ static int tlmi_analyze(void) if (setting->possible_values) strreplace(setting->possible_values, ',', ';'); + kobject_init(&setting->kobj, &tlmi_attr_setting_ktype); tlmi_priv.setting[i] = setting; kfree(item); } @@ -1574,7 +1610,8 @@ static int tlmi_analyze(void) static void tlmi_remove(struct wmi_device *wdev) { tlmi_release_attr(); - device_unregister(tlmi_priv.class_dev); + device_destroy(fw_attr_class, MKDEV(0, 0)); + fw_attributes_class_put(); } static int tlmi_probe(struct wmi_device *wdev, const void *context) diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 8de0d3232e48c524674293441e5b682f5144ec36..cde5f845cf2557ddf58caa10ac576fae6aaf737c 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -212,7 +212,6 @@ enum tpacpi_hkey_event_t { /* Thermal events */ TP_HKEY_EV_ALARM_BAT_HOT = 0x6011, /* battery too hot */ TP_HKEY_EV_ALARM_BAT_XHOT = 0x6012, /* battery critically hot */ - TP_HKEY_EV_ALARM_BAT_LIM_CHANGE = 0x6013, /* battery charge limit changed*/ TP_HKEY_EV_ALARM_SENSOR_HOT = 0x6021, /* sensor too hot */ TP_HKEY_EV_ALARM_SENSOR_XHOT = 0x6022, /* sensor critically hot */ TP_HKEY_EV_THM_TABLE_CHANGED = 0x6030, /* windows; thermal table changed */ @@ -3943,10 +3942,6 @@ static bool hotkey_notify_6xxx(const u32 hkey, pr_alert("THERMAL EMERGENCY: battery is extremely hot!\n"); /* recommended action: immediate sleep/hibernate */ break; - case TP_HKEY_EV_ALARM_BAT_LIM_CHANGE: - pr_debug("Battery Info: battery charge threshold changed\n"); - /* User changed charging threshold. No action needed */ - return true; case TP_HKEY_EV_ALARM_SENSOR_HOT: pr_crit("THERMAL ALARM: a sensor reports something is too hot!\n"); /* recommended action: warn user through gui, that */ @@ -11320,8 +11315,6 @@ static int __must_check __init get_thinkpad_model_data( tp->vendor = PCI_VENDOR_ID_IBM; else if (dmi_name_in_vendors("LENOVO")) tp->vendor = PCI_VENDOR_ID_LENOVO; - else if (dmi_name_in_vendors("NEC")) - tp->vendor = PCI_VENDOR_ID_LENOVO; else return 0; diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c index bafe4cc6fafdcb1b064800ae1c922c5d61d52413..aa9b012d3d00b8489b4a82539aad03157987b328 100644 --- a/drivers/power/reset/at91-reset.c +++ b/drivers/power/reset/at91-reset.c @@ -129,11 +129,12 @@ static int at91_reset(struct notifier_block *this, unsigned long mode, " str %4, [%0, %6]\n\t" /* Disable SDRAM1 accesses */ "1: tst %1, #0\n\t" + " beq 2f\n\t" " strne %3, [%1, #" __stringify(AT91_DDRSDRC_RTR) "]\n\t" /* Power down SDRAM1 */ " strne %4, [%1, %6]\n\t" /* Reset CPU */ - " str %5, [%2, #" __stringify(AT91_RSTC_CR) "]\n\t" + "2: str %5, [%2, #" __stringify(AT91_RSTC_CR) "]\n\t" " b .\n\t" : @@ -144,7 +145,7 @@ static int at91_reset(struct notifier_block *this, unsigned long mode, "r" cpu_to_le32(AT91_DDRSDRC_LPCB_POWER_DOWN), "r" (reset->data->reset_args), "r" (reset->ramc_lpr) - ); + : "r4"); return NOTIFY_DONE; } diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c index e51fa2c694bc6de962d5383f7e572b46a060e783..23c87365675742591d3420854d5c0fd955f3bc70 100644 --- a/drivers/power/supply/bq27xxx_battery.c +++ b/drivers/power/supply/bq27xxx_battery.c @@ -2044,7 +2044,7 @@ static int bq27xxx_battery_get_property(struct power_supply *psy, mutex_unlock(&di->lock); if (psp != POWER_SUPPLY_PROP_PRESENT && di->cache.flags < 0) - return di->cache.flags; + return -ENODEV; switch (psp) { case POWER_SUPPLY_PROP_STATUS: diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c index 8877fa333cd02e39c59dd7b35638ac92a30d6225..886e0a8e2abd1e0cf7f941fdcaf64c38904c67a1 100644 --- a/drivers/power/supply/bq27xxx_battery_i2c.c +++ b/drivers/power/supply/bq27xxx_battery_i2c.c @@ -6,7 +6,6 @@ * Andrew F. Davis */ -#include #include #include #include @@ -33,7 +32,6 @@ static int bq27xxx_battery_i2c_read(struct bq27xxx_device_info *di, u8 reg, struct i2c_msg msg[2]; u8 data[2]; int ret; - int retry = 0; if (!client->adapter) return -ENODEV; @@ -50,16 +48,7 @@ static int bq27xxx_battery_i2c_read(struct bq27xxx_device_info *di, u8 reg, else msg[1].len = 2; - do { - ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); - if (ret == -EBUSY && ++retry < 3) { - /* sleep 10 milliseconds when busy */ - usleep_range(10000, 11000); - continue; - } - break; - } while (1); - + ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); if (ret < 0) return ret; diff --git a/drivers/power/supply/collie_battery.c b/drivers/power/supply/collie_battery.c index 3daf7befc0bf641f86bda840676e1c9899a3771e..68390bd1004f042ed9923d3c211faa40b27f120f 100644 --- a/drivers/power/supply/collie_battery.c +++ b/drivers/power/supply/collie_battery.c @@ -440,7 +440,6 @@ static int collie_bat_probe(struct ucb1x00_dev *dev) static void collie_bat_remove(struct ucb1x00_dev *dev) { - device_init_wakeup(&ucb->dev, 0); free_irq(gpiod_to_irq(collie_bat_main.gpio_full), &collie_bat_main); power_supply_unregister(collie_bat_bu.psy); power_supply_unregister(collie_bat_main.psy); diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_rapl_common.c index 5a09a56698f4a05a615f2dead96a07ec2386dc53..f1de4111e98d9d2224147625e9d2742c7fe818ce 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -338,28 +338,12 @@ static int set_domain_enable(struct powercap_zone *power_zone, bool mode) { struct rapl_domain *rd = power_zone_to_rapl_domain(power_zone); struct rapl_defaults *defaults = get_defaults(rd->rp); - u64 val; int ret; cpus_read_lock(); ret = rapl_write_pl_data(rd, POWER_LIMIT1, PL_ENABLE, mode); - if (ret) - goto end; - - ret = rapl_read_pl_data(rd, POWER_LIMIT1, PL_ENABLE, false, &val); - if (ret) - goto end; - - if (mode != val) { - pr_debug("%s cannot be %s\n", power_zone->name, - str_enabled_disabled(mode)); - goto end; - } - - if (defaults->set_floor_freq) + if (!ret && defaults->set_floor_freq) defaults->set_floor_freq(rd, mode); - -end: cpus_read_unlock(); return ret; diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c index b7fc260ed43bc4a16a9d2e6e393d637137dfa5d6..6b7e8b7ebcef5ef5cd4605613f12c031717524bc 100644 --- a/drivers/ptp/ptp_clock.c +++ b/drivers/ptp/ptp_clock.c @@ -104,8 +104,7 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx) struct ptp_clock_info *ops; int err = -EOPNOTSUPP; - if (tx->modes & (ADJ_SETOFFSET | ADJ_FREQUENCY | ADJ_OFFSET) && - ptp_clock_freerun(ptp)) { + if (ptp_clock_freerun(ptp)) { pr_err("ptp: physical clock is free running\n"); return -EBUSY; } diff --git a/drivers/ptp/ptp_private.h b/drivers/ptp/ptp_private.h index a54124269c2f494055acf14cbe42da075ba82458..b8d4f61f14be4fd65c55b92f0b8dc2882c865f59 100644 --- a/drivers/ptp/ptp_private.h +++ b/drivers/ptp/ptp_private.h @@ -91,20 +91,10 @@ static inline bool ptp_vclock_in_use(struct ptp_clock *ptp) { bool in_use = false; - /* Virtual clocks can't be stacked on top of virtual clocks. - * Avoid acquiring the n_vclocks_mux on virtual clocks, to allow this - * function to be called from code paths where the n_vclocks_mux of the - * parent physical clock is already held. Functionally that's not an - * issue, but lockdep would complain, because they have the same lock - * class. - */ - if (ptp->is_virtual_clock) - return false; - if (mutex_lock_interruptible(&ptp->n_vclocks_mux)) return true; - if (ptp->n_vclocks) + if (!ptp->is_virtual_clock && ptp->n_vclocks) in_use = true; mutex_unlock(&ptp->n_vclocks_mux); diff --git a/drivers/pwm/pwm-mediatek.c b/drivers/pwm/pwm-mediatek.c index ff7c70a0033d8a46fb7dd941c60d0e7d263585bc..6b1a75b6bd12fb263c87a16bdc13e85e40245661 100644 --- a/drivers/pwm/pwm-mediatek.c +++ b/drivers/pwm/pwm-mediatek.c @@ -133,10 +133,8 @@ static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm, return ret; clk_rate = clk_get_rate(pc->clk_pwms[pwm->hwpwm]); - if (!clk_rate) { - ret = -EINVAL; - goto out; - } + if (!clk_rate) + return -EINVAL; /* Make sure we use the bus clock and not the 26MHz clock */ if (pc->soc->has_ck_26m_sel) @@ -155,9 +153,9 @@ static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm, } if (clkdiv > PWM_CLK_DIV_MAX) { + pwm_mediatek_clk_disable(chip, pwm); dev_err(chip->dev, "period of %d ns not supported\n", period_ns); - ret = -EINVAL; - goto out; + return -EINVAL; } if (pc->soc->pwm45_fixup && pwm->hwpwm > 2) { @@ -174,10 +172,9 @@ static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm, pwm_mediatek_writel(pc, pwm->hwpwm, reg_width, cnt_period); pwm_mediatek_writel(pc, pwm->hwpwm, reg_thres, cnt_duty); -out: pwm_mediatek_clk_disable(chip, pwm); - return ret; + return 0; } static int pwm_mediatek_enable(struct pwm_chip *chip, struct pwm_device *pwm) diff --git a/drivers/rapidio/rio_cm.c b/drivers/rapidio/rio_cm.c index 897642e62068a3d90a125c2e87097dd12f24c9d3..49f8d111e5462321891ed5e605e764a0040fc89a 100644 --- a/drivers/rapidio/rio_cm.c +++ b/drivers/rapidio/rio_cm.c @@ -787,9 +787,6 @@ static int riocm_ch_send(u16 ch_id, void *buf, int len) if (buf == NULL || ch_id == 0 || len == 0 || len > RIO_MAX_MSG_SIZE) return -EINVAL; - if (len < sizeof(struct rio_ch_chan_hdr)) - return -EINVAL; /* insufficient data from user */ - ch = riocm_get_channel(ch_id); if (!ch) { riocm_error("%s(%d) ch_%d not found", current->comm, diff --git a/drivers/regulator/ad5398.c b/drivers/regulator/ad5398.c index 404cbe32711e73526a9764b0ccf79dd784ba1761..40f7dba42b5ad7c95a3e2643b3ad6e076cf2cbb4 100644 --- a/drivers/regulator/ad5398.c +++ b/drivers/regulator/ad5398.c @@ -14,7 +14,6 @@ #include #include #include -#include #define AD5398_CURRENT_EN_MASK 0x8000 @@ -222,20 +221,15 @@ static int ad5398_probe(struct i2c_client *client) const struct ad5398_current_data_format *df = (struct ad5398_current_data_format *)id->driver_data; + if (!init_data) + return -EINVAL; + chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); if (!chip) return -ENOMEM; config.dev = &client->dev; - if (client->dev.of_node) - init_data = of_get_regulator_init_data(&client->dev, - client->dev.of_node, - &ad5398_reg); - if (!init_data) - return -EINVAL; - config.init_data = init_data; - config.of_node = client->dev.of_node; config.driver_data = chip; chip->client = client; diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 1d49612eeb7e546f1d8888ebf6cb4ad7bb8d0272..d2e21dc61dd7d548fb1d7a31e25726e99d528225 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -5422,7 +5422,6 @@ static void regulator_remove_coupling(struct regulator_dev *rdev) ERR_PTR(err)); } - rdev->coupling_desc.n_coupled = 0; kfree(rdev->coupling_desc.coupled_rdevs); rdev->coupling_desc.coupled_rdevs = NULL; } diff --git a/drivers/regulator/fan53555.c b/drivers/regulator/fan53555.c index 8912f5be72707c21475030be2a4db6c97062d3c0..48f312167e5351b138ad6e2c8e759c90efca5e62 100644 --- a/drivers/regulator/fan53555.c +++ b/drivers/regulator/fan53555.c @@ -147,7 +147,6 @@ struct fan53555_device_info { unsigned int slew_mask; const unsigned int *ramp_delay_table; unsigned int n_ramp_values; - unsigned int enable_time; unsigned int slew_rate; }; @@ -283,7 +282,6 @@ static int fan53526_voltages_setup_fairchild(struct fan53555_device_info *di) di->slew_mask = CTL_SLEW_MASK; di->ramp_delay_table = slew_rates; di->n_ramp_values = ARRAY_SIZE(slew_rates); - di->enable_time = 250; di->vsel_count = FAN53526_NVOLTAGES; return 0; @@ -298,12 +296,10 @@ static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di) case FAN53555_CHIP_REV_00: di->vsel_min = 600000; di->vsel_step = 10000; - di->enable_time = 400; break; case FAN53555_CHIP_REV_13: di->vsel_min = 800000; di->vsel_step = 10000; - di->enable_time = 400; break; default: dev_err(di->dev, @@ -315,19 +311,13 @@ static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di) case FAN53555_CHIP_ID_01: case FAN53555_CHIP_ID_03: case FAN53555_CHIP_ID_05: - di->vsel_min = 600000; - di->vsel_step = 10000; - di->enable_time = 400; - break; case FAN53555_CHIP_ID_08: di->vsel_min = 600000; di->vsel_step = 10000; - di->enable_time = 175; break; case FAN53555_CHIP_ID_04: di->vsel_min = 603000; di->vsel_step = 12826; - di->enable_time = 400; break; default: dev_err(di->dev, @@ -360,7 +350,6 @@ static int fan53555_voltages_setup_rockchip(struct fan53555_device_info *di) di->slew_mask = CTL_SLEW_MASK; di->ramp_delay_table = slew_rates; di->n_ramp_values = ARRAY_SIZE(slew_rates); - di->enable_time = 360; di->vsel_count = FAN53555_NVOLTAGES; return 0; @@ -383,7 +372,6 @@ static int rk8602_voltages_setup_rockchip(struct fan53555_device_info *di) di->slew_mask = CTL_SLEW_MASK; di->ramp_delay_table = slew_rates; di->n_ramp_values = ARRAY_SIZE(slew_rates); - di->enable_time = 360; di->vsel_count = RK8602_NVOLTAGES; return 0; @@ -407,7 +395,6 @@ static int fan53555_voltages_setup_silergy(struct fan53555_device_info *di) di->slew_mask = CTL_SLEW_MASK; di->ramp_delay_table = slew_rates; di->n_ramp_values = ARRAY_SIZE(slew_rates); - di->enable_time = 400; di->vsel_count = FAN53555_NVOLTAGES; return 0; @@ -607,7 +594,6 @@ static int fan53555_regulator_register(struct fan53555_device_info *di, rdesc->ramp_mask = di->slew_mask; rdesc->ramp_delay_table = di->ramp_delay_table; rdesc->n_ramp_values = di->n_ramp_values; - rdesc->enable_time = di->enable_time; rdesc->owner = THIS_MODULE; rdev = devm_regulator_register(di->dev, &di->desc, config); diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c index 1bdd494cf8821ea1b815b88147cf348f3cd0ce81..65927fa2ef161cdafef3f0334c6be6894b35fa4d 100644 --- a/drivers/regulator/gpio-regulator.c +++ b/drivers/regulator/gpio-regulator.c @@ -260,10 +260,8 @@ static int gpio_regulator_probe(struct platform_device *pdev) return -ENOMEM; } - drvdata->gpiods = devm_kcalloc(dev, config->ngpios, - sizeof(struct gpio_desc *), GFP_KERNEL); - if (!drvdata->gpiods) - return -ENOMEM; + drvdata->gpiods = devm_kzalloc(dev, sizeof(struct gpio_desc *), + GFP_KERNEL); if (config->input_supply) { drvdata->desc.supply_name = devm_kstrdup(&pdev->dev, @@ -276,6 +274,8 @@ static int gpio_regulator_probe(struct platform_device *pdev) } } + if (!drvdata->gpiods) + return -ENOMEM; for (i = 0; i < config->ngpios; i++) { drvdata->gpiods[i] = devm_gpiod_get_index(dev, NULL, diff --git a/drivers/regulator/max14577-regulator.c b/drivers/regulator/max14577-regulator.c index 41fd15adfd1fddef1c296cc1489300a758732381..5e7171b9065ae7a2e82253ae3ac23ea99975fccc 100644 --- a/drivers/regulator/max14577-regulator.c +++ b/drivers/regulator/max14577-regulator.c @@ -40,14 +40,11 @@ static int max14577_reg_get_current_limit(struct regulator_dev *rdev) struct max14577 *max14577 = rdev_get_drvdata(rdev); const struct maxim_charger_current *limits = &maxim_charger_currents[max14577->dev_type]; - int ret; if (rdev_get_id(rdev) != MAX14577_CHARGER) return -EINVAL; - ret = max14577_read_reg(rmap, MAX14577_CHG_REG_CHG_CTRL4, ®_data); - if (ret < 0) - return ret; + max14577_read_reg(rmap, MAX14577_CHG_REG_CHG_CTRL4, ®_data); if ((reg_data & CHGCTRL4_MBCICHWRCL_MASK) == 0) return limits->min; diff --git a/drivers/regulator/max20086-regulator.c b/drivers/regulator/max20086-regulator.c index 8fcca52026bf15e8dbc67f73da643c30fab7b3d9..ebfbcadbca5295ca8f43fb67113b81b97636590d 100644 --- a/drivers/regulator/max20086-regulator.c +++ b/drivers/regulator/max20086-regulator.c @@ -5,7 +5,6 @@ // Copyright (C) 2022 Laurent Pinchart // Copyright (C) 2018 Avnet, Inc. -#include #include #include #include @@ -29,7 +28,7 @@ #define MAX20086_REG_ADC4 0x09 /* DEVICE IDs */ -#define MAX20086_DEVICE_ID_MAX20086 0x30 +#define MAX20086_DEVICE_ID_MAX20086 0x40 #define MAX20086_DEVICE_ID_MAX20087 0x20 #define MAX20086_DEVICE_ID_MAX20088 0x10 #define MAX20086_DEVICE_ID_MAX20089 0x00 @@ -134,11 +133,11 @@ static int max20086_regulators_register(struct max20086 *chip) static int max20086_parse_regulators_dt(struct max20086 *chip, bool *boot_on) { struct of_regulator_match *matches; + struct device_node *node; unsigned int i; int ret; - struct device_node *node __free(device_node) = - of_get_child_by_name(chip->dev->of_node, "regulators"); + node = of_get_child_by_name(chip->dev->of_node, "regulators"); if (!node) { dev_err(chip->dev, "regulators node not found\n"); return -ENODEV; @@ -154,6 +153,7 @@ static int max20086_parse_regulators_dt(struct max20086 *chip, bool *boot_on) ret = of_regulator_match(chip->dev, node, matches, chip->info->num_outputs); + of_node_put(node); if (ret < 0) { dev_err(chip->dev, "Failed to match regulators\n"); return -EINVAL; @@ -264,7 +264,7 @@ static int max20086_i2c_probe(struct i2c_client *i2c) * shutdown. */ flags = boot_on ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW; - chip->ena_gpiod = devm_gpiod_get_optional(chip->dev, "enable", flags); + chip->ena_gpiod = devm_gpiod_get(chip->dev, "enable", flags); if (IS_ERR(chip->ena_gpiod)) { ret = PTR_ERR(chip->ena_gpiod); dev_err(chip->dev, "Failed to get enable GPIO: %d\n", ret); diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c index 60cfcd741c2af31ce7e351cdf8cfb35f996264cf..226ca4c62673ffdb2fd1f61a28df62384c297816 100644 --- a/drivers/regulator/pwm-regulator.c +++ b/drivers/regulator/pwm-regulator.c @@ -157,13 +157,6 @@ static int pwm_regulator_get_voltage(struct regulator_dev *rdev) pwm_get_state(drvdata->pwm, &pstate); - if (!pstate.enabled) { - if (pstate.polarity == PWM_POLARITY_INVERSED) - pstate.duty_cycle = pstate.period; - else - pstate.duty_cycle = 0; - } - voltage = pwm_get_relative_duty_cycle(&pstate, duty_unit); if (voltage < min(max_uV_duty, min_uV_duty) || voltage > max(max_uV_duty, min_uV_duty)) @@ -323,32 +316,6 @@ static int pwm_regulator_init_continuous(struct platform_device *pdev, return 0; } -static int pwm_regulator_init_boot_on(struct platform_device *pdev, - struct pwm_regulator_data *drvdata, - const struct regulator_init_data *init_data) -{ - struct pwm_state pstate; - - if (!init_data->constraints.boot_on || drvdata->enb_gpio) - return 0; - - pwm_get_state(drvdata->pwm, &pstate); - if (pstate.enabled) - return 0; - - /* - * Update the duty cycle so the output does not change - * when the regulator core enables the regulator (and - * thus the PWM channel). - */ - if (pstate.polarity == PWM_POLARITY_INVERSED) - pstate.duty_cycle = pstate.period; - else - pstate.duty_cycle = 0; - - return pwm_apply_might_sleep(drvdata->pwm, &pstate); -} - static int pwm_regulator_probe(struct platform_device *pdev) { const struct regulator_init_data *init_data; @@ -408,13 +375,6 @@ static int pwm_regulator_probe(struct platform_device *pdev) if (ret) return ret; - ret = pwm_regulator_init_boot_on(pdev, drvdata, init_data); - if (ret) { - dev_err(&pdev->dev, "Failed to apply boot_on settings: %d\n", - ret); - return ret; - } - regulator = devm_regulator_register(&pdev->dev, &drvdata->desc, &config); if (IS_ERR(regulator)) { diff --git a/drivers/remoteproc/qcom_wcnss.c b/drivers/remoteproc/qcom_wcnss.c index 37174b544113f81087da393d37a2e694dd33d92e..153260b4e2eb47a600685be7e5a70d1341c97e0a 100644 --- a/drivers/remoteproc/qcom_wcnss.c +++ b/drivers/remoteproc/qcom_wcnss.c @@ -456,8 +456,7 @@ static int wcnss_init_regulators(struct qcom_wcnss *wcnss, if (wcnss->num_pds) { info += wcnss->num_pds; /* Handle single power domain case */ - if (wcnss->num_pds < num_pd_vregs) - num_vregs += num_pd_vregs - wcnss->num_pds; + num_vregs += num_pd_vregs - wcnss->num_pds; } else { num_vregs += num_pd_vregs; } diff --git a/drivers/remoteproc/qcom_wcnss_iris.c b/drivers/remoteproc/qcom_wcnss_iris.c index 1e197f7734742b6724e3a626b8e52d07cf6907f9..dd36fd077911afec942f553a55128258c10ba946 100644 --- a/drivers/remoteproc/qcom_wcnss_iris.c +++ b/drivers/remoteproc/qcom_wcnss_iris.c @@ -197,7 +197,6 @@ struct qcom_iris *qcom_iris_probe(struct device *parent, bool *use_48mhz_xo) err_device_del: device_del(&iris->dev); - put_device(&iris->dev); return ERR_PTR(ret); } @@ -205,5 +204,4 @@ struct qcom_iris *qcom_iris_probe(struct device *parent, bool *use_48mhz_xo) void qcom_iris_remove(struct qcom_iris *iris) { device_del(&iris->dev); - put_device(&iris->dev); } diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 2d4ae3b5af86f6e48c71921028fbd634048821d4..0c363ca566ffdb038505c933ed5bf2bbb34ebe8a 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -1616,7 +1616,7 @@ static int rproc_attach(struct rproc *rproc) ret = rproc_set_rsc_table(rproc); if (ret) { dev_err(dev, "can't load resource table: %d\n", ret); - goto clean_up_resources; + goto unprepare_device; } /* reset max_notifyid */ @@ -1633,7 +1633,7 @@ static int rproc_attach(struct rproc *rproc) ret = rproc_handle_resources(rproc, rproc_loading_handlers); if (ret) { dev_err(dev, "Failed to process resources: %d\n", ret); - goto clean_up_resources; + goto unprepare_device; } /* Allocate carveout resources associated to rproc */ @@ -1652,9 +1652,9 @@ static int rproc_attach(struct rproc *rproc) clean_up_resources: rproc_resource_cleanup(rproc); +unprepare_device: /* release HW resources if needed */ rproc_unprepare_device(rproc); - kfree(rproc->clean_table); disable_iommu: rproc_disable_iommu(rproc); return ret; diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c index 37005640c784c0a0befcdf6f6eb4982fad909cf2..5491b1b17ca368fa14a4e6cb62b829b8fd3fdbae 100644 --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c @@ -194,6 +194,10 @@ static void k3_r5_rproc_mbox_callback(struct mbox_client *client, void *data) const char *name = kproc->rproc->name; u32 msg = omap_mbox_message(data); + /* Do not forward message from a detached core */ + if (kproc->rproc->state == RPROC_DETACHED) + return; + dev_dbg(dev, "mbox msg: 0x%x\n", msg); switch (msg) { @@ -229,6 +233,10 @@ static void k3_r5_rproc_kick(struct rproc *rproc, int vqid) mbox_msg_t msg = (mbox_msg_t)vqid; int ret; + /* Do not forward message to a detached core */ + if (kproc->rproc->state == RPROC_DETACHED) + return; + /* send the index of the triggered virtqueue in the mailbox payload */ ret = mbox_send_message(kproc->mbox, (void *)msg); if (ret < 0) diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c index 79d35ab43729eaa893361e298725f9dbd047cad0..43f601c84b4fcbf969d17e2d2fd829bc920ced99 100644 --- a/drivers/rpmsg/qcom_smd.c +++ b/drivers/rpmsg/qcom_smd.c @@ -746,7 +746,7 @@ static int __qcom_smd_send(struct qcom_smd_channel *channel, const void *data, __le32 hdr[5] = { cpu_to_le32(len), }; int tlen = sizeof(hdr) + len; unsigned long flags; - int ret = 0; + int ret; /* Word aligned channels only accept word size aligned data */ if (channel->info_word && len % 4) diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index af10850fbac2e7a22f48ff478d85a06fa036f44e..edfd942f8c54942162808d034823f5fd86424b59 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c @@ -323,7 +323,7 @@ static void rtc_device_get_offset(struct rtc_device *rtc) * * Otherwise the offset seconds should be 0. */ - if ((rtc->start_secs >= 0 && rtc->start_secs > rtc->range_max) || + if (rtc->start_secs > rtc->range_max || rtc->start_secs + range_secs - 1 < rtc->range_min) rtc->offset_secs = rtc->start_secs - rtc->range_min; else if (rtc->start_secs > rtc->range_min) diff --git a/drivers/rtc/lib.c b/drivers/rtc/lib.c index 13b5b1f2046510d1a552473c441b89e23faa6793..fe361652727a3f8cb116c78b5aeea74eb90080b5 100644 --- a/drivers/rtc/lib.c +++ b/drivers/rtc/lib.c @@ -46,38 +46,24 @@ EXPORT_SYMBOL(rtc_year_days); * rtc_time64_to_tm - converts time64_t to rtc_time. * * @time: The number of seconds since 01-01-1970 00:00:00. - * Works for values since at least 1900 + * (Must be positive.) * @tm: Pointer to the struct rtc_time. */ void rtc_time64_to_tm(time64_t time, struct rtc_time *tm) { - int days, secs; + unsigned int secs; + int days; u64 u64tmp; u32 u32tmp, udays, century, day_of_century, year_of_century, year, day_of_year, month, day; bool is_Jan_or_Feb, is_leap_year; - /* - * Get days and seconds while preserving the sign to - * handle negative time values (dates before 1970-01-01) - */ + /* time must be positive */ days = div_s64_rem(time, 86400, &secs); - /* - * We need 0 <= secs < 86400 which isn't given for negative - * values of time. Fixup accordingly. - */ - if (secs < 0) { - days -= 1; - secs += 86400; - } - /* day of the week, 1970-01-01 was a Thursday */ tm->tm_wday = (days + 4) % 7; - /* Ensure tm_wday is always positive */ - if (tm->tm_wday < 0) - tm->tm_wday += 7; /* * The following algorithm is, basically, Proposition 6.3 of Neri @@ -107,7 +93,7 @@ void rtc_time64_to_tm(time64_t time, struct rtc_time *tm) * thus, is slightly different from [1]. */ - udays = days + 719468; + udays = ((u32) days) + 719468; u32tmp = 4 * udays + 3; century = u32tmp / 146097; diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 095de4e0e4f38831c479b28186791c08d65b5018..5849d2970bba454eb0caa1eee62077209ace9bf6 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -697,12 +697,8 @@ static irqreturn_t cmos_interrupt(int irq, void *p) { u8 irqstat; u8 rtc_control; - unsigned long flags; - /* We cannot use spin_lock() here, as cmos_interrupt() is also called - * in a non-irq context. - */ - spin_lock_irqsave(&rtc_lock, flags); + spin_lock(&rtc_lock); /* When the HPET interrupt handler calls us, the interrupt * status is passed as arg1 instead of the irq number. But @@ -736,7 +732,7 @@ static irqreturn_t cmos_interrupt(int irq, void *p) hpet_mask_rtc_irq_bit(RTC_AIE); CMOS_READ(RTC_INTR_FLAGS); } - spin_unlock_irqrestore(&rtc_lock, flags); + spin_unlock(&rtc_lock); if (is_intr(irqstat)) { rtc_update_irq(p, 1, irqstat); @@ -1304,7 +1300,9 @@ static void cmos_check_wkalrm(struct device *dev) * ACK the rtc irq here */ if (t_now >= cmos->alarm_expires && cmos_use_acpi_alarm()) { + local_irq_disable(); cmos_interrupt(0, (void *)cmos->rtc); + local_irq_enable(); return; } diff --git a/drivers/rtc/rtc-loongson.c b/drivers/rtc/rtc-loongson.c index c9d5b91a6544d1a9f11d4c7b88baf2b6a153a796..90e9d97a86b48720a77178a2bc463f004a272321 100644 --- a/drivers/rtc/rtc-loongson.c +++ b/drivers/rtc/rtc-loongson.c @@ -129,14 +129,6 @@ static u32 loongson_rtc_handler(void *id) { struct loongson_rtc_priv *priv = (struct loongson_rtc_priv *)id; - rtc_update_irq(priv->rtcdev, 1, RTC_AF | RTC_IRQF); - - /* - * The TOY_MATCH0_REG should be cleared 0 here, - * otherwise the interrupt cannot be cleared. - */ - regmap_write(priv->regmap, TOY_MATCH0_REG, 0); - spin_lock(&priv->lock); /* Disable RTC alarm wakeup and interrupt */ writel(readl(priv->pm_base + PM1_EN_REG) & ~RTC_EN, diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c index fc079b9dcf7192b73a908aea00381a3b17c2611f..9c04c4e1a49c370ee50178b5bf7e853c62c75321 100644 --- a/drivers/rtc/rtc-pcf2127.c +++ b/drivers/rtc/rtc-pcf2127.c @@ -1383,11 +1383,6 @@ static int pcf2127_i2c_probe(struct i2c_client *client) variant = &pcf21xx_cfg[type]; } - if (variant->type == PCF2131) { - config.read_flag_mask = 0x0; - config.write_flag_mask = 0x0; - } - config.max_register = variant->max_register, regmap = devm_regmap_init(&client->dev, &pcf2127_i2c_regmap, @@ -1461,7 +1456,7 @@ static int pcf2127_spi_probe(struct spi_device *spi) variant = &pcf21xx_cfg[type]; } - config.max_register = variant->max_register; + config.max_register = variant->max_register, regmap = devm_regmap_init_spi(spi, &config); if (IS_ERR(regmap)) { diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c index 341b1b776e1a397eb8b616cda222134bfb5b6da2..cd146b5741431f0c72448af9d1ad8f170800c7c2 100644 --- a/drivers/rtc/rtc-sh.c +++ b/drivers/rtc/rtc-sh.c @@ -485,15 +485,9 @@ static int __init sh_rtc_probe(struct platform_device *pdev) return -ENOENT; } - if (!pdev->dev.of_node) { - rtc->periodic_irq = ret; - rtc->carry_irq = platform_get_irq(pdev, 1); - rtc->alarm_irq = platform_get_irq(pdev, 2); - } else { - rtc->alarm_irq = ret; - rtc->periodic_irq = platform_get_irq(pdev, 1); - rtc->carry_irq = platform_get_irq(pdev, 2); - } + rtc->periodic_irq = ret; + rtc->carry_irq = platform_get_irq(pdev, 1); + rtc->alarm_irq = platform_get_irq(pdev, 2); res = platform_get_resource(pdev, IORESOURCE_IO, 0); if (!res) diff --git a/drivers/s390/crypto/pkey_api.c b/drivers/s390/crypto/pkey_api.c index 21fc6151af79f5cbb67f9c8d66de4d271f7850f7..70fcb5c40cfe3259962c39875132b913be3c2480 100644 --- a/drivers/s390/crypto/pkey_api.c +++ b/drivers/s390/crypto/pkey_api.c @@ -1333,7 +1333,7 @@ static void *_copy_apqns_from_user(void __user *uapqns, size_t nr_apqns) if (!uapqns || nr_apqns == 0) return NULL; - return memdup_array_user(uapqns, nr_apqns, sizeof(struct pkey_apqn)); + return memdup_user(uapqns, nr_apqns * sizeof(struct pkey_apqn)); } static long pkey_unlocked_ioctl(struct file *filp, unsigned int cmd, diff --git a/drivers/s390/net/ism_drv.c b/drivers/s390/net/ism_drv.c index 76ba36c83e5228b5785b3385a7e7efe8ee6400ce..af0d90beba6380ea3893f4e23d6d6551310f769e 100644 --- a/drivers/s390/net/ism_drv.c +++ b/drivers/s390/net/ism_drv.c @@ -130,7 +130,6 @@ static int ism_cmd(struct ism_dev *ism, void *cmd) struct ism_req_hdr *req = cmd; struct ism_resp_hdr *resp = cmd; - spin_lock(&ism->cmd_lock); __ism_write_cmd(ism, req + 1, sizeof(*req), req->len - sizeof(*req)); __ism_write_cmd(ism, req, 0, sizeof(*req)); @@ -144,7 +143,6 @@ static int ism_cmd(struct ism_dev *ism, void *cmd) } __ism_read_cmd(ism, resp + 1, sizeof(*resp), resp->len - sizeof(*resp)); out: - spin_unlock(&ism->cmd_lock); return resp->ret; } @@ -632,7 +630,6 @@ static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id) return -ENOMEM; spin_lock_init(&ism->lock); - spin_lock_init(&ism->cmd_lock); dev_set_drvdata(&pdev->dev, ism); ism->pdev = pdev; ism->dev.parent = &pdev->dev; diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c index a95da6768f665660a90de9923b4cc71d9bf47312..cb67fa80fb12c8cc8694b23f145006627383a9b3 100644 --- a/drivers/s390/scsi/zfcp_sysfs.c +++ b/drivers/s390/scsi/zfcp_sysfs.c @@ -450,8 +450,6 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, if (kstrtoull(buf, 0, (unsigned long long *) &fcp_lun)) return -EINVAL; - flush_work(&port->rport_work); - retval = zfcp_unit_add(port, fcp_lun); if (retval) return retval; diff --git a/drivers/scsi/elx/efct/efct_hw.c b/drivers/scsi/elx/efct/efct_hw.c index 5b079b8b7a082b79d9736421e55ac364de6c3749..5a5525054d71c89a66cbd1de95d941a7311bcb5c 100644 --- a/drivers/scsi/elx/efct/efct_hw.c +++ b/drivers/scsi/elx/efct/efct_hw.c @@ -1120,7 +1120,7 @@ int efct_hw_parse_filter(struct efct_hw *hw, void *value) { int rc = 0; - char *p = NULL, *pp = NULL; + char *p = NULL; char *token; u32 idx = 0; @@ -1132,7 +1132,6 @@ efct_hw_parse_filter(struct efct_hw *hw, void *value) efc_log_err(hw->os, "p is NULL\n"); return -ENOMEM; } - pp = p; idx = 0; while ((token = strsep(&p, ",")) && *token) { @@ -1145,7 +1144,7 @@ efct_hw_parse_filter(struct efct_hw *hw, void *value) if (idx == ARRAY_SIZE(hw->config.filter_def)) break; } - kfree(pp); + kfree(p); return rc; } diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c index 3ad58250bf6b210c2aabdc64a3c845db9f27602b..7e64661d215bd20630093854ed2ae0ccbf85d1e4 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1844,14 +1844,33 @@ static int hisi_sas_I_T_nexus_reset(struct domain_device *device) } hisi_sas_dereg_device(hisi_hba, device); - if (dev_is_sata(device)) { + rc = hisi_sas_debug_I_T_nexus_reset(device); + if (rc == TMF_RESP_FUNC_COMPLETE && dev_is_sata(device)) { + struct sas_phy *local_phy; + rc = hisi_sas_softreset_ata_disk(device); - if (rc == TMF_RESP_FUNC_FAILED) - dev_err(dev, "ata disk %016llx reset (%d)\n", - SAS_ADDR(device->sas_addr), rc); + switch (rc) { + case -ECOMM: + rc = -ENODEV; + break; + case TMF_RESP_FUNC_FAILED: + case -EMSGSIZE: + case -EIO: + local_phy = sas_get_local_phy(device); + rc = sas_phy_enable(local_phy, 0); + if (!rc) { + local_phy->enabled = 0; + dev_err(dev, "Disabled local phy of ATA disk %016llx due to softreset fail (%d)\n", + SAS_ADDR(device->sas_addr), rc); + rc = -ENODEV; + } + sas_put_local_phy(local_phy); + break; + default: + break; + } } - rc = hisi_sas_debug_I_T_nexus_reset(device); if ((rc == TMF_RESP_FUNC_COMPLETE) || (rc == -ENODEV)) hisi_sas_release_task(hisi_hba, device); diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index ff442833387713d4418c185f15aa87fe9e7d67ff..0ad8a10002ce3667500a03b13d8ee86e2caaa37f 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -5101,7 +5101,7 @@ lpfc_check_sli_ndlp(struct lpfc_hba *phba, case CMD_GEN_REQUEST64_CR: if (iocb->ndlp == ndlp) return 1; - break; + fallthrough; case CMD_ELS_REQUEST64_CR: if (remote_id == ndlp->nlp_DID) return 1; @@ -5646,7 +5646,6 @@ static struct lpfc_nodelist * __lpfc_findnode_did(struct lpfc_vport *vport, uint32_t did) { struct lpfc_nodelist *ndlp; - struct lpfc_nodelist *np = NULL; uint32_t data1; list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { @@ -5661,20 +5660,14 @@ __lpfc_findnode_did(struct lpfc_vport *vport, uint32_t did) ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1, ndlp->nlp_rpi, ndlp->active_rrqs_xri_bitmap); - - /* Check for new or potentially stale node */ - if (ndlp->nlp_state != NLP_STE_UNUSED_NODE) - return ndlp; - np = ndlp; + return ndlp; } } - if (!np) - /* FIND node did NOT FOUND */ - lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE, - "0932 FIND node did x%x NOT FOUND.\n", did); - - return np; + /* FIND node did NOT FOUND */ + lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE, + "0932 FIND node did x%x NOT FOUND.\n", did); + return NULL; } struct lpfc_nodelist * diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 7c8e0e1d36da9b3ea9b991c47b902fb2615cafe1..424b39a8155cb98f63c9983f52b92fd83c9c1693 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -13180,7 +13180,6 @@ lpfc_sli4_enable_msi(struct lpfc_hba *phba) eqhdl = lpfc_get_eq_hdl(0); rc = pci_irq_vector(phba->pcidev, 0); if (rc < 0) { - free_irq(phba->pcidev->irq, phba); pci_free_irq_vectors(phba->pcidev); lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, "0496 MSI pci_irq_vec failed (%d)\n", rc); @@ -13261,7 +13260,6 @@ lpfc_sli4_enable_intr(struct lpfc_hba *phba, uint32_t cfg_mode) eqhdl = lpfc_get_eq_hdl(0); retval = pci_irq_vector(phba->pcidev, 0); if (retval < 0) { - free_irq(phba->pcidev->irq, phba); lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, "0502 INTR pci_irq_vec failed (%d)\n", retval); diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 4cf935b7223af2cefdadbea5ad4182def41f4205..4a9fa00eeb798ea53cc048a9dbdb643853159ad3 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -6014,9 +6014,9 @@ lpfc_sli4_get_ctl_attr(struct lpfc_hba *phba) phba->sli4_hba.flash_id = bf_get(lpfc_cntl_attr_flash_id, cntl_attr); phba->sli4_hba.asic_rev = bf_get(lpfc_cntl_attr_asic_rev, cntl_attr); - memcpy(phba->BIOSVersion, cntl_attr->bios_ver_str, + memset(phba->BIOSVersion, 0, sizeof(phba->BIOSVersion)); + strlcat(phba->BIOSVersion, (char *)cntl_attr->bios_ver_str, sizeof(phba->BIOSVersion)); - phba->BIOSVersion[sizeof(phba->BIOSVersion) - 1] = '\0'; lpfc_printf_log(phba, KERN_INFO, LOG_SLI, "3086 lnk_type:%d, lnk_numb:%d, bios_ver:%s, " diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index 54f66142e14a82afaef803293b6828ea248cf25a..dd3630b09aa241665ae524d10bcbdb58af7351e4 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c @@ -5908,11 +5908,7 @@ megasas_set_high_iops_queue_affinity_and_hint(struct megasas_instance *instance) const struct cpumask *mask; if (instance->perf_mode == MR_BALANCED_PERF_MODE) { - int nid = dev_to_node(&instance->pdev->dev); - - if (nid == NUMA_NO_NODE) - nid = 0; - mask = cpumask_of_node(nid); + mask = cpumask_of_node(dev_to_node(&instance->pdev->dev)); for (i = 0; i < instance->low_latency_index_start; i++) { irq = pci_irq_vector(instance->pdev, i); diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c index 17b19b39699a31e820f32cf6e41eee36ec6a6986..9a81d14aef6b99b88f8e1607fe73857ee75dd097 100644 --- a/drivers/scsi/qedf/qedf_main.c +++ b/drivers/scsi/qedf/qedf_main.c @@ -699,7 +699,7 @@ static u32 qedf_get_login_failures(void *cookie) } static struct qed_fcoe_cb_ops qedf_cb_ops = { - .common = { + { .link_update = qedf_link_update, .bw_update = qedf_bw_update, .schedule_recovery_handler = qedf_schedule_recovery_handler, diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 13b6cb1b93acd9ac5baabb32daef0bf65f0bbe6b..0cd6f3e1488249b4a744ed08b81aeb84b888203f 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c @@ -2147,7 +2147,7 @@ qla24xx_get_port_database(scsi_qla_host_t *vha, u16 nport_handle, pdb_dma = dma_map_single(&vha->hw->pdev->dev, pdb, sizeof(*pdb), DMA_FROM_DEVICE); - if (dma_mapping_error(&vha->hw->pdev->dev, pdb_dma)) { + if (!pdb_dma) { ql_log(ql_log_warn, vha, 0x1116, "Failed to map dma buffer.\n"); return QLA_MEMORY_ALLOC_FAILED; } diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index 77c28d2ebf0137c4170e9107ba1e5baafbd420d3..675332e49a7b063c54c3d265e5f56006f59ffa8a 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c @@ -3420,8 +3420,6 @@ static int qla4xxx_alloc_pdu(struct iscsi_task *task, uint8_t opcode) task_data->data_dma = dma_map_single(&ha->pdev->dev, task->data, task->data_count, DMA_TO_DEVICE); - if (dma_mapping_error(&ha->pdev->dev, task_data->data_dma)) - return -ENOMEM; } DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index f2c31e74d8ed064266b0c7ff9c065326918b1d33..0c30fec555475bde5edc9e83eb7747c1049bb35d 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -3525,7 +3525,7 @@ static int iscsi_new_flashnode(struct iscsi_transport *transport, pr_err("%s could not find host no %u\n", __func__, ev->u.new_flashnode.host_no); err = -ENODEV; - goto exit_new_fnode; + goto put_host; } index = transport->new_flashnode(shost, data, len); @@ -3535,6 +3535,7 @@ static int iscsi_new_flashnode(struct iscsi_transport *transport, else err = -EIO; +put_host: scsi_host_put(shost); exit_new_fnode: @@ -3559,7 +3560,7 @@ static int iscsi_del_flashnode(struct iscsi_transport *transport, pr_err("%s could not find host no %u\n", __func__, ev->u.del_flashnode.host_no); err = -ENODEV; - goto exit_del_fnode; + goto put_host; } idx = ev->u.del_flashnode.flashnode_idx; @@ -3601,7 +3602,7 @@ static int iscsi_login_flashnode(struct iscsi_transport *transport, pr_err("%s could not find host no %u\n", __func__, ev->u.login_flashnode.host_no); err = -ENODEV; - goto exit_login_fnode; + goto put_host; } idx = ev->u.login_flashnode.flashnode_idx; @@ -3653,7 +3654,7 @@ static int iscsi_logout_flashnode(struct iscsi_transport *transport, pr_err("%s could not find host no %u\n", __func__, ev->u.logout_flashnode.host_no); err = -ENODEV; - goto exit_logout_fnode; + goto put_host; } idx = ev->u.logout_flashnode.flashnode_idx; @@ -3703,7 +3704,7 @@ static int iscsi_logout_flashnode_sid(struct iscsi_transport *transport, pr_err("%s could not find host no %u\n", __func__, ev->u.logout_flashnode.host_no); err = -ENODEV; - goto exit_logout_sid; + goto put_host; } session = iscsi_session_lookup(ev->u.logout_flashnode_sid.sid); diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index f9ab45c4bb40d59ca073672be376531154396ffc..fb193caa4a3faa908ed40536a02c4ede70217b30 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -953,6 +953,7 @@ static void reset_state(struct scsi_tape *STp) STp->partition = find_partition(STp); if (STp->partition < 0) STp->partition = 0; + STp->new_partition = STp->partition; } } @@ -2926,17 +2927,14 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon if (cmd_in == MTSETDENSITY) { (STp->buffer)->b_data[4] = arg; STp->density_changed = 1; /* At least we tried ;-) */ - STp->changed_density = arg; } else if (cmd_in == SET_DENS_AND_BLK) (STp->buffer)->b_data[4] = arg >> 24; else (STp->buffer)->b_data[4] = STp->density; if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) { ltmp = arg & MT_ST_BLKSIZE_MASK; - if (cmd_in == MTSETBLK) { + if (cmd_in == MTSETBLK) STp->blksize_changed = 1; /* At least we tried ;-) */ - STp->changed_blksize = arg; - } } else ltmp = STp->block_size; (STp->buffer)->b_data[9] = (ltmp >> 16); @@ -3637,25 +3635,9 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) retval = (-EIO); goto out; } - reset_state(STp); /* Clears pos_unknown */ + reset_state(STp); /* remove this when the midlevel properly clears was_reset */ STp->device->was_reset = 0; - - /* Fix the device settings after reset, ignore errors */ - if (mtc.mt_op == MTREW || mtc.mt_op == MTSEEK || - mtc.mt_op == MTEOM) { - if (STp->can_partitions) { - /* STp->new_partition contains the - * latest partition set - */ - STp->partition = 0; - switch_partition(STp); - } - if (STp->density_changed) - st_int_ioctl(STp, MTSETDENSITY, STp->changed_density); - if (STp->blksize_changed) - st_int_ioctl(STp, MTSETBLK, STp->changed_blksize); - } } if (mtc.mt_op != MTNOP && mtc.mt_op != MTSETBLK && diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h index 6d31b894ee84cc76cd3441fcbedee7e203c84f8c..1aaaf5369a40fc3fe852b961c34351b05fcc344c 100644 --- a/drivers/scsi/st.h +++ b/drivers/scsi/st.h @@ -165,7 +165,6 @@ struct scsi_tape { unsigned char compression_changed; unsigned char drv_buffer; unsigned char density; - unsigned char changed_density; unsigned char door_locked; unsigned char autorew_dev; /* auto-rewind device */ unsigned char rew_at_close; /* rewind necessary at close */ @@ -173,7 +172,6 @@ struct scsi_tape { unsigned char cleaning_req; /* cleaning requested? */ unsigned char first_tur; /* first TEST UNIT READY */ int block_size; - int changed_blksize; int min_block; int max_block; int recover_count; /* From tape opening */ diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c index 954a1cc50ba746c596742a1df5e6a48d05562865..48b0ca92b44fb3d38bc1e8e74376640796f00e74 100644 --- a/drivers/scsi/storvsc_drv.c +++ b/drivers/scsi/storvsc_drv.c @@ -362,7 +362,7 @@ MODULE_PARM_DESC(ring_avail_percent_lowater, /* * Timeout in seconds for all devices managed by this driver. */ -static const int storvsc_timeout = 180; +static int storvsc_timeout = 180; #if IS_ENABLED(CONFIG_SCSI_FC_ATTRS) static struct scsi_transport_template *fc_transport_template; @@ -768,7 +768,7 @@ static void handle_multichannel_storage(struct hv_device *device, int max_chns) return; } - t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ); + t = wait_for_completion_timeout(&request->wait_event, 10*HZ); if (t == 0) { dev_err(dev, "Failed to create sub-channel: timed out\n"); return; @@ -833,7 +833,7 @@ static int storvsc_execute_vstor_op(struct hv_device *device, if (ret != 0) return ret; - t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ); + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); if (t == 0) return -ETIMEDOUT; @@ -1351,8 +1351,6 @@ static int storvsc_connect_to_vsp(struct hv_device *device, u32 ring_size, return ret; ret = storvsc_channel_init(device, is_fc); - if (ret) - vmbus_close(device->channel); return ret; } @@ -1670,7 +1668,7 @@ static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd) if (ret != 0) return FAILED; - t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ); + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); if (t == 0) return TIMEOUT_ERROR; diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/aspeed-lpc-snoop.c index 3dd2ab8336aa3aefc20f9d70377ae557c7f3fde8..773dbcbc03a6cdbd941bb4f242e2d26e9ac753e6 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -58,7 +58,6 @@ struct aspeed_lpc_snoop_model_data { }; struct aspeed_lpc_snoop_channel { - bool enabled; struct kfifo fifo; wait_queue_head_t wq; struct miscdevice miscdev; @@ -167,7 +166,7 @@ static int aspeed_lpc_snoop_config_irq(struct aspeed_lpc_snoop *lpc_snoop, int rc; lpc_snoop->irq = platform_get_irq(pdev, 0); - if (lpc_snoop->irq < 0) + if (!lpc_snoop->irq) return -ENODEV; rc = devm_request_irq(dev, lpc_snoop->irq, @@ -191,9 +190,6 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, const struct aspeed_lpc_snoop_model_data *model_data = of_device_get_match_data(dev); - if (WARN_ON(lpc_snoop->chan[channel].enabled)) - return -EBUSY; - init_waitqueue_head(&lpc_snoop->chan[channel].wq); /* Create FIFO datastructure */ rc = kfifo_alloc(&lpc_snoop->chan[channel].fifo, @@ -204,15 +200,11 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, lpc_snoop->chan[channel].miscdev.minor = MISC_DYNAMIC_MINOR; lpc_snoop->chan[channel].miscdev.name = devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, channel); - if (!lpc_snoop->chan[channel].miscdev.name) { - rc = -ENOMEM; - goto err_free_fifo; - } lpc_snoop->chan[channel].miscdev.fops = &snoop_fops; lpc_snoop->chan[channel].miscdev.parent = dev; rc = misc_register(&lpc_snoop->chan[channel].miscdev); if (rc) - goto err_free_fifo; + return rc; /* Enable LPC snoop channel at requested port */ switch (channel) { @@ -229,8 +221,7 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, hicrb_en = HICRB_ENSNP1D; break; default: - rc = -EINVAL; - goto err_misc_deregister; + return -EINVAL; } regmap_update_bits(lpc_snoop->regmap, HICR5, hicr5_en, hicr5_en); @@ -240,23 +231,12 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); - lpc_snoop->chan[channel].enabled = true; - - return 0; - -err_misc_deregister: - misc_deregister(&lpc_snoop->chan[channel].miscdev); -err_free_fifo: - kfifo_free(&lpc_snoop->chan[channel].fifo); return rc; } static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, int channel) { - if (!lpc_snoop->chan[channel].enabled) - return; - switch (channel) { case 0: regmap_update_bits(lpc_snoop->regmap, HICR5, @@ -272,10 +252,8 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, return; } - lpc_snoop->chan[channel].enabled = false; - /* Consider improving safety wrt concurrent reader(s) */ - misc_deregister(&lpc_snoop->chan[channel].miscdev); kfifo_free(&lpc_snoop->chan[channel].fifo); + misc_deregister(&lpc_snoop->chan[channel].miscdev); } static int aspeed_lpc_snoop_probe(struct platform_device *pdev) diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c index b89f8067e6cdd758c45c3e25cbc91000f376e7f1..79173ab540a6bf7a5b9e205842f233a5337e545d 100644 --- a/drivers/soundwire/amd_manager.c +++ b/drivers/soundwire/amd_manager.c @@ -205,7 +205,7 @@ static u64 amd_sdw_send_cmd_get_resp(struct amd_sdw_manager *amd_manager, u32 lo if (sts & AMD_SDW_IMM_RES_VALID) { dev_err(amd_manager->dev, "SDW%x manager is in bad state\n", amd_manager->instance); - writel(AMD_SDW_IMM_RES_VALID, amd_manager->mmio + ACP_SW_IMM_CMD_STS); + writel(0x00, amd_manager->mmio + ACP_SW_IMM_CMD_STS); } writel(upper_data, amd_manager->mmio + ACP_SW_IMM_CMD_UPPER_WORD); writel(lower_data, amd_manager->mmio + ACP_SW_IMM_CMD_LOWER_QWORD); @@ -1135,12 +1135,9 @@ static int __maybe_unused amd_suspend(struct device *dev) } if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) { - cancel_work_sync(&amd_manager->amd_sdw_work); amd_sdw_wake_enable(amd_manager, false); return amd_sdw_clock_stop(amd_manager); } else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) { - cancel_work_sync(&amd_manager->amd_sdw_work); - amd_sdw_wake_enable(amd_manager, false); /* * As per hardware programming sequence on AMD platforms, * clock stop should be invoked first before powering-off @@ -1168,7 +1165,6 @@ static int __maybe_unused amd_suspend_runtime(struct device *dev) amd_sdw_wake_enable(amd_manager, true); return amd_sdw_clock_stop(amd_manager); } else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) { - amd_sdw_wake_enable(amd_manager, true); ret = amd_sdw_clock_stop(amd_manager); if (ret) return ret; diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c index 767942f19adb6aabcb016e2b602e6b03b5dbe439..e7553c38be59d67f833e6c93918ea659083b655a 100644 --- a/drivers/soundwire/bus.c +++ b/drivers/soundwire/bus.c @@ -121,10 +121,6 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent, set_bit(SDW_GROUP13_DEV_NUM, bus->assigned); set_bit(SDW_MASTER_DEV_NUM, bus->assigned); - ret = sdw_irq_create(bus, fwnode); - if (ret) - return ret; - /* * SDW is an enumerable bus, but devices can be powered off. So, * they won't be able to report as present. @@ -141,7 +137,6 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent, if (ret < 0) { dev_err(bus->dev, "Finding slaves failed:%d\n", ret); - sdw_irq_delete(bus); return ret; } @@ -160,6 +155,10 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent, bus->params.curr_bank = SDW_BANK0; bus->params.next_bank = SDW_BANK1; + ret = sdw_irq_create(bus, fwnode); + if (ret) + return ret; + return 0; } EXPORT_SYMBOL(sdw_bus_master_add); diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c index 8df12efeea21c7181c6a6c42886ac129546a8baf..1ca857c2a4aa314d8e298e451ba609d3d8b78e5a 100644 --- a/drivers/spi/spi-bcm63xx-hsspi.c +++ b/drivers/spi/spi-bcm63xx-hsspi.c @@ -745,7 +745,7 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) if (IS_ERR(clk)) return PTR_ERR(clk); - reset = devm_reset_control_get_optional_shared(dev, NULL); + reset = devm_reset_control_get_optional_exclusive(dev, NULL); if (IS_ERR(reset)) return PTR_ERR(reset); diff --git a/drivers/spi/spi-bcm63xx.c b/drivers/spi/spi-bcm63xx.c index a95badb7b7114645509aca2317cd79f877dea59f..ef3a7226db125c300f8eca72f692feac5d4bde6e 100644 --- a/drivers/spi/spi-bcm63xx.c +++ b/drivers/spi/spi-bcm63xx.c @@ -523,7 +523,7 @@ static int bcm63xx_spi_probe(struct platform_device *pdev) return PTR_ERR(clk); } - reset = devm_reset_control_get_optional_shared(dev, NULL); + reset = devm_reset_control_get_optional_exclusive(dev, NULL); if (IS_ERR(reset)) return PTR_ERR(reset); diff --git a/drivers/spi/spi-cadence-quadspi.c b/drivers/spi/spi-cadence-quadspi.c index 7c17b8c0425e3c35a7fcbb10ee35b62b5eafde0d..bf9b816637d02ec9c26e0f56afe0a242ecfaaa01 100644 --- a/drivers/spi/spi-cadence-quadspi.c +++ b/drivers/spi/spi-cadence-quadspi.c @@ -1868,8 +1868,6 @@ static int cqspi_probe(struct platform_device *pdev) goto probe_setup_failed; } - pm_runtime_enable(dev); - ret = spi_register_controller(host); if (ret) { dev_err(&pdev->dev, "failed to register SPI ctlr %d\n", ret); @@ -1879,7 +1877,6 @@ static int cqspi_probe(struct platform_device *pdev) return 0; probe_setup_failed: cqspi_controller_enable(cqspi, 0); - pm_runtime_disable(dev); probe_reset_failed: if (cqspi->is_jh7110) cqspi_jh7110_disable_clk(pdev, cqspi); @@ -1901,8 +1898,7 @@ static void cqspi_remove(struct platform_device *pdev) if (cqspi->rx_chan) dma_release_channel(cqspi->rx_chan); - if (pm_runtime_get_sync(&pdev->dev) >= 0) - clk_disable(cqspi->clk); + clk_disable_unprepare(cqspi->clk); if (cqspi->is_jh7110) cqspi_jh7110_disable_clk(pdev, cqspi); diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 3206c84c6f22fbaf22a2412aec7ff44d609e0a35..bcb0de864d34dbc21161cad33c12502f03596d75 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0+ // // Copyright 2013 Freescale Semiconductor, Inc. -// Copyright 2020-2025 NXP +// Copyright 2020 NXP // // Freescale DSPI driver // This file contains a driver for the Freescale DSPI @@ -62,7 +62,6 @@ #define SPI_SR_TFIWF BIT(18) #define SPI_SR_RFDF BIT(17) #define SPI_SR_CMDFFF BIT(16) -#define SPI_SR_TXRXS BIT(30) #define SPI_SR_CLEAR (SPI_SR_TCFQF | \ SPI_SR_TFUF | SPI_SR_TFFF | \ SPI_SR_CMDTCF | SPI_SR_SPEF | \ @@ -927,20 +926,9 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr, struct spi_transfer *transfer; bool cs = false; int status = 0; - u32 val = 0; - bool cs_change = false; message->actual_length = 0; - /* Put DSPI in running mode if halted. */ - regmap_read(dspi->regmap, SPI_MCR, &val); - if (val & SPI_MCR_HALT) { - regmap_update_bits(dspi->regmap, SPI_MCR, SPI_MCR_HALT, 0); - while (regmap_read(dspi->regmap, SPI_SR, &val) >= 0 && - !(val & SPI_SR_TXRXS)) - ; - } - list_for_each_entry(transfer, &message->transfers, transfer_list) { dspi->cur_transfer = transfer; dspi->cur_msg = message; @@ -970,7 +958,6 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr, dspi->tx_cmd |= SPI_PUSHR_CMD_CONT; } - cs_change = transfer->cs_change; dspi->tx = transfer->tx_buf; dspi->rx = transfer->rx_buf; dspi->len = transfer->len; @@ -980,28 +967,17 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr, SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF, SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF); - regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR); - spi_take_timestamp_pre(dspi->ctlr, dspi->cur_transfer, dspi->progress, !dspi->irq); if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { status = dspi_dma_xfer(dspi); } else { - /* - * Reinitialize the completion before transferring data - * to avoid the case where it might remain in the done - * state due to a spurious interrupt from a previous - * transfer. This could falsely signal that the current - * transfer has completed. - */ - if (dspi->irq) - reinit_completion(&dspi->xfer_done); - dspi_fifo_write(dspi); if (dspi->irq) { wait_for_completion(&dspi->xfer_done); + reinit_completion(&dspi->xfer_done); } else { do { status = dspi_poll(dspi); @@ -1017,15 +993,6 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr, dspi_deassert_cs(spi, &cs); } - if (status || !cs_change) { - /* Put DSPI in stop mode */ - regmap_update_bits(dspi->regmap, SPI_MCR, - SPI_MCR_HALT, SPI_MCR_HALT); - while (regmap_read(dspi->regmap, SPI_SR, &val) >= 0 && - val & SPI_SR_TXRXS) - ; - } - message->status = status; spi_finalize_current_message(ctlr); @@ -1196,20 +1163,6 @@ static int dspi_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(dspi_pm, dspi_suspend, dspi_resume); -static const struct regmap_range dspi_yes_ranges[] = { - regmap_reg_range(SPI_MCR, SPI_MCR), - regmap_reg_range(SPI_TCR, SPI_CTAR(3)), - regmap_reg_range(SPI_SR, SPI_TXFR3), - regmap_reg_range(SPI_RXFR0, SPI_RXFR3), - regmap_reg_range(SPI_CTARE(0), SPI_CTARE(3)), - regmap_reg_range(SPI_SREX, SPI_SREX), -}; - -static const struct regmap_access_table dspi_access_table = { - .yes_ranges = dspi_yes_ranges, - .n_yes_ranges = ARRAY_SIZE(dspi_yes_ranges), -}; - static const struct regmap_range dspi_volatile_ranges[] = { regmap_reg_range(SPI_MCR, SPI_TCR), regmap_reg_range(SPI_SR, SPI_SR), @@ -1227,8 +1180,6 @@ static const struct regmap_config dspi_regmap_config = { .reg_stride = 4, .max_register = 0x88, .volatile_table = &dspi_volatile_table, - .rd_table = &dspi_access_table, - .wr_table = &dspi_access_table, }; static const struct regmap_range dspi_xspi_volatile_ranges[] = { @@ -1250,8 +1201,6 @@ static const struct regmap_config dspi_xspi_regmap_config[] = { .reg_stride = 4, .max_register = 0x13c, .volatile_table = &dspi_xspi_volatile_table, - .rd_table = &dspi_access_table, - .wr_table = &dspi_access_table, }, { .name = "pushr", @@ -1274,8 +1223,6 @@ static int dspi_init(struct fsl_dspi *dspi) if (!spi_controller_is_target(dspi->ctlr)) mcr |= SPI_MCR_HOST; - mcr |= SPI_MCR_HALT; - regmap_write(dspi->regmap, SPI_MCR, mcr); regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR); diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c index 65c11909659c6ba126abb4add9ce5252c1467b19..6f12e4fb2e2e184f1bb4cf9fe12e5437384fc4ac 100644 --- a/drivers/spi/spi-sh-msiof.c +++ b/drivers/spi/spi-sh-msiof.c @@ -918,7 +918,6 @@ static int sh_msiof_transfer_one(struct spi_controller *ctlr, void *rx_buf = t->rx_buf; unsigned int len = t->len; unsigned int bits = t->bits_per_word; - unsigned int max_wdlen = 256; unsigned int bytes_per_word; unsigned int words; int n; @@ -932,17 +931,17 @@ static int sh_msiof_transfer_one(struct spi_controller *ctlr, if (!spi_controller_is_target(p->ctlr)) sh_msiof_spi_set_clk_regs(p, t); - if (tx_buf) - max_wdlen = min(max_wdlen, p->tx_fifo_size); - if (rx_buf) - max_wdlen = min(max_wdlen, p->rx_fifo_size); - while (ctlr->dma_tx && len > 15) { /* * DMA supports 32-bit words only, hence pack 8-bit and 16-bit * words, with byte resp. word swapping. */ - unsigned int l = min(round_down(len, 4), max_wdlen * 4); + unsigned int l = 0; + + if (tx_buf) + l = min(round_down(len, 4), p->tx_fifo_size * 4); + if (rx_buf) + l = min(round_down(len, 4), p->rx_fifo_size * 4); if (bits <= 8) { copy32 = copy_bswap32; diff --git a/drivers/spi/spi-sun4i.c b/drivers/spi/spi-sun4i.c index 5b2cb225a419830b408fb9e4967e545593dcb865..b8947265d329e48fb9517d73c768296c0427fe42 100644 --- a/drivers/spi/spi-sun4i.c +++ b/drivers/spi/spi-sun4i.c @@ -263,9 +263,6 @@ static int sun4i_spi_transfer_one(struct spi_master *master, else reg |= SUN4I_CTL_DHB; - /* Now that the settings are correct, enable the interface */ - reg |= SUN4I_CTL_ENABLE; - sun4i_spi_write(sspi, SUN4I_CTL_REG, reg); /* Ensure that we have a parent clock fast enough */ @@ -406,7 +403,7 @@ static int sun4i_spi_runtime_resume(struct device *dev) } sun4i_spi_write(sspi, SUN4I_CTL_REG, - SUN4I_CTL_MASTER | SUN4I_CTL_TP); + SUN4I_CTL_ENABLE | SUN4I_CTL_MASTER | SUN4I_CTL_TP); return 0; diff --git a/drivers/spi/spi-tegra210-quad.c b/drivers/spi/spi-tegra210-quad.c index e9afebd724237b742f6ef0a3e652e52728b6f477..e3c236025a7b3b8dee9e22c89d0c74731587d326 100644 --- a/drivers/spi/spi-tegra210-quad.c +++ b/drivers/spi/spi-tegra210-quad.c @@ -134,7 +134,7 @@ #define QSPI_COMMAND_VALUE_SET(X) (((x) & 0xFF) << 0) #define QSPI_CMB_SEQ_CMD_CFG 0x1a0 -#define QSPI_COMMAND_X1_X2_X4(x) ((((x) >> 1) & 0x3) << 13) +#define QSPI_COMMAND_X1_X2_X4(x) (((x) & 0x3) << 13) #define QSPI_COMMAND_X1_X2_X4_MASK (0x03 << 13) #define QSPI_COMMAND_SDR_DDR BIT(12) #define QSPI_COMMAND_SIZE_SET(x) (((x) & 0xFF) << 0) @@ -147,7 +147,7 @@ #define QSPI_ADDRESS_VALUE_SET(X) (((x) & 0xFFFF) << 0) #define QSPI_CMB_SEQ_ADDR_CFG 0x1ac -#define QSPI_ADDRESS_X1_X2_X4(x) ((((x) >> 1) & 0x3) << 13) +#define QSPI_ADDRESS_X1_X2_X4(x) (((x) & 0x3) << 13) #define QSPI_ADDRESS_X1_X2_X4_MASK (0x03 << 13) #define QSPI_ADDRESS_SDR_DDR BIT(12) #define QSPI_ADDRESS_SIZE_SET(x) (((x) & 0xFF) << 0) @@ -1036,6 +1036,10 @@ static u32 tegra_qspi_addr_config(bool is_ddr, u8 bus_width, u8 len) { u32 addr_config = 0; + /* Extract Address configuration and value */ + is_ddr = 0; //Only SDR mode supported + bus_width = 0; //X1 mode + if (is_ddr) addr_config |= QSPI_ADDRESS_SDR_DDR; else @@ -1075,13 +1079,13 @@ static int tegra_qspi_combined_seq_xfer(struct tegra_qspi *tqspi, switch (transfer_phase) { case CMD_TRANSFER: /* X1 SDR mode */ - cmd_config = tegra_qspi_cmd_config(false, xfer->tx_nbits, + cmd_config = tegra_qspi_cmd_config(false, 0, xfer->len); cmd_value = *((const u8 *)(xfer->tx_buf)); break; case ADDR_TRANSFER: /* X1 SDR mode */ - addr_config = tegra_qspi_addr_config(false, xfer->tx_nbits, + addr_config = tegra_qspi_addr_config(false, 0, xfer->len); address_value = *((const u32 *)(xfer->tx_buf)); break; @@ -1159,22 +1163,26 @@ static int tegra_qspi_combined_seq_xfer(struct tegra_qspi *tqspi, ret = -EIO; goto exit; } + if (!xfer->cs_change) { + tegra_qspi_transfer_end(spi); + spi_transfer_delay_exec(xfer); + } break; default: ret = -EINVAL; goto exit; } msg->actual_length += xfer->len; - if (!xfer->cs_change && transfer_phase == DATA_TRANSFER) { - tegra_qspi_transfer_end(spi); - spi_transfer_delay_exec(xfer); - } transfer_phase++; } ret = 0; exit: msg->status = ret; + if (ret < 0) { + tegra_qspi_transfer_end(spi); + spi_transfer_delay_exec(xfer); + } return ret; } diff --git a/drivers/spi/spi-zynqmp-gqspi.c b/drivers/spi/spi-zynqmp-gqspi.c index b5deb4fe3b832423338c4a6699b0a2139aec10af..3503e6c0a5c9833827673b0c2927ab530d067aad 100644 --- a/drivers/spi/spi-zynqmp-gqspi.c +++ b/drivers/spi/spi-zynqmp-gqspi.c @@ -799,6 +799,7 @@ static void zynqmp_process_dma_irq(struct zynqmp_qspi *xqspi) static irqreturn_t zynqmp_qspi_irq(int irq, void *dev_id) { struct zynqmp_qspi *xqspi = (struct zynqmp_qspi *)dev_id; + irqreturn_t ret = IRQ_NONE; u32 status, mask, dma_status = 0; status = zynqmp_gqspi_read(xqspi, GQSPI_ISR_OFST); @@ -813,24 +814,27 @@ static irqreturn_t zynqmp_qspi_irq(int irq, void *dev_id) dma_status); } - if (!mask && !dma_status) - return IRQ_NONE; - - if (mask & GQSPI_ISR_TXNOT_FULL_MASK) + if (mask & GQSPI_ISR_TXNOT_FULL_MASK) { zynqmp_qspi_filltxfifo(xqspi, GQSPI_TX_FIFO_FILL); + ret = IRQ_HANDLED; + } - if (dma_status & GQSPI_QSPIDMA_DST_I_STS_DONE_MASK) + if (dma_status & GQSPI_QSPIDMA_DST_I_STS_DONE_MASK) { zynqmp_process_dma_irq(xqspi); - else if (!(mask & GQSPI_IER_RXEMPTY_MASK) && - (mask & GQSPI_IER_GENFIFOEMPTY_MASK)) + ret = IRQ_HANDLED; + } else if (!(mask & GQSPI_IER_RXEMPTY_MASK) && + (mask & GQSPI_IER_GENFIFOEMPTY_MASK)) { zynqmp_qspi_readrxfifo(xqspi, GQSPI_RX_FIFO_FILL); + ret = IRQ_HANDLED; + } if (xqspi->bytes_to_receive == 0 && xqspi->bytes_to_transfer == 0 && ((status & GQSPI_IRQ_MASK) == GQSPI_IRQ_MASK)) { zynqmp_gqspi_write(xqspi, GQSPI_IDR_OFST, GQSPI_ISR_IDR_MASK); complete(&xqspi->data_completion); + ret = IRQ_HANDLED; } - return IRQ_HANDLED; + return ret; } /** diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index cfb6755c0730f4f110f8ebbccd3e791e42a554be..72e514cee056dd83bba748f8031a010bd449c989 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -4011,13 +4011,10 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message) xfer->tx_nbits != SPI_NBITS_OCTAL) return -EINVAL; if ((xfer->tx_nbits == SPI_NBITS_DUAL) && - !(spi->mode & (SPI_TX_DUAL | SPI_TX_QUAD | SPI_TX_OCTAL))) + !(spi->mode & (SPI_TX_DUAL | SPI_TX_QUAD))) return -EINVAL; if ((xfer->tx_nbits == SPI_NBITS_QUAD) && - !(spi->mode & (SPI_TX_QUAD | SPI_TX_OCTAL))) - return -EINVAL; - if ((xfer->tx_nbits == SPI_NBITS_OCTAL) && - !(spi->mode & SPI_TX_OCTAL)) + !(spi->mode & SPI_TX_QUAD)) return -EINVAL; } /* Check transfer rx_nbits */ @@ -4030,13 +4027,10 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message) xfer->rx_nbits != SPI_NBITS_OCTAL) return -EINVAL; if ((xfer->rx_nbits == SPI_NBITS_DUAL) && - !(spi->mode & (SPI_RX_DUAL | SPI_RX_QUAD | SPI_RX_OCTAL))) + !(spi->mode & (SPI_RX_DUAL | SPI_RX_QUAD))) return -EINVAL; if ((xfer->rx_nbits == SPI_NBITS_QUAD) && - !(spi->mode & (SPI_RX_QUAD | SPI_RX_OCTAL))) - return -EINVAL; - if ((xfer->rx_nbits == SPI_NBITS_OCTAL) && - !(spi->mode & SPI_RX_OCTAL)) + !(spi->mode & SPI_RX_QUAD)) return -EINVAL; } diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c index 31d82a042dad20b44e2cb67cabf0a992d2c6b99a..2d0883a64082777e6c58ff490721e1a9e6595b17 100644 --- a/drivers/staging/iio/impedance-analyzer/ad5933.c +++ b/drivers/staging/iio/impedance-analyzer/ad5933.c @@ -412,7 +412,7 @@ static ssize_t ad5933_store(struct device *dev, ret = ad5933_cmd(st, 0); break; case AD5933_OUT_SETTLING_CYCLES: - val = clamp(val, (u16)0, (u16)0x7FC); + val = clamp(val, (u16)0, (u16)0x7FF); st->settling_cycles = val; /* 2x, 4x handling, see datasheet */ diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index a1d941b0be00b73a8db83826ea802ad29d399a1a..ac398b5a97360446672a8a5c40ea05bcf222f557 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -213,14 +213,8 @@ static int rkvdec_enum_framesizes(struct file *file, void *priv, if (!fmt) return -EINVAL; - fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS; - fsize->stepwise.min_width = 1; - fsize->stepwise.max_width = fmt->frmsize.max_width; - fsize->stepwise.step_width = 1; - fsize->stepwise.min_height = 1; - fsize->stepwise.max_height = fmt->frmsize.max_height; - fsize->stepwise.step_height = 1; - + fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; + fsize->stepwise = fmt->frmsize; return 0; } diff --git a/drivers/staging/rtl8723bs/core/rtw_security.c b/drivers/staging/rtl8723bs/core/rtw_security.c index 83fdee444c1c03b4270d06e3d924fc6594534f89..7ecdaa2eeaf33e06a17a61b28c5b9322de2c0ea9 100644 --- a/drivers/staging/rtl8723bs/core/rtw_security.c +++ b/drivers/staging/rtl8723bs/core/rtw_security.c @@ -869,21 +869,29 @@ static signed int aes_cipher(u8 *key, uint hdrlen, num_blocks, payload_index; u8 pn_vector[6]; - u8 mic_iv[16] = {}; - u8 mic_header1[16] = {}; - u8 mic_header2[16] = {}; - u8 ctr_preload[16] = {}; + u8 mic_iv[16]; + u8 mic_header1[16]; + u8 mic_header2[16]; + u8 ctr_preload[16]; /* Intermediate Buffers */ - u8 chain_buffer[16] = {}; - u8 aes_out[16] = {}; - u8 padded_buffer[16] = {}; + u8 chain_buffer[16]; + u8 aes_out[16]; + u8 padded_buffer[16]; u8 mic[8]; uint frtype = GetFrameType(pframe); uint frsubtype = GetFrameSubType(pframe); frsubtype = frsubtype>>4; + memset((void *)mic_iv, 0, 16); + memset((void *)mic_header1, 0, 16); + memset((void *)mic_header2, 0, 16); + memset((void *)ctr_preload, 0, 16); + memset((void *)chain_buffer, 0, 16); + memset((void *)aes_out, 0, 16); + memset((void *)padded_buffer, 0, 16); + if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN)) a4_exists = 0; else @@ -1073,15 +1081,15 @@ static signed int aes_decipher(u8 *key, uint hdrlen, num_blocks, payload_index; signed int res = _SUCCESS; u8 pn_vector[6]; - u8 mic_iv[16] = {}; - u8 mic_header1[16] = {}; - u8 mic_header2[16] = {}; - u8 ctr_preload[16] = {}; + u8 mic_iv[16]; + u8 mic_header1[16]; + u8 mic_header2[16]; + u8 ctr_preload[16]; /* Intermediate Buffers */ - u8 chain_buffer[16] = {}; - u8 aes_out[16] = {}; - u8 padded_buffer[16] = {}; + u8 chain_buffer[16]; + u8 aes_out[16]; + u8 padded_buffer[16]; u8 mic[8]; uint frtype = GetFrameType(pframe); @@ -1089,6 +1097,14 @@ static signed int aes_decipher(u8 *key, uint hdrlen, frsubtype = frsubtype>>4; + memset((void *)mic_iv, 0, 16); + memset((void *)mic_header1, 0, 16); + memset((void *)mic_header2, 0, 16); + memset((void *)ctr_preload, 0, 16); + memset((void *)chain_buffer, 0, 16); + memset((void *)aes_out, 0, 16); + memset((void *)padded_buffer, 0, 16); + /* start to decrypt the payload */ num_blocks = (plen-8) / 16; /* plen including LLC, payload_length and mic) */ diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c index 6028558f96111cc7edfd6e73b7f823b6a3015556..92aa98bbdc6628254f832a9d881995035de4bbd3 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c @@ -720,7 +720,8 @@ int vchiq_shutdown(struct vchiq_instance *instance) int status = 0; struct vchiq_state *state = instance->state; - mutex_lock(&state->mutex); + if (mutex_lock_killable(&state->mutex)) + return -EAGAIN; /* Remove all services */ vchiq_shutdown_internal(state, instance); diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index a9eb6a3e838347689c98c1faa3dd1e514a4d3413..49d9167bb263b546e75d5edf3fe916e9c8c5f382 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c @@ -1841,9 +1841,7 @@ core_scsi3_decode_spec_i_port( } kmem_cache_free(t10_pr_reg_cache, dest_pr_reg); - - if (dest_se_deve) - core_scsi3_lunacl_undepend_item(dest_se_deve); + core_scsi3_lunacl_undepend_item(dest_se_deve); if (is_local) continue; diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c index 675f774be1d30e22ec1338d9a1a3d9debb2b9047..f110f932ba0543cb20b3c12df628ba84cc7eabb3 100644 --- a/drivers/target/target_core_spc.c +++ b/drivers/target/target_core_spc.c @@ -2151,10 +2151,8 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode) if (descr->serv_action_valid) return TCM_INVALID_CDB_FIELD; - if (!descr->enabled || descr->enabled(descr, cmd)) { + if (!descr->enabled || descr->enabled(descr, cmd)) *opcode = descr; - return TCM_NO_SENSE; - } break; case 0x2: /* @@ -2168,10 +2166,8 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode) if (descr->serv_action_valid && descr->service_action == requested_sa) { if (!descr->enabled || descr->enabled(descr, - cmd)) { + cmd)) *opcode = descr; - return TCM_NO_SENSE; - } } else if (!descr->serv_action_valid) return TCM_INVALID_CDB_FIELD; break; @@ -2184,15 +2180,13 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode) */ if (descr->service_action == requested_sa) if (!descr->enabled || descr->enabled(descr, - cmd)) { + cmd)) *opcode = descr; - return TCM_NO_SENSE; - } break; } } - return TCM_NO_SENSE; + return 0; } static sense_reason_t diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c index d7ad16f262b2ebc91cf1e89e3b000c9eccfb9b46..0eb342de0b00183ce73d93a676897ba98bb734ea 100644 --- a/drivers/tee/tee_core.c +++ b/drivers/tee/tee_core.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -20,7 +19,7 @@ #define TEE_NUM_DEVICES 32 -#define TEE_IOCTL_PARAM_SIZE(x) (size_mul(sizeof(struct tee_param), (x))) +#define TEE_IOCTL_PARAM_SIZE(x) (sizeof(struct tee_param) * (x)) #define TEE_UUID_NS_NAME_SIZE 128 @@ -488,7 +487,7 @@ static int tee_ioctl_open_session(struct tee_context *ctx, if (copy_from_user(&arg, uarg, sizeof(arg))) return -EFAULT; - if (size_add(sizeof(arg), TEE_IOCTL_PARAM_SIZE(arg.num_params)) != buf.buf_len) + if (sizeof(arg) + TEE_IOCTL_PARAM_SIZE(arg.num_params) != buf.buf_len) return -EINVAL; if (arg.num_params) { @@ -566,7 +565,7 @@ static int tee_ioctl_invoke(struct tee_context *ctx, if (copy_from_user(&arg, uarg, sizeof(arg))) return -EFAULT; - if (size_add(sizeof(arg), TEE_IOCTL_PARAM_SIZE(arg.num_params)) != buf.buf_len) + if (sizeof(arg) + TEE_IOCTL_PARAM_SIZE(arg.num_params) != buf.buf_len) return -EINVAL; if (arg.num_params) { @@ -700,7 +699,7 @@ static int tee_ioctl_supp_recv(struct tee_context *ctx, if (get_user(num_params, &uarg->num_params)) return -EFAULT; - if (size_add(sizeof(*uarg), TEE_IOCTL_PARAM_SIZE(num_params)) != buf.buf_len) + if (sizeof(*uarg) + TEE_IOCTL_PARAM_SIZE(num_params) != buf.buf_len) return -EINVAL; params = kcalloc(num_params, sizeof(struct tee_param), GFP_KERNEL); @@ -799,7 +798,7 @@ static int tee_ioctl_supp_send(struct tee_context *ctx, get_user(num_params, &uarg->num_params)) return -EFAULT; - if (size_add(sizeof(*uarg), TEE_IOCTL_PARAM_SIZE(num_params)) > buf.buf_len) + if (sizeof(*uarg) + TEE_IOCTL_PARAM_SIZE(num_params) > buf.buf_len) return -EINVAL; params = kcalloc(num_params, sizeof(struct tee_param), GFP_KERNEL); diff --git a/drivers/thermal/intel/x86_pkg_temp_thermal.c b/drivers/thermal/intel/x86_pkg_temp_thermal.c index 2e06b26be4ef69c8c3f34c23cbd2c662b65f11c2..61c3d450ee605ae429e111f98b4b35516bf4d835 100644 --- a/drivers/thermal/intel/x86_pkg_temp_thermal.c +++ b/drivers/thermal/intel/x86_pkg_temp_thermal.c @@ -331,7 +331,6 @@ static int pkg_temp_thermal_device_add(unsigned int cpu) tj_max = intel_tcc_get_tjmax(cpu); if (tj_max < 0) return tj_max; - tj_max *= 1000; zonedev = kzalloc(sizeof(*zonedev), GFP_KERNEL); if (!zonedev) diff --git a/drivers/thunderbolt/ctl.c b/drivers/thunderbolt/ctl.c index a60d7afc041f41ef84d19e01aff691e32ad4198a..d997a4c545f7965e799dcb4ef06b1cee3491306b 100644 --- a/drivers/thunderbolt/ctl.c +++ b/drivers/thunderbolt/ctl.c @@ -143,11 +143,6 @@ static void tb_cfg_request_dequeue(struct tb_cfg_request *req) struct tb_ctl *ctl = req->ctl; mutex_lock(&ctl->request_queue_lock); - if (!test_bit(TB_CFG_REQUEST_ACTIVE, &req->flags)) { - mutex_unlock(&ctl->request_queue_lock); - return; - } - list_del(&req->list); clear_bit(TB_CFG_REQUEST_ACTIVE, &req->flags); if (test_bit(TB_CFG_REQUEST_CANCELED, &req->flags)) diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c index df83383800a8ef349a22dc6d9b7ce584c82106c5..52cb1a3bb8c78619b060dbc83078cacd8911bf11 100644 --- a/drivers/thunderbolt/switch.c +++ b/drivers/thunderbolt/switch.c @@ -1465,7 +1465,7 @@ int tb_dp_port_set_hops(struct tb_port *port, unsigned int video, return ret; data[0] &= ~ADP_DP_CS_0_VIDEO_HOPID_MASK; - data[1] &= ~ADP_DP_CS_1_AUX_TX_HOPID_MASK; + data[1] &= ~ADP_DP_CS_1_AUX_RX_HOPID_MASK; data[1] &= ~ADP_DP_CS_1_AUX_RX_HOPID_MASK; data[0] |= (video << ADP_DP_CS_0_VIDEO_HOPID_SHIFT) & @@ -3439,7 +3439,7 @@ void tb_sw_set_unplugged(struct tb_switch *sw) } } -static int tb_switch_set_wake(struct tb_switch *sw, unsigned int flags, bool runtime) +static int tb_switch_set_wake(struct tb_switch *sw, unsigned int flags) { if (flags) tb_sw_dbg(sw, "enabling wakeup: %#x\n", flags); @@ -3447,7 +3447,7 @@ static int tb_switch_set_wake(struct tb_switch *sw, unsigned int flags, bool run tb_sw_dbg(sw, "disabling wakeup\n"); if (tb_switch_is_usb4(sw)) - return usb4_switch_set_wake(sw, flags, runtime); + return usb4_switch_set_wake(sw, flags); return tb_lc_set_wake(sw, flags); } @@ -3523,7 +3523,7 @@ int tb_switch_resume(struct tb_switch *sw, bool runtime) tb_switch_check_wakes(sw); /* Disable wakes */ - tb_switch_set_wake(sw, 0, true); + tb_switch_set_wake(sw, 0); err = tb_switch_tmu_init(sw); if (err) @@ -3604,7 +3604,7 @@ void tb_switch_suspend(struct tb_switch *sw, bool runtime) flags |= TB_WAKE_ON_USB4 | TB_WAKE_ON_USB3 | TB_WAKE_ON_PCIE; } - tb_switch_set_wake(sw, flags, runtime); + tb_switch_set_wake(sw, flags); if (tb_switch_is_usb4(sw)) usb4_switch_set_sleep(sw); diff --git a/drivers/thunderbolt/tb.h b/drivers/thunderbolt/tb.h index d67a25f33fd1c5d1bc00029515226ce1132ebf87..920dac8a63e1df7ee41b2675b8f5fe0949e6e65a 100644 --- a/drivers/thunderbolt/tb.h +++ b/drivers/thunderbolt/tb.h @@ -1266,7 +1266,7 @@ int usb4_switch_read_uid(struct tb_switch *sw, u64 *uid); int usb4_switch_drom_read(struct tb_switch *sw, unsigned int address, void *buf, size_t size); bool usb4_switch_lane_bonding_possible(struct tb_switch *sw); -int usb4_switch_set_wake(struct tb_switch *sw, unsigned int flags, bool runtime); +int usb4_switch_set_wake(struct tb_switch *sw, unsigned int flags); int usb4_switch_set_sleep(struct tb_switch *sw); int usb4_switch_nvm_sector_size(struct tb_switch *sw); int usb4_switch_nvm_read(struct tb_switch *sw, unsigned int address, void *buf, diff --git a/drivers/thunderbolt/usb4.c b/drivers/thunderbolt/usb4.c index d4b4f58e717c12f74cd22d236391a9005c205986..8db9bd32f47384e6e96bec37500049a8eca04665 100644 --- a/drivers/thunderbolt/usb4.c +++ b/drivers/thunderbolt/usb4.c @@ -405,12 +405,12 @@ bool usb4_switch_lane_bonding_possible(struct tb_switch *sw) * usb4_switch_set_wake() - Enabled/disable wake * @sw: USB4 router * @flags: Wakeup flags (%0 to disable) - * @runtime: Wake is being programmed during system runtime * * Enables/disables router to wake up from sleep. */ -int usb4_switch_set_wake(struct tb_switch *sw, unsigned int flags, bool runtime) +int usb4_switch_set_wake(struct tb_switch *sw, unsigned int flags) { + struct usb4_port *usb4; struct tb_port *port; u64 route = tb_route(sw); u32 val; @@ -440,11 +440,13 @@ int usb4_switch_set_wake(struct tb_switch *sw, unsigned int flags, bool runtime) val |= PORT_CS_19_WOU4; } else { bool configured = val & PORT_CS_19_PC; - bool wakeup = runtime || device_may_wakeup(&port->usb4->dev); + usb4 = port->usb4; - if ((flags & TB_WAKE_ON_CONNECT) && wakeup && !configured) + if (((flags & TB_WAKE_ON_CONNECT) | + device_may_wakeup(&usb4->dev)) && !configured) val |= PORT_CS_19_WOC; - if ((flags & TB_WAKE_ON_DISCONNECT) && wakeup && configured) + if (((flags & TB_WAKE_ON_DISCONNECT) | + device_may_wakeup(&usb4->dev)) && configured) val |= PORT_CS_19_WOD; if ((flags & TB_WAKE_ON_USB4) && configured) val |= PORT_CS_19_WOU4; diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 6e39ec5533337c712837f0211ac2572110a76e64..349d4849ba5e3b3e9b7cf73b50a450f4ea014fa3 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -234,7 +234,6 @@ struct imx_port { enum imx_tx_state tx_state; struct hrtimer trigger_start_tx; struct hrtimer trigger_stop_tx; - unsigned int rxtl; }; struct imx_port_ucrs { @@ -1338,7 +1337,6 @@ static void imx_uart_clear_rx_errors(struct imx_port *sport) #define TXTL_DEFAULT 8 #define RXTL_DEFAULT 8 /* 8 characters or aging timer */ -#define RXTL_CONSOLE_DEFAULT 1 #define TXTL_DMA 8 /* DMA burst setting */ #define RXTL_DMA 9 /* DMA burst setting */ @@ -1451,7 +1449,7 @@ static void imx_uart_disable_dma(struct imx_port *sport) ucr1 &= ~(UCR1_RXDMAEN | UCR1_TXDMAEN | UCR1_ATDMAEN); imx_uart_writel(sport, ucr1, UCR1); - imx_uart_setup_ufcr(sport, TXTL_DEFAULT, sport->rxtl); + imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); sport->dma_is_enabled = 0; } @@ -1476,12 +1474,7 @@ static int imx_uart_startup(struct uart_port *port) return retval; } - if (uart_console(&sport->port)) - sport->rxtl = RXTL_CONSOLE_DEFAULT; - else - sport->rxtl = RXTL_DEFAULT; - - imx_uart_setup_ufcr(sport, TXTL_DEFAULT, sport->rxtl); + imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); /* disable the DREN bit (Data Ready interrupt enable) before * requesting IRQs @@ -1894,7 +1887,7 @@ static int imx_uart_poll_init(struct uart_port *port) if (retval) clk_disable_unprepare(sport->clk_ipg); - imx_uart_setup_ufcr(sport, TXTL_DEFAULT, sport->rxtl); + imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); spin_lock_irqsave(&sport->port.lock, flags); @@ -1986,7 +1979,7 @@ static int imx_uart_rs485_config(struct uart_port *port, struct ktermios *termio /* If the receiver trigger is 0, set it to a default value */ ufcr = imx_uart_readl(sport, UFCR); if ((ufcr & UFCR_RXTL_MASK) == 0) - imx_uart_setup_ufcr(sport, TXTL_DEFAULT, sport->rxtl); + imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); imx_uart_start_rx(port); } @@ -2171,7 +2164,7 @@ imx_uart_console_setup(struct console *co, char *options) else imx_uart_console_get_options(sport, &baud, &parity, &bits); - imx_uart_setup_ufcr(sport, TXTL_DEFAULT, sport->rxtl); + imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); retval = uart_set_options(&sport->port, co, baud, parity, bits, flow); diff --git a/drivers/tty/serial/jsm/jsm_tty.c b/drivers/tty/serial/jsm/jsm_tty.c index 1bee624bd484cb5b4c02da86b59331e0f0060b5a..222afc270c88d6fcb292be4c0bb9a554a54be4f6 100644 --- a/drivers/tty/serial/jsm/jsm_tty.c +++ b/drivers/tty/serial/jsm/jsm_tty.c @@ -451,7 +451,6 @@ int jsm_uart_port_init(struct jsm_board *brd) if (!brd->channels[i]) continue; - brd->channels[i]->uart_port.dev = &brd->pci_dev->dev; brd->channels[i]->uart_port.irq = brd->irq; brd->channels[i]->uart_port.uartclk = 14745600; brd->channels[i]->uart_port.type = PORT_JSM; diff --git a/drivers/tty/serial/milbeaut_usio.c b/drivers/tty/serial/milbeaut_usio.c index 9de3883a4e0b03c6a6f3084cad18c230ab9e70a3..70a910085e9375926b0edd848e1b2e0a62be41bd 100644 --- a/drivers/tty/serial/milbeaut_usio.c +++ b/drivers/tty/serial/milbeaut_usio.c @@ -522,10 +522,7 @@ static int mlb_usio_probe(struct platform_device *pdev) } port->membase = devm_ioremap(&pdev->dev, res->start, resource_size(res)); - if (!port->membase) { - ret = -ENOMEM; - goto failed; - } + ret = platform_get_irq_byname(pdev, "rx"); mlb_usio_irq[index][RX] = ret; diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c index 7b868ea48ad5978a16d828c705dd67b746c2d2c1..cc83b772b7ca9c71f853c4d4d3ddf9b1b3d7892f 100644 --- a/drivers/tty/serial/pch_uart.c +++ b/drivers/tty/serial/pch_uart.c @@ -967,7 +967,7 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv) __func__); return 0; } - dma_sync_sg_for_device(port->dev, priv->sg_tx_p, num, DMA_TO_DEVICE); + dma_sync_sg_for_device(port->dev, priv->sg_tx_p, nent, DMA_TO_DEVICE); priv->desc_tx = desc; desc->callback = pch_dma_tx_complete; desc->callback_param = priv; diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 247ef6bd66a0156fb2b8998dfabbdc628d91a82a..4350a69d97d7ac53696a81860b118d68991e582d 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -104,20 +104,6 @@ struct plat_sci_reg { u8 offset, size; }; -struct sci_suspend_regs { - u16 scdl; - u16 sccks; - u16 scsmr; - u16 scscr; - u16 scfcr; - u16 scsptr; - u16 hssrr; - u16 scpcr; - u16 scpdr; - u8 scbrr; - u8 semr; -}; - struct sci_port_params { const struct plat_sci_reg regs[SCIx_NR_REGS]; unsigned int fifosize; @@ -148,8 +134,6 @@ struct sci_port { struct dma_chan *chan_tx; struct dma_chan *chan_rx; - struct reset_control *rstc; - #ifdef CONFIG_SERIAL_SH_SCI_DMA struct dma_chan *chan_tx_saved; struct dma_chan *chan_rx_saved; @@ -169,12 +153,10 @@ struct sci_port { int rx_trigger; struct timer_list rx_fifo_timer; int rx_fifo_timeout; - struct sci_suspend_regs suspend_regs; u16 hscif_tot; bool has_rtscts; bool autorts; - bool tx_occurred; }; #define SCI_NPORTS CONFIG_SERIAL_SH_SCI_NR_UARTS @@ -183,7 +165,6 @@ static struct sci_port sci_ports[SCI_NPORTS]; static unsigned long sci_ports_in_use; static struct uart_driver sci_uart_driver; static bool sci_uart_earlycon; -static bool sci_uart_earlycon_dev_probing; static inline struct sci_port * to_sci_port(struct uart_port *uart) @@ -840,7 +821,6 @@ static void sci_transmit_chars(struct uart_port *port) { struct circ_buf *xmit = &port->state->xmit; unsigned int stopped = uart_tx_stopped(port); - struct sci_port *s = to_sci_port(port); unsigned short status; unsigned short ctrl; int count; @@ -877,7 +857,6 @@ static void sci_transmit_chars(struct uart_port *port) } serial_port_out(port, SCxTDR, c); - s->tx_occurred = true; port->icount.tx++; } while (--count > 0); @@ -1234,8 +1213,6 @@ static void sci_dma_tx_complete(void *arg) if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) uart_write_wakeup(port); - s->tx_occurred = true; - if (!uart_circ_empty(xmit)) { s->cookie_tx = 0; schedule_work(&s->work_tx); @@ -1725,19 +1702,6 @@ static void sci_flush_buffer(struct uart_port *port) s->cookie_tx = -EINVAL; } } - -static void sci_dma_check_tx_occurred(struct sci_port *s) -{ - struct dma_tx_state state; - enum dma_status status; - - if (!s->chan_tx) - return; - - status = dmaengine_tx_status(s->chan_tx, s->cookie_tx, &state); - if (status == DMA_COMPLETE || status == DMA_IN_PROGRESS) - s->tx_occurred = true; -} #else /* !CONFIG_SERIAL_SH_SCI_DMA */ static inline void sci_request_dma(struct uart_port *port) { @@ -1747,10 +1711,6 @@ static inline void sci_free_dma(struct uart_port *port) { } -static void sci_dma_check_tx_occurred(struct sci_port *s) -{ -} - #define sci_flush_buffer NULL #endif /* !CONFIG_SERIAL_SH_SCI_DMA */ @@ -2087,12 +2047,6 @@ static unsigned int sci_tx_empty(struct uart_port *port) { unsigned short status = serial_port_in(port, SCxSR); unsigned short in_tx_fifo = sci_txfill(port); - struct sci_port *s = to_sci_port(port); - - sci_dma_check_tx_occurred(s); - - if (!s->tx_occurred) - return TIOCSER_TEMT; return (status & SCxSR_TEND(port)) && !in_tx_fifo ? TIOCSER_TEMT : 0; } @@ -2263,7 +2217,6 @@ static int sci_startup(struct uart_port *port) dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); - s->tx_occurred = false; sci_request_dma(port); ret = sci_request_irq(s); @@ -3044,6 +2997,10 @@ static int sci_init_single(struct platform_device *dev, ret = sci_init_clocks(sci_port, &dev->dev); if (ret < 0) return ret; + + port->dev = &dev->dev; + + pm_runtime_enable(&dev->dev); } port->type = p->type; @@ -3073,6 +3030,11 @@ static int sci_init_single(struct platform_device *dev, return 0; } +static void sci_cleanup_single(struct sci_port *port) +{ + pm_runtime_disable(port->port.dev); +} + #if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) || \ defined(CONFIG_SERIAL_SH_SCI_EARLYCON) static void serial_console_putchar(struct uart_port *port, unsigned char ch) @@ -3242,6 +3204,8 @@ static int sci_remove(struct platform_device *dev) sci_ports_in_use &= ~BIT(port->port.line); uart_remove_one_port(&sci_uart_driver, &port->port); + sci_cleanup_single(port); + if (port->port.fifosize > 1) device_remove_file(&dev->dev, &dev_attr_rx_fifo_trigger); if (type == PORT_SCIFA || type == PORT_SCIFB || type == PORT_HSCIF) @@ -3361,7 +3325,6 @@ static struct plat_sci_port *sci_parse_dt(struct platform_device *pdev, } sp = &sci_ports[id]; - sp->rstc = rstc; *dev_id = id; p->type = SCI_OF_TYPE(data); @@ -3375,8 +3338,7 @@ static struct plat_sci_port *sci_parse_dt(struct platform_device *pdev, static int sci_probe_single(struct platform_device *dev, unsigned int index, struct plat_sci_port *p, - struct sci_port *sciport, - struct resource *sci_res) + struct sci_port *sciport) { int ret; @@ -3405,11 +3367,6 @@ static int sci_probe_single(struct platform_device *dev, if (ret) return ret; - sciport->port.dev = &dev->dev; - ret = devm_pm_runtime_enable(&dev->dev); - if (ret) - return ret; - sciport->gpios = mctrl_gpio_init(&sciport->port, 0); if (IS_ERR(sciport->gpios)) return PTR_ERR(sciport->gpios); @@ -3423,31 +3380,13 @@ static int sci_probe_single(struct platform_device *dev, sciport->port.flags |= UPF_HARD_FLOW; } - if (sci_uart_earlycon && sci_ports[0].port.mapbase == sci_res->start) { - /* - * In case: - * - this is the earlycon port (mapped on index 0 in sci_ports[]) and - * - it now maps to an alias other than zero and - * - the earlycon is still alive (e.g., "earlycon keep_bootcon" is - * available in bootargs) - * - * we need to avoid disabling clocks and PM domains through the runtime - * PM APIs called in __device_attach(). For this, increment the runtime - * PM reference counter (the clocks and PM domains were already enabled - * by the bootloader). Otherwise the earlycon may access the HW when it - * has no clocks enabled leading to failures (infinite loop in - * sci_poll_put_char()). - */ - pm_runtime_get_noresume(&dev->dev); - - /* - * Skip cleanup the sci_port[0] in early_console_exit(), this - * port is the same as the earlycon one. - */ - sci_uart_earlycon_dev_probing = true; + ret = uart_add_one_port(&sci_uart_driver, &sciport->port); + if (ret) { + sci_cleanup_single(sciport); + return ret; } - return uart_add_one_port(&sci_uart_driver, &sciport->port); + return 0; } static int sci_probe(struct platform_device *dev) @@ -3505,7 +3444,7 @@ static int sci_probe(struct platform_device *dev) platform_set_drvdata(dev, sp); - ret = sci_probe_single(dev, dev_id, p, sp, res); + ret = sci_probe_single(dev, dev_id, p, sp); if (ret) return ret; @@ -3534,77 +3473,13 @@ static int sci_probe(struct platform_device *dev) return 0; } -static void sci_console_save(struct sci_port *s) -{ - struct sci_suspend_regs *regs = &s->suspend_regs; - struct uart_port *port = &s->port; - - if (sci_getreg(port, SCDL)->size) - regs->scdl = sci_serial_in(port, SCDL); - if (sci_getreg(port, SCCKS)->size) - regs->sccks = sci_serial_in(port, SCCKS); - if (sci_getreg(port, SCSMR)->size) - regs->scsmr = sci_serial_in(port, SCSMR); - if (sci_getreg(port, SCSCR)->size) - regs->scscr = sci_serial_in(port, SCSCR); - if (sci_getreg(port, SCFCR)->size) - regs->scfcr = sci_serial_in(port, SCFCR); - if (sci_getreg(port, SCSPTR)->size) - regs->scsptr = sci_serial_in(port, SCSPTR); - if (sci_getreg(port, SCBRR)->size) - regs->scbrr = sci_serial_in(port, SCBRR); - if (sci_getreg(port, HSSRR)->size) - regs->hssrr = sci_serial_in(port, HSSRR); - if (sci_getreg(port, SCPCR)->size) - regs->scpcr = sci_serial_in(port, SCPCR); - if (sci_getreg(port, SCPDR)->size) - regs->scpdr = sci_serial_in(port, SCPDR); - if (sci_getreg(port, SEMR)->size) - regs->semr = sci_serial_in(port, SEMR); -} - -static void sci_console_restore(struct sci_port *s) -{ - struct sci_suspend_regs *regs = &s->suspend_regs; - struct uart_port *port = &s->port; - - if (sci_getreg(port, SCDL)->size) - sci_serial_out(port, SCDL, regs->scdl); - if (sci_getreg(port, SCCKS)->size) - sci_serial_out(port, SCCKS, regs->sccks); - if (sci_getreg(port, SCSMR)->size) - sci_serial_out(port, SCSMR, regs->scsmr); - if (sci_getreg(port, SCSCR)->size) - sci_serial_out(port, SCSCR, regs->scscr); - if (sci_getreg(port, SCFCR)->size) - sci_serial_out(port, SCFCR, regs->scfcr); - if (sci_getreg(port, SCSPTR)->size) - sci_serial_out(port, SCSPTR, regs->scsptr); - if (sci_getreg(port, SCBRR)->size) - sci_serial_out(port, SCBRR, regs->scbrr); - if (sci_getreg(port, HSSRR)->size) - sci_serial_out(port, HSSRR, regs->hssrr); - if (sci_getreg(port, SCPCR)->size) - sci_serial_out(port, SCPCR, regs->scpcr); - if (sci_getreg(port, SCPDR)->size) - sci_serial_out(port, SCPDR, regs->scpdr); - if (sci_getreg(port, SEMR)->size) - sci_serial_out(port, SEMR, regs->semr); -} - static __maybe_unused int sci_suspend(struct device *dev) { struct sci_port *sport = dev_get_drvdata(dev); - if (sport) { + if (sport) uart_suspend_port(&sci_uart_driver, &sport->port); - if (!console_suspend_enabled && uart_console(&sport->port)) - sci_console_save(sport); - else - return reset_control_assert(sport->rstc); - } - return 0; } @@ -3612,18 +3487,8 @@ static __maybe_unused int sci_resume(struct device *dev) { struct sci_port *sport = dev_get_drvdata(dev); - if (sport) { - if (!console_suspend_enabled && uart_console(&sport->port)) { - sci_console_restore(sport); - } else { - int ret = reset_control_deassert(sport->rstc); - - if (ret) - return ret; - } - + if (sport) uart_resume_port(&sci_uart_driver, &sport->port); - } return 0; } @@ -3662,22 +3527,6 @@ sh_early_platform_init_buffer("earlyprintk", &sci_driver, #ifdef CONFIG_SERIAL_SH_SCI_EARLYCON static struct plat_sci_port port_cfg; -static int early_console_exit(struct console *co) -{ - struct sci_port *sci_port = &sci_ports[0]; - - /* - * Clean the slot used by earlycon. A new SCI device might - * map to this slot. - */ - if (!sci_uart_earlycon_dev_probing) { - memset(sci_port, 0, sizeof(*sci_port)); - sci_uart_earlycon = false; - } - - return 0; -} - static int __init early_console_setup(struct earlycon_device *device, int type) { @@ -3697,8 +3546,6 @@ static int __init early_console_setup(struct earlycon_device *device, SCSCR_RE | SCSCR_TE | port_cfg.scscr); device->con->write = serial_console_write; - device->con->exit = early_console_exit; - return 0; } static int __init sci_early_console_setup(struct earlycon_device *device, diff --git a/drivers/tty/serial/uartlite.c b/drivers/tty/serial/uartlite.c index 9f39bafa7fa968c27c36ed6eb908ba3c0b369040..b225a78f6175f35c3cd5688ee9717b56296fd44f 100644 --- a/drivers/tty/serial/uartlite.c +++ b/drivers/tty/serial/uartlite.c @@ -872,6 +872,16 @@ static int ulite_probe(struct platform_device *pdev) pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); + if (!ulite_uart_driver.state) { + dev_dbg(&pdev->dev, "uartlite: calling uart_register_driver()\n"); + ret = uart_register_driver(&ulite_uart_driver); + if (ret < 0) { + dev_err(&pdev->dev, "Failed to register driver\n"); + clk_disable_unprepare(pdata->clk); + return ret; + } + } + ret = ulite_assign(&pdev->dev, id, res->start, irq, pdata); pm_runtime_mark_last_busy(&pdev->dev); @@ -912,25 +922,16 @@ static struct platform_driver ulite_platform_driver = { static int __init ulite_init(void) { - int ret; - - pr_debug("uartlite: calling uart_register_driver()\n"); - ret = uart_register_driver(&ulite_uart_driver); - if (ret) - return ret; pr_debug("uartlite: calling platform_driver_register()\n"); - ret = platform_driver_register(&ulite_platform_driver); - if (ret) - uart_unregister_driver(&ulite_uart_driver); - - return ret; + return platform_driver_register(&ulite_platform_driver); } static void __exit ulite_exit(void) { platform_driver_unregister(&ulite_platform_driver); - uart_unregister_driver(&ulite_uart_driver); + if (ulite_uart_driver.state) + uart_unregister_driver(&ulite_uart_driver); } module_init(ulite_init); diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 60c878ea95f92d9941a62acefa9b1304da690d4b..6bd1a7785e888c6b397332c93ece47a1212ccc54 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c @@ -962,7 +962,7 @@ void redraw_screen(struct vc_data *vc, int is_switch) } if (redraw) { - bool update; + int update; int old_was_color = vc->vc_can_do_color; set_origin(vc); @@ -999,7 +999,7 @@ int vc_cons_allocated(unsigned int i) return (i < MAX_NR_CONSOLES && vc_cons[i].d); } -static void visual_init(struct vc_data *vc, int num, bool init) +static void visual_init(struct vc_data *vc, int num, int init) { /* ++Geert: vc->vc_sw->con_init determines console size */ if (vc->vc_sw) @@ -1083,7 +1083,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ vc->port.ops = &vc_port_ops; INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK); - visual_init(vc, currcons, true); + visual_init(vc, currcons, 1); if (!*vc->uni_pagedict_loc) con_set_default_unimap(vc); @@ -1582,7 +1582,7 @@ static void csi_X(struct vc_data *vc, unsigned int vpar) vc_uniscr_clear_line(vc, vc->state.x, count); scr_memsetw((unsigned short *)vc->vc_pos, vc->vc_video_erase_char, 2 * count); if (con_should_update(vc)) - vc->vc_sw->con_clear(vc, vc->state.y, vc->state.x, count); + vc->vc_sw->con_clear(vc, vc->state.y, vc->state.x, 1, count); vc->vc_need_wrap = 0; } @@ -3474,7 +3474,7 @@ static int __init con_init(void) vc_cons[currcons].d = vc = kzalloc(sizeof(struct vc_data), GFP_NOWAIT); INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK); tty_port_init(&vc->port); - visual_init(vc, currcons, true); + visual_init(vc, currcons, 1); /* Assuming vc->vc_{cols,rows,screenbuf_size} are sane here. */ vc->vc_screenbuf = kzalloc(vc->vc_screenbuf_size, GFP_NOWAIT); vc_init(vc, currcons || !vc->vc_sw->con_save_screen); @@ -3642,7 +3642,7 @@ static int do_bind_con_driver(const struct consw *csw, int first, int last, old_was_color = vc->vc_can_do_color; vc->vc_sw->con_deinit(vc); vc->vc_origin = (unsigned long)vc->vc_screenbuf; - visual_init(vc, i, false); + visual_init(vc, i, 0); set_origin(vc); update_attr(vc); @@ -4392,7 +4392,6 @@ void do_unblank_screen(int leaving_gfx) set_palette(vc); set_cursor(vc); vt_event_post(VT_EVENT_UNBLANK, vc->vc_num, vc->vc_num); - notify_update(vc); } EXPORT_SYMBOL(do_unblank_screen); diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c index 5b21b60547da1fea71ab304ac320f5d9b7b23d49..8c685b5014044b891c40e1cf00bd4629a661e33f 100644 --- a/drivers/tty/vt/vt_ioctl.c +++ b/drivers/tty/vt/vt_ioctl.c @@ -1105,6 +1105,8 @@ long vt_compat_ioctl(struct tty_struct *tty, case VT_WAITACTIVE: case VT_RELDISP: case VT_DISALLOCATE: + case VT_RESIZE: + case VT_RESIZEX: return vt_ioctl(tty, cmd, arg); /* diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c index 14864cfc24223820a6fa265598857b1834bacea4..411109a5ebbffd58857092130357bbedf3718733 100644 --- a/drivers/ufs/core/ufs-mcq.c +++ b/drivers/ufs/core/ufs-mcq.c @@ -629,6 +629,7 @@ int ufshcd_mcq_abort(struct scsi_cmnd *cmd) int tag = scsi_cmd_to_rq(cmd)->tag; struct ufshcd_lrb *lrbp = &hba->lrb[tag]; struct ufs_hw_queue *hwq; + unsigned long flags; int err; /* Skip task abort in case previous aborts failed and report failure */ @@ -667,5 +668,10 @@ int ufshcd_mcq_abort(struct scsi_cmnd *cmd) return FAILED; } + spin_lock_irqsave(&hwq->cq_lock, flags); + if (ufshcd_cmd_inflight(lrbp->cmd)) + ufshcd_release_scsi_cmd(hba, lrbp); + spin_unlock_irqrestore(&hwq->cq_lock, flags); + return SUCCESS; } diff --git a/drivers/ufs/core/ufs-sysfs.c b/drivers/ufs/core/ufs-sysfs.c index 6c48255dfff02be22a35919f632a3d267df6f2a5..3692b39b35e789ce2fcd7a189d251bf12f9ebfca 100644 --- a/drivers/ufs/core/ufs-sysfs.c +++ b/drivers/ufs/core/ufs-sysfs.c @@ -1278,7 +1278,7 @@ UFS_UNIT_DESC_PARAM(logical_block_size, _LOGICAL_BLK_SIZE, 1); UFS_UNIT_DESC_PARAM(logical_block_count, _LOGICAL_BLK_COUNT, 8); UFS_UNIT_DESC_PARAM(erase_block_size, _ERASE_BLK_SIZE, 4); UFS_UNIT_DESC_PARAM(provisioning_type, _PROVISIONING_TYPE, 1); -UFS_UNIT_DESC_PARAM(physical_memory_resource_count, _PHY_MEM_RSRC_CNT, 8); +UFS_UNIT_DESC_PARAM(physical_memory_resourse_count, _PHY_MEM_RSRC_CNT, 8); UFS_UNIT_DESC_PARAM(context_capabilities, _CTX_CAPABILITIES, 2); UFS_UNIT_DESC_PARAM(large_unit_granularity, _LARGE_UNIT_SIZE_M1, 1); UFS_UNIT_DESC_PARAM(wb_buf_alloc_units, _WB_BUF_ALLOC_UNITS, 4); @@ -1295,7 +1295,7 @@ static struct attribute *ufs_sysfs_unit_descriptor[] = { &dev_attr_logical_block_count.attr, &dev_attr_erase_block_size.attr, &dev_attr_provisioning_type.attr, - &dev_attr_physical_memory_resource_count.attr, + &dev_attr_physical_memory_resourse_count.attr, &dev_attr_context_capabilities.attr, &dev_attr_large_unit_granularity.attr, &dev_attr_wb_buf_alloc_units.attr, diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index da20bd3d46bc787ee05910b6bec9b6fad46d20b9..2346a1fc72b56e8dc7bb51af565293a846f9ed38 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -290,8 +289,8 @@ static inline void ufshcd_add_delay_before_dme_cmd(struct ufs_hba *hba); static int ufshcd_host_reset_and_restore(struct ufs_hba *hba); static void ufshcd_resume_clkscaling(struct ufs_hba *hba); static void ufshcd_suspend_clkscaling(struct ufs_hba *hba); -static int ufshcd_scale_clks(struct ufs_hba *hba, unsigned long freq, - bool scale_up); +static void __ufshcd_suspend_clkscaling(struct ufs_hba *hba); +static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up); static irqreturn_t ufshcd_intr(int irq, void *__hba); static int ufshcd_change_power_mode(struct ufs_hba *hba, struct ufs_pa_layer_attr *pwr_mode); @@ -1080,32 +1079,14 @@ static int ufshcd_set_clk_freq(struct ufs_hba *hba, bool scale_up) return ret; } -static int ufshcd_opp_set_rate(struct ufs_hba *hba, unsigned long freq) -{ - struct dev_pm_opp *opp; - int ret; - - opp = dev_pm_opp_find_freq_floor_indexed(hba->dev, - &freq, 0); - if (IS_ERR(opp)) - return PTR_ERR(opp); - - ret = dev_pm_opp_set_opp(hba->dev, opp); - dev_pm_opp_put(opp); - - return ret; -} - /** * ufshcd_scale_clks - scale up or scale down UFS controller clocks * @hba: per adapter instance - * @freq: frequency to scale * @scale_up: True if scaling up and false if scaling down * * Return: 0 if successful; < 0 upon failure. */ -static int ufshcd_scale_clks(struct ufs_hba *hba, unsigned long freq, - bool scale_up) +static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) { int ret = 0; ktime_t start = ktime_get(); @@ -1114,21 +1095,13 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, unsigned long freq, if (ret) goto out; - if (hba->use_pm_opp) - ret = ufshcd_opp_set_rate(hba, freq); - else - ret = ufshcd_set_clk_freq(hba, scale_up); + ret = ufshcd_set_clk_freq(hba, scale_up); if (ret) goto out; ret = ufshcd_vops_clk_scale_notify(hba, scale_up, POST_CHANGE); - if (ret) { - if (hba->use_pm_opp) - ufshcd_opp_set_rate(hba, - hba->devfreq->previous_freq); - else - ufshcd_set_clk_freq(hba, !scale_up); - } + if (ret) + ufshcd_set_clk_freq(hba, !scale_up); out: trace_ufshcd_profile_clk_scaling(dev_name(hba->dev), @@ -1140,13 +1113,12 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, unsigned long freq, /** * ufshcd_is_devfreq_scaling_required - check if scaling is required or not * @hba: per adapter instance - * @freq: frequency to scale * @scale_up: True if scaling up and false if scaling down * * Return: true if scaling is required, false otherwise. */ static bool ufshcd_is_devfreq_scaling_required(struct ufs_hba *hba, - unsigned long freq, bool scale_up) + bool scale_up) { struct ufs_clk_info *clki; struct list_head *head = &hba->clk_list_head; @@ -1154,9 +1126,6 @@ static bool ufshcd_is_devfreq_scaling_required(struct ufs_hba *hba, if (list_empty(head)) return false; - if (hba->use_pm_opp) - return freq != hba->clk_scaling.target_freq; - list_for_each_entry(clki, head, list) { if (!IS_ERR_OR_NULL(clki->clk)) { if (scale_up && clki->max_freq) { @@ -1315,7 +1284,6 @@ static int ufshcd_clock_scaling_prepare(struct ufs_hba *hba, u64 timeout_us) * make sure that there are no outstanding requests when * clock scaling is in progress */ - mutex_lock(&hba->host->scan_mutex); blk_mq_quiesce_tagset(&hba->host->tag_set); mutex_lock(&hba->wb_mutex); down_write(&hba->clk_scaling_lock); @@ -1326,7 +1294,6 @@ static int ufshcd_clock_scaling_prepare(struct ufs_hba *hba, u64 timeout_us) up_write(&hba->clk_scaling_lock); mutex_unlock(&hba->wb_mutex); blk_mq_unquiesce_tagset(&hba->host->tag_set); - mutex_unlock(&hba->host->scan_mutex); goto out; } @@ -1348,21 +1315,18 @@ static void ufshcd_clock_scaling_unprepare(struct ufs_hba *hba, int err, bool sc mutex_unlock(&hba->wb_mutex); blk_mq_unquiesce_tagset(&hba->host->tag_set); - mutex_unlock(&hba->host->scan_mutex); ufshcd_release(hba); } /** * ufshcd_devfreq_scale - scale up/down UFS clocks and gear * @hba: per adapter instance - * @freq: frequency to scale * @scale_up: True for scaling up and false for scalin down * * Return: 0 for success; -EBUSY if scaling can't happen at this time; non-zero * for any other errors. */ -static int ufshcd_devfreq_scale(struct ufs_hba *hba, unsigned long freq, - bool scale_up) +static int ufshcd_devfreq_scale(struct ufs_hba *hba, bool scale_up) { int ret = 0; @@ -1377,7 +1341,7 @@ static int ufshcd_devfreq_scale(struct ufs_hba *hba, unsigned long freq, goto out_unprepare; } - ret = ufshcd_scale_clks(hba, freq, scale_up); + ret = ufshcd_scale_clks(hba, scale_up); if (ret) { if (!scale_up) ufshcd_scale_gear(hba, true); @@ -1388,8 +1352,7 @@ static int ufshcd_devfreq_scale(struct ufs_hba *hba, unsigned long freq, if (scale_up) { ret = ufshcd_scale_gear(hba, true); if (ret) { - ufshcd_scale_clks(hba, hba->devfreq->previous_freq, - false); + ufshcd_scale_clks(hba, false); goto out_unprepare; } } @@ -1411,10 +1374,9 @@ static void ufshcd_clk_scaling_suspend_work(struct work_struct *work) return; } hba->clk_scaling.is_suspended = true; - hba->clk_scaling.window_start_t = 0; spin_unlock_irqrestore(hba->host->host_lock, irq_flags); - devfreq_suspend_device(hba->devfreq); + __ufshcd_suspend_clkscaling(hba); } static void ufshcd_clk_scaling_resume_work(struct work_struct *work) @@ -1448,22 +1410,9 @@ static int ufshcd_devfreq_target(struct device *dev, if (!ufshcd_is_clkscaling_supported(hba)) return -EINVAL; - if (hba->use_pm_opp) { - struct dev_pm_opp *opp; - - /* Get the recommended frequency from OPP framework */ - opp = devfreq_recommended_opp(dev, freq, flags); - if (IS_ERR(opp)) - return PTR_ERR(opp); - - dev_pm_opp_put(opp); - } else { - /* Override with the closest supported frequency */ - clki = list_first_entry(&hba->clk_list_head, struct ufs_clk_info, - list); - *freq = (unsigned long) clk_round_rate(clki->clk, *freq); - } - + clki = list_first_entry(&hba->clk_list_head, struct ufs_clk_info, list); + /* Override with the closest supported frequency */ + *freq = (unsigned long) clk_round_rate(clki->clk, *freq); spin_lock_irqsave(hba->host->host_lock, irq_flags); if (ufshcd_eh_in_progress(hba)) { spin_unlock_irqrestore(hba->host->host_lock, irq_flags); @@ -1478,17 +1427,12 @@ static int ufshcd_devfreq_target(struct device *dev, goto out; } - /* Decide based on the target or rounded-off frequency and update */ - if (hba->use_pm_opp) - scale_up = *freq > hba->clk_scaling.target_freq; - else - scale_up = *freq == clki->max_freq; - - if (!hba->use_pm_opp && !scale_up) + /* Decide based on the rounded-off frequency and update */ + scale_up = *freq == clki->max_freq; + if (!scale_up) *freq = clki->min_freq; - /* Update the frequency */ - if (!ufshcd_is_devfreq_scaling_required(hba, *freq, scale_up)) { + if (!ufshcd_is_devfreq_scaling_required(hba, scale_up)) { spin_unlock_irqrestore(hba->host->host_lock, irq_flags); ret = 0; goto out; /* no state change required */ @@ -1496,9 +1440,7 @@ static int ufshcd_devfreq_target(struct device *dev, spin_unlock_irqrestore(hba->host->host_lock, irq_flags); start = ktime_get(); - ret = ufshcd_devfreq_scale(hba, *freq, scale_up); - if (!ret) - hba->clk_scaling.target_freq = *freq; + ret = ufshcd_devfreq_scale(hba, scale_up); trace_ufshcd_profile_clk_scaling(dev_name(hba->dev), (scale_up ? "up" : "down"), @@ -1518,6 +1460,8 @@ static int ufshcd_devfreq_get_dev_status(struct device *dev, struct ufs_hba *hba = dev_get_drvdata(dev); struct ufs_clk_scaling *scaling = &hba->clk_scaling; unsigned long flags; + struct list_head *clk_list = &hba->clk_list_head; + struct ufs_clk_info *clki; ktime_t curr_t; if (!ufshcd_is_clkscaling_supported(hba)) @@ -1530,24 +1474,17 @@ static int ufshcd_devfreq_get_dev_status(struct device *dev, if (!scaling->window_start_t) goto start_window; + clki = list_first_entry(clk_list, struct ufs_clk_info, list); /* * If current frequency is 0, then the ondemand governor considers * there's no initial frequency set. And it always requests to set * to max. frequency. */ - if (hba->use_pm_opp) { - stat->current_frequency = hba->clk_scaling.target_freq; - } else { - struct list_head *clk_list = &hba->clk_list_head; - struct ufs_clk_info *clki; - - clki = list_first_entry(clk_list, struct ufs_clk_info, list); - stat->current_frequency = clki->curr_freq; - } - + stat->current_frequency = clki->curr_freq; if (scaling->is_busy_started) scaling->tot_busy_t += ktime_us_delta(curr_t, scaling->busy_start_t); + stat->total_time = ktime_us_delta(curr_t, scaling->window_start_t); stat->busy_time = scaling->tot_busy_t; start_window: @@ -1576,11 +1513,9 @@ static int ufshcd_devfreq_init(struct ufs_hba *hba) if (list_empty(clk_list)) return 0; - if (!hba->use_pm_opp) { - clki = list_first_entry(clk_list, struct ufs_clk_info, list); - dev_pm_opp_add(hba->dev, clki->min_freq, 0); - dev_pm_opp_add(hba->dev, clki->max_freq, 0); - } + clki = list_first_entry(clk_list, struct ufs_clk_info, list); + dev_pm_opp_add(hba->dev, clki->min_freq, 0); + dev_pm_opp_add(hba->dev, clki->max_freq, 0); ufshcd_vops_config_scaling_param(hba, &hba->vps->devfreq_profile, &hba->vps->ondemand_data); @@ -1592,10 +1527,8 @@ static int ufshcd_devfreq_init(struct ufs_hba *hba) ret = PTR_ERR(devfreq); dev_err(hba->dev, "Unable to register with devfreq %d\n", ret); - if (!hba->use_pm_opp) { - dev_pm_opp_remove(hba->dev, clki->min_freq); - dev_pm_opp_remove(hba->dev, clki->max_freq); - } + dev_pm_opp_remove(hba->dev, clki->min_freq); + dev_pm_opp_remove(hba->dev, clki->max_freq); return ret; } @@ -1607,6 +1540,7 @@ static int ufshcd_devfreq_init(struct ufs_hba *hba) static void ufshcd_devfreq_remove(struct ufs_hba *hba) { struct list_head *clk_list = &hba->clk_list_head; + struct ufs_clk_info *clki; if (!hba->devfreq) return; @@ -1614,13 +1548,19 @@ static void ufshcd_devfreq_remove(struct ufs_hba *hba) devfreq_remove_device(hba->devfreq); hba->devfreq = NULL; - if (!hba->use_pm_opp) { - struct ufs_clk_info *clki; + clki = list_first_entry(clk_list, struct ufs_clk_info, list); + dev_pm_opp_remove(hba->dev, clki->min_freq); + dev_pm_opp_remove(hba->dev, clki->max_freq); +} - clki = list_first_entry(clk_list, struct ufs_clk_info, list); - dev_pm_opp_remove(hba->dev, clki->min_freq); - dev_pm_opp_remove(hba->dev, clki->max_freq); - } +static void __ufshcd_suspend_clkscaling(struct ufs_hba *hba) +{ + unsigned long flags; + + devfreq_suspend_device(hba->devfreq); + spin_lock_irqsave(hba->host->host_lock, flags); + hba->clk_scaling.window_start_t = 0; + spin_unlock_irqrestore(hba->host->host_lock, flags); } static void ufshcd_suspend_clkscaling(struct ufs_hba *hba) @@ -1635,12 +1575,11 @@ static void ufshcd_suspend_clkscaling(struct ufs_hba *hba) if (!hba->clk_scaling.is_suspended) { suspend = true; hba->clk_scaling.is_suspended = true; - hba->clk_scaling.window_start_t = 0; } spin_unlock_irqrestore(hba->host->host_lock, flags); if (suspend) - devfreq_suspend_device(hba->devfreq); + __ufshcd_suspend_clkscaling(hba); } static void ufshcd_resume_clkscaling(struct ufs_hba *hba) @@ -1696,7 +1635,7 @@ static ssize_t ufshcd_clkscale_enable_store(struct device *dev, ufshcd_resume_clkscaling(hba); } else { ufshcd_suspend_clkscaling(hba); - err = ufshcd_devfreq_scale(hba, ULONG_MAX, true); + err = ufshcd_devfreq_scale(hba, true); if (err) dev_err(hba->dev, "%s: failed to scale clocks up %d\n", __func__, err); @@ -6561,14 +6500,9 @@ static void ufshcd_err_handler(struct work_struct *work) up(&hba->host_sem); return; } - spin_unlock_irqrestore(hba->host->host_lock, flags); - - ufshcd_err_handling_prepare(hba); - - spin_lock_irqsave(hba->host->host_lock, flags); ufshcd_set_eh_in_progress(hba); spin_unlock_irqrestore(hba->host->host_lock, flags); - + ufshcd_err_handling_prepare(hba); /* Complete requests that have door-bell cleared by h/w */ ufshcd_complete_requests(hba, false); spin_lock_irqsave(hba->host->host_lock, flags); @@ -7780,8 +7714,7 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba) hba->silence_err_logs = false; /* scale up clocks to max frequency before full reinitialization */ - if (ufshcd_is_clkscaling_supported(hba)) - ufshcd_scale_clks(hba, ULONG_MAX, true); + ufshcd_scale_clks(hba, true); err = ufshcd_hba_enable(hba); @@ -9419,17 +9352,6 @@ static int ufshcd_init_clocks(struct ufs_hba *hba) dev_dbg(dev, "%s: clk: %s, rate: %lu\n", __func__, clki->name, clk_get_rate(clki->clk)); } - - /* Set Max. frequency for all clocks */ - if (hba->use_pm_opp) { - ret = ufshcd_opp_set_rate(hba, ULONG_MAX); - if (ret) { - dev_err(hba->dev, "%s: failed to set OPP: %d", __func__, - ret); - goto out; - } - } - out: return ret; } diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c index c94824c999ccd9eb807994f283a85ac5782a0e0b..c6417ef074a478e87adfe8120bc9cca35e879441 100644 --- a/drivers/ufs/host/ufs-qcom.c +++ b/drivers/ufs/host/ufs-qcom.c @@ -453,9 +453,10 @@ static int ufs_qcom_power_up_sequence(struct ufs_hba *hba) dev_warn(hba->dev, "%s: host reset returned %d\n", __func__, ret); - if (phy->power_count) + if (phy->power_count) { phy_power_off(phy); - + phy_exit(phy); + } /* phy initialization - calibrate the phy */ ret = phy_init(phy); diff --git a/drivers/uio/uio_hv_generic.c b/drivers/uio/uio_hv_generic.c index 17c1f85f2b7ba28b1602cdcc29da1178b87f04d2..a2c7abf8c289efa8b4a0f132a0e4f322ce126bf6 100644 --- a/drivers/uio/uio_hv_generic.c +++ b/drivers/uio/uio_hv_generic.c @@ -249,7 +249,6 @@ hv_uio_probe(struct hv_device *dev, struct hv_uio_private_data *pdata; void *ring_buffer; int ret; - size_t ring_size = hv_dev_ring_size(channel); /* Communicating with host has to be via shared memory not hypercall */ if (!channel->offermsg.monitor_allocated) { @@ -257,17 +256,12 @@ hv_uio_probe(struct hv_device *dev, return -ENOTSUPP; } - if (!ring_size) - ring_size = HV_RING_SIZE * PAGE_SIZE; - - /* Adjust ring size if necessary to have it page aligned */ - ring_size = VMBUS_RING_SIZE(ring_size); - pdata = devm_kzalloc(&dev->device, sizeof(*pdata), GFP_KERNEL); if (!pdata) return -ENOMEM; - ret = vmbus_alloc_ring(channel, ring_size, ring_size); + ret = vmbus_alloc_ring(channel, HV_RING_SIZE * PAGE_SIZE, + HV_RING_SIZE * PAGE_SIZE); if (ret) return ret; @@ -294,13 +288,13 @@ hv_uio_probe(struct hv_device *dev, pdata->info.mem[INT_PAGE_MAP].name = "int_page"; pdata->info.mem[INT_PAGE_MAP].addr = (uintptr_t)vmbus_connection.int_page; - pdata->info.mem[INT_PAGE_MAP].size = HV_HYP_PAGE_SIZE; + pdata->info.mem[INT_PAGE_MAP].size = PAGE_SIZE; pdata->info.mem[INT_PAGE_MAP].memtype = UIO_MEM_LOGICAL; pdata->info.mem[MON_PAGE_MAP].name = "monitor_page"; pdata->info.mem[MON_PAGE_MAP].addr = (uintptr_t)vmbus_connection.monitor_pages[1]; - pdata->info.mem[MON_PAGE_MAP].size = HV_HYP_PAGE_SIZE; + pdata->info.mem[MON_PAGE_MAP].size = PAGE_SIZE; pdata->info.mem[MON_PAGE_MAP].memtype = UIO_MEM_LOGICAL; pdata->recv_buf = vzalloc(RECV_BUFFER_SIZE); diff --git a/drivers/usb/cdns3/cdnsp-debug.h b/drivers/usb/cdns3/cdnsp-debug.h index 86860686d8363ee3a50ee4395ab2eb6ccdc8a09e..f0ca865cce2a095660b817f632deb57c89646784 100644 --- a/drivers/usb/cdns3/cdnsp-debug.h +++ b/drivers/usb/cdns3/cdnsp-debug.h @@ -131,6 +131,8 @@ static inline const char *cdnsp_trb_type_string(u8 type) return "Endpoint Not ready"; case TRB_HALT_ENDPOINT: return "Halt Endpoint"; + case TRB_FLUSH_ENDPOINT: + return "FLush Endpoint"; default: return "UNKNOWN"; } @@ -187,203 +189,203 @@ static inline const char *cdnsp_decode_trb(char *str, size_t size, u32 field0, switch (type) { case TRB_LINK: - ret = scnprintf(str, size, - "LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c", - field1, field0, GET_INTR_TARGET(field2), - cdnsp_trb_type_string(type), - field3 & TRB_IOC ? 'I' : 'i', - field3 & TRB_CHAIN ? 'C' : 'c', - field3 & TRB_TC ? 'T' : 't', - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c", + field1, field0, GET_INTR_TARGET(field2), + cdnsp_trb_type_string(type), + field3 & TRB_IOC ? 'I' : 'i', + field3 & TRB_CHAIN ? 'C' : 'c', + field3 & TRB_TC ? 'T' : 't', + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_TRANSFER: case TRB_COMPLETION: case TRB_PORT_STATUS: case TRB_HC_EVENT: - ret = scnprintf(str, size, - "ep%d%s(%d) type '%s' TRB %08x%08x status '%s'" - " len %ld slot %ld flags %c:%c", - ep_num, ep_id % 2 ? "out" : "in", - TRB_TO_EP_INDEX(field3), - cdnsp_trb_type_string(type), field1, field0, - cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)), - EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3), - field3 & EVENT_DATA ? 'E' : 'e', - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "ep%d%s(%d) type '%s' TRB %08x%08x status '%s'" + " len %ld slot %ld flags %c:%c", + ep_num, ep_id % 2 ? "out" : "in", + TRB_TO_EP_INDEX(field3), + cdnsp_trb_type_string(type), field1, field0, + cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)), + EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3), + field3 & EVENT_DATA ? 'E' : 'e', + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_MFINDEX_WRAP: - ret = scnprintf(str, size, "%s: flags %c", - cdnsp_trb_type_string(type), - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, "%s: flags %c", + cdnsp_trb_type_string(type), + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_SETUP: - ret = scnprintf(str, size, - "type '%s' bRequestType %02x bRequest %02x " - "wValue %02x%02x wIndex %02x%02x wLength %d " - "length %ld TD size %ld intr %ld Setup ID %ld " - "flags %c:%c:%c", - cdnsp_trb_type_string(type), - field0 & 0xff, - (field0 & 0xff00) >> 8, - (field0 & 0xff000000) >> 24, - (field0 & 0xff0000) >> 16, - (field1 & 0xff00) >> 8, - field1 & 0xff, - (field1 & 0xff000000) >> 16 | - (field1 & 0xff0000) >> 16, - TRB_LEN(field2), GET_TD_SIZE(field2), - GET_INTR_TARGET(field2), - TRB_SETUPID_TO_TYPE(field3), - field3 & TRB_IDT ? 'D' : 'd', - field3 & TRB_IOC ? 'I' : 'i', - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "type '%s' bRequestType %02x bRequest %02x " + "wValue %02x%02x wIndex %02x%02x wLength %d " + "length %ld TD size %ld intr %ld Setup ID %ld " + "flags %c:%c:%c", + cdnsp_trb_type_string(type), + field0 & 0xff, + (field0 & 0xff00) >> 8, + (field0 & 0xff000000) >> 24, + (field0 & 0xff0000) >> 16, + (field1 & 0xff00) >> 8, + field1 & 0xff, + (field1 & 0xff000000) >> 16 | + (field1 & 0xff0000) >> 16, + TRB_LEN(field2), GET_TD_SIZE(field2), + GET_INTR_TARGET(field2), + TRB_SETUPID_TO_TYPE(field3), + field3 & TRB_IDT ? 'D' : 'd', + field3 & TRB_IOC ? 'I' : 'i', + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_DATA: - ret = scnprintf(str, size, - "type '%s' Buffer %08x%08x length %ld TD size %ld " - "intr %ld flags %c:%c:%c:%c:%c:%c:%c", - cdnsp_trb_type_string(type), - field1, field0, TRB_LEN(field2), - GET_TD_SIZE(field2), - GET_INTR_TARGET(field2), - field3 & TRB_IDT ? 'D' : 'i', - field3 & TRB_IOC ? 'I' : 'i', - field3 & TRB_CHAIN ? 'C' : 'c', - field3 & TRB_NO_SNOOP ? 'S' : 's', - field3 & TRB_ISP ? 'I' : 'i', - field3 & TRB_ENT ? 'E' : 'e', - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "type '%s' Buffer %08x%08x length %ld TD size %ld " + "intr %ld flags %c:%c:%c:%c:%c:%c:%c", + cdnsp_trb_type_string(type), + field1, field0, TRB_LEN(field2), + GET_TD_SIZE(field2), + GET_INTR_TARGET(field2), + field3 & TRB_IDT ? 'D' : 'i', + field3 & TRB_IOC ? 'I' : 'i', + field3 & TRB_CHAIN ? 'C' : 'c', + field3 & TRB_NO_SNOOP ? 'S' : 's', + field3 & TRB_ISP ? 'I' : 'i', + field3 & TRB_ENT ? 'E' : 'e', + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_STATUS: - ret = scnprintf(str, size, - "Buffer %08x%08x length %ld TD size %ld intr" - "%ld type '%s' flags %c:%c:%c:%c", - field1, field0, TRB_LEN(field2), - GET_TD_SIZE(field2), - GET_INTR_TARGET(field2), - cdnsp_trb_type_string(type), - field3 & TRB_IOC ? 'I' : 'i', - field3 & TRB_CHAIN ? 'C' : 'c', - field3 & TRB_ENT ? 'E' : 'e', - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "Buffer %08x%08x length %ld TD size %ld intr" + "%ld type '%s' flags %c:%c:%c:%c", + field1, field0, TRB_LEN(field2), + GET_TD_SIZE(field2), + GET_INTR_TARGET(field2), + cdnsp_trb_type_string(type), + field3 & TRB_IOC ? 'I' : 'i', + field3 & TRB_CHAIN ? 'C' : 'c', + field3 & TRB_ENT ? 'E' : 'e', + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_NORMAL: case TRB_ISOC: case TRB_EVENT_DATA: case TRB_TR_NOOP: - ret = scnprintf(str, size, - "type '%s' Buffer %08x%08x length %ld " - "TD size %ld intr %ld " - "flags %c:%c:%c:%c:%c:%c:%c:%c:%c", - cdnsp_trb_type_string(type), - field1, field0, TRB_LEN(field2), - GET_TD_SIZE(field2), - GET_INTR_TARGET(field2), - field3 & TRB_BEI ? 'B' : 'b', - field3 & TRB_IDT ? 'T' : 't', - field3 & TRB_IOC ? 'I' : 'i', - field3 & TRB_CHAIN ? 'C' : 'c', - field3 & TRB_NO_SNOOP ? 'S' : 's', - field3 & TRB_ISP ? 'I' : 'i', - field3 & TRB_ENT ? 'E' : 'e', - field3 & TRB_CYCLE ? 'C' : 'c', - !(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v'); + ret = snprintf(str, size, + "type '%s' Buffer %08x%08x length %ld " + "TD size %ld intr %ld " + "flags %c:%c:%c:%c:%c:%c:%c:%c:%c", + cdnsp_trb_type_string(type), + field1, field0, TRB_LEN(field2), + GET_TD_SIZE(field2), + GET_INTR_TARGET(field2), + field3 & TRB_BEI ? 'B' : 'b', + field3 & TRB_IDT ? 'T' : 't', + field3 & TRB_IOC ? 'I' : 'i', + field3 & TRB_CHAIN ? 'C' : 'c', + field3 & TRB_NO_SNOOP ? 'S' : 's', + field3 & TRB_ISP ? 'I' : 'i', + field3 & TRB_ENT ? 'E' : 'e', + field3 & TRB_CYCLE ? 'C' : 'c', + !(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v'); break; case TRB_CMD_NOOP: case TRB_ENABLE_SLOT: - ret = scnprintf(str, size, "%s: flags %c", - cdnsp_trb_type_string(type), - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, "%s: flags %c", + cdnsp_trb_type_string(type), + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_DISABLE_SLOT: - ret = scnprintf(str, size, "%s: slot %ld flags %c", - cdnsp_trb_type_string(type), - TRB_TO_SLOT_ID(field3), - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, "%s: slot %ld flags %c", + cdnsp_trb_type_string(type), + TRB_TO_SLOT_ID(field3), + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_ADDR_DEV: - ret = scnprintf(str, size, - "%s: ctx %08x%08x slot %ld flags %c:%c", - cdnsp_trb_type_string(type), field1, field0, - TRB_TO_SLOT_ID(field3), - field3 & TRB_BSR ? 'B' : 'b', - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "%s: ctx %08x%08x slot %ld flags %c:%c", + cdnsp_trb_type_string(type), field1, field0, + TRB_TO_SLOT_ID(field3), + field3 & TRB_BSR ? 'B' : 'b', + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_CONFIG_EP: - ret = scnprintf(str, size, - "%s: ctx %08x%08x slot %ld flags %c:%c", - cdnsp_trb_type_string(type), field1, field0, - TRB_TO_SLOT_ID(field3), - field3 & TRB_DC ? 'D' : 'd', - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "%s: ctx %08x%08x slot %ld flags %c:%c", + cdnsp_trb_type_string(type), field1, field0, + TRB_TO_SLOT_ID(field3), + field3 & TRB_DC ? 'D' : 'd', + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_EVAL_CONTEXT: - ret = scnprintf(str, size, - "%s: ctx %08x%08x slot %ld flags %c", - cdnsp_trb_type_string(type), field1, field0, - TRB_TO_SLOT_ID(field3), - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "%s: ctx %08x%08x slot %ld flags %c", + cdnsp_trb_type_string(type), field1, field0, + TRB_TO_SLOT_ID(field3), + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_RESET_EP: case TRB_HALT_ENDPOINT: - ret = scnprintf(str, size, - "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c %c", - cdnsp_trb_type_string(type), - ep_num, ep_id % 2 ? "out" : "in", - TRB_TO_EP_INDEX(field3), field1, field0, - TRB_TO_SLOT_ID(field3), - field3 & TRB_CYCLE ? 'C' : 'c', - field3 & TRB_ESP ? 'P' : 'p'); + case TRB_FLUSH_ENDPOINT: + ret = snprintf(str, size, + "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c", + cdnsp_trb_type_string(type), + ep_num, ep_id % 2 ? "out" : "in", + TRB_TO_EP_INDEX(field3), field1, field0, + TRB_TO_SLOT_ID(field3), + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_STOP_RING: - ret = scnprintf(str, size, - "%s: ep%d%s(%d) slot %ld sp %d flags %c", - cdnsp_trb_type_string(type), - ep_num, ep_id % 2 ? "out" : "in", - TRB_TO_EP_INDEX(field3), - TRB_TO_SLOT_ID(field3), - TRB_TO_SUSPEND_PORT(field3), - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "%s: ep%d%s(%d) slot %ld sp %d flags %c", + cdnsp_trb_type_string(type), + ep_num, ep_id % 2 ? "out" : "in", + TRB_TO_EP_INDEX(field3), + TRB_TO_SLOT_ID(field3), + TRB_TO_SUSPEND_PORT(field3), + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_SET_DEQ: - ret = scnprintf(str, size, - "%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld flags %c", - cdnsp_trb_type_string(type), - ep_num, ep_id % 2 ? "out" : "in", - TRB_TO_EP_INDEX(field3), field1, field0, - TRB_TO_STREAM_ID(field2), - TRB_TO_SLOT_ID(field3), - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld flags %c", + cdnsp_trb_type_string(type), + ep_num, ep_id % 2 ? "out" : "in", + TRB_TO_EP_INDEX(field3), field1, field0, + TRB_TO_STREAM_ID(field2), + TRB_TO_SLOT_ID(field3), + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_RESET_DEV: - ret = scnprintf(str, size, "%s: slot %ld flags %c", - cdnsp_trb_type_string(type), - TRB_TO_SLOT_ID(field3), - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, "%s: slot %ld flags %c", + cdnsp_trb_type_string(type), + TRB_TO_SLOT_ID(field3), + field3 & TRB_CYCLE ? 'C' : 'c'); break; case TRB_ENDPOINT_NRDY: temp = TRB_TO_HOST_STREAM(field2); - ret = scnprintf(str, size, - "%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c", - cdnsp_trb_type_string(type), - ep_num, ep_id % 2 ? "out" : "in", - TRB_TO_EP_INDEX(field3), temp, - temp == STREAM_PRIME_ACK ? "(PRIME)" : "", - temp == STREAM_REJECTED ? "(REJECTED)" : "", - TRB_TO_DEV_STREAM(field0), - field3 & TRB_STAT ? 'S' : 's', - field3 & TRB_CYCLE ? 'C' : 'c'); + ret = snprintf(str, size, + "%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c", + cdnsp_trb_type_string(type), + ep_num, ep_id % 2 ? "out" : "in", + TRB_TO_EP_INDEX(field3), temp, + temp == STREAM_PRIME_ACK ? "(PRIME)" : "", + temp == STREAM_REJECTED ? "(REJECTED)" : "", + TRB_TO_DEV_STREAM(field0), + field3 & TRB_STAT ? 'S' : 's', + field3 & TRB_CYCLE ? 'C' : 'c'); break; default: - ret = scnprintf(str, size, - "type '%s' -> raw %08x %08x %08x %08x", - cdnsp_trb_type_string(type), - field0, field1, field2, field3); + ret = snprintf(str, size, + "type '%s' -> raw %08x %08x %08x %08x", + cdnsp_trb_type_string(type), + field0, field1, field2, field3); } - if (ret == size - 1) - pr_info("CDNSP: buffer may be truncated.\n"); + if (ret >= size) + pr_info("CDNSP: buffer overflowed.\n"); return str; } @@ -466,32 +468,32 @@ static inline const char *cdnsp_decode_portsc(char *str, size_t size, { int ret; - ret = scnprintf(str, size, "%s %s %s Link:%s PortSpeed:%d ", - portsc & PORT_POWER ? "Powered" : "Powered-off", - portsc & PORT_CONNECT ? "Connected" : "Not-connected", - portsc & PORT_PED ? "Enabled" : "Disabled", - cdnsp_portsc_link_state_string(portsc), - DEV_PORT_SPEED(portsc)); + ret = snprintf(str, size, "%s %s %s Link:%s PortSpeed:%d ", + portsc & PORT_POWER ? "Powered" : "Powered-off", + portsc & PORT_CONNECT ? "Connected" : "Not-connected", + portsc & PORT_PED ? "Enabled" : "Disabled", + cdnsp_portsc_link_state_string(portsc), + DEV_PORT_SPEED(portsc)); if (portsc & PORT_RESET) - ret += scnprintf(str + ret, size - ret, "In-Reset "); + ret += snprintf(str + ret, size - ret, "In-Reset "); - ret += scnprintf(str + ret, size - ret, "Change: "); + ret += snprintf(str + ret, size - ret, "Change: "); if (portsc & PORT_CSC) - ret += scnprintf(str + ret, size - ret, "CSC "); + ret += snprintf(str + ret, size - ret, "CSC "); if (portsc & PORT_WRC) - ret += scnprintf(str + ret, size - ret, "WRC "); + ret += snprintf(str + ret, size - ret, "WRC "); if (portsc & PORT_RC) - ret += scnprintf(str + ret, size - ret, "PRC "); + ret += snprintf(str + ret, size - ret, "PRC "); if (portsc & PORT_PLC) - ret += scnprintf(str + ret, size - ret, "PLC "); + ret += snprintf(str + ret, size - ret, "PLC "); if (portsc & PORT_CEC) - ret += scnprintf(str + ret, size - ret, "CEC "); - ret += scnprintf(str + ret, size - ret, "Wake: "); + ret += snprintf(str + ret, size - ret, "CEC "); + ret += snprintf(str + ret, size - ret, "Wake: "); if (portsc & PORT_WKCONN_E) - ret += scnprintf(str + ret, size - ret, "WCE "); + ret += snprintf(str + ret, size - ret, "WCE "); if (portsc & PORT_WKDISC_E) - ret += scnprintf(str + ret, size - ret, "WDE "); + ret += snprintf(str + ret, size - ret, "WDE "); return str; } @@ -563,20 +565,20 @@ static inline const char *cdnsp_decode_ep_context(char *str, size_t size, avg = EP_AVG_TRB_LENGTH(tx_info); - ret = scnprintf(str, size, "State %s mult %d max P. Streams %d %s", - cdnsp_ep_state_string(ep_state), mult, - max_pstr, lsa ? "LSA " : ""); + ret = snprintf(str, size, "State %s mult %d max P. Streams %d %s", + cdnsp_ep_state_string(ep_state), mult, + max_pstr, lsa ? "LSA " : ""); - ret += scnprintf(str + ret, size - ret, - "interval %d us max ESIT payload %d CErr %d ", - (1 << interval) * 125, esit, cerr); + ret += snprintf(str + ret, size - ret, + "interval %d us max ESIT payload %d CErr %d ", + (1 << interval) * 125, esit, cerr); - ret += scnprintf(str + ret, size - ret, - "Type %s %sburst %d maxp %d deq %016llx ", - cdnsp_ep_type_string(ep_type), hid ? "HID" : "", - burst, maxp, deq); + ret += snprintf(str + ret, size - ret, + "Type %s %sburst %d maxp %d deq %016llx ", + cdnsp_ep_type_string(ep_type), hid ? "HID" : "", + burst, maxp, deq); - ret += scnprintf(str + ret, size - ret, "avg trb len %d", avg); + ret += snprintf(str + ret, size - ret, "avg trb len %d", avg); return str; } diff --git a/drivers/usb/cdns3/cdnsp-ep0.c b/drivers/usb/cdns3/cdnsp-ep0.c index 5cd9b898ce971fb7a794a0fa4cb397d4e299725b..f317d3c84781082d00d27f13481a5f759e7d1515 100644 --- a/drivers/usb/cdns3/cdnsp-ep0.c +++ b/drivers/usb/cdns3/cdnsp-ep0.c @@ -414,7 +414,6 @@ static int cdnsp_ep0_std_request(struct cdnsp_device *pdev, void cdnsp_setup_analyze(struct cdnsp_device *pdev) { struct usb_ctrlrequest *ctrl = &pdev->setup; - struct cdnsp_ep *pep; int ret = -EINVAL; u16 len; @@ -428,21 +427,10 @@ void cdnsp_setup_analyze(struct cdnsp_device *pdev) goto out; } - pep = &pdev->eps[0]; - /* Restore the ep0 to Stopped/Running state. */ - if (pep->ep_state & EP_HALTED) { - if (GET_EP_CTX_STATE(pep->out_ctx) == EP_STATE_HALTED) - cdnsp_halt_endpoint(pdev, pep, 0); - - /* - * Halt Endpoint Command for SSP2 for ep0 preserve current - * endpoint state and driver has to synchronize the - * software endpoint state with endpoint output context - * state. - */ - pep->ep_state &= ~EP_HALTED; - pep->ep_state |= EP_STOPPED; + if (pdev->eps[0].ep_state & EP_HALTED) { + trace_cdnsp_ep0_halted("Restore to normal state"); + cdnsp_halt_endpoint(pdev, &pdev->eps[0], 0); } /* diff --git a/drivers/usb/cdns3/cdnsp-gadget.c b/drivers/usb/cdns3/cdnsp-gadget.c index 38e693cd3efc05106f840a5809f386e0a444fbd7..601a60a28022407374298ea16faa48e121469e08 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.c +++ b/drivers/usb/cdns3/cdnsp-gadget.c @@ -28,8 +28,7 @@ unsigned int cdnsp_port_speed(unsigned int port_status) { /*Detect gadget speed based on PORTSC register*/ - if (DEV_SUPERSPEEDPLUS(port_status) || - DEV_SSP_GEN1x2(port_status) || DEV_SSP_GEN2x2(port_status)) + if (DEV_SUPERSPEEDPLUS(port_status)) return USB_SPEED_SUPER_PLUS; else if (DEV_SUPERSPEED(port_status)) return USB_SPEED_SUPER; @@ -547,7 +546,6 @@ int cdnsp_wait_for_cmd_compl(struct cdnsp_device *pdev) dma_addr_t cmd_deq_dma; union cdnsp_trb *event; u32 cycle_state; - u32 retry = 10; int ret, val; u64 cmd_dma; u32 flags; @@ -579,23 +577,8 @@ int cdnsp_wait_for_cmd_compl(struct cdnsp_device *pdev) flags = le32_to_cpu(event->event_cmd.flags); /* Check the owner of the TRB. */ - if ((flags & TRB_CYCLE) != cycle_state) { - /* - * Give some extra time to get chance controller - * to finish command before returning error code. - * Checking CMD_RING_BUSY is not sufficient because - * this bit is cleared to '0' when the Command - * Descriptor has been executed by controller - * and not when command completion event has - * be added to event ring. - */ - if (retry--) { - udelay(20); - continue; - } - + if ((flags & TRB_CYCLE) != cycle_state) return -EINVAL; - } cmd_dma = le64_to_cpu(event->event_cmd.cmd_trb); @@ -1061,8 +1044,10 @@ static int cdnsp_gadget_ep_disable(struct usb_ep *ep) pep->ep_state |= EP_DIS_IN_RROGRESS; /* Endpoint was unconfigured by Reset Device command. */ - if (!(pep->ep_state & EP_UNCONFIGURED)) + if (!(pep->ep_state & EP_UNCONFIGURED)) { cdnsp_cmd_stop_ep(pdev, pep); + cdnsp_cmd_flush_ep(pdev, pep); + } /* Remove all queued USB requests. */ while (!list_empty(&pep->pending_list)) { @@ -1459,6 +1444,8 @@ static void cdnsp_stop(struct cdnsp_device *pdev) { u32 temp; + cdnsp_cmd_flush_ep(pdev, &pdev->eps[0]); + /* Remove internally queued request for ep0. */ if (!list_empty(&pdev->eps[0].pending_list)) { struct cdnsp_request *req; diff --git a/drivers/usb/cdns3/cdnsp-gadget.h b/drivers/usb/cdns3/cdnsp-gadget.h index a91cca509db0806e6b04acae2e5dc012d4dfc147..ed84dbb9fd6fbc154dfa3f86ee9e5a5e7c8fd1bb 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.h +++ b/drivers/usb/cdns3/cdnsp-gadget.h @@ -285,15 +285,11 @@ struct cdnsp_port_regs { #define XDEV_HS (0x3 << 10) #define XDEV_SS (0x4 << 10) #define XDEV_SSP (0x5 << 10) -#define XDEV_SSP1x2 (0x6 << 10) -#define XDEV_SSP2x2 (0x7 << 10) #define DEV_UNDEFSPEED(p) (((p) & DEV_SPEED_MASK) == (0x0 << 10)) #define DEV_FULLSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_FS) #define DEV_HIGHSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_HS) #define DEV_SUPERSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_SS) #define DEV_SUPERSPEEDPLUS(p) (((p) & DEV_SPEED_MASK) == XDEV_SSP) -#define DEV_SSP_GEN1x2(p) (((p) & DEV_SPEED_MASK) == XDEV_SSP1x2) -#define DEV_SSP_GEN2x2(p) (((p) & DEV_SPEED_MASK) == XDEV_SSP2x2) #define DEV_SUPERSPEED_ANY(p) (((p) & DEV_SPEED_MASK) >= XDEV_SS) #define DEV_PORT_SPEED(p) (((p) >> 10) & 0x0f) /* Port Link State Write Strobe - set this when changing link state */ @@ -987,12 +983,6 @@ enum cdnsp_setup_dev { #define STREAM_ID_FOR_TRB(p) ((((p)) << 16) & GENMASK(31, 16)) #define SCT_FOR_TRB(p) (((p) << 1) & 0x7) -/* - * Halt Endpoint Command TRB field. - * The ESP bit only exists in the SSP2 controller. - */ -#define TRB_ESP BIT(9) - /* Link TRB specific fields. */ #define TRB_TC BIT(1) @@ -1144,6 +1134,8 @@ union cdnsp_trb { #define TRB_HALT_ENDPOINT 54 /* Doorbell Overflow Event. */ #define TRB_DRB_OVERFLOW 57 +/* Flush Endpoint Command. */ +#define TRB_FLUSH_ENDPOINT 58 #define TRB_TYPE_LINK(x) (((x) & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK)) #define TRB_TYPE_LINK_LE32(x) (((x) & cpu_to_le32(TRB_TYPE_BITMASK)) == \ @@ -1556,6 +1548,8 @@ void cdnsp_queue_configure_endpoint(struct cdnsp_device *pdev, void cdnsp_queue_reset_ep(struct cdnsp_device *pdev, unsigned int ep_index); void cdnsp_queue_halt_endpoint(struct cdnsp_device *pdev, unsigned int ep_index); +void cdnsp_queue_flush_endpoint(struct cdnsp_device *pdev, + unsigned int ep_index); void cdnsp_force_header_wakeup(struct cdnsp_device *pdev, int intf_num); void cdnsp_queue_reset_device(struct cdnsp_device *pdev); void cdnsp_queue_new_dequeue_state(struct cdnsp_device *pdev, @@ -1589,6 +1583,7 @@ void cdnsp_irq_reset(struct cdnsp_device *pdev); int cdnsp_halt_endpoint(struct cdnsp_device *pdev, struct cdnsp_ep *pep, int value); int cdnsp_cmd_stop_ep(struct cdnsp_device *pdev, struct cdnsp_ep *pep); +int cdnsp_cmd_flush_ep(struct cdnsp_device *pdev, struct cdnsp_ep *pep); void cdnsp_setup_analyze(struct cdnsp_device *pdev); int cdnsp_status_stage(struct cdnsp_device *pdev); int cdnsp_reset_device(struct cdnsp_device *pdev); diff --git a/drivers/usb/cdns3/cdnsp-ring.c b/drivers/usb/cdns3/cdnsp-ring.c index 0758f171f73ecf1ab1c0b3d0698632f0058eed61..080a3f17a35dd7df0b90034f1d43276a6ab2e8b6 100644 --- a/drivers/usb/cdns3/cdnsp-ring.c +++ b/drivers/usb/cdns3/cdnsp-ring.c @@ -772,9 +772,7 @@ static int cdnsp_update_port_id(struct cdnsp_device *pdev, u32 port_id) } if (port_id != old_port) { - if (pdev->slot_id) - cdnsp_disable_slot(pdev); - + cdnsp_disable_slot(pdev); pdev->active_port = port; cdnsp_enable_slot(pdev); } @@ -2159,6 +2157,19 @@ int cdnsp_cmd_stop_ep(struct cdnsp_device *pdev, struct cdnsp_ep *pep) return ret; } +int cdnsp_cmd_flush_ep(struct cdnsp_device *pdev, struct cdnsp_ep *pep) +{ + int ret; + + cdnsp_queue_flush_endpoint(pdev, pep->idx); + cdnsp_ring_cmd_db(pdev); + ret = cdnsp_wait_for_cmd_compl(pdev); + + trace_cdnsp_handle_cmd_flush_ep(pep->out_ctx); + + return ret; +} + /* * The transfer burst count field of the isochronous TRB defines the number of * bursts that are required to move all packets in this TD. Only SuperSpeed @@ -2485,8 +2496,18 @@ void cdnsp_queue_halt_endpoint(struct cdnsp_device *pdev, unsigned int ep_index) { cdnsp_queue_command(pdev, 0, 0, 0, TRB_TYPE(TRB_HALT_ENDPOINT) | SLOT_ID_FOR_TRB(pdev->slot_id) | - EP_ID_FOR_TRB(ep_index) | - (!ep_index ? TRB_ESP : 0)); + EP_ID_FOR_TRB(ep_index)); +} + +/* + * Queue a flush endpoint request on the command ring. + */ +void cdnsp_queue_flush_endpoint(struct cdnsp_device *pdev, + unsigned int ep_index) +{ + cdnsp_queue_command(pdev, 0, 0, 0, TRB_TYPE(TRB_FLUSH_ENDPOINT) | + SLOT_ID_FOR_TRB(pdev->slot_id) | + EP_ID_FOR_TRB(ep_index)); } void cdnsp_force_header_wakeup(struct cdnsp_device *pdev, int intf_num) diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 0bee561420af29aa66613055278d52a6d09ab2db..f2ae5f4c58283a7b21e7d540d1fe36366dacea31 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c @@ -2213,10 +2213,6 @@ static void udc_suspend(struct ci_hdrc *ci) */ if (hw_read(ci, OP_ENDPTLISTADDR, ~0) == 0) hw_write(ci, OP_ENDPTLISTADDR, ~0, ~0); - - if (ci->gadget.connected && - (!ci->suspended || !device_may_wakeup(ci->dev))) - usb_gadget_disconnect(&ci->gadget); } static void udc_resume(struct ci_hdrc *ci, bool power_lost) @@ -2227,9 +2223,6 @@ static void udc_resume(struct ci_hdrc *ci, bool power_lost) OTGSC_BSVIS | OTGSC_BSVIE); if (ci->vbus_active) usb_gadget_vbus_disconnect(&ci->gadget); - } else if (ci->vbus_active && ci->driver && - !ci->gadget.connected) { - usb_gadget_connect(&ci->gadget); } /* Restore value 0 if it was set for power lost check */ diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 600ad9412c146b9b297c27cdcae13e711dcc78c5..559c121f092300c0d15d219e9c3882caadbb18c1 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -92,6 +92,7 @@ struct wdm_device { u16 wMaxCommand; u16 wMaxPacketSize; __le16 inum; + int reslength; int length; int read; int count; @@ -213,11 +214,6 @@ static void wdm_in_callback(struct urb *urb) if (desc->rerr == 0 && status != -EPIPE) desc->rerr = status; - if (length == 0) { - dev_dbg(&desc->intf->dev, "received ZLP\n"); - goto skip_zlp; - } - if (length + desc->length > desc->wMaxCommand) { /* The buffer would overflow */ set_bit(WDM_OVERFLOW, &desc->flags); @@ -226,18 +222,18 @@ static void wdm_in_callback(struct urb *urb) if (!test_bit(WDM_OVERFLOW, &desc->flags)) { memmove(desc->ubuf + desc->length, desc->inbuf, length); desc->length += length; + desc->reslength = length; } } skip_error: if (desc->rerr) { /* - * If there was a ZLP or an error, userspace may decide to not - * read any data after poll'ing. + * Since there was an error, userspace may decide to not read + * any data after poll'ing. * We should respond to further attempts from the device to send * data, so that we can get unstuck. */ -skip_zlp: schedule_work(&desc->service_outs_intr); } else { set_bit(WDM_READ, &desc->flags); @@ -589,6 +585,15 @@ static ssize_t wdm_read goto retry; } + if (!desc->reslength) { /* zero length read */ + dev_dbg(&desc->intf->dev, "zero length - clearing WDM_READ\n"); + clear_bit(WDM_READ, &desc->flags); + rv = service_outstanding_interrupt(desc); + spin_unlock_irq(&desc->iuspin); + if (rv < 0) + goto err; + goto retry; + } cntr = desc->length; spin_unlock_irq(&desc->iuspin); } @@ -1011,7 +1016,7 @@ static void service_interrupt_work(struct work_struct *work) spin_lock_irq(&desc->iuspin); service_outstanding_interrupt(desc); - if (!desc->resp_count && (desc->length || desc->rerr)) { + if (!desc->resp_count) { set_bit(WDM_READ, &desc->flags); wake_up(&desc->wait); } diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index ee45f3c74aecb55af4e3d34fd1589214cea57efe..2f92905e05cad04bacfd37e1446c0dc477412988 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c @@ -483,7 +483,6 @@ static int usbtmc_get_stb(struct usbtmc_file_data *file_data, __u8 *stb) u8 tag; int rv; long wait_rv; - unsigned long expire; dev_dbg(dev, "Enter ioctl_read_stb iin_ep_present: %d\n", data->iin_ep_present); @@ -513,11 +512,10 @@ static int usbtmc_get_stb(struct usbtmc_file_data *file_data, __u8 *stb) } if (data->iin_ep_present) { - expire = msecs_to_jiffies(file_data->timeout); wait_rv = wait_event_interruptible_timeout( data->waitq, atomic_read(&data->iin_data_valid) != 0, - expire); + file_data->timeout); if (wait_rv < 0) { dev_dbg(dev, "wait interrupted %ld\n", wait_rv); rv = wait_rv; @@ -565,15 +563,14 @@ static int usbtmc488_ioctl_read_stb(struct usbtmc_file_data *file_data, rv = usbtmc_get_stb(file_data, &stb); - if (rv < 0) - return rv; - - srq_asserted = atomic_xchg(&file_data->srq_asserted, srq_asserted); - if (srq_asserted) - stb |= 0x40; /* Set RQS bit */ - - rv = put_user(stb, (__u8 __user *)arg); + if (rv > 0) { + srq_asserted = atomic_xchg(&file_data->srq_asserted, + srq_asserted); + if (srq_asserted) + stb |= 0x40; /* Set RQS bit */ + rv = put_user(stb, (__u8 __user *)arg); + } return rv; } @@ -2202,7 +2199,7 @@ static long usbtmc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) case USBTMC_IOCTL_GET_STB: retval = usbtmc_get_stb(file_data, &tmp_byte); - if (!retval) + if (retval > 0) retval = put_user(tmp_byte, (__u8 __user *)arg); break; diff --git a/drivers/usb/common/usb-conn-gpio.c b/drivers/usb/common/usb-conn-gpio.c index 1096a884c8d705c71ae1fa648962ccde82616c6d..501e8bc9738eba54836dcc2b97f83c36e791f1e9 100644 --- a/drivers/usb/common/usb-conn-gpio.c +++ b/drivers/usb/common/usb-conn-gpio.c @@ -20,9 +20,6 @@ #include #include #include -#include - -static DEFINE_IDA(usb_conn_ida); #define USB_GPIO_DEB_MS 20 /* ms */ #define USB_GPIO_DEB_US ((USB_GPIO_DEB_MS) * 1000) /* us */ @@ -32,7 +29,6 @@ static DEFINE_IDA(usb_conn_ida); struct usb_conn_info { struct device *dev; - int conn_id; /* store the IDA-allocated ID */ struct usb_role_switch *role_sw; enum usb_role last_role; struct regulator *vbus; @@ -164,17 +160,7 @@ static int usb_conn_psy_register(struct usb_conn_info *info) .of_node = dev->of_node, }; - info->conn_id = ida_alloc(&usb_conn_ida, GFP_KERNEL); - if (info->conn_id < 0) - return info->conn_id; - - desc->name = devm_kasprintf(dev, GFP_KERNEL, "usb-charger-%d", - info->conn_id); - if (!desc->name) { - ida_free(&usb_conn_ida, info->conn_id); - return -ENOMEM; - } - + desc->name = "usb-charger"; desc->properties = usb_charger_properties; desc->num_properties = ARRAY_SIZE(usb_charger_properties); desc->get_property = usb_charger_get_property; @@ -182,10 +168,8 @@ static int usb_conn_psy_register(struct usb_conn_info *info) cfg.drv_data = info; info->charger = devm_power_supply_register(dev, desc, &cfg); - if (IS_ERR(info->charger)) { - dev_err(dev, "Unable to register charger %d\n", info->conn_id); - ida_free(&usb_conn_ida, info->conn_id); - } + if (IS_ERR(info->charger)) + dev_err(dev, "Unable to register charger\n"); return PTR_ERR_OR_ZERO(info->charger); } @@ -293,9 +277,6 @@ static void usb_conn_remove(struct platform_device *pdev) cancel_delayed_work_sync(&info->dw_det); - if (info->charger) - ida_free(&usb_conn_ida, info->conn_id); - if (info->last_role == USB_ROLE_HOST && info->vbus) regulator_disable(info->vbus); diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index bebc41308ca930180b5de1c91b157c1a3c141bb8..760283a541b41bea08a6914e4b4c5cc5bd80ae40 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -66,12 +66,6 @@ */ #define USB_SHORT_SET_ADDRESS_REQ_TIMEOUT 500 /* ms */ -/* - * Give SS hubs 200ms time after wake to train downstream links before - * assuming no port activity and allowing hub to runtime suspend back. - */ -#define USB_SS_PORT_U0_WAKE_TIME 200 /* ms */ - /* Protect struct usb_device->state and ->children members * Note: Both are also protected by ->dev.sem, except that ->state can * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */ @@ -1071,7 +1065,6 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) goto init2; goto init3; } - hub_get(hub); /* The superspeed hub except for root hub has to use Hub Depth @@ -1320,17 +1313,6 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) device_unlock(&hdev->dev); } - if (type == HUB_RESUME && hub_is_superspeed(hub->hdev)) { - /* give usb3 downstream links training time after hub resume */ - usb_autopm_get_interface_no_resume( - to_usb_interface(hub->intfdev)); - - queue_delayed_work(system_power_efficient_wq, - &hub->post_resume_work, - msecs_to_jiffies(USB_SS_PORT_U0_WAKE_TIME)); - return; - } - hub_put(hub); } @@ -1349,14 +1331,6 @@ static void hub_init_func3(struct work_struct *ws) hub_activate(hub, HUB_INIT3); } -static void hub_post_resume(struct work_struct *ws) -{ - struct usb_hub *hub = container_of(ws, struct usb_hub, post_resume_work.work); - - usb_autopm_put_interface_async(to_usb_interface(hub->intfdev)); - hub_put(hub); -} - enum hub_quiescing_type { HUB_DISCONNECT, HUB_PRE_RESET, HUB_SUSPEND }; @@ -1382,7 +1356,6 @@ static void hub_quiesce(struct usb_hub *hub, enum hub_quiescing_type type) /* Stop hub_wq and related activity */ del_timer_sync(&hub->irq_urb_retry); - flush_delayed_work(&hub->post_resume_work); usb_kill_urb(hub->urb); if (hub->has_indicators) cancel_delayed_work_sync(&hub->leds); @@ -1941,7 +1914,6 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) hub->hdev = hdev; INIT_DELAYED_WORK(&hub->leds, led_work); INIT_DELAYED_WORK(&hub->init_work, NULL); - INIT_DELAYED_WORK(&hub->post_resume_work, hub_post_resume); INIT_WORK(&hub->events, hub_event); INIT_LIST_HEAD(&hub->onboard_hub_devs); spin_lock_init(&hub->irq_urb_lock); @@ -5714,7 +5686,6 @@ static void port_event(struct usb_hub *hub, int port1) struct usb_device *hdev = hub->hdev; u16 portstatus, portchange; int i = 0; - int err; connect_change = test_bit(port1, hub->change_bits); clear_bit(port1, hub->event_bits); @@ -5811,11 +5782,8 @@ static void port_event(struct usb_hub *hub, int port1) } else if (!udev || !(portstatus & USB_PORT_STAT_CONNECTION) || udev->state == USB_STATE_NOTATTACHED) { dev_dbg(&port_dev->dev, "do warm reset, port only\n"); - err = hub_port_reset(hub, port1, NULL, - HUB_BH_RESET_TIME, true); - if (!udev && err == -ENOTCONN) - connect_change = 0; - else if (err < 0) + if (hub_port_reset(hub, port1, NULL, + HUB_BH_RESET_TIME, true) < 0) hub_port_disable(hub, port1, 1); } else { dev_dbg(&port_dev->dev, "do warm reset, full device\n"); @@ -6135,7 +6103,6 @@ static int usb_reset_and_verify_device(struct usb_device *udev) struct usb_hub *parent_hub; struct usb_hcd *hcd = bus_to_hcd(udev->bus); struct usb_device_descriptor descriptor; - struct usb_interface *intf; struct usb_host_bos *bos; int i, j, ret = 0; int port1 = udev->portnum; @@ -6193,18 +6160,6 @@ static int usb_reset_and_verify_device(struct usb_device *udev) if (!udev->actconfig) goto done; - /* - * Some devices can't handle setting default altsetting 0 with a - * Set-Interface request. Disable host-side endpoints of those - * interfaces here. Enable and reset them back after host has set - * its internal endpoint structures during usb_hcd_alloc_bandwith() - */ - for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { - intf = udev->actconfig->interface[i]; - if (intf->cur_altsetting->desc.bAlternateSetting == 0) - usb_disable_interface(udev, intf, true); - } - mutex_lock(hcd->bandwidth_mutex); ret = usb_hcd_alloc_bandwidth(udev, udev->actconfig, NULL, NULL); if (ret < 0) { @@ -6236,11 +6191,12 @@ static int usb_reset_and_verify_device(struct usb_device *udev) */ for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { struct usb_host_config *config = udev->actconfig; + struct usb_interface *intf = config->interface[i]; struct usb_interface_descriptor *desc; - intf = config->interface[i]; desc = &intf->cur_altsetting->desc; if (desc->bAlternateSetting == 0) { + usb_disable_interface(udev, intf, true); usb_enable_interface(udev, intf, true); ret = 0; } else { diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h index 59c426e0e0b9d42d24fb2e97848fd22154f4eeda..6610cf6131c673cf812b55627a1f9b00a12b159d 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h @@ -69,7 +69,6 @@ struct usb_hub { u8 indicator[USB_MAXCHILDREN]; struct delayed_work leds; struct delayed_work init_work; - struct delayed_work post_resume_work; struct work_struct events; spinlock_t irq_urb_lock; struct timer_list irq_urb_retry; diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 46db600fdd824ea51c15722a46c91d2363f13697..4903c733d37ae7e65fb52786b4254de16fedc531 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c @@ -227,8 +227,7 @@ static const struct usb_device_id usb_quirk_list[] = { { USB_DEVICE(0x046a, 0x0023), .driver_info = USB_QUIRK_RESET_RESUME }, /* Logitech HD Webcam C270 */ - { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME | - USB_QUIRK_NO_LPM}, + { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME }, /* Logitech HD Pro Webcams C920, C920-C, C922, C925e and C930e */ { USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT }, @@ -373,9 +372,6 @@ static const struct usb_device_id usb_quirk_list[] = { /* SanDisk Corp. SanDisk 3.2Gen1 */ { USB_DEVICE(0x0781, 0x55a3), .driver_info = USB_QUIRK_DELAY_INIT }, - /* SanDisk Extreme 55AE */ - { USB_DEVICE(0x0781, 0x55ae), .driver_info = USB_QUIRK_NO_LPM }, - /* Realforce 87U Keyboard */ { USB_DEVICE(0x0853, 0x011b), .driver_info = USB_QUIRK_NO_LPM }, diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index da6d5e5f79e7a592c74c6e29ea4ea81b2b6a006e..2a938cf47ccd6239dd0f1a9d8eed95618de75d64 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -695,16 +695,15 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, device_set_of_node_from_dev(&dev->dev, bus->sysdev); dev_set_name(&dev->dev, "usb%d", bus->busnum); } else { - int n; - /* match any labeling on the hubs; it's one-based */ if (parent->devpath[0] == '0') { - n = snprintf(dev->devpath, sizeof(dev->devpath), "%d", port1); + snprintf(dev->devpath, sizeof dev->devpath, + "%d", port1); /* Root ports are not counted in route string */ dev->route = 0; } else { - n = snprintf(dev->devpath, sizeof(dev->devpath), "%s.%d", - parent->devpath, port1); + snprintf(dev->devpath, sizeof dev->devpath, + "%s.%d", parent->devpath, port1); /* Route string assumes hubs have less than 16 ports */ if (port1 < 15) dev->route = parent->route + @@ -713,11 +712,6 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, dev->route = parent->route + (15 << ((parent->level - 1)*4)); } - if (n >= sizeof(dev->devpath)) { - usb_put_hcd(bus_to_hcd(bus)); - usb_put_dev(dev); - return NULL; - } dev->dev.parent = &parent->dev; dev_set_name(&dev->dev, "%d-%s", bus->busnum, dev->devpath); diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index c0db3c52831a2da6c337aca91b08d37390d81401..ce20c06a902531f19ac550972640abd71f5a312f 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -4601,12 +4601,6 @@ static int dwc2_hsotg_udc_stop(struct usb_gadget *gadget) if (!hsotg) return -ENODEV; - /* Exit clock gating when driver is stopped. */ - if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_NONE && - hsotg->bus_suspended && !hsotg->params.no_clock_gating) { - dwc2_gadget_exit_clock_gating(hsotg, 0); - } - /* all endpoints should be shutdown */ for (ep = 1; ep < hsotg->num_of_eps; ep++) { if (hsotg->eps_in[ep]) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index b7eaad099309c5cb37f3e45ae44d6af1e57a856c..30404461ef7de31b8b205e746faf84c8a8070117 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -2128,7 +2128,6 @@ static int dwc3_core_init_for_resume(struct dwc3 *dwc) static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) { u32 reg; - int ret; if (!pm_runtime_suspended(dwc->dev) && !PMSG_IS_AUTO(msg)) { dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) & @@ -2147,9 +2146,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) case DWC3_GCTL_PRTCAP_DEVICE: if (pm_runtime_suspended(dwc->dev)) break; - ret = dwc3_gadget_suspend(dwc); - if (ret) - return ret; + dwc3_gadget_suspend(dwc); synchronize_irq(dwc->irq_gadget); dwc3_core_exit(dwc); break; @@ -2180,9 +2177,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) break; if (dwc->current_otg_role == DWC3_OTG_ROLE_DEVICE) { - ret = dwc3_gadget_suspend(dwc); - if (ret) - return ret; + dwc3_gadget_suspend(dwc); synchronize_irq(dwc->irq_gadget); } diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c index add808efb871657b10258d678f316ed024a26266..82544374110b030274602e9b19a941a90f2dea5d 100644 --- a/drivers/usb/dwc3/dwc3-qcom.c +++ b/drivers/usb/dwc3/dwc3-qcom.c @@ -854,13 +854,13 @@ static int dwc3_qcom_probe(struct platform_device *pdev) ret = reset_control_deassert(qcom->resets); if (ret) { dev_err(&pdev->dev, "failed to deassert resets, err=%d\n", ret); - return ret; + goto reset_assert; } ret = dwc3_qcom_clk_init(qcom, of_clk_get_parent_count(np)); if (ret) { dev_err_probe(dev, ret, "failed to get clocks\n"); - return ret; + goto reset_assert; } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -964,6 +964,8 @@ static int dwc3_qcom_probe(struct platform_device *pdev) clk_disable_unprepare(qcom->clks[i]); clk_put(qcom->clks[i]); } +reset_assert: + reset_control_assert(qcom->resets); return ret; } @@ -993,6 +995,8 @@ static void dwc3_qcom_remove(struct platform_device *pdev) qcom->num_clocks = 0; dwc3_qcom_interconnect_exit(qcom); + reset_control_assert(qcom->resets); + pm_runtime_allow(dev); pm_runtime_disable(dev); } diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index a17af4ab20a32361344fd6b5b3bd76c19b0104d1..f51d743bb3ecc63dff0d564c4982e58927fb79b7 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -4802,15 +4802,8 @@ int dwc3_gadget_suspend(struct dwc3 *dwc) int ret; ret = dwc3_gadget_soft_disconnect(dwc); - /* - * Attempt to reset the controller's state. Likely no - * communication can be established until the host - * performs a port reset. - */ - if (ret && dwc->softconnect) { - dwc3_gadget_soft_connect(dwc); - return -EAGAIN; - } + if (ret) + goto err; spin_lock_irqsave(&dwc->lock, flags); if (dwc->gadget_driver) @@ -4818,6 +4811,17 @@ int dwc3_gadget_suspend(struct dwc3 *dwc) spin_unlock_irqrestore(&dwc->lock, flags); return 0; + +err: + /* + * Attempt to reset the controller's state. Likely no + * communication can be established until the host + * performs a port reset. + */ + if (dwc->softconnect) + dwc3_gadget_soft_connect(dwc); + + return ret; } int dwc3_gadget_resume(struct dwc3 *dwc) diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 4c89f7629d5308d731e60df8fc940ca6f9a4b277..3a80600d68068fd2da273de454a244318fbea18c 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -1062,8 +1062,6 @@ static ssize_t webusb_landingPage_store(struct config_item *item, const char *pa unsigned int bytes_to_strip = 0; int l = len; - if (!len) - return len; if (page[l - 1] == '\n') { --l; ++bytes_to_strip; @@ -1187,8 +1185,6 @@ static ssize_t os_desc_qw_sign_store(struct config_item *item, const char *page, struct gadget_info *gi = os_desc_item_to_gadget_info(item); int res, l; - if (!len) - return len; l = min((int)len, OS_STRING_QW_SIGN_LEN >> 1); if (page[l - 1] == '\n') --l; diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c index 2f1ec03d17d6db3624f00e948f6f57ea983998b4..2db01e03bfbf0b5b9d577bb15ce5e27a714202a0 100644 --- a/drivers/usb/gadget/function/f_hid.c +++ b/drivers/usb/gadget/function/f_hid.c @@ -118,8 +118,8 @@ static struct hid_descriptor hidg_desc = { .bcdHID = cpu_to_le16(0x0101), .bCountryCode = 0x00, .bNumDescriptors = 0x1, - /*.rpt_desc.bDescriptorType = DYNAMIC */ - /*.rpt_desc.wDescriptorLength = DYNAMIC */ + /*.desc[0].bDescriptorType = DYNAMIC */ + /*.desc[0].wDescriptorLenght = DYNAMIC */ }; /* Super-Speed Support */ @@ -728,8 +728,8 @@ static int hidg_setup(struct usb_function *f, struct hid_descriptor hidg_desc_copy = hidg_desc; VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: HID\n"); - hidg_desc_copy.rpt_desc.bDescriptorType = HID_DT_REPORT; - hidg_desc_copy.rpt_desc.wDescriptorLength = + hidg_desc_copy.desc[0].bDescriptorType = HID_DT_REPORT; + hidg_desc_copy.desc[0].wDescriptorLength = cpu_to_le16(hidg->report_desc_length); length = min_t(unsigned short, length, @@ -970,8 +970,8 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f) * We can use hidg_desc struct here but we should not relay * that its content won't change after returning from this function. */ - hidg_desc.rpt_desc.bDescriptorType = HID_DT_REPORT; - hidg_desc.rpt_desc.wDescriptorLength = + hidg_desc.desc[0].bDescriptorType = HID_DT_REPORT; + hidg_desc.desc[0].wDescriptorLength = cpu_to_le16(hidg->report_desc_length); hidg_hs_in_ep_desc.bEndpointAddress = diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c index 5d0d8949539539fd4c979ca5607d485b9614472d..a7cd0a06879e619720efb1285428312d0c617b53 100644 --- a/drivers/usb/gadget/function/f_tcm.c +++ b/drivers/usb/gadget/function/f_tcm.c @@ -1297,14 +1297,14 @@ static struct se_portal_group *usbg_make_tpg(struct se_wwn *wwn, struct usbg_tport *tport = container_of(wwn, struct usbg_tport, tport_wwn); struct usbg_tpg *tpg; - u16 tpgt; + unsigned long tpgt; int ret; struct f_tcm_opts *opts; unsigned i; if (strstr(name, "tpgt_") != name) return ERR_PTR(-EINVAL); - if (kstrtou16(name + 5, 0, &tpgt)) + if (kstrtoul(name + 5, 0, &tpgt) || tpgt > UINT_MAX) return ERR_PTR(-EINVAL); ret = -ENODEV; mutex_lock(&tpg_instances_lock); diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c index 4925c874316cb2d7f73d6c686229dff4967c80f6..729b0472bab0982a9b12bd27b96af3489b4a2032 100644 --- a/drivers/usb/gadget/function/u_serial.c +++ b/drivers/usb/gadget/function/u_serial.c @@ -291,8 +291,8 @@ __acquires(&port->port_lock) break; } - if (do_tty_wake) - tty_port_tty_wakeup(&port->port); + if (do_tty_wake && port->port.tty) + tty_wakeup(port->port.tty); return status; } @@ -539,16 +539,20 @@ static int gs_alloc_requests(struct usb_ep *ep, struct list_head *head, static int gs_start_io(struct gs_port *port) { struct list_head *head = &port->read_pool; - struct usb_ep *ep = port->port_usb->out; + struct usb_ep *ep; int status; unsigned started; + if (!port->port_usb || !port->port.tty) + return -EIO; + /* Allocate RX and TX I/O buffers. We can't easily do this much * earlier (with GFP_KERNEL) because the requests are coupled to * endpoints, as are the packet sizes we'll be using. Different * configurations may use different endpoints with a given port; * and high speed vs full speed changes packet sizes too. */ + ep = port->port_usb->out; status = gs_alloc_requests(ep, head, gs_read_complete, &port->read_allocated); if (status) @@ -569,7 +573,7 @@ static int gs_start_io(struct gs_port *port) gs_start_tx(port); /* Unblock any pending writes into our circular buffer, in case * we didn't in gs_start_tx() */ - tty_port_tty_wakeup(&port->port); + tty_wakeup(port->port.tty); } else { /* Free reqs only if we are still connected */ if (port->port_usb) { diff --git a/drivers/usb/host/xhci-dbgcap.c b/drivers/usb/host/xhci-dbgcap.c index 2cd8c757c6534203ae2449f8b06c0ceeadf775c6..fab9e6be4e27ae096ceb12d17eaeb775a7c31939 100644 --- a/drivers/usb/host/xhci-dbgcap.c +++ b/drivers/usb/host/xhci-dbgcap.c @@ -639,10 +639,6 @@ static void xhci_dbc_stop(struct xhci_dbc *dbc) case DS_DISABLED: return; case DS_CONFIGURED: - spin_lock(&dbc->lock); - xhci_dbc_flush_requests(dbc); - spin_unlock(&dbc->lock); - if (dbc->driver->disconnect) dbc->driver->disconnect(dbc); break; diff --git a/drivers/usb/host/xhci-dbgtty.c b/drivers/usb/host/xhci-dbgtty.c index aa689fbd3dce67419191866828f27a0af5916443..0266c2f5bc0d8e77891486eac784369717cc541f 100644 --- a/drivers/usb/host/xhci-dbgtty.c +++ b/drivers/usb/host/xhci-dbgtty.c @@ -585,7 +585,6 @@ int dbc_tty_init(void) dbc_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; dbc_tty_driver->subtype = SERIAL_TYPE_NORMAL; dbc_tty_driver->init_termios = tty_std_termios; - dbc_tty_driver->init_termios.c_lflag &= ~ECHO; dbc_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; dbc_tty_driver->init_termios.c_ispeed = 9600; diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index cceb69d4f61e1c292c71193d5695ed1e539e227a..22cca89efbfd7251e7ccd4de40dd615097a85114 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1436,10 +1436,6 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, /* Periodic endpoint bInterval limit quirk */ if (usb_endpoint_xfer_int(&ep->desc) || usb_endpoint_xfer_isoc(&ep->desc)) { - if ((xhci->quirks & XHCI_LIMIT_ENDPOINT_INTERVAL_9) && - interval >= 9) { - interval = 8; - } if ((xhci->quirks & XHCI_LIMIT_ENDPOINT_INTERVAL_7) && udev->speed >= USB_SPEED_HIGH && interval >= 7) { diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 5abc48f148dcbc4935848887468c7a9ed6ca8e25..c1a172b6feae84dea2448cf6e0430111092e66ab 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -65,22 +65,12 @@ #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI 0x51ed #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_N_PCH_XHCI 0x54ed -#define PCI_DEVICE_ID_AMD_ARIEL_TYPEC_XHCI 0x13ed -#define PCI_DEVICE_ID_AMD_ARIEL_TYPEA_XHCI 0x13ee -#define PCI_DEVICE_ID_AMD_STARSHIP_XHCI 0x148c -#define PCI_DEVICE_ID_AMD_FIREFLIGHT_15D4_XHCI 0x15d4 -#define PCI_DEVICE_ID_AMD_FIREFLIGHT_15D5_XHCI 0x15d5 -#define PCI_DEVICE_ID_AMD_RAVEN_15E0_XHCI 0x15e0 -#define PCI_DEVICE_ID_AMD_RAVEN_15E1_XHCI 0x15e1 -#define PCI_DEVICE_ID_AMD_RAVEN2_XHCI 0x15e5 #define PCI_DEVICE_ID_AMD_RENOIR_XHCI 0x1639 #define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 #define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba #define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb #define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc -#define PCI_DEVICE_ID_ATI_NAVI10_7316_XHCI 0x7316 - #define PCI_DEVICE_ID_ASMEDIA_1042_XHCI 0x1042 #define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142 #define PCI_DEVICE_ID_ASMEDIA_1142_XHCI 0x1242 @@ -358,21 +348,6 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) if (pdev->vendor == PCI_VENDOR_ID_NEC) xhci->quirks |= XHCI_NEC_HOST; - if (pdev->vendor == PCI_VENDOR_ID_AMD && - (pdev->device == PCI_DEVICE_ID_AMD_ARIEL_TYPEC_XHCI || - pdev->device == PCI_DEVICE_ID_AMD_ARIEL_TYPEA_XHCI || - pdev->device == PCI_DEVICE_ID_AMD_STARSHIP_XHCI || - pdev->device == PCI_DEVICE_ID_AMD_FIREFLIGHT_15D4_XHCI || - pdev->device == PCI_DEVICE_ID_AMD_FIREFLIGHT_15D5_XHCI || - pdev->device == PCI_DEVICE_ID_AMD_RAVEN_15E0_XHCI || - pdev->device == PCI_DEVICE_ID_AMD_RAVEN_15E1_XHCI || - pdev->device == PCI_DEVICE_ID_AMD_RAVEN2_XHCI)) - xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_9; - - if (pdev->vendor == PCI_VENDOR_ID_ATI && - pdev->device == PCI_DEVICE_ID_ATI_NAVI10_7316_XHCI) - xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_9; - if (pdev->vendor == PCI_VENDOR_ID_AMD && xhci->hci_version == 0x96) xhci->quirks |= XHCI_AMD_0x96_HOST; diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 749ba3596c2b3ff1b9c54d1e8192d36265715d3d..8832e0cedadaffcb3516d8467954b4db7b7f49d4 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -313,8 +313,7 @@ int xhci_plat_probe(struct platform_device *pdev, struct device *sysdev, const s } usb3_hcd = xhci_get_usb3_hcd(xhci); - if (usb3_hcd && HCC_MAX_PSA(xhci->hcc_params) >= 4 && - !(xhci->quirks & XHCI_BROKEN_STREAMS)) + if (usb3_hcd && HCC_MAX_PSA(xhci->hcc_params) >= 4) usb3_hcd->can_do_streams = 1; if (xhci->shared_hcd) { diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 159cdfc71290709c573d262534cf32fe9b31dac7..74bdd035d756a400e2e903e0c0135c20de685ae3 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1659,7 +1659,6 @@ struct xhci_hcd { #define XHCI_WRITE_64_HI_LO BIT_ULL(47) #define XHCI_CDNS_SCTX_QUIRK BIT_ULL(48) #define XHCI_ETRON_HOST BIT_ULL(49) -#define XHCI_LIMIT_ENDPOINT_INTERVAL_9 BIT_ULL(50) unsigned int num_active_eps; unsigned int limit_active_eps; diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index cfac9792786549f7e39a335f213d5fd6efccad65..f175cb2c3e7bd2722e04fb4532a86a9a199eb05d 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -1925,7 +1925,6 @@ static int musb_gadget_stop(struct usb_gadget *g) * gadget driver here and have everything work; * that currently misbehaves. */ - usb_gadget_set_state(g, USB_STATE_NOTATTACHED); /* Force check of devctl register for PM runtime */ pm_runtime_mark_last_busy(musb->controller); @@ -2032,7 +2031,6 @@ void musb_g_disconnect(struct musb *musb) case OTG_STATE_B_PERIPHERAL: case OTG_STATE_B_IDLE: musb_set_state(musb, OTG_STATE_B_IDLE); - usb_gadget_set_state(&musb->g, USB_STATE_NOTATTACHED); break; case OTG_STATE_B_SRP_INIT: break; diff --git a/drivers/usb/renesas_usbhs/common.c b/drivers/usb/renesas_usbhs/common.c index b720899725e5378006c8aabcb0c35b76e7770b49..205820544f6f9e5c021da655750d936ea89f8a16 100644 --- a/drivers/usb/renesas_usbhs/common.c +++ b/drivers/usb/renesas_usbhs/common.c @@ -674,29 +674,10 @@ static int usbhs_probe(struct platform_device *pdev) INIT_DELAYED_WORK(&priv->notify_hotplug_work, usbhsc_notify_hotplug); spin_lock_init(usbhs_priv_to_lock(priv)); - /* - * Acquire clocks and enable power management (PM) early in the - * probe process, as the driver accesses registers during - * initialization. Ensure the device is active before proceeding. - */ - pm_runtime_enable(dev); - - ret = usbhsc_clk_get(dev, priv); - if (ret) - goto probe_pm_disable; - - ret = pm_runtime_resume_and_get(dev); - if (ret) - goto probe_clk_put; - - ret = usbhsc_clk_prepare_enable(priv); - if (ret) - goto probe_pm_put; - /* call pipe and module init */ ret = usbhs_pipe_probe(priv); if (ret < 0) - goto probe_clk_dis_unprepare; + return ret; ret = usbhs_fifo_probe(priv); if (ret < 0) @@ -713,6 +694,10 @@ static int usbhs_probe(struct platform_device *pdev) if (ret) goto probe_fail_rst; + ret = usbhsc_clk_get(dev, priv); + if (ret) + goto probe_fail_clks; + /* * deviece reset here because * USB device might be used in boot loader. @@ -725,7 +710,7 @@ static int usbhs_probe(struct platform_device *pdev) if (ret) { dev_warn(dev, "USB function not selected (GPIO)\n"); ret = -ENOTSUPP; - goto probe_assert_rest; + goto probe_end_mod_exit; } } @@ -739,19 +724,14 @@ static int usbhs_probe(struct platform_device *pdev) ret = usbhs_platform_call(priv, hardware_init, pdev); if (ret < 0) { dev_err(dev, "platform init failed.\n"); - goto probe_assert_rest; + goto probe_end_mod_exit; } /* reset phy for connection */ usbhs_platform_call(priv, phy_reset, pdev); - /* - * Disable the clocks that were enabled earlier in the probe path, - * and let the driver handle the clocks beyond this point. - */ - usbhsc_clk_disable_unprepare(priv); - pm_runtime_put(dev); - + /* power control */ + pm_runtime_enable(dev); if (!usbhs_get_dparam(priv, runtime_pwctrl)) { usbhsc_power_ctrl(priv, 1); usbhs_mod_autonomy_mode(priv); @@ -768,7 +748,9 @@ static int usbhs_probe(struct platform_device *pdev) return ret; -probe_assert_rest: +probe_end_mod_exit: + usbhsc_clk_put(priv); +probe_fail_clks: reset_control_assert(priv->rsts); probe_fail_rst: usbhs_mod_remove(priv); @@ -776,14 +758,6 @@ static int usbhs_probe(struct platform_device *pdev) usbhs_fifo_remove(priv); probe_end_pipe_exit: usbhs_pipe_remove(priv); -probe_clk_dis_unprepare: - usbhsc_clk_disable_unprepare(priv); -probe_pm_put: - pm_runtime_put(dev); -probe_clk_put: - usbhsc_clk_put(priv); -probe_pm_disable: - pm_runtime_disable(dev); dev_info(dev, "probe failed (%d)\n", ret); diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 8906c9dc348edd1c3d520fbf170be0191140e24c..b583b31ea5e72e15cbefcdec89f0ae64134cc82c 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -803,8 +803,6 @@ static const struct usb_device_id id_table_combined[] = { .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID), .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, - { USB_DEVICE(FTDI_NDI_VID, FTDI_NDI_EMGUIDE_GEMINI_PID), - .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, { USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) }, { USB_DEVICE(FTDI_VID, RTSYSTEMS_USB_VX8_PID) }, diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 4cc1fae8acb970cc40473dc12ad0295b42b19ecc..9acb6f8373276383f4f238623123432cbdeb7c6b 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h @@ -204,9 +204,6 @@ #define FTDI_NDI_FUTURE_3_PID 0xDA73 /* NDI future device #3 */ #define FTDI_NDI_AURORA_SCU_PID 0xDA74 /* NDI Aurora SCU */ -#define FTDI_NDI_VID 0x23F2 -#define FTDI_NDI_EMGUIDE_GEMINI_PID 0x0003 /* NDI Emguide Gemini */ - /* * ChamSys Limited (www.chamsys.co.uk) USB wing/interface product IDs */ diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 6c6387d39db82c6abca79f2e938be560c59ba7fc..5d669511609892aa997b839ab3fc38f7b2635472 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -1415,9 +1415,6 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(5) }, { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d0, 0xff, 0xff, 0x40) }, { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d0, 0xff, 0xff, 0x60) }, - { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10c7, 0xff, 0xff, 0x30), /* Telit FE910C04 (ECM) */ - .driver_info = NCTRL(4) }, - { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10c7, 0xff, 0xff, 0x40) }, { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d1, 0xff, 0xff, 0x30), /* Telit FN990B (MBIM) */ .driver_info = NCTRL(6) }, { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d1, 0xff, 0xff, 0x40) }, @@ -2346,8 +2343,6 @@ static const struct usb_device_id option_ids[] = { .driver_info = RSVD(3) }, { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe145, 0xff), /* Foxconn T99W651 RNDIS */ .driver_info = RSVD(5) | RSVD(6) }, - { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe167, 0xff), /* Foxconn T99W640 MBIM */ - .driver_info = RSVD(3) }, { USB_DEVICE(0x1508, 0x1001), /* Fibocom NL668 (IOT version) */ .driver_info = RSVD(4) | RSVD(5) | RSVD(6) }, { USB_DEVICE(0x1782, 0x4d10) }, /* Fibocom L610 (AT mode) */ diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 1ba2287d4d456fe2bd92ebb494671edbc327e4f3..8e327fcb222f73e88c898968d502da7480a5b79f 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c @@ -457,8 +457,6 @@ static int pl2303_detect_type(struct usb_serial *serial) case 0x605: case 0x700: /* GR */ case 0x705: - case 0x905: /* GT-2AB */ - case 0x1005: /* GC-Q20 */ return TYPE_HXN; } break; diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h index 1477e31d776327d8ccd86dc2864e19c5f3fa0007..d460d71b425783ba9731433b93d05deb1e315901 100644 --- a/drivers/usb/storage/unusual_uas.h +++ b/drivers/usb/storage/unusual_uas.h @@ -52,13 +52,6 @@ UNUSUAL_DEV(0x059f, 0x1061, 0x0000, 0x9999, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME), -/* Reported-by: Zhihong Zhou */ -UNUSUAL_DEV(0x0781, 0x55e8, 0x0000, 0x9999, - "SanDisk", - "", - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_IGNORE_UAS), - /* Reported-by: Hongling Zeng */ UNUSUAL_DEV(0x090c, 0x2000, 0x0000, 0x9999, "Hiksemi", diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c index 7eb78885fa2b3a660a73ed144775b023ac7af58a..ccff838ab89e120d1961f94d6715c044bc5b5921 100644 --- a/drivers/usb/typec/altmodes/displayport.c +++ b/drivers/usb/typec/altmodes/displayport.c @@ -323,9 +323,6 @@ static int dp_altmode_vdm(struct typec_altmode *alt, break; case CMDT_RSP_NAK: switch (cmd) { - case DP_CMD_STATUS_UPDATE: - dp->state = DP_STATE_EXIT; - break; case DP_CMD_CONFIGURE: dp->data.conf = 0; ret = dp_altmode_configured(dp); @@ -527,7 +524,7 @@ static ssize_t pin_assignment_show(struct device *dev, assignments = get_current_pin_assignments(dp); - for (i = 0; assignments && i < DP_PIN_ASSIGN_MAX; assignments >>= 1, i++) { + for (i = 0; assignments; assignments >>= 1, i++) { if (assignments & 1) { if (i == cur) len += sprintf(buf + len, "[%s] ", diff --git a/drivers/usb/typec/mux.c b/drivers/usb/typec/mux.c index a5b2a6f9c57950f88451cd324acbe27feb9f82e4..80dd91938d96066d5286d8096cefb47c4b355c7c 100644 --- a/drivers/usb/typec/mux.c +++ b/drivers/usb/typec/mux.c @@ -214,7 +214,7 @@ int typec_switch_set(struct typec_switch *sw, sw_dev = sw->sw_devs[i]; ret = sw_dev->set(sw_dev, orientation); - if (ret && ret != -EOPNOTSUPP) + if (ret) return ret; } @@ -378,7 +378,7 @@ int typec_mux_set(struct typec_mux *mux, struct typec_mux_state *state) mux_dev = mux->mux_devs[i]; ret = mux_dev->set(mux_dev, state); - if (ret && ret != -EOPNOTSUPP) + if (ret) return ret; } diff --git a/drivers/usb/typec/tcpm/tcpci_maxim_core.c b/drivers/usb/typec/tcpm/tcpci_maxim_core.c index e460b956ab712369f6bff8cec9ddf44b46dc813c..9454b12a073c96aecb2241a90b562c2190bfc2b5 100644 --- a/drivers/usb/typec/tcpm/tcpci_maxim_core.c +++ b/drivers/usb/typec/tcpm/tcpci_maxim_core.c @@ -145,8 +145,7 @@ static void process_rx(struct max_tcpci_chip *chip, u16 status) return; } - if (count > sizeof(struct pd_message) + 1 || - count + 1 > TCPC_RECEIVE_BUFFER_LEN) { + if (count > sizeof(struct pd_message) || count + 1 > TCPC_RECEIVE_BUFFER_LEN) { dev_err(chip->dev, "Invalid TCPC_RX_BYTE_CNT %d\n", count); return; } diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index 5774b50eeaf7f769e630e939dd913b58012112f7..bfcbccb400c3a81db1fec866f24b49e127500d53 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -1041,7 +1041,7 @@ static int tcpm_set_attached_state(struct tcpm_port *port, bool attached) port->data_role); } -static int tcpm_set_roles(struct tcpm_port *port, bool attached, int state, +static int tcpm_set_roles(struct tcpm_port *port, bool attached, enum typec_role role, enum typec_data_role data) { enum typec_orientation orientation; @@ -1078,7 +1078,7 @@ static int tcpm_set_roles(struct tcpm_port *port, bool attached, int state, } } - ret = tcpm_mux_set(port, state, usb_role, orientation); + ret = tcpm_mux_set(port, TYPEC_STATE_USB, usb_role, orientation); if (ret < 0) return ret; @@ -3622,6 +3622,16 @@ static int tcpm_src_attach(struct tcpm_port *port) tcpm_enable_auto_vbus_discharge(port, true); + ret = tcpm_set_roles(port, true, TYPEC_SOURCE, tcpm_data_role_for_source(port)); + if (ret < 0) + return ret; + + if (port->pd_supported) { + ret = port->tcpc->set_pd_rx(port->tcpc, true); + if (ret < 0) + goto out_disable_mux; + } + /* * USB Type-C specification, version 1.2, * chapter 4.5.2.2.8.1 (Attached.SRC Requirements) @@ -3631,24 +3641,13 @@ static int tcpm_src_attach(struct tcpm_port *port) (polarity == TYPEC_POLARITY_CC2 && port->cc1 == TYPEC_CC_RA)) { ret = tcpm_set_vconn(port, true); if (ret < 0) - return ret; + goto out_disable_pd; } ret = tcpm_set_vbus(port, true); if (ret < 0) goto out_disable_vconn; - ret = tcpm_set_roles(port, true, TYPEC_STATE_USB, TYPEC_SOURCE, - tcpm_data_role_for_source(port)); - if (ret < 0) - goto out_disable_vbus; - - if (port->pd_supported) { - ret = port->tcpc->set_pd_rx(port->tcpc, true); - if (ret < 0) - goto out_disable_mux; - } - port->pd_capable = false; port->partner = NULL; @@ -3658,14 +3657,14 @@ static int tcpm_src_attach(struct tcpm_port *port) return 0; +out_disable_vconn: + tcpm_set_vconn(port, false); +out_disable_pd: + if (port->pd_supported) + port->tcpc->set_pd_rx(port->tcpc, false); out_disable_mux: tcpm_mux_set(port, TYPEC_STATE_SAFE, USB_ROLE_NONE, TYPEC_ORIENTATION_NONE); -out_disable_vbus: - tcpm_set_vbus(port, false); -out_disable_vconn: - tcpm_set_vconn(port, false); - return ret; } @@ -3781,8 +3780,7 @@ static int tcpm_snk_attach(struct tcpm_port *port) tcpm_enable_auto_vbus_discharge(port, true); - ret = tcpm_set_roles(port, true, TYPEC_STATE_USB, - TYPEC_SINK, tcpm_data_role_for_sink(port)); + ret = tcpm_set_roles(port, true, TYPEC_SINK, tcpm_data_role_for_sink(port)); if (ret < 0) return ret; @@ -3804,24 +3802,12 @@ static void tcpm_snk_detach(struct tcpm_port *port) static int tcpm_acc_attach(struct tcpm_port *port) { int ret; - enum typec_role role; - enum typec_data_role data; - int state = TYPEC_STATE_USB; if (port->attached) return 0; - role = tcpm_port_is_sink(port) ? TYPEC_SINK : TYPEC_SOURCE; - data = tcpm_port_is_sink(port) ? tcpm_data_role_for_sink(port) - : tcpm_data_role_for_source(port); - - if (tcpm_port_is_audio(port)) - state = TYPEC_MODE_AUDIO; - - if (tcpm_port_is_debug(port)) - state = TYPEC_MODE_DEBUG; - - ret = tcpm_set_roles(port, true, state, role, data); + ret = tcpm_set_roles(port, true, TYPEC_SOURCE, + tcpm_data_role_for_source(port)); if (ret < 0) return ret; @@ -4523,7 +4509,7 @@ static void run_state_machine(struct tcpm_port *port) */ tcpm_set_vconn(port, false); tcpm_set_vbus(port, false); - tcpm_set_roles(port, port->self_powered, TYPEC_STATE_USB, TYPEC_SOURCE, + tcpm_set_roles(port, port->self_powered, TYPEC_SOURCE, tcpm_data_role_for_source(port)); /* * If tcpc fails to notify vbus off, TCPM will wait for PD_T_SAFE_0V + @@ -4555,7 +4541,7 @@ static void run_state_machine(struct tcpm_port *port) tcpm_set_vconn(port, false); if (port->pd_capable) tcpm_set_charge(port, false); - tcpm_set_roles(port, port->self_powered, TYPEC_STATE_USB, TYPEC_SINK, + tcpm_set_roles(port, port->self_powered, TYPEC_SINK, tcpm_data_role_for_sink(port)); /* * VBUS may or may not toggle, depending on the adapter. @@ -4661,10 +4647,10 @@ static void run_state_machine(struct tcpm_port *port) case DR_SWAP_CHANGE_DR: tcpm_unregister_altmodes(port); if (port->data_role == TYPEC_HOST) - tcpm_set_roles(port, true, TYPEC_STATE_USB, port->pwr_role, + tcpm_set_roles(port, true, port->pwr_role, TYPEC_DEVICE); else - tcpm_set_roles(port, true, TYPEC_STATE_USB, port->pwr_role, + tcpm_set_roles(port, true, port->pwr_role, TYPEC_HOST); tcpm_ams_finish(port); tcpm_set_state(port, ready_state(port), 0); diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h index 7706f4e951258b25ff613c207a645624c990b29b..3bb23a2ea547ac0d4f317c1ada33a68c56181b1b 100644 --- a/drivers/usb/typec/ucsi/ucsi.h +++ b/drivers/usb/typec/ucsi/ucsi.h @@ -302,7 +302,7 @@ struct ucsi_debugfs_entry { u64 low; u64 high; } response; - int status; + u32 status; struct dentry *dentry; }; diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c index 712b178c42aae5165541581e0370093b87916d60..4d27465c8f1a893352bae1498303a5da7e4ebb6d 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -350,32 +350,6 @@ static int vf_qm_func_stop(struct hisi_qm *qm) return hisi_qm_mb(qm, QM_MB_CMD_PAUSE_QM, 0, 0, 0); } -static int vf_qm_version_check(struct acc_vf_data *vf_data, struct device *dev) -{ - switch (vf_data->acc_magic) { - case ACC_DEV_MAGIC_V2: - if (vf_data->major_ver != ACC_DRV_MAJOR_VER) { - dev_info(dev, "migration driver version<%u.%u> not match!\n", - vf_data->major_ver, vf_data->minor_ver); - return -EINVAL; - } - break; - case ACC_DEV_MAGIC_V1: - /* Correct dma address */ - vf_data->eqe_dma = vf_data->qm_eqc_dw[QM_XQC_ADDR_HIGH]; - vf_data->eqe_dma <<= QM_XQC_ADDR_OFFSET; - vf_data->eqe_dma |= vf_data->qm_eqc_dw[QM_XQC_ADDR_LOW]; - vf_data->aeqe_dma = vf_data->qm_aeqc_dw[QM_XQC_ADDR_HIGH]; - vf_data->aeqe_dma <<= QM_XQC_ADDR_OFFSET; - vf_data->aeqe_dma |= vf_data->qm_aeqc_dw[QM_XQC_ADDR_LOW]; - break; - default: - return -EINVAL; - } - - return 0; -} - static int vf_qm_check_match(struct hisi_acc_vf_core_device *hisi_acc_vdev, struct hisi_acc_vf_migration_file *migf) { @@ -389,8 +363,7 @@ static int vf_qm_check_match(struct hisi_acc_vf_core_device *hisi_acc_vdev, if (migf->total_length < QM_MATCH_SIZE || hisi_acc_vdev->match_done) return 0; - ret = vf_qm_version_check(vf_data, dev); - if (ret) { + if (vf_data->acc_magic != ACC_DEV_MAGIC) { dev_err(dev, "failed to match ACC_DEV_MAGIC\n"); return -EINVAL; } @@ -426,6 +399,13 @@ static int vf_qm_check_match(struct hisi_acc_vf_core_device *hisi_acc_vdev, return -EINVAL; } + ret = qm_write_regs(vf_qm, QM_VF_STATE, &vf_data->vf_qm_state, 1); + if (ret) { + dev_err(dev, "failed to write QM_VF_STATE\n"); + return ret; + } + + hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state; hisi_acc_vdev->match_done = true; return 0; } @@ -438,9 +418,7 @@ static int vf_qm_get_match_data(struct hisi_acc_vf_core_device *hisi_acc_vdev, int vf_id = hisi_acc_vdev->vf_id; int ret; - vf_data->acc_magic = ACC_DEV_MAGIC_V2; - vf_data->major_ver = ACC_DRV_MAJOR_VER; - vf_data->minor_ver = ACC_DRV_MINOR_VER; + vf_data->acc_magic = ACC_DEV_MAGIC; /* Save device id */ vf_data->dev_id = hisi_acc_vdev->vf_dev->device; @@ -463,19 +441,6 @@ static int vf_qm_get_match_data(struct hisi_acc_vf_core_device *hisi_acc_vdev, return 0; } -static void vf_qm_xeqc_save(struct hisi_qm *qm, - struct hisi_acc_vf_migration_file *migf) -{ - struct acc_vf_data *vf_data = &migf->vf_data; - u16 eq_head, aeq_head; - - eq_head = vf_data->qm_eqc_dw[0] & 0xFFFF; - qm_db(qm, 0, QM_DOORBELL_CMD_EQ, eq_head, 0); - - aeq_head = vf_data->qm_aeqc_dw[0] & 0xFFFF; - qm_db(qm, 0, QM_DOORBELL_CMD_AEQ, aeq_head, 0); -} - static int vf_qm_load_data(struct hisi_acc_vf_core_device *hisi_acc_vdev, struct hisi_acc_vf_migration_file *migf) { @@ -491,20 +456,6 @@ static int vf_qm_load_data(struct hisi_acc_vf_core_device *hisi_acc_vdev, if (migf->total_length < sizeof(struct acc_vf_data)) return -EINVAL; - if (!vf_data->eqe_dma || !vf_data->aeqe_dma || - !vf_data->sqc_dma || !vf_data->cqc_dma) { - dev_info(dev, "resume dma addr is NULL!\n"); - hisi_acc_vdev->vf_qm_state = QM_NOT_READY; - return 0; - } - - ret = qm_write_regs(qm, QM_VF_STATE, &vf_data->vf_qm_state, 1); - if (ret) { - dev_err(dev, "failed to write QM_VF_STATE\n"); - return -EINVAL; - } - hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state; - qm->eqe_dma = vf_data->eqe_dma; qm->aeqe_dma = vf_data->aeqe_dma; qm->sqc_dma = vf_data->sqc_dma; @@ -565,12 +516,12 @@ static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev, return -EINVAL; /* Every reg is 32 bit, the dma address is 64 bit. */ - vf_data->eqe_dma = vf_data->qm_eqc_dw[QM_XQC_ADDR_HIGH]; + vf_data->eqe_dma = vf_data->qm_eqc_dw[1]; vf_data->eqe_dma <<= QM_XQC_ADDR_OFFSET; - vf_data->eqe_dma |= vf_data->qm_eqc_dw[QM_XQC_ADDR_LOW]; - vf_data->aeqe_dma = vf_data->qm_aeqc_dw[QM_XQC_ADDR_HIGH]; + vf_data->eqe_dma |= vf_data->qm_eqc_dw[0]; + vf_data->aeqe_dma = vf_data->qm_aeqc_dw[1]; vf_data->aeqe_dma <<= QM_XQC_ADDR_OFFSET; - vf_data->aeqe_dma |= vf_data->qm_aeqc_dw[QM_XQC_ADDR_LOW]; + vf_data->aeqe_dma |= vf_data->qm_aeqc_dw[0]; /* Through SQC_BT/CQC_BT to get sqc and cqc address */ ret = qm_get_sqc(vf_qm, &vf_data->sqc_dma); @@ -586,9 +537,6 @@ static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev, } migf->total_length = sizeof(struct acc_vf_data); - /* Save eqc and aeqc interrupt information */ - vf_qm_xeqc_save(vf_qm, migf); - return 0; } @@ -1404,7 +1352,6 @@ static int hisi_acc_vfio_pci_migrn_init_dev(struct vfio_device *core_vdev) hisi_acc_vdev->vf_id = pci_iov_vf_id(pdev) + 1; hisi_acc_vdev->pf_qm = pf_qm; hisi_acc_vdev->vf_dev = pdev; - hisi_acc_vdev->vf_qm_state = QM_NOT_READY; mutex_init(&hisi_acc_vdev->state_mutex); core_vdev->migration_flags = VFIO_MIGRATION_STOP_COPY | VFIO_MIGRATION_PRE_COPY; diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h index f1d8fe86b6eb266f41ea5b4e6c1d78e05c67e623..dcabfeec6ca19d4334e746536c5e15a3572972d5 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h @@ -38,9 +38,6 @@ #define QM_REG_ADDR_OFFSET 0x0004 #define QM_XQC_ADDR_OFFSET 32U -#define QM_XQC_ADDR_LOW 0x1 -#define QM_XQC_ADDR_HIGH 0x2 - #define QM_VF_AEQ_INT_MASK 0x0004 #define QM_VF_EQ_INT_MASK 0x000c #define QM_IFC_INT_SOURCE_V 0x0020 @@ -52,15 +49,10 @@ #define QM_EQC_DW0 0X8000 #define QM_AEQC_DW0 0X8020 -#define ACC_DRV_MAJOR_VER 1 -#define ACC_DRV_MINOR_VER 0 - -#define ACC_DEV_MAGIC_V1 0XCDCDCDCDFEEDAACC -#define ACC_DEV_MAGIC_V2 0xAACCFEEDDECADEDE - struct acc_vf_data { #define QM_MATCH_SIZE offsetofend(struct acc_vf_data, qm_rsv_state) /* QM match information */ +#define ACC_DEV_MAGIC 0XCDCDCDCDFEEDAACC u64 acc_magic; u32 qp_num; u32 dev_id; @@ -68,9 +60,7 @@ struct acc_vf_data { u32 qp_base; u32 vf_qm_state; /* QM reserved match information */ - u16 major_ver; - u16 minor_ver; - u32 qm_rsv_state[2]; + u32 qm_rsv_state[3]; /* QM RW regs */ u32 aeq_int_mask; diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index 5fe7aed3672eea81b08bca53f712d03280a3c71a..eacd6ec04de5a42d58b1a677cffb12d514556f4b 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c @@ -294,7 +294,7 @@ static int vfio_dma_bitmap_alloc_all(struct vfio_iommu *iommu, size_t pgsize) struct rb_node *p; for (p = rb_prev(n); p; p = rb_prev(p)) { - struct vfio_dma *dma = rb_entry(p, + struct vfio_dma *dma = rb_entry(n, struct vfio_dma, node); vfio_dma_bitmap_free(dma); diff --git a/drivers/video/backlight/qcom-wled.c b/drivers/video/backlight/qcom-wled.c index b19e5f73de8bb46f664eb7d8e33b99edaee929d9..10129095a4c1781115798c436d0bbd41556be31d 100644 --- a/drivers/video/backlight/qcom-wled.c +++ b/drivers/video/backlight/qcom-wled.c @@ -1406,11 +1406,9 @@ static int wled_configure(struct wled *wled) wled->ctrl_addr = be32_to_cpu(*prop_addr); rc = of_property_read_string(dev->of_node, "label", &wled->name); - if (rc) { + if (rc) wled->name = devm_kasprintf(dev, GFP_KERNEL, "%pOFn", dev->of_node); - if (!wled->name) - return -ENOMEM; - } + switch (wled->version) { case 3: u32_opts = wled3_opts; diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c index d99e1b3e4e5c1a0f83e549460ba95acafb93d734..f1711b2f9ff057449bccbb923ff4812c5b67a75d 100644 --- a/drivers/video/console/dummycon.c +++ b/drivers/video/console/dummycon.c @@ -82,15 +82,6 @@ static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch) /* Redraw, so that we get putc(s) for output done while blanked */ return 1; } - -static bool dummycon_switch(struct vc_data *vc) -{ - /* - * Redraw, so that we get putc(s) for output done while switched - * away. Informs deferred consoles to take over the display. - */ - return true; -} #else static void dummycon_putc(struct vc_data *vc, int c, int ypos, int xpos) { } static void dummycon_putcs(struct vc_data *vc, const unsigned short *s, @@ -99,10 +90,6 @@ static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch) { return 0; } -static bool dummycon_switch(struct vc_data *vc) -{ - return false; -} #endif static const char *dummycon_startup(void) @@ -110,7 +97,7 @@ static const char *dummycon_startup(void) return "dummy device"; } -static void dummycon_init(struct vc_data *vc, bool init) +static void dummycon_init(struct vc_data *vc, int init) { vc->vc_can_do_color = 1; if (init) { @@ -121,8 +108,8 @@ static void dummycon_init(struct vc_data *vc, bool init) } static void dummycon_deinit(struct vc_data *vc) { } -static void dummycon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx, - unsigned int width) { } +static void dummycon_clear(struct vc_data *vc, int sy, int sx, int height, + int width) { } static void dummycon_cursor(struct vc_data *vc, int mode) { } static bool dummycon_scroll(struct vc_data *vc, unsigned int top, @@ -132,6 +119,11 @@ static bool dummycon_scroll(struct vc_data *vc, unsigned int top, return false; } +static int dummycon_switch(struct vc_data *vc) +{ + return 0; +} + /* * The console `switch' structure for the dummy console * diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c index 26b41a8f36c870b0fbefc2a254612e90332a7716..ef29b321967f07353f92714f78a58522e907ddf5 100644 --- a/drivers/video/console/mdacon.c +++ b/drivers/video/console/mdacon.c @@ -352,7 +352,7 @@ static const char *mdacon_startup(void) return "MDA-2"; } -static void mdacon_init(struct vc_data *c, bool init) +static void mdacon_init(struct vc_data *c, int init) { c->vc_complement_mask = 0x0800; /* reverse video */ c->vc_display_fg = &mda_display_fg; @@ -442,21 +442,26 @@ static void mdacon_putcs(struct vc_data *c, const unsigned short *s, } } -static void mdacon_clear(struct vc_data *c, unsigned int y, unsigned int x, - unsigned int width) +static void mdacon_clear(struct vc_data *c, int y, int x, + int height, int width) { u16 *dest = mda_addr(x, y); u16 eattr = mda_convert_attr(c->vc_video_erase_char); - if (width <= 0) + if (width <= 0 || height <= 0) return; - scr_memsetw(dest, eattr, width * 2); + if (x==0 && width==mda_num_columns) { + scr_memsetw(dest, eattr, height*width*2); + } else { + for (; height > 0; height--, dest+=mda_num_columns) + scr_memsetw(dest, eattr, width*2); + } } - -static bool mdacon_switch(struct vc_data *c) + +static int mdacon_switch(struct vc_data *c) { - return true; /* redrawing needed */ + return 1; /* redrawing needed */ } static int mdacon_blank(struct vc_data *c, int blank, int mode_switch) diff --git a/drivers/video/console/newport_con.c b/drivers/video/console/newport_con.c index 63d96c4bbdccd38799e901fd1e93883737251a6a..e8e4f82cd4a1b845c83f36d126745fffbf176b46 100644 --- a/drivers/video/console/newport_con.c +++ b/drivers/video/console/newport_con.c @@ -324,7 +324,7 @@ static const char *newport_startup(void) return NULL; } -static void newport_init(struct vc_data *vc, bool init) +static void newport_init(struct vc_data *vc, int init) { int cols, rows; @@ -346,12 +346,12 @@ static void newport_deinit(struct vc_data *c) } } -static void newport_clear(struct vc_data *vc, unsigned int sy, unsigned int sx, - unsigned int width) +static void newport_clear(struct vc_data *vc, int sy, int sx, int height, + int width) { int xend = ((sx + width) << 3) - 1; int ystart = ((sy << 4) + topscan) & 0x3ff; - int yend = (((sy + 1) << 4) + topscan - 1) & 0x3ff; + int yend = (((sy + height) << 4) + topscan - 1) & 0x3ff; if (logo_active) return; @@ -462,7 +462,7 @@ static void newport_cursor(struct vc_data *vc, int mode) } } -static bool newport_switch(struct vc_data *vc) +static int newport_switch(struct vc_data *vc) { static int logo_drawn = 0; @@ -476,7 +476,7 @@ static bool newport_switch(struct vc_data *vc) } } - return true; + return 1; } static int newport_blank(struct vc_data *c, int blank, int mode_switch) diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c index 87900600eff11f668b398b35156f8dbe3a99f994..992a4fa431aaa90cbf8f47f9d86a51169b3dda38 100644 --- a/drivers/video/console/sticon.c +++ b/drivers/video/console/sticon.c @@ -273,7 +273,7 @@ static int sticon_font_set(struct vc_data *vc, struct console_font *font, return sticon_set_font(vc, font, vpitch); } -static void sticon_init(struct vc_data *c, bool init) +static void sticon_init(struct vc_data *c, int init) { struct sti_struct *sti = sticon_sti; int vc_cols, vc_rows; @@ -300,19 +300,19 @@ static void sticon_deinit(struct vc_data *c) sticon_set_def_font(i); } -static void sticon_clear(struct vc_data *conp, unsigned int sy, unsigned int sx, - unsigned int width) +static void sticon_clear(struct vc_data *conp, int sy, int sx, int height, + int width) { - if (!width) + if (!height || !width) return; - sti_clear(sticon_sti, sy, sx, 1, width, + sti_clear(sticon_sti, sy, sx, height, width, conp->vc_video_erase_char, font_data[conp->vc_num]); } -static bool sticon_switch(struct vc_data *conp) +static int sticon_switch(struct vc_data *conp) { - return true; /* needs refreshing */ + return 1; /* needs refreshing */ } static int sticon_blank(struct vc_data *c, int blank, int mode_switch) diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index bbc362db40c5867a1abca293035a03dd6a973dc0..7ad047bcae1711fb43476a86b099ce4cfe59b20c 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -332,7 +332,7 @@ static const char *vgacon_startup(void) return display_desc; } -static void vgacon_init(struct vc_data *c, bool init) +static void vgacon_init(struct vc_data *c, int init) { struct uni_pagedict *p; @@ -349,7 +349,7 @@ static void vgacon_init(struct vc_data *c, bool init) c->vc_scan_lines = vga_scan_lines; c->vc_font.height = c->vc_cell_height = vga_video_font_height; - /* set dimensions manually if init is true since vc_resize() will fail */ + /* set dimensions manually if init != 0 since vc_resize() will fail */ if (init) { c->vc_cols = vga_video_num_columns; c->vc_rows = vga_video_num_lines; @@ -585,7 +585,7 @@ static void vgacon_doresize(struct vc_data *c, raw_spin_unlock_irqrestore(&vga_lock, flags); } -static bool vgacon_switch(struct vc_data *c) +static int vgacon_switch(struct vc_data *c) { int x = c->vc_cols * VGA_FONTWIDTH; int y = c->vc_rows * c->vc_cell_height; @@ -614,7 +614,7 @@ static bool vgacon_switch(struct vc_data *c) vgacon_doresize(c, c->vc_cols, c->vc_rows); } - return false; /* Redrawing not needed */ + return 0; /* Redrawing not needed */ } static void vga_set_palette(struct vc_data *vc, const unsigned char *table) @@ -1139,7 +1139,7 @@ static bool vgacon_scroll(struct vc_data *c, unsigned int t, unsigned int b, c->vc_screenbuf_size - delta); c->vc_origin = vga_vram_end - c->vc_screenbuf_size; vga_rolled_over = 0; - } else if (oldo - delta >= (unsigned long)c->vc_screenbuf) + } else c->vc_origin -= delta; c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size; scr_memsetw((u16 *) (c->vc_origin), c->vc_video_erase_char, @@ -1156,8 +1156,8 @@ static bool vgacon_scroll(struct vc_data *c, unsigned int t, unsigned int b, * The console `switch' structure for the VGA based console */ -static void vgacon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx, - unsigned int width) { } +static void vgacon_clear(struct vc_data *vc, int sy, int sx, int height, + int width) { } static void vgacon_putc(struct vc_data *vc, int c, int ypos, int xpos) { } static void vgacon_putcs(struct vc_data *vc, const unsigned short *s, int count, int ypos, int xpos) { } diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c index 9d095fe03e18bab2697984c8ba075127eec79cd4..7a6f9a3cb3ba34690509094d6540a8d97a6eb347 100644 --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -115,14 +115,9 @@ static signed char con2fb_map_boot[MAX_NR_CONSOLES]; static struct fb_info *fbcon_info_from_console(int console) { - signed char fb; WARN_CONSOLE_UNLOCKED(); - fb = con2fb_map[console]; - if (fb < 0 || fb >= ARRAY_SIZE(fbcon_registered_fb)) - return NULL; - - return fbcon_registered_fb[fb]; + return fbcon_registered_fb[con2fb_map[console]]; } static int logo_lines; @@ -993,7 +988,7 @@ static const char *fbcon_startup(void) return display_desc; } -static void fbcon_init(struct vc_data *vc, bool init) +static void fbcon_init(struct vc_data *vc, int init) { struct fb_info *info; struct fbcon_ops *ops; @@ -1240,8 +1235,8 @@ static void fbcon_deinit(struct vc_data *vc) * restriction is simplicity & efficiency at the moment. */ -static void __fbcon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx, - unsigned int height, unsigned int width) +static void fbcon_clear(struct vc_data *vc, int sy, int sx, int height, + int width) { struct fb_info *info = fbcon_info_from_console(vc->vc_num); struct fbcon_ops *ops = info->fbcon_par; @@ -1280,12 +1275,6 @@ static void __fbcon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx, ops->clear(vc, info, real_y(p, sy), sx, height, width, fg, bg); } -static void fbcon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx, - unsigned int width) -{ - __fbcon_clear(vc, sy, sx, 1, width); -} - static void fbcon_putcs(struct vc_data *vc, const unsigned short *s, int count, int ypos, int xpos) { @@ -1773,7 +1762,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b, case SCROLL_MOVE: fbcon_redraw_blit(vc, info, p, t, b - t - count, count); - __fbcon_clear(vc, b - count, 0, count, vc->vc_cols); + fbcon_clear(vc, b - count, 0, count, vc->vc_cols); scr_memsetw((unsigned short *) (vc->vc_origin + vc->vc_size_row * (b - count)), @@ -1796,7 +1785,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b, b - t - count, vc->vc_cols); else goto redraw_up; - __fbcon_clear(vc, b - count, 0, count, vc->vc_cols); + fbcon_clear(vc, b - count, 0, count, vc->vc_cols); break; case SCROLL_PAN_REDRAW: @@ -1814,7 +1803,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b, vc->vc_rows - b, b); } else fbcon_redraw_move(vc, p, t + count, b - t - count, t); - __fbcon_clear(vc, b - count, 0, count, vc->vc_cols); + fbcon_clear(vc, b - count, 0, count, vc->vc_cols); break; case SCROLL_PAN_MOVE: @@ -1837,14 +1826,14 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b, b - t - count, vc->vc_cols); else goto redraw_up; - __fbcon_clear(vc, b - count, 0, count, vc->vc_cols); + fbcon_clear(vc, b - count, 0, count, vc->vc_cols); break; case SCROLL_REDRAW: redraw_up: fbcon_redraw(vc, t, b - t - count, count * vc->vc_cols); - __fbcon_clear(vc, b - count, 0, count, vc->vc_cols); + fbcon_clear(vc, b - count, 0, count, vc->vc_cols); scr_memsetw((unsigned short *) (vc->vc_origin + vc->vc_size_row * (b - count)), @@ -1861,7 +1850,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b, case SCROLL_MOVE: fbcon_redraw_blit(vc, info, p, b - 1, b - t - count, -count); - __fbcon_clear(vc, t, 0, count, vc->vc_cols); + fbcon_clear(vc, t, 0, count, vc->vc_cols); scr_memsetw((unsigned short *) (vc->vc_origin + vc->vc_size_row * t), @@ -1884,7 +1873,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b, b - t - count, vc->vc_cols); else goto redraw_down; - __fbcon_clear(vc, t, 0, count, vc->vc_cols); + fbcon_clear(vc, t, 0, count, vc->vc_cols); break; case SCROLL_PAN_MOVE: @@ -1906,7 +1895,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b, b - t - count, vc->vc_cols); else goto redraw_down; - __fbcon_clear(vc, t, 0, count, vc->vc_cols); + fbcon_clear(vc, t, 0, count, vc->vc_cols); break; case SCROLL_PAN_REDRAW: @@ -1923,14 +1912,14 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b, fbcon_redraw_move(vc, p, count, t, 0); } else fbcon_redraw_move(vc, p, t, b - t - count, t + count); - __fbcon_clear(vc, t, 0, count, vc->vc_cols); + fbcon_clear(vc, t, 0, count, vc->vc_cols); break; case SCROLL_REDRAW: redraw_down: fbcon_redraw(vc, b - 1, b - t - count, -count * vc->vc_cols); - __fbcon_clear(vc, t, 0, count, vc->vc_cols); + fbcon_clear(vc, t, 0, count, vc->vc_cols); scr_memsetw((unsigned short *) (vc->vc_origin + vc->vc_size_row * t), @@ -2072,7 +2061,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width, return 0; } -static bool fbcon_switch(struct vc_data *vc) +static int fbcon_switch(struct vc_data *vc) { struct fb_info *info, *old_info = NULL; struct fbcon_ops *ops; @@ -2194,9 +2183,9 @@ static bool fbcon_switch(struct vc_data *vc) vc->vc_origin + vc->vc_size_row * vc->vc_top, vc->vc_size_row * (vc->vc_bottom - vc->vc_top) / 2); - return false; + return 0; } - return true; + return 1; } static void fbcon_generic_blank(struct vc_data *vc, struct fb_info *info, @@ -2209,7 +2198,7 @@ static void fbcon_generic_blank(struct vc_data *vc, struct fb_info *info, oldc = vc->vc_video_erase_char; vc->vc_video_erase_char &= charmask; - __fbcon_clear(vc, 0, 0, vc->vc_rows, vc->vc_cols); + fbcon_clear(vc, 0, 0, vc->vc_rows, vc->vc_cols); vc->vc_video_erase_char = oldc; } } diff --git a/drivers/video/fbdev/core/fbcvt.c b/drivers/video/fbdev/core/fbcvt.c index cd3821bd82e566ed906cab1b68a3066e17235c87..64843464c66135b4c5c083418c8c89ae237f052a 100644 --- a/drivers/video/fbdev/core/fbcvt.c +++ b/drivers/video/fbdev/core/fbcvt.c @@ -312,7 +312,7 @@ int fb_find_mode_cvt(struct fb_videomode *mode, int margins, int rb) cvt.f_refresh = cvt.refresh; cvt.interlace = 1; - if (!cvt.xres || !cvt.yres || !cvt.refresh || cvt.f_refresh > INT_MAX) { + if (!cvt.xres || !cvt.yres || !cvt.refresh) { printk(KERN_INFO "fbcvt: Invalid input parameters\n"); return 1; } diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 52bd3af543690871f3689f88ab090bb64de68848..ee44a46a66be1c1037bc47c1ae8049ecac1aaf06 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -868,10 +868,8 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) !list_empty(&info->modelist)) ret = fb_add_videomode(&mode, &info->modelist); - if (ret) { - info->var = old_var; + if (ret) return ret; - } event.info = info; event.data = &mode; @@ -930,7 +928,7 @@ static int fb_check_foreignness(struct fb_info *fi) static int do_register_framebuffer(struct fb_info *fb_info) { - int i, err = 0; + int i; struct fb_videomode mode; if (fb_check_foreignness(fb_info)) @@ -939,18 +937,10 @@ static int do_register_framebuffer(struct fb_info *fb_info) if (num_registered_fb == FB_MAX) return -ENXIO; + num_registered_fb++; for (i = 0 ; i < FB_MAX; i++) if (!registered_fb[i]) break; - - if (!fb_info->modelist.prev || !fb_info->modelist.next) - INIT_LIST_HEAD(&fb_info->modelist); - - fb_var_to_videomode(&mode, &fb_info->var); - err = fb_add_videomode(&mode, &fb_info->modelist); - if (err < 0) - return err; - fb_info->node = i; refcount_set(&fb_info->count, 1); mutex_init(&fb_info->lock); @@ -976,12 +966,16 @@ static int do_register_framebuffer(struct fb_info *fb_info) if (!fb_info->pixmap.blit_y) fb_info->pixmap.blit_y = ~(u32)0; + if (!fb_info->modelist.prev || !fb_info->modelist.next) + INIT_LIST_HEAD(&fb_info->modelist); + if (fb_info->skip_vt_switch) pm_vt_switch_required(fb_info->device, false); else pm_vt_switch_required(fb_info->device, true); - num_registered_fb++; + fb_var_to_videomode(&mode, &fb_info->var); + fb_add_videomode(&mode, &fb_info->modelist); registered_fb[i] = fb_info; #ifdef CONFIG_GUMSTIX_AM200EPD diff --git a/drivers/video/screen_info_pci.c b/drivers/video/screen_info_pci.c index 66bfc1d0a6dc82547282aebac7c20452022a4d8c..6c58335171410029d22cc62f4bb1288352258ee9 100644 --- a/drivers/video/screen_info_pci.c +++ b/drivers/video/screen_info_pci.c @@ -7,8 +7,8 @@ static struct pci_dev *screen_info_lfb_pdev; static size_t screen_info_lfb_bar; -static resource_size_t screen_info_lfb_res_start; // original start of resource -static resource_size_t screen_info_lfb_offset; // framebuffer offset within resource +static resource_size_t screen_info_lfb_offset; +static struct resource screen_info_lfb_res = DEFINE_RES_MEM(0, 0); static bool __screen_info_relocation_is_valid(const struct screen_info *si, struct resource *pr) { @@ -31,7 +31,7 @@ void screen_info_apply_fixups(void) if (screen_info_lfb_pdev) { struct resource *pr = &screen_info_lfb_pdev->resource[screen_info_lfb_bar]; - if (pr->start != screen_info_lfb_res_start) { + if (pr->start != screen_info_lfb_res.start) { if (__screen_info_relocation_is_valid(si, pr)) { /* * Only update base if we have an actual @@ -47,67 +47,46 @@ void screen_info_apply_fixups(void) } } -static int __screen_info_lfb_pci_bus_region(const struct screen_info *si, unsigned int type, - struct pci_bus_region *r) -{ - u64 base, size; - - base = __screen_info_lfb_base(si); - if (!base) - return -EINVAL; - - size = __screen_info_lfb_size(si, type); - if (!size) - return -EINVAL; - - r->start = base; - r->end = base + size - 1; - - return 0; -} - static void screen_info_fixup_lfb(struct pci_dev *pdev) { unsigned int type; - struct pci_bus_region bus_region; + struct resource res[SCREEN_INFO_MAX_RESOURCES]; + size_t i, numres; int ret; - struct resource r = { - .flags = IORESOURCE_MEM, - }; - const struct resource *pr; const struct screen_info *si = &screen_info; if (screen_info_lfb_pdev) return; // already found type = screen_info_video_type(si); - if (!__screen_info_has_lfb(type)) - return; // only applies to EFI; maybe VESA + if (type != VIDEO_TYPE_EFI) + return; // only applies to EFI - ret = __screen_info_lfb_pci_bus_region(si, type, &bus_region); + ret = screen_info_resources(si, res, ARRAY_SIZE(res)); if (ret < 0) return; + numres = ret; - /* - * Translate the PCI bus address to resource. Account - * for an offset if the framebuffer is behind a PCI host - * bridge. - */ - pcibios_bus_to_resource(pdev->bus, &r, &bus_region); - - pr = pci_find_resource(pdev, &r); - if (!pr) - return; - - /* - * We've found a PCI device with the framebuffer - * resource. Store away the parameters to track - * relocation of the framebuffer aperture. - */ - screen_info_lfb_pdev = pdev; - screen_info_lfb_bar = pr - pdev->resource; - screen_info_lfb_offset = r.start - pr->start; - screen_info_lfb_res_start = bus_region.start; + for (i = 0; i < numres; ++i) { + struct resource *r = &res[i]; + const struct resource *pr; + + if (!(r->flags & IORESOURCE_MEM)) + continue; + pr = pci_find_resource(pdev, r); + if (!pr) + continue; + + /* + * We've found a PCI device with the framebuffer + * resource. Store away the parameters to track + * relocation of the framebuffer aperture. + */ + screen_info_lfb_pdev = pdev; + screen_info_lfb_bar = pr - pdev->resource; + screen_info_lfb_offset = r->start - pr->start; + memcpy(&screen_info_lfb_res, r, sizeof(screen_info_lfb_res)); + } } DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY, 16, screen_info_fixup_lfb); diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index db4582687b958f785f311efcf23f121d00bbad39..c5f04234d9511acea40541999391034714992846 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -2739,7 +2739,7 @@ int virtqueue_resize(struct virtqueue *_vq, u32 num, void (*recycle)(struct virtqueue *vq, void *buf)) { struct vring_virtqueue *vq = to_vvq(_vq); - int err, err_reset; + int err; if (num > vq->vq.num_max) return -E2BIG; @@ -2759,11 +2759,7 @@ int virtqueue_resize(struct virtqueue *_vq, u32 num, else err = virtqueue_resize_split(_vq, num); - err_reset = virtqueue_enable_after_reset(_vq); - if (err_reset) - return err_reset; - - return err; + return virtqueue_enable_after_reset(_vq); } EXPORT_SYMBOL_GPL(virtqueue_resize); diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c index 001b2c9311254c90aeefbf0d228a094cbb7f7ec9..7bc0fb1df1e00a443bf1077e6dc8e870a56f48aa 100644 --- a/drivers/watchdog/aspeed_wdt.c +++ b/drivers/watchdog/aspeed_wdt.c @@ -252,7 +252,7 @@ static void aspeed_wdt_update_bootstatus(struct platform_device *pdev, if (!of_device_is_compatible(pdev->dev.of_node, "aspeed,ast2400-wdt")) { res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - idx = ((intptr_t)wdt->base & 0x00000fff) / (uintptr_t)resource_size(res); + idx = ((intptr_t)wdt->base & 0x00000fff) / resource_size(res); } scu_base = syscon_regmap_lookup_by_compatible(scu.compatible); diff --git a/drivers/watchdog/da9052_wdt.c b/drivers/watchdog/da9052_wdt.c index 180526220d8c427c465715189e58e0acc3a4d0d8..d708c091bf1b1e3327a134d4d2244d4b883d14e4 100644 --- a/drivers/watchdog/da9052_wdt.c +++ b/drivers/watchdog/da9052_wdt.c @@ -164,7 +164,6 @@ static int da9052_wdt_probe(struct platform_device *pdev) da9052_wdt = &driver_data->wdt; da9052_wdt->timeout = DA9052_DEF_TIMEOUT; - da9052_wdt->min_hw_heartbeat_ms = DA9052_TWDMIN; da9052_wdt->info = &da9052_wdt_info; da9052_wdt->ops = &da9052_wdt_ops; da9052_wdt->parent = dev; diff --git a/drivers/watchdog/exar_wdt.c b/drivers/watchdog/exar_wdt.c index c2e3bb08df899abdd354ada658d89a033ae7d88e..7c61ff3432711623aa4f6992f41c94f2664a5372 100644 --- a/drivers/watchdog/exar_wdt.c +++ b/drivers/watchdog/exar_wdt.c @@ -221,7 +221,7 @@ static const struct watchdog_info exar_wdt_info = { .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, - .identity = "Exar XR28V38x Watchdog", + .identity = "Exar/MaxLinear XR28V38x Watchdog", }; static const struct watchdog_ops exar_wdt_ops = { diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 204ec1bcbd526a77560bd224542896d22398b5a0..b0b52fa8fba6da25b4c14e4550a1ec622e319701 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c @@ -696,18 +696,15 @@ static int __init balloon_add_regions(void) /* * Extra regions are accounted for in the physmap, but need - * decreasing from current_pages and target_pages to balloon - * down the initial allocation, because they are already - * accounted for in total_pages. + * decreasing from current_pages to balloon down the initial + * allocation, because they are already accounted for in + * total_pages. */ - pages = extra_pfn_end - start_pfn; - if (pages >= balloon_stats.current_pages || - pages >= balloon_stats.target_pages) { + if (extra_pfn_end - start_pfn >= balloon_stats.current_pages) { WARN(1, "Extra pages underflow current target"); return -ERANGE; } - balloon_stats.current_pages -= pages; - balloon_stats.target_pages -= pages; + balloon_stats.current_pages -= extra_pfn_end - start_pfn; } return 0; diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c index d3b6908110c6f04bb1067b5ecb1d674b6b766673..25164d56c9d995690a4c0bf0a18f40cb9ee6adf4 100644 --- a/drivers/xen/xenbus/xenbus_probe.c +++ b/drivers/xen/xenbus/xenbus_probe.c @@ -966,15 +966,9 @@ static int __init xenbus_init(void) if (xen_pv_domain()) xen_store_domain_type = XS_PV; if (xen_hvm_domain()) - { xen_store_domain_type = XS_HVM; - err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v); - if (err) - goto out_error; - xen_store_evtchn = (int)v; - if (!v && xen_initial_domain()) - xen_store_domain_type = XS_LOCAL; - } + if (xen_hvm_domain() && xen_initial_domain()) + xen_store_domain_type = XS_LOCAL; if (xen_pv_domain() && !xen_start_info->store_evtchn) xen_store_domain_type = XS_LOCAL; if (xen_pv_domain() && xen_start_info->store_evtchn) @@ -993,6 +987,10 @@ static int __init xenbus_init(void) xen_store_interface = gfn_to_virt(xen_store_gfn); break; case XS_HVM: + err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v); + if (err) + goto out_error; + xen_store_evtchn = (int)v; err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v); if (err) goto out_error; diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index a25766e90f0a6e27be4f1f0d6b2b4945728aaaa0..24192a7667edf766e6932e12459c93379875e7e5 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -55,26 +55,15 @@ static struct file_system_type anon_inode_fs_type = { .kill_sb = kill_anon_super, }; -/** - * anon_inode_make_secure_inode - allocate an anonymous inode with security context - * @sb: [in] Superblock to allocate from - * @name: [in] Name of the class of the newfile (e.g., "secretmem") - * @context_inode: - * [in] Optional parent inode for security inheritance - * - * The function ensures proper security initialization through the LSM hook - * security_inode_init_security_anon(). - * - * Return: Pointer to new inode on success, ERR_PTR on failure. - */ -struct inode *anon_inode_make_secure_inode(struct super_block *sb, const char *name, - const struct inode *context_inode) +static struct inode *anon_inode_make_secure_inode( + const char *name, + const struct inode *context_inode) { struct inode *inode; const struct qstr qname = QSTR_INIT(name, strlen(name)); int error; - inode = alloc_anon_inode(sb); + inode = alloc_anon_inode(anon_inode_mnt->mnt_sb); if (IS_ERR(inode)) return inode; inode->i_flags &= ~S_PRIVATE; @@ -85,7 +74,6 @@ struct inode *anon_inode_make_secure_inode(struct super_block *sb, const char *n } return inode; } -EXPORT_SYMBOL_GPL_FOR_MODULES(anon_inode_make_secure_inode, "kvm"); static struct file *__anon_inode_getfile(const char *name, const struct file_operations *fops, @@ -100,8 +88,7 @@ static struct file *__anon_inode_getfile(const char *name, return ERR_PTR(-ENOENT); if (secure) { - inode = anon_inode_make_secure_inode(anon_inode_mnt->mnt_sb, - name, context_inode); + inode = anon_inode_make_secure_inode(name, context_inode); if (IS_ERR(inode)) { file = ERR_CAST(inode); goto err; diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index c23c56ead6b236d97a10c6724aabbc20de8643e3..ec6679a538c1dcec766aed82efa6499c768446e8 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h @@ -488,7 +488,7 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode, int btrfs_update_inode(struct btrfs_trans_handle *trans, struct btrfs_root *root, struct btrfs_inode *inode); int btrfs_update_inode_fallback(struct btrfs_trans_handle *trans, - struct btrfs_inode *inode); + struct btrfs_root *root, struct btrfs_inode *inode); int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct btrfs_inode *inode); int btrfs_orphan_cleanup(struct btrfs_root *root); int btrfs_cont_expand(struct btrfs_inode *inode, loff_t oldsize, loff_t size); diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index bb5f7911d473cbf8aafca1917a5b359629f76e81..34a30d61b470c328c55a7541082f6ac80305fd67 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2148,7 +2148,8 @@ static int load_global_roots_objectid(struct btrfs_root *tree_root, found = true; root = read_tree_root_path(tree_root, path, &key); if (IS_ERR(root)) { - ret = PTR_ERR(root); + if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) + ret = PTR_ERR(root); break; } set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); diff --git a/fs/btrfs/free-space-tree.c b/fs/btrfs/free-space-tree.c index 300ee0b68b498e0495de9fdbb46682ed23d4f936..a0d8160b537572d48ccf7271528ff0692d44ee1d 100644 --- a/fs/btrfs/free-space-tree.c +++ b/fs/btrfs/free-space-tree.c @@ -1104,21 +1104,11 @@ static int populate_free_space_tree(struct btrfs_trans_handle *trans, ret = btrfs_search_slot_for_read(extent_root, &key, path, 1, 0); if (ret < 0) goto out_locked; - /* - * If ret is 1 (no key found), it means this is an empty block group, - * without any extents allocated from it and there's no block group - * item (key BTRFS_BLOCK_GROUP_ITEM_KEY) located in the extent tree - * because we are using the block group tree feature, so block group - * items are stored in the block group tree. It also means there are no - * extents allocated for block groups with a start offset beyond this - * block group's end offset (this is the last, highest, block group). - */ - if (!btrfs_fs_compat_ro(trans->fs_info, BLOCK_GROUP_TREE)) - ASSERT(ret == 0); + ASSERT(ret == 0); start = block_group->start; end = block_group->start + block_group->length; - while (ret == 0) { + while (1) { btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); if (key.type == BTRFS_EXTENT_ITEM_KEY || @@ -1148,6 +1138,8 @@ static int populate_free_space_tree(struct btrfs_trans_handle *trans, ret = btrfs_next_item(extent_root, path); if (ret < 0) goto out_locked; + if (ret) + break; } if (start < end) { ret = __add_to_free_space_tree(trans, block_group, path2, diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 218d15f5ddf737ddb558143125557eb6d2176f4e..48d2579236729dc9a79ce05db02ac60a8df1cbeb 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -3077,7 +3077,7 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_extent *ordered_extent) goto out; } trans->block_rsv = &inode->block_rsv; - ret = btrfs_update_inode_fallback(trans, inode); + ret = btrfs_update_inode_fallback(trans, root, inode); if (ret) /* -ENOMEM or corruption */ btrfs_abort_transaction(trans, ret); goto out; @@ -3143,7 +3143,7 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_extent *ordered_extent) &cached_state); btrfs_inode_safe_disk_i_size_write(inode, 0); - ret = btrfs_update_inode_fallback(trans, inode); + ret = btrfs_update_inode_fallback(trans, root, inode); if (ret) { /* -ENOMEM or corruption */ btrfs_abort_transaction(trans, ret); goto out; @@ -4014,9 +4014,9 @@ static noinline int btrfs_update_inode_item(struct btrfs_trans_handle *trans, /* * copy everything in the in-memory inode into the btree. */ -int btrfs_update_inode(struct btrfs_trans_handle *trans, - struct btrfs_root *root, - struct btrfs_inode *inode) +noinline int btrfs_update_inode(struct btrfs_trans_handle *trans, + struct btrfs_root *root, + struct btrfs_inode *inode) { struct btrfs_fs_info *fs_info = root->fs_info; int ret; @@ -4043,13 +4043,13 @@ int btrfs_update_inode(struct btrfs_trans_handle *trans, } int btrfs_update_inode_fallback(struct btrfs_trans_handle *trans, - struct btrfs_inode *inode) + struct btrfs_root *root, struct btrfs_inode *inode) { int ret; - ret = btrfs_update_inode(trans, inode->root, inode); + ret = btrfs_update_inode(trans, root, inode); if (ret == -ENOSPC) - return btrfs_update_inode_item(trans, inode->root, inode); + return btrfs_update_inode_item(trans, root, inode); return ret; } @@ -4327,7 +4327,7 @@ static int btrfs_unlink_subvol(struct btrfs_trans_handle *trans, btrfs_i_size_write(dir, dir->vfs_inode.i_size - fname.disk_name.len * 2); inode_inc_iversion(&dir->vfs_inode); dir->vfs_inode.i_mtime = inode_set_ctime_current(&dir->vfs_inode); - ret = btrfs_update_inode_fallback(trans, dir); + ret = btrfs_update_inode_fallback(trans, root, dir); if (ret) btrfs_abort_transaction(trans, ret); out: @@ -4615,8 +4615,9 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) { struct inode *inode = d_inode(dentry); struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; - int ret = 0; + int err = 0; struct btrfs_trans_handle *trans; + u64 last_unlink_trans; struct fscrypt_name fname; if (inode->i_size > BTRFS_EMPTY_DIR_SIZE) @@ -4630,56 +4631,55 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) return btrfs_delete_subvolume(BTRFS_I(dir), dentry); } - ret = fscrypt_setup_filename(dir, &dentry->d_name, 1, &fname); - if (ret) - return ret; + err = fscrypt_setup_filename(dir, &dentry->d_name, 1, &fname); + if (err) + return err; /* This needs to handle no-key deletions later on */ trans = __unlink_start_trans(BTRFS_I(dir)); if (IS_ERR(trans)) { - ret = PTR_ERR(trans); + err = PTR_ERR(trans); goto out_notrans; } - /* - * Propagate the last_unlink_trans value of the deleted dir to its - * parent directory. This is to prevent an unrecoverable log tree in the - * case we do something like this: - * 1) create dir foo - * 2) create snapshot under dir foo - * 3) delete the snapshot - * 4) rmdir foo - * 5) mkdir foo - * 6) fsync foo or some file inside foo - * - * This is because we can't unlink other roots when replaying the dir - * deletes for directory foo. - */ - if (BTRFS_I(inode)->last_unlink_trans >= trans->transid) - btrfs_record_snapshot_destroy(trans, BTRFS_I(dir)); - if (unlikely(btrfs_ino(BTRFS_I(inode)) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { - ret = btrfs_unlink_subvol(trans, BTRFS_I(dir), dentry); + err = btrfs_unlink_subvol(trans, BTRFS_I(dir), dentry); goto out; } - ret = btrfs_orphan_add(trans, BTRFS_I(inode)); - if (ret) + err = btrfs_orphan_add(trans, BTRFS_I(inode)); + if (err) goto out; + last_unlink_trans = BTRFS_I(inode)->last_unlink_trans; + /* now the directory is empty */ - ret = btrfs_unlink_inode(trans, BTRFS_I(dir), BTRFS_I(d_inode(dentry)), + err = btrfs_unlink_inode(trans, BTRFS_I(dir), BTRFS_I(d_inode(dentry)), &fname.disk_name); - if (!ret) + if (!err) { btrfs_i_size_write(BTRFS_I(inode), 0); + /* + * Propagate the last_unlink_trans value of the deleted dir to + * its parent directory. This is to prevent an unrecoverable + * log tree in the case we do something like this: + * 1) create dir foo + * 2) create snapshot under dir foo + * 3) delete the snapshot + * 4) rmdir foo + * 5) mkdir foo + * 6) fsync foo or some file inside foo + */ + if (last_unlink_trans >= trans->transid) + BTRFS_I(dir)->last_unlink_trans = last_unlink_trans; + } out: btrfs_end_transaction(trans); out_notrans: btrfs_btree_balance_dirty(fs_info); fscrypt_free_filename(&fname); - return ret; + return err; } /* @@ -8754,7 +8754,6 @@ static int btrfs_rename_exchange(struct inode *old_dir, int ret; int ret2; bool need_abort = false; - bool logs_pinned = false; struct fscrypt_name old_fname, new_fname; struct fscrypt_str *old_name, *new_name; @@ -8878,31 +8877,6 @@ static int btrfs_rename_exchange(struct inode *old_dir, inode_inc_iversion(new_inode); simple_rename_timestamp(old_dir, old_dentry, new_dir, new_dentry); - if (old_ino != BTRFS_FIRST_FREE_OBJECTID && - new_ino != BTRFS_FIRST_FREE_OBJECTID) { - /* - * If we are renaming in the same directory (and it's not for - * root entries) pin the log early to prevent any concurrent - * task from logging the directory after we removed the old - * entries and before we add the new entries, otherwise that - * task can sync a log without any entry for the inodes we are - * renaming and therefore replaying that log, if a power failure - * happens after syncing the log, would result in deleting the - * inodes. - * - * If the rename affects two different directories, we want to - * make sure the that there's no log commit that contains - * updates for only one of the directories but not for the - * other. - * - * If we are renaming an entry for a root, we don't care about - * log updates since we called btrfs_set_log_full_commit(). - */ - btrfs_pin_log_trans(root); - btrfs_pin_log_trans(dest); - logs_pinned = true; - } - if (old_dentry->d_parent != new_dentry->d_parent) { btrfs_record_unlink_dir(trans, BTRFS_I(old_dir), BTRFS_I(old_inode), true); @@ -8960,23 +8934,30 @@ static int btrfs_rename_exchange(struct inode *old_dir, BTRFS_I(new_inode)->dir_index = new_idx; /* - * Do the log updates for all inodes. - * - * If either entry is for a root we don't need to update the logs since - * we've called btrfs_set_log_full_commit() before. + * Now pin the logs of the roots. We do it to ensure that no other task + * can sync the logs while we are in progress with the rename, because + * that could result in an inconsistency in case any of the inodes that + * are part of this rename operation were logged before. */ - if (logs_pinned) { + if (old_ino != BTRFS_FIRST_FREE_OBJECTID) + btrfs_pin_log_trans(root); + if (new_ino != BTRFS_FIRST_FREE_OBJECTID) + btrfs_pin_log_trans(dest); + + /* Do the log updates for all inodes. */ + if (old_ino != BTRFS_FIRST_FREE_OBJECTID) btrfs_log_new_name(trans, old_dentry, BTRFS_I(old_dir), old_rename_ctx.index, new_dentry->d_parent); + if (new_ino != BTRFS_FIRST_FREE_OBJECTID) btrfs_log_new_name(trans, new_dentry, BTRFS_I(new_dir), new_rename_ctx.index, old_dentry->d_parent); - } -out_fail: - if (logs_pinned) { + /* Now unpin the logs. */ + if (old_ino != BTRFS_FIRST_FREE_OBJECTID) btrfs_end_log_trans(root); + if (new_ino != BTRFS_FIRST_FREE_OBJECTID) btrfs_end_log_trans(dest); - } +out_fail: ret2 = btrfs_end_transaction(trans); ret = ret ? ret : ret2; out_notrans: @@ -9026,7 +9007,6 @@ static int btrfs_rename(struct mnt_idmap *idmap, int ret2; u64 old_ino = btrfs_ino(BTRFS_I(old_inode)); struct fscrypt_name old_fname, new_fname; - bool logs_pinned = false; if (btrfs_ino(BTRFS_I(new_dir)) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) return -EPERM; @@ -9161,29 +9141,6 @@ static int btrfs_rename(struct mnt_idmap *idmap, inode_inc_iversion(old_inode); simple_rename_timestamp(old_dir, old_dentry, new_dir, new_dentry); - if (old_ino != BTRFS_FIRST_FREE_OBJECTID) { - /* - * If we are renaming in the same directory (and it's not a - * root entry) pin the log to prevent any concurrent task from - * logging the directory after we removed the old entry and - * before we add the new entry, otherwise that task can sync - * a log without any entry for the inode we are renaming and - * therefore replaying that log, if a power failure happens - * after syncing the log, would result in deleting the inode. - * - * If the rename affects two different directories, we want to - * make sure the that there's no log commit that contains - * updates for only one of the directories but not for the - * other. - * - * If we are renaming an entry for a root, we don't care about - * log updates since we called btrfs_set_log_full_commit(). - */ - btrfs_pin_log_trans(root); - btrfs_pin_log_trans(dest); - logs_pinned = true; - } - if (old_dentry->d_parent != new_dentry->d_parent) btrfs_record_unlink_dir(trans, BTRFS_I(old_dir), BTRFS_I(old_inode), true); @@ -9232,7 +9189,7 @@ static int btrfs_rename(struct mnt_idmap *idmap, if (old_inode->i_nlink == 1) BTRFS_I(old_inode)->dir_index = index; - if (logs_pinned) + if (old_ino != BTRFS_FIRST_FREE_OBJECTID) btrfs_log_new_name(trans, old_dentry, BTRFS_I(old_dir), rename_ctx.index, new_dentry->d_parent); @@ -9248,10 +9205,6 @@ static int btrfs_rename(struct mnt_idmap *idmap, } } out_fail: - if (logs_pinned) { - btrfs_end_log_trans(root); - btrfs_end_log_trans(dest); - } ret2 = btrfs_end_transaction(trans); ret = ret ? ret : ret2; out_notrans: diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index c68e9ecbc438cc2588cb38eab367903bd2796cb9..86d846eb5ed492963b0231d4946ff8d9ebf093f2 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -154,10 +154,9 @@ static struct btrfs_ordered_extent *alloc_ordered_extent( struct btrfs_ordered_extent *entry; int ret; u64 qgroup_rsv = 0; - const bool is_nocow = (flags & - ((1U << BTRFS_ORDERED_NOCOW) | (1U << BTRFS_ORDERED_PREALLOC))); - if (is_nocow) { + if (flags & + ((1 << BTRFS_ORDERED_NOCOW) | (1 << BTRFS_ORDERED_PREALLOC))) { /* For nocow write, we can release the qgroup rsv right now */ ret = btrfs_qgroup_free_data(inode, NULL, file_offset, num_bytes, &qgroup_rsv); if (ret < 0) @@ -172,13 +171,8 @@ static struct btrfs_ordered_extent *alloc_ordered_extent( return ERR_PTR(ret); } entry = kmem_cache_zalloc(btrfs_ordered_extent_cache, GFP_NOFS); - if (!entry) { - if (!is_nocow) - btrfs_qgroup_free_refroot(inode->root->fs_info, - btrfs_root_id(inode->root), - qgroup_rsv, BTRFS_QGROUP_RSV_DATA); + if (!entry) return ERR_PTR(-ENOMEM); - } entry->file_offset = file_offset; entry->num_bytes = num_bytes; diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 474758c878fcab80642d902bf02b057b0242f72c..537e184b4b1dfcf828b581e579d09970fd5d5976 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -2931,7 +2931,6 @@ static int relocate_one_page(struct inode *inode, struct file_ra_state *ra, int ret; ASSERT(page_index <= last_index); -again: page = find_lock_page(inode->i_mapping, page_index); if (!page) { page_cache_sync_readahead(inode->i_mapping, ra, NULL, @@ -2953,11 +2952,6 @@ static int relocate_one_page(struct inode *inode, struct file_ra_state *ra, ret = -EIO; goto release_page; } - if (page->mapping != inode->i_mapping) { - unlock_page(page); - put_page(page); - goto again; - } } /* diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 7632d652a1257dd8921d8cde377d644e7042aa28..6be092bb814fdc7078d177b844c5d84ec6c7a36b 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -153,14 +153,12 @@ struct scrub_stripe { unsigned int init_nr_io_errors; unsigned int init_nr_csum_errors; unsigned int init_nr_meta_errors; - unsigned int init_nr_meta_gen_errors; /* * The following error bitmaps are all for the current status. * Every time we submit a new read, these bitmaps may be updated. * - * error_bitmap = io_error_bitmap | csum_error_bitmap | - * meta_error_bitmap | meta_generation_bitmap; + * error_bitmap = io_error_bitmap | csum_error_bitmap | meta_error_bitmap; * * IO and csum errors can happen for both metadata and data. */ @@ -168,7 +166,6 @@ struct scrub_stripe { unsigned long io_error_bitmap; unsigned long csum_error_bitmap; unsigned long meta_error_bitmap; - unsigned long meta_gen_error_bitmap; /* For writeback (repair or replace) error reporting. */ unsigned long write_error_bitmap; @@ -620,7 +617,7 @@ static void scrub_verify_one_metadata(struct scrub_stripe *stripe, int sector_nr memcpy(on_disk_csum, header->csum, fs_info->csum_size); if (logical != btrfs_stack_header_bytenr(header)) { - bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); + bitmap_set(&stripe->csum_error_bitmap, sector_nr, sectors_per_tree); bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); btrfs_warn_rl(fs_info, "tree block %llu mirror %u has bad bytenr, has %llu want %llu", @@ -676,7 +673,7 @@ static void scrub_verify_one_metadata(struct scrub_stripe *stripe, int sector_nr } if (stripe->sectors[sector_nr].generation != btrfs_stack_header_generation(header)) { - bitmap_set(&stripe->meta_gen_error_bitmap, sector_nr, sectors_per_tree); + bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); btrfs_warn_rl(fs_info, "tree block %llu mirror %u has bad generation, has %llu want %llu", @@ -688,7 +685,6 @@ static void scrub_verify_one_metadata(struct scrub_stripe *stripe, int sector_nr bitmap_clear(&stripe->error_bitmap, sector_nr, sectors_per_tree); bitmap_clear(&stripe->csum_error_bitmap, sector_nr, sectors_per_tree); bitmap_clear(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); - bitmap_clear(&stripe->meta_gen_error_bitmap, sector_nr, sectors_per_tree); } static void scrub_verify_one_sector(struct scrub_stripe *stripe, int sector_nr) @@ -977,22 +973,8 @@ static void scrub_stripe_report_errors(struct scrub_ctx *sctx, if (__ratelimit(&rs) && dev) scrub_print_common_warning("header error", dev, false, stripe->logical, physical); - if (test_bit(sector_nr, &stripe->meta_gen_error_bitmap)) - if (__ratelimit(&rs) && dev) - scrub_print_common_warning("generation error", dev, false, - stripe->logical, physical); } - /* Update the device stats. */ - for (int i = 0; i < stripe->init_nr_io_errors; i++) - btrfs_dev_stat_inc_and_print(stripe->dev, BTRFS_DEV_STAT_READ_ERRS); - for (int i = 0; i < stripe->init_nr_csum_errors; i++) - btrfs_dev_stat_inc_and_print(stripe->dev, BTRFS_DEV_STAT_CORRUPTION_ERRS); - /* Generation mismatch error is based on each metadata, not each block. */ - for (int i = 0; i < stripe->init_nr_meta_gen_errors; - i += (fs_info->nodesize >> fs_info->sectorsize_bits)) - btrfs_dev_stat_inc_and_print(stripe->dev, BTRFS_DEV_STAT_GENERATION_ERRS); - spin_lock(&sctx->stat_lock); sctx->stat.data_extents_scrubbed += stripe->nr_data_extents; sctx->stat.tree_extents_scrubbed += stripe->nr_meta_extents; @@ -1001,8 +983,7 @@ static void scrub_stripe_report_errors(struct scrub_ctx *sctx, sctx->stat.no_csum += nr_nodatacsum_sectors; sctx->stat.read_errors += stripe->init_nr_io_errors; sctx->stat.csum_errors += stripe->init_nr_csum_errors; - sctx->stat.verify_errors += stripe->init_nr_meta_errors + - stripe->init_nr_meta_gen_errors; + sctx->stat.verify_errors += stripe->init_nr_meta_errors; sctx->stat.uncorrectable_errors += bitmap_weight(&stripe->error_bitmap, stripe->nr_sectors); sctx->stat.corrected_errors += nr_repaired_sectors; @@ -1048,8 +1029,6 @@ static void scrub_stripe_read_repair_worker(struct work_struct *work) stripe->nr_sectors); stripe->init_nr_meta_errors = bitmap_weight(&stripe->meta_error_bitmap, stripe->nr_sectors); - stripe->init_nr_meta_gen_errors = bitmap_weight(&stripe->meta_gen_error_bitmap, - stripe->nr_sectors); if (bitmap_empty(&stripe->init_error_bitmap, stripe->nr_sectors)) goto out; @@ -1164,9 +1143,6 @@ static void scrub_write_endio(struct btrfs_bio *bbio) bitmap_set(&stripe->write_error_bitmap, sector_nr, bio_size >> fs_info->sectorsize_bits); spin_unlock_irqrestore(&stripe->write_error_lock, flags); - for (int i = 0; i < (bio_size >> fs_info->sectorsize_bits); i++) - btrfs_dev_stat_inc_and_print(stripe->dev, - BTRFS_DEV_STAT_WRITE_ERRS); } bio_put(&bbio->bio); @@ -1529,12 +1505,10 @@ static void scrub_stripe_reset_bitmaps(struct scrub_stripe *stripe) stripe->init_nr_io_errors = 0; stripe->init_nr_csum_errors = 0; stripe->init_nr_meta_errors = 0; - stripe->init_nr_meta_gen_errors = 0; stripe->error_bitmap = 0; stripe->io_error_bitmap = 0; stripe->csum_error_bitmap = 0; stripe->meta_error_bitmap = 0; - stripe->meta_gen_error_bitmap = 0; } /* @@ -1564,8 +1538,8 @@ static int scrub_find_fill_first_stripe(struct btrfs_block_group *bg, u64 extent_gen; int ret; - if (unlikely(!extent_root || !csum_root)) { - btrfs_err(fs_info, "no valid extent or csum root for scrub"); + if (unlikely(!extent_root)) { + btrfs_err(fs_info, "no valid extent root for scrub"); return -EUCLEAN; } memset(stripe->sectors, 0, sizeof(struct scrub_sector_verification) * diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 3989cb19cdae70e8666948294b87d8adf9be3ac4..aa03db69a0164c03f779ca806e27ac9a0154f5b3 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -1860,7 +1860,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, btrfs_i_size_write(BTRFS_I(parent_inode), parent_inode->i_size + fname.disk_name.len * 2); parent_inode->i_mtime = inode_set_ctime_current(parent_inode); - ret = btrfs_update_inode_fallback(trans, BTRFS_I(parent_inode)); + ret = btrfs_update_inode_fallback(trans, parent_root, BTRFS_I(parent_inode)); if (ret) { btrfs_abort_transaction(trans, ret); goto fail; diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 16434106c465db8249e77a5a380fb9543deb50c5..cc9a2f8a4ae3b7c4cb34934be07d34e192773ab8 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -140,14 +140,11 @@ static void wait_log_commit(struct btrfs_root *root, int transid); * and once to do all the other items. */ -static struct btrfs_inode *btrfs_iget_logging(u64 objectid, struct btrfs_root *root) +static struct inode *btrfs_iget_logging(u64 objectid, struct btrfs_root *root) { unsigned int nofs_flag; struct inode *inode; - /* Only meant to be called for subvolume roots and not for log roots. */ - ASSERT(is_fstree(btrfs_root_id(root))); - /* * We're holding a transaction handle whether we are logging or * replaying a log tree, so we must make sure NOFS semantics apply @@ -159,10 +156,7 @@ static struct btrfs_inode *btrfs_iget_logging(u64 objectid, struct btrfs_root *r inode = btrfs_iget(root->fs_info->sb, objectid, root); memalloc_nofs_restore(nofs_flag); - if (IS_ERR(inode)) - return ERR_CAST(inode); - - return BTRFS_I(inode); + return inode; } /* @@ -619,6 +613,20 @@ static int read_alloc_one_name(struct extent_buffer *eb, void *start, int len, return 0; } +/* + * simple helper to read an inode off the disk from a given root + * This can only be called for subvolume roots and not for the log + */ +static noinline struct inode *read_one_inode(struct btrfs_root *root, + u64 objectid) +{ + struct inode *inode; + + inode = btrfs_iget_logging(objectid, root); + if (IS_ERR(inode)) + inode = NULL; + return inode; +} /* replays a single extent in 'eb' at 'slot' with 'key' into the * subvolume 'root'. path is released on entry and should be released @@ -673,15 +681,10 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, goto out; } - { - struct btrfs_inode *btrfs_inode; - - btrfs_inode = btrfs_iget_logging(key->objectid, root); - if (IS_ERR(btrfs_inode)) { - ret = PTR_ERR(btrfs_inode); - goto out; - } - inode = &btrfs_inode->vfs_inode; + inode = read_one_inode(root, key->objectid); + if (!inode) { + ret = -EIO; + goto out; } /* @@ -960,16 +963,10 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans, btrfs_release_path(path); - { - struct btrfs_inode *btrfs_inode; - - btrfs_inode = btrfs_iget_logging(location.objectid, root); - if (IS_ERR(btrfs_inode)) { - ret = PTR_ERR(btrfs_inode); - inode = NULL; - goto out; - } - inode = &btrfs_inode->vfs_inode; + inode = read_one_inode(root, location.objectid); + if (!inode) { + ret = -EIO; + goto out; } ret = link_to_fixup_dir(trans, root, path, location.objectid); @@ -1090,9 +1087,7 @@ static inline int __add_inode_ref(struct btrfs_trans_handle *trans, search_key.type = BTRFS_INODE_REF_KEY; search_key.offset = parent_objectid; ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); - if (ret < 0) { - return ret; - } else if (ret == 0) { + if (ret == 0) { struct btrfs_inode_ref *victim_ref; unsigned long ptr; unsigned long ptr_end; @@ -1165,13 +1160,13 @@ static inline int __add_inode_ref(struct btrfs_trans_handle *trans, struct fscrypt_str victim_name; extref = (struct btrfs_inode_extref *)(base + cur_offset); - victim_name.len = btrfs_inode_extref_name_len(leaf, extref); if (btrfs_inode_extref_parent(leaf, extref) != parent_objectid) goto next; ret = read_alloc_one_name(leaf, &extref->name, - victim_name.len, &victim_name); + btrfs_inode_extref_name_len(leaf, extref), + &victim_name); if (ret) return ret; @@ -1186,21 +1181,18 @@ static inline int __add_inode_ref(struct btrfs_trans_handle *trans, kfree(victim_name.name); return ret; } else if (!ret) { - struct btrfs_inode *btrfs_victim; - - btrfs_victim = btrfs_iget_logging(parent_objectid, root); - if (IS_ERR(btrfs_victim)) { - ret = PTR_ERR(btrfs_victim); - } else { - victim_parent = &btrfs_victim->vfs_inode; + ret = -ENOENT; + victim_parent = read_one_inode(root, + parent_objectid); + if (victim_parent) { inc_nlink(&inode->vfs_inode); btrfs_release_path(path); ret = unlink_inode_for_log_replay(trans, BTRFS_I(victim_parent), inode, &victim_name); - iput(victim_parent); } + iput(victim_parent); kfree(victim_name.name); if (ret) return ret; @@ -1337,16 +1329,11 @@ static int unlink_old_inode_refs(struct btrfs_trans_handle *trans, struct inode *dir; btrfs_release_path(path); - { - struct btrfs_inode *btrfs_dir; - - btrfs_dir = btrfs_iget_logging(parent_id, root); - if (IS_ERR(btrfs_dir)) { - ret = PTR_ERR(btrfs_dir); - kfree(name.name); - goto out; - } - dir = &btrfs_dir->vfs_inode; + dir = read_one_inode(root, parent_id); + if (!dir) { + ret = -ENOENT; + kfree(name.name); + goto out; } ret = unlink_inode_for_log_replay(trans, BTRFS_I(dir), inode, &name); @@ -1417,28 +1404,16 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, * copy the back ref in. The link count fixup code will take * care of the rest */ - { - struct btrfs_inode *btrfs_dir; - - btrfs_dir = btrfs_iget_logging(parent_objectid, root); - if (IS_ERR(btrfs_dir)) { - ret = PTR_ERR(btrfs_dir); - dir = NULL; - goto out; - } - dir = &btrfs_dir->vfs_inode; + dir = read_one_inode(root, parent_objectid); + if (!dir) { + ret = -ENOENT; + goto out; } - { - struct btrfs_inode *btrfs_inode; - - btrfs_inode = btrfs_iget_logging(inode_objectid, root); - if (IS_ERR(btrfs_inode)) { - ret = PTR_ERR(btrfs_inode); - inode = NULL; - goto out; - } - inode = &btrfs_inode->vfs_inode; + inode = read_one_inode(root, inode_objectid); + if (!inode) { + ret = -EIO; + goto out; } while (ref_ptr < ref_end) { @@ -1449,16 +1424,11 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, * parent object can change from one array * item to another. */ + if (!dir) + dir = read_one_inode(root, parent_objectid); if (!dir) { - struct btrfs_inode *btrfs_dir; - - btrfs_dir = btrfs_iget_logging(parent_objectid, root); - if (IS_ERR(btrfs_dir)) { - ret = PTR_ERR(btrfs_dir); - dir = NULL; - goto out; - } - dir = &btrfs_dir->vfs_inode; + ret = -ENOENT; + goto out; } } else { ret = ref_get_fields(eb, ref_ptr, &name, &ref_index); @@ -1532,7 +1502,8 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, return ret; } -static int count_inode_extrefs(struct btrfs_inode *inode, struct btrfs_path *path) +static int count_inode_extrefs(struct btrfs_root *root, + struct btrfs_inode *inode, struct btrfs_path *path) { int ret = 0; int name_len; @@ -1546,8 +1517,8 @@ static int count_inode_extrefs(struct btrfs_inode *inode, struct btrfs_path *pat struct extent_buffer *leaf; while (1) { - ret = btrfs_find_one_extref(inode->root, inode_objectid, offset, - path, &extref, &offset); + ret = btrfs_find_one_extref(root, inode_objectid, offset, path, + &extref, &offset); if (ret) break; @@ -1575,7 +1546,8 @@ static int count_inode_extrefs(struct btrfs_inode *inode, struct btrfs_path *pat return nlink; } -static int count_inode_refs(struct btrfs_inode *inode, struct btrfs_path *path) +static int count_inode_refs(struct btrfs_root *root, + struct btrfs_inode *inode, struct btrfs_path *path) { int ret; struct btrfs_key key; @@ -1590,7 +1562,7 @@ static int count_inode_refs(struct btrfs_inode *inode, struct btrfs_path *path) key.offset = (u64)-1; while (1) { - ret = btrfs_search_slot(NULL, inode->root, &key, path, 0, 0); + ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); if (ret < 0) break; if (ret > 0) { @@ -1642,9 +1614,9 @@ static int count_inode_refs(struct btrfs_inode *inode, struct btrfs_path *path) * will free the inode. */ static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans, + struct btrfs_root *root, struct inode *inode) { - struct btrfs_root *root = BTRFS_I(inode)->root; struct btrfs_path *path; int ret; u64 nlink = 0; @@ -1654,13 +1626,13 @@ static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans, if (!path) return -ENOMEM; - ret = count_inode_refs(BTRFS_I(inode), path); + ret = count_inode_refs(root, BTRFS_I(inode), path); if (ret < 0) goto out; nlink = ret; - ret = count_inode_extrefs(BTRFS_I(inode), path); + ret = count_inode_extrefs(root, BTRFS_I(inode), path); if (ret < 0) goto out; @@ -1726,18 +1698,13 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans, break; btrfs_release_path(path); - { - struct btrfs_inode *btrfs_inode; - - btrfs_inode = btrfs_iget_logging(key.offset, root); - if (IS_ERR(btrfs_inode)) { - ret = PTR_ERR(btrfs_inode); - break; - } - inode = &btrfs_inode->vfs_inode; + inode = read_one_inode(root, key.offset); + if (!inode) { + ret = -EIO; + break; } - ret = fixup_inode_link_count(trans, inode); + ret = fixup_inode_link_count(trans, root, inode); iput(inode); if (ret) break; @@ -1768,14 +1735,9 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans, int ret = 0; struct inode *inode; - { - struct btrfs_inode *btrfs_inode; - - btrfs_inode = btrfs_iget_logging(objectid, root); - if (IS_ERR(btrfs_inode)) - return PTR_ERR(btrfs_inode); - inode = &btrfs_inode->vfs_inode; - } + inode = read_one_inode(root, objectid); + if (!inode) + return -EIO; key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID; key.type = BTRFS_ORPHAN_ITEM_KEY; @@ -1813,24 +1775,14 @@ static noinline int insert_one_name(struct btrfs_trans_handle *trans, struct inode *dir; int ret; - { - struct btrfs_inode *btrfs_inode; - - btrfs_inode = btrfs_iget_logging(location->objectid, root); - if (IS_ERR(btrfs_inode)) - return PTR_ERR(btrfs_inode); - inode = &btrfs_inode->vfs_inode; - } - - { - struct btrfs_inode *btrfs_dir; + inode = read_one_inode(root, location->objectid); + if (!inode) + return -ENOENT; - btrfs_dir = btrfs_iget_logging(dirid, root); - if (IS_ERR(btrfs_dir)) { - iput(inode); - return PTR_ERR(btrfs_dir); - } - dir = &btrfs_dir->vfs_inode; + dir = read_one_inode(root, dirid); + if (!dir) { + iput(inode); + return -EIO; } ret = btrfs_add_link(trans, BTRFS_I(dir), BTRFS_I(inode), name, @@ -1908,14 +1860,9 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans, bool update_size = true; bool name_added = false; - { - struct btrfs_inode *btrfs_dir; - - btrfs_dir = btrfs_iget_logging(key->objectid, root); - if (IS_ERR(btrfs_dir)) - return PTR_ERR(btrfs_dir); - dir = &btrfs_dir->vfs_inode; - } + dir = read_one_inode(root, key->objectid); + if (!dir) + return -EIO; ret = read_alloc_one_name(eb, di + 1, btrfs_dir_name_len(eb, di), &name); if (ret) @@ -2217,16 +2164,10 @@ static noinline int check_item_in_log(struct btrfs_trans_handle *trans, btrfs_dir_item_key_to_cpu(eb, di, &location); btrfs_release_path(path); btrfs_release_path(log_path); - { - struct btrfs_inode *btrfs_inode; - - btrfs_inode = btrfs_iget_logging(location.objectid, root); - if (IS_ERR(btrfs_inode)) { - ret = PTR_ERR(btrfs_inode); - inode = NULL; - goto out; - } - inode = &btrfs_inode->vfs_inode; + inode = read_one_inode(root, location.objectid); + if (!inode) { + ret = -EIO; + goto out; } ret = link_to_fixup_dir(trans, root, path, location.objectid); @@ -2377,22 +2318,14 @@ static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans, if (!log_path) return -ENOMEM; - { - struct btrfs_inode *btrfs_dir; - - btrfs_dir = btrfs_iget_logging(dirid, root); - /* - * It isn't an error if the inode isn't there, that can happen because - * we replay the deletes before we copy in the inode item from the log. - */ - if (IS_ERR(btrfs_dir)) { - btrfs_free_path(log_path); - ret = PTR_ERR(btrfs_dir); - if (ret == -ENOENT) - ret = 0; - return ret; - } - dir = &btrfs_dir->vfs_inode; + dir = read_one_inode(root, dirid); + /* it isn't an error if the inode isn't there, that can happen + * because we replay the deletes before we copy in the inode item + * from the log + */ + if (!dir) { + btrfs_free_path(log_path); + return 0; } range_start = 0; @@ -2551,15 +2484,10 @@ static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb, struct inode *inode; u64 from; - { - struct btrfs_inode *btrfs_inode; - - btrfs_inode = btrfs_iget_logging(key.objectid, root); - if (IS_ERR(btrfs_inode)) { - ret = PTR_ERR(btrfs_inode); - break; - } - inode = &btrfs_inode->vfs_inode; + inode = read_one_inode(root, key.objectid); + if (!inode) { + ret = -EIO; + break; } from = ALIGN(i_size_read(inode), root->fs_info->sectorsize); @@ -5491,6 +5419,7 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans, ihold(&curr_inode->vfs_inode); while (true) { + struct inode *vfs_inode; struct btrfs_key key; struct btrfs_key found_key; u64 next_index; @@ -5506,7 +5435,7 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans, struct extent_buffer *leaf = path->nodes[0]; struct btrfs_dir_item *di; struct btrfs_key di_key; - struct btrfs_inode *di_inode; + struct inode *di_inode; int log_mode = LOG_INODE_EXISTS; int type; @@ -5533,16 +5462,17 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans, goto out; } - if (!need_log_inode(trans, di_inode)) { - btrfs_add_delayed_iput(di_inode); + if (!need_log_inode(trans, BTRFS_I(di_inode))) { + btrfs_add_delayed_iput(BTRFS_I(di_inode)); break; } ctx->log_new_dentries = false; if (type == BTRFS_FT_DIR) log_mode = LOG_INODE_ALL; - ret = btrfs_log_inode(trans, di_inode, log_mode, ctx); - btrfs_add_delayed_iput(di_inode); + ret = btrfs_log_inode(trans, BTRFS_I(di_inode), + log_mode, ctx); + btrfs_add_delayed_iput(BTRFS_I(di_inode)); if (ret) goto out; if (ctx->log_new_dentries) { @@ -5584,13 +5514,14 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans, kfree(dir_elem); btrfs_add_delayed_iput(curr_inode); + curr_inode = NULL; - curr_inode = btrfs_iget_logging(ino, root); - if (IS_ERR(curr_inode)) { - ret = PTR_ERR(curr_inode); - curr_inode = NULL; + vfs_inode = btrfs_iget_logging(ino, root); + if (IS_ERR(vfs_inode)) { + ret = PTR_ERR(vfs_inode); break; } + curr_inode = BTRFS_I(vfs_inode); } out: btrfs_free_path(path); @@ -5668,7 +5599,7 @@ static int add_conflicting_inode(struct btrfs_trans_handle *trans, struct btrfs_log_ctx *ctx) { struct btrfs_ino_list *ino_elem; - struct btrfs_inode *inode; + struct inode *inode; /* * It's rare to have a lot of conflicting inodes, in practice it is not @@ -5759,12 +5690,12 @@ static int add_conflicting_inode(struct btrfs_trans_handle *trans, * inode in LOG_INODE_EXISTS mode and rename operations update the log, * so that the log ends up with the new name and without the old name. */ - if (!need_log_inode(trans, inode)) { - btrfs_add_delayed_iput(inode); + if (!need_log_inode(trans, BTRFS_I(inode))) { + btrfs_add_delayed_iput(BTRFS_I(inode)); return 0; } - btrfs_add_delayed_iput(inode); + btrfs_add_delayed_iput(BTRFS_I(inode)); ino_elem = kmalloc(sizeof(*ino_elem), GFP_NOFS); if (!ino_elem) @@ -5800,7 +5731,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, */ while (!list_empty(&ctx->conflict_inodes)) { struct btrfs_ino_list *curr; - struct btrfs_inode *inode; + struct inode *inode; u64 ino; u64 parent; @@ -5836,8 +5767,9 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, * dir index key range logged for the directory. So we * must make sure the deletion is recorded. */ - ret = btrfs_log_inode(trans, inode, LOG_INODE_ALL, ctx); - btrfs_add_delayed_iput(inode); + ret = btrfs_log_inode(trans, BTRFS_I(inode), + LOG_INODE_ALL, ctx); + btrfs_add_delayed_iput(BTRFS_I(inode)); if (ret) break; continue; @@ -5853,8 +5785,8 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, * it again because if some other task logged the inode after * that, we can avoid doing it again. */ - if (!need_log_inode(trans, inode)) { - btrfs_add_delayed_iput(inode); + if (!need_log_inode(trans, BTRFS_I(inode))) { + btrfs_add_delayed_iput(BTRFS_I(inode)); continue; } @@ -5865,8 +5797,8 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, * well because during a rename we pin the log and update the * log with the new name before we unpin it. */ - ret = btrfs_log_inode(trans, inode, LOG_INODE_EXISTS, ctx); - btrfs_add_delayed_iput(inode); + ret = btrfs_log_inode(trans, BTRFS_I(inode), LOG_INODE_EXISTS, ctx); + btrfs_add_delayed_iput(BTRFS_I(inode)); if (ret) break; } @@ -6358,7 +6290,7 @@ static int log_new_delayed_dentries(struct btrfs_trans_handle *trans, list_for_each_entry(item, delayed_ins_list, log_list) { struct btrfs_dir_item *dir_item; - struct btrfs_inode *di_inode; + struct inode *di_inode; struct btrfs_key key; int log_mode = LOG_INODE_EXISTS; @@ -6374,8 +6306,8 @@ static int log_new_delayed_dentries(struct btrfs_trans_handle *trans, break; } - if (!need_log_inode(trans, di_inode)) { - btrfs_add_delayed_iput(di_inode); + if (!need_log_inode(trans, BTRFS_I(di_inode))) { + btrfs_add_delayed_iput(BTRFS_I(di_inode)); continue; } @@ -6383,12 +6315,12 @@ static int log_new_delayed_dentries(struct btrfs_trans_handle *trans, log_mode = LOG_INODE_ALL; ctx->log_new_dentries = false; - ret = btrfs_log_inode(trans, di_inode, log_mode, ctx); + ret = btrfs_log_inode(trans, BTRFS_I(di_inode), log_mode, ctx); if (!ret && ctx->log_new_dentries) - ret = log_new_dir_dentries(trans, di_inode, ctx); + ret = log_new_dir_dentries(trans, BTRFS_I(di_inode), ctx); - btrfs_add_delayed_iput(di_inode); + btrfs_add_delayed_iput(BTRFS_I(di_inode)); if (ret) break; @@ -6796,7 +6728,7 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans, ptr = btrfs_item_ptr_offset(leaf, slot); while (cur_offset < item_size) { struct btrfs_key inode_key; - struct btrfs_inode *dir_inode; + struct inode *dir_inode; inode_key.type = BTRFS_INODE_ITEM_KEY; inode_key.offset = 0; @@ -6845,16 +6777,18 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans, goto out; } - if (!need_log_inode(trans, dir_inode)) { - btrfs_add_delayed_iput(dir_inode); + if (!need_log_inode(trans, BTRFS_I(dir_inode))) { + btrfs_add_delayed_iput(BTRFS_I(dir_inode)); continue; } ctx->log_new_dentries = false; - ret = btrfs_log_inode(trans, dir_inode, LOG_INODE_ALL, ctx); + ret = btrfs_log_inode(trans, BTRFS_I(dir_inode), + LOG_INODE_ALL, ctx); if (!ret && ctx->log_new_dentries) - ret = log_new_dir_dentries(trans, dir_inode, ctx); - btrfs_add_delayed_iput(dir_inode); + ret = log_new_dir_dentries(trans, + BTRFS_I(dir_inode), ctx); + btrfs_add_delayed_iput(BTRFS_I(dir_inode)); if (ret) goto out; } @@ -6879,7 +6813,7 @@ static int log_new_ancestors(struct btrfs_trans_handle *trans, struct extent_buffer *leaf; int slot; struct btrfs_key search_key; - struct btrfs_inode *inode; + struct inode *inode; u64 ino; int ret = 0; @@ -6894,10 +6828,11 @@ static int log_new_ancestors(struct btrfs_trans_handle *trans, if (IS_ERR(inode)) return PTR_ERR(inode); - if (inode->generation >= trans->transid && - need_log_inode(trans, inode)) - ret = btrfs_log_inode(trans, inode, LOG_INODE_EXISTS, ctx); - btrfs_add_delayed_iput(inode); + if (BTRFS_I(inode)->generation >= trans->transid && + need_log_inode(trans, BTRFS_I(inode))) + ret = btrfs_log_inode(trans, BTRFS_I(inode), + LOG_INODE_EXISTS, ctx); + btrfs_add_delayed_iput(BTRFS_I(inode)); if (ret) return ret; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 1eb543602ff12f3944810e0e79faf0190131a655..b9a0b26d08e1c4fb648c0657b50a3d679859fb24 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -3174,12 +3174,6 @@ int btrfs_remove_chunk(struct btrfs_trans_handle *trans, u64 chunk_offset) device->bytes_used - dev_extent_len); atomic64_add(dev_extent_len, &fs_info->free_chunk_space); btrfs_clear_space_info_full(fs_info); - - if (list_empty(&device->post_commit_list)) { - list_add_tail(&device->post_commit_list, - &trans->transaction->dev_update_list); - } - mutex_unlock(&fs_info->chunk_mutex); } } diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c index 239a6002083d701f4e46b944942d7e02891fa453..009d23cd435b544d2b7176c86a0f42eb4d2e2a4a 100644 --- a/fs/cachefiles/io.c +++ b/fs/cachefiles/io.c @@ -346,6 +346,8 @@ int __cachefiles_write(struct cachefiles_object *object, default: ki->was_async = false; cachefiles_write_complete(&ki->iocb, ret); + if (ret > 0) + ret = 0; break; } diff --git a/fs/cachefiles/ondemand.c b/fs/cachefiles/ondemand.c index cfa8f23fdfb6558ed93755a9aeb3ddcd02053ed9..3389a373faf6807db76b6681492d71a19f12f1d6 100644 --- a/fs/cachefiles/ondemand.c +++ b/fs/cachefiles/ondemand.c @@ -84,8 +84,10 @@ static ssize_t cachefiles_ondemand_fd_write_iter(struct kiocb *kiocb, trace_cachefiles_ondemand_fd_write(object, file_inode(file), pos, len); ret = __cachefiles_write(object, file, pos, iter, NULL, NULL); - if (ret > 0) + if (!ret) { + ret = len; kiocb->ki_pos += ret; + } out: fput(file); diff --git a/fs/ceph/file.c b/fs/ceph/file.c index e12657b4c3e0422b2595442f2da804e5e3cc2d4e..a03b11cf788721b2d548f2b931c13561e5608fd7 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -2513,7 +2513,7 @@ static int ceph_zero_objects(struct inode *inode, loff_t offset, loff_t length) s32 stripe_unit = ci->i_layout.stripe_unit; s32 stripe_count = ci->i_layout.stripe_count; s32 object_size = ci->i_layout.object_size; - u64 object_set_size = (u64) object_size * stripe_count; + u64 object_set_size = object_size * stripe_count; u64 nearly, t; /* round offset up to next period boundary */ diff --git a/fs/ceph/super.c b/fs/ceph/super.c index 84e855e8929b035f7fc74dcefae42b6673191def..29026ba4f0229007ca7fbaf056b7dffecfd905a3 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c @@ -1220,7 +1220,6 @@ static int ceph_set_super(struct super_block *s, struct fs_context *fc) s->s_time_min = 0; s->s_time_max = U32_MAX; s->s_flags |= SB_NODIRATIME | SB_NOATIME; - s->s_magic = CEPH_SUPER_MAGIC; ceph_fscrypt_set_ops(s); diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index 2df99cd1034d4e6184739cfa90f9e4cde23f374b..18677cd4e62f543187966501bb52364b5f6b3a55 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c @@ -593,7 +593,7 @@ static int populate_attrs(struct config_item *item) break; } } - if (!error && t->ct_bin_attrs) { + if (t->ct_bin_attrs) { for (i = 0; (bin_attr = t->ct_bin_attrs[i]) != NULL; i++) { error = configfs_create_bin_file(item, bin_attr); if (error) diff --git a/fs/coredump.c b/fs/coredump.c index d3a4f5dc2e362a3b65498df7afbb289c0f4eb84e..9d235fa14ab98f28fd8c334920647e682fa52767 100644 --- a/fs/coredump.c +++ b/fs/coredump.c @@ -42,7 +42,6 @@ #include #include #include -#include #include #include @@ -57,13 +56,6 @@ static bool dump_vma_snapshot(struct coredump_params *cprm); static void free_vma_snapshot(struct coredump_params *cprm); -/* - * File descriptor number for the pidfd for the thread-group leader of - * the coredumping task installed into the usermode helper's file - * descriptor table. - */ -#define COREDUMP_PIDFD_NUMBER 3 - static int core_uses_pid; static unsigned int core_pipe_limit; static char core_pattern[CORENAME_MAX_SIZE] = "core"; @@ -340,27 +332,6 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm, case 'C': err = cn_printf(cn, "%d", cprm->cpu); break; - /* pidfd number */ - case 'F': { - /* - * Installing a pidfd only makes sense if - * we actually spawn a usermode helper. - */ - if (!ispipe) - break; - - /* - * Note that we'll install a pidfd for the - * thread-group leader. We know that task - * linkage hasn't been removed yet and even if - * this @current isn't the actual thread-group - * leader we know that the thread-group leader - * cannot be reaped until @current has exited. - */ - cprm->pid = task_tgid(current); - err = cn_printf(cn, "%d", COREDUMP_PIDFD_NUMBER); - break; - } default: break; } @@ -517,7 +488,7 @@ static void wait_for_dump_helpers(struct file *file) } /* - * umh_coredump_setup + * umh_pipe_setup * helper function to customize the process used * to collect the core in userspace. Specifically * it sets up a pipe and installs it as fd 0 (stdin) @@ -527,61 +498,21 @@ static void wait_for_dump_helpers(struct file *file) * is a special value that we use to trap recursive * core dumps */ -static int umh_coredump_setup(struct subprocess_info *info, struct cred *new) +static int umh_pipe_setup(struct subprocess_info *info, struct cred *new) { struct file *files[2]; - struct file *pidfs_file = NULL; struct coredump_params *cp = (struct coredump_params *)info->data; - int err; - - if (cp->pid) { - int fd; - - fd = pidfd_prepare(cp->pid, 0, &pidfs_file); - if (fd < 0) - return fd; - - /* - * We don't care about the fd. We also cannot simply - * replace it below because dup2() will refuse to close - * this file descriptor if its in a larval state. So - * close it! - */ - put_unused_fd(fd); - - /* - * Usermode helpers are childen of either - * system_unbound_wq or of kthreadd. So we know that - * we're starting off with a clean file descriptor - * table. So we should always be able to use - * COREDUMP_PIDFD_NUMBER as our file descriptor value. - */ - err = replace_fd(COREDUMP_PIDFD_NUMBER, pidfs_file, 0); - if (err < 0) - goto out_fail; - - pidfs_file = NULL; - } - - err = create_pipe_files(files, 0); + int err = create_pipe_files(files, 0); if (err) - goto out_fail; + return err; cp->file = files[1]; err = replace_fd(0, files[0], 0); fput(files[0]); - if (err < 0) - goto out_fail; - /* and disallow core files too */ current->signal->rlim[RLIMIT_CORE] = (struct rlimit){1, 1}; - err = 0; - -out_fail: - if (pidfs_file) - fput(pidfs_file); return err; } @@ -658,7 +589,7 @@ void do_coredump(const kernel_siginfo_t *siginfo) } if (cprm.limit == 1) { - /* See umh_coredump_setup() which sets RLIMIT_CORE = 1. + /* See umh_pipe_setup() which sets RLIMIT_CORE = 1. * * Normally core limits are irrelevant to pipes, since * we're not writing to the file system, but we use @@ -703,7 +634,7 @@ void do_coredump(const kernel_siginfo_t *siginfo) retval = -ENOMEM; sub_info = call_usermodehelper_setup(helper_argv[0], helper_argv, NULL, GFP_KERNEL, - umh_coredump_setup, NULL, &cprm); + umh_pipe_setup, NULL, &cprm); if (sub_info) retval = call_usermodehelper_exec(sub_info, UMH_WAIT_EXEC); diff --git a/fs/erofs/data.c b/fs/erofs/data.c index 51250ac184a5287f7a8d910f8f1d60c0fb1bde4a..19ab9bb3a9a0e12178ba508d3517460578b74a32 100644 --- a/fs/erofs/data.c +++ b/fs/erofs/data.c @@ -358,8 +358,6 @@ int erofs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, */ static int erofs_read_folio(struct file *file, struct folio *folio) { - trace_erofs_read_folio(folio, true); - return iomap_read_folio(folio, &erofs_iomap_ops); } diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c index 86e088fd386ee5fde2f7403001c68266a9b6de1a..aa59788a61e6e4530c264b2baaa637ad8ed7e1d4 100644 --- a/fs/erofs/decompressor.c +++ b/fs/erofs/decompressor.c @@ -342,12 +342,14 @@ static int z_erofs_transform_plain(struct z_erofs_decompress_req *rq, if (outpages > inpages) { DBG_BUGON(!rq->out[outpages - 1]); - if (rq->out[outpages - 1] != rq->in[inpages - 1]) + if (rq->out[outpages - 1] != rq->in[inpages - 1]) { memcpy_to_page(rq->out[outpages - 1], 0, src + (interlaced_offset ? 0 : righthalf), lefthalf); - else if (!interlaced_offset) + } else if (!interlaced_offset) { memmove(src, src + righthalf, lefthalf); + flush_dcache_page(rq->in[inpages - 1]); + } } kunmap_local(src); return 0; diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index d852b43ac43e324e220e247bda22180727e55138..496e4c7c52a4e0123230c86f2999c9ba75a630c6 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -122,11 +122,9 @@ static inline unsigned int z_erofs_pclusterpages(struct z_erofs_pcluster *pcl) /* * bit 30: I/O error occurred on this page - * bit 29: CPU has dirty data in D-cache (needs aliasing handling); * bit 0 - 29: remaining parts to complete this page */ -#define Z_EROFS_ONLINEPAGE_EIO 30 -#define Z_EROFS_ONLINEPAGE_DIRTY 29 +#define Z_EROFS_PAGE_EIO (1 << 30) static inline void z_erofs_onlinepage_init(struct page *page) { @@ -145,7 +143,7 @@ static inline void z_erofs_onlinepage_split(struct page *page) atomic_inc((atomic_t *)&page->private); } -static void z_erofs_onlinepage_end(struct page *page, int err, bool dirty) +static void z_erofs_onlinepage_endio(struct page *page, int err) { int orig, v; @@ -153,20 +151,16 @@ static void z_erofs_onlinepage_end(struct page *page, int err, bool dirty) do { orig = atomic_read((atomic_t *)&page->private); - DBG_BUGON(orig <= 0); - v = dirty << Z_EROFS_ONLINEPAGE_DIRTY; - v |= (orig - 1) | (!!err << Z_EROFS_ONLINEPAGE_EIO); + v = (orig - 1) | (err ? Z_EROFS_PAGE_EIO : 0); } while (atomic_cmpxchg((atomic_t *)&page->private, orig, v) != orig); - if (v & (BIT(Z_EROFS_ONLINEPAGE_DIRTY) - 1)) - return; - set_page_private(page, 0); - ClearPagePrivate(page); - if (v & BIT(Z_EROFS_ONLINEPAGE_DIRTY)) - flush_dcache_page(page); - if (!(v & BIT(Z_EROFS_ONLINEPAGE_EIO))) - SetPageUptodate(page); - unlock_page(page); + if (!(v & ~Z_EROFS_PAGE_EIO)) { + set_page_private(page, 0); + ClearPagePrivate(page); + if (!(v & Z_EROFS_PAGE_EIO)) + SetPageUptodate(page); + unlock_page(page); + } } #define Z_EROFS_ONSTACK_PAGES 32 @@ -1066,7 +1060,7 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe, goto repeat; out: - z_erofs_onlinepage_end(page, err, false); + z_erofs_onlinepage_endio(page, err); return err; } @@ -1169,7 +1163,7 @@ static void z_erofs_fill_other_copies(struct z_erofs_decompress_backend *be, cur += len; } kunmap_local(dst); - z_erofs_onlinepage_end(bvi->bvec.page, err, true); + z_erofs_onlinepage_endio(bvi->bvec.page, err); list_del(p); kfree(bvi); } @@ -1339,7 +1333,7 @@ static int z_erofs_decompress_pcluster(struct z_erofs_decompress_backend *be, /* recycle all individual short-lived pages */ if (z_erofs_put_shortlivedpage(be->pagepool, page)) continue; - z_erofs_onlinepage_end(page, err, true); + z_erofs_onlinepage_endio(page, err); } if (be->decompressed_pages != be->onstack_pages) diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 31b32d9e7bbcea4b17d012acf1d1cdb5ed17776c..cde5a15b129f6339fb99845fb67c5c6420e9ee71 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -772,7 +772,7 @@ static bool __ep_remove(struct eventpoll *ep, struct epitem *epi, bool force) call_rcu(&epi->rcu, epi_rcu_free); percpu_counter_dec(&ep->user->epoll_watches); - return true; + return ep_refcount_dec_and_test(ep); } /* @@ -780,14 +780,14 @@ static bool __ep_remove(struct eventpoll *ep, struct epitem *epi, bool force) */ static void ep_remove_safe(struct eventpoll *ep, struct epitem *epi) { - if (__ep_remove(ep, epi, false)) - WARN_ON_ONCE(ep_refcount_dec_and_test(ep)); + WARN_ON_ONCE(__ep_remove(ep, epi, false)); } static void ep_clear_and_put(struct eventpoll *ep) { struct rb_node *rbp, *next; struct epitem *epi; + bool dispose; /* We need to release all tasks waiting for these file */ if (waitqueue_active(&ep->poll_wait)) @@ -820,8 +820,10 @@ static void ep_clear_and_put(struct eventpoll *ep) cond_resched(); } + dispose = ep_refcount_dec_and_test(ep); mutex_unlock(&ep->mtx); - if (ep_refcount_dec_and_test(ep)) + + if (dispose) ep_free(ep); } @@ -1001,7 +1003,7 @@ void eventpoll_release_file(struct file *file) dispose = __ep_remove(ep, epi, true); mutex_unlock(&ep->mtx); - if (dispose && ep_refcount_dec_and_test(ep)) + if (dispose) ep_free(ep); goto again; } diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index fe46e8863d67dbad2c939ce0fb26f25859df81de..1c6bb23dd9c76b6a91a37efebd5d865304b5c7f8 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2996,8 +2996,6 @@ extern int ext4_inode_attach_jinode(struct inode *inode); extern int ext4_can_truncate(struct inode *inode); extern int ext4_truncate(struct inode *); extern int ext4_break_layouts(struct inode *); -extern int ext4_truncate_page_cache_block_range(struct inode *inode, - loff_t start, loff_t end); extern int ext4_punch_hole(struct file *file, loff_t offset, loff_t length); extern void ext4_set_inode_flags(struct inode *, bool init); extern int ext4_alloc_da_blocks(struct inode *inode); @@ -3352,13 +3350,6 @@ static inline unsigned int ext4_flex_bg_size(struct ext4_sb_info *sbi) return 1 << sbi->s_log_groups_per_flex; } -static inline loff_t ext4_get_maxbytes(struct inode *inode) -{ - if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) - return inode->i_sb->s_maxbytes; - return EXT4_SB(inode->i_sb)->s_bitmap_maxbytes; -} - #define ext4_std_error(sb, errno) \ do { \ if ((errno)) \ diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 3d8cdf55341514cefb1b5ea3f3627e6f3467e3e3..a6ba89d19251cfcb81834222453427bdd307fffd 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -2374,19 +2374,18 @@ int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int nrblocks, int ext4_ext_index_trans_blocks(struct inode *inode, int extents) { int index; + int depth; /* If we are converting the inline data, only one is needed here. */ if (ext4_has_inline_data(inode)) return 1; - /* - * Extent tree can change between the time we estimate credits and - * the time we actually modify the tree. Assume the worst case. - */ + depth = ext_depth(inode); + if (extents <= 1) - index = EXT4_MAX_EXTENT_DEPTH * 2; + index = depth * 2; else - index = EXT4_MAX_EXTENT_DEPTH * 3; + index = depth * 3; return index; } @@ -4662,13 +4661,22 @@ static long ext4_zero_range(struct file *file, loff_t offset, goto out_mutex; } - /* Now release the pages and zero block aligned part of pages */ - ret = ext4_truncate_page_cache_block_range(inode, start, end); - if (ret) { - filemap_invalidate_unlock(mapping); - goto out_mutex; + /* + * For journalled data we need to write (and checkpoint) pages + * before discarding page cache to avoid inconsitent data on + * disk in case of crash before zeroing trans is committed. + */ + if (ext4_should_journal_data(inode)) { + ret = filemap_write_and_wait_range(mapping, start, + end - 1); + if (ret) { + filemap_invalidate_unlock(mapping); + goto out_mutex; + } } + /* Now release the pages and zero block aligned part of pages */ + truncate_pagecache_range(inode, start, end - 1); inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); ret = ext4_alloc_file_blocks(file, lblk, max_blocks, new_size, @@ -4971,7 +4979,12 @@ static const struct iomap_ops ext4_iomap_xattr_ops = { static int ext4_fiemap_check_ranges(struct inode *inode, u64 start, u64 *len) { - u64 maxbytes = ext4_get_maxbytes(inode); + u64 maxbytes; + + if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) + maxbytes = inode->i_sb->s_maxbytes; + else + maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes; if (*len == 0) return -EINVAL; diff --git a/fs/ext4/file.c b/fs/ext4/file.c index b37e0e4a71bfbeb14b85b2a23754089096b382c2..c71af675e310afd9b98c0756dca68cca6f6ce0d9 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -898,7 +898,12 @@ static int ext4_file_open(struct inode *inode, struct file *filp) loff_t ext4_llseek(struct file *file, loff_t offset, int whence) { struct inode *inode = file->f_mapping->host; - loff_t maxbytes = ext4_get_maxbytes(inode); + loff_t maxbytes; + + if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) + maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes; + else + maxbytes = inode->i_sb->s_maxbytes; switch (whence) { default: diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index c85647a0ba09fb9840f4d1347e62e21a61b2b9bb..3f363276ddd36074d4063e11d7a281bc5c0f4d45 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -392,7 +392,7 @@ static int ext4_update_inline_data(handle_t *handle, struct inode *inode, } static int ext4_prepare_inline_data(handle_t *handle, struct inode *inode, - loff_t len) + unsigned int len) { int ret, size, no_expand; struct ext4_inode_info *ei = EXT4_I(inode); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 9694ef6b996e47627ca5e7dcd92c953dbdf34a80..d3d28e658720271241e466d69ae7768400aa75a5 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -1011,12 +1010,7 @@ int ext4_walk_page_buffers(handle_t *handle, struct inode *inode, */ static int ext4_dirty_journalled_data(handle_t *handle, struct buffer_head *bh) { - struct folio *folio = bh->b_folio; - struct inode *inode = folio->mapping->host; - - /* only regular files have a_ops */ - if (S_ISREG(inode->i_mode)) - folio_mark_dirty(folio); + folio_mark_dirty(bh->b_folio); return ext4_handle_dirty_metadata(handle, NULL, bh); } @@ -3898,68 +3892,6 @@ int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset, return ret; } -static inline void ext4_truncate_folio(struct inode *inode, - loff_t start, loff_t end) -{ - unsigned long blocksize = i_blocksize(inode); - struct folio *folio; - - /* Nothing to be done if no complete block needs to be truncated. */ - if (round_up(start, blocksize) >= round_down(end, blocksize)) - return; - - folio = filemap_lock_folio(inode->i_mapping, start >> PAGE_SHIFT); - if (IS_ERR(folio)) - return; - - if (folio_mkclean(folio)) - folio_mark_dirty(folio); - folio_unlock(folio); - folio_put(folio); -} - -int ext4_truncate_page_cache_block_range(struct inode *inode, - loff_t start, loff_t end) -{ - unsigned long blocksize = i_blocksize(inode); - int ret; - - /* - * For journalled data we need to write (and checkpoint) pages - * before discarding page cache to avoid inconsitent data on disk - * in case of crash before freeing or unwritten converting trans - * is committed. - */ - if (ext4_should_journal_data(inode)) { - ret = filemap_write_and_wait_range(inode->i_mapping, start, - end - 1); - if (ret) - return ret; - goto truncate_pagecache; - } - - /* - * If the block size is less than the page size, the file's mapped - * blocks within one page could be freed or converted to unwritten. - * So it's necessary to remove writable userspace mappings, and then - * ext4_page_mkwrite() can be called during subsequent write access - * to these partial folios. - */ - if (!IS_ALIGNED(start | end, PAGE_SIZE) && - blocksize < PAGE_SIZE && start < inode->i_size) { - loff_t page_boundary = round_up(start, PAGE_SIZE); - - ext4_truncate_folio(inode, start, min(page_boundary, end)); - if (end > page_boundary) - ext4_truncate_folio(inode, - round_down(end, PAGE_SIZE), end); - } - -truncate_pagecache: - truncate_pagecache_range(inode, start, end - 1); - return 0; -} - static void ext4_wait_dax_page(struct inode *inode) { filemap_invalidate_unlock(inode->i_mapping); @@ -4014,6 +3946,17 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length) trace_ext4_punch_hole(inode, offset, length, 0); + /* + * Write out all dirty pages to avoid race conditions + * Then release them. + */ + if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) { + ret = filemap_write_and_wait_range(mapping, offset, + offset + length - 1); + if (ret) + return ret; + } + inode_lock(inode); /* No need to punch hole beyond i_size */ @@ -4075,11 +4018,8 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length) ret = ext4_update_disksize_before_punch(inode, offset, length); if (ret) goto out_dio; - - ret = ext4_truncate_page_cache_block_range(inode, - first_block_offset, last_block_offset + 1); - if (ret) - goto out_dio; + truncate_pagecache_range(inode, first_block_offset, + last_block_offset); } if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) @@ -4944,8 +4884,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, ei->i_file_acl |= ((__u64)le16_to_cpu(raw_inode->i_file_acl_high)) << 32; inode->i_size = ext4_isize(sb, raw_inode); - size = i_size_read(inode); - if (size < 0 || size > ext4_get_maxbytes(inode)) { + if ((size = i_size_read(inode)) < 0) { ext4_error_inode(inode, function, line, 0, "iget: bad i_size value: %lld", size); ret = -EFSCORRUPTED; diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index e962de4ecaa2f6272c673fa5fe61ec85480c5600..f7ef69f44f3d844b3774797e788fa0d6b48b2147 100644 --- a/fs/f2fs/compress.c +++ b/fs/f2fs/compress.c @@ -176,7 +176,8 @@ void f2fs_compress_ctx_add_page(struct compress_ctx *cc, struct page *page) #ifdef CONFIG_F2FS_FS_LZO static int lzo_init_compress_ctx(struct compress_ctx *cc) { - cc->private = f2fs_vmalloc(LZO1X_MEM_COMPRESS); + cc->private = f2fs_kvmalloc(F2FS_I_SB(cc->inode), + LZO1X_MEM_COMPRESS, GFP_NOFS); if (!cc->private) return -ENOMEM; @@ -186,7 +187,7 @@ static int lzo_init_compress_ctx(struct compress_ctx *cc) static void lzo_destroy_compress_ctx(struct compress_ctx *cc) { - vfree(cc->private); + kvfree(cc->private); cc->private = NULL; } @@ -243,7 +244,7 @@ static int lz4_init_compress_ctx(struct compress_ctx *cc) size = LZ4HC_MEM_COMPRESS; #endif - cc->private = f2fs_vmalloc(size); + cc->private = f2fs_kvmalloc(F2FS_I_SB(cc->inode), size, GFP_NOFS); if (!cc->private) return -ENOMEM; @@ -258,7 +259,7 @@ static int lz4_init_compress_ctx(struct compress_ctx *cc) static void lz4_destroy_compress_ctx(struct compress_ctx *cc) { - vfree(cc->private); + kvfree(cc->private); cc->private = NULL; } @@ -339,7 +340,8 @@ static int zstd_init_compress_ctx(struct compress_ctx *cc) params = zstd_get_params(level, cc->rlen); workspace_size = zstd_cstream_workspace_bound(¶ms.cParams); - workspace = f2fs_vmalloc(workspace_size); + workspace = f2fs_kvmalloc(F2FS_I_SB(cc->inode), + workspace_size, GFP_NOFS); if (!workspace) return -ENOMEM; @@ -347,7 +349,7 @@ static int zstd_init_compress_ctx(struct compress_ctx *cc) if (!stream) { f2fs_err_ratelimited(F2FS_I_SB(cc->inode), "%s zstd_init_cstream failed", __func__); - vfree(workspace); + kvfree(workspace); return -EIO; } @@ -360,7 +362,7 @@ static int zstd_init_compress_ctx(struct compress_ctx *cc) static void zstd_destroy_compress_ctx(struct compress_ctx *cc) { - vfree(cc->private); + kvfree(cc->private); cc->private = NULL; cc->private2 = NULL; } @@ -419,7 +421,8 @@ static int zstd_init_decompress_ctx(struct decompress_io_ctx *dic) workspace_size = zstd_dstream_workspace_bound(max_window_size); - workspace = f2fs_vmalloc(workspace_size); + workspace = f2fs_kvmalloc(F2FS_I_SB(dic->inode), + workspace_size, GFP_NOFS); if (!workspace) return -ENOMEM; @@ -427,7 +430,7 @@ static int zstd_init_decompress_ctx(struct decompress_io_ctx *dic) if (!stream) { f2fs_err_ratelimited(F2FS_I_SB(dic->inode), "%s zstd_init_dstream failed", __func__); - vfree(workspace); + kvfree(workspace); return -EIO; } @@ -439,7 +442,7 @@ static int zstd_init_decompress_ctx(struct decompress_io_ctx *dic) static void zstd_destroy_decompress_ctx(struct decompress_io_ctx *dic) { - vfree(dic->private); + kvfree(dic->private); dic->private = NULL; dic->private2 = NULL; } diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index a123bb26acd8bd3d699d184bb24e2febad2e6548..acd0764b0286c83fa790304b4d7514ccd0163797 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -54,8 +54,8 @@ bool f2fs_is_cp_guaranteed(struct page *page) struct inode *inode; struct f2fs_sb_info *sbi; - if (fscrypt_is_bounce_page(page)) - return page_private_gcing(fscrypt_pagecache_page(page)); + if (!mapping) + return false; inode = mapping->host; sbi = F2FS_I_SB(inode); diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index fc729ac495a46a0c19c753636cb408ff87911fb0..584206684b7153dd3ecf96f4b5db881128630c61 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -2474,14 +2474,8 @@ static inline void dec_valid_block_count(struct f2fs_sb_info *sbi, blkcnt_t sectors = count << F2FS_LOG_SECTORS_PER_BLOCK; spin_lock(&sbi->stat_lock); - if (unlikely(sbi->total_valid_block_count < count)) { - f2fs_warn(sbi, "Inconsistent total_valid_block_count:%u, ino:%lu, count:%u", - sbi->total_valid_block_count, inode->i_ino, count); - sbi->total_valid_block_count = 0; - set_sbi_flag(sbi, SBI_NEED_FSCK); - } else { - sbi->total_valid_block_count -= count; - } + f2fs_bug_on(sbi, sbi->total_valid_block_count < (block_t) count); + sbi->total_valid_block_count -= (block_t)count; if (sbi->reserved_blocks && sbi->current_reserved_blocks < sbi->reserved_blocks) sbi->current_reserved_blocks = min(sbi->reserved_blocks, @@ -3449,11 +3443,6 @@ static inline void *f2fs_kvzalloc(struct f2fs_sb_info *sbi, return f2fs_kvmalloc(sbi, size, flags | __GFP_ZERO); } -static inline void *f2fs_vmalloc(size_t size) -{ - return vmalloc(size); -} - static inline int get_extra_isize(struct inode *inode) { return F2FS_I(inode)->i_extra_isize / sizeof(__le32); diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index fa94dc66ce5f6cbdb8a906bf44be04e183397b5c..49a1ed7325c3b2433b340fc4c4f5d1eff1af1e6f 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -36,21 +36,9 @@ #include #include -static void f2fs_zero_post_eof_page(struct inode *inode, loff_t new_size) -{ - loff_t old_size = i_size_read(inode); - - if (old_size >= new_size) - return; - - /* zero or drop pages only in range of [old_size, new_size] */ - truncate_pagecache(inode, old_size); -} - static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf) { struct inode *inode = file_inode(vmf->vma->vm_file); - vm_flags_t flags = vmf->vma->vm_flags; vm_fault_t ret; ret = filemap_fault(vmf); @@ -58,50 +46,47 @@ static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf) f2fs_update_iostat(F2FS_I_SB(inode), inode, APP_MAPPED_READ_IO, F2FS_BLKSIZE); - trace_f2fs_filemap_fault(inode, vmf->pgoff, flags, ret); + trace_f2fs_filemap_fault(inode, vmf->pgoff, (unsigned long)ret); return ret; } static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) { - struct folio *folio = page_folio(vmf->page); + struct page *page = vmf->page; struct inode *inode = file_inode(vmf->vma->vm_file); struct f2fs_sb_info *sbi = F2FS_I_SB(inode); struct dnode_of_data dn; - bool need_alloc = !f2fs_is_pinned_file(inode); + bool need_alloc = true; int err = 0; - vm_fault_t ret; if (unlikely(IS_IMMUTABLE(inode))) return VM_FAULT_SIGBUS; - if (is_inode_flag_set(inode, FI_COMPRESS_RELEASED)) { - err = -EIO; - goto out; - } + if (is_inode_flag_set(inode, FI_COMPRESS_RELEASED)) + return VM_FAULT_SIGBUS; if (unlikely(f2fs_cp_error(sbi))) { err = -EIO; - goto out; + goto err; } if (!f2fs_is_checkpoint_ready(sbi)) { err = -ENOSPC; - goto out; + goto err; } err = f2fs_convert_inline_inode(inode); if (err) - goto out; + goto err; #ifdef CONFIG_F2FS_FS_COMPRESSION if (f2fs_compressed_file(inode)) { - int ret = f2fs_is_compressed_cluster(inode, folio->index); + int ret = f2fs_is_compressed_cluster(inode, page->index); if (ret < 0) { err = ret; - goto out; + goto err; } else if (ret) { need_alloc = false; } @@ -115,40 +100,36 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); - filemap_invalidate_lock(inode->i_mapping); - f2fs_zero_post_eof_page(inode, (folio->index + 1) << PAGE_SHIFT); - filemap_invalidate_unlock(inode->i_mapping); - file_update_time(vmf->vma->vm_file); filemap_invalidate_lock_shared(inode->i_mapping); - - folio_lock(folio); - if (unlikely(folio->mapping != inode->i_mapping || - folio_pos(folio) > i_size_read(inode) || - !folio_test_uptodate(folio))) { - folio_unlock(folio); + lock_page(page); + if (unlikely(page->mapping != inode->i_mapping || + page_offset(page) > i_size_read(inode) || + !PageUptodate(page))) { + unlock_page(page); err = -EFAULT; goto out_sem; } - set_new_dnode(&dn, inode, NULL, NULL, 0); if (need_alloc) { /* block allocation */ - err = f2fs_get_block_locked(&dn, folio->index); - } else { - err = f2fs_get_dnode_of_data(&dn, folio->index, LOOKUP_NODE); - f2fs_put_dnode(&dn); - if (f2fs_is_pinned_file(inode) && - !__is_valid_data_blkaddr(dn.data_blkaddr)) - err = -EIO; + set_new_dnode(&dn, inode, NULL, NULL, 0); + err = f2fs_get_block_locked(&dn, page->index); } +#ifdef CONFIG_F2FS_FS_COMPRESSION + if (!need_alloc) { + set_new_dnode(&dn, inode, NULL, NULL, 0); + err = f2fs_get_dnode_of_data(&dn, page->index, LOOKUP_NODE); + f2fs_put_dnode(&dn); + } +#endif if (err) { - folio_unlock(folio); + unlock_page(page); goto out_sem; } - f2fs_wait_on_page_writeback(folio_page(folio, 0), DATA, false, true); + f2fs_wait_on_page_writeback(page, DATA, false, true); /* wait for GCed page writeback via META_MAPPING */ f2fs_wait_on_block_writeback(inode, dn.data_blkaddr); @@ -156,31 +137,29 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) /* * check to see if the page is mapped already (no holes) */ - if (folio_test_mappedtodisk(folio)) + if (PageMappedToDisk(page)) goto out_sem; /* page is wholly or partially inside EOF */ - if (((loff_t)(folio->index + 1) << PAGE_SHIFT) > + if (((loff_t)(page->index + 1) << PAGE_SHIFT) > i_size_read(inode)) { loff_t offset; offset = i_size_read(inode) & ~PAGE_MASK; - folio_zero_segment(folio, offset, folio_size(folio)); + zero_user_segment(page, offset, PAGE_SIZE); } - folio_mark_dirty(folio); + set_page_dirty(page); f2fs_update_iostat(sbi, inode, APP_MAPPED_IO, F2FS_BLKSIZE); f2fs_update_time(sbi, REQ_TIME); + trace_f2fs_vm_page_mkwrite(page, DATA); out_sem: filemap_invalidate_unlock_shared(inode->i_mapping); sb_end_pagefault(inode->i_sb); -out: - ret = vmf_fs_error(err); - - trace_f2fs_vm_page_mkwrite(inode, folio->index, vmf->vma->vm_flags, ret); - return ret; +err: + return vmf_fs_error(err); } static const struct vm_operations_struct f2fs_file_vm_ops = { @@ -1068,8 +1047,6 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); filemap_invalidate_lock(inode->i_mapping); - if (attr->ia_size > old_size) - f2fs_zero_post_eof_page(inode, attr->ia_size); truncate_setsize(inode, attr->ia_size); if (attr->ia_size <= old_size) @@ -1188,10 +1165,6 @@ static int f2fs_punch_hole(struct inode *inode, loff_t offset, loff_t len) if (ret) return ret; - filemap_invalidate_lock(inode->i_mapping); - f2fs_zero_post_eof_page(inode, offset + len); - filemap_invalidate_unlock(inode->i_mapping); - pg_start = ((unsigned long long) offset) >> PAGE_SHIFT; pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT; @@ -1476,8 +1449,6 @@ static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len) f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); filemap_invalidate_lock(inode->i_mapping); - f2fs_zero_post_eof_page(inode, offset + len); - f2fs_lock_op(sbi); f2fs_drop_extent_tree(inode); truncate_pagecache(inode, offset); @@ -1600,10 +1571,6 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len, if (ret) return ret; - filemap_invalidate_lock(mapping); - f2fs_zero_post_eof_page(inode, offset + len); - filemap_invalidate_unlock(mapping); - pg_start = ((unsigned long long) offset) >> PAGE_SHIFT; pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT; @@ -1735,8 +1702,6 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) /* avoid gc operation during block exchange */ f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); filemap_invalidate_lock(mapping); - - f2fs_zero_post_eof_page(inode, offset + len); truncate_pagecache(inode, offset); while (!ret && idx > pg_start) { @@ -1792,10 +1757,6 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset, if (err) return err; - filemap_invalidate_lock(inode->i_mapping); - f2fs_zero_post_eof_page(inode, offset + len); - filemap_invalidate_unlock(inode->i_mapping); - f2fs_balance_fs(sbi, true); pg_start = ((unsigned long long)offset) >> PAGE_SHIFT; @@ -3366,7 +3327,7 @@ static int f2fs_ioc_set_pin_file(struct file *filp, unsigned long arg) goto done; } - if (F2FS_HAS_BLOCKS(inode)) { + if (f2fs_sb_has_blkzoned(sbi) && F2FS_HAS_BLOCKS(inode)) { ret = -EFBIG; goto out; } @@ -4730,10 +4691,6 @@ static ssize_t f2fs_write_checks(struct kiocb *iocb, struct iov_iter *from) err = file_modified(file); if (err) return err; - - filemap_invalidate_lock(inode->i_mapping); - f2fs_zero_post_eof_page(inode, iocb->ki_pos + iov_iter_count(from)); - filemap_invalidate_unlock(inode->i_mapping); return count; } @@ -4978,8 +4935,6 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) bool dio; bool may_need_sync = true; int preallocated; - const loff_t pos = iocb->ki_pos; - const ssize_t count = iov_iter_count(from); ssize_t ret; if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) { @@ -5001,12 +4956,6 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) inode_lock(inode); } - if (f2fs_is_pinned_file(inode) && - !f2fs_overwrite_io(inode, pos, count)) { - ret = -EIO; - goto out_unlock; - } - ret = f2fs_write_checks(iocb, from); if (ret <= 0) goto out_unlock; diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 66721c2093c0231a3039e1a4d2d77934b096aa0d..06941705e8939fd55f1f0f388bb59ccc5a9d1915 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -35,9 +35,7 @@ void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync) if (f2fs_inode_dirtied(inode, sync)) return; - /* only atomic file w/ FI_ATOMIC_COMMITTED can be set vfs dirty */ - if (f2fs_is_atomic_file(inode) && - !is_inode_flag_set(inode, FI_ATOMIC_COMMITTED)) + if (f2fs_is_atomic_file(inode)) return; mark_inode_dirty_sync(inode); @@ -287,12 +285,6 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page) return false; } - if (ino_of_node(node_page) == fi->i_xattr_nid) { - f2fs_warn(sbi, "%s: corrupted inode i_ino=%lx, xnid=%x, run fsck to fix.", - __func__, inode->i_ino, fi->i_xattr_nid); - return false; - } - if (f2fs_has_extra_attr(inode)) { if (!f2fs_sb_has_extra_attr(sbi)) { f2fs_warn(sbi, "%s: inode (ino=%lx) is with extra_attr, but extra_attr feature is off", diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 523009bc273209cf0ec2e01f9f9f75a1dc4b718c..2e08e1fdf485c75dd6426791397a53cc2d7eeba0 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -411,7 +411,7 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir, if (is_inode_flag_set(dir, FI_PROJ_INHERIT) && (!projid_eq(F2FS_I(dir)->i_projid, - F2FS_I(inode)->i_projid))) + F2FS_I(old_dentry->d_inode)->i_projid))) return -EXDEV; err = f2fs_dquot_initialize(dir); @@ -560,15 +560,6 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) goto fail; } - if (unlikely(inode->i_nlink == 0)) { - f2fs_warn(F2FS_I_SB(inode), "%s: inode (ino=%lx) has zero i_nlink", - __func__, inode->i_ino); - err = -EFSCORRUPTED; - set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK); - f2fs_put_page(page, 0); - goto fail; - } - f2fs_balance_fs(sbi, true); f2fs_lock_op(sbi); @@ -914,7 +905,7 @@ static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir, if (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) && (!projid_eq(F2FS_I(new_dir)->i_projid, - F2FS_I(old_inode)->i_projid))) + F2FS_I(old_dentry->d_inode)->i_projid))) return -EXDEV; /* @@ -1110,10 +1101,10 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, if ((is_inode_flag_set(new_dir, FI_PROJ_INHERIT) && !projid_eq(F2FS_I(new_dir)->i_projid, - F2FS_I(old_inode)->i_projid)) || - (is_inode_flag_set(old_dir, FI_PROJ_INHERIT) && + F2FS_I(old_dentry->d_inode)->i_projid)) || + (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) && !projid_eq(F2FS_I(old_dir)->i_projid, - F2FS_I(new_inode)->i_projid))) + F2FS_I(new_dentry->d_inode)->i_projid))) return -EXDEV; err = f2fs_dquot_initialize(old_dir); diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index c7714e954cb5400d1f85f95099a025c91dc2aad7..156d92b945258a4ecd011907b388bf63b9c80430 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -372,13 +372,7 @@ static int __f2fs_commit_atomic_write(struct inode *inode) } else { sbi->committed_atomic_block += fi->atomic_write_cnt; set_inode_flag(inode, FI_ATOMIC_COMMITTED); - - /* - * inode may has no FI_ATOMIC_DIRTIED flag due to no write - * before commit. - */ if (is_inode_flag_set(inode, FI_ATOMIC_DIRTIED)) { - /* clear atomic dirty status and set vfs dirty status */ clear_inode_flag(inode, FI_ATOMIC_DIRTIED); f2fs_mark_inode_dirty_sync(inode, true); } diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index b9913ab526fd1a47b764e37d638b4e8ac703970a..4cc87921aac3ed47404c7fe0906f309d94de24b6 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1500,9 +1500,7 @@ int f2fs_inode_dirtied(struct inode *inode, bool sync) } spin_unlock(&sbi->inode_lock[DIRTY_META]); - /* if atomic write is not committed, set inode w/ atomic dirty */ - if (!ret && f2fs_is_atomic_file(inode) && - !is_inode_flag_set(inode, FI_ATOMIC_COMMITTED)) + if (!ret && f2fs_is_atomic_file(inode)) set_inode_flag(inode, FI_ATOMIC_DIRTIED); return ret; @@ -1774,32 +1772,26 @@ static int f2fs_statfs_project(struct super_block *sb, limit = min_not_zero(dquot->dq_dqb.dqb_bsoftlimit, dquot->dq_dqb.dqb_bhardlimit); - limit >>= sb->s_blocksize_bits; - - if (limit) { - uint64_t remaining = 0; + if (limit) + limit >>= sb->s_blocksize_bits; + if (limit && buf->f_blocks > limit) { curblock = (dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace) >> sb->s_blocksize_bits; - if (limit > curblock) - remaining = limit - curblock; - - buf->f_blocks = min(buf->f_blocks, limit); - buf->f_bfree = min(buf->f_bfree, remaining); - buf->f_bavail = min(buf->f_bavail, remaining); + buf->f_blocks = limit; + buf->f_bfree = buf->f_bavail = + (buf->f_blocks > curblock) ? + (buf->f_blocks - curblock) : 0; } limit = min_not_zero(dquot->dq_dqb.dqb_isoftlimit, dquot->dq_dqb.dqb_ihardlimit); - if (limit) { - uint64_t remaining = 0; - - if (limit > dquot->dq_dqb.dqb_curinodes) - remaining = limit - dquot->dq_dqb.dqb_curinodes; - - buf->f_files = min(buf->f_files, limit); - buf->f_ffree = min(buf->f_ffree, remaining); + if (limit && buf->f_files > limit) { + buf->f_files = limit; + buf->f_ffree = + (buf->f_files > dquot->dq_dqb.dqb_curinodes) ? + (buf->f_files - dquot->dq_dqb.dqb_curinodes) : 0; } spin_unlock(&dquot->dq_dqb_lock); @@ -1857,9 +1849,9 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_fsid = u64_to_fsid(id); #ifdef CONFIG_QUOTA - if (is_inode_flag_set(d_inode(dentry), FI_PROJ_INHERIT) && + if (is_inode_flag_set(dentry->d_inode, FI_PROJ_INHERIT) && sb_has_quota_limits_enabled(sb, PRJQUOTA)) { - f2fs_statfs_project(sb, F2FS_I(d_inode(dentry))->i_projid, buf); + f2fs_statfs_project(sb, F2FS_I(dentry->d_inode)->i_projid, buf); } #endif return 0; @@ -3616,7 +3608,6 @@ int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi) block_t user_block_count, valid_user_blocks; block_t avail_node_count, valid_node_count; unsigned int nat_blocks, nat_bits_bytes, nat_bits_blocks; - unsigned int sit_blk_cnt; int i, j; total = le32_to_cpu(raw_super->segment_count); @@ -3728,13 +3719,6 @@ int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi) return 1; } - sit_blk_cnt = DIV_ROUND_UP(main_segs, SIT_ENTRY_PER_BLOCK); - if (sit_bitmap_size * 8 < sit_blk_cnt) { - f2fs_err(sbi, "Wrong bitmap size: sit: %u, sit_blk_cnt:%u", - sit_bitmap_size, sit_blk_cnt); - return 1; - } - cp_pack_start_sum = __start_sum_addr(sbi); cp_payload = __cp_payload(sbi); if (cp_pack_start_sum < cp_payload + 1 || diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c index c4b0661888a1593f198f122e837f8ac5053f10df..180feefc4a9ceb8288805c88177c04a4d474d2c5 100644 --- a/fs/f2fs/sysfs.c +++ b/fs/f2fs/sysfs.c @@ -61,12 +61,6 @@ struct f2fs_attr { int id; }; -struct f2fs_base_attr { - struct attribute attr; - ssize_t (*show)(struct f2fs_base_attr *a, char *buf); - ssize_t (*store)(struct f2fs_base_attr *a, const char *buf, size_t len); -}; - static ssize_t f2fs_sbi_show(struct f2fs_attr *a, struct f2fs_sb_info *sbi, char *buf); @@ -797,25 +791,6 @@ static void f2fs_sb_release(struct kobject *kobj) complete(&sbi->s_kobj_unregister); } -static ssize_t f2fs_base_attr_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct f2fs_base_attr *a = container_of(attr, - struct f2fs_base_attr, attr); - - return a->show ? a->show(a, buf) : 0; -} - -static ssize_t f2fs_base_attr_store(struct kobject *kobj, - struct attribute *attr, - const char *buf, size_t len) -{ - struct f2fs_base_attr *a = container_of(attr, - struct f2fs_base_attr, attr); - - return a->store ? a->store(a, buf, len) : 0; -} - /* * Note that there are three feature list entries: * 1) /sys/fs/f2fs/features @@ -834,13 +809,14 @@ static ssize_t f2fs_base_attr_store(struct kobject *kobj, * please add new on-disk feature in this list only. * - ref. F2FS_SB_FEATURE_RO_ATTR() */ -static ssize_t f2fs_feature_show(struct f2fs_base_attr *a, char *buf) +static ssize_t f2fs_feature_show(struct f2fs_attr *a, + struct f2fs_sb_info *sbi, char *buf) { return sysfs_emit(buf, "supported\n"); } #define F2FS_FEATURE_RO_ATTR(_name) \ -static struct f2fs_base_attr f2fs_base_attr_##_name = { \ +static struct f2fs_attr f2fs_attr_##_name = { \ .attr = {.name = __stringify(_name), .mode = 0444 }, \ .show = f2fs_feature_show, \ } @@ -1190,38 +1166,37 @@ static struct attribute *f2fs_attrs[] = { }; ATTRIBUTE_GROUPS(f2fs); -#define BASE_ATTR_LIST(name) (&f2fs_base_attr_##name.attr) static struct attribute *f2fs_feat_attrs[] = { #ifdef CONFIG_FS_ENCRYPTION - BASE_ATTR_LIST(encryption), - BASE_ATTR_LIST(test_dummy_encryption_v2), + ATTR_LIST(encryption), + ATTR_LIST(test_dummy_encryption_v2), #if IS_ENABLED(CONFIG_UNICODE) - BASE_ATTR_LIST(encrypted_casefold), + ATTR_LIST(encrypted_casefold), #endif #endif /* CONFIG_FS_ENCRYPTION */ #ifdef CONFIG_BLK_DEV_ZONED - BASE_ATTR_LIST(block_zoned), + ATTR_LIST(block_zoned), #endif - BASE_ATTR_LIST(atomic_write), - BASE_ATTR_LIST(extra_attr), - BASE_ATTR_LIST(project_quota), - BASE_ATTR_LIST(inode_checksum), - BASE_ATTR_LIST(flexible_inline_xattr), - BASE_ATTR_LIST(quota_ino), - BASE_ATTR_LIST(inode_crtime), - BASE_ATTR_LIST(lost_found), + ATTR_LIST(atomic_write), + ATTR_LIST(extra_attr), + ATTR_LIST(project_quota), + ATTR_LIST(inode_checksum), + ATTR_LIST(flexible_inline_xattr), + ATTR_LIST(quota_ino), + ATTR_LIST(inode_crtime), + ATTR_LIST(lost_found), #ifdef CONFIG_FS_VERITY - BASE_ATTR_LIST(verity), + ATTR_LIST(verity), #endif - BASE_ATTR_LIST(sb_checksum), + ATTR_LIST(sb_checksum), #if IS_ENABLED(CONFIG_UNICODE) - BASE_ATTR_LIST(casefold), + ATTR_LIST(casefold), #endif - BASE_ATTR_LIST(readonly), + ATTR_LIST(readonly), #ifdef CONFIG_F2FS_FS_COMPRESSION - BASE_ATTR_LIST(compression), + ATTR_LIST(compression), #endif - BASE_ATTR_LIST(pin_file), + ATTR_LIST(pin_file), NULL, }; ATTRIBUTE_GROUPS(f2fs_feat); @@ -1288,14 +1263,9 @@ static struct kset f2fs_kset = { .kobj = {.ktype = &f2fs_ktype}, }; -static const struct sysfs_ops f2fs_feat_attr_ops = { - .show = f2fs_base_attr_show, - .store = f2fs_base_attr_store, -}; - static const struct kobj_type f2fs_feat_ktype = { .default_groups = f2fs_feat_groups, - .sysfs_ops = &f2fs_feat_attr_ops, + .sysfs_ops = &f2fs_attr_ops, }; static struct kobject f2fs_feat = { diff --git a/fs/filesystems.c b/fs/filesystems.c index 95e5256821a53494d88f496193305a2e50e04444..58b9067b2391ce814e580709b518b405e0f9cb8a 100644 --- a/fs/filesystems.c +++ b/fs/filesystems.c @@ -156,19 +156,15 @@ static int fs_index(const char __user * __name) static int fs_name(unsigned int index, char __user * buf) { struct file_system_type * tmp; - int len, res = -EINVAL; + int len, res; read_lock(&file_systems_lock); - for (tmp = file_systems; tmp; tmp = tmp->next, index--) { - if (index == 0) { - if (try_module_get(tmp->owner)) - res = 0; + for (tmp = file_systems; tmp; tmp = tmp->next, index--) + if (index <= 0 && try_module_get(tmp->owner)) break; - } - } read_unlock(&file_systems_lock); - if (res) - return res; + if (!tmp) + return -EINVAL; /* OK, we got the reference, so we can safely block */ len = strlen(tmp->name) + 1; diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 0b84284ece98fa31ae017b4609e3d32734564b30..82951a535d2d4d350d3f2318e02a7456c4473d71 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1860,7 +1860,6 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, int err; bool trust_local_cmtime = is_wb; bool fault_blocked = false; - u64 attr_version; if (!fc->default_permissions) attr->ia_valid |= ATTR_FORCE; @@ -1945,8 +1944,6 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, if (fc->handle_killpriv_v2 && !capable(CAP_FSETID)) inarg.valid |= FATTR_KILL_SUIDGID; } - - attr_version = fuse_get_attr_version(fm->fc); fuse_setattr_fill(fc, &args, inode, &inarg, &outarg); err = fuse_simple_request(fm, &args); if (err) { @@ -1972,14 +1969,6 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, /* FIXME: clear I_DIRTY_SYNC? */ } - if (fi->attr_version > attr_version) { - /* - * Apply attributes, for example for fsnotify_change(), but set - * attribute timeout to zero. - */ - outarg.attr_valid = outarg.attr_valid_nsec = 0; - } - fuse_change_attributes_common(inode, &outarg.attr, NULL, ATTR_TIMEOUT(&outarg), fuse_get_cache_mask(inode)); diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 1cb5ce63fbf6973cdbbdeec16906493740f9939a..29085643ad104ee0d1504176425d5a38986582ea 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -658,8 +658,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, if (!IS_ERR(inode)) { if (S_ISDIR(inode->i_mode)) { iput(inode); - inode = NULL; - error = -EISDIR; + inode = ERR_PTR(-EISDIR); goto fail_gunlock; } d_instantiate(dentry, inode); diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c index 07aac73377d8fe2a62c6e7f405c828bbe736affc..e028e55e67d95fa483daeb9b791c9ef7f8b4d3c1 100644 --- a/fs/gfs2/lock_dlm.c +++ b/fs/gfs2/lock_dlm.c @@ -959,15 +959,14 @@ static int control_mount(struct gfs2_sbd *sdp) if (sdp->sd_args.ar_spectator) { fs_info(sdp, "Recovery is required. Waiting for a " "non-spectator to mount.\n"); - spin_unlock(&ls->ls_recover_spin); msleep_interruptible(1000); } else { fs_info(sdp, "control_mount wait1 block %u start %u " "mount %u lvb %u flags %lx\n", block_gen, start_gen, mount_gen, lvb_gen, ls->ls_recover_flags); - spin_unlock(&ls->ls_recover_spin); } + spin_unlock(&ls->ls_recover_spin); goto restart; } diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index d989bdcfaa26c770868a5d8f9fa8f0a40c2841d6..54075fe3de9b1f0a503343db5f04d3414a910947 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -1486,16 +1486,9 @@ static int isofs_read_inode(struct inode *inode, int relocated) inode->i_op = &page_symlink_inode_operations; inode_nohighmem(inode); inode->i_data.a_ops = &isofs_symlink_aops; - } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || - S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { + } else /* XXX - parse_rock_ridge_inode() had already set i_rdev. */ init_special_inode(inode, inode->i_mode, inode->i_rdev); - } else { - printk(KERN_DEBUG "ISOFS: Invalid file type 0%04o for inode %lu.\n", - inode->i_mode, inode->i_ino); - ret = -EIO; - goto fail; - } ret = 0; out: diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index c2b8ad0b24c4432467b4f617e422981ba4318240..76adab83cac368e389e096330d08ab276fc513a9 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c @@ -1499,7 +1499,7 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) jh->b_next_transaction == transaction); spin_unlock(&jh->b_state_lock); } - if (data_race(jh->b_modified == 1)) { + if (jh->b_modified == 1) { /* If it's in our transaction it must be in BJ_Metadata list. */ if (data_race(jh->b_transaction == transaction && jh->b_jlist != BJ_Metadata)) { @@ -1518,6 +1518,7 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) goto out; } + journal = transaction->t_journal; spin_lock(&jh->b_state_lock); if (is_handle_aborted(handle)) { @@ -1532,8 +1533,6 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) goto out_unlock_bh; } - journal = transaction->t_journal; - if (jh->b_modified == 0) { /* * This buffer's got modified and becoming part diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c index fda9f4d6093f941d1ae794347bba2fea2cbbd6d0..ef3a1e1b6cb0652e9267110cb0a21032a4a18147 100644 --- a/fs/jffs2/erase.c +++ b/fs/jffs2/erase.c @@ -425,9 +425,7 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb .totlen = cpu_to_je32(c->cleanmarker_size) }; - ret = jffs2_prealloc_raw_node_refs(c, jeb, 1); - if (ret) - goto filebad; + jffs2_prealloc_raw_node_refs(c, jeb, 1); marker.hdr_crc = cpu_to_je32(crc32(0, &marker, sizeof(struct jffs2_unknown_node)-4)); diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c index 62879c218d4b1122caba0a493b2ad978debb37f8..29671e33a1714c8ca5c1e272ac58821e00078ef1 100644 --- a/fs/jffs2/scan.c +++ b/fs/jffs2/scan.c @@ -256,9 +256,7 @@ int jffs2_scan_medium(struct jffs2_sb_info *c) jffs2_dbg(1, "%s(): Skipping %d bytes in nextblock to ensure page alignment\n", __func__, skip); - ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, 1); - if (ret) - goto out; + jffs2_prealloc_raw_node_refs(c, c->nextblock, 1); jffs2_scan_dirty_space(c, c->nextblock, skip); } #endif diff --git a/fs/jffs2/summary.c b/fs/jffs2/summary.c index d83372d3e1a07b0324be755f5ef46d6f08a2ce20..4fe64519870f1ac0845d771618607d0ce53335e8 100644 --- a/fs/jffs2/summary.c +++ b/fs/jffs2/summary.c @@ -858,10 +858,7 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c) spin_unlock(&c->erase_completion_lock); jeb = c->nextblock; - ret = jffs2_prealloc_raw_node_refs(c, jeb, 1); - - if (ret) - goto out; + jffs2_prealloc_raw_node_refs(c, jeb, 1); if (!c->summary->sum_num || !c->summary->sum_list_head) { JFFS2_WARNING("Empty summary info!!!\n"); @@ -875,8 +872,6 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c) datasize += padsize; ret = jffs2_sum_write_data(c, jeb, infosize, datasize, padsize); - -out: spin_lock(&c->erase_completion_lock); return ret; } diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c index 35e063c9f3a42e9db574f77a629f0fb961013ea1..0e1019382cf519ac90728ed951035ee4011256a1 100644 --- a/fs/jfs/jfs_dmap.c +++ b/fs/jfs/jfs_dmap.c @@ -178,30 +178,45 @@ int dbMount(struct inode *ipbmap) dbmp_le = (struct dbmap_disk *) mp->data; bmp->db_mapsize = le64_to_cpu(dbmp_le->dn_mapsize); bmp->db_nfree = le64_to_cpu(dbmp_le->dn_nfree); + bmp->db_l2nbperpage = le32_to_cpu(dbmp_le->dn_l2nbperpage); + if (bmp->db_l2nbperpage > L2PSIZE - L2MINBLOCKSIZE || + bmp->db_l2nbperpage < 0) { + err = -EINVAL; + goto err_release_metapage; + } + bmp->db_numag = le32_to_cpu(dbmp_le->dn_numag); + if (!bmp->db_numag || bmp->db_numag > MAXAG) { + err = -EINVAL; + goto err_release_metapage; + } + bmp->db_maxlevel = le32_to_cpu(dbmp_le->dn_maxlevel); bmp->db_maxag = le32_to_cpu(dbmp_le->dn_maxag); bmp->db_agpref = le32_to_cpu(dbmp_le->dn_agpref); + if (bmp->db_maxag >= MAXAG || bmp->db_maxag < 0 || + bmp->db_agpref >= MAXAG || bmp->db_agpref < 0) { + err = -EINVAL; + goto err_release_metapage; + } + bmp->db_aglevel = le32_to_cpu(dbmp_le->dn_aglevel); bmp->db_agheight = le32_to_cpu(dbmp_le->dn_agheight); bmp->db_agwidth = le32_to_cpu(dbmp_le->dn_agwidth); + if (!bmp->db_agwidth) { + err = -EINVAL; + goto err_release_metapage; + } bmp->db_agstart = le32_to_cpu(dbmp_le->dn_agstart); bmp->db_agl2size = le32_to_cpu(dbmp_le->dn_agl2size); + if (bmp->db_agl2size > L2MAXL2SIZE - L2MAXAG || + bmp->db_agl2size < 0) { + err = -EINVAL; + goto err_release_metapage; + } - if ((bmp->db_l2nbperpage > L2PSIZE - L2MINBLOCKSIZE) || - (bmp->db_l2nbperpage < 0) || - !bmp->db_numag || (bmp->db_numag > MAXAG) || - (bmp->db_maxag >= MAXAG) || (bmp->db_maxag < 0) || - (bmp->db_agpref >= MAXAG) || (bmp->db_agpref < 0) || - (bmp->db_agheight < 0) || (bmp->db_agheight > (L2LPERCTL >> 1)) || - (bmp->db_agwidth < 1) || (bmp->db_agwidth > (LPERCTL / MAXAG)) || - (bmp->db_agwidth > (1 << (L2LPERCTL - (bmp->db_agheight << 1)))) || - (bmp->db_agstart < 0) || - (bmp->db_agstart > (CTLTREESIZE - 1 - bmp->db_agwidth * (MAXAG - 1))) || - (bmp->db_agl2size > L2MAXL2SIZE - L2MAXAG) || - (bmp->db_agl2size < 0) || - ((bmp->db_mapsize - 1) >> bmp->db_agl2size) > MAXAG) { + if (((bmp->db_mapsize - 1) >> bmp->db_agl2size) > MAXAG) { err = -EINVAL; goto err_release_metapage; } diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index 35f3144d703b5cd9add11202e137fb9ddfe1a989..9a6d504228e7c592690f99e92aa85d9cc6b5f0c6 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c @@ -3029,23 +3029,14 @@ static void duplicateIXtree(struct super_block *sb, s64 blkno, * * RETURN VALUES: * 0 - success - * -EINVAL - unexpected inode type + * -ENOMEM - insufficient memory */ static int copy_from_dinode(struct dinode * dip, struct inode *ip) { struct jfs_inode_info *jfs_ip = JFS_IP(ip); struct jfs_sb_info *sbi = JFS_SBI(ip->i_sb); - int fileset = le32_to_cpu(dip->di_fileset); - - switch (fileset) { - case AGGR_RESERVED_I: case AGGREGATE_I: case BMAP_I: - case LOG_I: case BADBLOCK_I: case FILESYSTEM_I: - break; - default: - return -EINVAL; - } - jfs_ip->fileset = fileset; + jfs_ip->fileset = le32_to_cpu(dip->di_fileset); jfs_ip->mode2 = le32_to_cpu(dip->di_mode); jfs_set_inode_flags(ip); diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index f6e2a4523f7e66d4a43a8ff0d2598a5649d279c8..b068ed32d7b32d176b9064fe9c2691449027b980 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -1560,9 +1560,8 @@ void kernfs_break_active_protection(struct kernfs_node *kn) * invoked before finishing the kernfs operation. Note that while this * function restores the active reference, it doesn't and can't actually * restore the active protection - @kn may already or be in the process of - * being drained and removed. Once kernfs_break_active_protection() is - * invoked, that protection is irreversibly gone for the kernfs operation - * instance. + * being removed. Once kernfs_break_active_protection() is invoked, that + * protection is irreversibly gone for the kernfs operation instance. * * While this function may be called at any point after * kernfs_break_active_protection() is invoked, its most useful location diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c index 6b90fea6cca209b55608c1e9fa1b2651384ee812..332d08d2fe0d5671afd41dfaa98573cfe0ffedec 100644 --- a/fs/kernfs/file.c +++ b/fs/kernfs/file.c @@ -820,9 +820,8 @@ bool kernfs_should_drain_open_files(struct kernfs_node *kn) /* * @kn being deactivated guarantees that @kn->attr.open can't change * beneath us making the lockless test below safe. - * Callers post kernfs_unbreak_active_protection may be counted in - * kn->active by now, do not WARN_ON because of them. */ + WARN_ON_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS); rcu_read_lock(); on = rcu_dereference(kn->attr.open); diff --git a/fs/namespace.c b/fs/namespace.c index 6a9c53c800c4e455558b9aec6602471497287035..450f4198b8cdd84a6bb186c5ff7c44c932177322 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -636,8 +636,12 @@ int __legitimize_mnt(struct vfsmount *bastard, unsigned seq) smp_mb(); // see mntput_no_expire() and do_umount() if (likely(!read_seqretry(&mount_lock, seq))) return 0; + if (bastard->mnt_flags & MNT_SYNC_UMOUNT) { + mnt_add_count(mnt, -1); + return 1; + } lock_mount_hash(); - if (unlikely(bastard->mnt_flags & (MNT_SYNC_UMOUNT | MNT_DOOMED))) { + if (unlikely(bastard->mnt_flags & MNT_DOOMED)) { mnt_add_count(mnt, -1); unlock_mount_hash(); return 1; @@ -2110,11 +2114,6 @@ struct vfsmount *clone_private_mount(const struct path *path) if (!check_mnt(old_mnt)) goto invalid; - if (!ns_capable(old_mnt->mnt_ns->user_ns, CAP_SYS_ADMIN)) { - up_read(&namespace_sem); - return ERR_PTR(-EPERM); - } - if (has_locked_children(old_mnt, path->dentry)) goto invalid; @@ -2369,14 +2368,14 @@ static int attach_recursive_mnt(struct mount *source_mnt, hlist_for_each_entry_safe(child, n, &tree_list, mnt_hash) { struct mount *q; hlist_del_init(&child->mnt_hash); - /* Notice when we are propagating across user namespaces */ - if (child->mnt_parent->mnt_ns->user_ns != user_ns) - lock_mnt_tree(child); - child->mnt.mnt_flags &= ~MNT_LOCKED; q = __lookup_mnt(&child->mnt_parent->mnt, child->mnt_mountpoint); if (q) mnt_change_mountpoint(child, smp, q); + /* Notice when we are propagating across user namespaces */ + if (child->mnt_parent->mnt_ns->user_ns != user_ns) + lock_mnt_tree(child); + child->mnt.mnt_flags &= ~MNT_LOCKED; commit_tree(child); } put_mountpoint(smp); @@ -2562,10 +2561,6 @@ static int do_change_type(struct path *path, int ms_flags) return -EINVAL; namespace_lock(); - if (!check_mnt(mnt)) { - err = -EINVAL; - goto out_unlock; - } if (type == MS_SHARED) { err = invent_group_ids(mnt, recurse); if (err) @@ -3004,7 +2999,7 @@ static int do_set_group(struct path *from_path, struct path *to_path) if (IS_MNT_SLAVE(from)) { struct mount *m = from->mnt_master; - list_add(&to->mnt_slave, &from->mnt_slave); + list_add(&to->mnt_slave, &m->mnt_slave_list); to->mnt_master = m; } @@ -3029,25 +3024,18 @@ static int do_set_group(struct path *from_path, struct path *to_path) * Check if path is overmounted, i.e., if there's a mount on top of * @path->mnt with @path->dentry as mountpoint. * - * Context: namespace_sem must be held at least shared. - * MUST NOT be called under lock_mount_hash() (there one should just - * call __lookup_mnt() and check if it returns NULL). + * Context: This function expects namespace_lock() to be held. * Return: If path is overmounted true is returned, false if not. */ static inline bool path_overmounted(const struct path *path) { - unsigned seq = read_seqbegin(&mount_lock); - bool no_child; - rcu_read_lock(); - no_child = !__lookup_mnt(path->mnt, path->dentry); - rcu_read_unlock(); - if (need_seqretry(&mount_lock, seq)) { - read_seqlock_excl(&mount_lock); - no_child = !__lookup_mnt(path->mnt, path->dentry); - read_sequnlock_excl(&mount_lock); + if (unlikely(__lookup_mnt(path->mnt, path->dentry))) { + rcu_read_unlock(); + return true; } - return unlikely(!no_child); + rcu_read_unlock(); + return false; } /** diff --git a/fs/nfs/client.c b/fs/nfs/client.c index aa09f930eeaf7e96e6c8868c58f4b3a294e5bb59..62607d52bfa5e7f7ac9dcf547e473bd4b428b823 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -1080,8 +1080,6 @@ struct nfs_server *nfs_create_server(struct fs_context *fc) if (server->namelen == 0 || server->namelen > NFS2_MAXNAMLEN) server->namelen = NFS2_MAXNAMLEN; } - /* Linux 'subtree_check' borkenness mandates this setting */ - server->fh_expire_type = NFS_FH_VOL_RENAME; if (!(fattr->valid & NFS_ATTR_FATTR)) { error = ctx->nfs_mod->rpc_ops->getattr(server, ctx->mntfh, diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 38918638423596004ebc78cdf5e12b06daae2479..39f7549afcf5bd3344d9d5b618a777cf359eefb8 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -2642,18 +2642,6 @@ nfs_unblock_rename(struct rpc_task *task, struct nfs_renamedata *data) unblock_revalidate(new_dentry); } -static bool nfs_rename_is_unsafe_cross_dir(struct dentry *old_dentry, - struct dentry *new_dentry) -{ - struct nfs_server *server = NFS_SB(old_dentry->d_sb); - - if (old_dentry->d_parent != new_dentry->d_parent) - return false; - if (server->fh_expire_type & NFS_FH_RENAME_UNSAFE) - return !(server->fh_expire_type & NFS_FH_NOEXPIRE_WITH_OPEN); - return true; -} - /* * RENAME * FIXME: Some nfsds, like the Linux user space nfsd, may generate a @@ -2741,8 +2729,7 @@ int nfs_rename(struct mnt_idmap *idmap, struct inode *old_dir, } - if (S_ISREG(old_inode->i_mode) && - nfs_rename_is_unsafe_cross_dir(old_dentry, new_dentry)) + if (S_ISREG(old_inode->i_mode)) nfs_sync_inode(old_inode); task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry, must_unblock ? nfs_unblock_rename : NULL); diff --git a/fs/nfs/filelayout/filelayoutdev.c b/fs/nfs/filelayout/filelayoutdev.c index d5f1fbfd9a0c7ff7d2de37c1e4182ba943703b81..acf4b88889dc3814ebfe06d3883c96f429415f2a 100644 --- a/fs/nfs/filelayout/filelayoutdev.c +++ b/fs/nfs/filelayout/filelayoutdev.c @@ -75,7 +75,6 @@ nfs4_fl_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, struct page *scratch; struct list_head dsaddrs; struct nfs4_pnfs_ds_addr *da; - struct net *net = server->nfs_client->cl_net; /* set up xdr stream */ scratch = alloc_page(gfp_flags); @@ -159,7 +158,8 @@ nfs4_fl_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, mp_count = be32_to_cpup(p); /* multipath count */ for (j = 0; j < mp_count; j++) { - da = nfs4_decode_mp_ds_addr(net, &stream, gfp_flags); + da = nfs4_decode_mp_ds_addr(server->nfs_client->cl_net, + &stream, gfp_flags); if (da) list_add_tail(&da->da_node, &dsaddrs); } @@ -169,7 +169,7 @@ nfs4_fl_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, goto out_err_free_deviceid; } - dsaddr->ds_list[i] = nfs4_pnfs_ds_add(net, &dsaddrs, gfp_flags); + dsaddr->ds_list[i] = nfs4_pnfs_ds_add(&dsaddrs, gfp_flags); if (!dsaddr->ds_list[i]) goto out_err_drain_dsaddrs; diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index 0a26444fe20233149dea16cb380d6c3b583819d4..0bc537de1b29586047c217fa30c35f8176c54bcc 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c @@ -1096,7 +1096,6 @@ static void ff_layout_reset_read(struct nfs_pgio_header *hdr) } static int ff_layout_async_handle_error_v4(struct rpc_task *task, - u32 op_status, struct nfs4_state *state, struct nfs_client *clp, struct pnfs_layout_segment *lseg, @@ -1107,42 +1106,32 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task, struct nfs4_deviceid_node *devid = FF_LAYOUT_DEVID_NODE(lseg, idx); struct nfs4_slot_table *tbl = &clp->cl_session->fc_slot_table; - switch (op_status) { - case NFS4_OK: - case NFS4ERR_NXIO: - break; - case NFSERR_PERM: - if (!task->tk_xprt) - break; - xprt_force_disconnect(task->tk_xprt); - goto out_retry; - case NFS4ERR_BADSESSION: - case NFS4ERR_BADSLOT: - case NFS4ERR_BAD_HIGH_SLOT: - case NFS4ERR_DEADSESSION: - case NFS4ERR_CONN_NOT_BOUND_TO_SESSION: - case NFS4ERR_SEQ_FALSE_RETRY: - case NFS4ERR_SEQ_MISORDERED: + switch (task->tk_status) { + case -NFS4ERR_BADSESSION: + case -NFS4ERR_BADSLOT: + case -NFS4ERR_BAD_HIGH_SLOT: + case -NFS4ERR_DEADSESSION: + case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: + case -NFS4ERR_SEQ_FALSE_RETRY: + case -NFS4ERR_SEQ_MISORDERED: dprintk("%s ERROR %d, Reset session. Exchangeid " "flags 0x%x\n", __func__, task->tk_status, clp->cl_exchange_flags); nfs4_schedule_session_recovery(clp->cl_session, task->tk_status); - goto out_retry; - case NFS4ERR_DELAY: - nfs_inc_stats(lseg->pls_layout->plh_inode, NFSIOS_DELAY); - fallthrough; - case NFS4ERR_GRACE: + break; + case -NFS4ERR_DELAY: + case -NFS4ERR_GRACE: rpc_delay(task, FF_LAYOUT_POLL_RETRY_MAX); - goto out_retry; - case NFS4ERR_RETRY_UNCACHED_REP: - goto out_retry; + break; + case -NFS4ERR_RETRY_UNCACHED_REP: + break; /* Invalidate Layout errors */ - case NFS4ERR_PNFS_NO_LAYOUT: - case NFS4ERR_STALE: - case NFS4ERR_BADHANDLE: - case NFS4ERR_ISDIR: - case NFS4ERR_FHEXPIRED: - case NFS4ERR_WRONG_TYPE: + case -NFS4ERR_PNFS_NO_LAYOUT: + case -ESTALE: /* mapped NFS4ERR_STALE */ + case -EBADHANDLE: /* mapped NFS4ERR_BADHANDLE */ + case -EISDIR: /* mapped NFS4ERR_ISDIR */ + case -NFS4ERR_FHEXPIRED: + case -NFS4ERR_WRONG_TYPE: dprintk("%s Invalid layout error %d\n", __func__, task->tk_status); /* @@ -1155,11 +1144,6 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task, pnfs_destroy_layout(NFS_I(inode)); rpc_wake_up(&tbl->slot_tbl_waitq); goto reset; - default: - break; - } - - switch (task->tk_status) { /* RPC connection errors */ case -ECONNREFUSED: case -EHOSTDOWN: @@ -1175,56 +1159,26 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task, nfs4_delete_deviceid(devid->ld, devid->nfs_client, &devid->deviceid); rpc_wake_up(&tbl->slot_tbl_waitq); - break; + fallthrough; default: - break; - } - - if (ff_layout_avoid_mds_available_ds(lseg)) - return -NFS4ERR_RESET_TO_PNFS; + if (ff_layout_avoid_mds_available_ds(lseg)) + return -NFS4ERR_RESET_TO_PNFS; reset: - dprintk("%s Retry through MDS. Error %d\n", __func__, - task->tk_status); - return -NFS4ERR_RESET_TO_MDS; - -out_retry: + dprintk("%s Retry through MDS. Error %d\n", __func__, + task->tk_status); + return -NFS4ERR_RESET_TO_MDS; + } task->tk_status = 0; return -EAGAIN; } /* Retry all errors through either pNFS or MDS except for -EJUKEBOX */ static int ff_layout_async_handle_error_v3(struct rpc_task *task, - u32 op_status, - struct nfs_client *clp, struct pnfs_layout_segment *lseg, u32 idx) { struct nfs4_deviceid_node *devid = FF_LAYOUT_DEVID_NODE(lseg, idx); - switch (op_status) { - case NFS_OK: - case NFSERR_NXIO: - break; - case NFSERR_PERM: - if (!task->tk_xprt) - break; - xprt_force_disconnect(task->tk_xprt); - goto out_retry; - case NFSERR_ACCES: - case NFSERR_BADHANDLE: - case NFSERR_FBIG: - case NFSERR_IO: - case NFSERR_NOSPC: - case NFSERR_ROFS: - case NFSERR_STALE: - goto out_reset_to_pnfs; - case NFSERR_JUKEBOX: - nfs_inc_stats(lseg->pls_layout->plh_inode, NFSIOS_DELAY); - goto out_retry; - default: - break; - } - switch (task->tk_status) { /* File access problems. Don't mark the device as unavailable */ case -EACCES: @@ -1243,7 +1197,6 @@ static int ff_layout_async_handle_error_v3(struct rpc_task *task, nfs4_delete_deviceid(devid->ld, devid->nfs_client, &devid->deviceid); } -out_reset_to_pnfs: /* FIXME: Need to prevent infinite looping here. */ return -NFS4ERR_RESET_TO_PNFS; out_retry: @@ -1254,7 +1207,6 @@ static int ff_layout_async_handle_error_v3(struct rpc_task *task, } static int ff_layout_async_handle_error(struct rpc_task *task, - u32 op_status, struct nfs4_state *state, struct nfs_client *clp, struct pnfs_layout_segment *lseg, @@ -1273,11 +1225,10 @@ static int ff_layout_async_handle_error(struct rpc_task *task, switch (vers) { case 3: - return ff_layout_async_handle_error_v3(task, op_status, clp, - lseg, idx); + return ff_layout_async_handle_error_v3(task, lseg, idx); case 4: - return ff_layout_async_handle_error_v4(task, op_status, state, - clp, lseg, idx); + return ff_layout_async_handle_error_v4(task, state, clp, + lseg, idx); default: /* should never happen */ WARN_ON_ONCE(1); @@ -1330,7 +1281,6 @@ static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg, switch (status) { case NFS4ERR_DELAY: case NFS4ERR_GRACE: - case NFS4ERR_PERM: break; case NFS4ERR_NXIO: ff_layout_mark_ds_unreachable(lseg, idx); @@ -1363,8 +1313,7 @@ static int ff_layout_read_done_cb(struct rpc_task *task, trace_ff_layout_read_error(hdr); } - err = ff_layout_async_handle_error(task, hdr->res.op_status, - hdr->args.context->state, + err = ff_layout_async_handle_error(task, hdr->args.context->state, hdr->ds_clp, hdr->lseg, hdr->pgio_mirror_idx); @@ -1534,8 +1483,7 @@ static int ff_layout_write_done_cb(struct rpc_task *task, trace_ff_layout_write_error(hdr); } - err = ff_layout_async_handle_error(task, hdr->res.op_status, - hdr->args.context->state, + err = ff_layout_async_handle_error(task, hdr->args.context->state, hdr->ds_clp, hdr->lseg, hdr->pgio_mirror_idx); @@ -1581,9 +1529,8 @@ static int ff_layout_commit_done_cb(struct rpc_task *task, trace_ff_layout_commit_error(data); } - err = ff_layout_async_handle_error(task, data->res.op_status, - NULL, data->ds_clp, data->lseg, - data->ds_commit_index); + err = ff_layout_async_handle_error(task, NULL, data->ds_clp, + data->lseg, data->ds_commit_index); trace_nfs4_pnfs_commit_ds(data, err); switch (err) { diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c index d21c5ecfbf1cc33291fe0022251a9c31bc22d0d7..e028f5a0ef5f659128acb76b0c567529edf3b97a 100644 --- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c +++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c @@ -49,7 +49,6 @@ nfs4_ff_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, struct nfs4_pnfs_ds_addr *da; struct nfs4_ff_layout_ds *new_ds = NULL; struct nfs4_ff_ds_version *ds_versions = NULL; - struct net *net = server->nfs_client->cl_net; u32 mp_count; u32 version_count; __be32 *p; @@ -81,7 +80,8 @@ nfs4_ff_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, for (i = 0; i < mp_count; i++) { /* multipath ds */ - da = nfs4_decode_mp_ds_addr(net, &stream, gfp_flags); + da = nfs4_decode_mp_ds_addr(server->nfs_client->cl_net, + &stream, gfp_flags); if (da) list_add_tail(&da->da_node, &dsaddrs); } @@ -149,7 +149,7 @@ nfs4_ff_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, new_ds->ds_versions = ds_versions; new_ds->ds_versions_cnt = version_count; - new_ds->ds = nfs4_pnfs_ds_add(net, &dsaddrs, gfp_flags); + new_ds->ds = nfs4_pnfs_ds_add(&dsaddrs, gfp_flags); if (!new_ds->ds) goto out_err_drain_dsaddrs; diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 7e7dd2aab449ddd13f5bc865338f6662c0e33396..06230baaa554e77d7d1bc31b7601a3e34e162375 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -555,8 +555,6 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) set_nlink(inode, fattr->nlink); else if (fattr_supported & NFS_ATTR_FATTR_NLINK) nfs_set_cache_invalid(inode, NFS_INO_INVALID_NLINK); - else - set_nlink(inode, 1); if (fattr->valid & NFS_ATTR_FATTR_OWNER) inode->i_uid = fattr->uid; else if (fattr_supported & NFS_ATTR_FATTR_OWNER) @@ -2442,26 +2440,15 @@ EXPORT_SYMBOL_GPL(nfs_net_id); static int nfs_net_init(struct net *net) { struct nfs_net *nn = net_generic(net, nfs_net_id); - int err; nfs_clients_init(net); if (!rpc_proc_register(net, &nn->rpcstats)) { - err = -ENOMEM; - goto err_proc_rpc; + nfs_clients_exit(net); + return -ENOMEM; } - err = nfs_fs_proc_net_init(net); - if (err) - goto err_proc_nfs; - - return 0; - -err_proc_nfs: - rpc_proc_unregister(net, "nfs"); -err_proc_rpc: - nfs_clients_exit(net); - return err; + return nfs_fs_proc_net_init(net); } static void nfs_net_exit(struct net *net) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 3085a2faab2d345d861c4c781b8ef57b7d911be4..1b94a55215e7dea9d8efb59046757344b05dbaf3 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -6059,8 +6059,6 @@ static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen, struct nfs_server *server = NFS_SERVER(inode); int ret; - if (unlikely(NFS_FH(inode)->size == 0)) - return -ENODATA; if (!nfs4_server_supports_acls(server, type)) return -EOPNOTSUPP; ret = nfs_revalidate_inode(inode, NFS_INO_INVALID_CHANGE); @@ -6135,9 +6133,6 @@ static int nfs4_proc_set_acl(struct inode *inode, const void *buf, { struct nfs4_exception exception = { }; int err; - - if (unlikely(NFS_FH(inode)->size == 0)) - return -ENODATA; do { err = __nfs4_proc_set_acl(inode, buf, buflen, type); trace_nfs4_set_acl(inode, err); @@ -10630,7 +10625,7 @@ const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = { static ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size) { - ssize_t error, error2, error3, error4; + ssize_t error, error2, error3; size_t left = size; error = generic_listxattr(dentry, list, left); @@ -10653,16 +10648,8 @@ static ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size) error3 = nfs4_listxattr_nfs4_user(d_inode(dentry), list, left); if (error3 < 0) return error3; - if (list) { - list += error3; - left -= error3; - } - - error4 = security_inode_listsecurity(d_inode(dentry), list, left); - if (error4 < 0) - return error4; - error += error2 + error3 + error4; + error += error2 + error3; if (size && error > size) return -ERANGE; return error; diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 79d1ffdcbebd3dc53918b90ec51b487978096400..73aa5a63afe3fb039dee84011ba1b535f51d7741 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -1930,10 +1930,8 @@ static void nfs_layoutget_begin(struct pnfs_layout_hdr *lo) static void nfs_layoutget_end(struct pnfs_layout_hdr *lo) { if (atomic_dec_and_test(&lo->plh_outstanding) && - test_and_clear_bit(NFS_LAYOUT_DRAIN, &lo->plh_flags)) { - smp_mb__after_atomic(); + test_and_clear_bit(NFS_LAYOUT_DRAIN, &lo->plh_flags)) wake_up_bit(&lo->plh_flags, NFS_LAYOUT_DRAIN); - } } static bool pnfs_is_first_layoutget(struct pnfs_layout_hdr *lo) diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 79996d7dad0f76c072925feb5f55292a3f37961f..d886c8226d8fecac631cf85dcfad283a4c5681e3 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -59,7 +59,6 @@ struct nfs4_pnfs_ds { struct list_head ds_node; /* nfs4_pnfs_dev_hlist dev_dslist */ char *ds_remotestr; /* comma sep list of addrs */ struct list_head ds_addrs; - const struct net *ds_net; struct nfs_client *ds_clp; refcount_t ds_count; unsigned long ds_state; @@ -406,8 +405,7 @@ int pnfs_generic_commit_pagelist(struct inode *inode, int pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo, int max); void pnfs_generic_write_commit_done(struct rpc_task *task, void *data); void nfs4_pnfs_ds_put(struct nfs4_pnfs_ds *ds); -struct nfs4_pnfs_ds *nfs4_pnfs_ds_add(const struct net *net, - struct list_head *dsaddrs, +struct nfs4_pnfs_ds *nfs4_pnfs_ds_add(struct list_head *dsaddrs, gfp_t gfp_flags); void nfs4_pnfs_v3_ds_connect_unload(void); int nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds, diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c index 1b317c44da126b30013ad486f9ee307fadc520b8..88e061bd711b746afcd46878e518f870fae19b0c 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -651,12 +651,12 @@ _same_data_server_addrs_locked(const struct list_head *dsaddrs1, * Lookup DS by addresses. nfs4_ds_cache_lock is held */ static struct nfs4_pnfs_ds * -_data_server_lookup_locked(const struct net *net, const struct list_head *dsaddrs) +_data_server_lookup_locked(const struct list_head *dsaddrs) { struct nfs4_pnfs_ds *ds; list_for_each_entry(ds, &nfs4_data_server_cache, ds_node) - if (ds->ds_net == net && _same_data_server_addrs_locked(&ds->ds_addrs, dsaddrs)) + if (_same_data_server_addrs_locked(&ds->ds_addrs, dsaddrs)) return ds; return NULL; } @@ -763,7 +763,7 @@ nfs4_pnfs_remotestr(struct list_head *dsaddrs, gfp_t gfp_flags) * uncached and return cached struct nfs4_pnfs_ds. */ struct nfs4_pnfs_ds * -nfs4_pnfs_ds_add(const struct net *net, struct list_head *dsaddrs, gfp_t gfp_flags) +nfs4_pnfs_ds_add(struct list_head *dsaddrs, gfp_t gfp_flags) { struct nfs4_pnfs_ds *tmp_ds, *ds = NULL; char *remotestr; @@ -781,14 +781,13 @@ nfs4_pnfs_ds_add(const struct net *net, struct list_head *dsaddrs, gfp_t gfp_fla remotestr = nfs4_pnfs_remotestr(dsaddrs, gfp_flags); spin_lock(&nfs4_ds_cache_lock); - tmp_ds = _data_server_lookup_locked(net, dsaddrs); + tmp_ds = _data_server_lookup_locked(dsaddrs); if (tmp_ds == NULL) { INIT_LIST_HEAD(&ds->ds_addrs); list_splice_init(dsaddrs, &ds->ds_addrs); ds->ds_remotestr = remotestr; refcount_set(&ds->ds_count, 1); INIT_LIST_HEAD(&ds->ds_node); - ds->ds_net = net; ds->ds_clp = NULL; list_add(&ds->ds_node, &nfs4_data_server_cache); dprintk("%s add new data server %s\n", __func__, diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 688a24e9bc8bb861a032a0cf92c75c0420c6f922..a142287d86f68ed411dce6f9c410e41948c570b2 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c @@ -56,8 +56,7 @@ static int nfs_return_empty_folio(struct folio *folio) { folio_zero_segment(folio, 0, folio_size(folio)); folio_mark_uptodate(folio); - if (nfs_netfs_folio_unlock(folio)) - folio_unlock(folio); + folio_unlock(folio); return 0; } diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 4e72ee57fc8fc2c9d5dcccb63c62ffd8639112f1..e1bcad5906ae7b9557baa49592771d0ed614fd9c 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -1020,16 +1020,6 @@ int nfs_reconfigure(struct fs_context *fc) sync_filesystem(sb); - /* - * The SB_RDONLY flag has been removed from the superblock during - * mounts to prevent interference between different filesystems. - * Similarly, it is also necessary to ignore the SB_RDONLY flag - * during reconfiguration; otherwise, it may also result in the - * creation of redundant superblocks when mounting a directory with - * different rw and ro flags multiple times. - */ - fc->sb_flags_mask &= ~SB_RDONLY; - /* * Userspace mount programs that send binary options generally send * them populated with default values. We have no way to know which @@ -1287,17 +1277,8 @@ int nfs_get_tree_common(struct fs_context *fc) if (IS_ERR(server)) return PTR_ERR(server); - /* - * When NFS_MOUNT_UNSHARED is not set, NFS forces the sharing of a - * superblock among each filesystem that mounts sub-directories - * belonging to a single exported root path. - * To prevent interference between different filesystems, the - * SB_RDONLY flag should be removed from the superblock. - */ if (server->flags & NFS_MOUNT_UNSHARED) compare_super = NULL; - else - fc->sb_flags &= ~SB_RDONLY; /* -o noac implies -o sync */ if (server->flags & NFS_MOUNT_NOAC) diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index b2bbf3d6d177e86b8c09e1f3f072f344c0dd49bf..b3eca08f15b13e306d6cfab7c2f0d2a5000d2e46 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -3580,8 +3580,7 @@ bool nfsd4_spo_must_allow(struct svc_rqst *rqstp) struct nfs4_op_map *allow = &cstate->clp->cl_spo_must_allow; u32 opiter; - if (rqstp->rq_procinfo != &nfsd_version4.vs_proc[NFSPROC4_COMPOUND] || - cstate->minorversion == 0) + if (!cstate->minorversion) return false; if (cstate->spo_must_allowed) diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 623f522b1565993cffaef75add13d7bc33dfa72a..710a54c7dffc541ec7df729d91e619205bb8de2b 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -432,13 +432,13 @@ static int nfsd_startup_net(struct net *net, const struct cred *cred) if (ret) goto out_filecache; -#ifdef CONFIG_NFSD_V4_2_INTER_SSC - nfsd4_ssc_init_umount_work(nn); -#endif ret = nfs4_state_start_net(net); if (ret) goto out_reply_cache; +#ifdef CONFIG_NFSD_V4_2_INTER_SSC + nfsd4_ssc_init_umount_work(nn); +#endif nn->nfsd_net_up = true; return 0; diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index 5e70a3478afe09e28e9f5cfecc2d25242f03f3e0..dbd27a44632fa9bbf1f69510f461a33ea2262a6b 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c @@ -2094,13 +2094,11 @@ static int nilfs_btree_propagate(struct nilfs_bmap *btree, ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1, 0); if (ret < 0) { - if (unlikely(ret == -ENOENT)) { + if (unlikely(ret == -ENOENT)) nilfs_crit(btree->b_inode->i_sb, "writing node/leaf block does not appear in b-tree (ino=%lu) at key=%llu, level=%d", btree->b_inode->i_ino, (unsigned long long)key, level); - ret = -EINVAL; - } goto out; } diff --git a/fs/nilfs2/direct.c b/fs/nilfs2/direct.c index 2d8dc6b35b5477947ca12a70288d3a3cce858aab..893ab36824cc2b7f1fa323c1c365aa56cf981e71 100644 --- a/fs/nilfs2/direct.c +++ b/fs/nilfs2/direct.c @@ -273,9 +273,6 @@ static int nilfs_direct_propagate(struct nilfs_bmap *bmap, dat = nilfs_bmap_get_dat(bmap); key = nilfs_bmap_data_get_key(bmap, bh); ptr = nilfs_direct_get_ptr(bmap, key); - if (ptr == NILFS_BMAP_INVALID_PTR) - return -EINVAL; - if (!buffer_nilfs_volatile(bh)) { oldreq.pr_entry_nr = ptr; newreq.pr_entry_nr = ptr; diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index 8c47c13c8e71683a452f8cbaebe364337132c38d..5f2d73f36e0d2f74682d6d91d44386aa4fe54f6e 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c @@ -517,18 +517,11 @@ static int __nilfs_read_inode(struct super_block *sb, inode->i_op = &nilfs_symlink_inode_operations; inode_nohighmem(inode); inode->i_mapping->a_ops = &nilfs_aops; - } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || - S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { + } else { inode->i_op = &nilfs_special_inode_operations; init_special_inode( inode, inode->i_mode, huge_decode_dev(le64_to_cpu(raw_inode->i_device_code))); - } else { - nilfs_error(sb, - "invalid file type bits in mode 0%o for inode %lu", - inode->i_mode, ino); - err = -EIO; - goto failed_unmap; } nilfs_ifile_unmap_inode(root->ifile, ino, bh); brelse(bh); diff --git a/fs/ntfs3/index.c b/fs/ntfs3/index.c index 191b91ffadbb210f0e678b252bee77e26f723625..28aae6ea1e615eac9f52dfc415ba6b9aee83f4ec 100644 --- a/fs/ntfs3/index.c +++ b/fs/ntfs3/index.c @@ -2184,10 +2184,6 @@ static int indx_get_entry_to_replace(struct ntfs_index *indx, e = hdr_first_de(&n->index->ihdr); fnd_push(fnd, n, e); - if (!e) { - err = -EINVAL; - goto out; - } if (!de_is_last(e)) { /* @@ -2209,10 +2205,6 @@ static int indx_get_entry_to_replace(struct ntfs_index *indx, n = fnd->nodes[level]; te = hdr_first_de(&n->index->ihdr); - if (!te) { - err = -EINVAL; - goto out; - } /* Copy the candidate entry into the replacement entry buffer. */ re = kmalloc(le16_to_cpu(te->size) + sizeof(u64), GFP_NOFS); if (!re) { diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c index c7bda48b5fb21ca1f6c86770f65d3a7e518ace1e..0ca8975a1df479579b33c98cca1146761a61292c 100644 --- a/fs/ocfs2/quota_local.c +++ b/fs/ocfs2/quota_local.c @@ -671,7 +671,7 @@ int ocfs2_finish_quota_recovery(struct ocfs2_super *osb, break; } out: - ocfs2_free_quota_recovery(rec); + kfree(rec); return status; } diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 0da1cd01d01cf78c595ac7446feb1911fcc32f82..0bf3ffcd072f6a1783008b8aa5a519483d71c698 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -274,9 +274,7 @@ enum ovl_path_type ovl_path_realdata(struct dentry *dentry, struct path *path) struct dentry *ovl_dentry_upper(struct dentry *dentry) { - struct inode *inode = d_inode(dentry); - - return inode ? ovl_upperdentry_dereference(OVL_I(inode)) : NULL; + return ovl_upperdentry_dereference(OVL_I(d_inode(dentry))); } struct dentry *ovl_dentry_lower(struct dentry *dentry) diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 4b3ae7e0def32ec60e452a42b0a52d97ab742e3d..897c71077a0f7e470659c729850ed7ce0797765c 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -52,7 +52,7 @@ static void proc_evict_inode(struct inode *inode) head = ei->sysctl; if (head) { - WRITE_ONCE(ei->sysctl, NULL); + RCU_INIT_POINTER(ei->sysctl, NULL); proc_sys_evict_inode(inode, head); } } diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index b7d6bc5c1ce9a9ca916f91199a9b3d2d9c01f866..071a71eb1a2d43a4bccc7d6f6c3b043d25999a3a 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c @@ -920,21 +920,17 @@ static int proc_sys_compare(const struct dentry *dentry, struct ctl_table_header *head; struct inode *inode; + /* Although proc doesn't have negative dentries, rcu-walk means + * that inode here can be NULL */ + /* AV: can it, indeed? */ + inode = d_inode_rcu(dentry); + if (!inode) + return 1; if (name->len != len) return 1; if (memcmp(name->name, str, len)) return 1; - - // false positive is fine here - we'll recheck anyway - if (d_in_lookup(dentry)) - return 0; - - inode = d_inode_rcu(dentry); - // we just might have run into dentry in the middle of __dentry_kill() - if (!inode) - return 1; - - head = READ_ONCE(PROC_I(inode)->sysctl); + head = rcu_dereference(PROC_I(inode)->sysctl); return !head || !sysctl_is_seen(head); } diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 8efbe269fe6729315962a4c5f43e10014403ae9c..c8eaa37d0820a677894a455c836dce131e8afd54 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -42,9 +42,9 @@ void task_mem(struct seq_file *m, struct mm_struct *mm) mm_purg_pages_info(mm, &nr_purg_sum, &nr_purg_pin); #endif - anon = get_mm_counter_sum(mm, MM_ANONPAGES); - file = get_mm_counter_sum(mm, MM_FILEPAGES); - shmem = get_mm_counter_sum(mm, MM_SHMEMPAGES); + anon = get_mm_counter(mm, MM_ANONPAGES); + file = get_mm_counter(mm, MM_FILEPAGES); + shmem = get_mm_counter(mm, MM_SHMEMPAGES); /* * Note: to minimize their overhead, mm maintains hiwater_vm and @@ -65,7 +65,7 @@ void task_mem(struct seq_file *m, struct mm_struct *mm) text = min(text, mm->exec_vm << PAGE_SHIFT); lib = (mm->exec_vm << PAGE_SHIFT) - text; - swap = get_mm_counter_sum(mm, MM_SWAPENTS); + swap = get_mm_counter(mm, MM_SWAPENTS); SEQ_PUT_DEC("VmPeak:\t", hiwater_vm); SEQ_PUT_DEC(" kB\nVmSize:\t", total_vm); SEQ_PUT_DEC(" kB\nVmLck:\t", mm->locked_vm); @@ -102,12 +102,12 @@ unsigned long task_statm(struct mm_struct *mm, unsigned long *shared, unsigned long *text, unsigned long *data, unsigned long *resident) { - *shared = get_mm_counter_sum(mm, MM_FILEPAGES) + - get_mm_counter_sum(mm, MM_SHMEMPAGES); + *shared = get_mm_counter(mm, MM_FILEPAGES) + + get_mm_counter(mm, MM_SHMEMPAGES); *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) >> PAGE_SHIFT; *data = mm->data_vm + mm->stack_vm; - *resident = *shared + get_mm_counter_sum(mm, MM_ANONPAGES); + *resident = *shared + get_mm_counter(mm, MM_ANONPAGES); return mm->total_vm; } diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index a1c97cd2720a68bf63bfb0bbf880e66ad053fb93..7dbbf3b6d98d3cda227bcd09c580029de9586ab6 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c @@ -264,7 +264,7 @@ static void parse_options(char *options) static int pstore_show_options(struct seq_file *m, struct dentry *root) { if (kmsg_bytes != CONFIG_PSTORE_DEFAULT_KMSG_BYTES) - seq_printf(m, ",kmsg_bytes=%u", kmsg_bytes); + seq_printf(m, ",kmsg_bytes=%lu", kmsg_bytes); return 0; } diff --git a/fs/pstore/internal.h b/fs/pstore/internal.h index 0659b833c887c555edf524848b55fdab6b1723b4..824ef8e84dabd3220f2e94ff5630b50a37a1e065 100644 --- a/fs/pstore/internal.h +++ b/fs/pstore/internal.h @@ -6,7 +6,7 @@ #include #include -extern unsigned int kmsg_bytes; +extern unsigned long kmsg_bytes; #ifdef CONFIG_PSTORE_FTRACE extern void pstore_register_ftrace(void); @@ -35,7 +35,7 @@ static inline void pstore_unregister_pmsg(void) {} extern struct pstore_info *psinfo; -extern void pstore_set_kmsg_bytes(unsigned int bytes); +extern void pstore_set_kmsg_bytes(int); extern void pstore_get_records(int); extern void pstore_get_backend_records(struct pstore_info *psi, struct dentry *root, int quiet); diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 0b896621a3b1e7c0fd9c035b7a6d406c63aac607..7ec9a3529f7311dbd3dd977633b3b25880c779e5 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -97,8 +97,8 @@ module_param(compress, charp, 0444); MODULE_PARM_DESC(compress, "compression to use"); /* How much of the kernel log to snapshot */ -unsigned int kmsg_bytes = CONFIG_PSTORE_DEFAULT_KMSG_BYTES; -module_param(kmsg_bytes, uint, 0444); +unsigned long kmsg_bytes = CONFIG_PSTORE_DEFAULT_KMSG_BYTES; +module_param(kmsg_bytes, ulong, 0444); MODULE_PARM_DESC(kmsg_bytes, "amount of kernel log to snapshot (in bytes)"); static void *compress_workspace; @@ -112,9 +112,9 @@ static void *compress_workspace; static char *big_oops_buf; static size_t max_compressed_size; -void pstore_set_kmsg_bytes(unsigned int bytes) +void pstore_set_kmsg_bytes(int bytes) { - WRITE_ONCE(kmsg_bytes, bytes); + kmsg_bytes = bytes; } /* Tag each group of saved records with a sequence number */ @@ -387,7 +387,6 @@ static void pstore_dump(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason) { struct kmsg_dump_iter iter; - unsigned int remaining = READ_ONCE(kmsg_bytes); unsigned long total = 0; const char *why; unsigned int part = 1; @@ -410,7 +409,7 @@ static void pstore_dump(struct kmsg_dumper *dumper, kmsg_dump_rewind(&iter); oopscount++; - while (total < remaining) { + while (total < kmsg_bytes) { char *dst; size_t dst_size; int header_size; diff --git a/fs/smb/client/cached_dir.c b/fs/smb/client/cached_dir.c index d64742ba371aa5424cdc6a166fda70ca46012b5f..74979466729535b3930f519a71420868b9ea1741 100644 --- a/fs/smb/client/cached_dir.c +++ b/fs/smb/client/cached_dir.c @@ -484,17 +484,8 @@ void close_all_cached_dirs(struct cifs_sb_info *cifs_sb) spin_lock(&cfids->cfid_list_lock); list_for_each_entry(cfid, &cfids->entries, entry) { tmp_list = kmalloc(sizeof(*tmp_list), GFP_ATOMIC); - if (tmp_list == NULL) { - /* - * If the malloc() fails, we won't drop all - * dentries, and unmounting is likely to trigger - * a 'Dentry still in use' error. - */ - cifs_tcon_dbg(VFS, "Out of memory while dropping dentries\n"); - spin_unlock(&cfids->cfid_list_lock); - spin_unlock(&cifs_sb->tlink_tree_lock); - goto done; - } + if (tmp_list == NULL) + break; spin_lock(&cfid->fid_lock); tmp_list->dentry = cfid->dentry; cfid->dentry = NULL; @@ -506,7 +497,6 @@ void close_all_cached_dirs(struct cifs_sb_info *cifs_sb) } spin_unlock(&cifs_sb->tlink_tree_lock); -done: list_for_each_entry_safe(tmp_list, q, &entry, entry) { list_del(&tmp_list->entry); dput(tmp_list->dentry); diff --git a/fs/smb/client/cached_dir.h b/fs/smb/client/cached_dir.h index bc8a812ff95f8bd3aa0c2f4c550483ca649124b1..1dfe79d947a62faab6df347d3463cc44af96fb83 100644 --- a/fs/smb/client/cached_dir.h +++ b/fs/smb/client/cached_dir.h @@ -21,10 +21,10 @@ struct cached_dirent { struct cached_dirents { bool is_valid:1; bool is_failed:1; - struct file *file; /* - * Used to associate the cache with a single - * open file instance. - */ + struct dir_context *ctx; /* + * Only used to make sure we only take entries + * from a single context. Never dereferenced. + */ struct mutex de_mutex; int pos; /* Expected ctx->pos */ struct list_head entries; diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index c9b37f2ebde85306714809a809fb19462890560f..39117343b703fa77c8bcfcab00899ca19561ebaa 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -677,7 +677,6 @@ inc_rfc1001_len(void *buf, int count) struct TCP_Server_Info { struct list_head tcp_ses_list; struct list_head smb_ses_list; - struct list_head rlist; /* reconnect list */ spinlock_t srv_lock; /* protect anything here that is not protected */ __u64 conn_id; /* connection identifier (useful for debugging) */ int srv_count; /* reference counter */ @@ -740,10 +739,8 @@ struct TCP_Server_Info { char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL]; __u32 sequence_number; /* for signing, protected by srv_mutex */ __u32 reconnect_instance; /* incremented on each reconnect */ - __le32 session_key_id; /* retrieved from negotiate response and send in session setup request */ struct session_key session_key; unsigned long lstrp; /* when we got last response from this server */ - unsigned long neg_start; /* when negotiate started (jiffies) */ struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */ #define CIFS_NEGFLAVOR_UNENCAP 1 /* wct == 17, but no ext_sec */ #define CIFS_NEGFLAVOR_EXTENDED 2 /* wct == 17, ext_sec bit set */ @@ -830,7 +827,6 @@ struct TCP_Server_Info { * format: \\HOST\SHARE[\OPTIONAL PATH] */ char *leaf_fullpath; - bool dfs_conn:1; }; static inline bool is_smb1(struct TCP_Server_Info *server) @@ -1057,7 +1053,6 @@ struct cifs_chan { }; #define CIFS_SES_FLAG_SCALE_CHANNELS (0x1) -#define CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES (0x2) /* * Session structure. One of these for each uid session with a particular host @@ -1066,7 +1061,6 @@ struct cifs_ses { struct list_head smb_ses_list; struct list_head rlist; /* reconnect list */ struct list_head tcon_list; - struct list_head dlist; /* dfs list */ struct cifs_tcon *tcon_ipc; spinlock_t ses_lock; /* protect anything here that is not protected */ struct mutex session_mutex; @@ -1271,7 +1265,6 @@ struct cifs_tcon { bool use_persistent:1; /* use persistent instead of durable handles */ bool no_lease:1; /* Do not request leases on files or directories */ bool use_witness:1; /* use witness protocol */ - bool dummy:1; /* dummy tcon used for reconnecting channels */ __le32 capabilities; __u32 share_flags; __u32 maximal_access; @@ -1296,7 +1289,6 @@ struct cifs_tcon { /* BB add field for back pointer to sb struct(s)? */ #ifdef CONFIG_CIFS_DFS_UPCALL struct delayed_work dfs_cache_work; - struct list_head dfs_ses_list; #endif struct delayed_work query_interfaces; /* query interfaces workqueue job */ char *origin_fullpath; /* canonical copy of smb3_fs_context::source */ diff --git a/fs/smb/client/cifspdu.h b/fs/smb/client/cifspdu.h index 763178b7745424b3b54fc9dba0dd9c8fa5a29b47..c46d418c1c0c3ea065eaa5d4f4f751750df90080 100644 --- a/fs/smb/client/cifspdu.h +++ b/fs/smb/client/cifspdu.h @@ -557,7 +557,7 @@ typedef union smb_com_session_setup_andx { __le16 MaxBufferSize; __le16 MaxMpxCount; __le16 VcNumber; - __le32 SessionKey; + __u32 SessionKey; __le16 SecurityBlobLength; __u32 Reserved; __le32 Capabilities; /* see below */ @@ -576,7 +576,7 @@ typedef union smb_com_session_setup_andx { __le16 MaxBufferSize; __le16 MaxMpxCount; __le16 VcNumber; - __le32 SessionKey; + __u32 SessionKey; __le16 CaseInsensitivePasswordLength; /* ASCII password len */ __le16 CaseSensitivePasswordLength; /* Unicode password length*/ __u32 Reserved; /* see below */ @@ -614,7 +614,7 @@ typedef union smb_com_session_setup_andx { __le16 MaxBufferSize; __le16 MaxMpxCount; __le16 VcNumber; - __le32 SessionKey; + __u32 SessionKey; __le16 PasswordLength; __u32 Reserved; /* encrypt key len and offset */ __le16 ByteCount; @@ -1226,9 +1226,10 @@ typedef struct smb_com_query_information_rsp { typedef struct smb_com_setattr_req { struct smb_hdr hdr; /* wct = 8 */ __le16 attr; - __le32 last_write_time; + __le16 time_low; + __le16 time_high; __le16 reserved[5]; /* must be zero */ - __le16 ByteCount; + __u16 ByteCount; __u8 BufferFormat; /* 4 = ASCII */ unsigned char fileName[]; } __attribute__((packed)) SETATTR_REQ; diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 5ab877e480abcbfd0a470c52025350364d88e1d1..858492220437456d428716e8a1313cbb59638574 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -136,7 +136,6 @@ extern int SendReceiveBlockingLock(const unsigned int xid, struct smb_hdr *out_buf, int *bytes_returned); -void smb2_query_server_interfaces(struct work_struct *work); void cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server, bool all_channels); @@ -399,10 +398,6 @@ extern int CIFSSMBQFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon); extern int CIFSSMBQFSPosixInfo(const unsigned int xid, struct cifs_tcon *tcon, struct kstatfs *FSData); -extern int SMBSetInformation(const unsigned int xid, struct cifs_tcon *tcon, - const char *fileName, __le32 attributes, __le64 write_time, - const struct nls_table *nls_codepage, - struct cifs_sb_info *cifs_sb); extern int CIFSSMBSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon, const char *fileName, const FILE_BASIC_INFO *data, const struct nls_table *nls_codepage, @@ -738,9 +733,15 @@ static inline int cifs_create_options(struct cifs_sb_info *cifs_sb, int options) int cifs_wait_for_server_reconnect(struct TCP_Server_Info *server, bool retry); +/* Put references of @ses and its children */ static inline void cifs_put_smb_ses(struct cifs_ses *ses) { - __cifs_put_smb_ses(ses); + struct cifs_ses *next; + + do { + next = ses->dfs_root_ses; + __cifs_put_smb_ses(ses); + } while ((ses = next)); } /* Get an active reference of @ses and its children. @@ -754,7 +755,9 @@ static inline void cifs_put_smb_ses(struct cifs_ses *ses) static inline void cifs_smb_ses_inc_refcount(struct cifs_ses *ses) { lockdep_assert_held(&cifs_tcp_ses_lock); - ses->ses_count++; + + for (; ses; ses = ses->dfs_root_ses) + ses->ses_count++; } static inline bool dfs_src_pathname_equal(const char *s1, const char *s2) diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index db35e68e8a5830e52afd273341bee99c2c695aa2..769950adb7763bb35b6672d287f33d8c56a42b4b 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -479,7 +479,6 @@ CIFSSMBNegotiate(const unsigned int xid, server->max_rw = le32_to_cpu(pSMBr->MaxRawSize); cifs_dbg(NOISY, "Max buf = %d\n", ses->server->maxBuf); server->capabilities = le32_to_cpu(pSMBr->Capabilities); - server->session_key_id = pSMBr->SessionKey; server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); server->timeAdj *= 60; @@ -2739,10 +2738,10 @@ int cifs_query_reparse_point(const unsigned int xid, io_req->TotalParameterCount = 0; io_req->TotalDataCount = 0; - io_req->MaxParameterCount = cpu_to_le32(0); + io_req->MaxParameterCount = cpu_to_le32(2); /* BB find exact data count max from sess structure BB */ io_req->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); - io_req->MaxSetupCount = 1; + io_req->MaxSetupCount = 4; io_req->Reserved = 0; io_req->ParameterOffset = 0; io_req->DataCount = 0; @@ -2769,22 +2768,6 @@ int cifs_query_reparse_point(const unsigned int xid, goto error; } - /* SetupCount must be 1, otherwise offset to ByteCount is incorrect. */ - if (io_rsp->SetupCount != 1) { - rc = -EIO; - goto error; - } - - /* - * ReturnedDataLen is output length of executed IOCTL. - * DataCount is output length transferred over network. - * Check that we have full FSCTL_GET_REPARSE_POINT buffer. - */ - if (data_count != le16_to_cpu(io_rsp->ReturnedDataLen)) { - rc = -EIO; - goto error; - } - end = 2 + get_bcc(&io_rsp->hdr) + (__u8 *)&io_rsp->ByteCount; start = (__u8 *)&io_rsp->hdr.Protocol + data_offset; if (start >= end) { @@ -5174,63 +5157,6 @@ CIFSSMBSetFileSize(const unsigned int xid, struct cifs_tcon *tcon, return rc; } -int -SMBSetInformation(const unsigned int xid, struct cifs_tcon *tcon, - const char *fileName, __le32 attributes, __le64 write_time, - const struct nls_table *nls_codepage, - struct cifs_sb_info *cifs_sb) -{ - SETATTR_REQ *pSMB; - SETATTR_RSP *pSMBr; - struct timespec64 ts; - int bytes_returned; - int name_len; - int rc; - - cifs_dbg(FYI, "In %s path %s\n", __func__, fileName); - -retry: - rc = smb_init(SMB_COM_SETATTR, 8, tcon, (void **) &pSMB, - (void **) &pSMBr); - if (rc) - return rc; - - if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { - name_len = - cifsConvertToUTF16((__le16 *) pSMB->fileName, - fileName, PATH_MAX, nls_codepage, - cifs_remap(cifs_sb)); - name_len++; /* trailing null */ - name_len *= 2; - } else { - name_len = copy_path_name(pSMB->fileName, fileName); - } - /* Only few attributes can be set by this command, others are not accepted by Win9x. */ - pSMB->attr = cpu_to_le16(le32_to_cpu(attributes) & - (ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_ARCHIVE)); - /* Zero write time value (in both NT and SETATTR formats) means to not change it. */ - if (le64_to_cpu(write_time) != 0) { - ts = cifs_NTtimeToUnix(write_time); - pSMB->last_write_time = cpu_to_le32(ts.tv_sec); - } - pSMB->BufferFormat = 0x04; - name_len++; /* account for buffer type byte */ - inc_rfc1001_len(pSMB, (__u16)name_len); - pSMB->ByteCount = cpu_to_le16(name_len); - - rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, - (struct smb_hdr *) pSMBr, &bytes_returned, 0); - if (rc) - cifs_dbg(FYI, "Send error in %s = %d\n", __func__, rc); - - cifs_buf_release(pSMB); - - if (rc == -EAGAIN) - goto retry; - - return rc; -} - /* Some legacy servers such as NT4 require that the file times be set on an open handle, rather than by pathname - this is awkward due to potential access conflicts on the open, but it is unavoidable for these diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index 0588896c44567d4efeb5f1882a426dd5e4fc8812..3faaee33ad45583ac01a4111eb49f959bb51a89d 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -113,7 +113,7 @@ static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server) return rc; } -void smb2_query_server_interfaces(struct work_struct *work) +static void smb2_query_server_interfaces(struct work_struct *work) { int rc; int xid; @@ -132,22 +132,18 @@ void smb2_query_server_interfaces(struct work_struct *work) rc = server->ops->query_server_interfaces(xid, tcon, false); free_xid(xid); - if (rc) + if (rc) { + if (rc == -EOPNOTSUPP) + return; + cifs_dbg(FYI, "%s: failed to query server interfaces: %d\n", __func__, rc); + } queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, (SMB_INTERFACE_POLL_INTERVAL * HZ)); } -#define set_need_reco(server) \ -do { \ - spin_lock(&server->srv_lock); \ - if (server->tcpStatus != CifsExiting) \ - server->tcpStatus = CifsNeedReconnect; \ - spin_unlock(&server->srv_lock); \ -} while (0) - /* * Update the tcpStatus for the server. * This is used to signal the cifsd thread to call cifs_reconnect @@ -161,45 +157,39 @@ void cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server, bool all_channels) { - struct TCP_Server_Info *nserver; + struct TCP_Server_Info *pserver; struct cifs_ses *ses; - LIST_HEAD(reco); int i; + /* If server is a channel, select the primary channel */ + pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; + /* if we need to signal just this channel */ if (!all_channels) { - set_need_reco(server); + spin_lock(&server->srv_lock); + if (server->tcpStatus != CifsExiting) + server->tcpStatus = CifsNeedReconnect; + spin_unlock(&server->srv_lock); return; } - if (SERVER_IS_CHAN(server)) - server = server->primary_server; - scoped_guard(spinlock, &cifs_tcp_ses_lock) { - set_need_reco(server); - list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) { - spin_lock(&ses->ses_lock); - if (ses->ses_status == SES_EXITING) { - spin_unlock(&ses->ses_lock); + spin_lock(&cifs_tcp_ses_lock); + list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) { + if (cifs_ses_exiting(ses)) + continue; + spin_lock(&ses->chan_lock); + for (i = 0; i < ses->chan_count; i++) { + if (!ses->chans[i].server) continue; - } - spin_lock(&ses->chan_lock); - for (i = 1; i < ses->chan_count; i++) { - nserver = ses->chans[i].server; - if (!nserver) - continue; - nserver->srv_count++; - list_add(&nserver->rlist, &reco); - } - spin_unlock(&ses->chan_lock); - spin_unlock(&ses->ses_lock); - } - } - list_for_each_entry_safe(server, nserver, &reco, rlist) { - list_del_init(&server->rlist); - set_need_reco(server); - cifs_put_tcp_session(server, 0); + spin_lock(&ses->chans[i].server->srv_lock); + if (ses->chans[i].server->tcpStatus != CifsExiting) + ses->chans[i].server->tcpStatus = CifsNeedReconnect; + spin_unlock(&ses->chans[i].server->srv_lock); + } + spin_unlock(&ses->chan_lock); } + spin_unlock(&cifs_tcp_ses_lock); } /* @@ -403,13 +393,6 @@ static int __cifs_reconnect(struct TCP_Server_Info *server, if (!cifs_tcp_ses_needs_reconnect(server, 1)) return 0; - /* - * if smb session has been marked for reconnect, also reconnect all - * connections. This way, the other connections do not end up bad. - */ - if (mark_smb_session) - cifs_signal_cifsd_for_reconnect(server, mark_smb_session); - cifs_mark_tcp_ses_conns_for_reconnect(server, mark_smb_session); cifs_abort_connection(server); @@ -418,8 +401,7 @@ static int __cifs_reconnect(struct TCP_Server_Info *server, try_to_freeze(); cifs_server_lock(server); - if (!cifs_swn_set_server_dstaddr(server) && - !SERVER_IS_CHAN(server)) { + if (!cifs_swn_set_server_dstaddr(server)) { /* resolve the hostname again to make sure that IP address is up-to-date */ rc = reconn_set_ipaddr_from_hostname(server); cifs_dbg(FYI, "%s: reconn_set_ipaddr_from_hostname: rc=%d\n", __func__, rc); @@ -677,12 +659,12 @@ server_unresponsive(struct TCP_Server_Info *server) /* * If we're in the process of mounting a share or reconnecting a session * and the server abruptly shut down (e.g. socket wasn't closed, packet - * had been ACK'ed but no SMB response), don't wait longer than 20s from - * when negotiate actually started. + * had been ACK'ed but no SMB response), don't wait longer than 20s to + * negotiate protocol. */ spin_lock(&server->srv_lock); if (server->tcpStatus == CifsInNegotiate && - time_after(jiffies, server->neg_start + 20 * HZ)) { + time_after(jiffies, server->lstrp + 20 * HZ)) { spin_unlock(&server->srv_lock); cifs_reconnect(server, false); return true; @@ -1551,9 +1533,6 @@ static int match_server(struct TCP_Server_Info *server, if (server->nosharesock) return 0; - if (!match_super && (ctx->dfs_conn || server->dfs_conn)) - return 0; - /* If multidialect negotiation see if existing sessions match one */ if (strcmp(ctx->vals->version_string, SMB3ANY_VERSION_STRING) == 0) { if (server->vals->protocol_id < SMB30_PROT_ID) @@ -1743,7 +1722,6 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx, if (ctx->nosharesock) tcp_ses->nosharesock = true; - tcp_ses->dfs_conn = ctx->dfs_conn; tcp_ses->ops = ctx->ops; tcp_ses->vals = ctx->vals; @@ -1894,14 +1872,12 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx, } /* this function must be called with ses_lock and chan_lock held */ -static int match_session(struct cifs_ses *ses, - struct smb3_fs_context *ctx, - bool match_super) +static int match_session(struct cifs_ses *ses, struct smb3_fs_context *ctx) { struct TCP_Server_Info *server = ses->server; enum securityEnum ctx_sec, ses_sec; - if (!match_super && ctx->dfs_root_ses != ses->dfs_root_ses) + if (ctx->dfs_root_ses != ses->dfs_root_ses) return 0; /* @@ -2053,7 +2029,7 @@ cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx) continue; } spin_lock(&ses->chan_lock); - if (match_session(ses, ctx, false)) { + if (match_session(ses, ctx)) { spin_unlock(&ses->chan_lock); spin_unlock(&ses->ses_lock); ret = ses; @@ -2456,6 +2432,8 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx) * need to lock before changing something in the session. */ spin_lock(&cifs_tcp_ses_lock); + if (ctx->dfs_root_ses) + cifs_smb_ses_inc_refcount(ctx->dfs_root_ses); ses->dfs_root_ses = ctx->dfs_root_ses; list_add(&ses->smb_ses_list, &server->smb_ses_list); spin_unlock(&cifs_tcp_ses_lock); @@ -2532,7 +2510,6 @@ cifs_put_tcon(struct cifs_tcon *tcon, enum smb3_tcon_ref_trace trace) { unsigned int xid; struct cifs_ses *ses; - LIST_HEAD(ses_list); /* * IPC tcon share the lifetime of their session and are @@ -2564,7 +2541,6 @@ cifs_put_tcon(struct cifs_tcon *tcon, enum smb3_tcon_ref_trace trace) cancel_delayed_work_sync(&tcon->query_interfaces); #ifdef CONFIG_CIFS_DFS_UPCALL cancel_delayed_work_sync(&tcon->dfs_cache_work); - list_replace_init(&tcon->dfs_ses_list, &ses_list); #endif if (tcon->use_witness) { @@ -2585,9 +2561,6 @@ cifs_put_tcon(struct cifs_tcon *tcon, enum smb3_tcon_ref_trace trace) cifs_fscache_release_super_cookie(tcon); tconInfoFree(tcon, netfs_trace_tcon_ref_free); cifs_put_smb_ses(ses); -#ifdef CONFIG_CIFS_DFS_UPCALL - dfs_put_root_smb_sessions(&ses_list); -#endif } /** @@ -2816,14 +2789,20 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx) tcon->max_cached_dirs = ctx->max_cached_dirs; tcon->nodelete = ctx->nodelete; tcon->local_lease = ctx->local_lease; + INIT_LIST_HEAD(&tcon->pending_opens); tcon->status = TID_GOOD; + INIT_DELAYED_WORK(&tcon->query_interfaces, + smb2_query_server_interfaces); if (ses->server->dialect >= SMB30_PROT_ID && (ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) { /* schedule query interfaces poll */ queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, (SMB_INTERFACE_POLL_INTERVAL * HZ)); } +#ifdef CONFIG_CIFS_DFS_UPCALL + INIT_DELAYED_WORK(&tcon->dfs_cache_work, dfs_cache_refresh); +#endif spin_lock(&cifs_tcp_ses_lock); list_add(&tcon->tcon_list, &ses->tcon_list); spin_unlock(&cifs_tcp_ses_lock); @@ -2965,7 +2944,7 @@ cifs_match_super(struct super_block *sb, void *data) spin_lock(&ses->chan_lock); spin_lock(&tcon->tc_lock); if (!match_server(tcp_srv, ctx, true) || - !match_session(ses, ctx, true) || + !match_session(ses, ctx) || !match_tcon(tcon, ctx) || !match_prepath(sb, tcon, mnt_data)) { rc = 0; @@ -3715,12 +3694,13 @@ int cifs_is_path_remote(struct cifs_mount_ctx *mnt_ctx) int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx) { struct cifs_mount_ctx mnt_ctx = { .cifs_sb = cifs_sb, .fs_ctx = ctx, }; + bool isdfs; int rc; - rc = dfs_mount_share(&mnt_ctx); + rc = dfs_mount_share(&mnt_ctx, &isdfs); if (rc) goto error; - if (!ctx->dfs_conn) + if (!isdfs) goto out; /* @@ -3998,9 +3978,7 @@ cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses, return 0; } - server->lstrp = jiffies; server->tcpStatus = CifsInNegotiate; - server->neg_start = jiffies; spin_unlock(&server->srv_lock); rc = server->ops->negotiate(xid, ses, server); @@ -4137,7 +4115,7 @@ cifs_set_vol_auth(struct smb3_fs_context *ctx, struct cifs_ses *ses) } static struct cifs_tcon * -cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid) +__cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid) { int rc; struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb); @@ -4235,6 +4213,17 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid) return tcon; } +static struct cifs_tcon * +cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid) +{ + struct cifs_tcon *ret; + + cifs_mount_lock(); + ret = __cifs_construct_tcon(cifs_sb, fsuid); + cifs_mount_unlock(); + return ret; +} + struct cifs_tcon * cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb) { diff --git a/fs/smb/client/dfs.c b/fs/smb/client/dfs.c index c35953843373ea8ce3fc540818d8a6645827f21d..bd259b04cdede061c08ddaed9e246f87e476aeea 100644 --- a/fs/smb/client/dfs.c +++ b/fs/smb/client/dfs.c @@ -69,7 +69,7 @@ static int get_session(struct cifs_mount_ctx *mnt_ctx, const char *full_path) * Get an active reference of @ses so that next call to cifs_put_tcon() won't * release it as any new DFS referrals must go through its IPC tcon. */ -static void set_root_smb_session(struct cifs_mount_ctx *mnt_ctx) +static void add_root_smb_session(struct cifs_mount_ctx *mnt_ctx) { struct smb3_fs_context *ctx = mnt_ctx->fs_ctx; struct cifs_ses *ses = mnt_ctx->ses; @@ -95,7 +95,7 @@ static inline int parse_dfs_target(struct smb3_fs_context *ctx, return rc; } -static int setup_dfs_ref(struct cifs_mount_ctx *mnt_ctx, +static int set_ref_paths(struct cifs_mount_ctx *mnt_ctx, struct dfs_info3_param *tgt, struct dfs_ref_walk *rw) { @@ -120,7 +120,6 @@ static int setup_dfs_ref(struct cifs_mount_ctx *mnt_ctx, } ref_walk_path(rw) = ref_path; ref_walk_fpath(rw) = full_path; - ref_walk_ses(rw) = ctx->dfs_root_ses; return 0; } @@ -129,11 +128,11 @@ static int __dfs_referral_walk(struct cifs_mount_ctx *mnt_ctx, { struct smb3_fs_context *ctx = mnt_ctx->fs_ctx; struct dfs_info3_param tgt = {}; + bool is_refsrv; int rc = -ENOENT; again: do { - ctx->dfs_root_ses = ref_walk_ses(rw); if (ref_walk_empty(rw)) { rc = dfs_get_referral(mnt_ctx, ref_walk_path(rw) + 1, NULL, ref_walk_tl(rw)); @@ -159,7 +158,10 @@ static int __dfs_referral_walk(struct cifs_mount_ctx *mnt_ctx, if (rc) continue; + is_refsrv = tgt.server_type == DFS_TYPE_ROOT || + DFS_INTERLINK(tgt.flags); ref_walk_set_tgt_hint(rw); + if (tgt.flags & DFSREF_STORAGE_SERVER) { rc = cifs_mount_get_tcon(mnt_ctx); if (!rc) @@ -170,10 +172,12 @@ static int __dfs_referral_walk(struct cifs_mount_ctx *mnt_ctx, continue; } - set_root_smb_session(mnt_ctx); + if (is_refsrv) + add_root_smb_session(mnt_ctx); + rc = ref_walk_advance(rw); if (!rc) { - rc = setup_dfs_ref(mnt_ctx, &tgt, rw); + rc = set_ref_paths(mnt_ctx, &tgt, rw); if (!rc) { rc = -EREMOTE; goto again; @@ -189,22 +193,20 @@ static int __dfs_referral_walk(struct cifs_mount_ctx *mnt_ctx, return rc; } -static int dfs_referral_walk(struct cifs_mount_ctx *mnt_ctx, - struct dfs_ref_walk **rw) +static int dfs_referral_walk(struct cifs_mount_ctx *mnt_ctx) { + struct dfs_ref_walk *rw; int rc; - *rw = ref_walk_alloc(); - if (IS_ERR(*rw)) { - rc = PTR_ERR(*rw); - *rw = NULL; - return rc; - } + rw = ref_walk_alloc(); + if (IS_ERR(rw)) + return PTR_ERR(rw); - ref_walk_init(*rw); - rc = setup_dfs_ref(mnt_ctx, NULL, *rw); + ref_walk_init(rw); + rc = set_ref_paths(mnt_ctx, NULL, rw); if (!rc) - rc = __dfs_referral_walk(mnt_ctx, *rw); + rc = __dfs_referral_walk(mnt_ctx, rw); + ref_walk_free(rw); return rc; } @@ -212,16 +214,16 @@ static int __dfs_mount_share(struct cifs_mount_ctx *mnt_ctx) { struct cifs_sb_info *cifs_sb = mnt_ctx->cifs_sb; struct smb3_fs_context *ctx = mnt_ctx->fs_ctx; - struct dfs_ref_walk *rw = NULL; struct cifs_tcon *tcon; char *origin_fullpath; + bool new_tcon = true; int rc; origin_fullpath = dfs_get_path(cifs_sb, ctx->source); if (IS_ERR(origin_fullpath)) return PTR_ERR(origin_fullpath); - rc = dfs_referral_walk(mnt_ctx, &rw); + rc = dfs_referral_walk(mnt_ctx); if (!rc) { /* * Prevent superblock from being created with any missing @@ -239,16 +241,21 @@ static int __dfs_mount_share(struct cifs_mount_ctx *mnt_ctx) tcon = mnt_ctx->tcon; spin_lock(&tcon->tc_lock); - tcon->origin_fullpath = origin_fullpath; - origin_fullpath = NULL; - ref_walk_set_tcon(rw, tcon); + if (!tcon->origin_fullpath) { + tcon->origin_fullpath = origin_fullpath; + origin_fullpath = NULL; + } else { + new_tcon = false; + } spin_unlock(&tcon->tc_lock); - queue_delayed_work(dfscache_wq, &tcon->dfs_cache_work, - dfs_cache_get_ttl() * HZ); + + if (new_tcon) { + queue_delayed_work(dfscache_wq, &tcon->dfs_cache_work, + dfs_cache_get_ttl() * HZ); + } out: kfree(origin_fullpath); - ref_walk_free(rw); return rc; } @@ -272,7 +279,7 @@ static int update_fs_context_dstaddr(struct smb3_fs_context *ctx) return rc; } -int dfs_mount_share(struct cifs_mount_ctx *mnt_ctx) +int dfs_mount_share(struct cifs_mount_ctx *mnt_ctx, bool *isdfs) { struct smb3_fs_context *ctx = mnt_ctx->fs_ctx; bool nodfs = ctx->nodfs; @@ -282,6 +289,7 @@ int dfs_mount_share(struct cifs_mount_ctx *mnt_ctx) if (rc) return rc; + *isdfs = false; rc = get_session(mnt_ctx, NULL); if (rc) return rc; @@ -309,15 +317,10 @@ int dfs_mount_share(struct cifs_mount_ctx *mnt_ctx) return rc; } - if (!ctx->dfs_conn) { - ctx->dfs_conn = true; - cifs_mount_put_conns(mnt_ctx); - rc = get_session(mnt_ctx, NULL); - } - if (!rc) { - set_root_smb_session(mnt_ctx); - rc = __dfs_mount_share(mnt_ctx); - } + *isdfs = true; + add_root_smb_session(mnt_ctx); + rc = __dfs_mount_share(mnt_ctx); + dfs_put_root_smb_sessions(mnt_ctx); return rc; } diff --git a/fs/smb/client/dfs.h b/fs/smb/client/dfs.h index 1aa2bc65b3bc2c43f953d01f753ff26a42f0511d..e5c4dcf837503aa2851f9b01680b6f5b7eb8874d 100644 --- a/fs/smb/client/dfs.h +++ b/fs/smb/client/dfs.h @@ -19,7 +19,6 @@ struct dfs_ref { char *path; char *full_path; - struct cifs_ses *ses; struct dfs_cache_tgt_list tl; struct dfs_cache_tgt_iterator *tit; }; @@ -39,7 +38,6 @@ struct dfs_ref_walk { #define ref_walk_path(w) (ref_walk_cur(w)->path) #define ref_walk_fpath(w) (ref_walk_cur(w)->full_path) #define ref_walk_tl(w) (&ref_walk_cur(w)->tl) -#define ref_walk_ses(w) (ref_walk_cur(w)->ses) static inline struct dfs_ref_walk *ref_walk_alloc(void) { @@ -62,19 +60,14 @@ static inline void __ref_walk_free(struct dfs_ref *ref) kfree(ref->path); kfree(ref->full_path); dfs_cache_free_tgts(&ref->tl); - if (ref->ses) - cifs_put_smb_ses(ref->ses); memset(ref, 0, sizeof(*ref)); } static inline void ref_walk_free(struct dfs_ref_walk *rw) { - struct dfs_ref *ref; - - if (!rw) - return; + struct dfs_ref *ref = ref_walk_start(rw); - for (ref = ref_walk_start(rw); ref <= ref_walk_end(rw); ref++) + for (; ref <= ref_walk_end(rw); ref++) __ref_walk_free(ref); kfree(rw); } @@ -123,22 +116,9 @@ static inline void ref_walk_set_tgt_hint(struct dfs_ref_walk *rw) ref_walk_tit(rw)); } -static inline void ref_walk_set_tcon(struct dfs_ref_walk *rw, - struct cifs_tcon *tcon) -{ - struct dfs_ref *ref = ref_walk_start(rw); - - for (; ref <= ref_walk_cur(rw); ref++) { - if (WARN_ON_ONCE(!ref->ses)) - continue; - list_add(&ref->ses->dlist, &tcon->dfs_ses_list); - ref->ses = NULL; - } -} - int dfs_parse_target_referral(const char *full_path, const struct dfs_info3_param *ref, struct smb3_fs_context *ctx); -int dfs_mount_share(struct cifs_mount_ctx *mnt_ctx); +int dfs_mount_share(struct cifs_mount_ctx *mnt_ctx, bool *isdfs); static inline char *dfs_get_path(struct cifs_sb_info *cifs_sb, const char *path) { @@ -162,14 +142,20 @@ static inline int dfs_get_referral(struct cifs_mount_ctx *mnt_ctx, const char *p * references of all DFS root sessions that were used across the mount process * in dfs_mount_share(). */ -static inline void dfs_put_root_smb_sessions(struct list_head *head) +static inline void dfs_put_root_smb_sessions(struct cifs_mount_ctx *mnt_ctx) { - struct cifs_ses *ses, *n; + const struct smb3_fs_context *ctx = mnt_ctx->fs_ctx; + struct cifs_ses *ses = ctx->dfs_root_ses; + struct cifs_ses *cur; + + if (!ses) + return; - list_for_each_entry_safe(ses, n, head, dlist) { - list_del_init(&ses->dlist); - cifs_put_smb_ses(ses); + for (cur = ses; cur; cur = cur->dfs_root_ses) { + if (cur->dfs_root_ses) + cifs_put_smb_ses(cur->dfs_root_ses); } + cifs_put_smb_ses(ses); } #endif /* _CIFS_DFS_H */ diff --git a/fs/smb/client/dfs_cache.c b/fs/smb/client/dfs_cache.c index 433f546055b977d8402862e67b7a19279b91272b..11c8efecf7aa128d30527ac1e44a3124f03ec5fb 100644 --- a/fs/smb/client/dfs_cache.c +++ b/fs/smb/client/dfs_cache.c @@ -1095,18 +1095,16 @@ int dfs_cache_get_tgt_share(char *path, const struct dfs_cache_tgt_iterator *it, return 0; } -static bool target_share_equal(struct cifs_tcon *tcon, const char *s1) +static bool target_share_equal(struct TCP_Server_Info *server, const char *s1, const char *s2) { - struct TCP_Server_Info *server = tcon->ses->server; - struct sockaddr_storage ss; + char unc[sizeof("\\\\") + SERVER_NAME_LENGTH] = {0}; const char *host; - const char *s2 = &tcon->tree_name[1]; size_t hostlen; - char unc[sizeof("\\\\") + SERVER_NAME_LENGTH] = {0}; + struct sockaddr_storage ss; bool match; int rc; - if (strcasecmp(s2, s1)) + if (strcasecmp(s1, s2)) return false; /* @@ -1130,6 +1128,34 @@ static bool target_share_equal(struct cifs_tcon *tcon, const char *s1) return match; } +/* + * Mark dfs tcon for reconnecting when the currently connected tcon does not match any of the new + * target shares in @refs. + */ +static void mark_for_reconnect_if_needed(struct TCP_Server_Info *server, + const char *path, + struct dfs_cache_tgt_list *old_tl, + struct dfs_cache_tgt_list *new_tl) +{ + struct dfs_cache_tgt_iterator *oit, *nit; + + for (oit = dfs_cache_get_tgt_iterator(old_tl); oit; + oit = dfs_cache_get_next_tgt(old_tl, oit)) { + for (nit = dfs_cache_get_tgt_iterator(new_tl); nit; + nit = dfs_cache_get_next_tgt(new_tl, nit)) { + if (target_share_equal(server, + dfs_cache_get_tgt_name(oit), + dfs_cache_get_tgt_name(nit))) { + dfs_cache_noreq_update_tgthint(path, nit); + return; + } + } + } + + cifs_dbg(FYI, "%s: no cached or matched targets. mark dfs share for reconnect.\n", __func__); + cifs_signal_cifsd_for_reconnect(server, true); +} + static bool is_ses_good(struct cifs_ses *ses) { struct TCP_Server_Info *server = ses->server; @@ -1146,35 +1172,41 @@ static bool is_ses_good(struct cifs_ses *ses) return ret; } -static char *get_ses_refpath(struct cifs_ses *ses) +/* Refresh dfs referral of @ses and mark it for reconnect if needed */ +static void __refresh_ses_referral(struct cifs_ses *ses, bool force_refresh) { struct TCP_Server_Info *server = ses->server; - char *path = ERR_PTR(-ENOENT); + DFS_CACHE_TGT_LIST(old_tl); + DFS_CACHE_TGT_LIST(new_tl); + bool needs_refresh = false; + struct cache_entry *ce; + unsigned int xid; + char *path = NULL; + int rc = 0; + + xid = get_xid(); mutex_lock(&server->refpath_lock); if (server->leaf_fullpath) { path = kstrdup(server->leaf_fullpath + 1, GFP_ATOMIC); if (!path) - path = ERR_PTR(-ENOMEM); + rc = -ENOMEM; } mutex_unlock(&server->refpath_lock); - return path; -} - -/* Refresh dfs referral of @ses */ -static void refresh_ses_referral(struct cifs_ses *ses) -{ - struct cache_entry *ce; - unsigned int xid; - char *path; - int rc = 0; + if (!path) + goto out; - xid = get_xid(); + down_read(&htable_rw_lock); + ce = lookup_cache_entry(path); + needs_refresh = force_refresh || IS_ERR(ce) || cache_entry_expired(ce); + if (!IS_ERR(ce)) { + rc = get_targets(ce, &old_tl); + cifs_dbg(FYI, "%s: get_targets: %d\n", __func__, rc); + } + up_read(&htable_rw_lock); - path = get_ses_refpath(ses); - if (IS_ERR(path)) { - rc = PTR_ERR(path); - path = NULL; + if (!needs_refresh) { + rc = 0; goto out; } @@ -1185,106 +1217,29 @@ static void refresh_ses_referral(struct cifs_ses *ses) goto out; } - ce = cache_refresh_path(xid, ses, path, false); - if (!IS_ERR(ce)) + ce = cache_refresh_path(xid, ses, path, true); + if (!IS_ERR(ce)) { + rc = get_targets(ce, &new_tl); up_read(&htable_rw_lock); - else - rc = PTR_ERR(ce); + cifs_dbg(FYI, "%s: get_targets: %d\n", __func__, rc); + mark_for_reconnect_if_needed(server, path, &old_tl, &new_tl); + } out: free_xid(xid); + dfs_cache_free_tgts(&old_tl); + dfs_cache_free_tgts(&new_tl); kfree(path); } -static int __refresh_tcon_referral(struct cifs_tcon *tcon, - const char *path, - struct dfs_info3_param *refs, - int numrefs, bool force_refresh) +static inline void refresh_ses_referral(struct cifs_ses *ses) { - struct cache_entry *ce; - bool reconnect = force_refresh; - int rc = 0; - int i; - - if (unlikely(!numrefs)) - return 0; - - if (force_refresh) { - for (i = 0; i < numrefs; i++) { - /* TODO: include prefix paths in the matching */ - if (target_share_equal(tcon, refs[i].node_name)) { - reconnect = false; - break; - } - } - } - - down_write(&htable_rw_lock); - ce = lookup_cache_entry(path); - if (!IS_ERR(ce)) { - if (force_refresh || cache_entry_expired(ce)) - rc = update_cache_entry_locked(ce, refs, numrefs); - } else if (PTR_ERR(ce) == -ENOENT) { - ce = add_cache_entry_locked(refs, numrefs); - } - up_write(&htable_rw_lock); - - if (IS_ERR(ce)) - rc = PTR_ERR(ce); - if (reconnect) { - cifs_tcon_dbg(FYI, "%s: mark for reconnect\n", __func__); - cifs_signal_cifsd_for_reconnect(tcon->ses->server, true); - } - return rc; + __refresh_ses_referral(ses, false); } -static void refresh_tcon_referral(struct cifs_tcon *tcon, bool force_refresh) +static inline void force_refresh_ses_referral(struct cifs_ses *ses) { - struct dfs_info3_param *refs = NULL; - struct cache_entry *ce; - struct cifs_ses *ses; - unsigned int xid; - bool needs_refresh; - char *path; - int numrefs = 0; - int rc = 0; - - xid = get_xid(); - ses = tcon->ses; - - path = get_ses_refpath(ses); - if (IS_ERR(path)) { - rc = PTR_ERR(path); - path = NULL; - goto out; - } - - down_read(&htable_rw_lock); - ce = lookup_cache_entry(path); - needs_refresh = force_refresh || IS_ERR(ce) || cache_entry_expired(ce); - if (!needs_refresh) { - up_read(&htable_rw_lock); - goto out; - } - up_read(&htable_rw_lock); - - ses = CIFS_DFS_ROOT_SES(ses); - if (!is_ses_good(ses)) { - cifs_dbg(FYI, "%s: skip cache refresh due to disconnected ipc\n", - __func__); - goto out; - } - - rc = get_dfs_referral(xid, ses, path, &refs, &numrefs); - if (!rc) { - rc = __refresh_tcon_referral(tcon, path, refs, - numrefs, force_refresh); - } - -out: - free_xid(xid); - kfree(path); - free_dfs_info_array(refs, numrefs); + __refresh_ses_referral(ses, true); } /** @@ -1325,7 +1280,7 @@ int dfs_cache_remount_fs(struct cifs_sb_info *cifs_sb) */ cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH; - refresh_tcon_referral(tcon, true); + force_refresh_ses_referral(tcon->ses); return 0; } @@ -1337,9 +1292,8 @@ void dfs_cache_refresh(struct work_struct *work) tcon = container_of(work, struct cifs_tcon, dfs_cache_work.work); - list_for_each_entry(ses, &tcon->dfs_ses_list, dlist) + for (ses = tcon->ses; ses; ses = ses->dfs_root_ses) refresh_ses_referral(ses); - refresh_tcon_referral(tcon, false); queue_delayed_work(dfscache_wq, &tcon->dfs_cache_work, atomic_read(&dfs_cache_ttl) * HZ); diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 99a8c6fbd41a6518f7b1e6e68f708bce5512d7e5..d883ed75022c4adc26c3a7f808cb6c105be87f67 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -5042,8 +5042,7 @@ void cifs_oplock_break(struct work_struct *work) struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo, oplock_break); struct inode *inode = d_inode(cfile->dentry); - struct super_block *sb = inode->i_sb; - struct cifs_sb_info *cifs_sb = CIFS_SB(sb); + struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct cifsInodeInfo *cinode = CIFS_I(inode); struct cifs_tcon *tcon; struct TCP_Server_Info *server; @@ -5053,12 +5052,6 @@ void cifs_oplock_break(struct work_struct *work) __u64 persistent_fid, volatile_fid; __u16 net_fid; - /* - * Hold a reference to the superblock to prevent it and its inodes from - * being freed while we are accessing cinode. Otherwise, _cifsFileInfo_put() - * may release the last reference to the sb and trigger inode eviction. - */ - cifs_sb_active(sb); wait_on_bit(&cinode->flags, CIFS_INODE_PENDING_WRITERS, TASK_UNINTERRUPTIBLE); @@ -5131,7 +5124,6 @@ void cifs_oplock_break(struct work_struct *work) cifs_put_tlink(tlink); out: cifs_done_oplock_break(cinode); - cifs_sb_deactive(sb); } /* diff --git a/fs/smb/client/fs_context.h b/fs/smb/client/fs_context.h index 52ee72e562f5f6768d3f32ad87c4e0a990515745..d0a2043ea44682fdcc46ccaf01141fcc8af674c3 100644 --- a/fs/smb/client/fs_context.h +++ b/fs/smb/client/fs_context.h @@ -287,7 +287,6 @@ struct smb3_fs_context { struct cifs_ses *dfs_root_ses; bool dfs_automount:1; /* set for dfs automount only */ enum cifs_reparse_type reparse_type; - bool dfs_conn:1; /* set for dfs mounts */ }; extern const struct fs_parameter_spec smb3_fs_parameters[]; diff --git a/fs/smb/client/misc.c b/fs/smb/client/misc.c index bbbe48447765de5113362017a967421e4fceaaeb..65d4b72b4d51a9ef8b0bd6d52ac948f8bbf272ff 100644 --- a/fs/smb/client/misc.c +++ b/fs/smb/client/misc.c @@ -145,15 +145,6 @@ tcon_info_alloc(bool dir_leases_enabled, enum smb3_tcon_ref_trace trace) mutex_init(&ret_buf->fscache_lock); #endif trace_smb3_tcon_ref(ret_buf->debug_id, ret_buf->tc_count, trace); -#ifdef CONFIG_CIFS_DFS_UPCALL - INIT_LIST_HEAD(&ret_buf->dfs_ses_list); -#endif - INIT_LIST_HEAD(&ret_buf->pending_opens); - INIT_DELAYED_WORK(&ret_buf->query_interfaces, - smb2_query_server_interfaces); -#ifdef CONFIG_CIFS_DFS_UPCALL - INIT_DELAYED_WORK(&ret_buf->dfs_cache_work, dfs_cache_refresh); -#endif return ret_buf; } @@ -329,14 +320,6 @@ check_smb_hdr(struct smb_hdr *smb) if (smb->Command == SMB_COM_LOCKING_ANDX) return 0; - /* - * Windows NT server returns error resposne (e.g. STATUS_DELETE_PENDING - * or STATUS_OBJECT_NAME_NOT_FOUND or ERRDOS/ERRbadfile or any other) - * for some TRANS2 requests without the RESPONSE flag set in header. - */ - if (smb->Command == SMB_COM_TRANSACTION2 && smb->Status.CifsError != 0) - return 0; - cifs_dbg(VFS, "Server sent request, not response. mid=%u\n", get_mid(smb)); return 1; diff --git a/fs/smb/client/namespace.c b/fs/smb/client/namespace.c index a6655807c0865ae5c5b7f4ee7d4dac4cade16f41..830f2a292bb00d19393b1dc5fa1b1f5538dfdb65 100644 --- a/fs/smb/client/namespace.c +++ b/fs/smb/client/namespace.c @@ -146,9 +146,6 @@ static char *automount_fullpath(struct dentry *dentry, void *page) } spin_unlock(&tcon->tc_lock); - if (unlikely(!page)) - return ERR_PTR(-ENOMEM); - s = dentry_path_raw(dentry, page, PATH_MAX); if (IS_ERR(s)) return s; @@ -260,7 +257,7 @@ static struct vfsmount *cifs_do_automount(struct path *path) ctx->source = NULL; goto out; } - ctx->dfs_automount = ctx->dfs_conn = is_dfs_mount(mntpt); + ctx->dfs_automount = is_dfs_mount(mntpt); cifs_dbg(FYI, "%s: ctx: source=%s UNC=%s prepath=%s dfs_automount=%d\n", __func__, ctx->source, ctx->UNC, ctx->prepath, ctx->dfs_automount); diff --git a/fs/smb/client/readdir.c b/fs/smb/client/readdir.c index 0be16f8acd9af5dd2d267427da68b914735d8353..75929a0a56f9696e5c14eee790f7ef026de3415d 100644 --- a/fs/smb/client/readdir.c +++ b/fs/smb/client/readdir.c @@ -263,7 +263,7 @@ cifs_posix_to_fattr(struct cifs_fattr *fattr, struct smb2_posix_info *info, /* The Mode field in the response can now include the file type as well */ fattr->cf_mode = wire_mode_to_posix(le32_to_cpu(info->Mode), fattr->cf_cifsattrs & ATTR_DIRECTORY); - fattr->cf_dtype = S_DT(fattr->cf_mode); + fattr->cf_dtype = S_DT(le32_to_cpu(info->Mode)); switch (fattr->cf_mode & S_IFMT) { case S_IFLNK: @@ -733,10 +733,7 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, loff_t pos, else cifs_buf_release(cfile->srch_inf. ntwrk_buf_start); - /* Reset all pointers to the network buffer to prevent stale references */ cfile->srch_inf.ntwrk_buf_start = NULL; - cfile->srch_inf.srch_entries_start = NULL; - cfile->srch_inf.last_entry = NULL; } rc = initiate_cifs_search(xid, file, full_path); if (rc) { @@ -759,11 +756,11 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, loff_t pos, rc = server->ops->query_dir_next(xid, tcon, &cfile->fid, search_flags, &cfile->srch_inf); - if (rc) - return -ENOENT; /* FindFirst/Next set last_entry to NULL on malformed reply */ if (cfile->srch_inf.last_entry) cifs_save_resume_key(cfile->srch_inf.last_entry, cfile); + if (rc) + return -ENOENT; } if (index_to_find < cfile->srch_inf.index_of_last_entry) { /* we found the buffer that contains the entry */ @@ -850,9 +847,9 @@ static bool emit_cached_dirents(struct cached_dirents *cde, } static void update_cached_dirents_count(struct cached_dirents *cde, - struct file *file) + struct dir_context *ctx) { - if (cde->file != file) + if (cde->ctx != ctx) return; if (cde->is_valid || cde->is_failed) return; @@ -861,9 +858,9 @@ static void update_cached_dirents_count(struct cached_dirents *cde, } static void finished_cached_dirents_count(struct cached_dirents *cde, - struct dir_context *ctx, struct file *file) + struct dir_context *ctx) { - if (cde->file != file) + if (cde->ctx != ctx) return; if (cde->is_valid || cde->is_failed) return; @@ -876,12 +873,11 @@ static void finished_cached_dirents_count(struct cached_dirents *cde, static void add_cached_dirent(struct cached_dirents *cde, struct dir_context *ctx, const char *name, int namelen, - struct cifs_fattr *fattr, - struct file *file) + struct cifs_fattr *fattr) { struct cached_dirent *de; - if (cde->file != file) + if (cde->ctx != ctx) return; if (cde->is_valid || cde->is_failed) return; @@ -911,8 +907,7 @@ static void add_cached_dirent(struct cached_dirents *cde, static bool cifs_dir_emit(struct dir_context *ctx, const char *name, int namelen, struct cifs_fattr *fattr, - struct cached_fid *cfid, - struct file *file) + struct cached_fid *cfid) { bool rc; ino_t ino = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid); @@ -924,7 +919,7 @@ static bool cifs_dir_emit(struct dir_context *ctx, if (cfid) { mutex_lock(&cfid->dirents.de_mutex); add_cached_dirent(&cfid->dirents, ctx, name, namelen, - fattr, file); + fattr); mutex_unlock(&cfid->dirents.de_mutex); } @@ -1024,7 +1019,7 @@ static int cifs_filldir(char *find_entry, struct file *file, cifs_prime_dcache(file_dentry(file), &name, &fattr); return !cifs_dir_emit(ctx, name.name, name.len, - &fattr, cfid, file); + &fattr, cfid); } @@ -1075,8 +1070,8 @@ int cifs_readdir(struct file *file, struct dir_context *ctx) * we need to initialize scanning and storing the * directory content. */ - if (ctx->pos == 0 && cfid->dirents.file == NULL) { - cfid->dirents.file = file; + if (ctx->pos == 0 && cfid->dirents.ctx == NULL) { + cfid->dirents.ctx = ctx; cfid->dirents.pos = 2; } /* @@ -1144,7 +1139,7 @@ int cifs_readdir(struct file *file, struct dir_context *ctx) } else { if (cfid) { mutex_lock(&cfid->dirents.de_mutex); - finished_cached_dirents_count(&cfid->dirents, ctx, file); + finished_cached_dirents_count(&cfid->dirents, ctx); mutex_unlock(&cfid->dirents.de_mutex); } cifs_dbg(FYI, "Could not find entry\n"); @@ -1185,7 +1180,7 @@ int cifs_readdir(struct file *file, struct dir_context *ctx) ctx->pos++; if (cfid) { mutex_lock(&cfid->dirents.de_mutex); - update_cached_dirents_count(&cfid->dirents, file); + update_cached_dirents_count(&cfid->dirents, ctx); mutex_unlock(&cfid->dirents.de_mutex); } diff --git a/fs/smb/client/reparse.c b/fs/smb/client/reparse.c index 4d45c31336df173b90305182fbeb7db304ec1634..b6556fe3dfa11a7aaa6df5ab19f6bb1ba5e0cb86 100644 --- a/fs/smb/client/reparse.c +++ b/fs/smb/client/reparse.c @@ -738,6 +738,7 @@ static bool wsl_to_fattr(struct cifs_open_info_data *data, if (!have_xattr_dev && (tag == IO_REPARSE_TAG_LX_CHR || tag == IO_REPARSE_TAG_LX_BLK)) return false; + fattr->cf_dtype = S_DT(fattr->cf_mode); return true; } diff --git a/fs/smb/client/sess.c b/fs/smb/client/sess.c index c351da8c3e2eaf3fd4625b3ab84004bf9a40a6fe..f04922eb45d4c90adabf7ad8135502ce9916fbe9 100644 --- a/fs/smb/client/sess.c +++ b/fs/smb/client/sess.c @@ -485,10 +485,6 @@ cifs_chan_update_iface(struct cifs_ses *ses, struct TCP_Server_Info *server) ses->chans[chan_index].iface = iface; spin_unlock(&ses->chan_lock); - - spin_lock(&server->srv_lock); - memcpy(&server->dstaddr, &iface->sockaddr, sizeof(server->dstaddr)); - spin_unlock(&server->srv_lock); } /* @@ -558,7 +554,8 @@ cifs_ses_add_channel(struct cifs_ses *ses, ctx->domainauto = ses->domainAuto; ctx->domainname = ses->domainName; - ctx->server_hostname = ses->server->hostname; + /* no hostname for extra channels */ + ctx->server_hostname = ""; ctx->username = ses->user_name; ctx->password = ses->password; @@ -683,7 +680,6 @@ static __u32 cifs_ssetup_hdr(struct cifs_ses *ses, USHRT_MAX)); pSMB->req.MaxMpxCount = cpu_to_le16(server->maxReq); pSMB->req.VcNumber = cpu_to_le16(1); - pSMB->req.SessionKey = server->session_key_id; /* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */ @@ -1740,22 +1736,22 @@ _sess_auth_rawntlmssp_assemble_req(struct sess_data *sess_data) pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base; capabilities = cifs_ssetup_hdr(ses, server, pSMB); + if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) { + cifs_dbg(VFS, "NTLMSSP requires Unicode support\n"); + return -ENOSYS; + } + pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC; capabilities |= CAP_EXTENDED_SECURITY; pSMB->req.Capabilities |= cpu_to_le32(capabilities); bcc_ptr = sess_data->iov[2].iov_base; - - if (pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) { - /* unicode strings must be word aligned */ - if (!IS_ALIGNED(sess_data->iov[0].iov_len + sess_data->iov[1].iov_len, 2)) { - *bcc_ptr = 0; - bcc_ptr++; - } - unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp); - } else { - ascii_oslm_strings(&bcc_ptr, sess_data->nls_cp); + /* unicode strings must be word aligned */ + if (!IS_ALIGNED(sess_data->iov[0].iov_len + sess_data->iov[1].iov_len, 2)) { + *bcc_ptr = 0; + bcc_ptr++; } + unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp); sess_data->iov[2].iov_len = (long) bcc_ptr - (long) sess_data->iov[2].iov_base; diff --git a/fs/smb/client/smb1ops.c b/fs/smb/client/smb1ops.c index e62d9cc592e0c8fe223d49e43e95be89147325aa..0ba0f680205c1d7a86c4cbad843dd5f74a3beaba 100644 --- a/fs/smb/client/smb1ops.c +++ b/fs/smb/client/smb1ops.c @@ -541,104 +541,24 @@ static int cifs_query_path_info(const unsigned int xid, const char *full_path, struct cifs_open_info_data *data) { - int rc = -EOPNOTSUPP; + int rc; FILE_ALL_INFO fi = {}; - struct cifs_search_info search_info = {}; - bool non_unicode_wildcard = false; data->symlink = false; data->adjust_tz = false; + /* could do find first instead but this returns more info */ + rc = CIFSSMBQPathInfo(xid, tcon, full_path, &fi, 0 /* not legacy */, cifs_sb->local_nls, + cifs_remap(cifs_sb)); /* - * First try CIFSSMBQPathInfo() function which returns more info - * (NumberOfLinks) than CIFSFindFirst() fallback function. - * Some servers like Win9x do not support SMB_QUERY_FILE_ALL_INFO over - * TRANS2_QUERY_PATH_INFORMATION, but supports it with filehandle over - * TRANS2_QUERY_FILE_INFORMATION (function CIFSSMBQFileInfo(). But SMB - * Open command on non-NT servers works only for files, does not work - * for directories. And moreover Win9x SMB server returns bogus data in - * SMB_QUERY_FILE_ALL_INFO Attributes field. So for non-NT servers, - * do not even use CIFSSMBQPathInfo() or CIFSSMBQFileInfo() function. - */ - if (tcon->ses->capabilities & CAP_NT_SMBS) - rc = CIFSSMBQPathInfo(xid, tcon, full_path, &fi, 0 /* not legacy */, - cifs_sb->local_nls, cifs_remap(cifs_sb)); - - /* - * Non-UNICODE variant of fallback functions below expands wildcards, - * so they cannot be used for querying paths with wildcard characters. - */ - if (rc && !(tcon->ses->capabilities & CAP_UNICODE) && strpbrk(full_path, "*?\"><")) - non_unicode_wildcard = true; - - /* - * Then fallback to CIFSFindFirst() which works also with non-NT servers - * but does not does not provide NumberOfLinks. - */ - if ((rc == -EOPNOTSUPP || rc == -EINVAL) && - !non_unicode_wildcard) { - if (!(tcon->ses->capabilities & tcon->ses->server->vals->cap_nt_find)) - search_info.info_level = SMB_FIND_FILE_INFO_STANDARD; - else - search_info.info_level = SMB_FIND_FILE_FULL_DIRECTORY_INFO; - rc = CIFSFindFirst(xid, tcon, full_path, cifs_sb, NULL, - CIFS_SEARCH_CLOSE_ALWAYS | CIFS_SEARCH_CLOSE_AT_END, - &search_info, false); - if (rc == 0) { - if (!(tcon->ses->capabilities & tcon->ses->server->vals->cap_nt_find)) { - FIND_FILE_STANDARD_INFO *di; - int offset = tcon->ses->server->timeAdj; - - di = (FIND_FILE_STANDARD_INFO *)search_info.srch_entries_start; - fi.CreationTime = cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm( - di->CreationDate, di->CreationTime, offset))); - fi.LastAccessTime = cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm( - di->LastAccessDate, di->LastAccessTime, offset))); - fi.LastWriteTime = cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm( - di->LastWriteDate, di->LastWriteTime, offset))); - fi.ChangeTime = fi.LastWriteTime; - fi.Attributes = cpu_to_le32(le16_to_cpu(di->Attributes)); - fi.AllocationSize = cpu_to_le64(le32_to_cpu(di->AllocationSize)); - fi.EndOfFile = cpu_to_le64(le32_to_cpu(di->DataSize)); - } else { - FILE_FULL_DIRECTORY_INFO *di; - - di = (FILE_FULL_DIRECTORY_INFO *)search_info.srch_entries_start; - fi.CreationTime = di->CreationTime; - fi.LastAccessTime = di->LastAccessTime; - fi.LastWriteTime = di->LastWriteTime; - fi.ChangeTime = di->ChangeTime; - fi.Attributes = di->ExtFileAttributes; - fi.AllocationSize = di->AllocationSize; - fi.EndOfFile = di->EndOfFile; - fi.EASize = di->EaSize; - } - fi.NumberOfLinks = cpu_to_le32(1); - fi.DeletePending = 0; - fi.Directory = !!(le32_to_cpu(fi.Attributes) & ATTR_DIRECTORY); - cifs_buf_release(search_info.ntwrk_buf_start); - } else if (!full_path[0]) { - /* - * CIFSFindFirst() does not work on root path if the - * root path was exported on the server from the top - * level path (drive letter). - */ - rc = -EOPNOTSUPP; - } - } - - /* - * If everything failed then fallback to the legacy SMB command - * SMB_COM_QUERY_INFORMATION which works with all servers, but - * provide just few information. + * BB optimize code so we do not make the above call when server claims + * no NT SMB support and the above call failed at least once - set flag + * in tcon or mount. */ - if ((rc == -EOPNOTSUPP || rc == -EINVAL) && !non_unicode_wildcard) { + if ((rc == -EOPNOTSUPP) || (rc == -EINVAL)) { rc = SMBQueryInformation(xid, tcon, full_path, &fi, cifs_sb->local_nls, cifs_remap(cifs_sb)); data->adjust_tz = true; - } else if ((rc == -EOPNOTSUPP || rc == -EINVAL) && non_unicode_wildcard) { - /* Path with non-UNICODE wildcard character cannot exist. */ - rc = -ENOENT; } if (!rc) { @@ -735,13 +655,6 @@ static int cifs_query_file_info(const unsigned int xid, struct cifs_tcon *tcon, int rc; FILE_ALL_INFO fi = {}; - /* - * CIFSSMBQFileInfo() for non-NT servers returns bogus data in - * Attributes fields. So do not use this command for non-NT servers. - */ - if (!(tcon->ses->capabilities & CAP_NT_SMBS)) - return -EOPNOTSUPP; - if (cfile->symlink_target) { data->symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL); if (!data->symlink_target) @@ -912,9 +825,6 @@ smb_set_file_info(struct inode *inode, const char *full_path, struct cifs_fid fid; struct cifs_open_parms oparms; struct cifsFileInfo *open_file; - FILE_BASIC_INFO new_buf; - struct cifs_open_info_data query_data; - __le64 write_time = buf->LastWriteTime; struct cifsInodeInfo *cinode = CIFS_I(inode); struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct tcon_link *tlink = NULL; @@ -922,58 +832,20 @@ smb_set_file_info(struct inode *inode, const char *full_path, /* if the file is already open for write, just use that fileid */ open_file = find_writable_file(cinode, FIND_WR_FSUID_ONLY); - if (open_file) { fid.netfid = open_file->fid.netfid; netpid = open_file->pid; tcon = tlink_tcon(open_file->tlink); - } else { - tlink = cifs_sb_tlink(cifs_sb); - if (IS_ERR(tlink)) { - rc = PTR_ERR(tlink); - tlink = NULL; - goto out; - } - tcon = tlink_tcon(tlink); + goto set_via_filehandle; } - /* - * Non-NT servers interprets zero time value in SMB_SET_FILE_BASIC_INFO - * over TRANS2_SET_FILE_INFORMATION as a valid time value. NT servers - * interprets zero time value as do not change existing value on server. - * API of ->set_file_info() callback expects that zero time value has - * the NT meaning - do not change. Therefore if server is non-NT and - * some time values in "buf" are zero, then fetch missing time values. - */ - if (!(tcon->ses->capabilities & CAP_NT_SMBS) && - (!buf->CreationTime || !buf->LastAccessTime || - !buf->LastWriteTime || !buf->ChangeTime)) { - rc = cifs_query_path_info(xid, tcon, cifs_sb, full_path, &query_data); - if (rc) { - if (open_file) { - cifsFileInfo_put(open_file); - open_file = NULL; - } - goto out; - } - /* - * Original write_time from buf->LastWriteTime is preserved - * as SMBSetInformation() interprets zero as do not change. - */ - new_buf = *buf; - buf = &new_buf; - if (!buf->CreationTime) - buf->CreationTime = query_data.fi.CreationTime; - if (!buf->LastAccessTime) - buf->LastAccessTime = query_data.fi.LastAccessTime; - if (!buf->LastWriteTime) - buf->LastWriteTime = query_data.fi.LastWriteTime; - if (!buf->ChangeTime) - buf->ChangeTime = query_data.fi.ChangeTime; + tlink = cifs_sb_tlink(cifs_sb); + if (IS_ERR(tlink)) { + rc = PTR_ERR(tlink); + tlink = NULL; + goto out; } - - if (open_file) - goto set_via_filehandle; + tcon = tlink_tcon(tlink); rc = CIFSSMBSetPathInfo(xid, tcon, full_path, buf, cifs_sb->local_nls, cifs_sb); @@ -994,45 +866,8 @@ smb_set_file_info(struct inode *inode, const char *full_path, .fid = &fid, }; - if (S_ISDIR(inode->i_mode) && !(tcon->ses->capabilities & CAP_NT_SMBS)) { - /* Opening directory path is not possible on non-NT servers. */ - rc = -EOPNOTSUPP; - } else { - /* - * Use cifs_open_file() instead of CIFS_open() as the - * cifs_open_file() selects the correct function which - * works also on non-NT servers. - */ - rc = cifs_open_file(xid, &oparms, &oplock, NULL); - /* - * Opening path for writing on non-NT servers is not - * possible when the read-only attribute is already set. - * Non-NT server in this case returns -EACCES. For those - * servers the only possible way how to clear the read-only - * bit is via SMB_COM_SETATTR command. - */ - if (rc == -EACCES && - (cinode->cifsAttrs & ATTR_READONLY) && - le32_to_cpu(buf->Attributes) != 0 && /* 0 = do not change attrs */ - !(le32_to_cpu(buf->Attributes) & ATTR_READONLY) && - !(tcon->ses->capabilities & CAP_NT_SMBS)) - rc = -EOPNOTSUPP; - } - - /* Fallback to SMB_COM_SETATTR command when absolutelty needed. */ - if (rc == -EOPNOTSUPP) { - cifs_dbg(FYI, "calling SetInformation since SetPathInfo for attrs/times not supported by this server\n"); - rc = SMBSetInformation(xid, tcon, full_path, - buf->Attributes != 0 ? buf->Attributes : cpu_to_le32(cinode->cifsAttrs), - write_time, - cifs_sb->local_nls, cifs_sb); - if (rc == 0) - cinode->cifsAttrs = le32_to_cpu(buf->Attributes); - else - rc = -EACCES; - goto out; - } - + cifs_dbg(FYI, "calling SetFileInfo since SetPathInfo for times not supported by this server\n"); + rc = CIFS_open(xid, &oparms, &oplock, NULL); if (rc != 0) { if (rc == -EIO) rc = -EINVAL; @@ -1040,7 +875,6 @@ smb_set_file_info(struct inode *inode, const char *full_path, } netpid = current->tgid; - cifs_dbg(FYI, "calling SetFileInfo since SetPathInfo for attrs/times not supported by this server\n"); set_via_filehandle: rc = CIFSSMBSetFileInfo(xid, tcon, buf, fid.netfid, netpid); @@ -1051,21 +885,6 @@ smb_set_file_info(struct inode *inode, const char *full_path, CIFSSMBClose(xid, tcon, fid.netfid); else cifsFileInfo_put(open_file); - - /* - * Setting the read-only bit is not honered on non-NT servers when done - * via open-semantics. So for setting it, use SMB_COM_SETATTR command. - * This command works only after the file is closed, so use it only when - * operation was called without the filehandle. - */ - if (open_file == NULL && - !(tcon->ses->capabilities & CAP_NT_SMBS) && - le32_to_cpu(buf->Attributes) & ATTR_READONLY) { - SMBSetInformation(xid, tcon, full_path, - buf->Attributes, - 0 /* do not change write time */, - cifs_sb->local_nls, cifs_sb); - } out: if (tlink != NULL) cifs_put_tlink(tlink); diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 2385e570e3311a1972d16ef0d40218d94615a256..4e3eacbec96d147dfeadfdf43d2ed7ec5e8a3d01 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -4271,7 +4271,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst, u8 key[SMB3_ENC_DEC_KEY_SIZE]; struct aead_request *req; u8 *iv; - DECLARE_CRYPTO_WAIT(wait); unsigned int crypt_len = le32_to_cpu(tr_hdr->OriginalMessageSize); void *creq; size_t sensitive_size; @@ -4322,11 +4321,7 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst, aead_request_set_crypt(req, sg, sg, crypt_len, iv); aead_request_set_ad(req, assoc_data_len); - aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, - crypto_req_done, &wait); - - rc = crypto_wait_req(enc ? crypto_aead_encrypt(req) - : crypto_aead_decrypt(req), &wait); + rc = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req); if (!rc && enc) memcpy(&tr_hdr->Signature, sign, SMB2_SIGNATURE_SIZE); diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 357abb0170c4951c2ea133097d7012cd965f366e..3e88e8b3c16ec2011843f93e303620675a687a81 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -425,23 +425,14 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon, if (!rc && (server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL) && server->ops->query_server_interfaces) { + mutex_unlock(&ses->session_mutex); + /* - * query server network interfaces, in case they change. - * Also mark the session as pending this update while the query - * is in progress. This will be used to avoid calling - * smb2_reconnect recursively. + * query server network interfaces, in case they change */ - ses->flags |= CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES; xid = get_xid(); rc = server->ops->query_server_interfaces(xid, tcon, false); free_xid(xid); - ses->flags &= ~CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES; - - if (!tcon->ipc && !tcon->dummy) - queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, - (SMB_INTERFACE_POLL_INTERVAL * HZ)); - - mutex_unlock(&ses->session_mutex); if (rc == -EOPNOTSUPP && ses->chan_count > 1) { /* @@ -461,8 +452,11 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon, if (ses->chan_max > ses->chan_count && ses->iface_count && !SERVER_IS_CHAN(server)) { - if (ses->chan_count == 1) + if (ses->chan_count == 1) { cifs_server_dbg(VFS, "supports multichannel now\n"); + queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, + (SMB_INTERFACE_POLL_INTERVAL * HZ)); + } cifs_try_adding_channels(ses); } @@ -580,18 +574,11 @@ static int smb2_ioctl_req_init(u32 opcode, struct cifs_tcon *tcon, struct TCP_Server_Info *server, void **request_buf, unsigned int *total_len) { - /* - * Skip reconnect in one of the following cases: - * 1. For FSCTL_VALIDATE_NEGOTIATE_INFO IOCTLs - * 2. For FSCTL_QUERY_NETWORK_INTERFACE_INFO IOCTL when called from - * smb2_reconnect (indicated by CIFS_SES_FLAG_SCALE_CHANNELS ses flag) - */ - if (opcode == FSCTL_VALIDATE_NEGOTIATE_INFO || - (opcode == FSCTL_QUERY_NETWORK_INTERFACE_INFO && - (tcon->ses->flags & CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES))) + /* Skip reconnect only for FSCTL_VALIDATE_NEGOTIATE_INFO IOCTLs */ + if (opcode == FSCTL_VALIDATE_NEGOTIATE_INFO) { return __smb2_plain_req_init(SMB2_IOCTL, tcon, server, request_buf, total_len); - + } return smb2_plain_req_init(SMB2_IOCTL, tcon, server, request_buf, total_len); } @@ -4228,8 +4215,10 @@ void smb2_reconnect_server(struct work_struct *work) } goto done; } + tcon->status = TID_GOOD; - tcon->dummy = true; + tcon->retry = false; + tcon->need_reconnect = false; /* now reconnect sessions for necessary channels */ list_for_each_entry_safe(ses, ses2, &tmp_ses_list, rlist) { diff --git a/fs/smb/client/trace.h b/fs/smb/client/trace.h index 4dfdc521c5c985603bdf3269c5e60f558607644e..563cb4d8edf0c38ca1eb4ad33d0cec1670376384 100644 --- a/fs/smb/client/trace.h +++ b/fs/smb/client/trace.h @@ -114,7 +114,7 @@ DECLARE_EVENT_CLASS(smb3_rw_err_class, __entry->len = len; __entry->rc = rc; ), - TP_printk("xid=%u sid=0x%llx tid=0x%x fid=0x%llx offset=0x%llx len=0x%x rc=%d", + TP_printk("\txid=%u sid=0x%llx tid=0x%x fid=0x%llx offset=0x%llx len=0x%x rc=%d", __entry->xid, __entry->sesid, __entry->tid, __entry->fid, __entry->offset, __entry->len, __entry->rc) ) @@ -247,7 +247,7 @@ DECLARE_EVENT_CLASS(smb3_fd_class, __entry->tid = tid; __entry->sesid = sesid; ), - TP_printk("xid=%u sid=0x%llx tid=0x%x fid=0x%llx", + TP_printk("\txid=%u sid=0x%llx tid=0x%x fid=0x%llx", __entry->xid, __entry->sesid, __entry->tid, __entry->fid) ) @@ -286,7 +286,7 @@ DECLARE_EVENT_CLASS(smb3_fd_err_class, __entry->sesid = sesid; __entry->rc = rc; ), - TP_printk("xid=%u sid=0x%llx tid=0x%x fid=0x%llx rc=%d", + TP_printk("\txid=%u sid=0x%llx tid=0x%x fid=0x%llx rc=%d", __entry->xid, __entry->sesid, __entry->tid, __entry->fid, __entry->rc) ) @@ -558,7 +558,7 @@ DECLARE_EVENT_CLASS(smb3_cmd_err_class, __entry->status = status; __entry->rc = rc; ), - TP_printk("sid=0x%llx tid=0x%x cmd=%u mid=%llu status=0x%x rc=%d", + TP_printk("\tsid=0x%llx tid=0x%x cmd=%u mid=%llu status=0x%x rc=%d", __entry->sesid, __entry->tid, __entry->cmd, __entry->mid, __entry->status, __entry->rc) ) @@ -593,7 +593,7 @@ DECLARE_EVENT_CLASS(smb3_cmd_done_class, __entry->cmd = cmd; __entry->mid = mid; ), - TP_printk("sid=0x%llx tid=0x%x cmd=%u mid=%llu", + TP_printk("\tsid=0x%llx tid=0x%x cmd=%u mid=%llu", __entry->sesid, __entry->tid, __entry->cmd, __entry->mid) ) @@ -631,7 +631,7 @@ DECLARE_EVENT_CLASS(smb3_mid_class, __entry->when_sent = when_sent; __entry->when_received = when_received; ), - TP_printk("cmd=%u mid=%llu pid=%u, when_sent=%lu when_rcv=%lu", + TP_printk("\tcmd=%u mid=%llu pid=%u, when_sent=%lu when_rcv=%lu", __entry->cmd, __entry->mid, __entry->pid, __entry->when_sent, __entry->when_received) ) @@ -662,7 +662,7 @@ DECLARE_EVENT_CLASS(smb3_exit_err_class, __assign_str(func_name, func_name); __entry->rc = rc; ), - TP_printk("%s: xid=%u rc=%d", + TP_printk("\t%s: xid=%u rc=%d", __get_str(func_name), __entry->xid, __entry->rc) ) @@ -688,7 +688,7 @@ DECLARE_EVENT_CLASS(smb3_sync_err_class, __entry->ino = ino; __entry->rc = rc; ), - TP_printk("ino=%lu rc=%d", + TP_printk("\tino=%lu rc=%d", __entry->ino, __entry->rc) ) @@ -714,7 +714,7 @@ DECLARE_EVENT_CLASS(smb3_enter_exit_class, __entry->xid = xid; __assign_str(func_name, func_name); ), - TP_printk("%s: xid=%u", + TP_printk("\t%s: xid=%u", __get_str(func_name), __entry->xid) ) diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index 7b2560612bd6aa4b0341936579d378f3e125b216..2269963e500819f2e10eb2708448839ca777ff1b 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -1025,16 +1025,14 @@ struct TCP_Server_Info *cifs_pick_channel(struct cifs_ses *ses) uint index = 0; unsigned int min_in_flight = UINT_MAX, max_in_flight = 0; struct TCP_Server_Info *server = NULL; - int i, start, cur; + int i; if (!ses) return NULL; spin_lock(&ses->chan_lock); - start = atomic_inc_return(&ses->chan_seq); for (i = 0; i < ses->chan_count; i++) { - cur = (start + i) % ses->chan_count; - server = ses->chans[cur].server; + server = ses->chans[i].server; if (!server || server->terminate) continue; @@ -1051,15 +1049,17 @@ struct TCP_Server_Info *cifs_pick_channel(struct cifs_ses *ses) */ if (server->in_flight < min_in_flight) { min_in_flight = server->in_flight; - index = cur; + index = i; } if (server->in_flight > max_in_flight) max_in_flight = server->in_flight; } /* if all channels are equally loaded, fall back to round-robin */ - if (min_in_flight == max_in_flight) - index = (uint)start % ses->chan_count; + if (min_in_flight == max_in_flight) { + index = (uint)atomic_inc_return(&ses->chan_seq); + index %= ses->chan_count; + } server = ses->chans[index].server; spin_unlock(&ses->chan_lock); diff --git a/fs/smb/server/connection.c b/fs/smb/server/connection.c index 66b20c3d963eb27f2fcd7ba1dde8ccef49a49a3d..e7bcc383003103cfeabf0dbd979931384dba40b5 100644 --- a/fs/smb/server/connection.c +++ b/fs/smb/server/connection.c @@ -39,10 +39,8 @@ void ksmbd_conn_free(struct ksmbd_conn *conn) xa_destroy(&conn->sessions); kvfree(conn->request_buf); kfree(conn->preauth_info); - if (atomic_dec_and_test(&conn->refcnt)) { - conn->transport->ops->free_transport(conn->transport); + if (atomic_dec_and_test(&conn->refcnt)) kfree(conn); - } } /** diff --git a/fs/smb/server/connection.h b/fs/smb/server/connection.h index 47e6a8694c0fc1fea45aa9a18fbdb8f40875cb76..4fdd76ce53b90c8148410c8c97a99b0deda58b7b 100644 --- a/fs/smb/server/connection.h +++ b/fs/smb/server/connection.h @@ -107,7 +107,6 @@ struct ksmbd_conn { __le16 signing_algorithm; bool binding; atomic_t refcnt; - bool is_aapl; }; struct ksmbd_conn_ops { @@ -132,7 +131,6 @@ struct ksmbd_transport_ops { void *buf, unsigned int len, struct smb2_buffer_desc_v1 *desc, unsigned int desc_len); - void (*free_transport)(struct ksmbd_transport *kt); }; struct ksmbd_transport { diff --git a/fs/smb/server/oplock.c b/fs/smb/server/oplock.c index e564432643ea30d536db17948aabdea55bc7aa6f..72294764d4c20c12e289a4ac8086665e8d3f96b3 100644 --- a/fs/smb/server/oplock.c +++ b/fs/smb/server/oplock.c @@ -146,9 +146,12 @@ static struct oplock_info *opinfo_get_list(struct ksmbd_inode *ci) { struct oplock_info *opinfo; + if (list_empty(&ci->m_op_list)) + return NULL; + down_read(&ci->m_lock); - opinfo = list_first_entry_or_null(&ci->m_op_list, struct oplock_info, - op_entry); + opinfo = list_first_entry(&ci->m_op_list, struct oplock_info, + op_entry); if (opinfo) { if (opinfo->conn == NULL || !atomic_inc_not_zero(&opinfo->refcount)) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index e25c2ca56461acd86e2ca41b7507d122ffc1c2de..9bd817427a345a26db96bfc7b8b095953b1ec8a6 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -1345,7 +1345,8 @@ static int ntlm_negotiate(struct ksmbd_work *work, return rc; sz = le16_to_cpu(rsp->SecurityBufferOffset); - chgblob = (struct challenge_message *)rsp->Buffer; + chgblob = + (struct challenge_message *)((char *)&rsp->hdr.ProtocolId + sz); memset(chgblob, 0, sizeof(struct challenge_message)); if (!work->conn->use_spnego) { @@ -1378,7 +1379,8 @@ static int ntlm_negotiate(struct ksmbd_work *work, goto out; } - memcpy(rsp->Buffer, spnego_blob, spnego_blob_len); + sz = le16_to_cpu(rsp->SecurityBufferOffset); + memcpy((char *)&rsp->hdr.ProtocolId + sz, spnego_blob, spnego_blob_len); rsp->SecurityBufferLength = cpu_to_le16(spnego_blob_len); out: @@ -1460,7 +1462,8 @@ static int ntlm_authenticate(struct ksmbd_work *work, if (rc) return -ENOMEM; - memcpy(rsp->Buffer, spnego_blob, spnego_blob_len); + sz = le16_to_cpu(rsp->SecurityBufferOffset); + memcpy((char *)&rsp->hdr.ProtocolId + sz, spnego_blob, spnego_blob_len); rsp->SecurityBufferLength = cpu_to_le16(spnego_blob_len); kfree(spnego_blob); } @@ -1596,18 +1599,17 @@ static int krb5_authenticate(struct ksmbd_work *work, out_len = work->response_sz - (le16_to_cpu(rsp->SecurityBufferOffset) + 4); + /* Check previous session */ + prev_sess_id = le64_to_cpu(req->PreviousSessionId); + if (prev_sess_id && prev_sess_id != sess->id) + destroy_previous_session(conn, sess->user, prev_sess_id); + retval = ksmbd_krb5_authenticate(sess, in_blob, in_len, out_blob, &out_len); if (retval) { ksmbd_debug(SMB, "krb5 authentication failed\n"); return -EINVAL; } - - /* Check previous session */ - prev_sess_id = le64_to_cpu(req->PreviousSessionId); - if (prev_sess_id && prev_sess_id != sess->id) - destroy_previous_session(conn, sess->user, prev_sess_id); - rsp->SecurityBufferLength = cpu_to_le16(out_len); if ((conn->sign || server_conf.enforced_signing) || @@ -2859,7 +2861,7 @@ int smb2_open(struct ksmbd_work *work) int req_op_level = 0, open_flags = 0, may_flags = 0, file_info = 0; int rc = 0; int contxt_cnt = 0, query_disk_id = 0; - bool maximal_access_ctxt = false, posix_ctxt = false; + int maximal_access_ctxt = 0, posix_ctxt = 0; int s_type = 0; int next_off = 0; char *name = NULL; @@ -2886,27 +2888,6 @@ int smb2_open(struct ksmbd_work *work) return create_smb2_pipe(work); } - if (req->CreateContextsOffset && tcon->posix_extensions) { - context = smb2_find_context_vals(req, SMB2_CREATE_TAG_POSIX, 16); - if (IS_ERR(context)) { - rc = PTR_ERR(context); - goto err_out2; - } else if (context) { - struct create_posix *posix = (struct create_posix *)context; - - if (le16_to_cpu(context->DataOffset) + - le32_to_cpu(context->DataLength) < - sizeof(struct create_posix) - 4) { - rc = -EINVAL; - goto err_out2; - } - ksmbd_debug(SMB, "get posix context\n"); - - posix_mode = le32_to_cpu(posix->Mode); - posix_ctxt = true; - } - } - if (req->NameLength) { name = smb2_get_name((char *)req + le16_to_cpu(req->NameOffset), le16_to_cpu(req->NameLength), @@ -2929,11 +2910,9 @@ int smb2_open(struct ksmbd_work *work) goto err_out2; } - if (posix_ctxt == false) { - rc = ksmbd_validate_filename(name); - if (rc < 0) - goto err_out2; - } + rc = ksmbd_validate_filename(name); + if (rc < 0) + goto err_out2; if (ksmbd_share_veto_filename(share, name)) { rc = -ENOENT; @@ -3091,6 +3070,28 @@ int smb2_open(struct ksmbd_work *work) rc = -EBADF; goto err_out2; } + + if (tcon->posix_extensions) { + context = smb2_find_context_vals(req, + SMB2_CREATE_TAG_POSIX, 16); + if (IS_ERR(context)) { + rc = PTR_ERR(context); + goto err_out2; + } else if (context) { + struct create_posix *posix = + (struct create_posix *)context; + if (le16_to_cpu(context->DataOffset) + + le32_to_cpu(context->DataLength) < + sizeof(struct create_posix) - 4) { + rc = -EINVAL; + goto err_out2; + } + ksmbd_debug(SMB, "get posix context\n"); + + posix_mode = le32_to_cpu(posix->Mode); + posix_ctxt = 1; + } + } } if (ksmbd_override_fsids(work)) { @@ -3524,15 +3525,6 @@ int smb2_open(struct ksmbd_work *work) ksmbd_debug(SMB, "get query on disk id context\n"); query_disk_id = 1; } - - if (conn->is_aapl == false) { - context = smb2_find_context_vals(req, SMB2_CREATE_AAPL, 4); - if (IS_ERR(context)) { - rc = PTR_ERR(context); - goto err_out1; - } else if (context) - conn->is_aapl = true; - } } rc = ksmbd_vfs_getattr(&path, &stat); @@ -3971,10 +3963,7 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level, if (dinfo->EaSize) dinfo->ExtFileAttributes = FILE_ATTRIBUTE_REPARSE_POINT_LE; dinfo->Reserved = 0; - if (conn->is_aapl) - dinfo->UniqueId = 0; - else - dinfo->UniqueId = cpu_to_le64(ksmbd_kstat->kstat->ino); + dinfo->UniqueId = cpu_to_le64(ksmbd_kstat->kstat->ino); if (d_info->hide_dot_file && d_info->name[0] == '.') dinfo->ExtFileAttributes |= FILE_ATTRIBUTE_HIDDEN_LE; memcpy(dinfo->FileName, conv_name, conv_len); @@ -3991,10 +3980,7 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level, smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode); if (fibdinfo->EaSize) fibdinfo->ExtFileAttributes = FILE_ATTRIBUTE_REPARSE_POINT_LE; - if (conn->is_aapl) - fibdinfo->UniqueId = 0; - else - fibdinfo->UniqueId = cpu_to_le64(ksmbd_kstat->kstat->ino); + fibdinfo->UniqueId = cpu_to_le64(ksmbd_kstat->kstat->ino); fibdinfo->ShortNameLength = 0; fibdinfo->Reserved = 0; fibdinfo->Reserved2 = cpu_to_le16(0); @@ -8503,6 +8489,11 @@ static void smb20_oplock_break_ack(struct ksmbd_work *work) goto err_out; } + opinfo->op_state = OPLOCK_STATE_NONE; + wake_up_interruptible_all(&opinfo->oplock_q); + opinfo_put(opinfo); + ksmbd_fd_put(work, fp); + rsp->StructureSize = cpu_to_le16(24); rsp->OplockLevel = rsp_oplevel; rsp->Reserved = 0; @@ -8510,15 +8501,16 @@ static void smb20_oplock_break_ack(struct ksmbd_work *work) rsp->VolatileFid = volatile_id; rsp->PersistentFid = persistent_id; ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_oplock_break)); - if (ret) { -err_out: - smb2_set_err_rsp(work); - } + if (!ret) + return; +err_out: opinfo->op_state = OPLOCK_STATE_NONE; wake_up_interruptible_all(&opinfo->oplock_q); + opinfo_put(opinfo); ksmbd_fd_put(work, fp); + smb2_set_err_rsp(work); } static int check_lease_state(struct lease *lease, __le32 req_state) @@ -8648,6 +8640,11 @@ static void smb21_lease_break_ack(struct ksmbd_work *work) } lease_state = lease->state; + opinfo->op_state = OPLOCK_STATE_NONE; + wake_up_interruptible_all(&opinfo->oplock_q); + atomic_dec(&opinfo->breaking_cnt); + wake_up_interruptible_all(&opinfo->oplock_brk); + opinfo_put(opinfo); rsp->StructureSize = cpu_to_le16(36); rsp->Reserved = 0; @@ -8656,16 +8653,16 @@ static void smb21_lease_break_ack(struct ksmbd_work *work) rsp->LeaseState = lease_state; rsp->LeaseDuration = 0; ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lease_ack)); - if (ret) { -err_out: - smb2_set_err_rsp(work); - } + if (!ret) + return; - opinfo->op_state = OPLOCK_STATE_NONE; +err_out: wake_up_interruptible_all(&opinfo->oplock_q); atomic_dec(&opinfo->breaking_cnt); wake_up_interruptible_all(&opinfo->oplock_brk); + opinfo_put(opinfo); + smb2_set_err_rsp(work); } /** diff --git a/fs/smb/server/smb2pdu.h b/fs/smb/server/smb2pdu.h index 2821e6c8298f4d321e14073ebf8d7817ea21a669..25cc81aac350f2dfbb0260df4e322cdb5d2aea61 100644 --- a/fs/smb/server/smb2pdu.h +++ b/fs/smb/server/smb2pdu.h @@ -63,9 +63,6 @@ struct preauth_integrity_info { #define SMB2_SESSION_TIMEOUT (10 * HZ) -/* Apple Defined Contexts */ -#define SMB2_CREATE_AAPL "AAPL" - struct create_durable_req_v2 { struct create_context_hdr ccontext; __u8 Name[8]; diff --git a/fs/smb/server/transport_rdma.c b/fs/smb/server/transport_rdma.c index eaef459776151b0445138fd737a5f7368c4e6369..8faa25c6e129b5ef7f38721ef398b942e56b0bc2 100644 --- a/fs/smb/server/transport_rdma.c +++ b/fs/smb/server/transport_rdma.c @@ -158,8 +158,7 @@ struct smb_direct_transport { }; #define KSMBD_TRANS(t) ((struct ksmbd_transport *)&((t)->transport)) -#define SMBD_TRANS(t) ((struct smb_direct_transport *)container_of(t, \ - struct smb_direct_transport, transport)) + enum { SMB_DIRECT_MSG_NEGOTIATE_REQ = 0, SMB_DIRECT_MSG_DATA_TRANSFER @@ -410,11 +409,6 @@ static struct smb_direct_transport *alloc_transport(struct rdma_cm_id *cm_id) return NULL; } -static void smb_direct_free_transport(struct ksmbd_transport *kt) -{ - kfree(SMBD_TRANS(kt)); -} - static void free_transport(struct smb_direct_transport *t) { struct smb_direct_recvmsg *recvmsg; @@ -432,8 +426,7 @@ static void free_transport(struct smb_direct_transport *t) if (t->qp) { ib_drain_qp(t->qp); ib_mr_pool_destroy(t->qp, &t->qp->rdma_mrs); - t->qp = NULL; - rdma_destroy_qp(t->cm_id); + ib_destroy_qp(t->qp); } ksmbd_debug(RDMA, "drain the reassembly queue\n"); @@ -461,6 +454,7 @@ static void free_transport(struct smb_direct_transport *t) smb_direct_destroy_pools(t); ksmbd_conn_free(KSMBD_TRANS(t)->conn); + kfree(t); } static struct smb_direct_sendmsg @@ -1940,8 +1934,8 @@ static int smb_direct_create_qpair(struct smb_direct_transport *t, return 0; err: if (t->qp) { + ib_destroy_qp(t->qp); t->qp = NULL; - rdma_destroy_qp(t->cm_id); } if (t->recv_cq) { ib_destroy_cq(t->recv_cq); @@ -2306,5 +2300,4 @@ static struct ksmbd_transport_ops ksmbd_smb_direct_transport_ops = { .read = smb_direct_read, .rdma_read = smb_direct_rdma_read, .rdma_write = smb_direct_rdma_write, - .free_transport = smb_direct_free_transport, }; diff --git a/fs/smb/server/transport_tcp.c b/fs/smb/server/transport_tcp.c index 64941a49438f370ead555e977dbff1d6ab4ee809..2ce7f75059cb35c42ae9e0843bdaee001207078e 100644 --- a/fs/smb/server/transport_tcp.c +++ b/fs/smb/server/transport_tcp.c @@ -93,19 +93,15 @@ static struct tcp_transport *alloc_transport(struct socket *client_sk) return t; } -static void ksmbd_tcp_free_transport(struct ksmbd_transport *kt) -{ - struct tcp_transport *t = TCP_TRANS(kt); - - sock_release(t->sock); - kfree(t->iov); - kfree(t); -} - static void free_transport(struct tcp_transport *t) { kernel_sock_shutdown(t->sock, SHUT_RDWR); + sock_release(t->sock); + t->sock = NULL; + ksmbd_conn_free(KSMBD_TRANS(t)->conn); + kfree(t->iov); + kfree(t); } /** @@ -659,5 +655,4 @@ static struct ksmbd_transport_ops ksmbd_tcp_transport_ops = { .read = ksmbd_tcp_read, .writev = ksmbd_tcp_writev, .disconnect = ksmbd_tcp_disconnect, - .free_transport = ksmbd_tcp_free_transport, }; diff --git a/fs/smb/server/transport_tcp.h b/fs/smb/server/transport_tcp.h index 5925ec5df47552a8cf6d55718ca42f74d36c460c..e338bebe322f10269b4bacc00b2d488fd04ee4e0 100644 --- a/fs/smb/server/transport_tcp.h +++ b/fs/smb/server/transport_tcp.h @@ -7,7 +7,6 @@ #define __KSMBD_TRANSPORT_TCP_H__ int ksmbd_tcp_set_interfaces(char *ifc_list, int ifc_list_sz); -void ksmbd_free_transport(struct ksmbd_transport *kt); int ksmbd_tcp_init(void); void ksmbd_tcp_destroy(void); diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c index de813700f3d4f6349f8c1dfc3a454a9ef7060375..f6616d687365a3687c6efb38e765afc7bdc8b016 100644 --- a/fs/smb/server/vfs.c +++ b/fs/smb/server/vfs.c @@ -426,15 +426,10 @@ static int ksmbd_vfs_stream_write(struct ksmbd_file *fp, char *buf, loff_t *pos, ksmbd_debug(VFS, "write stream data pos : %llu, count : %zd\n", *pos, count); - if (*pos >= XATTR_SIZE_MAX) { - pr_err("stream write position %lld is out of bounds\n", *pos); - return -EINVAL; - } - size = *pos + count; if (size > XATTR_SIZE_MAX) { size = XATTR_SIZE_MAX; - count = XATTR_SIZE_MAX - *pos; + count = (*pos + count) - XATTR_SIZE_MAX; } v_len = ksmbd_vfs_getcasexattr(idmap, @@ -448,6 +443,13 @@ static int ksmbd_vfs_stream_write(struct ksmbd_file *fp, char *buf, loff_t *pos, goto out; } + if (v_len <= *pos) { + pr_err("stream write position %lld is out of bounds (stream length: %zd)\n", + *pos, v_len); + err = -EINVAL; + goto out; + } + if (v_len < size) { wbuf = kvzalloc(size, GFP_KERNEL); if (!wbuf) { @@ -1293,7 +1295,6 @@ int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name, err = ksmbd_vfs_lock_parent(parent_path->dentry, path->dentry); if (err) { - mnt_drop_write(parent_path->mnt); path_put(path); path_put(parent_path); } diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 3a27d4268b3c4ad6af53878a94d059f02adf3868..22e812808e5cf91802e2c95495207b6dd2348c10 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c @@ -202,11 +202,6 @@ static int squashfs_fill_super(struct super_block *sb, struct fs_context *fc) msblk->panic_on_errors = (opts->errors == Opt_errors_panic); msblk->devblksize = sb_min_blocksize(sb, SQUASHFS_DEVBLK_SIZE); - if (!msblk->devblksize) { - errorf(fc, "squashfs: unable to set blocksize\n"); - return -EINVAL; - } - msblk->devblksize_log2 = ffz(~msblk->devblksize); mutex_init(&msblk->meta_index_mutex); diff --git a/fs/xattr.c b/fs/xattr.c index 7574d24b982ef6c92bbbabe8a02084216236d309..5fed22c22a2be81c2848fbd70da05984c1688333 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -1342,7 +1342,6 @@ ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs, buffer += err; } remaining_size -= err; - err = 0; read_lock(&xattrs->lock); for (rbp = rb_first(&xattrs->rb_root); rbp; rbp = rb_next(rbp)) { diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index 0a242008524151622c7bb6d6fe6fdb3a49280867..85c2dcf2b70484eaca1dd10224d324846f3b38db 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h @@ -527,7 +527,7 @@ typedef u64 acpi_integer; /* Support for the special RSDP signature (8 characters) */ -#define ACPI_VALIDATE_RSDP_SIG(a) (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, (sizeof(a) < 8) ? ACPI_NAMESEG_SIZE : 8)) +#define ACPI_VALIDATE_RSDP_SIG(a) (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8)) #define ACPI_MAKE_RSDP_SIG(dest) (memcpy (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8)) /* Support for OEMx signature (x can be any character) */ diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h index f3e7e3e5078dbcd3e4f67915fcac5b66fae181fa..9a022caacf9361a322f84ea6e838541556bfc804 100644 --- a/include/drm/drm_atomic.h +++ b/include/drm/drm_atomic.h @@ -372,27 +372,8 @@ struct drm_atomic_state { * * Allow full modeset. This is used by the ATOMIC IOCTL handler to * implement the DRM_MODE_ATOMIC_ALLOW_MODESET flag. Drivers should - * generally not consult this flag, but instead look at the output of - * drm_atomic_crtc_needs_modeset(). The detailed rules are: - * - * - Drivers must not consult @allow_modeset in the atomic commit path. - * Use drm_atomic_crtc_needs_modeset() instead. - * - * - Drivers must consult @allow_modeset before adding unrelated struct - * drm_crtc_state to this commit by calling - * drm_atomic_get_crtc_state(). See also the warning in the - * documentation for that function. - * - * - Drivers must never change this flag, it is under the exclusive - * control of userspace. - * - * - Drivers may consult @allow_modeset in the atomic check path, if - * they have the choice between an optimal hardware configuration - * which requires a modeset, and a less optimal configuration which - * can be committed without a modeset. An example would be suboptimal - * scanout FIFO allocation resulting in increased idle power - * consumption. This allows userspace to avoid flickering and delays - * for the normal composition loop at reasonable cost. + * never consult this flag, instead looking at the output of + * drm_atomic_crtc_needs_modeset(). */ bool allow_modeset : 1; /** diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h index 0cb5edd9c46711eab9b326e676ccb4c5e11c1401..cc61f6a2b2ad6ea23da304d187cbe9ec332208bc 100644 --- a/include/drm/drm_file.h +++ b/include/drm/drm_file.h @@ -302,9 +302,6 @@ struct drm_file { * * Mapping of mm object handles to object pointers. Used by the GEM * subsystem. Protected by @table_lock. - * - * Note that allocated entries might be NULL as a transient state when - * creating or deleting a handle. */ struct idr object_idr; diff --git a/include/drm/drm_framebuffer.h b/include/drm/drm_framebuffer.h index 990259873e1e30952a23952e91413df2c569d81e..0dcc07b68654844ba80c4c812451b52921fa1978 100644 --- a/include/drm/drm_framebuffer.h +++ b/include/drm/drm_framebuffer.h @@ -23,7 +23,6 @@ #ifndef __DRM_FRAMEBUFFER_H__ #define __DRM_FRAMEBUFFER_H__ -#include #include #include #include @@ -101,8 +100,6 @@ struct drm_framebuffer_funcs { unsigned num_clips); }; -#define DRM_FRAMEBUFFER_HAS_HANDLE_REF(_i) BIT(0u + (_i)) - /** * struct drm_framebuffer - frame buffer object * @@ -191,10 +188,6 @@ struct drm_framebuffer { * DRM_MODE_FB_MODIFIERS. */ int flags; - /** - * @internal_flags: Framebuffer flags like DRM_FRAMEBUFFER_HAS_HANDLE_REF. - */ - unsigned int internal_flags; /** * @hot_x: X coordinate of the cursor hotspot. Used by the legacy cursor * IOCTL when the driver supports cursor through a DRM_PLANE_TYPE_CURSOR diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index a578068169f19a1adbd146e0187246799ca0b96f..fbfccb96dd17b170c55caa6c86a07ff2e26f105e 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -567,7 +567,8 @@ static inline bool drm_gem_object_is_shared_for_memory_stats(struct drm_gem_obje */ static inline bool drm_gem_is_imported(const struct drm_gem_object *obj) { - return !!obj->import_attach; + /* The dma-buf's priv field points to the original GEM object. */ + return obj->dma_buf && (obj->dma_buf->priv != obj); } #ifdef CONFIG_LOCKDEP diff --git a/include/drm/spsc_queue.h b/include/drm/spsc_queue.h index ee9df8cc67b730db81d5a25174d9a5430cf976a7..125f096c88cb96a6da1567d25a238a9cf1640f41 100644 --- a/include/drm/spsc_queue.h +++ b/include/drm/spsc_queue.h @@ -70,11 +70,9 @@ static inline bool spsc_queue_push(struct spsc_queue *queue, struct spsc_node *n preempt_disable(); - atomic_inc(&queue->job_count); - smp_mb__after_atomic(); - tail = (struct spsc_node **)atomic_long_xchg(&queue->tail, (long)&node->next); WRITE_ONCE(*tail, node); + atomic_inc(&queue->job_count); /* * In case of first element verify new node will be visible to the consumer diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 7c6f4006389daa91422ba1bfda314177d44244bb..1b76d2f83eac6a05058fabec7b913e3fdb644980 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -1098,13 +1098,13 @@ void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state, acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state, u32 val_a, u32 val_b); +#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86) struct acpi_s2idle_dev_ops { struct list_head list_node; void (*prepare)(void); void (*check)(void); void (*restore)(void); }; -#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86) int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg); void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg); int acpi_get_lps0_constraint(struct acpi_device *adev); @@ -1113,13 +1113,6 @@ static inline int acpi_get_lps0_constraint(struct device *dev) { return ACPI_STATE_UNKNOWN; } -static inline int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg) -{ - return -ENODEV; -} -static inline void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg) -{ -} #endif /* CONFIG_SUSPEND && CONFIG_X86 */ #ifndef CONFIG_IA64 void arch_reserve_mem_area(acpi_physical_address addr, size_t size); diff --git a/include/linux/arm_sdei.h b/include/linux/arm_sdei.h index f652a5028b5907ba914550d92009592c3a8f7838..255701e1251b4ac242456693f998e3940a36851c 100644 --- a/include/linux/arm_sdei.h +++ b/include/linux/arm_sdei.h @@ -46,12 +46,12 @@ int sdei_unregister_ghes(struct ghes *ghes); /* For use by arch code when CPU hotplug notifiers are not appropriate. */ int sdei_mask_local_cpu(void); int sdei_unmask_local_cpu(void); -void __init acpi_sdei_init(void); +void __init sdei_init(void); void sdei_handler_abort(void); #else static inline int sdei_mask_local_cpu(void) { return 0; } static inline int sdei_unmask_local_cpu(void) { return 0; } -static inline void acpi_sdei_init(void) { } +static inline void sdei_init(void) { } static inline void sdei_handler_abort(void) { } #endif /* CONFIG_ARM_SDE_INTERFACE */ diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h index 45f2f278b50a8a9f17b8c202308cc28321f2c6ed..9b02961d65ee6666bea094095d5efe9e35ba735f 100644 --- a/include/linux/atmdev.h +++ b/include/linux/atmdev.h @@ -249,12 +249,6 @@ static inline void atm_account_tx(struct atm_vcc *vcc, struct sk_buff *skb) ATM_SKB(skb)->atm_options = vcc->atm_options; } -static inline void atm_return_tx(struct atm_vcc *vcc, struct sk_buff *skb) -{ - WARN_ON_ONCE(refcount_sub_and_test(ATM_SKB(skb)->acct_truesize, - &sk_atm(vcc)->sk_wmem_alloc)); -} - static inline void atm_force_charge(struct atm_vcc *vcc,int truesize) { atomic_add(truesize, &sk_atm(vcc)->sk_rmem_alloc); diff --git a/include/linux/bio.h b/include/linux/bio.h index f193aef4fac08d3522bfd8538f12542c4b3dcf1f..b893418c3cc022355caf2581c767ec51d1c9de83 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -294,7 +294,7 @@ static inline void bio_first_folio(struct folio_iter *fi, struct bio *bio, fi->folio = page_folio(bvec->bv_page); fi->offset = bvec->bv_offset + - PAGE_SIZE * folio_page_idx(fi->folio, bvec->bv_page); + PAGE_SIZE * (bvec->bv_page - &fi->folio->page); fi->_seg_count = bvec->bv_len; fi->length = min(folio_size(fi->folio) - fi->offset, fi->_seg_count); fi->_next = folio_next(fi->folio); diff --git a/include/linux/bvec.h b/include/linux/bvec.h index 99ab7b2bba27cd765d34133dd6e1b8092ba5ecfb..bd1e361b351c5afa88ff02e7023cd79acd5454fd 100644 --- a/include/linux/bvec.h +++ b/include/linux/bvec.h @@ -57,12 +57,9 @@ static inline void bvec_set_page(struct bio_vec *bv, struct page *page, * @offset: offset into the folio */ static inline void bvec_set_folio(struct bio_vec *bv, struct folio *folio, - size_t len, size_t offset) + unsigned int len, unsigned int offset) { - unsigned long nr = offset / PAGE_SIZE; - - WARN_ON_ONCE(len > UINT_MAX); - bvec_set_page(bv, folio_page(folio, nr), len, offset % PAGE_SIZE); + bvec_set_page(bv, &folio->page, len, offset); } /** diff --git a/include/linux/console.h b/include/linux/console.h index 38571607065d765ba405ae1519b52fa68a539853..7de11c763eb35deed528272727bf2f2bf4d18701 100644 --- a/include/linux/console.h +++ b/include/linux/console.h @@ -36,14 +36,9 @@ enum vc_intensity; /** * struct consw - callbacks for consoles * - * @con_init: initialize the console on @vc. @init is true for the very first - * call on this @vc. - * @con_clear: erase @count characters at [@x, @y] on @vc. @count >= 1. * @con_scroll: move lines from @top to @bottom in direction @dir by @lines. * Return true if no generic handling should be done. * Invoked by csi_M and printing to the console. - * @con_switch: notifier about the console switch; it is supposed to return - * true if a redraw is needed. * @con_set_palette: sets the palette of the console to @table (optional) * @con_scrolldelta: the contents of the console should be scrolled by @lines. * Invoked by user. (optional) @@ -51,10 +46,10 @@ enum vc_intensity; struct consw { struct module *owner; const char *(*con_startup)(void); - void (*con_init)(struct vc_data *vc, bool init); + void (*con_init)(struct vc_data *vc, int init); void (*con_deinit)(struct vc_data *vc); - void (*con_clear)(struct vc_data *vc, unsigned int y, - unsigned int x, unsigned int count); + void (*con_clear)(struct vc_data *vc, int sy, int sx, int height, + int width); void (*con_putc)(struct vc_data *vc, int c, int ypos, int xpos); void (*con_putcs)(struct vc_data *vc, const unsigned short *s, int count, int ypos, int xpos); @@ -62,7 +57,7 @@ struct consw { bool (*con_scroll)(struct vc_data *vc, unsigned int top, unsigned int bottom, enum con_scroll dir, unsigned int lines); - bool (*con_switch)(struct vc_data *vc); + int (*con_switch)(struct vc_data *vc); int (*con_blank)(struct vc_data *vc, int blank, int mode_switch); int (*con_font_set)(struct vc_data *vc, struct console_font *font, unsigned int vpitch, unsigned int flags); diff --git a/include/linux/coredump.h b/include/linux/coredump.h index c1b4c8c70caebde27f63e8c653131b67b6044dde..d3eba4360150875d3a8f4890b25e985486f9eaf8 100644 --- a/include/linux/coredump.h +++ b/include/linux/coredump.h @@ -28,7 +28,6 @@ struct coredump_params { int vma_count; size_t vma_data_size; struct core_vma_metadata *vma_meta; - struct pid *pid; }; /* diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 6b4f9f16968821702555ad6ab0d7f5e13ea5fd35..20db7fc0651f3ca1ff3b5e89b98efbe47947ff18 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h @@ -79,7 +79,6 @@ extern ssize_t cpu_show_reg_file_data_sampling(struct device *dev, struct device_attribute *attr, char *buf); extern ssize_t cpu_show_indirect_target_selection(struct device *dev, struct device_attribute *attr, char *buf); -extern ssize_t cpu_show_tsa(struct device *dev, struct device_attribute *attr, char *buf); extern __printf(4, 5) struct device *cpu_device_create(struct device *parent, void *drvdata, diff --git a/include/linux/export.h b/include/linux/export.h index 06f7a4eb6492860ecaaf4ffaa225382420e5275f..9911508a9604fb048c2587730520331ac621fd80 100644 --- a/include/linux/export.h +++ b/include/linux/export.h @@ -42,17 +42,11 @@ extern struct module __this_module; .long sym #endif -/* - * LLVM integrated assembler cam merge adjacent string literals (like - * C and GNU-as) passed to '.ascii', but not to '.asciz' and chokes on: - * - * .asciz "MODULE_" "kvm" ; - */ -#define ___EXPORT_SYMBOL(sym, license, ns...) \ +#define ___EXPORT_SYMBOL(sym, license, ns) \ .section ".export_symbol","a" ASM_NL \ __export_symbol_##sym: ASM_NL \ .asciz license ASM_NL \ - .ascii ns "\0" ASM_NL \ + .asciz ns ASM_NL \ __EXPORT_SYMBOL_REF(sym) ASM_NL \ .previous @@ -94,6 +88,4 @@ extern struct module __this_module; #define EXPORT_SYMBOL_NS(sym, ns) __EXPORT_SYMBOL(sym, "", __stringify(ns)) #define EXPORT_SYMBOL_NS_GPL(sym, ns) __EXPORT_SYMBOL(sym, "GPL", __stringify(ns)) -#define EXPORT_SYMBOL_GPL_FOR_MODULES(sym, mods) __EXPORT_SYMBOL(sym, "GPL", "module:" mods) - #endif /* _LINUX_EXPORT_H */ diff --git a/include/linux/fs.h b/include/linux/fs.h index b641a01512fb09b57bbc5846e17019afd5f005d5..81edfa1e66b6083eee2fac8188033e489c74dfb0 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3170,8 +3170,6 @@ extern int simple_write_begin(struct file *file, struct address_space *mapping, extern const struct address_space_operations ram_aops; extern int always_delete_dentry(const struct dentry *); extern struct inode *alloc_anon_inode(struct super_block *); -struct inode *anon_inode_make_secure_inode(struct super_block *sb, const char *name, - const struct inode *context_inode); extern int simple_nosetlease(struct file *, int, struct file_lock **, void **); extern const struct dentry_operations simple_dentry_operations; diff --git a/include/linux/hid.h b/include/linux/hid.h index 5d37e2349fae81cda26cb62609e0d933bc07d1d0..38e161a827bde9f032daf3c270bdd345c5eee668 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -736,9 +736,8 @@ struct hid_descriptor { __le16 bcdHID; __u8 bCountryCode; __u8 bNumDescriptors; - struct hid_class_descriptor rpt_desc; - struct hid_class_descriptor opt_descs[]; + struct hid_class_descriptor desc[1]; } __attribute__ ((packed)); #define HID_DEVICE(b, g, ven, prod) \ diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 05019f1e48e431de38ae897e7a35f129c7321fc4..ccef475c0d444a481dd321d91e05bc87700c5d1d 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -448,7 +448,7 @@ static inline void memcpy_from_folio(char *to, struct folio *folio, const char *from = kmap_local_folio(folio, offset); size_t chunk = len; - if (folio_test_partial_kmap(folio) && + if (folio_test_highmem(folio) && chunk > PAGE_SIZE - offset_in_page(offset)) chunk = PAGE_SIZE - offset_in_page(offset); memcpy(to, from, chunk); @@ -469,7 +469,7 @@ static inline void memcpy_to_folio(struct folio *folio, size_t offset, char *to = kmap_local_folio(folio, offset); size_t chunk = len; - if (folio_test_partial_kmap(folio) && + if (folio_test_highmem(folio) && chunk > PAGE_SIZE - offset_in_page(offset)) chunk = PAGE_SIZE - offset_in_page(offset); memcpy(to, from, chunk); @@ -501,7 +501,7 @@ static inline size_t memcpy_from_file_folio(char *to, struct folio *folio, size_t offset = offset_in_folio(folio, pos); char *from = kmap_local_folio(folio, offset); - if (folio_test_partial_kmap(folio)) { + if (folio_test_highmem(folio)) { offset = offset_in_page(offset); len = min_t(size_t, len, PAGE_SIZE - offset); } else diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 8b051b8c40345d81481c75f75f55c32bfe34f303..fc2023d07f6931154baa44c9c2bb1a8736ef43fb 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -281,7 +281,6 @@ long hugetlb_change_protection(struct vm_area_struct *vma, bool is_hugetlb_entry_migration(pte_t pte); void hugetlb_unshare_all_pmds(struct vm_area_struct *vma); -void hugetlb_split(struct vm_area_struct *vma, unsigned long addr); #else /* !CONFIG_HUGETLB_PAGE */ @@ -492,8 +491,6 @@ static inline vm_fault_t hugetlb_fault(struct mm_struct *mm, static inline void hugetlb_unshare_all_pmds(struct vm_area_struct *vma) { } -static inline void hugetlb_split(struct vm_area_struct *vma, unsigned long addr) {} - #endif /* !CONFIG_HUGETLB_PAGE */ /* * hugepages at page global directory. If arch support diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index e4ad9760774e1450debb95f90c23105b07148415..b5bf5315ca8c10f00d852ddcb7e80316f5022357 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -820,8 +820,6 @@ struct vmbus_requestor { #define VMBUS_RQST_RESET (U64_MAX - 3) struct vmbus_device { - /* preferred ring buffer size in KB, 0 means no preferred size for this device */ - size_t pref_ring_size; u16 dev_type; guid_t guid; bool perf_device; diff --git a/include/linux/io_uring_types.h b/include/linux/io_uring_types.h index dad2f9e4d53d66eba85f69225610b51eafbb3c8c..0fadef2983e01be7e986799baf7152d3ca58f2b2 100644 --- a/include/linux/io_uring_types.h +++ b/include/linux/io_uring_types.h @@ -416,7 +416,6 @@ enum { /* keep async read/write and isreg together and in order */ REQ_F_SUPPORT_NOWAIT_BIT, REQ_F_ISREG_BIT, - REQ_F_CAN_POLL_BIT, /* not a real bit, just to check we're not overflowing the space */ __REQ_F_LAST_BIT, @@ -484,8 +483,6 @@ enum { REQ_F_CLEAR_POLLIN = BIT(REQ_F_CLEAR_POLLIN_BIT), /* hashed into ->cancel_hash_locked, protected by ->uring_lock */ REQ_F_HASH_LOCKED = BIT(REQ_F_HASH_LOCKED_BIT), - /* file is pollable */ - REQ_F_CAN_POLL = BIT(REQ_F_CAN_POLL_BIT), }; typedef void (*io_req_tw_func_t)(struct io_kiocb *req, struct io_tw_state *ts); diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index af8a771a053c51eed297516f927a5fd003315ef4..d79851c5fabd86772266c96ea3474861754e3066 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -199,6 +199,7 @@ struct inet6_cork { struct ipv6_txoptions *opt; u8 hop_limit; u8 tclass; + u8 dontfrag:1; }; /* struct ipv6_pinfo - ipv6 private area */ diff --git a/include/linux/ism.h b/include/linux/ism.h index 04e2fc1973ce4e55a70f06f6dbe66d4f64729871..9a4c204df3da1d7e55d5277a8c31b8f4a60593b3 100644 --- a/include/linux/ism.h +++ b/include/linux/ism.h @@ -28,7 +28,6 @@ struct ism_dmb { struct ism_dev { spinlock_t lock; /* protects the ism device */ - spinlock_t cmd_lock; /* serializes cmds */ struct list_head list; struct pci_dev *pdev; diff --git a/include/linux/libata.h b/include/linux/libata.h index 285d709cbbde4d8d9c1558672d5677e5249a027a..91c4e11cb6abb4f9b88237c702efd17dab089fcf 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -1305,7 +1305,7 @@ int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm); int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *stm); unsigned int ata_acpi_gtm_xfermask(struct ata_device *dev, const struct ata_acpi_gtm *gtm); -int ata_acpi_cbl_pata_type(struct ata_port *ap); +int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm); #else static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap) { @@ -1330,9 +1330,10 @@ static inline unsigned int ata_acpi_gtm_xfermask(struct ata_device *dev, return 0; } -static inline int ata_acpi_cbl_pata_type(struct ata_port *ap) +static inline int ata_acpi_cbl_80wire(struct ata_port *ap, + const struct ata_acpi_gtm *gtm) { - return ATA_CBL_PATA40; + return 0; } #endif diff --git a/include/linux/mdio.h b/include/linux/mdio.h index 0bca1a960853f4c74b5ec03684d52a475b93bdd0..8fa23bdcedbf98f442ec37379bb88211c43ee33f 100644 --- a/include/linux/mdio.h +++ b/include/linux/mdio.h @@ -44,7 +44,10 @@ struct mdio_device { unsigned int reset_deassert_delay; }; -#define to_mdio_device(__dev) container_of_const(__dev, struct mdio_device, dev) +static inline struct mdio_device *to_mdio_device(const struct device *dev) +{ + return container_of(dev, struct mdio_device, dev); +} /* struct mdio_driver_common: Common to all MDIO drivers */ struct mdio_driver_common { diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 86f0f2a25a3d6346acd393789a57a904440fd48c..27f42f713c891cf2491331ecec9e99bbe33d6926 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -1135,7 +1135,7 @@ int mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, int mlx4_buf_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, struct mlx4_buf *buf); -int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, unsigned int order); +int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order); void mlx4_db_free(struct mlx4_dev *dev, struct mlx4_db *db); int mlx4_alloc_hwq_res(struct mlx4_dev *dev, struct mlx4_hwq_resources *wqres, diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h index 696a2227869fb31bdbc9f4f7c19613b74052c64a..69d844b34da0d3cef34635293101e99fb94ce63b 100644 --- a/include/linux/mlx5/driver.h +++ b/include/linux/mlx5/driver.h @@ -390,7 +390,6 @@ struct mlx5_core_rsc_common { enum mlx5_res_type res; refcount_t refcount; struct completion free; - bool invalid; }; struct mlx5_uars_page { diff --git a/include/linux/mm.h b/include/linux/mm.h index 4176fa18f692dff4761c742186486e88153239c4..6427828111d4af4ba0a7f567e6b61633b7057541 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2577,11 +2577,6 @@ static inline unsigned long get_mm_counter(struct mm_struct *mm, int member) return percpu_counter_read_positive(&mm->rss_stat[member]); } -static inline unsigned long get_mm_counter_sum(struct mm_struct *mm, int member) -{ - return percpu_counter_sum_positive(&mm->rss_stat[member]); -} - void mm_trace_rss_stat(struct mm_struct *mm, int member); static inline void add_mm_counter(struct mm_struct *mm, int member, long value) diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 7c6da19fff9f061ca39d55e2c706ec101f02bcd7..afa575e362a473c11cac6db9f0fdda959c26cb13 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -297,7 +297,6 @@ struct mmc_card { #define MMC_QUIRK_BROKEN_SD_CACHE (1<<15) /* Disable broken SD cache support */ #define MMC_QUIRK_BROKEN_CACHE_FLUSH (1<<16) /* Don't flush cache until the write has occurred */ #define MMC_QUIRK_BROKEN_SD_POWEROFF_NOTIFY (1<<17) /* Disable broken SD poweroff notify support */ -#define MMC_QUIRK_NO_UHS_DDR50_TUNING (1<<18) /* Disable DDR50 tuning */ bool written_flag; /* Indicates eMMC has been written since power on */ bool reenable_cmdq; /* Re-enable Command Queue */ diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index b9fd1486c19940031e9ff0779552049707c054a8..6f90f46e92166e81845052f122f99d98fc75d9f1 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3036,8 +3036,7 @@ extern rwlock_t dev_base_lock; /* Device list lock */ #define net_device_entry(lh) list_entry(lh, struct net_device, dev_list) #define for_each_netdev_dump(net, d, ifindex) \ - for (; (d = xa_find(&(net)->dev_by_index, &ifindex, \ - ULONG_MAX, XA_PRESENT)); ifindex++) + xa_for_each_start(&(net)->dev_by_index, (ifindex), (d), (ifindex)) static inline struct net_device *next_net_device(struct net_device *dev) { diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 374b1b208bd89e5b155b8ddb20ea9540e4cd5fc3..86d96e00c2e3de837c0119656f2c38c715f9d659 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -199,15 +199,6 @@ struct nfs_server { char *fscache_uniq; /* Uniquifier (or NULL) */ #endif - /* The following #defines numerically match the NFSv4 equivalents */ -#define NFS_FH_NOEXPIRE_WITH_OPEN (0x1) -#define NFS_FH_VOLATILE_ANY (0x2) -#define NFS_FH_VOL_MIGRATION (0x4) -#define NFS_FH_VOL_RENAME (0x8) -#define NFS_FH_RENAME_UNSAFE (NFS_FH_VOLATILE_ANY | NFS_FH_VOL_RENAME) - u32 fh_expire_type; /* V4 bitmask representing file - handle volatility type for - this filesystem */ u32 pnfs_blksize; /* layout_blksize attr */ #if IS_ENABLED(CONFIG_NFS_V4) u32 attr_bitmask[3];/* V4 bitmask representing the set @@ -231,6 +222,9 @@ struct nfs_server { u32 acl_bitmask; /* V4 bitmask representing the ACEs that are supported on this filesystem */ + u32 fh_expire_type; /* V4 bitmask representing file + handle volatility type for + this filesystem */ struct pnfs_layoutdriver_type *pnfs_curr_ld; /* Active layout driver */ struct rpc_wait_queue roc_rpcwaitq; void *pnfs_ld_data; /* per mount point data */ diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 1893a7916475520ab39a3b5756f9d28afff5178f..3ed1e637e30f9a8d29822eb6751316c8fd983cc9 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -566,13 +566,6 @@ PAGEFLAG(Readahead, readahead, PF_NO_COMPOUND) PAGEFLAG_FALSE(HighMem, highmem) #endif -/* Does kmap_local_folio() only allow access to one page of the folio? */ -#ifdef CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP -#define folio_test_partial_kmap(f) true -#else -#define folio_test_partial_kmap(f) folio_test_highmem(f) -#endif - #ifdef CONFIG_SWAP static __always_inline bool folio_test_swapcache(struct folio *folio) { diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 90c782749b0558a64ad57c1cdb5166aea7b35426..fcb834dd75c24034578db90d7fda17596953f010 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -1016,13 +1016,7 @@ struct perf_output_handle { struct perf_buffer *rb; unsigned long wakeup; unsigned long size; - union { - u64 flags; /* perf_output*() */ - u64 aux_flags; /* perf_aux_output*() */ - struct { - u64 skip_read : 1; - }; - }; + u64 aux_flags; union { void *addr; unsigned long head; diff --git a/include/linux/phy.h b/include/linux/phy.h index a57e799b1de18531603679d76ea625b7496f7173..5aa30ee99810479488a0e75a517ce2f68183cee6 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -766,7 +766,10 @@ struct phy_device { /* Generic phy_device::dev_flags */ #define PHY_F_NO_IRQ 0x80000000 -#define to_phy_device(__dev) container_of_const(to_mdio_device(__dev), struct phy_device, mdio) +static inline struct phy_device *to_phy_device(const struct device *dev) +{ + return container_of(to_mdio_device(dev), struct phy_device, mdio); +} /** * struct phy_tdr_config - Configuration of a TDR raw test diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 27531a0b3a6e728a2246b2c0948a4cd6ab2d1d07..72da69cc5764f33dc110cc1d79bd55cc1223c171 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -97,9 +97,9 @@ static inline void __rcu_read_lock(void) static inline void __rcu_read_unlock(void) { + preempt_enable(); if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD)) rcu_read_unlock_strict(); - preempt_enable(); } static inline int rcu_preempt_depth(void) diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h index 559f758bf2eaa827eeb6ac18e557b3b627f07872..126f6b418f6afc9b9bd0ea337650e89bcb9c5faa 100644 --- a/include/linux/rcutree.h +++ b/include/linux/rcutree.h @@ -104,7 +104,7 @@ extern int rcu_scheduler_active; void rcu_end_inkernel_boot(void); bool rcu_inkernel_boot_has_ended(void); bool rcu_is_watching(void); -#ifndef CONFIG_PREEMPT_RCU +#ifndef CONFIG_PREEMPTION void rcu_all_qs(void); #endif diff --git a/include/linux/sprintf.h b/include/linux/sprintf.h index 9e13b8040b12caeb70776c87fc26896fab299d31..33dcbec719254a3f827b8677a1b782fe75e0b9ac 100644 --- a/include/linux/sprintf.h +++ b/include/linux/sprintf.h @@ -4,7 +4,6 @@ #include #include -#include int num_to_str(char *buf, int size, unsigned long long num, unsigned int width); diff --git a/include/linux/usb/r8152.h b/include/linux/usb/r8152.h index 2ca60828f28bb61f8ccfda99a6d80d902d3dd5d0..33a4c146dc19c45d5cb343fba0ffdf0a0b7cff36 100644 --- a/include/linux/usb/r8152.h +++ b/include/linux/usb/r8152.h @@ -30,7 +30,6 @@ #define VENDOR_ID_NVIDIA 0x0955 #define VENDOR_ID_TPLINK 0x2357 #define VENDOR_ID_DLINK 0x2001 -#define VENDOR_ID_DELL 0x413c #define VENDOR_ID_ASUS 0x0b05 #if IS_REACHABLE(CONFIG_USB_RTL8152) diff --git a/include/linux/usb/typec_dp.h b/include/linux/usb/typec_dp.h index c3f08af20295ca036b5fb0df2eef560d04fd4da1..8d09c2f0a9b80717cdda7eba91cf63959d3be158 100644 --- a/include/linux/usb/typec_dp.h +++ b/include/linux/usb/typec_dp.h @@ -56,7 +56,6 @@ enum { DP_PIN_ASSIGN_D, DP_PIN_ASSIGN_E, DP_PIN_ASSIGN_F, /* Not supported after v1.0b */ - DP_PIN_ASSIGN_MAX, }; /* DisplayPort alt mode specific commands */ diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index 0740dfc6c04881d020d720913ae6759d84e056a3..b4fcd0164048eda90131b7e86cad754e610cf3ac 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h @@ -822,9 +822,7 @@ struct v4l2_subdev_state { * possible configuration from the remote end, likely calling * this operation as close as possible to stream on time. The * operation shall fail if the pad index it has been called on - * is not valid or in case of unrecoverable failures. The - * config argument has been memset to 0 just before calling - * the op. + * is not valid or in case of unrecoverable failures. * * @set_routing: enable or disable data connection routes described in the * subdevice routing table. diff --git a/include/net/af_unix.h b/include/net/af_unix.h index b6eedf7650da594bf151c043bdcdba097173858c..77bf30203d3cf683704197003b21f5f818eb5f76 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h @@ -8,46 +8,21 @@ #include #include -#if IS_ENABLED(CONFIG_UNIX) -struct unix_sock *unix_get_socket(struct file *filp); -#else -static inline struct unix_sock *unix_get_socket(struct file *filp) -{ - return NULL; -} -#endif - -extern unsigned int unix_tot_inflight; -void unix_add_edges(struct scm_fp_list *fpl, struct unix_sock *receiver); -void unix_del_edges(struct scm_fp_list *fpl); -void unix_update_edges(struct unix_sock *receiver); -int unix_prepare_fpl(struct scm_fp_list *fpl); -void unix_destroy_fpl(struct scm_fp_list *fpl); +void unix_inflight(struct user_struct *user, struct file *fp); +void unix_notinflight(struct user_struct *user, struct file *fp); +void unix_destruct_scm(struct sk_buff *skb); +void io_uring_destruct_scm(struct sk_buff *skb); void unix_gc(void); -void wait_for_unix_gc(struct scm_fp_list *fpl); - -struct unix_vertex { - struct list_head edges; - struct list_head entry; - struct list_head scc_entry; - unsigned long out_degree; - unsigned long index; - unsigned long scc_index; -}; - -struct unix_edge { - struct unix_sock *predecessor; - struct unix_sock *successor; - struct list_head vertex_entry; - struct list_head stack_entry; -}; - +void wait_for_unix_gc(void); +struct sock *unix_get_socket(struct file *filp); struct sock *unix_peer_get(struct sock *sk); #define UNIX_HASH_MOD (256 - 1) #define UNIX_HASH_SIZE (256 * 2) #define UNIX_HASH_BITS 8 +extern unsigned int unix_tot_inflight; + struct unix_address { refcount_t refcnt; int len; @@ -67,7 +42,6 @@ struct unix_skb_parms { struct scm_stat { atomic_t nr_fds; - unsigned long nr_unix_fds; }; #define UNIXCB(skb) (*(struct unix_skb_parms *)&((skb)->cb)) @@ -80,9 +54,12 @@ struct unix_sock { struct path path; struct mutex iolock, bindlock; struct sock *peer; - struct sock *listener; - struct unix_vertex *vertex; + struct list_head link; + unsigned long inflight; spinlock_t lock; + unsigned long gc_flags; +#define UNIX_GC_CANDIDATE 0 +#define UNIX_GC_MAYBE_CYCLE 1 struct socket_wq peer_wq; wait_queue_entry_t peer_wake; struct scm_stat scm_stat; diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h index 1820b87b8b7fffe5fbe06798d56b2c855c4c67da..f8b09a82f62e1d33320128b17365f5c289219a18 100644 --- a/include/net/af_vsock.h +++ b/include/net/af_vsock.h @@ -236,8 +236,8 @@ int __vsock_dgram_recvmsg(struct socket *sock, struct msghdr *msg, int vsock_dgram_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, int flags); -extern struct proto vsock_proto; #ifdef CONFIG_BPF_SYSCALL +extern struct proto vsock_proto; int vsock_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore); void __init vsock_bpf_build_proto(void); #else diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 4f067599e6e9e0874eff0f87db89b14a07ecf45c..e9214ccfde2d723306bc5e3f6853f9b4b095fe30 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -29,7 +29,6 @@ #include #include #include -#include #include #include @@ -340,7 +339,6 @@ struct adv_monitor { struct hci_dev { struct list_head list; - struct srcu_struct srcu; struct mutex lock; struct ida unset_handle_ida; @@ -544,7 +542,6 @@ struct hci_dev { struct hci_conn_hash conn_hash; struct list_head mesh_pending; - struct mutex mgmt_pending_lock; struct list_head mgmt_pending; struct list_head reject_list; struct list_head accept_list; @@ -2308,6 +2305,7 @@ void mgmt_advertising_added(struct sock *sk, struct hci_dev *hdev, u8 instance); void mgmt_advertising_removed(struct sock *sk, struct hci_dev *hdev, u8 instance); +void mgmt_adv_monitor_removed(struct hci_dev *hdev, u16 handle); int mgmt_phy_configuration_changed(struct hci_dev *hdev, struct sock *skip); void mgmt_adv_monitor_device_lost(struct hci_dev *hdev, u16 handle, bdaddr_t *bdaddr, u8 addr_type); diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 2fb3151ea7c9e9d8d111a08e3a2cd77f41ef94ad..802ea3080d0b360858736549b9d00cc6aac60aed 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -2543,7 +2543,7 @@ struct cfg80211_scan_request { struct cfg80211_scan_6ghz_params *scan_6ghz_params; /* keep last */ - struct ieee80211_channel *channels[]; + struct ieee80211_channel *channels[] __counted_by(n_channels); }; static inline void get_random_mask_addr(u8 *buf, const u8 *addr, const u8 *mask) diff --git a/include/net/checksum.h b/include/net/checksum.h index 28b101f26636e81f2e8f459bc3719cae1d314708..1338cb92c8e72a8f2fc5271d9bbda2d7510dd2ef 100644 --- a/include/net/checksum.h +++ b/include/net/checksum.h @@ -158,7 +158,7 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, const __be32 *from, const __be32 *to, bool pseudohdr); void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb, - __wsum diff, bool pseudohdr, bool ipv6); + __wsum diff, bool pseudohdr); static __always_inline void inet_proto_csum_replace2(__sum16 *sum, struct sk_buff *skb, diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index a2c987289401ee53481d4e09064aea9727d66221..4085765c337054b5770043d327653aebb88843db 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h @@ -302,19 +302,8 @@ static inline bool nf_ct_is_expired(const struct nf_conn *ct) /* use after obtaining a reference count */ static inline bool nf_ct_should_gc(const struct nf_conn *ct) { - if (!nf_ct_is_confirmed(ct)) - return false; - - /* load ct->timeout after is_confirmed() test. - * Pairs with __nf_conntrack_confirm() which: - * 1. Increases ct->timeout value - * 2. Inserts ct into rcu hlist - * 3. Sets the confirmed bit - * 4. Unlocks the hlist lock - */ - smp_acquire__after_ctrl_dep(); - - return nf_ct_is_expired(ct) && !nf_ct_is_dying(ct); + return nf_ct_is_expired(ct) && nf_ct_is_confirmed(ct) && + !nf_ct_is_dying(ct); } #define NF_CT_DAY (86400 * HZ) diff --git a/include/net/netfilter/nf_flow_table.h b/include/net/netfilter/nf_flow_table.h index 0097791e1eede6d0e4398a17e7bdda05f61fc089..df7775afb92b93401b0d8343ec69efde959d27bf 100644 --- a/include/net/netfilter/nf_flow_table.h +++ b/include/net/netfilter/nf_flow_table.h @@ -353,7 +353,7 @@ static inline __be16 __nf_flow_pppoe_proto(const struct sk_buff *skb) static inline bool nf_flow_pppoe_proto(struct sk_buff *skb, __be16 *inner_proto) { - if (!pskb_may_pull(skb, ETH_HLEN + PPPOE_SES_HLEN)) + if (!pskb_may_pull(skb, PPPOE_SES_HLEN)) return false; *inner_proto = __nf_flow_pppoe_proto(skb); diff --git a/include/net/scm.h b/include/net/scm.h index 059e287745dc3904709748228913f78ea201d9a6..e8c76b4be2fe71c62f841a8cbc27aa97acf670b3 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -22,20 +22,9 @@ struct scm_creds { kgid_t gid; }; -#ifdef CONFIG_UNIX -struct unix_edge; -#endif - struct scm_fp_list { short count; - short count_unix; short max; -#ifdef CONFIG_UNIX - bool inflight; - bool dead; - struct list_head vertices; - struct unix_edge *edges; -#endif struct user_struct *user; struct file *fp[SCM_MAX_FD]; }; diff --git a/include/net/sock.h b/include/net/sock.h index e15bea43b2ecd152fc294b9b8a6f726ee30bedf6..dc625f94ee37b759a762f74bb40c854e5d9a278a 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -3043,11 +3043,8 @@ int sock_ioctl_inout(struct sock *sk, unsigned int cmd, int sk_ioctl(struct sock *sk, unsigned int cmd, void __user *arg); static inline bool sk_is_readable(struct sock *sk) { - const struct proto *prot = READ_ONCE(sk->sk_prot); - - if (prot->sock_is_readable) - return prot->sock_is_readable(sk); - + if (sk->sk_prot->sock_is_readable) + return sk->sk_prot->sock_is_readable(sk); return false; } #endif /* _SOCK_H */ diff --git a/include/net/xfrm.h b/include/net/xfrm.h index fd550c0b56345095fe74011dd9bcd587b9c9fe44..b33d27e42cff38c4d9638bf2f4f3b5fb12de876e 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -228,6 +228,7 @@ struct xfrm_state { /* Data for encapsulator */ struct xfrm_encap_tmpl *encap; + struct sock __rcu *encap_sk; /* Data for care-of address */ xfrm_address_t *coaddr; diff --git a/include/sound/pcm.h b/include/sound/pcm.h index ed4449cbdf803346b6f001c327cb73b5f19468de..2a815373dac1d9841d1cfac74606b4929030c349 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h @@ -1427,8 +1427,6 @@ int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_s #define snd_pcm_lib_mmap_iomem NULL #endif -void snd_pcm_runtime_buffer_set_silence(struct snd_pcm_runtime *runtime); - /** * snd_pcm_limit_isa_dma_size - Get the max size fitting with ISA DMA transfer * @dma: DMA number diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h index 8ea1674069fe817969f3cf5073cbf2b36fba709e..3c4d5ef6d44636f5106afa8b8dbb1fd9eacda0a6 100644 --- a/include/trace/events/btrfs.h +++ b/include/trace/events/btrfs.h @@ -1956,7 +1956,7 @@ DECLARE_EVENT_CLASS(btrfs__prelim_ref, TP_PROTO(const struct btrfs_fs_info *fs_info, const struct prelim_ref *oldref, const struct prelim_ref *newref, u64 tree_size), - TP_ARGS(fs_info, oldref, newref, tree_size), + TP_ARGS(fs_info, newref, oldref, tree_size), TP_STRUCT__entry_btrfs( __field( u64, root_id ) diff --git a/include/trace/events/erofs.h b/include/trace/events/erofs.h index 0179af103d0f42e2203f382f7f1730e0f1584671..e18684b02c3dfa0c138da518172a3cb99998cbd4 100644 --- a/include/trace/events/erofs.h +++ b/include/trace/events/erofs.h @@ -237,6 +237,24 @@ DEFINE_EVENT(erofs__map_blocks_exit, z_erofs_map_blocks_iter_exit, TP_ARGS(inode, map, flags, ret) ); +TRACE_EVENT(erofs_destroy_inode, + TP_PROTO(struct inode *inode), + + TP_ARGS(inode), + + TP_STRUCT__entry( + __field( dev_t, dev ) + __field( erofs_nid_t, nid ) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->nid = EROFS_I(inode)->nid; + ), + + TP_printk("dev = (%d,%d), nid = %llu", show_dev_nid(__entry)) +); + #endif /* _TRACE_EROFS_H */ /* This part must be outside protection */ diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index f2ce7f6da87975f0ebff5ee13eb3f0d832733cd2..b6ffae01a8cd864b3eebe8dc5525ec73a7c96d12 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -1284,6 +1284,13 @@ DEFINE_EVENT(f2fs__page, f2fs_set_page_dirty, TP_ARGS(page, type) ); +DEFINE_EVENT(f2fs__page, f2fs_vm_page_mkwrite, + + TP_PROTO(struct page *page, int type), + + TP_ARGS(page, type) +); + TRACE_EVENT(f2fs_replace_atomic_write_block, TP_PROTO(struct inode *inode, struct inode *cow_inode, pgoff_t index, @@ -1321,50 +1328,30 @@ TRACE_EVENT(f2fs_replace_atomic_write_block, __entry->recovery) ); -DECLARE_EVENT_CLASS(f2fs_mmap, +TRACE_EVENT(f2fs_filemap_fault, - TP_PROTO(struct inode *inode, pgoff_t index, - vm_flags_t flags, vm_fault_t ret), + TP_PROTO(struct inode *inode, pgoff_t index, unsigned long ret), - TP_ARGS(inode, index, flags, ret), + TP_ARGS(inode, index, ret), TP_STRUCT__entry( __field(dev_t, dev) __field(ino_t, ino) __field(pgoff_t, index) - __field(vm_flags_t, flags) - __field(vm_fault_t, ret) + __field(unsigned long, ret) ), TP_fast_assign( __entry->dev = inode->i_sb->s_dev; __entry->ino = inode->i_ino; __entry->index = index; - __entry->flags = flags; __entry->ret = ret; ), - TP_printk("dev = (%d,%d), ino = %lu, index = %lu, flags: %s, ret: %s", + TP_printk("dev = (%d,%d), ino = %lu, index = %lu, ret = %lx", show_dev_ino(__entry), (unsigned long)__entry->index, - __print_flags(__entry->flags, "|", FAULT_FLAG_TRACE), - __print_flags(__entry->ret, "|", VM_FAULT_RESULT_TRACE)) -); - -DEFINE_EVENT(f2fs_mmap, f2fs_filemap_fault, - - TP_PROTO(struct inode *inode, pgoff_t index, - vm_flags_t flags, vm_fault_t ret), - - TP_ARGS(inode, index, flags, ret) -); - -DEFINE_EVENT(f2fs_mmap, f2fs_vm_page_mkwrite, - - TP_PROTO(struct inode *inode, pgoff_t index, - vm_flags_t flags, vm_fault_t ret), - - TP_ARGS(inode, index, flags, ret) + __entry->ret) ); TRACE_EVENT(f2fs_writepages, diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index 743f8f1f42a74229f78340da177111b94d5b96b5..e7c7b638943629176ea18d31bb4adca30a79dc3e 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -278,15 +278,12 @@ EM(rxrpc_call_put_userid, "PUT user-id ") \ EM(rxrpc_call_see_accept, "SEE accept ") \ EM(rxrpc_call_see_activate_client, "SEE act-clnt") \ - EM(rxrpc_call_see_already_released, "SEE alrdy-rl") \ EM(rxrpc_call_see_connect_failed, "SEE con-fail") \ EM(rxrpc_call_see_connected, "SEE connect ") \ EM(rxrpc_call_see_conn_abort, "SEE conn-abt") \ - EM(rxrpc_call_see_discard, "SEE discard ") \ EM(rxrpc_call_see_disconnected, "SEE disconn ") \ EM(rxrpc_call_see_distribute_error, "SEE dist-err") \ EM(rxrpc_call_see_input, "SEE input ") \ - EM(rxrpc_call_see_recvmsg, "SEE recvmsg ") \ EM(rxrpc_call_see_release, "SEE release ") \ EM(rxrpc_call_see_userid_exists, "SEE u-exists") \ EM(rxrpc_call_see_waiting_call, "SEE q-conn ") \ diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 08a0494736e6e344b59d43fe13a23dc36633d219..c7f904a72af2178343826f220b03610482bfa13f 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -1913,7 +1913,6 @@ union bpf_attr { * for updates resulting in a null checksum the value is set to * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates * the checksum is to be computed against a pseudo-header. - * Flag **BPF_F_IPV6** should be set for IPv6 packets. * * This helper works in combination with **bpf_csum_diff**\ (), * which does not update the checksum in-place, but offers more @@ -5921,7 +5920,6 @@ enum { BPF_F_PSEUDO_HDR = (1ULL << 4), BPF_F_MARK_MANGLED_0 = (1ULL << 5), BPF_F_MARK_ENFORCE = (1ULL << 6), - BPF_F_IPV6 = (1ULL << 7), }; /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ diff --git a/include/uapi/linux/idxd.h b/include/uapi/linux/idxd.h index 3d1987e1bb2dd65557d11c2fe99c89c2d9b1704c..606b52e88ce335b02e3efa5a558fd3bba20481ab 100644 --- a/include/uapi/linux/idxd.h +++ b/include/uapi/linux/idxd.h @@ -31,7 +31,6 @@ enum idxd_scmd_stat { IDXD_SCMD_WQ_IRQ_ERR = 0x80100000, IDXD_SCMD_WQ_USER_NO_IOMMU = 0x80110000, IDXD_SCMD_DEV_EVL_ERR = 0x80120000, - IDXD_SCMD_WQ_NO_DRV_NAME = 0x80200000, }; #define IDXD_SCMD_SOFTERR_MASK 0x80000000 diff --git a/include/uapi/linux/vm_sockets.h b/include/uapi/linux/vm_sockets.h index e05280e41522860c8b4ffc7859db75527371ae8d..ed07181d4eff917591dd459f4325078b33957bbe 100644 --- a/include/uapi/linux/vm_sockets.h +++ b/include/uapi/linux/vm_sockets.h @@ -17,10 +17,6 @@ #ifndef _UAPI_VM_SOCKETS_H #define _UAPI_VM_SOCKETS_H -#ifndef __KERNEL__ -#include /* for struct sockaddr and sa_family_t */ -#endif - #include #include diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h index e9db9682316a2ac625d376d4e337961da318b6a3..d5aa832f8dba3cf54efb8039e9585160f5ad574f 100644 --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h @@ -430,7 +430,6 @@ struct ufs_clk_gating { * @workq: workqueue to schedule devfreq suspend/resume work * @suspend_work: worker to suspend devfreq * @resume_work: worker to resume devfreq - * @target_freq: frequency requested by devfreq framework * @min_gear: lowest HS gear to scale down to * @is_enabled: tracks if scaling is currently enabled or not, controlled by * clkscale_enable sysfs node @@ -450,7 +449,6 @@ struct ufs_clk_scaling { struct workqueue_struct *workq; struct work_struct suspend_work; struct work_struct resume_work; - unsigned long target_freq; u32 min_gear; bool is_enabled; bool is_allowed; @@ -864,7 +862,6 @@ enum ufshcd_mcq_opr { * @auto_bkops_enabled: to track whether bkops is enabled in device * @vreg_info: UFS device voltage regulator information * @clk_list_head: UFS host controller clocks list node head - * @use_pm_opp: Indicates whether OPP based scaling is used or not * @req_abort_count: number of times ufshcd_abort() has been called * @lanes_per_direction: number of lanes per data direction between the UFS * controller and the UFS device. @@ -1017,7 +1014,6 @@ struct ufs_hba { bool auto_bkops_enabled; struct ufs_vreg_info vreg_info; struct list_head clk_list_head; - bool use_pm_opp; /* Number of requests aborts */ int req_abort_count; diff --git a/io_uring/fdinfo.c b/io_uring/fdinfo.c index a26cf840e623d64d5452643d042a063f5eaaa2dd..976e9500f6518cbc121d212af5e80334ef3e2ace 100644 --- a/io_uring/fdinfo.c +++ b/io_uring/fdinfo.c @@ -81,11 +81,11 @@ __cold void io_uring_show_fdinfo(struct seq_file *m, struct file *f) seq_printf(m, "SqMask:\t0x%x\n", sq_mask); seq_printf(m, "SqHead:\t%u\n", sq_head); seq_printf(m, "SqTail:\t%u\n", sq_tail); - seq_printf(m, "CachedSqHead:\t%u\n", data_race(ctx->cached_sq_head)); + seq_printf(m, "CachedSqHead:\t%u\n", ctx->cached_sq_head); seq_printf(m, "CqMask:\t0x%x\n", cq_mask); seq_printf(m, "CqHead:\t%u\n", cq_head); seq_printf(m, "CqTail:\t%u\n", cq_tail); - seq_printf(m, "CachedCqTail:\t%u\n", data_race(ctx->cached_cq_tail)); + seq_printf(m, "CachedCqTail:\t%u\n", ctx->cached_cq_tail); seq_printf(m, "SQEs:\t%u\n", sq_tail - sq_head); sq_entries = min(sq_tail - sq_head, ctx->sq_entries); for (i = 0; i < sq_entries; i++) { diff --git a/io_uring/io-wq.c b/io_uring/io-wq.c index 1c4ef4e4eb52b2c7bd617623b3f44ddf27e61c44..93f3e4d1df853e437b59f06c093825af09634056 100644 --- a/io_uring/io-wq.c +++ b/io_uring/io-wq.c @@ -1206,10 +1206,8 @@ struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data) atomic_set(&wq->worker_refs, 1); init_completion(&wq->worker_done); ret = cpuhp_state_add_instance_nocalls(io_wq_online, &wq->cpuhp_node); - if (ret) { - put_task_struct(wq->task); + if (ret) goto err; - } return wq; err: diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index 897f07014c01938071e968e867a87fb2aa23ecc9..db592fa549b7386d1bc5431645ded200219a6bfe 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -701,7 +701,6 @@ static void __io_cqring_overflow_flush(struct io_ring_ctx *ctx) * to care for a non-real case. */ if (need_resched()) { - ctx->cqe_sentinel = ctx->cqe_cached; io_cq_unlock_post(ctx); mutex_unlock(&ctx->uring_lock); cond_resched(); @@ -920,6 +919,14 @@ static bool __io_post_aux_cqe(struct io_ring_ctx *ctx, u64 user_data, s32 res, u { bool filled; + /* + * If multishot has already posted deferred completions, ensure that + * those are flushed first before posting this one. If not, CQEs + * could get reordered. + */ + if (!wq_list_empty(&ctx->submit_state.compl_reqs)) + __io_submit_flush_completions(ctx); + io_cq_lock(ctx); filled = io_fill_cqe_aux(ctx, user_data, res, cflags); if (!filled && allow_overflow) @@ -1808,7 +1815,7 @@ static __cold void io_drain_req(struct io_kiocb *req) spin_unlock(&ctx->completion_lock); io_prep_async_link(req); - de = kmalloc(sizeof(*de), GFP_KERNEL_ACCOUNT); + de = kmalloc(sizeof(*de), GFP_KERNEL); if (!de) { ret = -ENOMEM; io_req_defer_failed(req, ret); @@ -1945,7 +1952,7 @@ void io_wq_submit_work(struct io_wq_work *work) if (req->flags & REQ_F_FORCE_ASYNC) { bool opcode_poll = def->pollin || def->pollout; - if (opcode_poll && io_file_can_poll(req)) { + if (opcode_poll && file_can_poll(req->file)) { needs_poll = true; issue_flags |= IO_URING_F_NONBLOCK; } diff --git a/io_uring/io_uring.h b/io_uring/io_uring.h index 59f5f71037ffe12179e2c71dd6ba68b5d29735f4..0ffec66deee7f1325e4fcaa11b4067a985f8f93a 100644 --- a/io_uring/io_uring.h +++ b/io_uring/io_uring.h @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include "io-wq.h" @@ -411,15 +410,4 @@ static inline size_t uring_sqe_size(struct io_ring_ctx *ctx) return 2 * sizeof(struct io_uring_sqe); return sizeof(struct io_uring_sqe); } - -static inline bool io_file_can_poll(struct io_kiocb *req) -{ - if (req->flags & REQ_F_CAN_POLL) - return true; - if (file_can_poll(req->file)) { - req->flags |= REQ_F_CAN_POLL; - return true; - } - return false; -} #endif diff --git a/io_uring/kbuf.c b/io_uring/kbuf.c index b2c381634393d23855086c9886e459065b4ad66d..8c6611fe4f4633c5debba6fc33a727a408492ee9 100644 --- a/io_uring/kbuf.c +++ b/io_uring/kbuf.c @@ -148,7 +148,8 @@ static void __user *io_ring_buffer_select(struct io_kiocb *req, size_t *len, req->buf_list = bl; req->buf_index = buf->bid; - if (issue_flags & IO_URING_F_UNLOCKED || !io_file_can_poll(req)) { + if (issue_flags & IO_URING_F_UNLOCKED || + (req->file && !file_can_poll(req->file))) { /* * If we came in unlocked, we have no choice but to consume the * buffer here, otherwise nothing ensures that the buffer won't @@ -560,7 +561,7 @@ int io_register_pbuf_ring(struct io_ring_ctx *ctx, void __user *arg) io_destroy_bl(ctx, bl); } - free_bl = bl = kzalloc(sizeof(*bl), GFP_KERNEL_ACCOUNT); + free_bl = bl = kzalloc(sizeof(*bl), GFP_KERNEL); if (!bl) return -ENOMEM; diff --git a/io_uring/net.c b/io_uring/net.c index e455f051e62ef7c53b437c8ed18873350264bc78..4948a67bbac4805f6de92d5b1505cd7570ef9075 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -1537,11 +1537,9 @@ int io_connect(struct io_kiocb *req, unsigned int issue_flags) io = &__io; } - if (connect->in_progress) { - struct poll_table_struct pt = { ._key = EPOLLERR }; - - if (vfs_poll(req->file, &pt) & EPOLLERR) - goto get_sock_err; + if (unlikely(req->flags & REQ_F_FAIL)) { + ret = -ECONNRESET; + goto out; } file_flags = force_nonblock ? O_NONBLOCK : 0; @@ -1573,10 +1571,8 @@ int io_connect(struct io_kiocb *req, unsigned int issue_flags) * which means the previous result is good. For both of these, * grab the sock_error() and use that for the completion. */ - if (ret == -EBADFD || ret == -EISCONN) { -get_sock_err: + if (ret == -EBADFD || ret == -EISCONN) ret = sock_error(sock_from_file(req->file)->sk); - } } if (ret == -ERESTARTSYS) ret = -EINTR; diff --git a/io_uring/opdef.c b/io_uring/opdef.c index 2d0a7db940fdb0cd30a31f9c1e7dd2041b0373b0..3b9c6489b8b6d2732b1e349b1184a09a367c9f8b 100644 --- a/io_uring/opdef.c +++ b/io_uring/opdef.c @@ -202,7 +202,6 @@ const struct io_issue_def io_issue_defs[] = { }, [IORING_OP_FALLOCATE] = { .needs_file = 1, - .hash_reg_file = 1, .prep = io_fallocate_prep, .issue = io_fallocate, }, diff --git a/io_uring/poll.c b/io_uring/poll.c index 65935ec8de89c4a8c30977e68b2950f41f8de65a..cf8e86bc96deb57449f68eec671e1cdb1badffe9 100644 --- a/io_uring/poll.c +++ b/io_uring/poll.c @@ -308,6 +308,8 @@ static int io_poll_check_events(struct io_kiocb *req, struct io_tw_state *ts) return IOU_POLL_REISSUE; } } + if (unlikely(req->cqe.res & EPOLLERR)) + req_set_fail(req); if (req->apoll_events & EPOLLONESHOT) return IOU_POLL_DONE; @@ -715,7 +717,7 @@ int io_arm_poll_handler(struct io_kiocb *req, unsigned issue_flags) if (!def->pollin && !def->pollout) return IO_APOLL_ABORTED; - if (!io_file_can_poll(req)) + if (!file_can_poll(req->file)) return IO_APOLL_ABORTED; if (!(req->flags & REQ_F_APOLL_MULTISHOT)) mask |= EPOLLONESHOT; diff --git a/io_uring/rw.c b/io_uring/rw.c index 4ff3442ac2eeeadeeff3f6dce4197abc49a4a4b6..75b001febb4d284c556aee784003b49f5758ddbb 100644 --- a/io_uring/rw.c +++ b/io_uring/rw.c @@ -28,19 +28,9 @@ struct io_rw { rwf_t flags; }; -static bool io_file_supports_nowait(struct io_kiocb *req, __poll_t mask) +static inline bool io_file_supports_nowait(struct io_kiocb *req) { - /* If FMODE_NOWAIT is set for a file, we're golden */ - if (req->flags & REQ_F_SUPPORT_NOWAIT) - return true; - /* No FMODE_NOWAIT, if we can poll, check the status */ - if (io_file_can_poll(req)) { - struct poll_table_struct pt = { ._key = mask }; - - return vfs_poll(req->file, &pt) & mask; - } - /* No FMODE_NOWAIT support, and file isn't pollable. Tough luck. */ - return false; + return req->flags & REQ_F_SUPPORT_NOWAIT; } #ifdef CONFIG_COMPAT @@ -639,7 +629,7 @@ static bool io_rw_should_retry(struct io_kiocb *req) * just use poll if we can, and don't attempt if the fs doesn't * support callback based unlocks */ - if (io_file_can_poll(req) || !(req->file->f_mode & FMODE_BUF_RASYNC)) + if (file_can_poll(req->file) || !(req->file->f_mode & FMODE_BUF_RASYNC)) return false; wait->wait.func = io_async_buf_func; @@ -695,8 +685,8 @@ static int io_rw_init_file(struct io_kiocb *req, fmode_t mode) * supports async. Otherwise it's impossible to use O_NONBLOCK files * reliably. If not, or it IOCB_NOWAIT is set, don't retry. */ - if (kiocb->ki_flags & IOCB_NOWAIT || - ((file->f_flags & O_NONBLOCK && !(req->flags & REQ_F_SUPPORT_NOWAIT)))) + if ((kiocb->ki_flags & IOCB_NOWAIT) || + ((file->f_flags & O_NONBLOCK) && !io_file_supports_nowait(req))) req->flags |= REQ_F_NOWAIT; if (ctx->flags & IORING_SETUP_IOPOLL) { @@ -762,7 +752,7 @@ static int __io_read(struct io_kiocb *req, unsigned int issue_flags) if (force_nonblock) { /* If the file doesn't support async, just async punt */ - if (unlikely(!io_file_supports_nowait(req, EPOLLIN))) { + if (unlikely(!io_file_supports_nowait(req))) { ret = io_setup_async_rw(req, iovec, s, true); return ret ?: -EAGAIN; } @@ -793,7 +783,7 @@ static int __io_read(struct io_kiocb *req, unsigned int issue_flags) if (ret == -EAGAIN || (req->flags & REQ_F_REISSUE)) { req->flags &= ~REQ_F_REISSUE; /* if we can poll, just do that */ - if (req->opcode == IORING_OP_READ && io_file_can_poll(req)) + if (req->opcode == IORING_OP_READ && file_can_poll(req->file)) return -EAGAIN; /* IOPOLL retry should happen for io-wq threads */ if (!force_nonblock && !(req->ctx->flags & IORING_SETUP_IOPOLL)) @@ -937,7 +927,7 @@ int io_write(struct io_kiocb *req, unsigned int issue_flags) if (force_nonblock) { /* If the file doesn't support async, just async punt */ - if (unlikely(!io_file_supports_nowait(req, EPOLLOUT))) + if (unlikely(!io_file_supports_nowait(req))) goto copy_iov; /* File path supports NOWAIT for non-direct_IO only for block devices. */ diff --git a/ipc/shm.c b/ipc/shm.c index c4845689b7f68bb4a307f4e49f5b0a0d33b3974b..576a543b7cfff9c09187d8605bd3f3086af2a458 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -430,11 +430,8 @@ static int shm_try_destroy_orphaned(int id, void *p, void *data) void shm_destroy_orphaned(struct ipc_namespace *ns) { down_write(&shm_ids(ns).rwsem); - if (shm_ids(ns).in_use) { - rcu_read_lock(); + if (shm_ids(ns).in_use) idr_for_each(&shm_ids(ns).ipcs_idr, &shm_try_destroy_orphaned, ns); - rcu_read_unlock(); - } up_write(&shm_ids(ns).rwsem); } diff --git a/kernel/bpf/bpf_lru_list.c b/kernel/bpf/bpf_lru_list.c index 2d6e1c98d8adc34d91a1f23206bdcc0bb5b526e3..3dabdd137d102191b706be71f0ff633bbd0406df 100644 --- a/kernel/bpf/bpf_lru_list.c +++ b/kernel/bpf/bpf_lru_list.c @@ -337,12 +337,12 @@ static void bpf_lru_list_pop_free_to_local(struct bpf_lru *lru, list) { __bpf_lru_node_move_to_free(l, node, local_free_list(loc_l), BPF_LRU_LOCAL_LIST_T_FREE); - if (++nfree == lru->target_free) + if (++nfree == LOCAL_FREE_TARGET) break; } - if (nfree < lru->target_free) - __bpf_lru_list_shrink(lru, l, lru->target_free - nfree, + if (nfree < LOCAL_FREE_TARGET) + __bpf_lru_list_shrink(lru, l, LOCAL_FREE_TARGET - nfree, local_free_list(loc_l), BPF_LRU_LOCAL_LIST_T_FREE); @@ -577,9 +577,6 @@ static void bpf_common_lru_populate(struct bpf_lru *lru, void *buf, list_add(&node->list, &l->lists[BPF_LRU_LIST_T_FREE]); buf += elem_size; } - - lru->target_free = clamp((nr_elems / num_possible_cpus()) / 2, - 1, LOCAL_FREE_TARGET); } static void bpf_percpu_lru_populate(struct bpf_lru *lru, void *buf, diff --git a/kernel/bpf/bpf_lru_list.h b/kernel/bpf/bpf_lru_list.h index fe2661a58ea94a8ea170eb25069c058806fec167..cbd8d3720c2bbe3c9a173ce947be6f87fe3464c9 100644 --- a/kernel/bpf/bpf_lru_list.h +++ b/kernel/bpf/bpf_lru_list.h @@ -58,7 +58,6 @@ struct bpf_lru { del_from_htab_func del_from_htab; void *del_arg; unsigned int hash_offset; - unsigned int target_free; unsigned int nr_scans; bool percpu; }; diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 94470ea4d17a2e040a379e0dfb5460a9def3084f..12b42de56693593a56d306413d783f2910a6e5f4 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -2259,8 +2259,8 @@ static unsigned int __bpf_prog_ret0_warn(const void *ctx, } #endif -static bool __bpf_prog_map_compatible(struct bpf_map *map, - const struct bpf_prog *fp) +bool bpf_prog_map_compatible(struct bpf_map *map, + const struct bpf_prog *fp) { enum bpf_prog_type prog_type = resolve_prog_type(fp); bool ret; @@ -2269,6 +2269,14 @@ static bool __bpf_prog_map_compatible(struct bpf_map *map, if (fp->kprobe_override) return false; + /* XDP programs inserted into maps are not guaranteed to run on + * a particular netdev (and can run outside driver context entirely + * in the case of devmap and cpumap). Until device checks + * are implemented, prohibit adding dev-bound programs to program maps. + */ + if (bpf_prog_is_dev_bound(aux)) + return false; + spin_lock(&map->owner.lock); if (!map->owner.type) { /* There's no owner yet where we could check for @@ -2302,19 +2310,6 @@ static bool __bpf_prog_map_compatible(struct bpf_map *map, return ret; } -bool bpf_prog_map_compatible(struct bpf_map *map, const struct bpf_prog *fp) -{ - /* XDP programs inserted into maps are not guaranteed to run on - * a particular netdev (and can run outside driver context entirely - * in the case of devmap and cpumap). Until device checks - * are implemented, prohibit adding dev-bound programs to program maps. - */ - if (bpf_prog_is_dev_bound(fp->aux)) - return false; - - return __bpf_prog_map_compatible(map, fp); -} - static int bpf_check_tail_call(const struct bpf_prog *fp) { struct bpf_prog_aux *aux = fp->aux; @@ -2327,7 +2322,7 @@ static int bpf_check_tail_call(const struct bpf_prog *fp) if (!map_type_contains_progs(map)) continue; - if (!__bpf_prog_map_compatible(map, fp)) { + if (!bpf_prog_map_compatible(map, fp)) { ret = -EINVAL; goto out; } @@ -2365,7 +2360,7 @@ struct bpf_prog *bpf_prog_select_runtime(struct bpf_prog *fp, int *err) /* In case of BPF to BPF calls, verifier did all the prep * work with regards to JITing, etc. */ - bool jit_needed = fp->jit_requested; + bool jit_needed = false; if (fp->bpf_func) goto finalize; diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index 4b20a72ab8cffeb16fb3dfabdce61a558aa96662..41d62405c85214cd3a4a6bbe9b2c2eaa0bbef331 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -128,8 +128,7 @@ const struct bpf_func_proto bpf_map_peek_elem_proto = { BPF_CALL_3(bpf_map_lookup_percpu_elem, struct bpf_map *, map, void *, key, u32, cpu) { - WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_trace_held() && - !rcu_read_lock_bh_held()); + WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_bh_held()); return (unsigned long) map->ops->map_lookup_percpu_elem(map, key, cpu); } @@ -885,13 +884,6 @@ int bpf_bprintf_prepare(char *fmt, u32 fmt_size, const u64 *raw_args, if (fmt[i] == 'p') { sizeof_cur_arg = sizeof(long); - if (fmt[i + 1] == 0 || isspace(fmt[i + 1]) || - ispunct(fmt[i + 1])) { - if (tmp_buf) - cur_arg = raw_args[num_spec]; - goto nocopy_fmt; - } - if ((fmt[i + 1] == 'k' || fmt[i + 1] == 'u') && fmt[i + 2] == 's') { fmt_ptype = fmt[i + 1]; @@ -899,9 +891,11 @@ int bpf_bprintf_prepare(char *fmt, u32 fmt_size, const u64 *raw_args, goto fmt_str; } - if (fmt[i + 1] == 'K' || + if (fmt[i + 1] == 0 || isspace(fmt[i + 1]) || + ispunct(fmt[i + 1]) || fmt[i + 1] == 'K' || fmt[i + 1] == 'x' || fmt[i + 1] == 's' || fmt[i + 1] == 'S') { + /* just kernel pointers */ if (tmp_buf) cur_arg = raw_args[num_spec]; i++; diff --git a/kernel/cgroup/legacy_freezer.c b/kernel/cgroup/legacy_freezer.c index bee2f9ea5e4aecbbd72bdbb375efa5ce3bd74df1..66d1708042a72bf5d25b9ff1d7acb8d91183ffd7 100644 --- a/kernel/cgroup/legacy_freezer.c +++ b/kernel/cgroup/legacy_freezer.c @@ -66,9 +66,15 @@ static struct freezer *parent_freezer(struct freezer *freezer) bool cgroup_freezing(struct task_struct *task) { bool ret; + unsigned int state; rcu_read_lock(); - ret = task_freezer(task)->state & CGROUP_FREEZING; + /* Check if the cgroup is still FREEZING, but not FROZEN. The extra + * !FROZEN check is required, because the FREEZING bit is not cleared + * when the state FROZEN is reached. + */ + state = task_freezer(task)->state; + ret = (state & CGROUP_FREEZING) && !(state & CGROUP_FROZEN); rcu_read_unlock(); return ret; @@ -183,12 +189,13 @@ static void freezer_attach(struct cgroup_taskset *tset) if (!(freezer->state & CGROUP_FREEZING)) { __thaw_task(task); } else { + freeze_task(task); + /* clear FROZEN and propagate upwards */ while (freezer && (freezer->state & CGROUP_FROZEN)) { freezer->state &= ~CGROUP_FROZEN; freezer = parent_freezer(freezer); } - freeze_task(task); } } diff --git a/kernel/events/core.c b/kernel/events/core.c index 3a33d9c1b1b2b43de50956bd4a960e87e3b8e063..987807b1040ae04e7d3107b653881d9a40f05c81 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -171,19 +171,6 @@ static void perf_ctx_unlock(struct perf_cpu_context *cpuctx, raw_spin_unlock(&cpuctx->ctx.lock); } -typedef struct { - struct perf_cpu_context *cpuctx; - struct perf_event_context *ctx; -} class_perf_ctx_lock_t; - -static inline void class_perf_ctx_lock_destructor(class_perf_ctx_lock_t *_T) -{ perf_ctx_unlock(_T->cpuctx, _T->ctx); } - -static inline class_perf_ctx_lock_t -class_perf_ctx_lock_constructor(struct perf_cpu_context *cpuctx, - struct perf_event_context *ctx) -{ perf_ctx_lock(cpuctx, ctx); return (class_perf_ctx_lock_t){ cpuctx, ctx }; } - #define TASK_TOMBSTONE ((void *)-1L) static bool is_kernel_event(struct perf_event *event) @@ -873,19 +860,13 @@ static void perf_cgroup_switch(struct task_struct *task) if (READ_ONCE(cpuctx->cgrp) == NULL) return; + WARN_ON_ONCE(cpuctx->ctx.nr_cgroups == 0); + cgrp = perf_cgroup_from_task(task, NULL); if (READ_ONCE(cpuctx->cgrp) == cgrp) return; - guard(perf_ctx_lock)(cpuctx, cpuctx->task_ctx); - /* - * Re-check, could've raced vs perf_remove_from_context(). - */ - if (READ_ONCE(cpuctx->cgrp) == NULL) - return; - - WARN_ON_ONCE(cpuctx->ctx.nr_cgroups == 0); - + perf_ctx_lock(cpuctx, cpuctx->task_ctx); perf_ctx_disable(&cpuctx->ctx, true); ctx_sched_out(&cpuctx->ctx, EVENT_ALL|EVENT_CGROUP); @@ -903,6 +884,7 @@ static void perf_cgroup_switch(struct task_struct *task) ctx_sched_in(&cpuctx->ctx, EVENT_ALL|EVENT_CGROUP); perf_ctx_enable(&cpuctx->ctx, true); + perf_ctx_unlock(cpuctx, cpuctx->task_ctx); } static int perf_cgroup_ensure_storage(struct perf_event *event, @@ -1181,12 +1163,6 @@ static void perf_assert_pmu_disabled(struct pmu *pmu) WARN_ON_ONCE(*this_cpu_ptr(pmu->pmu_disable_count) == 0); } -static inline void perf_pmu_read(struct perf_event *event) -{ - if (event->state == PERF_EVENT_STATE_ACTIVE) - event->pmu->read(event); -} - static void get_ctx(struct perf_event_context *ctx) { refcount_inc(&ctx->refcount); @@ -2085,9 +2061,8 @@ perf_aux_output_match(struct perf_event *event, struct perf_event *aux_event) } static void put_event(struct perf_event *event); -static void __event_disable(struct perf_event *event, - struct perf_event_context *ctx, - enum perf_event_state state); +static void event_sched_out(struct perf_event *event, + struct perf_event_context *ctx); static void perf_put_aux_event(struct perf_event *event) { @@ -2120,7 +2095,8 @@ static void perf_put_aux_event(struct perf_event *event) * state so that we don't try to schedule it again. Note * that perf_event_enable() will clear the ERROR status. */ - __event_disable(iter, ctx, PERF_EVENT_STATE_ERROR); + event_sched_out(iter, ctx); + perf_event_set_state(event, PERF_EVENT_STATE_ERROR); } } @@ -2174,6 +2150,18 @@ static inline struct list_head *get_event_list(struct perf_event *event) &event->pmu_ctx->flexible_active; } +/* + * Events that have PERF_EV_CAP_SIBLING require being part of a group and + * cannot exist on their own, schedule them out and move them into the ERROR + * state. Also see _perf_event_enable(), it will not be able to recover + * this ERROR state. + */ +static inline void perf_remove_sibling_event(struct perf_event *event) +{ + event_sched_out(event, event->ctx); + perf_event_set_state(event, PERF_EVENT_STATE_ERROR); +} + static void perf_group_detach(struct perf_event *event) { struct perf_event *leader = event->group_leader; @@ -2209,15 +2197,8 @@ static void perf_group_detach(struct perf_event *event) */ list_for_each_entry_safe(sibling, tmp, &event->sibling_list, sibling_list) { - /* - * Events that have PERF_EV_CAP_SIBLING require being part of - * a group and cannot exist on their own, schedule them out - * and move them into the ERROR state. Also see - * _perf_event_enable(), it will not be able to recover this - * ERROR state. - */ if (sibling->event_caps & PERF_EV_CAP_SIBLING) - __event_disable(sibling, ctx, PERF_EVENT_STATE_ERROR); + perf_remove_sibling_event(sibling); sibling->group_leader = sibling; list_del_init(&sibling->sibling_list); @@ -2450,15 +2431,6 @@ static void perf_remove_from_context(struct perf_event *event, unsigned long fla event_function_call(event, __perf_remove_from_context, (void *)flags); } -static void __event_disable(struct perf_event *event, - struct perf_event_context *ctx, - enum perf_event_state state) -{ - event_sched_out(event, ctx); - perf_cgroup_event_disable(event, ctx); - perf_event_set_state(event, state); -} - /* * Cross CPU call to disable a performance event */ @@ -2477,18 +2449,13 @@ static void __perf_event_disable(struct perf_event *event, perf_pmu_disable(event->pmu_ctx->pmu); - /* - * When disabling a group leader, the whole group becomes ineligible - * to run, so schedule out the full group. - */ if (event == event->group_leader) group_sched_out(event, ctx); + else + event_sched_out(event, ctx); - /* - * But only mark the leader OFF; the siblings will remain - * INACTIVE. - */ - __event_disable(event, ctx, PERF_EVENT_STATE_OFF); + perf_event_set_state(event, PERF_EVENT_STATE_OFF); + perf_cgroup_event_disable(event, ctx); perf_pmu_enable(event->pmu_ctx->pmu); } @@ -3430,7 +3397,8 @@ static void __perf_event_sync_stat(struct perf_event *event, * we know the event must be on the current CPU, therefore we * don't need to use it. */ - perf_pmu_read(event); + if (event->state == PERF_EVENT_STATE_ACTIVE) + event->pmu->read(event); perf_event_update_time(event); @@ -4556,8 +4524,15 @@ static void __perf_event_read(void *info) pmu->read(event); - for_each_sibling_event(sub, event) - perf_pmu_read(sub); + for_each_sibling_event(sub, event) { + if (sub->state == PERF_EVENT_STATE_ACTIVE) { + /* + * Use sibling's PMU rather than @event's since + * sibling could be on different (eg: software) PMU. + */ + sub->pmu->read(sub); + } + } data->ret = pmu->commit_txn(pmu); @@ -5940,9 +5915,6 @@ static int perf_event_set_output(struct perf_event *event, static int perf_event_set_filter(struct perf_event *event, void __user *arg); static int perf_copy_attr(struct perf_event_attr __user *uattr, struct perf_event_attr *attr); -static int __perf_event_set_bpf_prog(struct perf_event *event, - struct bpf_prog *prog, - u64 bpf_cookie); static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned long arg) { @@ -6011,7 +5983,7 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon if (IS_ERR(prog)) return PTR_ERR(prog); - err = __perf_event_set_bpf_prog(event, prog, 0); + err = perf_event_set_bpf_prog(event, prog, 0); if (err) { bpf_prog_put(prog); return err; @@ -7014,10 +6986,6 @@ perf_sample_ustack_size(u16 stack_size, u16 header_size, if (!regs) return 0; - /* No mm, no stack, no dump. */ - if (!current->mm) - return 0; - /* * Check if we fit in with the requested stack size into the: * - TASK_SIZE @@ -7329,8 +7297,9 @@ static void perf_output_read_group(struct perf_output_handle *handle, if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) values[n++] = running; - if ((leader != event) && !handle->skip_read) - perf_pmu_read(leader); + if ((leader != event) && + (leader->state == PERF_EVENT_STATE_ACTIVE)) + leader->pmu->read(leader); values[n++] = perf_event_count(leader); if (read_format & PERF_FORMAT_ID) @@ -7343,8 +7312,9 @@ static void perf_output_read_group(struct perf_output_handle *handle, for_each_sibling_event(sub, leader) { n = 0; - if ((sub != event) && !handle->skip_read) - perf_pmu_read(sub); + if ((sub != event) && + (sub->state == PERF_EVENT_STATE_ACTIVE)) + sub->pmu->read(sub); values[n++] = perf_event_count(sub); if (read_format & PERF_FORMAT_ID) @@ -7399,9 +7369,6 @@ void perf_output_sample(struct perf_output_handle *handle, { u64 sample_type = data->type; - if (data->sample_flags & PERF_SAMPLE_READ) - handle->skip_read = 1; - perf_output_put(handle, *header); if (sample_type & PERF_SAMPLE_IDENTIFIER) @@ -7716,9 +7683,6 @@ perf_callchain(struct perf_event *event, struct pt_regs *regs) const u32 max_stack = event->attr.sample_max_stack; struct perf_callchain_entry *callchain; - if (!current->mm) - user = false; - if (!kernel && !user) return &__empty_callchain; @@ -9590,14 +9554,14 @@ __perf_event_account_interrupt(struct perf_event *event, int throttle) hwc->interrupts = 1; } else { hwc->interrupts++; - } - - if (unlikely(throttle && hwc->interrupts >= max_samples_per_tick)) { - __this_cpu_inc(perf_throttled_count); - tick_dep_set_cpu(smp_processor_id(), TICK_DEP_BIT_PERF_EVENTS); - hwc->interrupts = MAX_INTERRUPTS; - perf_log_throttle(event, 0); - ret = 1; + if (unlikely(throttle && + hwc->interrupts > max_samples_per_tick)) { + __this_cpu_inc(perf_throttled_count); + tick_dep_set_cpu(smp_processor_id(), TICK_DEP_BIT_PERF_EVENTS); + hwc->interrupts = MAX_INTERRUPTS; + perf_log_throttle(event, 0); + ret = 1; + } } if (event->attr.freq) { @@ -10473,7 +10437,7 @@ static int perf_uprobe_event_init(struct perf_event *event) if (event->attr.type != perf_uprobe.type) return -ENOENT; - if (!capable(CAP_SYS_ADMIN)) + if (!perfmon_capable()) return -EACCES; /* @@ -10620,9 +10584,8 @@ static inline bool perf_event_is_tracing(struct perf_event *event) return false; } -static int __perf_event_set_bpf_prog(struct perf_event *event, - struct bpf_prog *prog, - u64 bpf_cookie) +int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog, + u64 bpf_cookie) { bool is_kprobe, is_uprobe, is_tracepoint, is_syscall_tp; @@ -10660,20 +10623,6 @@ static int __perf_event_set_bpf_prog(struct perf_event *event, return perf_event_attach_bpf_prog(event, prog, bpf_cookie); } -int perf_event_set_bpf_prog(struct perf_event *event, - struct bpf_prog *prog, - u64 bpf_cookie) -{ - struct perf_event_context *ctx; - int ret; - - ctx = perf_event_ctx_lock(event); - ret = __perf_event_set_bpf_prog(event, prog, bpf_cookie); - perf_event_ctx_unlock(event, ctx); - - return ret; -} - void perf_event_free_bpf_prog(struct perf_event *event) { if (!perf_event_is_tracing(event)) { @@ -10693,15 +10642,7 @@ static void perf_event_free_filter(struct perf_event *event) { } -static int __perf_event_set_bpf_prog(struct perf_event *event, - struct bpf_prog *prog, - u64 bpf_cookie) -{ - return -ENOENT; -} - -int perf_event_set_bpf_prog(struct perf_event *event, - struct bpf_prog *prog, +int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog, u64 bpf_cookie) { return -ENOENT; diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c index dc1193b779c080849521dc7d67f5b6e1c12bbf64..52de76ef8723b86d571e470d9fbfecd3cee3829b 100644 --- a/kernel/events/ring_buffer.c +++ b/kernel/events/ring_buffer.c @@ -181,7 +181,6 @@ __perf_output_begin(struct perf_output_handle *handle, handle->rb = rb; handle->event = event; - handle->flags = 0; have_lost = local_read(&rb->lost); if (unlikely(have_lost)) { diff --git a/kernel/exit.c b/kernel/exit.c index 8505bc7cdc3eed9ac78dde63f4dba19f71e864d9..513ad92c84f2503e04408258843e1e660d98c25b 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -872,15 +872,6 @@ void __noreturn do_exit(long code) tsk->exit_code = code; taskstats_exit(tsk, group_dead); - /* - * Since sampling can touch ->mm, make sure to stop everything before we - * tear it down. - * - * Also flushes inherited counters to the parent - before the parent - * gets woken up by child-exit notifications. - */ - perf_event_exit_task(tsk); - exit_mm(); if (group_dead) @@ -897,6 +888,14 @@ void __noreturn do_exit(long code) exit_task_work(tsk); exit_thread(tsk); + /* + * Flush inherited counters to the parent - before the parent + * gets woken up by child-exit notifications. + * + * because of cgroup mode, must be called before cgroup_exit() + */ + perf_event_exit_task(tsk); + sched_autogroup_exit_task(tsk); cgroup_exit(tsk); diff --git a/kernel/fork.c b/kernel/fork.c index 0907f94005c842af29e28933e4a60c40a0f11337..5455e1319cb9b52283b747bf939431c41405bee8 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -525,6 +525,10 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) vma_numab_state_init(new); dup_anon_vma_name(orig, new); + /* track_pfn_copy() will later take care of copying internal state. */ + if (unlikely(new->vm_flags & VM_PFNMAP)) + untrack_pfn_clear(new); + return new; } @@ -718,11 +722,6 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, tmp = vm_area_dup(mpnt); if (!tmp) goto fail_nomem; - - /* track_pfn_copy() will later take care of copying internal state. */ - if (unlikely(tmp->vm_flags & VM_PFNMAP)) - untrack_pfn_clear(tmp); - retval = vma_dup_policy(mpnt, tmp); if (retval) goto fail_nomem_policy; diff --git a/kernel/padata.c b/kernel/padata.c index 93cd7704ab63e6609d72f8db07e043a69251778b..071d8cad807871ec49656c63ac7e8da2a29a865b 100644 --- a/kernel/padata.c +++ b/kernel/padata.c @@ -358,8 +358,7 @@ static void padata_reorder(struct parallel_data *pd) * To avoid UAF issue, add pd ref here, and put pd ref after reorder_work finish. */ padata_get_pd(pd); - if (!queue_work(pinst->serial_wq, &pd->reorder_work)) - padata_put_pd(pd); + queue_work(pinst->serial_wq, &pd->reorder_work); } } diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 76dcf2e28427f2c0ed76332d9acc630f5f7a0f8a..c2fc58938dee5d700adc411c45b5b77aa862ff5a 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c @@ -80,11 +80,6 @@ void hibernate_release(void) atomic_inc(&hibernate_atomic); } -bool hibernation_in_progress(void) -{ - return !atomic_read(&hibernate_atomic); -} - bool hibernation_available(void) { return nohibernate == 0 && diff --git a/kernel/power/main.c b/kernel/power/main.c index a3543bd2d25afc775b36502534e5b3f5458f1727..f6425ae3e8b05585fc5b147283257beabdcbcc0d 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -585,8 +585,7 @@ bool pm_debug_messages_on __read_mostly; bool pm_debug_messages_should_print(void) { - return pm_debug_messages_on && (hibernation_in_progress() || - pm_suspend_target_state != PM_SUSPEND_ON); + return pm_debug_messages_on && pm_suspend_target_state != PM_SUSPEND_ON; } EXPORT_SYMBOL_GPL(pm_debug_messages_should_print); diff --git a/kernel/power/power.h b/kernel/power/power.h index 62a7cb452a4be6acbc8891de091ce1b25e510e7e..a98f95e309a338c5a895ebbdff15f21f2ba730d9 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h @@ -66,14 +66,10 @@ extern void enable_restore_image_protection(void); static inline void enable_restore_image_protection(void) {} #endif /* CONFIG_STRICT_KERNEL_RWX */ -extern bool hibernation_in_progress(void); - #else /* !CONFIG_HIBERNATION */ static inline void hibernate_reserved_size_init(void) {} static inline void hibernate_image_size_init(void) {} - -static inline bool hibernation_in_progress(void) { return false; } #endif /* !CONFIG_HIBERNATION */ #define power_attr(_name) \ diff --git a/kernel/power/wakelock.c b/kernel/power/wakelock.c index 4e941999a53ba69410f4526d5d55c32312c36140..52571dcad768b988eaadbd3ce98a4ac42dd2f7dd 100644 --- a/kernel/power/wakelock.c +++ b/kernel/power/wakelock.c @@ -49,9 +49,6 @@ ssize_t pm_show_wakelocks(char *buf, bool show_active) len += sysfs_emit_at(buf, len, "%s ", wl->name); } - if (len > 0) - --len; - len += sysfs_emit_at(buf, len, "\n"); mutex_unlock(&wakelocks_lock); diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 536acebf22b0d02bbc0651a48a5ab22c99e20e48..fda08520c75c58b97bf06b7bc06995974fa4b9ef 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -754,10 +754,6 @@ static int dyntick_save_progress_counter(struct rcu_data *rdp) return 0; } -#ifndef arch_irq_stat_cpu -#define arch_irq_stat_cpu(cpu) 0 -#endif - /* * Returns positive if the specified CPU has passed through a quiescent state * by virtue of being in or having passed through an dynticks idle state since @@ -893,9 +889,9 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp) rsrp->cputime_irq = kcpustat_field(kcsp, CPUTIME_IRQ, cpu); rsrp->cputime_softirq = kcpustat_field(kcsp, CPUTIME_SOFTIRQ, cpu); rsrp->cputime_system = kcpustat_field(kcsp, CPUTIME_SYSTEM, cpu); - rsrp->nr_hardirqs = kstat_cpu_irqs_sum(cpu) + arch_irq_stat_cpu(cpu); - rsrp->nr_softirqs = kstat_cpu_softirqs_sum(cpu); - rsrp->nr_csw = nr_context_switches_cpu(cpu); + rsrp->nr_hardirqs = kstat_cpu_irqs_sum(rdp->cpu); + rsrp->nr_softirqs = kstat_cpu_softirqs_sum(rdp->cpu); + rsrp->nr_csw = nr_context_switches_cpu(rdp->cpu); rsrp->jiffies = jiffies; rsrp->gp_seq = rdp->gp_seq; } @@ -2699,10 +2695,6 @@ __call_rcu_common(struct rcu_head *head, rcu_callback_t func, bool lazy_in) /* Misaligned rcu_head! */ WARN_ON_ONCE((unsigned long)head & (sizeof(void *) - 1)); - /* Avoid NULL dereference if callback is NULL. */ - if (WARN_ON_ONCE(!func)) - return; - if (debug_rcu_head_queue(head)) { /* * Probable double call_rcu(), so leak the callback. diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h index ac8cc756920ddfe06e1f6c409910c9b634d9d6c2..9eb43b501ff5c86a62805c0e708413f0ee85df7b 100644 --- a/kernel/rcu/tree.h +++ b/kernel/rcu/tree.h @@ -169,7 +169,7 @@ struct rcu_snap_record { u64 cputime_irq; /* Accumulated cputime of hard irqs */ u64 cputime_softirq;/* Accumulated cputime of soft irqs */ u64 cputime_system; /* Accumulated cputime of kernel tasks */ - u64 nr_hardirqs; /* Accumulated number of hard irqs */ + unsigned long nr_hardirqs; /* Accumulated number of hard irqs */ unsigned int nr_softirqs; /* Accumulated number of soft irqs */ unsigned long long nr_csw; /* Accumulated number of task switches */ unsigned long jiffies; /* Track jiffies value */ diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index 94b715139f52d97118ec4eaf5d09517a984466be..41021080ad258d7f68d43762ceb2299266754712 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h @@ -821,17 +821,8 @@ void rcu_read_unlock_strict(void) { struct rcu_data *rdp; - if (irqs_disabled() || in_atomic_preempt_off() || !rcu_state.gp_kthread) + if (irqs_disabled() || preempt_count() || !rcu_state.gp_kthread) return; - - /* - * rcu_report_qs_rdp() can only be invoked with a stable rdp and - * from the local CPU. - * - * The in_atomic_preempt_off() check ensures that we come here holding - * the last preempt_count (which will get dropped once we return to - * __rcu_read_unlock(). - */ rdp = this_cpu_ptr(&rcu_data); rdp->cpu_no_qs.b.norm = false; rcu_report_qs_rdp(rdp); @@ -972,16 +963,13 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp) */ static void rcu_flavor_sched_clock_irq(int user) { - if (user || rcu_is_cpu_rrupt_from_idle() || - (IS_ENABLED(CONFIG_PREEMPT_COUNT) && - (preempt_count() == HARDIRQ_OFFSET))) { + if (user || rcu_is_cpu_rrupt_from_idle()) { /* * Get here if this CPU took its interrupt from user - * mode, from the idle loop without this being a nested - * interrupt, or while not holding the task preempt count - * (with PREEMPT_COUNT=y). In this case, the CPU is in a - * quiescent state, so note it. + * mode or from the idle loop, and if this is not a + * nested interrupt. In this case, the CPU is in + * a quiescent state, so note it. * * No memory barrier is required here because rcu_qs() * references only CPU-local variables that other CPUs diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h index aab91040b83b1698e46bab0105f053c543808c34..11a1fac3a58985e16566a0ae40ea5f1757104237 100644 --- a/kernel/rcu/tree_stall.h +++ b/kernel/rcu/tree_stall.h @@ -452,8 +452,8 @@ static void print_cpu_stat_info(int cpu) rsr.cputime_system = kcpustat_field(kcsp, CPUTIME_SYSTEM, cpu); pr_err("\t hardirqs softirqs csw/system\n"); - pr_err("\t number: %8lld %10d %12lld\n", - kstat_cpu_irqs_sum(cpu) + arch_irq_stat_cpu(cpu) - rsrp->nr_hardirqs, + pr_err("\t number: %8ld %10d %12lld\n", + kstat_cpu_irqs_sum(cpu) - rsrp->nr_hardirqs, kstat_cpu_softirqs_sum(cpu) - rsrp->nr_softirqs, nr_context_switches_cpu(cpu) - rsrp->nr_csw); pr_err("\tcputime: %8lld %10lld %12lld ==> %d(ms)\n", diff --git a/kernel/resource.c b/kernel/resource.c index 6506839f8a811860b5d7f650e4bb0d71770ae159..635e858db0fe8102be3f5948c5018d4219275ea4 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -1222,9 +1222,8 @@ static int __request_region_locked(struct resource *res, struct resource *parent * become unavailable to other users. Conflicts are * not expected. Warn to aid debugging if encountered. */ - if (parent == &iomem_resource && - conflict->desc == IORES_DESC_DEVICE_PRIVATE_MEMORY) { - pr_warn("Unaddressable device %s %pR conflicts with %pR\n", + if (conflict->desc == IORES_DESC_DEVICE_PRIVATE_MEMORY) { + pr_warn("Unaddressable device %s %pR conflicts with %pR", conflict->name, conflict, res); } if (conflict != parent) { diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 74b319785b446935e1b75cdcdbf530fd213f7b1e..76732f1afb89dc2ac64718eccb48f56ce41b5821 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -121,10 +121,10 @@ unsigned int sysctl_sched_tunable_scaling = SCHED_TUNABLESCALING_LOG; /* * Minimal preemption granularity for CPU-bound tasks: * - * (default: 0.70 msec * (1 + ilog(ncpus)), units: nanoseconds) + * (default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds) */ -unsigned int sysctl_sched_base_slice = 700000ULL; -static unsigned int normalized_sysctl_sched_base_slice = 700000ULL; +unsigned int sysctl_sched_base_slice = 750000ULL; +static unsigned int normalized_sysctl_sched_base_slice = 750000ULL; /* * This value is kept at sysctl_sched_latency/sysctl_sched_min_granularity diff --git a/kernel/sched/loadavg.c b/kernel/sched/loadavg.c index 35537ea03fff0d6a9b6c8919e00807fd2944ca2d..52c8f8226b0d3590425ec8237634b5d8e0148b99 100644 --- a/kernel/sched/loadavg.c +++ b/kernel/sched/loadavg.c @@ -80,7 +80,7 @@ long calc_load_fold_active(struct rq *this_rq, long adjust) long nr_active, delta = 0; nr_active = this_rq->nr_running - adjust; - nr_active += (long)this_rq->nr_uninterruptible; + nr_active += (int)this_rq->nr_uninterruptible; if (nr_active != this_rq->calc_load_active) { delta = nr_active - this_rq->calc_load_active; diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index fd883922cee7ca086f6e6f524858deccfd96a10e..e079a51cc60aba81062a804e8e31efd90c0b2d4f 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1115,7 +1115,7 @@ struct rq { * one CPU and if it got migrated afterwards it may decrease * it on another CPU. Always updated under the runqueue lock: */ - unsigned long nr_uninterruptible; + unsigned int nr_uninterruptible; struct task_struct __rcu *curr; struct task_struct *idle; diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 353829883e66de19d02a5d3b641012a704916d97..3130f24daf5979be4f1122531b81bb3777bdd478 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -288,7 +288,7 @@ static void clocksource_verify_choose_cpus(void) { int cpu, i, n = verify_n_cpus; - if (n < 0 || n >= num_online_cpus()) { + if (n < 0) { /* Check all of the CPUs. */ cpumask_copy(&cpus_chosen, cpu_online_mask); cpumask_clear_cpu(smp_processor_id(), &cpus_chosen); diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c index 9af1f2a72a0ab305471972f1366faf0df42f69b8..e9c6f9d0e42ce42e837e9d83c046031ff797a4f8 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c @@ -1437,15 +1437,6 @@ void run_posix_cpu_timers(void) lockdep_assert_irqs_disabled(); - /* - * Ensure that release_task(tsk) can't happen while - * handle_posix_cpu_timers() is running. Otherwise, a concurrent - * posix_cpu_timer_del() may fail to lock_task_sighand(tsk) and - * miss timer->it.cpu.firing != 0. - */ - if (tsk->exit_state) - return; - /* * If the actual expiry is deferred to task work context and the * work is already scheduled there is no point to do anything here. diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 8903db0b5960269479f4efcb0cd6d27db49f92e4..97f660a8ddc73d102a8e877482c49de135a0c28c 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1834,7 +1834,7 @@ static struct pt_regs *get_bpf_raw_tp_regs(void) struct bpf_raw_tp_regs *tp_regs = this_cpu_ptr(&bpf_raw_tp_regs); int nest_level = this_cpu_inc_return(bpf_raw_tp_nest_level); - if (nest_level > ARRAY_SIZE(tp_regs->regs)) { + if (WARN_ON_ONCE(nest_level > ARRAY_SIZE(tp_regs->regs))) { this_cpu_dec(bpf_raw_tp_nest_level); return ERR_PTR(-EBUSY); } diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 4351b9069a919dd907dc6a214df5a6769ae59a63..650493ed76cd40143dfbccad6d3a64342dea72fc 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -6772,10 +6772,9 @@ void ftrace_release_mod(struct module *mod) mutex_lock(&ftrace_lock); - /* - * To avoid the UAF problem after the module is unloaded, the - * 'mod_map' resource needs to be released unconditionally. - */ + if (ftrace_disabled) + goto out_unlock; + list_for_each_entry_safe(mod_map, n, &ftrace_mod_maps, list) { if (mod_map->mod == mod) { list_del_rcu(&mod_map->list); @@ -6784,9 +6783,6 @@ void ftrace_release_mod(struct module *mod) } } - if (ftrace_disabled) - goto out_unlock; - /* * Each module has its own ftrace_pages, remove * them from the list. diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index e3afb830fbcc7b06adb8a045eddb975d713947ba..faf892aecdf4907c07ea325526e855fe96bcbacd 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1643,9 +1643,6 @@ extern int event_enable_register_trigger(char *glob, extern void event_enable_unregister_trigger(char *glob, struct event_trigger_data *test, struct trace_event_file *file); -extern struct event_trigger_data * -trigger_data_alloc(struct event_command *cmd_ops, char *cmd, char *param, - void *private_data); extern void trigger_data_free(struct event_trigger_data *data); extern int event_trigger_init(struct event_trigger_data *data); extern int trace_event_trigger_enable_disable(struct trace_event_file *file, @@ -1672,6 +1669,11 @@ extern bool event_trigger_check_remove(const char *glob); extern bool event_trigger_empty_param(const char *param); extern int event_trigger_separate_filter(char *param_and_filter, char **param, char **filter, bool param_required); +extern struct event_trigger_data * +event_trigger_alloc(struct event_command *cmd_ops, + char *cmd, + char *param, + void *private_data); extern int event_trigger_parse_num(char *trigger, struct event_trigger_data *trigger_data); extern int event_trigger_set_filter(struct event_command *cmd_ops, diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 7b3c55bb0235a7e8d6a2d576fedd15d098391c87..5f74e9f9c8a7344f49a193273a07c820d0b7ead1 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -2845,10 +2845,7 @@ __register_event(struct trace_event_call *call, struct module *mod) if (ret < 0) return ret; - down_write(&trace_event_sem); list_add(&call->list, &ftrace_events); - up_write(&trace_event_sem); - if (call->flags & TRACE_EVENT_FL_DYNAMIC) atomic_set(&call->refcnt, 0); else @@ -3440,8 +3437,6 @@ __trace_add_event_dirs(struct trace_array *tr) struct trace_event_call *call; int ret; - lockdep_assert_held(&trace_event_sem); - list_for_each_entry(call, &ftrace_events, list) { ret = __trace_add_new_event(call, tr); if (ret < 0) diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 88985aefb71ff85a8e01b83df7837e6a3217e9d0..e6f9cbc622c75953bb99d628581dad287c1391aa 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -5257,94 +5257,17 @@ hist_trigger_actions(struct hist_trigger_data *hist_data, } } -/* - * The hist_pad structure is used to save information to create - * a histogram from the histogram trigger. It's too big to store - * on the stack, so when the histogram trigger is initialized - * a percpu array of 4 hist_pad structures is allocated. - * This will cover every context from normal, softirq, irq and NMI - * in the very unlikely event that a tigger happens at each of - * these contexts and interrupts a currently active trigger. - */ -struct hist_pad { - unsigned long entries[HIST_STACKTRACE_DEPTH]; - u64 var_ref_vals[TRACING_MAP_VARS_MAX]; - char compound_key[HIST_KEY_SIZE_MAX]; -}; - -static struct hist_pad __percpu *hist_pads; -static DEFINE_PER_CPU(int, hist_pad_cnt); -static refcount_t hist_pad_ref; - -/* One hist_pad for every context (normal, softirq, irq, NMI) */ -#define MAX_HIST_CNT 4 - -static int alloc_hist_pad(void) -{ - lockdep_assert_held(&event_mutex); - - if (refcount_read(&hist_pad_ref)) { - refcount_inc(&hist_pad_ref); - return 0; - } - - hist_pads = __alloc_percpu(sizeof(struct hist_pad) * MAX_HIST_CNT, - __alignof__(struct hist_pad)); - if (!hist_pads) - return -ENOMEM; - - refcount_set(&hist_pad_ref, 1); - return 0; -} - -static void free_hist_pad(void) -{ - lockdep_assert_held(&event_mutex); - - if (!refcount_dec_and_test(&hist_pad_ref)) - return; - - free_percpu(hist_pads); - hist_pads = NULL; -} - -static struct hist_pad *get_hist_pad(void) -{ - struct hist_pad *hist_pad; - int cnt; - - if (WARN_ON_ONCE(!hist_pads)) - return NULL; - - preempt_disable(); - - hist_pad = per_cpu_ptr(hist_pads, smp_processor_id()); - - if (this_cpu_read(hist_pad_cnt) == MAX_HIST_CNT) { - preempt_enable(); - return NULL; - } - - cnt = this_cpu_inc_return(hist_pad_cnt) - 1; - - return &hist_pad[cnt]; -} - -static void put_hist_pad(void) -{ - this_cpu_dec(hist_pad_cnt); - preempt_enable(); -} - static void event_hist_trigger(struct event_trigger_data *data, struct trace_buffer *buffer, void *rec, struct ring_buffer_event *rbe) { struct hist_trigger_data *hist_data = data->private_data; bool use_compound_key = (hist_data->n_keys > 1); + unsigned long entries[HIST_STACKTRACE_DEPTH]; + u64 var_ref_vals[TRACING_MAP_VARS_MAX]; + char compound_key[HIST_KEY_SIZE_MAX]; struct tracing_map_elt *elt = NULL; struct hist_field *key_field; - struct hist_pad *hist_pad; u64 field_contents; void *key = NULL; unsigned int i; @@ -5352,18 +5275,12 @@ static void event_hist_trigger(struct event_trigger_data *data, if (unlikely(!rbe)) return; - hist_pad = get_hist_pad(); - if (!hist_pad) - return; - - memset(hist_pad->compound_key, 0, hist_data->key_size); + memset(compound_key, 0, hist_data->key_size); for_each_hist_key_field(i, hist_data) { key_field = hist_data->fields[i]; if (key_field->flags & HIST_FIELD_FL_STACKTRACE) { - unsigned long *entries = hist_pad->entries; - memset(entries, 0, HIST_STACKTRACE_SIZE); if (key_field->field) { unsigned long *stack, n_entries; @@ -5387,31 +5304,26 @@ static void event_hist_trigger(struct event_trigger_data *data, } if (use_compound_key) - add_to_key(hist_pad->compound_key, key, key_field, rec); + add_to_key(compound_key, key, key_field, rec); } if (use_compound_key) - key = hist_pad->compound_key; + key = compound_key; if (hist_data->n_var_refs && - !resolve_var_refs(hist_data, key, hist_pad->var_ref_vals, false)) - goto out; + !resolve_var_refs(hist_data, key, var_ref_vals, false)) + return; elt = tracing_map_insert(hist_data->map, key); if (!elt) - goto out; + return; - hist_trigger_elt_update(hist_data, elt, buffer, rec, rbe, hist_pad->var_ref_vals); + hist_trigger_elt_update(hist_data, elt, buffer, rec, rbe, var_ref_vals); - if (resolve_var_refs(hist_data, key, hist_pad->var_ref_vals, true)) { - hist_trigger_actions(hist_data, elt, buffer, rec, rbe, - key, hist_pad->var_ref_vals); - } + if (resolve_var_refs(hist_data, key, var_ref_vals, true)) + hist_trigger_actions(hist_data, elt, buffer, rec, rbe, key, var_ref_vals); hist_poll_wakeup(); - - out: - put_hist_pad(); } static void hist_trigger_stacktrace_print(struct seq_file *m, @@ -6256,9 +6168,6 @@ static int event_hist_trigger_init(struct event_trigger_data *data) { struct hist_trigger_data *hist_data = data->private_data; - if (alloc_hist_pad() < 0) - return -ENOMEM; - if (!data->ref && hist_data->attrs->name) save_named_trigger(hist_data->attrs->name, data); @@ -6303,7 +6212,6 @@ static void event_hist_trigger_free(struct event_trigger_data *data) destroy_hist_data(hist_data); } - free_hist_pad(); } static struct event_trigger_ops event_hist_trigger_ops = { @@ -6319,7 +6227,9 @@ static int event_hist_trigger_named_init(struct event_trigger_data *data) save_named_trigger(data->named_data->name, data); - return event_hist_trigger_init(data->named_data); + event_hist_trigger_init(data->named_data); + + return 0; } static void event_hist_trigger_named_free(struct event_trigger_data *data) @@ -6806,7 +6716,7 @@ static int event_hist_trigger_parse(struct event_command *cmd_ops, return PTR_ERR(hist_data); } - trigger_data = trigger_data_alloc(cmd_ops, cmd, param, hist_data); + trigger_data = event_trigger_alloc(cmd_ops, cmd, param, hist_data); if (!trigger_data) { ret = -ENOMEM; goto out_free; diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c index fe079ff82ef1bf5fba1df3be5c6c679842213d45..2c233c0d38fa95044c0c7402fb82ede4c620ab8c 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c @@ -809,7 +809,7 @@ int event_trigger_separate_filter(char *param_and_filter, char **param, } /** - * trigger_data_alloc - allocate and init event_trigger_data for a trigger + * event_trigger_alloc - allocate and init event_trigger_data for a trigger * @cmd_ops: The event_command operations for the trigger * @cmd: The cmd string * @param: The param string @@ -820,14 +820,14 @@ int event_trigger_separate_filter(char *param_and_filter, char **param, * trigger_ops to assign to the event_trigger_data. @private_data can * also be passed in and associated with the event_trigger_data. * - * Use trigger_data_free() to free an event_trigger_data object. + * Use event_trigger_free() to free an event_trigger_data object. * * Return: The trigger_data object success, NULL otherwise */ -struct event_trigger_data *trigger_data_alloc(struct event_command *cmd_ops, - char *cmd, - char *param, - void *private_data) +struct event_trigger_data *event_trigger_alloc(struct event_command *cmd_ops, + char *cmd, + char *param, + void *private_data) { struct event_trigger_data *trigger_data; struct event_trigger_ops *trigger_ops; @@ -994,13 +994,13 @@ event_trigger_parse(struct event_command *cmd_ops, return ret; ret = -ENOMEM; - trigger_data = trigger_data_alloc(cmd_ops, cmd, param, file); + trigger_data = event_trigger_alloc(cmd_ops, cmd, param, file); if (!trigger_data) goto out; if (remove) { event_trigger_unregister(cmd_ops, file, glob+1, trigger_data); - trigger_data_free(trigger_data); + kfree(trigger_data); ret = 0; goto out; } @@ -1027,7 +1027,7 @@ event_trigger_parse(struct event_command *cmd_ops, out_free: event_trigger_reset_filter(cmd_ops, trigger_data); - trigger_data_free(trigger_data); + kfree(trigger_data); goto out; } @@ -1787,7 +1787,7 @@ int event_enable_trigger_parse(struct event_command *cmd_ops, enable_data->enable = enable; enable_data->file = event_enable_file; - trigger_data = trigger_data_alloc(cmd_ops, cmd, param, enable_data); + trigger_data = event_trigger_alloc(cmd_ops, cmd, param, enable_data); if (!trigger_data) { kfree(enable_data); goto out; diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c index 4d12d02965a4b72fbd3a9f580a1f06916b7de1c3..5bd781359d38b0c2c824bed4cbdcae2485ebb081 100644 --- a/kernel/trace/trace_osnoise.c +++ b/kernel/trace/trace_osnoise.c @@ -665,8 +665,8 @@ __timerlat_dump_stack(struct trace_buffer *buffer, struct trace_stack *fstack, u entry = ring_buffer_event_data(event); - entry->size = fstack->nr_entries; memcpy(&entry->caller, fstack->calls, size); + entry->size = fstack->nr_entries; if (!call_filter_check_discard(call, entry, buffer, event)) trace_buffer_unlock_commit_nostack(buffer, event); diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c index 187b1fc403c13db2be9ff4fb8b17950634c3c61c..694f32d843d90cb3a3f947104419444fa3fe9254 100644 --- a/kernel/trace/trace_probe.c +++ b/kernel/trace/trace_probe.c @@ -656,7 +656,7 @@ static int parse_btf_arg(char *varname, ret = query_btf_context(ctx); if (ret < 0 || ctx->nr_params == 0) { trace_probe_log_err(ctx->offset, NO_BTF_ENTRY); - return -ENOENT; + return PTR_ERR(params); } } params = ctx->params; diff --git a/kernel/watchdog.c b/kernel/watchdog.c index f3d305751a2a302707927debb98da797d297284a..c904872be06cc24993bd8cea0b08001eb5843e96 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -41,7 +41,6 @@ int __read_mostly watchdog_user_enabled = 1; static int __read_mostly watchdog_hardlockup_user_enabled = WATCHDOG_HARDLOCKUP_DEFAULT; static int __read_mostly watchdog_softlockup_user_enabled = 1; int __read_mostly watchdog_thresh = 10; -static int __read_mostly watchdog_thresh_next; static int __read_mostly watchdog_hardlockup_available; struct cpumask watchdog_cpumask __read_mostly; @@ -657,20 +656,12 @@ int lockup_detector_offline_cpu(unsigned int cpu) return 0; } -static void __lockup_detector_reconfigure(bool thresh_changed) +static void __lockup_detector_reconfigure(void) { cpus_read_lock(); watchdog_hardlockup_stop(); softlockup_stop_all(); - /* - * To prevent watchdog_timer_fn from using the old interval and - * the new watchdog_thresh at the same time, which could lead to - * false softlockup reports, it is necessary to update the - * watchdog_thresh after the softlockup is completed. - */ - if (thresh_changed) - watchdog_thresh = READ_ONCE(watchdog_thresh_next); set_sample_period(); lockup_detector_update_enable(); if (watchdog_enabled && watchdog_thresh) @@ -688,7 +679,7 @@ static void __lockup_detector_reconfigure(bool thresh_changed) void lockup_detector_reconfigure(void) { mutex_lock(&watchdog_mutex); - __lockup_detector_reconfigure(false); + __lockup_detector_reconfigure(); mutex_unlock(&watchdog_mutex); } @@ -708,29 +699,27 @@ static __init void lockup_detector_setup(void) return; mutex_lock(&watchdog_mutex); - __lockup_detector_reconfigure(false); + __lockup_detector_reconfigure(); softlockup_initialized = true; mutex_unlock(&watchdog_mutex); } #else /* CONFIG_SOFTLOCKUP_DETECTOR */ -static void __lockup_detector_reconfigure(bool thresh_changed) +static void __lockup_detector_reconfigure(void) { cpus_read_lock(); watchdog_hardlockup_stop(); - if (thresh_changed) - watchdog_thresh = READ_ONCE(watchdog_thresh_next); lockup_detector_update_enable(); watchdog_hardlockup_start(); cpus_read_unlock(); } void lockup_detector_reconfigure(void) { - __lockup_detector_reconfigure(false); + __lockup_detector_reconfigure(); } static inline void lockup_detector_setup(void) { - __lockup_detector_reconfigure(false); + __lockup_detector_reconfigure(); } #endif /* !CONFIG_SOFTLOCKUP_DETECTOR */ @@ -766,11 +755,11 @@ void lockup_detector_soft_poweroff(void) #ifdef CONFIG_SYSCTL /* Propagate any changes to the watchdog infrastructure */ -static void proc_watchdog_update(bool thresh_changed) +static void proc_watchdog_update(void) { /* Remove impossible cpus to keep sysctl output clean. */ cpumask_and(&watchdog_cpumask, &watchdog_cpumask, cpu_possible_mask); - __lockup_detector_reconfigure(thresh_changed); + __lockup_detector_reconfigure(); } /* @@ -803,7 +792,7 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write, old = READ_ONCE(*param); err = proc_dointvec_minmax(table, write, buffer, lenp, ppos); if (!err && old != READ_ONCE(*param)) - proc_watchdog_update(false); + proc_watchdog_update(); } mutex_unlock(&watchdog_mutex); return err; @@ -852,13 +841,11 @@ int proc_watchdog_thresh(struct ctl_table *table, int write, mutex_lock(&watchdog_mutex); - watchdog_thresh_next = READ_ONCE(watchdog_thresh); - - old = watchdog_thresh_next; + old = READ_ONCE(watchdog_thresh); err = proc_dointvec_minmax(table, write, buffer, lenp, ppos); - if (!err && write && old != READ_ONCE(watchdog_thresh_next)) - proc_watchdog_update(true); + if (!err && write && old != READ_ONCE(watchdog_thresh)) + proc_watchdog_update(); mutex_unlock(&watchdog_mutex); return err; @@ -879,7 +866,7 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write, err = proc_do_large_bitmap(table, write, buffer, lenp, ppos); if (!err && write) - proc_watchdog_update(false); + proc_watchdog_update(); mutex_unlock(&watchdog_mutex); return err; @@ -899,7 +886,7 @@ static struct ctl_table watchdog_sysctls[] = { }, { .procname = "watchdog_thresh", - .data = &watchdog_thresh_next, + .data = &watchdog_thresh, .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_watchdog_thresh, diff --git a/lib/Kconfig b/lib/Kconfig index 43d69669465aff06e4f0993a3ebbe24cfff1015d..ee365b7402f193ef510ebd46cabae9c004da11b5 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -751,7 +751,6 @@ config GENERIC_LIB_DEVMEM_IS_ALLOWED config PLDMFW bool - select CRC32 default n config ASN1_ENCODER diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 61322c961e22792d5f826c981df03369224972ab..2dcb380a4ba3b4657b9b5950ba1ea7d64d6bc590 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -2754,15 +2754,6 @@ config FORTIFY_KUNIT_TEST by the str*() and mem*() family of functions. For testing runtime traps of FORTIFY_SOURCE, see LKDTM's "FORTIFY_*" tests. -config LONGEST_SYM_KUNIT_TEST - tristate "Test the longest symbol possible" if !KUNIT_ALL_TESTS - depends on KUNIT && KPROBES - default KUNIT_ALL_TESTS - help - Tests the longest symbol possible - - If unsure, say N. - config HW_BREAKPOINT_KUNIT_TEST bool "Test hw_breakpoint constraints accounting" if !KUNIT_ALL_TESTS depends on HAVE_HW_BREAKPOINT diff --git a/lib/Makefile b/lib/Makefile index b9d2577fbbe19085be71b0eeb196523978c1e6f8..740109b6e2c89f0748d4ed5013139db0803c9bb2 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -402,8 +402,6 @@ obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fortify_kunit.o obj-$(CONFIG_STRCAT_KUNIT_TEST) += strcat_kunit.o obj-$(CONFIG_STRSCPY_KUNIT_TEST) += strscpy_kunit.o obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o -obj-$(CONFIG_LONGEST_SYM_KUNIT_TEST) += longest_symbol_kunit.o -CFLAGS_longest_symbol_kunit.o += $(call cc-disable-warning, missing-prototypes) obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o diff --git a/lib/group_cpus.c b/lib/group_cpus.c index 18d43a406114b9ffb192cbc2783bf23194ee7cf8..ee272c4cefcc13907ce9f211f479615d2e3c9154 100644 --- a/lib/group_cpus.c +++ b/lib/group_cpus.c @@ -352,9 +352,6 @@ struct cpumask *group_cpus_evenly(unsigned int numgrps) int ret = -ENOMEM; struct cpumask *masks = NULL; - if (numgrps == 0) - return NULL; - if (!zalloc_cpumask_var(&nmsk, GFP_KERNEL)) return NULL; @@ -429,12 +426,8 @@ struct cpumask *group_cpus_evenly(unsigned int numgrps) #else /* CONFIG_SMP */ struct cpumask *group_cpus_evenly(unsigned int numgrps) { - struct cpumask *masks; + struct cpumask *masks = kcalloc(numgrps, sizeof(*masks), GFP_KERNEL); - if (numgrps == 0) - return NULL; - - masks = kcalloc(numgrps, sizeof(*masks), GFP_KERNEL); if (!masks) return NULL; diff --git a/lib/kunit/static_stub.c b/lib/kunit/static_stub.c index 484fd85251b4152ccee8d4ca5c04794c262270e0..92b2cccd5e7633d0c02d78f90e0b5307d2013af5 100644 --- a/lib/kunit/static_stub.c +++ b/lib/kunit/static_stub.c @@ -96,7 +96,7 @@ void __kunit_activate_static_stub(struct kunit *test, /* If the replacement address is NULL, deactivate the stub. */ if (!replacement_addr) { - kunit_deactivate_static_stub(test, real_fn_addr); + kunit_deactivate_static_stub(test, replacement_addr); return; } diff --git a/lib/longest_symbol_kunit.c b/lib/longest_symbol_kunit.c deleted file mode 100644 index 2fea82a6d34e5c7a4c02cac72c6540b5c911c4f8..0000000000000000000000000000000000000000 --- a/lib/longest_symbol_kunit.c +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Test the longest symbol length. Execute with: - * ./tools/testing/kunit/kunit.py run longest-symbol - * --arch=x86_64 --kconfig_add CONFIG_KPROBES=y --kconfig_add CONFIG_MODULES=y - * --kconfig_add CONFIG_RETPOLINE=n --kconfig_add CONFIG_CFI_CLANG=n - * --kconfig_add CONFIG_MITIGATION_RETPOLINE=n - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include -#include -#include -#include - -#define DI(name) s##name##name -#define DDI(name) DI(n##name##name) -#define DDDI(name) DDI(n##name##name) -#define DDDDI(name) DDDI(n##name##name) -#define DDDDDI(name) DDDDI(n##name##name) - -/*Generate a symbol whose name length is 511 */ -#define LONGEST_SYM_NAME DDDDDI(g1h2i3j4k5l6m7n) - -#define RETURN_LONGEST_SYM 0xAAAAA - -noinline int LONGEST_SYM_NAME(void); -noinline int LONGEST_SYM_NAME(void) -{ - return RETURN_LONGEST_SYM; -} - -_Static_assert(sizeof(__stringify(LONGEST_SYM_NAME)) == KSYM_NAME_LEN, -"Incorrect symbol length found. Expected KSYM_NAME_LEN: " -__stringify(KSYM_NAME_LEN) ", but found: " -__stringify(sizeof(LONGEST_SYM_NAME))); - -static void test_longest_symbol(struct kunit *test) -{ - KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, LONGEST_SYM_NAME()); -}; - -static void test_longest_symbol_kallsyms(struct kunit *test) -{ - unsigned long (*kallsyms_lookup_name)(const char *name); - static int (*longest_sym)(void); - - struct kprobe kp = { - .symbol_name = "kallsyms_lookup_name", - }; - - if (register_kprobe(&kp) < 0) { - pr_info("%s: kprobe not registered", __func__); - KUNIT_FAIL(test, "test_longest_symbol kallsyms: kprobe not registered\n"); - return; - } - - kunit_warn(test, "test_longest_symbol kallsyms: kprobe registered\n"); - kallsyms_lookup_name = (unsigned long (*)(const char *name))kp.addr; - unregister_kprobe(&kp); - - longest_sym = - (void *) kallsyms_lookup_name(__stringify(LONGEST_SYM_NAME)); - KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, longest_sym()); -}; - -static struct kunit_case longest_symbol_test_cases[] = { - KUNIT_CASE(test_longest_symbol), - KUNIT_CASE(test_longest_symbol_kallsyms), - {} -}; - -static struct kunit_suite longest_symbol_test_suite = { - .name = "longest-symbol", - .test_cases = longest_symbol_test_cases, -}; -kunit_test_suite(longest_symbol_test_suite); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Test the longest symbol length"); -MODULE_AUTHOR("Sergio González Collado"); diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 6f7a2c9cf922a23a6cc4fa42eaac54bc8f154767..a4a2592413b1b67c1269f500dad321dfd2b84fa5 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -5270,7 +5270,6 @@ static void mt_destroy_walk(struct maple_enode *enode, struct maple_tree *mt, struct maple_enode *start; if (mte_is_leaf(enode)) { - mte_set_node_dead(enode); node->type = mte_node_type(enode); goto free_leaf; } @@ -5498,7 +5497,7 @@ int mas_preallocate(struct ma_state *mas, void *entry, gfp_t gfp) /* At this point, we are at the leaf node that needs to be altered. */ /* Exact fit, no nodes needed. */ if (wr_mas.r_min == mas->index && wr_mas.r_max == mas->last) - goto set_flag; + return 0; mas_wr_end_piv(&wr_mas); node_size = mas_wr_new_end(&wr_mas); @@ -5507,10 +5506,10 @@ int mas_preallocate(struct ma_state *mas, void *entry, gfp_t gfp) if (node_size == wr_mas.node_end) { /* reuse node */ if (!mt_in_rcu(mas->tree)) - goto set_flag; + return 0; /* shifting boundary */ if (wr_mas.offset_end - mas->offset == 1) - goto set_flag; + return 0; } if (node_size >= mt_slots[wr_mas.type]) { @@ -5529,13 +5528,10 @@ int mas_preallocate(struct ma_state *mas, void *entry, gfp_t gfp) /* node store, slot store needs one node */ ask_now: - mas->mas_flags &= ~MA_STATE_PREALLOC; mas_node_count_gfp(mas, request, gfp); - if (likely(!mas_is_err(mas))) { -set_flag: - mas->mas_flags |= MA_STATE_PREALLOC; + mas->mas_flags |= MA_STATE_PREALLOC; + if (likely(!mas_is_err(mas))) return 0; - } mas_set_alloc_req(mas, 0); ret = xa_err(mas->node); diff --git a/lib/test_objagg.c b/lib/test_objagg.c index c0f7bb53db8d5c4d632baeddbddf716cc444ff0f..c0c957c50635415b00b5ce526c2b25efc4ac370e 100644 --- a/lib/test_objagg.c +++ b/lib/test_objagg.c @@ -899,10 +899,8 @@ static int check_expect_hints_stats(struct objagg_hints *objagg_hints, int err; stats = objagg_hints_stats_get(objagg_hints); - if (IS_ERR(stats)) { - *errmsg = "objagg_hints_stats_get() failed."; + if (IS_ERR(stats)) return PTR_ERR(stats); - } err = __check_expect_stats(stats, expect_stats, errmsg); objagg_stats_put(stats); return err; diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index 19d661889cf796ed4e401a000d06cea51a41a955..26c948f87489ee1cdf9d97de9877ebc23185a8ed 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -376,7 +376,6 @@ static ssize_t memcg_path_store(struct kobject *kobj, return -ENOMEM; strscpy(path, buf, count + 1); - kfree(filter->memcg_path); filter->memcg_path = path; return count; } diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 78f5df12b8eb376261845b6804ce6d88b3d2e341..635f0f0f6860e8afa71a40fd2da642aa2ebb69cf 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -2260,14 +2260,12 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, { spinlock_t *ptl; struct mmu_notifier_range range; - bool pmd_migration; mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, vma->vm_mm, address & HPAGE_PMD_MASK, (address & HPAGE_PMD_MASK) + HPAGE_PMD_SIZE); mmu_notifier_invalidate_range_start(&range); ptl = pmd_lock(vma->vm_mm, pmd); - pmd_migration = is_pmd_migration_entry(*pmd); /* * If caller asks to setup a migration entry, we need a folio to check @@ -2276,12 +2274,13 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, VM_BUG_ON(freeze && !folio); VM_WARN_ON_ONCE(folio && !folio_test_locked(folio)); - if (pmd_trans_huge(*pmd) || pmd_devmap(*pmd) || pmd_migration) { + if (pmd_trans_huge(*pmd) || pmd_devmap(*pmd) || + is_pmd_migration_entry(*pmd)) { /* - * Do not apply pmd_folio() to a migration entry; and folio lock - * guarantees that it must be of the wrong folio anyway. + * It's safe to call pmd_page when folio is set because it's + * guaranteed that pmd is present. */ - if (folio && (pmd_migration || folio != page_folio(pmd_page(*pmd)))) + if (folio && folio != page_folio(pmd_page(*pmd))) goto out; __split_huge_pmd_locked(vma, pmd, range.start, freeze); } diff --git a/mm/hugetlb.c b/mm/hugetlb.c index d57d8f1c2dfea4062bdf1105a14a61fc2e60f8ce..7c196b754071bd979f2ef651860745da00f59095 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -96,7 +96,7 @@ static void hugetlb_vma_lock_free(struct vm_area_struct *vma); static void hugetlb_vma_lock_alloc(struct vm_area_struct *vma); static void __hugetlb_vma_unlock_write_free(struct vm_area_struct *vma); static void hugetlb_unshare_pmds(struct vm_area_struct *vma, - unsigned long start, unsigned long end, bool take_locks); + unsigned long start, unsigned long end); static struct resv_map *vma_resv_map(struct vm_area_struct *vma); static inline bool subpool_is_free(struct hugepage_subpool *spool) @@ -4903,40 +4903,26 @@ static int hugetlb_vm_op_split(struct vm_area_struct *vma, unsigned long addr) { if (addr & ~(huge_page_mask(hstate_vma(vma)))) return -EINVAL; - return 0; -} -void hugetlb_split(struct vm_area_struct *vma, unsigned long addr) -{ /* * PMD sharing is only possible for PUD_SIZE-aligned address ranges * in HugeTLB VMAs. If we will lose PUD_SIZE alignment due to this * split, unshare PMDs in the PUD_SIZE interval surrounding addr now. - * This function is called in the middle of a VMA split operation, with - * MM, VMA and rmap all write-locked to prevent concurrent page table - * walks (except hardware and gup_fast()). */ - vma_assert_write_locked(vma); - i_mmap_assert_write_locked(vma->vm_file->f_mapping); - if (addr & ~PUD_MASK) { + /* + * hugetlb_vm_op_split is called right before we attempt to + * split the VMA. We will need to unshare PMDs in the old and + * new VMAs, so let's unshare before we split. + */ unsigned long floor = addr & PUD_MASK; unsigned long ceil = floor + PUD_SIZE; - if (floor >= vma->vm_start && ceil <= vma->vm_end) { - /* - * Locking: - * Use take_locks=false here. - * The file rmap lock is already held. - * The hugetlb VMA lock can't be taken when we already - * hold the file rmap lock, and we don't need it because - * its purpose is to synchronize against concurrent page - * table walks, which are not possible thanks to the - * locks held by our caller. - */ - hugetlb_unshare_pmds(vma, floor, ceil, /* take_locks = */ false); - } + if (floor >= vma->vm_start && ceil <= vma->vm_end) + hugetlb_unshare_pmds(vma, floor, ceil); } + + return 0; } static unsigned long hugetlb_vm_op_pagesize(struct vm_area_struct *vma) @@ -7076,13 +7062,6 @@ int huge_pmd_unshare(struct mm_struct *mm, struct vm_area_struct *vma, return 0; pud_clear(pud); - /* - * Once our caller drops the rmap lock, some other process might be - * using this page table as a normal, non-hugetlb page table. - * Wait for pending gup_fast() in other threads to finish before letting - * that happen. - */ - tlb_remove_table_sync_one(); ptdesc_pmd_pts_dec(virt_to_ptdesc(ptep)); mm_dec_nr_pmds(mm); return 1; @@ -7319,16 +7298,9 @@ void move_hugetlb_state(struct folio *old_folio, struct folio *new_folio, int re } } -/* - * If @take_locks is false, the caller must ensure that no concurrent page table - * access can happen (except for gup_fast() and hardware page walks). - * If @take_locks is true, we take the hugetlb VMA lock (to lock out things like - * concurrent page fault handling) and the file rmap lock. - */ static void hugetlb_unshare_pmds(struct vm_area_struct *vma, unsigned long start, - unsigned long end, - bool take_locks) + unsigned long end) { struct hstate *h = hstate_vma(vma); unsigned long sz = huge_page_size(h); @@ -7352,12 +7324,8 @@ static void hugetlb_unshare_pmds(struct vm_area_struct *vma, mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, mm, start, end); mmu_notifier_invalidate_range_start(&range); - if (take_locks) { - hugetlb_vma_lock_write(vma); - i_mmap_lock_write(vma->vm_file->f_mapping); - } else { - i_mmap_assert_write_locked(vma->vm_file->f_mapping); - } + hugetlb_vma_lock_write(vma); + i_mmap_lock_write(vma->vm_file->f_mapping); for (address = start; address < end; address += PUD_SIZE) { ptep = hugetlb_walk(vma, address, sz); if (!ptep) @@ -7367,10 +7335,8 @@ static void hugetlb_unshare_pmds(struct vm_area_struct *vma, spin_unlock(ptl); } flush_hugetlb_tlb_range(vma, start, end); - if (take_locks) { - i_mmap_unlock_write(vma->vm_file->f_mapping); - hugetlb_vma_unlock_write(vma); - } + i_mmap_unlock_write(vma->vm_file->f_mapping); + hugetlb_vma_unlock_write(vma); /* * No need to call mmu_notifier_arch_invalidate_secondary_tlbs(), see * Documentation/mm/mmu_notifier.rst. @@ -7385,8 +7351,7 @@ static void hugetlb_unshare_pmds(struct vm_area_struct *vma, void hugetlb_unshare_all_pmds(struct vm_area_struct *vma) { hugetlb_unshare_pmds(vma, ALIGN(vma->vm_start, PUD_SIZE), - ALIGN_DOWN(vma->vm_end, PUD_SIZE), - /* take_locks = */ true); + ALIGN_DOWN(vma->vm_end, PUD_SIZE)); } #ifdef CONFIG_CMA diff --git a/mm/kasan/report.c b/mm/kasan/report.c index 7301773b5208a48c358600b17602e7bc443a1d67..ecced40e5103202249ac399d6142bfa97d7faa07 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -385,10 +385,17 @@ static void print_address_description(void *addr, u8 tag, } if (is_vmalloc_addr(addr)) { - pr_err("The buggy address belongs to a"); - if (!vmalloc_dump_obj(addr)) - pr_cont(" vmalloc virtual mapping\n"); - page = vmalloc_to_page(addr); + struct vm_struct *va = find_vm_area(addr); + + if (va) { + pr_err("The buggy address belongs to the virtual mapping at\n" + " [%px, %px) created by:\n" + " %pS\n", + va->addr, va->addr + va->size, va->caller); + pr_err("\n"); + + page = vmalloc_to_page(addr); + } } if (page) { @@ -531,7 +538,7 @@ void kasan_report_invalid_free(void *ptr, unsigned long ip, enum kasan_report_ty start_report(&flags, true); - __memset(&info, 0, sizeof(info)); + memset(&info, 0, sizeof(info)); info.type = type; info.access_addr = ptr; info.access_size = 0; @@ -569,7 +576,7 @@ bool kasan_report(const void *addr, size_t size, bool is_write, start_report(&irq_flags, true); - __memset(&info, 0, sizeof(info)); + memset(&info, 0, sizeof(info)); info.type = KASAN_REPORT_ACCESS; info.access_addr = addr; info.access_size = size; diff --git a/mm/kasan/shadow.c b/mm/kasan/shadow.c index d687f09a7ae37f3227cb57f3ada0517b66afb777..dd772f9d0f08028fa46a969d4ec34d8fc17e6cbd 100644 --- a/mm/kasan/shadow.c +++ b/mm/kasan/shadow.c @@ -324,7 +324,7 @@ static int kasan_populate_vmalloc_pte(pte_t *ptep, unsigned long addr, if (!page) return -ENOMEM; - __memset((void *)page, KASAN_VMALLOC_INVALID, PAGE_SIZE); + memset((void *)page, KASAN_VMALLOC_INVALID, PAGE_SIZE); pte = pfn_pte(PFN_DOWN(__pa(page)), PAGE_KERNEL); spin_lock(&init_mm.page_table_lock); diff --git a/mm/khugepaged.c b/mm/khugepaged.c index f227b39ae4cf747dfdff8160b67058e52ddf4e6c..a87cfe1d4b7beb71ad471ad7ed46a6f64378d7ac 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -2387,7 +2387,7 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages, int *result, VM_BUG_ON(khugepaged_scan.address < hstart || khugepaged_scan.address + HPAGE_PMD_SIZE > hend); - if (IS_ENABLED(CONFIG_SHMEM) && !vma_is_anonymous(vma)) { + if (IS_ENABLED(CONFIG_SHMEM) && vma->vm_file) { struct file *file = get_file(vma->vm_file); pgoff_t pgoff = linear_page_index(vma, khugepaged_scan.address); @@ -2734,7 +2734,7 @@ int madvise_collapse(struct vm_area_struct *vma, struct vm_area_struct **prev, mmap_assert_locked(mm); memset(cc->node_load, 0, sizeof(cc->node_load)); nodes_clear(cc->alloc_nmask); - if (IS_ENABLED(CONFIG_SHMEM) && !vma_is_anonymous(vma)) { + if (IS_ENABLED(CONFIG_SHMEM) && vma->vm_file) { struct file *file = get_file(vma->vm_file); pgoff_t pgoff = linear_page_index(vma, addr); diff --git a/mm/memcontrol.c b/mm/memcontrol.c index b0872c08069f2a9cd34a9c4fd94a1806898456d9..31dd770767e928304125ff7ad1fd4e2d9bd2c115 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1291,6 +1291,7 @@ void mem_cgroup_scan_tasks(struct mem_cgroup *memcg, { struct mem_cgroup *iter; int ret = 0; + int i = 0; BUG_ON(mem_cgroup_is_root(memcg)); @@ -1300,9 +1301,10 @@ void mem_cgroup_scan_tasks(struct mem_cgroup *memcg, css_task_iter_start(&iter->css, CSS_TASK_ITER_PROCS, &it); while (!ret && (task = css_task_iter_next(&it))) { - ret = fn(task, arg); /* Avoid potential softlockup warning */ - cond_resched(); + if ((++i & 1023) == 0) + cond_resched(); + ret = fn(task, arg); } css_task_iter_end(&it); if (ret) { diff --git a/mm/mmap.c b/mm/mmap.c index 32502a813f2860f0e9c634db70556a5bda85b607..4b9f1b246d4208c1b7629d167fdedbfdcfce5bca 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -2422,13 +2422,7 @@ int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma, init_vma_prep(&vp, vma); vp.insert = new; vma_prepare(&vp); - /* - * Get rid of huge pages and shared page tables straddling the split - * boundary. - */ vma_adjust_trans_huge(vma, vma->vm_start, addr, 0); - if (is_vm_hugetlb_page(vma)) - hugetlb_split(vma, addr); if (new_below) { vma->vm_start = addr; diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 9ceb841af819e477f4c02c9bd76cd30de4ffc746..e632ec9b642109e4fd7a626c677680c1d65cc5c4 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -541,8 +541,8 @@ static int dirty_ratio_handler(struct ctl_table *table, int write, void *buffer, ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); if (ret == 0 && write && vm_dirty_ratio != old_ratio) { - vm_dirty_bytes = 0; writeback_set_ratelimit(); + vm_dirty_bytes = 0; } return ret; } diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e9357c1a5443139e4e7ed8886d003deda8c7a3d1..d7ad5b972c8b03ff91b0315fb94f882397cde8a0 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -4079,14 +4079,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, } retry: - /* - * Deal with possible cpuset update races or zonelist updates to avoid - * infinite retries. - */ - if (check_retry_cpuset(cpuset_mems_cookie, ac) || - check_retry_zonelist(zonelist_iter_cookie)) - goto restart; - /* Ensure kswapd doesn't accidentally go to sleep as long as we loop */ if (alloc_flags & ALLOC_KSWAPD) wake_all_kswapds(order, gfp_mask, ac); diff --git a/mm/secretmem.c b/mm/secretmem.c index 4bedf491a8a74266fd2fc9b0365bc487c6882f20..399552814fd0ffaa00c598bb60f3203e5378c220 100644 --- a/mm/secretmem.c +++ b/mm/secretmem.c @@ -195,10 +195,19 @@ static struct file *secretmem_file_create(unsigned long flags) struct file *file; struct inode *inode; const char *anon_name = "[secretmem]"; + const struct qstr qname = QSTR_INIT(anon_name, strlen(anon_name)); + int err; - inode = anon_inode_make_secure_inode(secretmem_mnt->mnt_sb, anon_name, NULL); + inode = alloc_anon_inode(secretmem_mnt->mnt_sb); if (IS_ERR(inode)) return ERR_CAST(inode); + + err = security_inode_init_security_anon(inode, &qname, NULL); + if (err) { + file = ERR_PTR(err); + goto err_free_inode; + } + file = alloc_file_pseudo(inode, secretmem_mnt, "secretmem", O_RDWR, &secretmem_fops); if (IS_ERR(file)) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 7eb92bcdbd8c16cbd8c040a945d3886aafacf5d9..fb947787f25da2af38ea353257f833fa1227dd93 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -459,7 +459,6 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, pgprot_t prot, struct page **pages, int *nr, pgtbl_mod_mask *mask) { - int err = 0; pte_t *pte; /* @@ -473,25 +472,18 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr, do { struct page *page = pages[*nr]; - if (WARN_ON(!pte_none(ptep_get(pte)))) { - err = -EBUSY; - break; - } - if (WARN_ON(!page)) { - err = -ENOMEM; - break; - } - if (WARN_ON(!pfn_valid(page_to_pfn(page)))) { - err = -EINVAL; - break; - } + if (WARN_ON(!pte_none(ptep_get(pte)))) + return -EBUSY; + if (WARN_ON(!page)) + return -ENOMEM; + if (WARN_ON(!pfn_valid(page_to_pfn(page)))) + return -EINVAL; set_pte_at(&init_mm, addr, pte, mk_pte(page, prot)); (*nr)++; } while (pte++, addr += PAGE_SIZE, addr != end); *mask |= PGTBL_PTE_MODIFIED; - - return err; + return 0; } static int vmap_pages_pmd_range(pud_t *pud, unsigned long addr, diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index c82070167d8aa8a1d304affbce7625dd0c851e24..b58f957429f053e1a4ba2fd1f87e5d0819975e10 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -988,9 +988,6 @@ static struct zspage *alloc_zspage(struct zs_pool *pool, if (!zspage) return NULL; - if (!IS_ENABLED(CONFIG_COMPACTION)) - gfp &= ~__GFP_MOVABLE; - zspage->magic = ZSPAGE_MAGIC; migrate_lock_init(zspage); diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 422f726346ea5192f454b57ef805f5ae0c95b12c..b477ba37a6991fa8dbd342f9f0c4d042ca4a03ae 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c @@ -358,35 +358,6 @@ static int __vlan_device_event(struct net_device *dev, unsigned long event) return err; } -static void vlan_vid0_add(struct net_device *dev) -{ - struct vlan_info *vlan_info; - int err; - - if (!(dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) - return; - - pr_info("adding VLAN 0 to HW filter on device %s\n", dev->name); - - err = vlan_vid_add(dev, htons(ETH_P_8021Q), 0); - if (err) - return; - - vlan_info = rtnl_dereference(dev->vlan_info); - vlan_info->auto_vid0 = true; -} - -static void vlan_vid0_del(struct net_device *dev) -{ - struct vlan_info *vlan_info = rtnl_dereference(dev->vlan_info); - - if (!vlan_info || !vlan_info->auto_vid0) - return; - - vlan_info->auto_vid0 = false; - vlan_vid_del(dev, htons(ETH_P_8021Q), 0); -} - static int vlan_device_event(struct notifier_block *unused, unsigned long event, void *ptr) { @@ -408,10 +379,15 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, return notifier_from_errno(err); } - if (event == NETDEV_UP) - vlan_vid0_add(dev); - else if (event == NETDEV_DOWN) - vlan_vid0_del(dev); + if ((event == NETDEV_UP) && + (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) { + pr_info("adding VLAN 0 to HW filter on device %s\n", + dev->name); + vlan_vid_add(dev, htons(ETH_P_8021Q), 0); + } + if (event == NETDEV_DOWN && + (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) + vlan_vid_del(dev, htons(ETH_P_8021Q), 0); vlan_info = rtnl_dereference(dev->vlan_info); if (!vlan_info) diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h index c7ffe591d59366de4bc31ff3decc853b5bffa675..5eaf38875554b0dcfdf2bba4c00f42da2786f2b1 100644 --- a/net/8021q/vlan.h +++ b/net/8021q/vlan.h @@ -33,7 +33,6 @@ struct vlan_info { struct vlan_group grp; struct list_head vid_list; unsigned int nr_vids; - bool auto_vid0; struct rcu_head rcu; }; diff --git a/net/Makefile b/net/Makefile index 45f3fbaae644e167fde0e2b63b935a21745f0fe7..4c4dc535453dff3a11d230ebde5dbdd03c687f2b 100644 --- a/net/Makefile +++ b/net/Makefile @@ -17,7 +17,7 @@ obj-$(CONFIG_NETFILTER) += netfilter/ obj-$(CONFIG_INET) += ipv4/ obj-$(CONFIG_TLS) += tls/ obj-$(CONFIG_XFRM) += xfrm/ -obj-$(CONFIG_UNIX) += unix/ +obj-$(CONFIG_UNIX_SCM) += unix/ obj-y += ipv6/ obj-$(CONFIG_BPFILTER) += bpfilter/ obj-$(CONFIG_PACKET) += packet/ diff --git a/net/appletalk/aarp.c b/net/appletalk/aarp.c index 0d7c14a496681949ec97b8e09aa15aac42de39ee..c7236daa24152a10cec6c7c9a34f8a86367ebd21 100644 --- a/net/appletalk/aarp.c +++ b/net/appletalk/aarp.c @@ -35,7 +35,6 @@ #include #include #include -#include int sysctl_aarp_expiry_time = AARP_EXPIRY_TIME; int sysctl_aarp_tick_time = AARP_TICK_TIME; @@ -45,7 +44,6 @@ int sysctl_aarp_resolve_time = AARP_RESOLVE_TIME; /* Lists of aarp entries */ /** * struct aarp_entry - AARP entry - * @refcnt: Reference count * @last_sent: Last time we xmitted the aarp request * @packet_queue: Queue of frames wait for resolution * @status: Used for proxy AARP @@ -57,7 +55,6 @@ int sysctl_aarp_resolve_time = AARP_RESOLVE_TIME; * @next: Next entry in chain */ struct aarp_entry { - refcount_t refcnt; /* These first two are only used for unresolved entries */ unsigned long last_sent; struct sk_buff_head packet_queue; @@ -82,17 +79,6 @@ static DEFINE_RWLOCK(aarp_lock); /* Used to walk the list and purge/kick entries. */ static struct timer_list aarp_timer; -static inline void aarp_entry_get(struct aarp_entry *a) -{ - refcount_inc(&a->refcnt); -} - -static inline void aarp_entry_put(struct aarp_entry *a) -{ - if (refcount_dec_and_test(&a->refcnt)) - kfree(a); -} - /* * Delete an aarp queue * @@ -101,7 +87,7 @@ static inline void aarp_entry_put(struct aarp_entry *a) static void __aarp_expire(struct aarp_entry *a) { skb_queue_purge(&a->packet_queue); - aarp_entry_put(a); + kfree(a); } /* @@ -394,11 +380,9 @@ static void aarp_purge(void) static struct aarp_entry *aarp_alloc(void) { struct aarp_entry *a = kmalloc(sizeof(*a), GFP_ATOMIC); - if (!a) - return NULL; - refcount_set(&a->refcnt, 1); - skb_queue_head_init(&a->packet_queue); + if (a) + skb_queue_head_init(&a->packet_queue); return a; } @@ -524,7 +508,6 @@ int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa) entry->dev = atif->dev; write_lock_bh(&aarp_lock); - aarp_entry_get(entry); hash = sa->s_node % (AARP_HASH_SIZE - 1); entry->next = proxies[hash]; @@ -550,7 +533,6 @@ int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa) retval = 1; } - aarp_entry_put(entry); write_unlock_bh(&aarp_lock); out: return retval; diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index febb1617e1a6a700100d852709a7e144918fe872..b070a89912000a12e72f5c729fae1b968a674632 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c @@ -563,7 +563,6 @@ static int atrtr_create(struct rtentry *r, struct net_device *devhint) /* Fill in the routing entry */ rt->target = ta->sat_addr; - dev_put(rt->dev); /* Release old device */ dev_hold(devhint); rt->dev = devhint; rt->flags = r->rt_flags; diff --git a/net/atm/clip.c b/net/atm/clip.c index 53d62361ae4606cbc7b9f152a1f2188630694d02..294cb9efe3d3820046cd123caf7037eeb0dbe9c4 100644 --- a/net/atm/clip.c +++ b/net/atm/clip.c @@ -45,8 +45,7 @@ #include static struct net_device *clip_devs; -static struct atm_vcc __rcu *atmarpd; -static DEFINE_MUTEX(atmarpd_lock); +static struct atm_vcc *atmarpd; static struct timer_list idle_timer; static const struct neigh_ops clip_neigh_ops; @@ -54,35 +53,24 @@ static int to_atmarpd(enum atmarp_ctrl_type type, int itf, __be32 ip) { struct sock *sk; struct atmarp_ctrl *ctrl; - struct atm_vcc *vcc; struct sk_buff *skb; - int err = 0; pr_debug("(%d)\n", type); - - rcu_read_lock(); - vcc = rcu_dereference(atmarpd); - if (!vcc) { - err = -EUNATCH; - goto unlock; - } + if (!atmarpd) + return -EUNATCH; skb = alloc_skb(sizeof(struct atmarp_ctrl), GFP_ATOMIC); - if (!skb) { - err = -ENOMEM; - goto unlock; - } + if (!skb) + return -ENOMEM; ctrl = skb_put(skb, sizeof(struct atmarp_ctrl)); ctrl->type = type; ctrl->itf_num = itf; ctrl->ip = ip; - atm_force_charge(vcc, skb->truesize); + atm_force_charge(atmarpd, skb->truesize); - sk = sk_atm(vcc); + sk = sk_atm(atmarpd); skb_queue_tail(&sk->sk_receive_queue, skb); sk->sk_data_ready(sk); -unlock: - rcu_read_unlock(); - return err; + return 0; } static void link_vcc(struct clip_vcc *clip_vcc, struct atmarp_entry *entry) @@ -205,6 +193,12 @@ static void clip_push(struct atm_vcc *vcc, struct sk_buff *skb) pr_debug("\n"); + if (!clip_devs) { + atm_return(vcc, skb->truesize); + kfree_skb(skb); + return; + } + if (!skb) { pr_debug("removing VCC %p\n", clip_vcc); if (clip_vcc->entry) @@ -214,11 +208,6 @@ static void clip_push(struct atm_vcc *vcc, struct sk_buff *skb) return; } atm_return(vcc, skb->truesize); - if (!clip_devs) { - kfree_skb(skb); - return; - } - skb->dev = clip_vcc->entry ? clip_vcc->entry->neigh->dev : clip_devs; /* clip_vcc->entry == NULL if we don't have an IP address yet */ if (!skb->dev) { @@ -429,8 +418,6 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout) if (!vcc->push) return -EBADFD; - if (vcc->user_back) - return -EINVAL; clip_vcc = kmalloc(sizeof(struct clip_vcc), GFP_KERNEL); if (!clip_vcc) return -ENOMEM; @@ -621,27 +608,17 @@ static void atmarpd_close(struct atm_vcc *vcc) { pr_debug("\n"); - mutex_lock(&atmarpd_lock); - RCU_INIT_POINTER(atmarpd, NULL); - mutex_unlock(&atmarpd_lock); - - synchronize_rcu(); + rtnl_lock(); + atmarpd = NULL; skb_queue_purge(&sk_atm(vcc)->sk_receive_queue); + rtnl_unlock(); pr_debug("(done)\n"); module_put(THIS_MODULE); } -static int atmarpd_send(struct atm_vcc *vcc, struct sk_buff *skb) -{ - atm_return_tx(vcc, skb); - dev_kfree_skb_any(skb); - return 0; -} - static const struct atmdev_ops atmarpd_dev_ops = { - .close = atmarpd_close, - .send = atmarpd_send + .close = atmarpd_close }; @@ -655,18 +632,15 @@ static struct atm_dev atmarpd_dev = { static int atm_init_atmarp(struct atm_vcc *vcc) { - if (vcc->push == clip_push) - return -EINVAL; - - mutex_lock(&atmarpd_lock); + rtnl_lock(); if (atmarpd) { - mutex_unlock(&atmarpd_lock); + rtnl_unlock(); return -EADDRINUSE; } mod_timer(&idle_timer, jiffies + CLIP_CHECK_INTERVAL * HZ); - rcu_assign_pointer(atmarpd, vcc); + atmarpd = vcc; set_bit(ATM_VF_META, &vcc->flags); set_bit(ATM_VF_READY, &vcc->flags); /* allow replies and avoid getting closed if signaling dies */ @@ -675,14 +649,13 @@ static int atm_init_atmarp(struct atm_vcc *vcc) vcc->push = NULL; vcc->pop = NULL; /* crash */ vcc->push_oam = NULL; /* crash */ - mutex_unlock(&atmarpd_lock); + rtnl_unlock(); return 0; } static int clip_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) { struct atm_vcc *vcc = ATM_SD(sock); - struct sock *sk = sock->sk; int err = 0; switch (cmd) { @@ -703,18 +676,14 @@ static int clip_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) err = clip_create(arg); break; case ATMARPD_CTRL: - lock_sock(sk); err = atm_init_atmarp(vcc); if (!err) { sock->state = SS_CONNECTED; __module_get(THIS_MODULE); } - release_sock(sk); break; case ATMARP_MKIP: - lock_sock(sk); err = clip_mkip(vcc, arg); - release_sock(sk); break; case ATMARP_SETENTRY: err = clip_setentry(vcc, (__force __be32)arg); diff --git a/net/atm/common.c b/net/atm/common.c index 9cc82acbc73588103ca6279d0a46a28555f844a2..f7019df41c3e59658fcb4591389bb124e0c6d727 100644 --- a/net/atm/common.c +++ b/net/atm/common.c @@ -635,7 +635,6 @@ int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t size) skb->dev = NULL; /* for paths shared with net_device interfaces */ if (!copy_from_iter_full(skb_put(skb, size), size, &m->msg_iter)) { - atm_return_tx(vcc, skb); kfree_skb(skb); error = -EFAULT; goto out; diff --git a/net/atm/lec.c b/net/atm/lec.c index b7fa48a9b720592daaa7bcfaacee3f988bc2d534..ac3cfc1ae5102455c4b5b1af76a6a9ad16b4465a 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c @@ -124,7 +124,6 @@ static unsigned char bus_mac[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; /* Device structures */ static struct net_device *dev_lec[MAX_LEC_ITF]; -static DEFINE_MUTEX(lec_mutex); #if IS_ENABLED(CONFIG_BRIDGE) static void lec_handle_bridge(struct sk_buff *skb, struct net_device *dev) @@ -686,7 +685,6 @@ static int lec_vcc_attach(struct atm_vcc *vcc, void __user *arg) int bytes_left; struct atmlec_ioc ioc_data; - lockdep_assert_held(&lec_mutex); /* Lecd must be up in this case */ bytes_left = copy_from_user(&ioc_data, arg, sizeof(struct atmlec_ioc)); if (bytes_left != 0) @@ -712,7 +710,6 @@ static int lec_vcc_attach(struct atm_vcc *vcc, void __user *arg) static int lec_mcast_attach(struct atm_vcc *vcc, int arg) { - lockdep_assert_held(&lec_mutex); if (arg < 0 || arg >= MAX_LEC_ITF) return -EINVAL; arg = array_index_nospec(arg, MAX_LEC_ITF); @@ -728,7 +725,6 @@ static int lecd_attach(struct atm_vcc *vcc, int arg) int i; struct lec_priv *priv; - lockdep_assert_held(&lec_mutex); if (arg < 0) arg = 0; if (arg >= MAX_LEC_ITF) @@ -746,7 +742,6 @@ static int lecd_attach(struct atm_vcc *vcc, int arg) snprintf(dev_lec[i]->name, IFNAMSIZ, "lec%d", i); if (register_netdev(dev_lec[i])) { free_netdev(dev_lec[i]); - dev_lec[i] = NULL; return -EINVAL; } @@ -909,6 +904,7 @@ static void *lec_itf_walk(struct lec_state *state, loff_t *l) v = (dev && netdev_priv(dev)) ? lec_priv_walk(state, l, netdev_priv(dev)) : NULL; if (!v && dev) { + dev_put(dev); /* Partial state reset for the next time we get called */ dev = NULL; } @@ -932,7 +928,6 @@ static void *lec_seq_start(struct seq_file *seq, loff_t *pos) { struct lec_state *state = seq->private; - mutex_lock(&lec_mutex); state->itf = 0; state->dev = NULL; state->locked = NULL; @@ -950,9 +945,8 @@ static void lec_seq_stop(struct seq_file *seq, void *v) if (state->dev) { spin_unlock_irqrestore(&state->locked->lec_arp_lock, state->flags); - state->dev = NULL; + dev_put(state->dev); } - mutex_unlock(&lec_mutex); } static void *lec_seq_next(struct seq_file *seq, void *v, loff_t *pos) @@ -1009,7 +1003,6 @@ static int lane_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) return -ENOIOCTLCMD; } - mutex_lock(&lec_mutex); switch (cmd) { case ATMLEC_CTRL: err = lecd_attach(vcc, (int)arg); @@ -1024,7 +1017,6 @@ static int lane_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) break; } - mutex_unlock(&lec_mutex); return err; } diff --git a/net/atm/raw.c b/net/atm/raw.c index 1e6511ec842cbcac917d2ae0cd8f50054a06109d..2b5f78a7ec3e4a43c02eab8dba7fddbef71e42a8 100644 --- a/net/atm/raw.c +++ b/net/atm/raw.c @@ -36,7 +36,7 @@ static void atm_pop_raw(struct atm_vcc *vcc, struct sk_buff *skb) pr_debug("(%d) %d -= %d\n", vcc->vci, sk_wmem_alloc_get(sk), ATM_SKB(skb)->acct_truesize); - atm_return_tx(vcc, skb); + WARN_ON(refcount_sub_and_test(ATM_SKB(skb)->acct_truesize, &sk->sk_wmem_alloc)); dev_kfree_skb_any(skb); sk->sk_write_space(sk); } diff --git a/net/atm/resources.c b/net/atm/resources.c index b19d851e1f44391906d5206755b1d11666e845ff..995d29e7fb138cb566e8a722bd490d5d062417fb 100644 --- a/net/atm/resources.c +++ b/net/atm/resources.c @@ -146,10 +146,11 @@ void atm_dev_deregister(struct atm_dev *dev) */ mutex_lock(&atm_dev_mutex); list_del(&dev->dev_list); + mutex_unlock(&atm_dev_mutex); + atm_dev_release_vccs(dev); atm_unregister_sysfs(dev); atm_proc_dev_deregister(dev); - mutex_unlock(&atm_dev_mutex); atm_dev_put(dev); } diff --git a/net/bluetooth/eir.c b/net/bluetooth/eir.c index 3e1713673ecc93403d662238fcc13ad7a9e834e1..1bc51e2b05a3474b12b25e7f396d3475cd6944dd 100644 --- a/net/bluetooth/eir.c +++ b/net/bluetooth/eir.c @@ -366,19 +366,17 @@ u8 eir_create_scan_rsp(struct hci_dev *hdev, u8 instance, u8 *ptr) void *eir_get_service_data(u8 *eir, size_t eir_len, u16 uuid, size_t *len) { - size_t dlen; - - while ((eir = eir_get_data(eir, eir_len, EIR_SERVICE_DATA, &dlen))) { + while ((eir = eir_get_data(eir, eir_len, EIR_SERVICE_DATA, len))) { u16 value = get_unaligned_le16(eir); if (uuid == value) { if (len) - *len = dlen - 2; + *len -= 2; return &eir[2]; } - eir += dlen; - eir_len -= dlen; + eir += *len; + eir_len -= *len; } return NULL; diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 824208a53c251e4996cdbbadbdb2c852ccbcbb66..30519d47e8a69587523baac50684c393cfaab356 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -65,7 +65,7 @@ static DEFINE_IDA(hci_index_ida); /* Get HCI device by index. * Device is held on return. */ -static struct hci_dev *__hci_dev_get(int index, int *srcu_index) +struct hci_dev *hci_dev_get(int index) { struct hci_dev *hdev = NULL, *d; @@ -78,8 +78,6 @@ static struct hci_dev *__hci_dev_get(int index, int *srcu_index) list_for_each_entry(d, &hci_dev_list, list) { if (d->id == index) { hdev = hci_dev_hold(d); - if (srcu_index) - *srcu_index = srcu_read_lock(&d->srcu); break; } } @@ -87,22 +85,6 @@ static struct hci_dev *__hci_dev_get(int index, int *srcu_index) return hdev; } -struct hci_dev *hci_dev_get(int index) -{ - return __hci_dev_get(index, NULL); -} - -static struct hci_dev *hci_dev_get_srcu(int index, int *srcu_index) -{ - return __hci_dev_get(index, srcu_index); -} - -static void hci_dev_put_srcu(struct hci_dev *hdev, int srcu_index) -{ - srcu_read_unlock(&hdev->srcu, srcu_index); - hci_dev_put(hdev); -} - /* ---- Inquiry support ---- */ bool hci_discovery_active(struct hci_dev *hdev) @@ -608,9 +590,9 @@ static int hci_dev_do_reset(struct hci_dev *hdev) int hci_dev_reset(__u16 dev) { struct hci_dev *hdev; - int err, srcu_index; + int err; - hdev = hci_dev_get_srcu(dev, &srcu_index); + hdev = hci_dev_get(dev); if (!hdev) return -ENODEV; @@ -632,7 +614,7 @@ int hci_dev_reset(__u16 dev) err = hci_dev_do_reset(hdev); done: - hci_dev_put_srcu(hdev, srcu_index); + hci_dev_put(hdev); return err; } @@ -1880,8 +1862,10 @@ void hci_free_adv_monitor(struct hci_dev *hdev, struct adv_monitor *monitor) if (monitor->handle) idr_remove(&hdev->adv_monitors_idr, monitor->handle); - if (monitor->state != ADV_MONITOR_STATE_NOT_REGISTERED) + if (monitor->state != ADV_MONITOR_STATE_NOT_REGISTERED) { hdev->adv_monitors_cnt--; + mgmt_adv_monitor_removed(hdev, monitor->handle); + } kfree(monitor); } @@ -2442,11 +2426,6 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv) if (!hdev) return NULL; - if (init_srcu_struct(&hdev->srcu)) { - kfree(hdev); - return NULL; - } - hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1); hdev->esco_type = (ESCO_HV1); hdev->link_mode = (HCI_LM_ACCEPT); @@ -2513,7 +2492,6 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv) mutex_init(&hdev->lock); mutex_init(&hdev->req_lock); - mutex_init(&hdev->mgmt_pending_lock); ida_init(&hdev->unset_handle_ida); @@ -2693,9 +2671,6 @@ void hci_unregister_dev(struct hci_dev *hdev) list_del(&hdev->list); write_unlock(&hci_dev_list_lock); - synchronize_srcu(&hdev->srcu); - cleanup_srcu_struct(&hdev->srcu); - cancel_work_sync(&hdev->rx_work); cancel_work_sync(&hdev->cmd_work); cancel_work_sync(&hdev->tx_work); @@ -3405,18 +3380,23 @@ static void hci_link_tx_to(struct hci_dev *hdev, __u8 type) bt_dev_err(hdev, "link tx timeout"); - hci_dev_lock(hdev); + rcu_read_lock(); /* Kill stalled connections */ - list_for_each_entry(c, &h->list, list) { + list_for_each_entry_rcu(c, &h->list, list) { if (c->type == type && c->sent) { bt_dev_err(hdev, "killing stalled connection %pMR", &c->dst); + /* hci_disconnect might sleep, so, we have to release + * the RCU read lock before calling it. + */ + rcu_read_unlock(); hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM); + rcu_read_lock(); } } - hci_dev_unlock(hdev); + rcu_read_unlock(); } static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type, diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 8516ba62c54559813a90d382d80e92cb3a50591e..4029330e29a99890d8556dde70e8cf0dafbe505c 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -2139,6 +2139,40 @@ static u8 hci_cc_set_adv_param(struct hci_dev *hdev, void *data, return rp->status; } +static u8 hci_cc_set_ext_adv_param(struct hci_dev *hdev, void *data, + struct sk_buff *skb) +{ + struct hci_rp_le_set_ext_adv_params *rp = data; + struct hci_cp_le_set_ext_adv_params *cp; + struct adv_info *adv_instance; + + bt_dev_dbg(hdev, "status 0x%2.2x", rp->status); + + if (rp->status) + return rp->status; + + cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS); + if (!cp) + return rp->status; + + hci_dev_lock(hdev); + hdev->adv_addr_type = cp->own_addr_type; + if (!cp->handle) { + /* Store in hdev for instance 0 */ + hdev->adv_tx_power = rp->tx_power; + } else { + adv_instance = hci_find_adv_instance(hdev, cp->handle); + if (adv_instance) + adv_instance->tx_power = rp->tx_power; + } + /* Update adv data as tx power is known now */ + hci_update_adv_data(hdev, cp->handle); + + hci_dev_unlock(hdev); + + return rp->status; +} + static u8 hci_cc_read_rssi(struct hci_dev *hdev, void *data, struct sk_buff *skb) { @@ -4119,6 +4153,8 @@ static const struct hci_cc { HCI_CC(HCI_OP_LE_READ_NUM_SUPPORTED_ADV_SETS, hci_cc_le_read_num_adv_sets, sizeof(struct hci_rp_le_read_num_supported_adv_sets)), + HCI_CC(HCI_OP_LE_SET_EXT_ADV_PARAMS, hci_cc_set_ext_adv_param, + sizeof(struct hci_rp_le_set_ext_adv_params)), HCI_CC_STATUS(HCI_OP_LE_SET_EXT_ADV_ENABLE, hci_cc_le_set_ext_adv_enable), HCI_CC_STATUS(HCI_OP_LE_SET_ADV_SET_RAND_ADDR, @@ -6880,10 +6916,7 @@ static void hci_le_big_sync_established_evt(struct hci_dev *hdev, void *data, bis->iso_qos.bcast.in.sdu = le16_to_cpu(ev->max_pdu); if (!ev->status) { - bis->state = BT_CONNECTED; set_bit(HCI_CONN_BIG_SYNC, &bis->flags); - hci_debugfs_create_conn(bis); - hci_conn_add_sysfs(bis); hci_iso_setup_path(bis); } } diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c index 01aca07707117489f27fbdf40729e82aea34e32e..d6f40806ee5126b4329ac38f57d04b4cd1f3007d 100644 --- a/net/bluetooth/hci_sync.c +++ b/net/bluetooth/hci_sync.c @@ -1224,129 +1224,9 @@ static int hci_set_adv_set_random_addr_sync(struct hci_dev *hdev, u8 instance, sizeof(cp), &cp, HCI_CMD_TIMEOUT); } -static int -hci_set_ext_adv_params_sync(struct hci_dev *hdev, struct adv_info *adv, - const struct hci_cp_le_set_ext_adv_params *cp, - struct hci_rp_le_set_ext_adv_params *rp) -{ - struct sk_buff *skb; - - skb = __hci_cmd_sync(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS, sizeof(*cp), - cp, HCI_CMD_TIMEOUT); - - /* If command return a status event, skb will be set to -ENODATA */ - if (skb == ERR_PTR(-ENODATA)) - return 0; - - if (IS_ERR(skb)) { - bt_dev_err(hdev, "Opcode 0x%4.4x failed: %ld", - HCI_OP_LE_SET_EXT_ADV_PARAMS, PTR_ERR(skb)); - return PTR_ERR(skb); - } - - if (skb->len != sizeof(*rp)) { - bt_dev_err(hdev, "Invalid response length for 0x%4.4x: %u", - HCI_OP_LE_SET_EXT_ADV_PARAMS, skb->len); - kfree_skb(skb); - return -EIO; - } - - memcpy(rp, skb->data, sizeof(*rp)); - kfree_skb(skb); - - if (!rp->status) { - hdev->adv_addr_type = cp->own_addr_type; - if (!cp->handle) { - /* Store in hdev for instance 0 */ - hdev->adv_tx_power = rp->tx_power; - } else if (adv) { - adv->tx_power = rp->tx_power; - } - } - - return rp->status; -} - -static int hci_set_ext_adv_data_sync(struct hci_dev *hdev, u8 instance) -{ - struct { - struct hci_cp_le_set_ext_adv_data cp; - u8 data[HCI_MAX_EXT_AD_LENGTH]; - } pdu; - u8 len; - struct adv_info *adv = NULL; - int err; - - memset(&pdu, 0, sizeof(pdu)); - - if (instance) { - adv = hci_find_adv_instance(hdev, instance); - if (!adv || !adv->adv_data_changed) - return 0; - } - - len = eir_create_adv_data(hdev, instance, pdu.data); - - pdu.cp.length = len; - pdu.cp.handle = instance; - pdu.cp.operation = LE_SET_ADV_DATA_OP_COMPLETE; - pdu.cp.frag_pref = LE_SET_ADV_DATA_NO_FRAG; - - err = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_DATA, - sizeof(pdu.cp) + len, &pdu.cp, - HCI_CMD_TIMEOUT); - if (err) - return err; - - /* Update data if the command succeed */ - if (adv) { - adv->adv_data_changed = false; - } else { - memcpy(hdev->adv_data, pdu.data, len); - hdev->adv_data_len = len; - } - - return 0; -} - -static int hci_set_adv_data_sync(struct hci_dev *hdev, u8 instance) -{ - struct hci_cp_le_set_adv_data cp; - u8 len; - - memset(&cp, 0, sizeof(cp)); - - len = eir_create_adv_data(hdev, instance, cp.data); - - /* There's nothing to do if the data hasn't changed */ - if (hdev->adv_data_len == len && - memcmp(cp.data, hdev->adv_data, len) == 0) - return 0; - - memcpy(hdev->adv_data, cp.data, sizeof(cp.data)); - hdev->adv_data_len = len; - - cp.length = len; - - return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_DATA, - sizeof(cp), &cp, HCI_CMD_TIMEOUT); -} - -int hci_update_adv_data_sync(struct hci_dev *hdev, u8 instance) -{ - if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) - return 0; - - if (ext_adv_capable(hdev)) - return hci_set_ext_adv_data_sync(hdev, instance); - - return hci_set_adv_data_sync(hdev, instance); -} - int hci_setup_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance) { struct hci_cp_le_set_ext_adv_params cp; - struct hci_rp_le_set_ext_adv_params rp; bool connectable; u32 flags; bdaddr_t random_addr; @@ -1367,7 +1247,7 @@ int hci_setup_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance) * Command Disallowed error, so we must first disable the * instance if it is active. */ - if (adv) { + if (adv && !adv->pending) { err = hci_disable_ext_adv_instance_sync(hdev, instance); if (err) return err; @@ -1453,12 +1333,8 @@ int hci_setup_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance) cp.secondary_phy = HCI_ADV_PHY_1M; } - err = hci_set_ext_adv_params_sync(hdev, adv, &cp, &rp); - if (err) - return err; - - /* Update adv data as tx power is known now */ - err = hci_set_ext_adv_data_sync(hdev, cp.handle); + err = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS, + sizeof(cp), &cp, HCI_CMD_TIMEOUT); if (err) return err; @@ -1710,8 +1586,7 @@ static int hci_enable_per_advertising_sync(struct hci_dev *hdev, u8 instance) static int hci_adv_bcast_annoucement(struct hci_dev *hdev, struct adv_info *adv) { u8 bid[3]; - u8 ad[HCI_MAX_EXT_AD_LENGTH]; - u8 len; + u8 ad[4 + 3]; /* Skip if NULL adv as instance 0x00 is used for general purpose * advertising so it cannot used for the likes of Broadcast Announcement @@ -1737,10 +1612,8 @@ static int hci_adv_bcast_annoucement(struct hci_dev *hdev, struct adv_info *adv) /* Generate Broadcast ID */ get_random_bytes(bid, sizeof(bid)); - len = eir_append_service_data(ad, 0, 0x1852, bid, sizeof(bid)); - memcpy(ad + len, adv->adv_data, adv->adv_data_len); - hci_set_adv_instance_data(hdev, adv->instance, len + adv->adv_data_len, - ad, 0, NULL); + eir_append_service_data(ad, 0, 0x1852, bid, sizeof(bid)); + hci_set_adv_instance_data(hdev, adv->instance, sizeof(ad), ad, 0, NULL); return hci_update_adv_data_sync(hdev, adv->instance); } @@ -1757,15 +1630,8 @@ int hci_start_per_adv_sync(struct hci_dev *hdev, u8 instance, u8 data_len, if (instance) { adv = hci_find_adv_instance(hdev, instance); - if (adv) { - /* Turn it into periodic advertising */ - adv->periodic = true; - adv->per_adv_data_len = data_len; - if (data) - memcpy(adv->per_adv_data, data, data_len); - adv->flags = flags; - } else if (!adv) { - /* Create an instance if that could not be found */ + /* Create an instance if that could not be found */ + if (!adv) { adv = hci_add_per_instance(hdev, instance, flags, data_len, data, sync_interval, @@ -1983,6 +1849,82 @@ int hci_le_terminate_big_sync(struct hci_dev *hdev, u8 handle, u8 reason) sizeof(cp), &cp, HCI_CMD_TIMEOUT); } +static int hci_set_ext_adv_data_sync(struct hci_dev *hdev, u8 instance) +{ + struct { + struct hci_cp_le_set_ext_adv_data cp; + u8 data[HCI_MAX_EXT_AD_LENGTH]; + } pdu; + u8 len; + struct adv_info *adv = NULL; + int err; + + memset(&pdu, 0, sizeof(pdu)); + + if (instance) { + adv = hci_find_adv_instance(hdev, instance); + if (!adv || !adv->adv_data_changed) + return 0; + } + + len = eir_create_adv_data(hdev, instance, pdu.data); + + pdu.cp.length = len; + pdu.cp.handle = instance; + pdu.cp.operation = LE_SET_ADV_DATA_OP_COMPLETE; + pdu.cp.frag_pref = LE_SET_ADV_DATA_NO_FRAG; + + err = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_DATA, + sizeof(pdu.cp) + len, &pdu.cp, + HCI_CMD_TIMEOUT); + if (err) + return err; + + /* Update data if the command succeed */ + if (adv) { + adv->adv_data_changed = false; + } else { + memcpy(hdev->adv_data, pdu.data, len); + hdev->adv_data_len = len; + } + + return 0; +} + +static int hci_set_adv_data_sync(struct hci_dev *hdev, u8 instance) +{ + struct hci_cp_le_set_adv_data cp; + u8 len; + + memset(&cp, 0, sizeof(cp)); + + len = eir_create_adv_data(hdev, instance, cp.data); + + /* There's nothing to do if the data hasn't changed */ + if (hdev->adv_data_len == len && + memcmp(cp.data, hdev->adv_data, len) == 0) + return 0; + + memcpy(hdev->adv_data, cp.data, sizeof(cp.data)); + hdev->adv_data_len = len; + + cp.length = len; + + return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_DATA, + sizeof(cp), &cp, HCI_CMD_TIMEOUT); +} + +int hci_update_adv_data_sync(struct hci_dev *hdev, u8 instance) +{ + if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) + return 0; + + if (ext_adv_capable(hdev)) + return hci_set_ext_adv_data_sync(hdev, instance); + + return hci_set_adv_data_sync(hdev, instance); +} + int hci_schedule_adv_instance_sync(struct hci_dev *hdev, u8 instance, bool force) { @@ -2058,10 +2000,13 @@ static int hci_clear_adv_sets_sync(struct hci_dev *hdev, struct sock *sk) static int hci_clear_adv_sync(struct hci_dev *hdev, struct sock *sk, bool force) { struct adv_info *adv, *n; + int err = 0; if (ext_adv_capable(hdev)) /* Remove all existing sets */ - return hci_clear_adv_sets_sync(hdev, sk); + err = hci_clear_adv_sets_sync(hdev, sk); + if (ext_adv_capable(hdev)) + return err; /* This is safe as long as there is no command send while the lock is * held. @@ -2089,11 +2034,13 @@ static int hci_clear_adv_sync(struct hci_dev *hdev, struct sock *sk, bool force) static int hci_remove_adv_sync(struct hci_dev *hdev, u8 instance, struct sock *sk) { - int err; + int err = 0; /* If we use extended advertising, instance has to be removed first. */ if (ext_adv_capable(hdev)) - return hci_remove_ext_adv_instance_sync(hdev, instance, sk); + err = hci_remove_ext_adv_instance_sync(hdev, instance, sk); + if (ext_adv_capable(hdev)) + return err; /* This is safe as long as there is no command send while the lock is * held. @@ -2192,13 +2139,16 @@ int hci_read_tx_power_sync(struct hci_dev *hdev, __le16 handle, u8 type) int hci_disable_advertising_sync(struct hci_dev *hdev) { u8 enable = 0x00; + int err = 0; /* If controller is not advertising we are done. */ if (!hci_dev_test_flag(hdev, HCI_LE_ADV)) return 0; if (ext_adv_capable(hdev)) - return hci_disable_ext_adv_instance_sync(hdev, 0x00); + err = hci_disable_ext_adv_instance_sync(hdev, 0x00); + if (ext_adv_capable(hdev)) + return err; return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable, HCI_CMD_TIMEOUT); @@ -2566,10 +2516,6 @@ static int hci_pause_advertising_sync(struct hci_dev *hdev) int err; int old_state; - /* If controller is not advertising we are done. */ - if (!hci_dev_test_flag(hdev, HCI_LE_ADV)) - return 0; - /* If already been paused there is nothing to do. */ if (hdev->advertising_paused) return 0; @@ -6301,7 +6247,6 @@ static int hci_le_ext_directed_advertising_sync(struct hci_dev *hdev, struct hci_conn *conn) { struct hci_cp_le_set_ext_adv_params cp; - struct hci_rp_le_set_ext_adv_params rp; int err; bdaddr_t random_addr; u8 own_addr_type; @@ -6343,12 +6288,8 @@ static int hci_le_ext_directed_advertising_sync(struct hci_dev *hdev, if (err) return err; - err = hci_set_ext_adv_params_sync(hdev, NULL, &cp, &rp); - if (err) - return err; - - /* Update adv data as tx power is known now */ - err = hci_set_ext_adv_data_sync(hdev, cp.handle); + err = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS, + sizeof(cp), &cp, HCI_CMD_TIMEOUT); if (err) return err; @@ -6796,8 +6737,8 @@ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy, return 0; } - /* No privacy, use the current address */ - hci_copy_identity_address(hdev, rand_addr, own_addr_type); + /* No privacy so use a public address. */ + *own_addr_type = ADDR_LE_DEV_PUBLIC; return 0; } diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index dabc07700197c5f23c972e32f482405081f36e0e..72ee41b894a520b867ad589deba9ab423d49c101 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -1411,8 +1411,7 @@ static void l2cap_request_info(struct l2cap_conn *conn) sizeof(req), &req); } -static bool l2cap_check_enc_key_size(struct hci_conn *hcon, - struct l2cap_chan *chan) +static bool l2cap_check_enc_key_size(struct hci_conn *hcon) { /* The minimum encryption key size needs to be enforced by the * host stack before establishing any L2CAP connections. The @@ -1426,7 +1425,7 @@ static bool l2cap_check_enc_key_size(struct hci_conn *hcon, int min_key_size = hcon->hdev->min_enc_key_size; /* On FIPS security level, key size must be 16 bytes */ - if (chan->sec_level == BT_SECURITY_FIPS) + if (hcon->sec_level == BT_SECURITY_FIPS) min_key_size = 16; return (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags) || @@ -1454,7 +1453,7 @@ static void l2cap_do_start(struct l2cap_chan *chan) !__l2cap_no_conn_pending(chan)) return; - if (l2cap_check_enc_key_size(conn->hcon, chan)) + if (l2cap_check_enc_key_size(conn->hcon)) l2cap_start_connection(chan); else __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); @@ -1529,7 +1528,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn) continue; } - if (l2cap_check_enc_key_size(conn->hcon, chan)) + if (l2cap_check_enc_key_size(conn->hcon)) l2cap_start_connection(chan); else l2cap_chan_close(chan, ECONNREFUSED); @@ -3380,7 +3379,7 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC }; struct l2cap_conf_efs efs; u8 remote_efs = 0; - u16 mtu = 0; + u16 mtu = L2CAP_DEFAULT_MTU; u16 result = L2CAP_CONF_SUCCESS; u16 size; @@ -3485,29 +3484,6 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data /* Configure output options and let the other side know * which ones we don't like. */ - /* If MTU is not provided in configure request, try adjusting it - * to the current output MTU if it has been set - * - * Bluetooth Core 6.1, Vol 3, Part A, Section 4.5 - * - * Each configuration parameter value (if any is present) in an - * L2CAP_CONFIGURATION_RSP packet reflects an ‘adjustment’ to a - * configuration parameter value that has been sent (or, in case - * of default values, implied) in the corresponding - * L2CAP_CONFIGURATION_REQ packet. - */ - if (!mtu) { - /* Only adjust for ERTM channels as for older modes the - * remote stack may not be able to detect that the - * adjustment causing it to silently drop packets. - */ - if (chan->mode == L2CAP_MODE_ERTM && - chan->omtu && chan->omtu != L2CAP_DEFAULT_MTU) - mtu = chan->omtu; - else - mtu = L2CAP_DEFAULT_MTU; - } - if (mtu < L2CAP_DEFAULT_MIN_MTU) result = L2CAP_CONF_UNACCEPT; else { @@ -3979,7 +3955,7 @@ static void l2cap_connect(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, /* Check if the ACL is secure enough (if not SDP) */ if (psm != cpu_to_le16(L2CAP_PSM_SDP) && (!hci_conn_check_link_mode(conn->hcon) || - !l2cap_check_enc_key_size(conn->hcon, pchan))) { + !l2cap_check_enc_key_size(conn->hcon))) { conn->disc_reason = HCI_ERROR_AUTH_FAILURE; result = L2CAP_CR_SEC_BLOCK; goto response; @@ -4856,8 +4832,7 @@ static int l2cap_le_connect_req(struct l2cap_conn *conn, if (!smp_sufficient_security(conn->hcon, pchan->sec_level, SMP_ALLOW_STK)) { - result = pchan->sec_level == BT_SECURITY_MEDIUM ? - L2CAP_CR_LE_ENCRYPTION : L2CAP_CR_LE_AUTHENTICATION; + result = L2CAP_CR_LE_AUTHENTICATION; chan = NULL; goto response_unlock; } @@ -7348,7 +7323,7 @@ static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) } if (chan->state == BT_CONNECT) { - if (!status && l2cap_check_enc_key_size(hcon, chan)) + if (!status && l2cap_check_enc_key_size(hcon)) l2cap_start_connection(chan); else __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); @@ -7358,7 +7333,7 @@ static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) struct l2cap_conn_rsp rsp; __u16 res, stat; - if (!status && l2cap_check_enc_key_size(hcon, chan)) { + if (!status && l2cap_check_enc_key_size(hcon)) { if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { res = L2CAP_CR_PEND; stat = L2CAP_CS_AUTHOR_PEND; diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 9a906977c8723cc7999d057c2245712f0c47472c..aaaaf9733b5894758bf6e70d96b713521ad0aad6 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -1687,9 +1687,6 @@ static void l2cap_sock_resume_cb(struct l2cap_chan *chan) { struct sock *sk = chan->data; - if (!sk) - return; - if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) { sk->sk_state = BT_CONNECTED; chan->state = BT_CONNECTED; diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 82fa8c28438f25330e474b84c94bbe705709abed..589c3a481e4c1006cb6a605103044ed8ca087b9b 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -1074,8 +1074,7 @@ static int mesh_send_done_sync(struct hci_dev *hdev, void *data) struct mgmt_mesh_tx *mesh_tx; hci_dev_clear_flag(hdev, HCI_MESH_SENDING); - if (list_empty(&hdev->adv_instances)) - hci_disable_advertising_sync(hdev); + hci_disable_advertising_sync(hdev); mesh_tx = mgmt_mesh_next(hdev, NULL); if (mesh_tx) @@ -1434,17 +1433,22 @@ static void settings_rsp(struct mgmt_pending_cmd *cmd, void *data) send_settings_rsp(cmd->sk, cmd->opcode, match->hdev); + list_del(&cmd->list); + if (match->sk == NULL) { match->sk = cmd->sk; sock_hold(match->sk); } + + mgmt_pending_free(cmd); } static void cmd_status_rsp(struct mgmt_pending_cmd *cmd, void *data) { u8 *status = data; - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, *status); + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status); + mgmt_pending_remove(cmd); } static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data) @@ -1458,6 +1462,8 @@ static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data) if (cmd->cmd_complete) { cmd->cmd_complete(cmd, match->mgmt_status); + mgmt_pending_remove(cmd); + return; } @@ -1466,13 +1472,13 @@ static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data) static int generic_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status) { - return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, + return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, cmd->param, cmd->param_len); } static int addr_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status) { - return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, + return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, cmd->param, sizeof(struct mgmt_addr_info)); } @@ -1512,7 +1518,7 @@ static void mgmt_set_discoverable_complete(struct hci_dev *hdev, void *data, if (err) { u8 mgmt_err = mgmt_status(err); - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); goto done; } @@ -1687,7 +1693,7 @@ static void mgmt_set_connectable_complete(struct hci_dev *hdev, void *data, if (err) { u8 mgmt_err = mgmt_status(err); - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); goto done; } @@ -1924,8 +1930,8 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err) new_settings(hdev, NULL); } - mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, true, - cmd_status_rsp, &mgmt_err); + mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp, + &mgmt_err); return; } @@ -1935,7 +1941,7 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err) changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED); } - mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, true, settings_rsp, &match); + mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match); if (changed) new_settings(hdev, match.sk); @@ -2055,12 +2061,12 @@ static void set_le_complete(struct hci_dev *hdev, void *data, int err) bt_dev_dbg(hdev, "err %d", err); if (status) { - mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, true, cmd_status_rsp, - &status); + mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp, + &status); return; } - mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, true, settings_rsp, &match); + mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match); new_settings(hdev, match.sk); @@ -2119,7 +2125,7 @@ static void set_mesh_complete(struct hci_dev *hdev, void *data, int err) struct sock *sk = cmd->sk; if (status) { - mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev, true, + mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev, cmd_status_rsp, &status); return; } @@ -2141,9 +2147,6 @@ static int set_mesh_sync(struct hci_dev *hdev, void *data) else hci_dev_clear_flag(hdev, HCI_MESH); - hdev->le_scan_interval = __le16_to_cpu(cp->period); - hdev->le_scan_window = __le16_to_cpu(cp->window); - len -= sizeof(*cp); /* If filters don't fit, forward all adv pkts */ @@ -2158,7 +2161,6 @@ static int set_mesh(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) { struct mgmt_cp_set_mesh *cp = data; struct mgmt_pending_cmd *cmd; - __u16 period, window; int err = 0; bt_dev_dbg(hdev, "sock %p", sk); @@ -2172,23 +2174,6 @@ static int set_mesh(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, MGMT_STATUS_INVALID_PARAMS); - /* Keep allowed ranges in sync with set_scan_params() */ - period = __le16_to_cpu(cp->period); - - if (period < 0x0004 || period > 0x4000) - return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, - MGMT_STATUS_INVALID_PARAMS); - - window = __le16_to_cpu(cp->window); - - if (window < 0x0004 || window > 0x4000) - return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, - MGMT_STATUS_INVALID_PARAMS); - - if (window > period) - return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, - MGMT_STATUS_INVALID_PARAMS); - hci_dev_lock(hdev); cmd = mgmt_pending_add(sk, MGMT_OP_SET_MESH_RECEIVER, hdev, data, len); @@ -2581,7 +2566,7 @@ static void mgmt_class_complete(struct hci_dev *hdev, void *data, int err) bt_dev_dbg(hdev, "err %d", err); - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), hdev->dev_class, 3); mgmt_pending_free(cmd); @@ -3369,7 +3354,7 @@ static int pairing_complete(struct mgmt_pending_cmd *cmd, u8 status) bacpy(&rp.addr.bdaddr, &conn->dst); rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type); - err = mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_PAIR_DEVICE, + err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status, &rp, sizeof(rp)); /* So we don't get further callbacks for this connection */ @@ -5180,14 +5165,24 @@ static void mgmt_adv_monitor_added(struct sock *sk, struct hci_dev *hdev, mgmt_event(MGMT_EV_ADV_MONITOR_ADDED, hdev, &ev, sizeof(ev), sk); } -static void mgmt_adv_monitor_removed(struct sock *sk, struct hci_dev *hdev, - __le16 handle) +void mgmt_adv_monitor_removed(struct hci_dev *hdev, u16 handle) { struct mgmt_ev_adv_monitor_removed ev; + struct mgmt_pending_cmd *cmd; + struct sock *sk_skip = NULL; + struct mgmt_cp_remove_adv_monitor *cp; + + cmd = pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev); + if (cmd) { + cp = cmd->param; - ev.monitor_handle = handle; + if (cp->monitor_handle) + sk_skip = cmd->sk; + } + + ev.monitor_handle = cpu_to_le16(handle); - mgmt_event(MGMT_EV_ADV_MONITOR_REMOVED, hdev, &ev, sizeof(ev), sk); + mgmt_event(MGMT_EV_ADV_MONITOR_REMOVED, hdev, &ev, sizeof(ev), sk_skip); } static int read_adv_mon_features(struct sock *sk, struct hci_dev *hdev, @@ -5258,7 +5253,7 @@ static void mgmt_add_adv_patterns_monitor_complete(struct hci_dev *hdev, hci_update_passive_scan(hdev); } - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(status), &rp, sizeof(rp)); mgmt_pending_remove(cmd); @@ -5289,7 +5284,8 @@ static int __add_adv_patterns_monitor(struct sock *sk, struct hci_dev *hdev, if (pending_find(MGMT_OP_SET_LE, hdev) || pending_find(MGMT_OP_ADD_ADV_PATTERNS_MONITOR, hdev) || - pending_find(MGMT_OP_ADD_ADV_PATTERNS_MONITOR_RSSI, hdev)) { + pending_find(MGMT_OP_ADD_ADV_PATTERNS_MONITOR_RSSI, hdev) || + pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev)) { status = MGMT_STATUS_BUSY; goto unlock; } @@ -5459,7 +5455,8 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev, struct mgmt_pending_cmd *cmd = data; struct mgmt_cp_remove_adv_monitor *cp; - if (status == -ECANCELED) + if (status == -ECANCELED || + cmd != pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev)) return; hci_dev_lock(hdev); @@ -5468,14 +5465,12 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev, rp.monitor_handle = cp->monitor_handle; - if (!status) { - mgmt_adv_monitor_removed(cmd->sk, hdev, cp->monitor_handle); + if (!status) hci_update_passive_scan(hdev); - } - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(status), &rp, sizeof(rp)); - mgmt_pending_free(cmd); + mgmt_pending_remove(cmd); hci_dev_unlock(hdev); bt_dev_dbg(hdev, "remove monitor %d complete, status %d", @@ -5485,6 +5480,10 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev, static int mgmt_remove_adv_monitor_sync(struct hci_dev *hdev, void *data) { struct mgmt_pending_cmd *cmd = data; + + if (cmd != pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev)) + return -ECANCELED; + struct mgmt_cp_remove_adv_monitor *cp = cmd->param; u16 handle = __le16_to_cpu(cp->monitor_handle); @@ -5503,13 +5502,14 @@ static int remove_adv_monitor(struct sock *sk, struct hci_dev *hdev, hci_dev_lock(hdev); if (pending_find(MGMT_OP_SET_LE, hdev) || + pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev) || pending_find(MGMT_OP_ADD_ADV_PATTERNS_MONITOR, hdev) || pending_find(MGMT_OP_ADD_ADV_PATTERNS_MONITOR_RSSI, hdev)) { status = MGMT_STATUS_BUSY; goto unlock; } - cmd = mgmt_pending_new(sk, MGMT_OP_REMOVE_ADV_MONITOR, hdev, data, len); + cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_ADV_MONITOR, hdev, data, len); if (!cmd) { status = MGMT_STATUS_NO_RESOURCES; goto unlock; @@ -5519,7 +5519,7 @@ static int remove_adv_monitor(struct sock *sk, struct hci_dev *hdev, mgmt_remove_adv_monitor_complete); if (err) { - mgmt_pending_free(cmd); + mgmt_pending_remove(cmd); if (err == -ENOMEM) status = MGMT_STATUS_NO_RESOURCES; @@ -5872,7 +5872,7 @@ static void start_discovery_complete(struct hci_dev *hdev, void *data, int err) cmd != pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev)) return; - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), cmd->param, 1); mgmt_pending_remove(cmd); @@ -6110,7 +6110,7 @@ static void stop_discovery_complete(struct hci_dev *hdev, void *data, int err) bt_dev_dbg(hdev, "err %d", err); - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), cmd->param, 1); mgmt_pending_remove(cmd); @@ -6335,7 +6335,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err) u8 status = mgmt_status(err); if (status) { - mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, true, + mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, cmd_status_rsp, &status); return; } @@ -6345,7 +6345,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err) else hci_dev_clear_flag(hdev, HCI_ADVERTISING); - mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, true, settings_rsp, + mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp, &match); new_settings(hdev, match.sk); @@ -6551,7 +6551,6 @@ static int set_scan_params(struct sock *sk, struct hci_dev *hdev, return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, MGMT_STATUS_NOT_SUPPORTED); - /* Keep allowed ranges in sync with set_mesh() */ interval = __le16_to_cpu(cp->interval); if (interval < 0x0004 || interval > 0x4000) @@ -6690,7 +6689,7 @@ static void set_bredr_complete(struct hci_dev *hdev, void *data, int err) */ hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED); - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); } else { send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev); new_settings(hdev, cmd->sk); @@ -6827,7 +6826,7 @@ static void set_secure_conn_complete(struct hci_dev *hdev, void *data, int err) if (err) { u8 mgmt_err = mgmt_status(err); - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); goto done; } @@ -7274,7 +7273,7 @@ static void get_conn_info_complete(struct hci_dev *hdev, void *data, int err) rp.max_tx_power = HCI_TX_POWER_INVALID; } - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_GET_CONN_INFO, status, + mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO, status, &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -7434,7 +7433,7 @@ static void get_clock_info_complete(struct hci_dev *hdev, void *data, int err) } complete: - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, &rp, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -8638,10 +8637,10 @@ static void add_advertising_complete(struct hci_dev *hdev, void *data, int err) rp.instance = cp->instance; if (err) - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err)); else - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), &rp, sizeof(rp)); add_adv_complete(hdev, cmd->sk, cp->instance, err); @@ -8829,10 +8828,10 @@ static void add_ext_adv_params_complete(struct hci_dev *hdev, void *data, hci_remove_adv_instance(hdev, cp->instance); - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err)); } else { - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), &rp, sizeof(rp)); } @@ -8980,10 +8979,10 @@ static void add_ext_adv_data_complete(struct hci_dev *hdev, void *data, int err) rp.instance = cp->instance; if (err) - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err)); else - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -9142,10 +9141,10 @@ static void remove_advertising_complete(struct hci_dev *hdev, void *data, rp.instance = cp->instance; if (err) - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err)); else - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, MGMT_STATUS_SUCCESS, &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -9416,7 +9415,7 @@ void mgmt_index_removed(struct hci_dev *hdev) if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) return; - mgmt_pending_foreach(0, hdev, true, cmd_complete_rsp, &match); + mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &match); if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev, NULL, 0, @@ -9454,8 +9453,7 @@ void mgmt_power_on(struct hci_dev *hdev, int err) hci_update_passive_scan(hdev); } - mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, true, settings_rsp, - &match); + mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); new_settings(hdev, match.sk); @@ -9470,8 +9468,7 @@ void __mgmt_power_off(struct hci_dev *hdev) struct cmd_lookup match = { NULL, hdev }; u8 zero_cod[] = { 0, 0, 0 }; - mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, true, settings_rsp, - &match); + mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); /* If the power off is because of hdev unregistration let * use the appropriate INVALID_INDEX status. Otherwise use @@ -9485,7 +9482,7 @@ void __mgmt_power_off(struct hci_dev *hdev) else match.mgmt_status = MGMT_STATUS_NOT_POWERED; - mgmt_pending_foreach(0, hdev, true, cmd_complete_rsp, &match); + mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &match); if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) { mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, @@ -9726,6 +9723,7 @@ static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data) device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk); cmd->cmd_complete(cmd, 0); + mgmt_pending_remove(cmd); } bool mgmt_powering_down(struct hci_dev *hdev) @@ -9778,8 +9776,8 @@ void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, struct mgmt_cp_disconnect *cp; struct mgmt_pending_cmd *cmd; - mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, true, - unpair_device_rsp, hdev); + mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp, + hdev); cmd = pending_find(MGMT_OP_DISCONNECT, hdev); if (!cmd) @@ -9972,7 +9970,7 @@ void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status) if (status) { u8 mgmt_err = mgmt_status(status); - mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, true, + mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, cmd_status_rsp, &mgmt_err); return; } @@ -9982,8 +9980,8 @@ void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status) else changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY); - mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, true, - settings_rsp, &match); + mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp, + &match); if (changed) new_settings(hdev, match.sk); @@ -10007,12 +10005,9 @@ void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, { struct cmd_lookup match = { NULL, hdev, mgmt_status(status) }; - mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, false, sk_lookup, - &match); - mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, false, sk_lookup, - &match); - mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, false, sk_lookup, - &match); + mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match); + mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match); + mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match); if (!status) { mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class, diff --git a/net/bluetooth/mgmt_util.c b/net/bluetooth/mgmt_util.c index 4ba500c377a4c079da820ebb9c8505affde95d06..0115f783bde8055f9f0b8b46a9a84321e75abe39 100644 --- a/net/bluetooth/mgmt_util.c +++ b/net/bluetooth/mgmt_util.c @@ -217,47 +217,47 @@ int mgmt_cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status, struct mgmt_pending_cmd *mgmt_pending_find(unsigned short channel, u16 opcode, struct hci_dev *hdev) { - struct mgmt_pending_cmd *cmd, *tmp; - - mutex_lock(&hdev->mgmt_pending_lock); + struct mgmt_pending_cmd *cmd; - list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) { + list_for_each_entry(cmd, &hdev->mgmt_pending, list) { if (hci_sock_get_channel(cmd->sk) != channel) continue; - - if (cmd->opcode == opcode) { - mutex_unlock(&hdev->mgmt_pending_lock); + if (cmd->opcode == opcode) return cmd; - } } - mutex_unlock(&hdev->mgmt_pending_lock); + return NULL; +} + +struct mgmt_pending_cmd *mgmt_pending_find_data(unsigned short channel, + u16 opcode, + struct hci_dev *hdev, + const void *data) +{ + struct mgmt_pending_cmd *cmd; + + list_for_each_entry(cmd, &hdev->mgmt_pending, list) { + if (cmd->user_data != data) + continue; + if (cmd->opcode == opcode) + return cmd; + } return NULL; } -void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, bool remove, +void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, void (*cb)(struct mgmt_pending_cmd *cmd, void *data), void *data) { struct mgmt_pending_cmd *cmd, *tmp; - mutex_lock(&hdev->mgmt_pending_lock); - list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) { if (opcode > 0 && cmd->opcode != opcode) continue; - if (remove) - list_del(&cmd->list); - cb(cmd, data); - - if (remove) - mgmt_pending_free(cmd); } - - mutex_unlock(&hdev->mgmt_pending_lock); } struct mgmt_pending_cmd *mgmt_pending_new(struct sock *sk, u16 opcode, @@ -271,7 +271,7 @@ struct mgmt_pending_cmd *mgmt_pending_new(struct sock *sk, u16 opcode, return NULL; cmd->opcode = opcode; - cmd->hdev = hdev; + cmd->index = hdev->id; cmd->param = kmemdup(data, len, GFP_KERNEL); if (!cmd->param) { @@ -297,9 +297,7 @@ struct mgmt_pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode, if (!cmd) return NULL; - mutex_lock(&hdev->mgmt_pending_lock); list_add_tail(&cmd->list, &hdev->mgmt_pending); - mutex_unlock(&hdev->mgmt_pending_lock); return cmd; } @@ -313,10 +311,7 @@ void mgmt_pending_free(struct mgmt_pending_cmd *cmd) void mgmt_pending_remove(struct mgmt_pending_cmd *cmd) { - mutex_lock(&cmd->hdev->mgmt_pending_lock); list_del(&cmd->list); - mutex_unlock(&cmd->hdev->mgmt_pending_lock); - mgmt_pending_free(cmd); } @@ -326,7 +321,7 @@ void mgmt_mesh_foreach(struct hci_dev *hdev, { struct mgmt_mesh_tx *mesh_tx, *tmp; - list_for_each_entry_safe(mesh_tx, tmp, &hdev->mesh_pending, list) { + list_for_each_entry_safe(mesh_tx, tmp, &hdev->mgmt_pending, list) { if (!sk || mesh_tx->sk == sk) cb(mesh_tx, data); } diff --git a/net/bluetooth/mgmt_util.h b/net/bluetooth/mgmt_util.h index 024e51dd693756d29588d483802648bfa9fabc4a..bdf978605d5a85bcbee1c0db1a76065e31a6096e 100644 --- a/net/bluetooth/mgmt_util.h +++ b/net/bluetooth/mgmt_util.h @@ -33,7 +33,7 @@ struct mgmt_mesh_tx { struct mgmt_pending_cmd { struct list_head list; u16 opcode; - struct hci_dev *hdev; + int index; void *param; size_t param_len; struct sock *sk; @@ -54,7 +54,11 @@ int mgmt_cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status, struct mgmt_pending_cmd *mgmt_pending_find(unsigned short channel, u16 opcode, struct hci_dev *hdev); -void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, bool remove, +struct mgmt_pending_cmd *mgmt_pending_find_data(unsigned short channel, + u16 opcode, + struct hci_dev *hdev, + const void *data); +void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, void (*cb)(struct mgmt_pending_cmd *cmd, void *data), void *data); struct mgmt_pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode, diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c index 4c00bc50de811ea1ac3b45110a6371d8816a6d6e..56f7f041c9a604687cea9f7abe825dc21be40cdb 100644 --- a/net/bluetooth/smp.c +++ b/net/bluetooth/smp.c @@ -1380,7 +1380,7 @@ static void smp_timeout(struct work_struct *work) bt_dev_dbg(conn->hcon->hdev, "conn %p", conn); - hci_disconnect(conn->hcon, HCI_ERROR_AUTH_FAILURE); + hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM); } static struct smp_chan *smp_chan_create(struct l2cap_conn *conn) @@ -2978,25 +2978,8 @@ static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb) if (code > SMP_CMD_MAX) goto drop; - if (smp && !test_and_clear_bit(code, &smp->allow_cmd)) { - /* If there is a context and the command is not allowed consider - * it a failure so the session is cleanup properly. - */ - switch (code) { - case SMP_CMD_IDENT_INFO: - case SMP_CMD_IDENT_ADDR_INFO: - case SMP_CMD_SIGN_INFO: - /* 3.6.1. Key distribution and generation - * - * A device may reject a distributed key by sending the - * Pairing Failed command with the reason set to - * "Key Rejected". - */ - smp_failure(conn, SMP_KEY_REJECTED); - break; - } + if (smp && !test_and_clear_bit(code, &smp->allow_cmd)) goto drop; - } /* If we don't have a context the only allowed commands are * pairing request and security request. diff --git a/net/bluetooth/smp.h b/net/bluetooth/smp.h index c5da53dfab04f2339f854c7797e79337ae23bd5f..87a59ec2c9f02bca8ea6bc1e2c2e37b45048799e 100644 --- a/net/bluetooth/smp.h +++ b/net/bluetooth/smp.h @@ -138,7 +138,6 @@ struct smp_cmd_keypress_notify { #define SMP_NUMERIC_COMP_FAILED 0x0c #define SMP_BREDR_PAIRING_IN_PROGRESS 0x0d #define SMP_CROSS_TRANSP_NOT_ALLOWED 0x0e -#define SMP_KEY_REJECTED 0x0f #define SMP_MIN_ENC_KEY_SIZE 7 #define SMP_MAX_ENC_KEY_SIZE 16 diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c index 96bea0c8408fecc488f9820bc55d4d7fe3174189..7305f5f8215cac31fe4af46ba9aea9e16dbc200a 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c @@ -1030,7 +1030,7 @@ static int br_mdb_add_group(const struct br_mdb_config *cfg, /* host join */ if (!port) { - if (mp->host_joined && !(cfg->nlflags & NLM_F_REPLACE)) { + if (mp->host_joined) { NL_SET_ERR_MSG_MOD(extack, "Group is already joined by host"); return -EEXIST; } diff --git a/net/bridge/br_mst.c b/net/bridge/br_mst.c index 3f24b4ee49c27482a3155ecf73046734fc817414..1820f09ff59cebb6034febcc5e38334c4470dec6 100644 --- a/net/bridge/br_mst.c +++ b/net/bridge/br_mst.c @@ -80,10 +80,10 @@ static void br_mst_vlan_set_state(struct net_bridge_vlan_group *vg, if (br_vlan_get_state(v) == state) return; + br_vlan_set_state(v, state); + if (v->vid == vg->pvid) br_vlan_set_pvid_state(vg, state); - - br_vlan_set_state(v, state); } int br_mst_set_state(struct net_bridge_port *p, u16 msti, u8 state, diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index fa16ee88ec396ae8f239e3a8c2aa56ee09bb6fb7..c38244d60ff86e334f7327fce92ffc321c9fccb0 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -2104,17 +2104,12 @@ static void __br_multicast_enable_port_ctx(struct net_bridge_mcast_port *pmctx) } } -static void br_multicast_enable_port_ctx(struct net_bridge_mcast_port *pmctx) +void br_multicast_enable_port(struct net_bridge_port *port) { - struct net_bridge *br = pmctx->port->br; + struct net_bridge *br = port->br; spin_lock_bh(&br->multicast_lock); - if (br_multicast_port_ctx_is_vlan(pmctx) && - !(pmctx->vlan->priv_flags & BR_VLFLAG_MCAST_ENABLED)) { - spin_unlock_bh(&br->multicast_lock); - return; - } - __br_multicast_enable_port_ctx(pmctx); + __br_multicast_enable_port_ctx(&port->multicast_ctx); spin_unlock_bh(&br->multicast_lock); } @@ -2141,67 +2136,11 @@ static void __br_multicast_disable_port_ctx(struct net_bridge_mcast_port *pmctx) br_multicast_rport_del_notify(pmctx, del); } -static void br_multicast_disable_port_ctx(struct net_bridge_mcast_port *pmctx) -{ - struct net_bridge *br = pmctx->port->br; - - spin_lock_bh(&br->multicast_lock); - if (br_multicast_port_ctx_is_vlan(pmctx) && - !(pmctx->vlan->priv_flags & BR_VLFLAG_MCAST_ENABLED)) { - spin_unlock_bh(&br->multicast_lock); - return; - } - - __br_multicast_disable_port_ctx(pmctx); - spin_unlock_bh(&br->multicast_lock); -} - -static void br_multicast_toggle_port(struct net_bridge_port *port, bool on) -{ -#if IS_ENABLED(CONFIG_BRIDGE_VLAN_FILTERING) - if (br_opt_get(port->br, BROPT_MCAST_VLAN_SNOOPING_ENABLED)) { - struct net_bridge_vlan_group *vg; - struct net_bridge_vlan *vlan; - - rcu_read_lock(); - vg = nbp_vlan_group_rcu(port); - if (!vg) { - rcu_read_unlock(); - return; - } - - /* iterate each vlan, toggle vlan multicast context */ - list_for_each_entry_rcu(vlan, &vg->vlan_list, vlist) { - struct net_bridge_mcast_port *pmctx = - &vlan->port_mcast_ctx; - u8 state = br_vlan_get_state(vlan); - /* enable vlan multicast context when state is - * LEARNING or FORWARDING - */ - if (on && br_vlan_state_allowed(state, true)) - br_multicast_enable_port_ctx(pmctx); - else - br_multicast_disable_port_ctx(pmctx); - } - rcu_read_unlock(); - return; - } -#endif - /* toggle port multicast context when vlan snooping is disabled */ - if (on) - br_multicast_enable_port_ctx(&port->multicast_ctx); - else - br_multicast_disable_port_ctx(&port->multicast_ctx); -} - -void br_multicast_enable_port(struct net_bridge_port *port) -{ - br_multicast_toggle_port(port, true); -} - void br_multicast_disable_port(struct net_bridge_port *port) { - br_multicast_toggle_port(port, false); + spin_lock_bh(&port->br->multicast_lock); + __br_multicast_disable_port_ctx(&port->multicast_ctx); + spin_unlock_bh(&port->br->multicast_lock); } static int __grp_src_delete_marked(struct net_bridge_port_group *pg) @@ -4271,32 +4210,6 @@ static void __br_multicast_stop(struct net_bridge_mcast *brmctx) #endif } -void br_multicast_update_vlan_mcast_ctx(struct net_bridge_vlan *v, u8 state) -{ -#if IS_ENABLED(CONFIG_BRIDGE_VLAN_FILTERING) - struct net_bridge *br; - - if (!br_vlan_should_use(v)) - return; - - if (br_vlan_is_master(v)) - return; - - br = v->port->br; - - if (!br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED)) - return; - - if (br_vlan_state_allowed(state, true)) - br_multicast_enable_port_ctx(&v->port_mcast_ctx); - - /* Multicast is not disabled for the vlan when it goes in - * blocking state because the timers will expire and stop by - * themselves without sending more queries. - */ -#endif -} - void br_multicast_toggle_one_vlan(struct net_bridge_vlan *vlan, bool on) { struct net_bridge *br; @@ -4390,9 +4303,9 @@ int br_multicast_toggle_vlan_snooping(struct net_bridge *br, bool on, __br_multicast_open(&br->multicast_ctx); list_for_each_entry(p, &br->port_list, list) { if (on) - br_multicast_disable_port_ctx(&p->multicast_ctx); + br_multicast_disable_port(p); else - br_multicast_enable_port_ctx(&p->multicast_ctx); + br_multicast_enable_port(p); } list_for_each_entry(vlan, &vg->vlan_list, vlist) diff --git a/net/bridge/br_nf_core.c b/net/bridge/br_nf_core.c index a8c67035e23c00cc689801c89fcc444f96c5650c..98aea5485aaef4f32c17b3266a87f7661e72d157 100644 --- a/net/bridge/br_nf_core.c +++ b/net/bridge/br_nf_core.c @@ -65,14 +65,17 @@ static struct dst_ops fake_dst_ops = { * ipt_REJECT needs it. Future netfilter modules might * require us to fill additional fields. */ +static const u32 br_dst_default_metrics[RTAX_MAX] = { + [RTAX_MTU - 1] = 1500, +}; + void br_netfilter_rtable_init(struct net_bridge *br) { struct rtable *rt = &br->fake_rtable; rcuref_init(&rt->dst.__rcuref, 1); rt->dst.dev = br->dev; - dst_init_metrics(&rt->dst, br->metrics, false); - dst_metric_set(&rt->dst, RTAX_MTU, br->dev->mtu); + dst_init_metrics(&rt->dst, br_dst_default_metrics, true); rt->dst.flags = DST_NOXFRM | DST_FAKE_RTABLE; rt->dst.ops = &fake_dst_ops; } diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 067d47b8eb8ffb0f3e461d0404aa0e7ab226621b..72d80fd943a8a27fe9ebc8fef1468e825a6a83d6 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -502,7 +502,6 @@ struct net_bridge { struct rtable fake_rtable; struct rt6_info fake_rt6_info; }; - u32 metrics[RTAX_MAX]; #endif u16 group_fwd_mask; u16 group_fwd_mask_required; @@ -1043,7 +1042,6 @@ void br_multicast_port_ctx_init(struct net_bridge_port *port, struct net_bridge_vlan *vlan, struct net_bridge_mcast_port *pmctx); void br_multicast_port_ctx_deinit(struct net_bridge_mcast_port *pmctx); -void br_multicast_update_vlan_mcast_ctx(struct net_bridge_vlan *v, u8 state); void br_multicast_toggle_one_vlan(struct net_bridge_vlan *vlan, bool on); int br_multicast_toggle_vlan_snooping(struct net_bridge *br, bool on, struct netlink_ext_ack *extack); @@ -1480,11 +1478,6 @@ static inline void br_multicast_port_ctx_deinit(struct net_bridge_mcast_port *pm { } -static inline void br_multicast_update_vlan_mcast_ctx(struct net_bridge_vlan *v, - u8 state) -{ -} - static inline void br_multicast_toggle_one_vlan(struct net_bridge_vlan *vlan, bool on) { @@ -1836,9 +1829,7 @@ bool br_vlan_global_opts_can_enter_range(const struct net_bridge_vlan *v_curr, bool br_vlan_global_opts_fill(struct sk_buff *skb, u16 vid, u16 vid_range, const struct net_bridge_vlan *v_opts); -/* vlan state manipulation helpers using *_ONCE to annotate lock-free access, - * while br_vlan_set_state() may access data protected by multicast_lock. - */ +/* vlan state manipulation helpers using *_ONCE to annotate lock-free access */ static inline u8 br_vlan_get_state(const struct net_bridge_vlan *v) { return READ_ONCE(v->state); @@ -1847,7 +1838,6 @@ static inline u8 br_vlan_get_state(const struct net_bridge_vlan *v) static inline void br_vlan_set_state(struct net_bridge_vlan *v, u8 state) { WRITE_ONCE(v->state, state); - br_multicast_update_vlan_mcast_ctx(v, state); } static inline u8 br_vlan_get_pvid_state(const struct net_bridge_vlan_group *vg) diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c index f10bd6a233dcf96745db9b7c5cc43ddcec15b67e..7b41ee8740cbbaf6b959d9273c49ebcd4830a5c8 100644 --- a/net/bridge/br_switchdev.c +++ b/net/bridge/br_switchdev.c @@ -17,9 +17,6 @@ static bool nbp_switchdev_can_offload_tx_fwd(const struct net_bridge_port *p, if (!static_branch_unlikely(&br_switchdev_tx_fwd_offload)) return false; - if (br_multicast_igmp_type(skb)) - return false; - return (p->flags & BR_TX_FWD_OFFLOAD) && (p->hwdom != BR_INPUT_SKB_CB(skb)->src_hwdom); } diff --git a/net/bridge/netfilter/nf_conntrack_bridge.c b/net/bridge/netfilter/nf_conntrack_bridge.c index 4b4a396d972259d47ba40db64a62ebb0050e298d..4fbfbafdfa0274c9581aa53e7795740d994b8187 100644 --- a/net/bridge/netfilter/nf_conntrack_bridge.c +++ b/net/bridge/netfilter/nf_conntrack_bridge.c @@ -60,19 +60,19 @@ static int nf_br_ip_fragment(struct net *net, struct sock *sk, struct ip_fraglist_iter iter; struct sk_buff *frag; - if (first_len - hlen > mtu) + if (first_len - hlen > mtu || + skb_headroom(skb) < ll_rs) goto blackhole; - if (skb_cloned(skb) || - skb_headroom(skb) < ll_rs) + if (skb_cloned(skb)) goto slow_path; skb_walk_frags(skb, frag) { - if (frag->len > mtu) + if (frag->len > mtu || + skb_headroom(frag) < hlen + ll_rs) goto blackhole; - if (skb_shared(frag) || - skb_headroom(frag) < hlen + ll_rs) + if (skb_shared(frag)) goto slow_path; } diff --git a/net/can/bcm.c b/net/can/bcm.c index 75653584f31b944f40ef83884eba31ed3bcd444f..a1f5db0fd5d4fd1debb8175dbf6cca38183891df 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -58,7 +58,6 @@ #include #include #include -#include #include #include @@ -121,7 +120,6 @@ struct bcm_op { struct canfd_frame last_sframe; struct sock *sk; struct net_device *rx_reg_dev; - spinlock_t bcm_tx_lock; /* protect currframe/count in runtime updates */ }; struct bcm_sock { @@ -207,9 +205,7 @@ static int bcm_proc_show(struct seq_file *m, void *v) seq_printf(m, " / bound %s", bcm_proc_getifname(net, ifname, bo->ifindex)); seq_printf(m, " <<<\n"); - rcu_read_lock(); - - list_for_each_entry_rcu(op, &bo->rx_ops, list) { + list_for_each_entry(op, &bo->rx_ops, list) { unsigned long reduction; @@ -265,9 +261,6 @@ static int bcm_proc_show(struct seq_file *m, void *v) seq_printf(m, "# sent %ld\n", op->frames_abs); } seq_putc(m, '\n'); - - rcu_read_unlock(); - return 0; } #endif /* CONFIG_PROC_FS */ @@ -280,18 +273,13 @@ static void bcm_can_tx(struct bcm_op *op) { struct sk_buff *skb; struct net_device *dev; - struct canfd_frame *cf; + struct canfd_frame *cf = op->frames + op->cfsiz * op->currframe; int err; /* no target device? => exit */ if (!op->ifindex) return; - /* read currframe under lock protection */ - spin_lock_bh(&op->bcm_tx_lock); - cf = op->frames + op->cfsiz * op->currframe; - spin_unlock_bh(&op->bcm_tx_lock); - dev = dev_get_by_index(sock_net(op->sk), op->ifindex); if (!dev) { /* RFC: should this bcm_op remove itself here? */ @@ -312,10 +300,6 @@ static void bcm_can_tx(struct bcm_op *op) skb->dev = dev; can_skb_set_owner(skb, op->sk); err = can_send(skb, 1); - - /* update currframe and count under lock protection */ - spin_lock_bh(&op->bcm_tx_lock); - if (!err) op->frames_abs++; @@ -324,11 +308,6 @@ static void bcm_can_tx(struct bcm_op *op) /* reached last frame? */ if (op->currframe >= op->nframes) op->currframe = 0; - - if (op->count > 0) - op->count--; - - spin_unlock_bh(&op->bcm_tx_lock); out: dev_put(dev); } @@ -425,7 +404,7 @@ static enum hrtimer_restart bcm_tx_timeout_handler(struct hrtimer *hrtimer) struct bcm_msg_head msg_head; if (op->kt_ival1 && (op->count > 0)) { - bcm_can_tx(op); + op->count--; if (!op->count && (op->flags & TX_COUNTEVT)) { /* create notification to user */ @@ -440,6 +419,7 @@ static enum hrtimer_restart bcm_tx_timeout_handler(struct hrtimer *hrtimer) bcm_send_to_user(op, &msg_head, NULL, 0); } + bcm_can_tx(op); } else if (op->kt_ival2) { bcm_can_tx(op); @@ -821,7 +801,7 @@ static int bcm_delete_rx_op(struct list_head *ops, struct bcm_msg_head *mh, REGMASK(op->can_id), bcm_rx_handler, op); - list_del_rcu(&op->list); + list_del(&op->list); bcm_remove_op(op); return 1; /* done */ } @@ -841,7 +821,7 @@ static int bcm_delete_tx_op(struct list_head *ops, struct bcm_msg_head *mh, list_for_each_entry_safe(op, n, ops, list) { if ((op->can_id == mh->can_id) && (op->ifindex == ifindex) && (op->flags & CAN_FD_FRAME) == (mh->flags & CAN_FD_FRAME)) { - list_del_rcu(&op->list); + list_del(&op->list); bcm_remove_op(op); return 1; /* done */ } @@ -934,27 +914,6 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, } op->flags = msg_head->flags; - /* only lock for unlikely count/nframes/currframe changes */ - if (op->nframes != msg_head->nframes || - op->flags & TX_RESET_MULTI_IDX || - op->flags & SETTIMER) { - - spin_lock_bh(&op->bcm_tx_lock); - - if (op->nframes != msg_head->nframes || - op->flags & TX_RESET_MULTI_IDX) { - /* potentially update changed nframes */ - op->nframes = msg_head->nframes; - /* restart multiple frame transmission */ - op->currframe = 0; - } - - if (op->flags & SETTIMER) - op->count = msg_head->count; - - spin_unlock_bh(&op->bcm_tx_lock); - } - } else { /* insert new BCM operation for the given can_id */ @@ -962,14 +921,9 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, if (!op) return -ENOMEM; - spin_lock_init(&op->bcm_tx_lock); op->can_id = msg_head->can_id; op->cfsiz = CFSIZ(msg_head->flags); op->flags = msg_head->flags; - op->nframes = msg_head->nframes; - - if (op->flags & SETTIMER) - op->count = msg_head->count; /* create array for CAN frames and copy the data */ if (msg_head->nframes > 1) { @@ -1028,8 +982,22 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, } /* if ((op = bcm_find_op(&bo->tx_ops, msg_head->can_id, ifindex))) */ + if (op->nframes != msg_head->nframes) { + op->nframes = msg_head->nframes; + /* start multiple frame transmission with index 0 */ + op->currframe = 0; + } + + /* check flags */ + + if (op->flags & TX_RESET_MULTI_IDX) { + /* start multiple frame transmission with index 0 */ + op->currframe = 0; + } + if (op->flags & SETTIMER) { /* set timer values */ + op->count = msg_head->count; op->ival1 = msg_head->ival1; op->ival2 = msg_head->ival2; op->kt_ival1 = bcm_timeval_to_ktime(msg_head->ival1); @@ -1046,8 +1014,11 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, op->flags |= TX_ANNOUNCE; } - if (op->flags & TX_ANNOUNCE) + if (op->flags & TX_ANNOUNCE) { bcm_can_tx(op); + if (op->count) + op->count--; + } if (op->flags & STARTTIMER) bcm_tx_start_timer(op); @@ -1263,7 +1234,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, bcm_rx_handler, op, "bcm", sk); if (err) { /* this bcm rx op is broken -> remove it */ - list_del_rcu(&op->list); + list_del(&op->list); bcm_remove_op(op); return err; } diff --git a/net/core/filter.c b/net/core/filter.c index 3e10b4c8338f92a251b261378a068afd47070318..5143c8a9e52cabdabea1ccc517b97cb4397c8a70 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -1968,11 +1968,10 @@ BPF_CALL_5(bpf_l4_csum_replace, struct sk_buff *, skb, u32, offset, bool is_pseudo = flags & BPF_F_PSEUDO_HDR; bool is_mmzero = flags & BPF_F_MARK_MANGLED_0; bool do_mforce = flags & BPF_F_MARK_ENFORCE; - bool is_ipv6 = flags & BPF_F_IPV6; __sum16 *ptr; if (unlikely(flags & ~(BPF_F_MARK_MANGLED_0 | BPF_F_MARK_ENFORCE | - BPF_F_PSEUDO_HDR | BPF_F_HDR_FIELD_MASK | BPF_F_IPV6))) + BPF_F_PSEUDO_HDR | BPF_F_HDR_FIELD_MASK))) return -EINVAL; if (unlikely(offset > 0xffff || offset & 1)) return -EFAULT; @@ -1988,7 +1987,7 @@ BPF_CALL_5(bpf_l4_csum_replace, struct sk_buff *, skb, u32, offset, if (unlikely(from != 0)) return -EINVAL; - inet_proto_csum_replace_by_diff(ptr, skb, to, is_pseudo, is_ipv6); + inet_proto_csum_replace_by_diff(ptr, skb, to, is_pseudo); break; case 2: inet_proto_csum_replace2(ptr, skb, from, to, is_pseudo); @@ -3230,13 +3229,6 @@ static const struct bpf_func_proto bpf_skb_vlan_pop_proto = { .arg1_type = ARG_PTR_TO_CTX, }; -static void bpf_skb_change_protocol(struct sk_buff *skb, u16 proto) -{ - skb->protocol = htons(proto); - if (skb_valid_dst(skb)) - skb_dst_drop(skb); -} - static int bpf_skb_generic_push(struct sk_buff *skb, u32 off, u32 len) { /* Caller already did skb_cow() with len as headroom, @@ -3333,7 +3325,7 @@ static int bpf_skb_proto_4_to_6(struct sk_buff *skb) } } - bpf_skb_change_protocol(skb, ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); skb_clear_hash(skb); return 0; @@ -3363,7 +3355,7 @@ static int bpf_skb_proto_6_to_4(struct sk_buff *skb) } } - bpf_skb_change_protocol(skb, ETH_P_IP); + skb->protocol = htons(ETH_P_IP); skb_clear_hash(skb); return 0; @@ -3554,10 +3546,10 @@ static int bpf_skb_net_grow(struct sk_buff *skb, u32 off, u32 len_diff, /* Match skb->protocol to new outer l3 protocol */ if (skb->protocol == htons(ETH_P_IP) && flags & BPF_F_ADJ_ROOM_ENCAP_L3_IPV6) - bpf_skb_change_protocol(skb, ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); else if (skb->protocol == htons(ETH_P_IPV6) && flags & BPF_F_ADJ_ROOM_ENCAP_L3_IPV4) - bpf_skb_change_protocol(skb, ETH_P_IP); + skb->protocol = htons(ETH_P_IP); } if (skb_is_gso(skb)) { @@ -3610,10 +3602,10 @@ static int bpf_skb_net_shrink(struct sk_buff *skb, u32 off, u32 len_diff, /* Match skb->protocol to new outer l3 protocol */ if (skb->protocol == htons(ETH_P_IP) && flags & BPF_F_ADJ_ROOM_DECAP_L3_IPV6) - bpf_skb_change_protocol(skb, ETH_P_IPV6); + skb->protocol = htons(ETH_P_IPV6); else if (skb->protocol == htons(ETH_P_IPV6) && flags & BPF_F_ADJ_ROOM_DECAP_L3_IPV4) - bpf_skb_change_protocol(skb, ETH_P_IP); + skb->protocol = htons(ETH_P_IP); if (skb_is_gso(skb)) { struct skb_shared_info *shinfo = skb_shinfo(skb); diff --git a/net/core/scm.c b/net/core/scm.c index 431bfb3ea39290a7526142875cd1591500ec88a2..737917c7ac62762e3bd7122c47877104afc20596 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -36,7 +36,6 @@ #include #include #include -#include /* @@ -86,15 +85,8 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp) return -ENOMEM; *fplp = fpl; fpl->count = 0; - fpl->count_unix = 0; fpl->max = SCM_MAX_FD; fpl->user = NULL; -#if IS_ENABLED(CONFIG_UNIX) - fpl->inflight = false; - fpl->dead = false; - fpl->edges = NULL; - INIT_LIST_HEAD(&fpl->vertices); -#endif } fpp = &fpl->fp[fpl->count]; @@ -117,9 +109,6 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp) fput(file); return -EINVAL; } - if (unix_get_socket(file)) - fpl->count_unix++; - *fpp++ = file; fpl->count++; } @@ -382,14 +371,8 @@ struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl) if (new_fpl) { for (i = 0; i < fpl->count; i++) get_file(fpl->fp[i]); - new_fpl->max = new_fpl->count; new_fpl->user = get_uid(fpl->user); -#if IS_ENABLED(CONFIG_UNIX) - new_fpl->inflight = false; - new_fpl->edges = NULL; - INIT_LIST_HEAD(&new_fpl->vertices); -#endif } return new_fpl; } diff --git a/net/core/selftests.c b/net/core/selftests.c index 946e92cca2111057c817ffd7f49eadb976c9a60f..7af99d07762ea0e50cafcacb180104aa370856a8 100644 --- a/net/core/selftests.c +++ b/net/core/selftests.c @@ -160,9 +160,8 @@ static struct sk_buff *net_test_get_skb(struct net_device *ndev, skb->csum = 0; skb->ip_summed = CHECKSUM_PARTIAL; if (attr->tcp) { - int l4len = skb->len - skb_transport_offset(skb); - - thdr->check = ~tcp_v4_check(l4len, ihdr->saddr, ihdr->daddr, 0); + thdr->check = ~tcp_v4_check(skb->len, ihdr->saddr, + ihdr->daddr, 0); skb->csum_start = skb_transport_header(skb) - skb->head; skb->csum_offset = offsetof(struct tcphdr, check); } else { diff --git a/net/core/skmsg.c b/net/core/skmsg.c index c3169e1e63524853e0e434b7bb957a86514b7fc4..86fd7cac18c1803abe978329fc5647f2cebb8b37 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -655,14 +655,12 @@ static void sk_psock_backlog(struct work_struct *work) bool ingress; int ret; - /* Increment the psock refcnt to synchronize with close(fd) path in - * sock_map_close(), ensuring we wait for backlog thread completion - * before sk_socket freed. If refcnt increment fails, it indicates - * sock_map_close() completed with sk_socket potentially already freed. - */ - if (!sk_psock_get(psock->sk)) - return; mutex_lock(&psock->work_mutex); + if (unlikely(state->len)) { + len = state->len; + off = state->off; + } + while ((skb = skb_peek(&psock->ingress_skb))) { len = skb->len; off = 0; @@ -672,13 +670,6 @@ static void sk_psock_backlog(struct work_struct *work) off = stm->offset; len = stm->full_len; } - - /* Resume processing from previous partial state */ - if (unlikely(state->len)) { - len = state->len; - off = state->off; - } - ingress = skb_bpf_ingress(skb); skb_bpf_redirect_clear(skb); do { @@ -689,8 +680,7 @@ static void sk_psock_backlog(struct work_struct *work) if (ret <= 0) { if (ret == -EAGAIN) { sk_psock_skb_state(psock, state, len, off); - /* Restore redir info we cleared before */ - skb_bpf_set_redir(skb, psock->sk, ingress); + /* Delay slightly to prioritize any * other work that might be here. */ @@ -707,14 +697,11 @@ static void sk_psock_backlog(struct work_struct *work) len -= ret; } while (len); - /* The entire skb sent, clear state */ - sk_psock_skb_state(psock, state, 0, 0); skb = skb_dequeue(&psock->ingress_skb); kfree_skb(skb); } end: mutex_unlock(&psock->work_mutex); - sk_psock_put(psock->sk, psock); } struct sk_psock *sk_psock_init(struct sock *sk, int node) diff --git a/net/core/sock.c b/net/core/sock.c index ec48690b5174ebfbc708e63df8167e95fb177cf9..84ba3f67bca97b258d137f0a263f7116213e32c9 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -3817,7 +3817,7 @@ static int assign_proto_idx(struct proto *prot) { prot->inuse_idx = find_first_zero_bit(proto_inuse_idx, PROTO_INUSE_NR); - if (unlikely(prot->inuse_idx == PROTO_INUSE_NR)) { + if (unlikely(prot->inuse_idx == PROTO_INUSE_NR - 1)) { pr_err("PROTO_INUSE_NR exhausted\n"); return -ENOSPC; } @@ -3828,7 +3828,7 @@ static int assign_proto_idx(struct proto *prot) static void release_proto_idx(struct proto *prot) { - if (prot->inuse_idx != PROTO_INUSE_NR) + if (prot->inuse_idx != PROTO_INUSE_NR - 1) clear_bit(prot->inuse_idx, proto_inuse_idx); } #else diff --git a/net/core/utils.c b/net/core/utils.c index 5895d034bf279d9c9ad7ecdb879217972c193718..c994e95172acf5d899d3b7bae95ea26b5888b42b 100644 --- a/net/core/utils.c +++ b/net/core/utils.c @@ -473,11 +473,11 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, EXPORT_SYMBOL(inet_proto_csum_replace16); void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb, - __wsum diff, bool pseudohdr, bool ipv6) + __wsum diff, bool pseudohdr) { if (skb->ip_summed != CHECKSUM_PARTIAL) { csum_replace_by_diff(sum, diff); - if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr && !ipv6) + if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) skb->csum = ~csum_sub(diff, skb->csum); } else if (pseudohdr) { *sum = ~csum_fold(csum_add(diff, csum_unfold(*sum))); diff --git a/net/dsa/tag_brcm.c b/net/dsa/tag_brcm.c index 146c1dbd15a93fab53fd96518bc684ba99562c60..cacdafb41200e5f941dff2e259a57720fb916f43 100644 --- a/net/dsa/tag_brcm.c +++ b/net/dsa/tag_brcm.c @@ -257,7 +257,7 @@ static struct sk_buff *brcm_leg_tag_rcv(struct sk_buff *skb, int source_port; u8 *brcm_tag; - if (unlikely(!pskb_may_pull(skb, BRCM_LEG_TAG_LEN + VLAN_HLEN))) + if (unlikely(!pskb_may_pull(skb, BRCM_LEG_PORT_ID))) return NULL; brcm_tag = dsa_etype_header_pos_rx(skb); diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index 2caf6a2a819b213dfa811a248ccf8e248c2e5110..ed5f37c6d9ba2448852154626100a675436db516 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c @@ -118,16 +118,47 @@ static void esp_ssg_unref(struct xfrm_state *x, void *tmp, struct sk_buff *skb) } #ifdef CONFIG_INET_ESPINTCP +struct esp_tcp_sk { + struct sock *sk; + struct rcu_head rcu; +}; + +static void esp_free_tcp_sk(struct rcu_head *head) +{ + struct esp_tcp_sk *esk = container_of(head, struct esp_tcp_sk, rcu); + + sock_put(esk->sk); + kfree(esk); +} + static struct sock *esp_find_tcp_sk(struct xfrm_state *x) { struct xfrm_encap_tmpl *encap = x->encap; struct net *net = xs_net(x); + struct esp_tcp_sk *esk; __be16 sport, dport; + struct sock *nsk; struct sock *sk; + sk = rcu_dereference(x->encap_sk); + if (sk && sk->sk_state == TCP_ESTABLISHED) + return sk; + spin_lock_bh(&x->lock); sport = encap->encap_sport; dport = encap->encap_dport; + nsk = rcu_dereference_protected(x->encap_sk, + lockdep_is_held(&x->lock)); + if (sk && sk == nsk) { + esk = kmalloc(sizeof(*esk), GFP_ATOMIC); + if (!esk) { + spin_unlock_bh(&x->lock); + return ERR_PTR(-ENOMEM); + } + RCU_INIT_POINTER(x->encap_sk, NULL); + esk->sk = sk; + call_rcu(&esk->rcu, esp_free_tcp_sk); + } spin_unlock_bh(&x->lock); sk = inet_lookup_established(net, net->ipv4.tcp_death_row.hashinfo, x->id.daddr.a4, @@ -140,6 +171,20 @@ static struct sock *esp_find_tcp_sk(struct xfrm_state *x) return ERR_PTR(-EINVAL); } + spin_lock_bh(&x->lock); + nsk = rcu_dereference_protected(x->encap_sk, + lockdep_is_held(&x->lock)); + if (encap->encap_sport != sport || + encap->encap_dport != dport) { + sock_put(sk); + sk = nsk ?: ERR_PTR(-EREMCHG); + } else if (sk == nsk) { + sock_put(sk); + } else { + rcu_assign_pointer(x->encap_sk, sk); + } + spin_unlock_bh(&x->lock); + return sk; } @@ -164,8 +209,6 @@ static int esp_output_tcp_finish(struct xfrm_state *x, struct sk_buff *skb) err = espintcp_push_skb(sk, skb); bh_unlock_sock(sk); - sock_put(sk); - out: rcu_read_unlock(); return err; @@ -350,8 +393,6 @@ static struct ip_esp_hdr *esp_output_tcp_encap(struct xfrm_state *x, if (IS_ERR(sk)) return ERR_CAST(sk); - sock_put(sk); - *lenp = htons(len); esph = (struct ip_esp_hdr *)(lenp + 1); diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index 298a9944a3d1e8b5601419f507d31e3b8c78c20c..513f475c6a534e0fb406b93525476ac9c03f3bc8 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c @@ -222,9 +222,9 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, struct nlattr **tb, struct netlink_ext_ack *extack) { - struct fib4_rule *rule4 = (struct fib4_rule *)rule; - struct net *net = rule->fr_net; + struct net *net = sock_net(skb->sk); int err = -EINVAL; + struct fib4_rule *rule4 = (struct fib4_rule *) rule; if (!inet_validate_dscp(frh->tos)) { NL_SET_ERR_MSG(extack, diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index f261e29adc7c2e07e354c8e138299833676ec9b5..890c15510b42108c79688cefe475413dd74d843b 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -140,6 +140,7 @@ static int ipgre_err(struct sk_buff *skb, u32 info, const struct iphdr *iph; const int type = icmp_hdr(skb)->type; const int code = icmp_hdr(skb)->code; + unsigned int data_len = 0; struct ip_tunnel *t; if (tpi->proto == htons(ETH_P_TEB)) @@ -180,6 +181,7 @@ static int ipgre_err(struct sk_buff *skb, u32 info, case ICMP_TIME_EXCEEDED: if (code != ICMP_EXC_TTL) return 0; + data_len = icmp_hdr(skb)->un.reserved[1] * 4; /* RFC 4884 4.1 */ break; case ICMP_REDIRECT: @@ -187,16 +189,10 @@ static int ipgre_err(struct sk_buff *skb, u32 info, } #if IS_ENABLED(CONFIG_IPV6) - if (tpi->proto == htons(ETH_P_IPV6)) { - unsigned int data_len = 0; - - if (type == ICMP_TIME_EXCEEDED) - data_len = icmp_hdr(skb)->un.reserved[1] * 4; /* RFC 4884 4.1 */ - - if (!ip6_err_gen_icmpv6_unreach(skb, iph->ihl * 4 + tpi->hdr_len, - type, data_len)) - return 0; - } + if (tpi->proto == htons(ETH_P_IPV6) && + !ip6_err_gen_icmpv6_unreach(skb, iph->ihl * 4 + tpi->hdr_len, + type, data_len)) + return 0; #endif if (t->parms.iph.daddr == 0 || diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 8ee1ad2d8c13f63de1193f59d68eff1fb596e249..97dc30a03dbf26da979caa89043e690530ca6829 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -192,11 +192,7 @@ const __u8 ip_tos2prio[16] = { EXPORT_SYMBOL(ip_tos2prio); static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat); -#ifndef CONFIG_PREEMPT_RT #define RT_CACHE_STAT_INC(field) raw_cpu_inc(rt_cache_stat.field) -#else -#define RT_CACHE_STAT_INC(field) this_cpu_inc(rt_cache_stat.field) -#endif #ifdef CONFIG_PROC_FS static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos) diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index a4bbe959d1e25f5de349dbb6e45d876605530821..ff22060f9145f9a94d56b2b7f43d39322b64aef4 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -1132,7 +1132,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size) goto do_error; while (msg_data_left(msg)) { - int copy = 0; + ssize_t copy = 0; skb = tcp_write_queue_tail(sk); if (skb) diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c index 408985eb74eeface6217691e48d84b8c0d3a95e6..32b28fc21b63c0d1db3b457dda6e4afe86af0f44 100644 --- a/net/ipv4/tcp_fastopen.c +++ b/net/ipv4/tcp_fastopen.c @@ -3,7 +3,6 @@ #include #include #include -#include void tcp_fastopen_init_key_once(struct net *net) { @@ -280,8 +279,6 @@ static struct sock *tcp_fastopen_create_child(struct sock *sk, refcount_set(&req->rsk_refcnt, 2); - sk_mark_napi_id_set(child, skb); - /* Now finish processing the fastopen child socket. */ tcp_init_transfer(child, BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, skb); diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index f7b95bc8ad60bba5e5c901d692b7977535eecfd5..a172248b667837495b8956f6fca7be6ae7385dc7 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -671,12 +671,10 @@ EXPORT_SYMBOL(tcp_initialize_rcv_mss); */ static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep) { - u32 new_sample, old_sample = tp->rcv_rtt_est.rtt_us; - long m = sample << 3; + u32 new_sample = tp->rcv_rtt_est.rtt_us; + long m = sample; - if (old_sample == 0 || m < old_sample) { - new_sample = m; - } else { + if (new_sample != 0) { /* If we sample in larger samples in the non-timestamp * case, we could grossly overestimate the RTT especially * with chatty applications or bulk transfer apps which @@ -687,9 +685,17 @@ static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep) * else with timestamps disabled convergence takes too * long. */ - if (win_dep) - return; - new_sample = old_sample - (old_sample >> 3) + sample; + if (!win_dep) { + m -= (new_sample >> 3); + new_sample += m; + } else { + m <<= 3; + if (m < new_sample) + new_sample = m; + } + } else { + /* No previous measure. */ + new_sample = m << 3; } tp->rcv_rtt_est.rtt_us = new_sample; @@ -2463,33 +2469,20 @@ static inline bool tcp_packet_delayed(const struct tcp_sock *tp) { const struct sock *sk = (const struct sock *)tp; - /* Received an echoed timestamp before the first retransmission? */ - if (tp->retrans_stamp) - return tcp_tsopt_ecr_before(tp, tp->retrans_stamp); - - /* We set tp->retrans_stamp upon the first retransmission of a loss - * recovery episode, so normally if tp->retrans_stamp is 0 then no - * retransmission has happened yet (likely due to TSQ, which can cause - * fast retransmits to be delayed). So if snd_una advanced while - * (tp->retrans_stamp is 0 then apparently a packet was merely delayed, - * not lost. But there are exceptions where we retransmit but then - * clear tp->retrans_stamp, so we check for those exceptions. - */ + if (tp->retrans_stamp && + tcp_tsopt_ecr_before(tp, tp->retrans_stamp)) + return true; /* got echoed TS before first retransmission */ - /* (1) For non-SACK connections, tcp_is_non_sack_preventing_reopen() - * clears tp->retrans_stamp when snd_una == high_seq. + /* Check if nothing was retransmitted (retrans_stamp==0), which may + * happen in fast recovery due to TSQ. But we ignore zero retrans_stamp + * in TCP_SYN_SENT, since when we set FLAG_SYN_ACKED we also clear + * retrans_stamp even if we had retransmitted the SYN. */ - if (!tcp_is_sack(tp) && !before(tp->snd_una, tp->high_seq)) - return false; + if (!tp->retrans_stamp && /* no record of a retransmit/SYN? */ + sk->sk_state != TCP_SYN_SENT) /* not the FLAG_SYN_ACKED case? */ + return true; /* nothing was retransmitted */ - /* (2) In TCP_SYN_SENT tcp_clean_rtx_queue() clears tp->retrans_stamp - * when setting FLAG_SYN_ACKED is set, even if the SYN was - * retransmitted. - */ - if (sk->sk_state == TCP_SYN_SENT) - return false; - - return true; /* tp->retrans_stamp is zero; no retransmit yet */ + return false; } /* Undo procedures. */ @@ -6712,9 +6705,6 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) if (!tp->srtt_us) tcp_synack_rtt_meas(sk, req); - if (tp->rx_opt.tstamp_ok) - tp->advmss -= TCPOLEN_TSTAMP_ALIGNED; - if (req) { tcp_rcv_synrecv_state_fastopen(sk); } else { @@ -6739,6 +6729,9 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) tp->snd_wnd = ntohs(th->window) << tp->rx_opt.snd_wscale; tcp_init_wl(tp, TCP_SKB_CB(skb)->seq); + if (tp->rx_opt.tstamp_ok) + tp->advmss -= TCPOLEN_TSTAMP_ALIGNED; + if (!inet_csk(sk)->icsk_ca_ops->cong_control) tcp_update_pacing_rate(sk); diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index 3870b59f540048c41e38f392daf8139f33b0cee4..132cfc3b2c847b97c34d2b64f3a2ab5e026b6c00 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c @@ -332,7 +332,6 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, bool copy_dtor; __sum16 check; __be16 newlen; - int ret = 0; mss = skb_shinfo(gso_skb)->gso_size; if (gso_skb->len <= sizeof(*uh) + mss) @@ -355,10 +354,6 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, if (skb_pagelen(gso_skb) - sizeof(*uh) == skb_shinfo(gso_skb)->gso_size) return __udp_gso_segment_list(gso_skb, features, is_ipv6); - ret = __skb_linearize(gso_skb); - if (ret) - return ERR_PTR(ret); - /* Setup csum, as fraglist skips this in udp4_gro_receive. */ gso_skb->csum_start = skb_transport_header(gso_skb) - gso_skb->head; gso_skb->csum_offset = offsetof(struct udphdr, check); diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index f6188bd9f55ba6460481a502a58f5063d4fe6733..231fa4dc6cde4ade3d977973375a7fe28cec9761 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -3499,9 +3499,11 @@ static void addrconf_gre_config(struct net_device *dev) ASSERT_RTNL(); - idev = addrconf_add_dev(dev); - if (IS_ERR(idev)) + idev = ipv6_find_idev(dev); + if (IS_ERR(idev)) { + pr_debug("%s: add_dev failed\n", __func__); return; + } /* Generate the IPv6 link-local address using addrconf_addr_gen(), * unless we have an IPv4 GRE device not bound to an IP address and @@ -3515,6 +3517,9 @@ static void addrconf_gre_config(struct net_device *dev) } add_v4_addrs(idev); + + if (dev->flags & IFF_POINTOPOINT) + addrconf_add_mroute(dev); } #endif @@ -7383,8 +7388,7 @@ int __init addrconf_init(void) if (err < 0) goto out_addrlabel; - /* All works using addrconf_wq need to lock rtnl. */ - addrconf_wq = create_singlethread_workqueue("ipv6_addrconf"); + addrconf_wq = create_workqueue("ipv6_addrconf"); if (!addrconf_wq) { err = -ENOMEM; goto out_nowq; diff --git a/net/ipv6/calipso.c b/net/ipv6/calipso.c index 24666291c54a87265b7db511dfd00c7442133f70..c07e3da08d2a8bb8f56e82707dea1cebd583cd04 100644 --- a/net/ipv6/calipso.c +++ b/net/ipv6/calipso.c @@ -1210,10 +1210,6 @@ static int calipso_req_setattr(struct request_sock *req, struct ipv6_opt_hdr *old, *new; struct sock *sk = sk_to_full_sk(req_to_sk(req)); - /* sk is NULL for SYN+ACK w/ SYN Cookie */ - if (!sk) - return -ENOMEM; - if (req_inet->ipv6_opt && req_inet->ipv6_opt->hopopt) old = req_inet->ipv6_opt->hopopt; else @@ -1254,10 +1250,6 @@ static void calipso_req_delattr(struct request_sock *req) struct ipv6_txoptions *txopts; struct sock *sk = sk_to_full_sk(req_to_sk(req)); - /* sk is NULL for SYN+ACK w/ SYN Cookie */ - if (!sk) - return; - if (!req_inet->ipv6_opt || !req_inet->ipv6_opt->hopopt) return; diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index 2caaab61b9967c485753f16ad010504ca55ab0b2..43a9966e2064de95d8f85ff9e611ca34bff5b390 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c @@ -135,16 +135,47 @@ static void esp_ssg_unref(struct xfrm_state *x, void *tmp, struct sk_buff *skb) } #ifdef CONFIG_INET6_ESPINTCP +struct esp_tcp_sk { + struct sock *sk; + struct rcu_head rcu; +}; + +static void esp_free_tcp_sk(struct rcu_head *head) +{ + struct esp_tcp_sk *esk = container_of(head, struct esp_tcp_sk, rcu); + + sock_put(esk->sk); + kfree(esk); +} + static struct sock *esp6_find_tcp_sk(struct xfrm_state *x) { struct xfrm_encap_tmpl *encap = x->encap; struct net *net = xs_net(x); + struct esp_tcp_sk *esk; __be16 sport, dport; + struct sock *nsk; struct sock *sk; + sk = rcu_dereference(x->encap_sk); + if (sk && sk->sk_state == TCP_ESTABLISHED) + return sk; + spin_lock_bh(&x->lock); sport = encap->encap_sport; dport = encap->encap_dport; + nsk = rcu_dereference_protected(x->encap_sk, + lockdep_is_held(&x->lock)); + if (sk && sk == nsk) { + esk = kmalloc(sizeof(*esk), GFP_ATOMIC); + if (!esk) { + spin_unlock_bh(&x->lock); + return ERR_PTR(-ENOMEM); + } + RCU_INIT_POINTER(x->encap_sk, NULL); + esk->sk = sk; + call_rcu(&esk->rcu, esp_free_tcp_sk); + } spin_unlock_bh(&x->lock); sk = __inet6_lookup_established(net, net->ipv4.tcp_death_row.hashinfo, &x->id.daddr.in6, @@ -157,6 +188,20 @@ static struct sock *esp6_find_tcp_sk(struct xfrm_state *x) return ERR_PTR(-EINVAL); } + spin_lock_bh(&x->lock); + nsk = rcu_dereference_protected(x->encap_sk, + lockdep_is_held(&x->lock)); + if (encap->encap_sport != sport || + encap->encap_dport != dport) { + sock_put(sk); + sk = nsk ?: ERR_PTR(-EREMCHG); + } else if (sk == nsk) { + sock_put(sk); + } else { + rcu_assign_pointer(x->encap_sk, sk); + } + spin_unlock_bh(&x->lock); + return sk; } @@ -181,8 +226,6 @@ static int esp_output_tcp_finish(struct xfrm_state *x, struct sk_buff *skb) err = espintcp_push_skb(sk, skb); bh_unlock_sock(sk); - sock_put(sk); - out: rcu_read_unlock(); return err; @@ -386,8 +429,6 @@ static struct ip_esp_hdr *esp6_output_tcp_encap(struct xfrm_state *x, if (IS_ERR(sk)) return ERR_CAST(sk); - sock_put(sk); - *lenp = htons(len); esph = (struct ip_esp_hdr *)(lenp + 1); diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index e0f0c5f8cccdaaf74775f4fe023ae23e32e6357e..6eeab21512ba98721fbd54da2b3dfabdd7553862 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c @@ -350,9 +350,9 @@ static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb, struct nlattr **tb, struct netlink_ext_ack *extack) { - struct fib6_rule *rule6 = (struct fib6_rule *)rule; - struct net *net = rule->fr_net; int err = -EINVAL; + struct net *net = sock_net(skb->sk); + struct fib6_rule *rule6 = (struct fib6_rule *) rule; if (!inet_validate_dscp(frh->tos)) { NL_SET_ERR_MSG(extack, diff --git a/net/ipv6/ila/ila_common.c b/net/ipv6/ila/ila_common.c index b8d43ed4689db93efde42df05b7f4b73785a983e..95e9146918cc6f8ddacf7f1c79540f1d157c5ce5 100644 --- a/net/ipv6/ila/ila_common.c +++ b/net/ipv6/ila/ila_common.c @@ -86,7 +86,7 @@ static void ila_csum_adjust_transport(struct sk_buff *skb, diff = get_csum_diff(ip6h, p); inet_proto_csum_replace_by_diff(&th->check, skb, - diff, true, true); + diff, true); } break; case NEXTHDR_UDP: @@ -97,7 +97,7 @@ static void ila_csum_adjust_transport(struct sk_buff *skb, if (uh->check || skb->ip_summed == CHECKSUM_PARTIAL) { diff = get_csum_diff(ip6h, p); inet_proto_csum_replace_by_diff(&uh->check, skb, - diff, true, true); + diff, true); if (!uh->check) uh->check = CSUM_MANGLED_0; } @@ -111,7 +111,7 @@ static void ila_csum_adjust_transport(struct sk_buff *skb, diff = get_csum_diff(ip6h, p); inet_proto_csum_replace_by_diff(&ih->icmp6_cksum, skb, - diff, true, true); + diff, true); } break; } diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index c86d5dca29df014965758a56bf5787a895fed9bc..28777b14224048774be01a485aa3b4042d912c8a 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -1452,6 +1452,7 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork, } v6_cork->hop_limit = ipc6->hlimit; v6_cork->tclass = ipc6->tclass; + v6_cork->dontfrag = ipc6->dontfrag; if (rt->dst.flags & DST_XFRM_TUNNEL) mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ? READ_ONCE(rt->dst.dev->mtu) : dst_mtu(&rt->dst); @@ -1485,7 +1486,7 @@ static int __ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), void *from, size_t length, int transhdrlen, - unsigned int flags, struct ipcm6_cookie *ipc6) + unsigned int flags) { struct sk_buff *skb, *skb_prev = NULL; struct inet_cork *cork = &cork_full->base; @@ -1541,7 +1542,7 @@ static int __ip6_append_data(struct sock *sk, if (headersize + transhdrlen > mtu) goto emsgsize; - if (cork->length + length > mtu - headersize && ipc6->dontfrag && + if (cork->length + length > mtu - headersize && v6_cork->dontfrag && (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_ICMPV6 || sk->sk_protocol == IPPROTO_RAW)) { @@ -1913,7 +1914,7 @@ int ip6_append_data(struct sock *sk, return __ip6_append_data(sk, &sk->sk_write_queue, &inet->cork, &np->cork, sk_page_frag(sk), getfrag, - from, length, transhdrlen, flags, ipc6); + from, length, transhdrlen, flags); } EXPORT_SYMBOL_GPL(ip6_append_data); @@ -2118,7 +2119,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk, err = __ip6_append_data(sk, &queue, cork, &v6_cork, ¤t->task_frag, getfrag, from, length + exthdrlen, transhdrlen + exthdrlen, - flags, ipc6); + flags); if (err) { __ip6_flush_pending_frames(sk, &queue, cork, &v6_cork); return ERR_PTR(err); diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index e153dac47a530d5d7431b865ef288e2baa75870b..9bb246c09fcee82b51648bd54ce447ff2ffc07ef 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c @@ -803,8 +803,8 @@ static void mld_del_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im) } else { im->mca_crcount = idev->mc_qrv; } - ip6_mc_clear_src(pmc); in6_dev_put(pmc->idev); + ip6_mc_clear_src(pmc); kfree_rcu(pmc, rcu); } } diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 606aae4e78a9a4a409bf747a2ddf83042202b95b..7c4af48d529e1e6d22907d1cc866f341831d80fc 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c @@ -163,20 +163,20 @@ int br_ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, struct ip6_fraglist_iter iter; struct sk_buff *frag2; - if (first_len - hlen > mtu) + if (first_len - hlen > mtu || + skb_headroom(skb) < (hroom + sizeof(struct frag_hdr))) goto blackhole; - if (skb_cloned(skb) || - skb_headroom(skb) < (hroom + sizeof(struct frag_hdr))) + if (skb_cloned(skb)) goto slow_path; skb_walk_frags(skb, frag2) { - if (frag2->len > mtu) + if (frag2->len > mtu || + skb_headroom(frag2) < (hlen + hroom + sizeof(struct frag_hdr))) goto blackhole; /* Partially cloned skb? */ - if (skb_shared(frag2) || - skb_headroom(frag2) < (hlen + hroom + sizeof(struct frag_hdr))) + if (skb_shared(frag2)) goto slow_path; } diff --git a/net/ipv6/netfilter/nft_fib_ipv6.c b/net/ipv6/netfilter/nft_fib_ipv6.c index a89ce0fbfe4b125c042e8d6b8624d0651cad776f..c9f1634b3838aeff4cd5002545f4ac496ce0bdc6 100644 --- a/net/ipv6/netfilter/nft_fib_ipv6.c +++ b/net/ipv6/netfilter/nft_fib_ipv6.c @@ -158,7 +158,6 @@ void nft_fib6_eval(const struct nft_expr *expr, struct nft_regs *regs, { const struct nft_fib *priv = nft_expr_priv(expr); int noff = skb_network_offset(pkt->skb); - const struct net_device *found = NULL; const struct net_device *oif = NULL; u32 *dest = ®s->data[priv->dreg]; struct ipv6hdr *iph, _iph; @@ -203,15 +202,11 @@ void nft_fib6_eval(const struct nft_expr *expr, struct nft_regs *regs, if (rt->rt6i_flags & (RTF_REJECT | RTF_ANYCAST | RTF_LOCAL)) goto put_rt_err; - if (!oif) { - found = rt->rt6i_idev->dev; - } else { - if (oif == rt->rt6i_idev->dev || - l3mdev_master_ifindex_rcu(rt->rt6i_idev->dev) == oif->ifindex) - found = oif; - } + if (oif && oif != rt->rt6i_idev->dev && + l3mdev_master_ifindex_rcu(rt->rt6i_idev->dev) != oif->ifindex) + goto put_rt_err; - nft_fib_store_result(dest, priv, found); + nft_fib_store_result(dest, priv, rt->rt6i_idev->dev); put_rt_err: ip6_rt_put(rt); } diff --git a/net/ipv6/rpl_iptunnel.c b/net/ipv6/rpl_iptunnel.c index 523aa8c9b382fe1d08c4b783fe3b45f30a629456..28fc7fae5797231018fee48867d04226c3a62f03 100644 --- a/net/ipv6/rpl_iptunnel.c +++ b/net/ipv6/rpl_iptunnel.c @@ -129,13 +129,13 @@ static int rpl_do_srh_inline(struct sk_buff *skb, const struct rpl_lwt *rlwt, struct dst_entry *cache_dst) { struct ipv6_rpl_sr_hdr *isrh, *csrh; - struct ipv6hdr oldhdr; + const struct ipv6hdr *oldhdr; struct ipv6hdr *hdr; unsigned char *buf; size_t hdrlen; int err; - memcpy(&oldhdr, ipv6_hdr(skb), sizeof(oldhdr)); + oldhdr = ipv6_hdr(skb); buf = kcalloc(struct_size(srh, segments.addr, srh->segments_left), 2, GFP_ATOMIC); if (!buf) @@ -147,7 +147,7 @@ static int rpl_do_srh_inline(struct sk_buff *skb, const struct rpl_lwt *rlwt, memcpy(isrh, srh, sizeof(*isrh)); memcpy(isrh->rpl_segaddr, &srh->rpl_segaddr[1], (srh->segments_left - 1) * 16); - isrh->rpl_segaddr[srh->segments_left - 1] = oldhdr.daddr; + isrh->rpl_segaddr[srh->segments_left - 1] = oldhdr->daddr; ipv6_rpl_srh_compress(csrh, isrh, &srh->rpl_segaddr[0], isrh->segments_left - 1); @@ -169,7 +169,7 @@ static int rpl_do_srh_inline(struct sk_buff *skb, const struct rpl_lwt *rlwt, skb_mac_header_rebuild(skb); hdr = ipv6_hdr(skb); - memmove(hdr, &oldhdr, sizeof(*hdr)); + memmove(hdr, oldhdr, sizeof(*hdr)); isrh = (void *)hdr + sizeof(*hdr); memcpy(isrh, csrh, hdrlen); diff --git a/net/ipv6/seg6_local.c b/net/ipv6/seg6_local.c index 7f295b9c13744d842bbf7adf704cfed8d8ba8116..c434940131b1d0e1621e541636b2067d4177887c 100644 --- a/net/ipv6/seg6_local.c +++ b/net/ipv6/seg6_local.c @@ -1638,8 +1638,10 @@ static const struct nla_policy seg6_local_policy[SEG6_LOCAL_MAX + 1] = { [SEG6_LOCAL_SRH] = { .type = NLA_BINARY }, [SEG6_LOCAL_TABLE] = { .type = NLA_U32 }, [SEG6_LOCAL_VRFTABLE] = { .type = NLA_U32 }, - [SEG6_LOCAL_NH4] = NLA_POLICY_EXACT_LEN(sizeof(struct in_addr)), - [SEG6_LOCAL_NH6] = NLA_POLICY_EXACT_LEN(sizeof(struct in6_addr)), + [SEG6_LOCAL_NH4] = { .type = NLA_BINARY, + .len = sizeof(struct in_addr) }, + [SEG6_LOCAL_NH6] = { .type = NLA_BINARY, + .len = sizeof(struct in6_addr) }, [SEG6_LOCAL_IIF] = { .type = NLA_U32 }, [SEG6_LOCAL_OIF] = { .type = NLA_U32 }, [SEG6_LOCAL_BPF] = { .type = NLA_NESTED }, diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 19f3de3c24ef1c289059bcb597ba0f66a9965103..cc25fec44f850216f3dfc00b92784c595a96c225 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c @@ -888,15 +888,15 @@ static int llc_ui_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, if (sk->sk_type != SOCK_STREAM) goto copy_uaddr; - /* Partial read */ - if (used + offset < skb_len) - continue; - if (!(flags & MSG_PEEK)) { skb_unlink(skb, &sk->sk_receive_queue); kfree_skb(skb); *seq = 0; } + + /* Partial read */ + if (used + offset < skb_len) + continue; } while (len > 0); out: diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c index 31c4f112345ea42d697e04d3136b046aa392dff6..68952752b5990f917f0257a241a0a650ca2e1463 100644 --- a/net/mac80211/chan.c +++ b/net/mac80211/chan.c @@ -89,11 +89,11 @@ ieee80211_chanctx_reserved_chandef(struct ieee80211_local *local, lockdep_assert_held(&local->chanctx_mtx); - if (WARN_ON(!compat)) - return NULL; - list_for_each_entry(link, &ctx->reserved_links, reserved_chanctx_list) { + if (!compat) + compat = &link->reserved_chandef; + compat = cfg80211_chandef_compatible(&link->reserved_chandef, compat); if (!compat) diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 44aad3394084bd8920ca9817a31f958b9e3619b4..04c876d78d3bf08369249f26e68726341ac4bb4b 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -1186,15 +1186,6 @@ ieee80211_vif_get_shift(struct ieee80211_vif *vif) return shift; } -#define for_each_link_data(sdata, __link) \ - struct ieee80211_sub_if_data *__sdata = sdata; \ - for (int __link_id = 0; \ - __link_id < ARRAY_SIZE((__sdata)->link); __link_id++) \ - if ((!(__sdata)->vif.valid_links || \ - (__sdata)->vif.valid_links & BIT(__link_id)) && \ - ((__link) = sdata_dereference((__sdata)->link[__link_id], \ - (__sdata)))) - static inline int ieee80211_get_mbssid_beacon_len(struct cfg80211_mbssid_elems *elems, struct cfg80211_rnr_elems *rnr_elems, diff --git a/net/mac80211/link.c b/net/mac80211/link.c index af4d2b2e9a26f82f6d3191f0903c935fde892053..16cbaea93fc32ddca6b6da85a7c4dbf0a87eda78 100644 --- a/net/mac80211/link.c +++ b/net/mac80211/link.c @@ -28,16 +28,8 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata, if (link_id < 0) link_id = 0; - if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { - struct ieee80211_sub_if_data *ap_bss; - struct ieee80211_bss_conf *ap_bss_conf; - - ap_bss = container_of(sdata->bss, - struct ieee80211_sub_if_data, u.ap); - ap_bss_conf = sdata_dereference(ap_bss->vif.link_conf[link_id], - ap_bss); - memcpy(link_conf, ap_bss_conf, sizeof(*link_conf)); - } + rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf); + rcu_assign_pointer(sdata->link[link_id], link); link->sdata = sdata; link->link_id = link_id; @@ -73,9 +65,6 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata, ieee80211_link_debugfs_add(link); } - - rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf); - rcu_assign_pointer(sdata->link[link_id], link); } void ieee80211_link_stop(struct ieee80211_link_data *link) diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index 54930b06c3a4a5208fb3898e5317577af8a95d03..c6395551f5df08e727afde307b06b6f0bfd1f9d4 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c @@ -634,7 +634,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, mesh_path_add_gate(mpath); } rcu_read_unlock(); - } else if (ifmsh->mshcfg.dot11MeshForwarding) { + } else { rcu_read_lock(); mpath = mesh_path_lookup(sdata, target_addr); if (mpath) { @@ -652,8 +652,6 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, } } rcu_read_unlock(); - } else { - forward = false; } if (reply) { @@ -671,7 +669,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, } } - if (forward) { + if (forward && ifmsh->mshcfg.dot11MeshForwarding) { u32 preq_id; u8 hopcount; diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 2c7e139efd532f7e5c98b240581a258509f6f626..42e2c84ed2484a68f085172bc191a1d891a4ac70 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -2959,8 +2959,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, if (tx) ieee80211_flush_queues(local, sdata, false); - if (tx || frame_buf) - drv_mgd_complete_tx(sdata->local, sdata, &info); + drv_mgd_complete_tx(sdata->local, sdata, &info); /* clear AP addr only after building the needed mgmt frames */ eth_zero_addr(sdata->deflink.u.mgd.bssid); @@ -7822,6 +7821,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, req->reason_code, false); + drv_mgd_complete_tx(sdata->local, sdata, &info); return 0; } diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 58665b6ae6354b5baa81e3f59aa021dd1be98585..5eb233f619817b072db90f25e223b3ac83fb1a1e 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -4419,10 +4419,6 @@ static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx) if (!multicast && !ether_addr_equal(sdata->dev->dev_addr, hdr->addr1)) return false; - /* reject invalid/our STA address */ - if (!is_valid_ether_addr(hdr->addr2) || - ether_addr_equal(sdata->dev->dev_addr, hdr->addr2)) - return false; if (!rx->sta) { int rate_idx; if (status->encoding != RX_ENC_LEGACY) diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index ec5469add68a27ab3f22d40311175b24182c3946..45a093d3f1fa7f3e2ab21534208b4a6c97e2ef6e 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -4507,10 +4507,8 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, IEEE80211_TX_CTRL_MLO_LINK_UNSPEC, NULL); } else if (ieee80211_vif_is_mld(&sdata->vif) && - ((sdata->vif.type == NL80211_IFTYPE_AP && - !ieee80211_hw_check(&sdata->local->hw, MLO_MCAST_MULTI_LINK_TX)) || - (sdata->vif.type == NL80211_IFTYPE_AP_VLAN && - !sdata->wdev.use_4addr))) { + sdata->vif.type == NL80211_IFTYPE_AP && + !ieee80211_hw_check(&sdata->local->hw, MLO_MCAST_MULTI_LINK_TX)) { ieee80211_mlo_multicast_tx(dev, skb); } else { normal: diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 3a3cd09bdab658adb7d8dde4fbb7967c7780dff6..154b41af4157d0631cbdf2de9d86d679a2402cb7 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -4753,7 +4753,7 @@ void ieee80211_recalc_dtim(struct ieee80211_local *local, { u64 tsf = drv_get_tsf(local, sdata); u64 dtim_count = 0; - u32 beacon_int = sdata->vif.bss_conf.beacon_int * 1024; + u16 beacon_int = sdata->vif.bss_conf.beacon_int * 1024; u8 dtim_period = sdata->vif.bss_conf.dtim_period; struct ps_data *ps; u8 bcns_from_dtim; diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c index 5a4b175b78c8c9d1182f035c5673e0ec365fdb5f..43e8343df0db714c33a0ce4d68ae5965bde36e8b 100644 --- a/net/mpls/af_mpls.c +++ b/net/mpls/af_mpls.c @@ -81,8 +81,8 @@ static struct mpls_route *mpls_route_input_rcu(struct net *net, unsigned index) if (index < net->mpls.platform_labels) { struct mpls_route __rcu **platform_label = - rcu_dereference_rtnl(net->mpls.platform_label); - rt = rcu_dereference_rtnl(platform_label[index]); + rcu_dereference(net->mpls.platform_label); + rt = rcu_dereference(platform_label[index]); } return rt; } diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 8d4889a730064dbf954d0bae9421dfb9e321995b..6ef98608ac64ccc692a43975f7be06a5673d9272 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -979,9 +979,8 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk, if (subflow->mp_join) goto reset; subflow->mp_capable = 0; - if (!mptcp_try_fallback(ssk)) - goto reset; pr_fallback(msk); + mptcp_do_fallback(ssk); return false; } diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 29c167e5fc02555fec39b7e49638195d37cf041f..157a574fab0ccf870b2f70f934e44587560d2ac3 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -304,14 +304,8 @@ void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq) pr_debug("fail_seq=%llu\n", fail_seq); - /* After accepting the fail, we can't create any other subflows */ - spin_lock_bh(&msk->fallback_lock); - if (!msk->allow_infinite_fallback) { - spin_unlock_bh(&msk->fallback_lock); + if (!READ_ONCE(msk->allow_infinite_fallback)) return; - } - msk->allow_subflows = false; - spin_unlock_bh(&msk->fallback_lock); if (!subflow->fail_tout) { pr_debug("send MP_FAIL response and infinite map\n"); diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index e3f09467b36b2f73d34e3ece1e2d496ab52281ab..140c3ffcb86ba00a09a3c495a3c9c78d931d6dc4 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -623,9 +623,10 @@ static bool mptcp_check_data_fin(struct sock *sk) static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk) { - if (mptcp_try_fallback(ssk)) { + if (READ_ONCE(msk->allow_infinite_fallback)) { MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DSSCORRUPTIONFALLBACK); + mptcp_do_fallback(ssk); } else { MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DSSCORRUPTIONRESET); mptcp_subflow_reset(ssk); @@ -875,7 +876,7 @@ void mptcp_data_ready(struct sock *sk, struct sock *ssk) static void mptcp_subflow_joined(struct mptcp_sock *msk, struct sock *ssk) { mptcp_subflow_ctx(ssk)->map_seq = READ_ONCE(msk->ack_seq); - msk->allow_infinite_fallback = false; + WRITE_ONCE(msk->allow_infinite_fallback, false); mptcp_event(MPTCP_EVENT_SUB_ESTABLISHED, msk, ssk, GFP_ATOMIC); } @@ -886,14 +887,6 @@ static bool __mptcp_finish_join(struct mptcp_sock *msk, struct sock *ssk) if (sk->sk_state != TCP_ESTABLISHED) return false; - spin_lock_bh(&msk->fallback_lock); - if (!msk->allow_subflows) { - spin_unlock_bh(&msk->fallback_lock); - return false; - } - mptcp_subflow_joined(msk, ssk); - spin_unlock_bh(&msk->fallback_lock); - /* attach to msk socket only after we are sure we will deal with it * at close time */ @@ -902,6 +895,7 @@ static bool __mptcp_finish_join(struct mptcp_sock *msk, struct sock *ssk) mptcp_subflow_ctx(ssk)->subflow_id = msk->subflow_id++; mptcp_sockopt_sync_locked(msk, ssk); + mptcp_subflow_joined(msk, ssk); mptcp_stop_tout_timer(sk); __mptcp_propagate_sndbuf(sk, ssk); return true; @@ -1237,14 +1231,10 @@ static void mptcp_update_infinite_map(struct mptcp_sock *msk, mpext->infinite_map = 1; mpext->data_len = 0; - if (!mptcp_try_fallback(ssk)) { - mptcp_subflow_reset(ssk); - return; - } - MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_INFINITEMAPTX); mptcp_subflow_ctx(ssk)->send_infinite_map = 0; pr_fallback(msk); + mptcp_do_fallback(ssk); } #define MPTCP_MAX_GSO_SIZE (GSO_LEGACY_MAX_SIZE - (MAX_TCP_HEADER + 1)) @@ -2616,9 +2606,9 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk) static void __mptcp_retrans(struct sock *sk) { - struct mptcp_sendmsg_info info = { .data_lock_held = true, }; struct mptcp_sock *msk = mptcp_sk(sk); struct mptcp_subflow_context *subflow; + struct mptcp_sendmsg_info info = {}; struct mptcp_data_frag *dfrag; struct sock *ssk; int ret, err; @@ -2663,18 +2653,6 @@ static void __mptcp_retrans(struct sock *sk) info.sent = 0; info.limit = READ_ONCE(msk->csum_enabled) ? dfrag->data_len : dfrag->already_sent; - - /* - * make the whole retrans decision, xmit, disallow - * fallback atomic - */ - spin_lock_bh(&msk->fallback_lock); - if (__mptcp_check_fallback(msk)) { - spin_unlock_bh(&msk->fallback_lock); - release_sock(ssk); - return; - } - while (info.sent < info.limit) { ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info); if (ret <= 0) @@ -2688,9 +2666,8 @@ static void __mptcp_retrans(struct sock *sk) len = max(copied, len); tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle, info.size_goal); - msk->allow_infinite_fallback = false; + WRITE_ONCE(msk->allow_infinite_fallback, false); } - spin_unlock_bh(&msk->fallback_lock); release_sock(ssk); } @@ -2819,13 +2796,11 @@ static void __mptcp_init_sock(struct sock *sk) WRITE_ONCE(msk->first, NULL); inet_csk(sk)->icsk_sync_mss = mptcp_sync_mss; WRITE_ONCE(msk->csum_enabled, mptcp_is_checksum_enabled(sock_net(sk))); - msk->allow_infinite_fallback = true; - msk->allow_subflows = true; + WRITE_ONCE(msk->allow_infinite_fallback, true); msk->recovery = false; msk->subflow_id = 1; mptcp_pm_data_init(msk); - spin_lock_init(&msk->fallback_lock); /* re-use the csk retrans timer for MPTCP-level retrans */ timer_setup(&msk->sk.icsk_retransmit_timer, mptcp_retransmit_timer, 0); @@ -3208,16 +3183,7 @@ static int mptcp_disconnect(struct sock *sk, int flags) * subflow */ mptcp_destroy_common(msk, MPTCP_CF_FASTCLOSE); - - /* The first subflow is already in TCP_CLOSE status, the following - * can't overlap with a fallback anymore - */ - spin_lock_bh(&msk->fallback_lock); - msk->allow_subflows = true; - msk->allow_infinite_fallback = true; WRITE_ONCE(msk->flags, 0); - spin_unlock_bh(&msk->fallback_lock); - msk->cb_flags = 0; msk->recovery = false; msk->can_ack = false; @@ -3633,13 +3599,7 @@ bool mptcp_finish_join(struct sock *ssk) /* active subflow, already present inside the conn_list */ if (!list_empty(&subflow->node)) { - spin_lock_bh(&msk->fallback_lock); - if (!msk->allow_subflows) { - spin_unlock_bh(&msk->fallback_lock); - return false; - } mptcp_subflow_joined(msk, ssk); - spin_unlock_bh(&msk->fallback_lock); mptcp_propagate_sndbuf(parent, ssk); return true; } @@ -3752,7 +3712,7 @@ static void mptcp_subflow_early_fallback(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow) { subflow->request_mptcp = 0; - WARN_ON_ONCE(!__mptcp_try_fallback(msk)); + __mptcp_do_fallback(msk); } static int mptcp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index c5f41cdb36c4b152766391f49462f11ad84a982b..d67add91c9b905910c77afe07b185cff7bb4c9bd 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -330,16 +330,10 @@ struct mptcp_sock { u64 rtt_us; /* last maximum rtt of subflows */ } rcvq_space; u8 scaling_ratio; - bool allow_subflows; u32 subflow_id; u32 setsockopt_seq; char ca_name[TCP_CA_NAME_MAX]; - - spinlock_t fallback_lock; /* protects fallback, - * allow_infinite_fallback and - * allow_join - */ }; #define mptcp_data_lock(sk) spin_lock_bh(&(sk)->sk_lock.slock) @@ -1103,33 +1097,25 @@ static inline bool mptcp_check_fallback(const struct sock *sk) return __mptcp_check_fallback(msk); } -static inline bool __mptcp_try_fallback(struct mptcp_sock *msk) +static inline void __mptcp_do_fallback(struct mptcp_sock *msk) { if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags)) { pr_debug("TCP fallback already done (msk=%p)\n", msk); - return true; - } - spin_lock_bh(&msk->fallback_lock); - if (!msk->allow_infinite_fallback) { - spin_unlock_bh(&msk->fallback_lock); - return false; + return; } - - msk->allow_subflows = false; + if (WARN_ON_ONCE(!READ_ONCE(msk->allow_infinite_fallback))) + return; set_bit(MPTCP_FALLBACK_DONE, &msk->flags); - spin_unlock_bh(&msk->fallback_lock); - return true; } -static inline bool mptcp_try_fallback(struct sock *ssk) +static inline void mptcp_do_fallback(struct sock *ssk) { struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); struct sock *sk = subflow->conn; struct mptcp_sock *msk; msk = mptcp_sk(sk); - if (!__mptcp_try_fallback(msk)) - return false; + __mptcp_do_fallback(msk); if (READ_ONCE(msk->snd_data_fin_enable) && !(ssk->sk_shutdown & SEND_SHUTDOWN)) { gfp_t saved_allocation = ssk->sk_allocation; @@ -1141,7 +1127,6 @@ static inline bool mptcp_try_fallback(struct sock *ssk) tcp_shutdown(ssk, SEND_SHUTDOWN); ssk->sk_allocation = saved_allocation; } - return true; } #define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=%p)\n", __func__, a) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index a01ea18283c726de79e78abae67fccc108dff4fe..f4b8ca8be81e8a56a1cd1208a136a8f293963b17 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -524,11 +524,9 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb) mptcp_get_options(skb, &mp_opt); if (subflow->request_mptcp) { if (!(mp_opt.suboptions & OPTION_MPTCP_MPC_SYNACK)) { - if (!mptcp_try_fallback(sk)) - goto do_reset; - MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPCAPABLEACTIVEFALLBACK); + mptcp_do_fallback(sk); pr_fallback(msk); goto fallback; } @@ -1257,29 +1255,20 @@ static void subflow_sched_work_if_closed(struct mptcp_sock *msk, struct sock *ss mptcp_schedule_work(sk); } -static bool mptcp_subflow_fail(struct mptcp_sock *msk, struct sock *ssk) +static void mptcp_subflow_fail(struct mptcp_sock *msk, struct sock *ssk) { struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); unsigned long fail_tout; - /* we are really failing, prevent any later subflow join */ - spin_lock_bh(&msk->fallback_lock); - if (!msk->allow_infinite_fallback) { - spin_unlock_bh(&msk->fallback_lock); - return false; - } - msk->allow_subflows = false; - spin_unlock_bh(&msk->fallback_lock); - /* greceful failure can happen only on the MPC subflow */ if (WARN_ON_ONCE(ssk != READ_ONCE(msk->first))) - return false; + return; /* since the close timeout take precedence on the fail one, * no need to start the latter when the first is already set */ if (sock_flag((struct sock *)msk, SOCK_DEAD)) - return true; + return; /* we don't need extreme accuracy here, use a zero fail_tout as special * value meaning no fail timeout at all; @@ -1291,7 +1280,6 @@ static bool mptcp_subflow_fail(struct mptcp_sock *msk, struct sock *ssk) tcp_send_ack(ssk); mptcp_reset_tout_timer(msk, subflow->fail_tout); - return true; } static bool subflow_check_data_avail(struct sock *ssk) @@ -1352,16 +1340,17 @@ static bool subflow_check_data_avail(struct sock *ssk) (subflow->mp_join || subflow->valid_csum_seen)) { subflow->send_mp_fail = 1; - if (!mptcp_subflow_fail(msk, ssk)) { + if (!READ_ONCE(msk->allow_infinite_fallback)) { subflow->reset_transient = 0; subflow->reset_reason = MPTCP_RST_EMIDDLEBOX; goto reset; } + mptcp_subflow_fail(msk, ssk); WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_DATA_AVAIL); return true; } - if (!mptcp_try_fallback(ssk)) { + if (!READ_ONCE(msk->allow_infinite_fallback)) { /* fatal protocol error, close the socket. * subflow_error_report() will introduce the appropriate barriers */ @@ -1377,6 +1366,8 @@ static bool subflow_check_data_avail(struct sock *ssk) WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA); return false; } + + mptcp_do_fallback(ssk); } skb = skb_peek(&ssk->sk_receive_queue); @@ -1621,6 +1612,7 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc, /* discard the subflow socket */ mptcp_sock_graft(ssk, sk->sk_socket); iput(SOCK_INODE(sf)); + WRITE_ONCE(msk->allow_infinite_fallback, false); mptcp_stop_tout_timer(sk); return 0; @@ -1798,7 +1790,7 @@ static void subflow_state_change(struct sock *sk) msk = mptcp_sk(parent); if (subflow_simultaneous_connect(sk)) { - WARN_ON_ONCE(!mptcp_try_fallback(sk)); + mptcp_do_fallback(sk); pr_fallback(msk); subflow->conn_finished = 1; mptcp_propagate_state(parent, sk, subflow, NULL); diff --git a/net/ncsi/internal.h b/net/ncsi/internal.h index 2c260f33b55cc56cc81170c9c7288ffcc236c3e7..4e0842df5234ea0478bd9fb455b60df693b624ae 100644 --- a/net/ncsi/internal.h +++ b/net/ncsi/internal.h @@ -143,15 +143,16 @@ struct ncsi_channel_vlan_filter { }; struct ncsi_channel_stats { - u64 hnc_cnt; /* Counter cleared */ - u64 hnc_rx_bytes; /* Rx bytes */ - u64 hnc_tx_bytes; /* Tx bytes */ - u64 hnc_rx_uc_pkts; /* Rx UC packets */ - u64 hnc_rx_mc_pkts; /* Rx MC packets */ - u64 hnc_rx_bc_pkts; /* Rx BC packets */ - u64 hnc_tx_uc_pkts; /* Tx UC packets */ - u64 hnc_tx_mc_pkts; /* Tx MC packets */ - u64 hnc_tx_bc_pkts; /* Tx BC packets */ + u32 hnc_cnt_hi; /* Counter cleared */ + u32 hnc_cnt_lo; /* Counter cleared */ + u32 hnc_rx_bytes; /* Rx bytes */ + u32 hnc_tx_bytes; /* Tx bytes */ + u32 hnc_rx_uc_pkts; /* Rx UC packets */ + u32 hnc_rx_mc_pkts; /* Rx MC packets */ + u32 hnc_rx_bc_pkts; /* Rx BC packets */ + u32 hnc_tx_uc_pkts; /* Tx UC packets */ + u32 hnc_tx_mc_pkts; /* Tx MC packets */ + u32 hnc_tx_bc_pkts; /* Tx BC packets */ u32 hnc_fcs_err; /* FCS errors */ u32 hnc_align_err; /* Alignment errors */ u32 hnc_false_carrier; /* False carrier detection */ @@ -180,7 +181,7 @@ struct ncsi_channel_stats { u32 hnc_tx_1023_frames; /* Tx 512-1023 bytes frames */ u32 hnc_tx_1522_frames; /* Tx 1024-1522 bytes frames */ u32 hnc_tx_9022_frames; /* Tx 1523-9022 bytes frames */ - u64 hnc_rx_valid_bytes; /* Rx valid bytes */ + u32 hnc_rx_valid_bytes; /* Rx valid bytes */ u32 hnc_rx_runt_pkts; /* Rx error runt packets */ u32 hnc_rx_jabber_pkts; /* Rx error jabber packets */ u32 ncsi_rx_cmds; /* Rx NCSI commands */ diff --git a/net/ncsi/ncsi-pkt.h b/net/ncsi/ncsi-pkt.h index 24edb2737972402be8a5bf5229a197756ffd00e0..f2f3b5c1b94126fc48c70cb9ad4dc6e2c2744bdc 100644 --- a/net/ncsi/ncsi-pkt.h +++ b/net/ncsi/ncsi-pkt.h @@ -252,15 +252,16 @@ struct ncsi_rsp_gp_pkt { /* Get Controller Packet Statistics */ struct ncsi_rsp_gcps_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ - __be64 cnt; /* Counter cleared */ - __be64 rx_bytes; /* Rx bytes */ - __be64 tx_bytes; /* Tx bytes */ - __be64 rx_uc_pkts; /* Rx UC packets */ - __be64 rx_mc_pkts; /* Rx MC packets */ - __be64 rx_bc_pkts; /* Rx BC packets */ - __be64 tx_uc_pkts; /* Tx UC packets */ - __be64 tx_mc_pkts; /* Tx MC packets */ - __be64 tx_bc_pkts; /* Tx BC packets */ + __be32 cnt_hi; /* Counter cleared */ + __be32 cnt_lo; /* Counter cleared */ + __be32 rx_bytes; /* Rx bytes */ + __be32 tx_bytes; /* Tx bytes */ + __be32 rx_uc_pkts; /* Rx UC packets */ + __be32 rx_mc_pkts; /* Rx MC packets */ + __be32 rx_bc_pkts; /* Rx BC packets */ + __be32 tx_uc_pkts; /* Tx UC packets */ + __be32 tx_mc_pkts; /* Tx MC packets */ + __be32 tx_bc_pkts; /* Tx BC packets */ __be32 fcs_err; /* FCS errors */ __be32 align_err; /* Alignment errors */ __be32 false_carrier; /* False carrier detection */ @@ -289,11 +290,11 @@ struct ncsi_rsp_gcps_pkt { __be32 tx_1023_frames; /* Tx 512-1023 bytes frames */ __be32 tx_1522_frames; /* Tx 1024-1522 bytes frames */ __be32 tx_9022_frames; /* Tx 1523-9022 bytes frames */ - __be64 rx_valid_bytes; /* Rx valid bytes */ + __be32 rx_valid_bytes; /* Rx valid bytes */ __be32 rx_runt_pkts; /* Rx error runt packets */ __be32 rx_jabber_pkts; /* Rx error jabber packets */ __be32 checksum; /* Checksum */ -} __packed __aligned(4); +}; /* Get NCSI Statistics */ struct ncsi_rsp_gns_pkt { diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c index 8668888c5a2f996a3dbcd390563b7719ab0693c7..4a8ce2949faeac1b44f30f127edc86e0d4e0cb22 100644 --- a/net/ncsi/ncsi-rsp.c +++ b/net/ncsi/ncsi-rsp.c @@ -926,15 +926,16 @@ static int ncsi_rsp_handler_gcps(struct ncsi_request *nr) /* Update HNC's statistics */ ncs = &nc->stats; - ncs->hnc_cnt = be64_to_cpu(rsp->cnt); - ncs->hnc_rx_bytes = be64_to_cpu(rsp->rx_bytes); - ncs->hnc_tx_bytes = be64_to_cpu(rsp->tx_bytes); - ncs->hnc_rx_uc_pkts = be64_to_cpu(rsp->rx_uc_pkts); - ncs->hnc_rx_mc_pkts = be64_to_cpu(rsp->rx_mc_pkts); - ncs->hnc_rx_bc_pkts = be64_to_cpu(rsp->rx_bc_pkts); - ncs->hnc_tx_uc_pkts = be64_to_cpu(rsp->tx_uc_pkts); - ncs->hnc_tx_mc_pkts = be64_to_cpu(rsp->tx_mc_pkts); - ncs->hnc_tx_bc_pkts = be64_to_cpu(rsp->tx_bc_pkts); + ncs->hnc_cnt_hi = ntohl(rsp->cnt_hi); + ncs->hnc_cnt_lo = ntohl(rsp->cnt_lo); + ncs->hnc_rx_bytes = ntohl(rsp->rx_bytes); + ncs->hnc_tx_bytes = ntohl(rsp->tx_bytes); + ncs->hnc_rx_uc_pkts = ntohl(rsp->rx_uc_pkts); + ncs->hnc_rx_mc_pkts = ntohl(rsp->rx_mc_pkts); + ncs->hnc_rx_bc_pkts = ntohl(rsp->rx_bc_pkts); + ncs->hnc_tx_uc_pkts = ntohl(rsp->tx_uc_pkts); + ncs->hnc_tx_mc_pkts = ntohl(rsp->tx_mc_pkts); + ncs->hnc_tx_bc_pkts = ntohl(rsp->tx_bc_pkts); ncs->hnc_fcs_err = ntohl(rsp->fcs_err); ncs->hnc_align_err = ntohl(rsp->align_err); ncs->hnc_false_carrier = ntohl(rsp->false_carrier); @@ -963,7 +964,7 @@ static int ncsi_rsp_handler_gcps(struct ncsi_request *nr) ncs->hnc_tx_1023_frames = ntohl(rsp->tx_1023_frames); ncs->hnc_tx_1522_frames = ntohl(rsp->tx_1522_frames); ncs->hnc_tx_9022_frames = ntohl(rsp->tx_9022_frames); - ncs->hnc_rx_valid_bytes = be64_to_cpu(rsp->rx_valid_bytes); + ncs->hnc_rx_valid_bytes = ntohl(rsp->rx_valid_bytes); ncs->hnc_rx_runt_pkts = ntohl(rsp->rx_runt_pkts); ncs->hnc_rx_jabber_pkts = ntohl(rsp->rx_jabber_pkts); diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 0081c1a0d5e56373df5f1a2dc2daf039a661b586..34ad5975fbf3babda40d60f39eff36d945dd3638 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -1075,12 +1075,6 @@ static int nf_ct_resolve_clash_harder(struct sk_buff *skb, u32 repl_idx) hlist_nulls_add_head_rcu(&loser_ct->tuplehash[IP_CT_DIR_REPLY].hnnode, &nf_conntrack_hash[repl_idx]); - /* confirmed bit must be set after hlist add, not before: - * loser_ct can still be visible to other cpu due to - * SLAB_TYPESAFE_BY_RCU. - */ - smp_mb__before_atomic(); - set_bit(IPS_CONFIRMED_BIT, &loser_ct->status); NF_CT_STAT_INC(net, clash_resolve); return NF_ACCEPT; @@ -1217,6 +1211,8 @@ __nf_conntrack_confirm(struct sk_buff *skb) * user context, else we insert an already 'dead' hash, blocking * further use of that particular connection -JM. */ + ct->status |= IPS_CONFIRMED; + if (unlikely(nf_ct_is_dying(ct))) { NF_CT_STAT_INC(net, insert_failed); goto dying; @@ -1248,7 +1244,7 @@ __nf_conntrack_confirm(struct sk_buff *skb) } } - /* Timeout is relative to confirmation time, not original + /* Timer relative to confirmation time, not original setting time, otherwise we'd get timer wrap in weird delay cases. */ ct->timeout += nfct_time_stamp; @@ -1256,21 +1252,11 @@ __nf_conntrack_confirm(struct sk_buff *skb) __nf_conntrack_insert_prepare(ct); /* Since the lookup is lockless, hash insertion must be done after - * setting ct->timeout. The RCU barriers guarantee that no other CPU - * can find the conntrack before the above stores are visible. + * starting the timer and setting the CONFIRMED bit. The RCU barriers + * guarantee that no other CPU can find the conntrack before the above + * stores are visible. */ __nf_conntrack_hash_insert(ct, hash, reply_hash); - - /* IPS_CONFIRMED unset means 'ct not (yet) in hash', conntrack lookups - * skip entries that lack this bit. This happens when a CPU is looking - * at a stale entry that is being recycled due to SLAB_TYPESAFE_BY_RCU - * or when another CPU encounters this entry right after the insertion - * but before the set-confirm-bit below. This bit must not be set until - * after __nf_conntrack_hash_insert(). - */ - smp_mb__before_atomic(); - set_bit(IPS_CONFIRMED_BIT, &ct->status); - nf_conntrack_double_unlock(hash, reply_hash); local_bh_enable(); diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c index 9df883d79acc92162e03d55f62bc6350944356b0..ccca6e3848bcc81df5907e40c71f4b3042a3cb2e 100644 --- a/net/netfilter/nf_nat_core.c +++ b/net/netfilter/nf_nat_core.c @@ -248,7 +248,7 @@ static noinline bool nf_nat_used_tuple_new(const struct nf_conntrack_tuple *tuple, const struct nf_conn *ignored_ct) { - static const unsigned long uses_nat = IPS_NAT_MASK | IPS_SEQ_ADJUST; + static const unsigned long uses_nat = IPS_NAT_MASK | IPS_SEQ_ADJUST_BIT; const struct nf_conntrack_tuple_hash *thash; const struct nf_conntrack_zone *zone; struct nf_conn *ct; @@ -287,14 +287,8 @@ nf_nat_used_tuple_new(const struct nf_conntrack_tuple *tuple, zone = nf_ct_zone(ignored_ct); thash = nf_conntrack_find_get(net, zone, tuple); - if (unlikely(!thash)) { - struct nf_conntrack_tuple reply; - - nf_ct_invert_tuple(&reply, tuple); - thash = nf_conntrack_find_get(net, zone, &reply); - if (!thash) /* clashing entry went away */ - return false; - } + if (unlikely(!thash)) /* clashing entry went away */ + return false; ct = nf_ct_tuplehash_to_ctrack(thash); diff --git a/net/netfilter/nft_quota.c b/net/netfilter/nft_quota.c index df0798da2329b9150db43a236fb5570d40a0a445..9b2d7463d3d32698069e93fdbc94f4910e1a3d55 100644 --- a/net/netfilter/nft_quota.c +++ b/net/netfilter/nft_quota.c @@ -19,16 +19,10 @@ struct nft_quota { }; static inline bool nft_overquota(struct nft_quota *priv, - const struct sk_buff *skb, - bool *report) + const struct sk_buff *skb) { - u64 consumed = atomic64_add_return(skb->len, priv->consumed); - u64 quota = atomic64_read(&priv->quota); - - if (report) - *report = consumed >= quota; - - return consumed > quota; + return atomic64_add_return(skb->len, priv->consumed) >= + atomic64_read(&priv->quota); } static inline bool nft_quota_invert(struct nft_quota *priv) @@ -40,7 +34,7 @@ static inline void nft_quota_do_eval(struct nft_quota *priv, struct nft_regs *regs, const struct nft_pktinfo *pkt) { - if (nft_overquota(priv, pkt->skb, NULL) ^ nft_quota_invert(priv)) + if (nft_overquota(priv, pkt->skb) ^ nft_quota_invert(priv)) regs->verdict.code = NFT_BREAK; } @@ -57,13 +51,13 @@ static void nft_quota_obj_eval(struct nft_object *obj, const struct nft_pktinfo *pkt) { struct nft_quota *priv = nft_obj_data(obj); - bool overquota, report; + bool overquota; - overquota = nft_overquota(priv, pkt->skb, &report); + overquota = nft_overquota(priv, pkt->skb); if (overquota ^ nft_quota_invert(priv)) regs->verdict.code = NFT_BREAK; - if (report && + if (overquota && !test_and_set_bit(NFT_QUOTA_DEPLETED_BIT, &priv->flags)) nft_obj_notify(nft_net(pkt), obj->key.table, obj, 0, 0, NFT_MSG_NEWOBJ, 0, nft_pf(pkt), 0, GFP_ATOMIC); diff --git a/net/netfilter/nft_set_pipapo_avx2.c b/net/netfilter/nft_set_pipapo_avx2.c index be7c16c79f711ef5b32e8f64df22715be6574a90..c15db28c5ebc438a1522df866decc99123161fa7 100644 --- a/net/netfilter/nft_set_pipapo_avx2.c +++ b/net/netfilter/nft_set_pipapo_avx2.c @@ -1113,25 +1113,6 @@ bool nft_pipapo_avx2_estimate(const struct nft_set_desc *desc, u32 features, return true; } -/** - * pipapo_resmap_init_avx2() - Initialise result map before first use - * @m: Matching data, including mapping table - * @res_map: Result map - * - * Like pipapo_resmap_init() but do not set start map bits covered by the first field. - */ -static inline void pipapo_resmap_init_avx2(const struct nft_pipapo_match *m, unsigned long *res_map) -{ - const struct nft_pipapo_field *f = m->f; - int i; - - /* Starting map doesn't need to be set to all-ones for this implementation, - * but we do need to zero the remaining bits, if any. - */ - for (i = f->bsize; i < m->bsize_max; i++) - res_map[i] = 0ul; -} - /** * nft_pipapo_avx2_lookup() - Lookup function for AVX2 implementation * @net: Network namespace @@ -1190,7 +1171,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set, res = scratch->map + (map_index ? m->bsize_max : 0); fill = scratch->map + (map_index ? 0 : m->bsize_max); - pipapo_resmap_init_avx2(m, res); + /* Starting map doesn't need to be set for this implementation */ nft_pipapo_avx2_prepare(); diff --git a/net/netfilter/nft_tunnel.c b/net/netfilter/nft_tunnel.c index 3e3ae29dde3359c456e18385a95100dee203e47a..d499eb3f4f2978ffb9bcbe061b4650de0ecb4bab 100644 --- a/net/netfilter/nft_tunnel.c +++ b/net/netfilter/nft_tunnel.c @@ -617,10 +617,10 @@ static int nft_tunnel_opts_dump(struct sk_buff *skb, struct geneve_opt *opt; int offset = 0; + inner = nla_nest_start_noflag(skb, NFTA_TUNNEL_KEY_OPTS_GENEVE); + if (!inner) + goto failure; while (opts->len > offset) { - inner = nla_nest_start_noflag(skb, NFTA_TUNNEL_KEY_OPTS_GENEVE); - if (!inner) - goto failure; opt = (struct geneve_opt *)(opts->u.data + offset); if (nla_put_be16(skb, NFTA_TUNNEL_KEY_GENEVE_CLASS, opt->opt_class) || @@ -630,8 +630,8 @@ static int nft_tunnel_opts_dump(struct sk_buff *skb, opt->length * 4, opt->opt_data)) goto inner_failure; offset += sizeof(*opt) + opt->length * 4; - nla_nest_end(skb, inner); } + nla_nest_end(skb, inner); } nla_nest_end(skb, nest); return 0; diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index daef0eeaea2c7a0533ea24ffa9c92696728eb4ec..27511c90a26f40c27de9d868c6ff268a436ac7d2 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c @@ -1140,11 +1140,6 @@ int netlbl_conn_setattr(struct sock *sk, break; #if IS_ENABLED(CONFIG_IPV6) case AF_INET6: - if (sk->sk_family != AF_INET6) { - ret_val = -EAFNOSUPPORT; - goto conn_setattr_return; - } - addr6 = (struct sockaddr_in6 *)addr; entry = netlbl_domhsh_getentry_af6(secattr->domain, &addr6->sin6_addr); diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 0a412d9a8e5fdbb90bf643c63e5a52adf2d63901..4aa2cbe9d6fa69957fd99025ba72f5932fdc8287 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -387,6 +387,7 @@ static void netlink_skb_set_owner_r(struct sk_buff *skb, struct sock *sk) WARN_ON(skb->sk != NULL); skb->sk = sk; skb->destructor = netlink_skb_destructor; + atomic_add(skb->truesize, &sk->sk_rmem_alloc); sk_mem_charge(sk, skb->truesize); } @@ -1222,48 +1223,41 @@ static struct sk_buff *netlink_alloc_large_skb(unsigned int size, int netlink_attachskb(struct sock *sk, struct sk_buff *skb, long *timeo, struct sock *ssk) { - DECLARE_WAITQUEUE(wait, current); struct netlink_sock *nlk; - unsigned int rmem; nlk = nlk_sk(sk); - rmem = atomic_add_return(skb->truesize, &sk->sk_rmem_alloc); - if ((rmem == skb->truesize || rmem < READ_ONCE(sk->sk_rcvbuf)) && - !test_bit(NETLINK_S_CONGESTED, &nlk->state)) { - netlink_skb_set_owner_r(skb, sk); - return 0; - } - - atomic_sub(skb->truesize, &sk->sk_rmem_alloc); - - if (!*timeo) { - if (!ssk || netlink_is_kernel(ssk)) - netlink_overrun(sk); - sock_put(sk); - kfree_skb(skb); - return -EAGAIN; - } + if ((atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || + test_bit(NETLINK_S_CONGESTED, &nlk->state))) { + DECLARE_WAITQUEUE(wait, current); + if (!*timeo) { + if (!ssk || netlink_is_kernel(ssk)) + netlink_overrun(sk); + sock_put(sk); + kfree_skb(skb); + return -EAGAIN; + } - __set_current_state(TASK_INTERRUPTIBLE); - add_wait_queue(&nlk->wait, &wait); - rmem = atomic_read(&sk->sk_rmem_alloc); + __set_current_state(TASK_INTERRUPTIBLE); + add_wait_queue(&nlk->wait, &wait); - if (((rmem && rmem + skb->truesize > READ_ONCE(sk->sk_rcvbuf)) || - test_bit(NETLINK_S_CONGESTED, &nlk->state)) && - !sock_flag(sk, SOCK_DEAD)) - *timeo = schedule_timeout(*timeo); + if ((atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || + test_bit(NETLINK_S_CONGESTED, &nlk->state)) && + !sock_flag(sk, SOCK_DEAD)) + *timeo = schedule_timeout(*timeo); - __set_current_state(TASK_RUNNING); - remove_wait_queue(&nlk->wait, &wait); - sock_put(sk); + __set_current_state(TASK_RUNNING); + remove_wait_queue(&nlk->wait, &wait); + sock_put(sk); - if (signal_pending(current)) { - kfree_skb(skb); - return sock_intr_errno(*timeo); + if (signal_pending(current)) { + kfree_skb(skb); + return sock_intr_errno(*timeo); + } + return 1; } - - return 1; + netlink_skb_set_owner_r(skb, sk); + return 0; } static int __netlink_sendskb(struct sock *sk, struct sk_buff *skb) @@ -1323,7 +1317,6 @@ static int netlink_unicast_kernel(struct sock *sk, struct sk_buff *skb, ret = -ECONNREFUSED; if (nlk->netlink_rcv != NULL) { ret = skb->len; - atomic_add(skb->truesize, &sk->sk_rmem_alloc); netlink_skb_set_owner_r(skb, sk); NETLINK_CB(skb).sk = ssk; netlink_deliver_tap_kernel(sk, ssk, skb); @@ -1400,19 +1393,13 @@ EXPORT_SYMBOL_GPL(netlink_strict_get_check); static int netlink_broadcast_deliver(struct sock *sk, struct sk_buff *skb) { struct netlink_sock *nlk = nlk_sk(sk); - unsigned int rmem, rcvbuf; - rmem = atomic_add_return(skb->truesize, &sk->sk_rmem_alloc); - rcvbuf = READ_ONCE(sk->sk_rcvbuf); - - if ((rmem == skb->truesize || rmem <= rcvbuf) && + if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf && !test_bit(NETLINK_S_CONGESTED, &nlk->state)) { netlink_skb_set_owner_r(skb, sk); __netlink_sendskb(sk, skb); - return rmem > (rcvbuf >> 1); + return atomic_read(&sk->sk_rmem_alloc) > (sk->sk_rcvbuf >> 1); } - - atomic_sub(skb->truesize, &sk->sk_rmem_alloc); return -1; } @@ -2199,7 +2186,6 @@ static int netlink_dump(struct sock *sk, bool lock_taken) struct netlink_ext_ack extack = {}; struct netlink_callback *cb; struct sk_buff *skb = NULL; - unsigned int rmem, rcvbuf; size_t max_recvmsg_len; struct module *module; int err = -ENOBUFS; @@ -2213,6 +2199,9 @@ static int netlink_dump(struct sock *sk, bool lock_taken) goto errout_skb; } + if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) + goto errout_skb; + /* NLMSG_GOODSIZE is small to avoid high order allocations being * required, but it makes sense to _attempt_ a 16K bytes allocation * to reduce number of system calls on dump operations, if user @@ -2235,13 +2224,6 @@ static int netlink_dump(struct sock *sk, bool lock_taken) if (!skb) goto errout_skb; - rcvbuf = READ_ONCE(sk->sk_rcvbuf); - rmem = atomic_add_return(skb->truesize, &sk->sk_rmem_alloc); - if (rmem != skb->truesize && rmem >= rcvbuf) { - atomic_sub(skb->truesize, &sk->sk_rmem_alloc); - goto errout_skb; - } - /* Trim skb to allocated size. User is expected to provide buffer as * large as max(min_dump_alloc, 16KiB (mac_recvmsg_len capped at * netlink_recvmsg())). dump will pack as many smaller messages as diff --git a/net/nfc/nci/uart.c b/net/nfc/nci/uart.c index aab107727f186ee4cde33b644f96ed72cfedbed6..ed1508a9e093eda56937b9bd7663b8eb31e13890 100644 --- a/net/nfc/nci/uart.c +++ b/net/nfc/nci/uart.c @@ -119,22 +119,22 @@ static int nci_uart_set_driver(struct tty_struct *tty, unsigned int driver) memcpy(nu, nci_uart_drivers[driver], sizeof(struct nci_uart)); nu->tty = tty; + tty->disc_data = nu; skb_queue_head_init(&nu->tx_q); INIT_WORK(&nu->write_work, nci_uart_write_work); spin_lock_init(&nu->rx_lock); ret = nu->ops.open(nu); if (ret) { + tty->disc_data = NULL; kfree(nu); - return ret; } else if (!try_module_get(nu->owner)) { nu->ops.close(nu); + tty->disc_data = NULL; kfree(nu); return -ENOENT; } - tty->disc_data = nu; - - return 0; + return ret; } /* ------ LDISC part ------ */ diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index b80bd3a9077397c944dcb82446dfd93e2751b446..8a848ce72e29102dc937238d62460befce26b630 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c @@ -788,7 +788,7 @@ static int key_extract_l3l4(struct sk_buff *skb, struct sw_flow_key *key) memset(&key->ipv4, 0, sizeof(key->ipv4)); } } else if (eth_p_mpls(key->eth.type)) { - size_t label_count = 1; + u8 label_count = 1; memset(&key->mpls, 0, sizeof(key->mpls)); skb_set_inner_network_header(skb, skb->mac_len); diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 9cac7cb78c0f54ae597efd6c6904d4581cad01ef..4abf7e9ac4f2f70b25797664c5dbdf0a1ae19205 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -2791,7 +2791,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) int len_sum = 0; int status = TP_STATUS_AVAILABLE; int hlen, tlen, copylen = 0; - long timeo; + long timeo = 0; mutex_lock(&po->pg_vec_lock); @@ -2845,28 +2845,22 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) if ((size_max > dev->mtu + reserve + VLAN_HLEN) && !vnet_hdr_sz) size_max = dev->mtu + reserve + VLAN_HLEN; - timeo = sock_sndtimeo(&po->sk, msg->msg_flags & MSG_DONTWAIT); reinit_completion(&po->skb_completion); do { ph = packet_current_frame(po, &po->tx_ring, TP_STATUS_SEND_REQUEST); if (unlikely(ph == NULL)) { - /* Note: packet_read_pending() might be slow if we - * have to call it as it's per_cpu variable, but in - * fast-path we don't have to call it, only when ph - * is NULL, we need to check the pending_refcnt. - */ - if (need_wait && packet_read_pending(&po->tx_ring)) { + if (need_wait && skb) { + timeo = sock_sndtimeo(&po->sk, msg->msg_flags & MSG_DONTWAIT); timeo = wait_for_completion_interruptible_timeout(&po->skb_completion, timeo); if (timeo <= 0) { err = !timeo ? -ETIMEDOUT : -ERESTARTSYS; goto out_put; } - /* check for additional frames */ - continue; - } else - break; + } + /* check for additional frames */ + continue; } skb = NULL; @@ -2955,7 +2949,14 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) } packet_increment_head(&po->tx_ring); len_sum += tp_len; - } while (1); + } while (likely((ph != NULL) || + /* Note: packet_read_pending() might be slow if we have + * to call it as it's per_cpu variable, but in fast-path + * we already short-circuit the loop with the first + * condition, and luckily don't have to go that path + * anyway. + */ + (need_wait && packet_read_pending(&po->tx_ring)))); err = len_sum; goto out_put; diff --git a/net/phonet/pep.c b/net/phonet/pep.c index e14b2b2d3b5cd74abcb6736657aa1640279ff697..3dd5f52bc1b58e3f1ee4e235126438c723f1f73c 100644 --- a/net/phonet/pep.c +++ b/net/phonet/pep.c @@ -826,7 +826,6 @@ static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp, } /* Check for duplicate pipe handle */ - pn_skb_get_dst_sockaddr(skb, &dst); newsk = pep_find_pipe(&pn->hlist, &dst, pipe_handle); if (unlikely(newsk)) { __sock_put(newsk); @@ -851,6 +850,7 @@ static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp, newsk->sk_destruct = pipe_destruct; newpn = pep_sk(newsk); + pn_skb_get_dst_sockaddr(skb, &dst); pn_skb_get_src_sockaddr(skb, &src); newpn->pn_sk.sobject = pn_sockaddr_get_object(&dst); newpn->pn_sk.dobject = pn_sockaddr_get_object(&src); diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c index a7054546f52dfa2909e0183a2cfc8abc63ad6f94..fee772b4637c8897cd606b6e7c30447619327cab 100644 --- a/net/rose/rose_route.c +++ b/net/rose/rose_route.c @@ -497,15 +497,22 @@ void rose_rt_device_down(struct net_device *dev) t = rose_node; rose_node = rose_node->next; - for (i = t->count - 1; i >= 0; i--) { + for (i = 0; i < t->count; i++) { if (t->neighbour[i] != s) continue; t->count--; - memmove(&t->neighbour[i], &t->neighbour[i + 1], - sizeof(t->neighbour[0]) * - (t->count - i)); + switch (i) { + case 0: + t->neighbour[0] = t->neighbour[1]; + fallthrough; + case 1: + t->neighbour[1] = t->neighbour[2]; + break; + case 2: + break; + } } if (t->count <= 0) diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c index 37ac8a6656786626af064716ca854625958e35d4..0f5a1d77b890f83d61edf3b47bf8d5d7a420135e 100644 --- a/net/rxrpc/call_accept.c +++ b/net/rxrpc/call_accept.c @@ -149,7 +149,6 @@ static int rxrpc_service_prealloc_one(struct rxrpc_sock *rx, id_in_use: write_unlock(&rx->call_lock); - rxrpc_prefail_call(call, RXRPC_CALL_LOCAL_ERROR, -EBADSLT); rxrpc_cleanup_call(call); _leave(" = -EBADSLT"); return -EBADSLT; @@ -219,7 +218,6 @@ void rxrpc_discard_prealloc(struct rxrpc_sock *rx) tail = b->call_backlog_tail; while (CIRC_CNT(head, tail, size) > 0) { struct rxrpc_call *call = b->call_backlog[tail]; - rxrpc_see_call(call, rxrpc_call_see_discard); rcu_assign_pointer(call->socket, rx); if (rx->discard_new_call) { _debug("discard %lx", call->user_call_ID); @@ -255,9 +253,6 @@ static struct rxrpc_call *rxrpc_alloc_incoming_call(struct rxrpc_sock *rx, unsigned short call_tail, conn_tail, peer_tail; unsigned short call_count, conn_count; - if (!b) - return NULL; - /* #calls >= #conns >= #peers must hold true. */ call_head = smp_load_acquire(&b->call_backlog_head); call_tail = b->call_backlog_tail; diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index 4bbb27a48bd8ae61cae9dcf78e827dbbba61df4c..cad6a7d18e0405ff82bee51bbb6f3192d4f963d6 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c @@ -589,9 +589,6 @@ void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb) __be32 code; int ret, ioc; - if (sp->hdr.type == RXRPC_PACKET_TYPE_ABORT) - return; /* Never abort an abort. */ - rxrpc_see_skb(skb, rxrpc_skb_see_reject); iov[0].iov_base = &whdr; diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c index e24a44bae9a32c06b16da3cf80cfe0b78309ea20..a482f88c5fc5b693ab8c95c2a06e34647a59e9cd 100644 --- a/net/rxrpc/recvmsg.c +++ b/net/rxrpc/recvmsg.c @@ -351,16 +351,6 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, goto try_again; } - rxrpc_see_call(call, rxrpc_call_see_recvmsg); - if (test_bit(RXRPC_CALL_RELEASED, &call->flags)) { - rxrpc_see_call(call, rxrpc_call_see_already_released); - list_del_init(&call->recvmsg_link); - spin_unlock_irq(&rx->recvmsg_lock); - release_sock(&rx->sk); - trace_rxrpc_recvmsg(call->debug_id, rxrpc_recvmsg_unqueue, 0); - rxrpc_put_call(call, rxrpc_call_put_recvmsg); - goto try_again; - } if (!(flags & MSG_PEEK)) list_del_init(&call->recvmsg_link); else @@ -384,13 +374,8 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, release_sock(&rx->sk); - if (test_bit(RXRPC_CALL_RELEASED, &call->flags)) { - rxrpc_see_call(call, rxrpc_call_see_already_released); - mutex_unlock(&call->user_mutex); - if (!(flags & MSG_PEEK)) - rxrpc_put_call(call, rxrpc_call_put_recvmsg); - goto try_again; - } + if (test_bit(RXRPC_CALL_RELEASED, &call->flags)) + BUG(); if (test_bit(RXRPC_CALL_HAS_USERID, &call->flags)) { if (flags & MSG_CMSG_COMPAT) { diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index a300e8c1b53aaa0155defdfa05ed69110ce4a860..df89790c459ad6c41fd47561574782bb01db6ceb 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -334,22 +334,17 @@ struct Qdisc *qdisc_lookup_rcu(struct net_device *dev, u32 handle) return q; } -static struct Qdisc *qdisc_leaf(struct Qdisc *p, u32 classid, - struct netlink_ext_ack *extack) +static struct Qdisc *qdisc_leaf(struct Qdisc *p, u32 classid) { unsigned long cl; const struct Qdisc_class_ops *cops = p->ops->cl_ops; - if (cops == NULL) { - NL_SET_ERR_MSG(extack, "Parent qdisc is not classful"); - return ERR_PTR(-EOPNOTSUPP); - } + if (cops == NULL) + return NULL; cl = cops->find(p, classid); - if (cl == 0) { - NL_SET_ERR_MSG(extack, "Specified class not found"); - return ERR_PTR(-ENOENT); - } + if (cl == 0) + return NULL; return cops->leaf(p, cl); } @@ -784,12 +779,15 @@ static u32 qdisc_alloc_handle(struct net_device *dev) void qdisc_tree_reduce_backlog(struct Qdisc *sch, int n, int len) { + bool qdisc_is_offloaded = sch->flags & TCQ_F_OFFLOADED; const struct Qdisc_class_ops *cops; unsigned long cl; u32 parentid; bool notify; int drops; + if (n == 0 && len == 0) + return; drops = max_t(int, n, 0); rcu_read_lock(); while ((parentid = sch->parent)) { @@ -798,8 +796,17 @@ void qdisc_tree_reduce_backlog(struct Qdisc *sch, int n, int len) if (sch->flags & TCQ_F_NOPARENT) break; - /* Notify parent qdisc only if child qdisc becomes empty. */ - notify = !sch->q.qlen; + /* Notify parent qdisc only if child qdisc becomes empty. + * + * If child was empty even before update then backlog + * counter is screwed and we skip notification because + * parent class is already passive. + * + * If the original child was offloaded then it is allowed + * to be seem as empty, so the parent is notified anyway. + */ + notify = !sch->q.qlen && !WARN_ON_ONCE(!n && + !qdisc_is_offloaded); /* TODO: perform the search on a per txq basis */ sch = qdisc_lookup_rcu(qdisc_dev(sch), TC_H_MAJ(parentid)); if (sch == NULL) { @@ -808,9 +815,6 @@ void qdisc_tree_reduce_backlog(struct Qdisc *sch, int n, int len) } cops = sch->ops->cl_ops; if (notify && cops->qlen_notify) { - /* Note that qlen_notify must be idempotent as it may get called - * multiple times. - */ cl = cops->find(sch, parentid); cops->qlen_notify(sch, cl); } @@ -1502,7 +1506,7 @@ static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, NL_SET_ERR_MSG(extack, "Failed to find qdisc with specified classid"); return -ENOENT; } - q = qdisc_leaf(p, clid, extack); + q = qdisc_leaf(p, clid); } else if (dev_ingress_queue(dev)) { q = rtnl_dereference(dev_ingress_queue(dev)->qdisc_sleeping); } @@ -1513,8 +1517,6 @@ static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, NL_SET_ERR_MSG(extack, "Cannot find specified qdisc on specified device"); return -ENOENT; } - if (IS_ERR(q)) - return PTR_ERR(q); if (tcm->tcm_handle && q->handle != tcm->tcm_handle) { NL_SET_ERR_MSG(extack, "Invalid handle"); @@ -1608,9 +1610,7 @@ static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n, NL_SET_ERR_MSG(extack, "Failed to find specified qdisc"); return -ENOENT; } - q = qdisc_leaf(p, clid, extack); - if (IS_ERR(q)) - return PTR_ERR(q); + q = qdisc_leaf(p, clid); } else if (dev_ingress_queue_create(dev)) { q = rtnl_dereference(dev_ingress_queue(dev)->qdisc_sleeping); } diff --git a/net/sched/sch_ets.c b/net/sched/sch_ets.c index 3ee46f6e005da013d6b92f9a9ea6f961bc76cb3e..9da86db4d2c2fef7766c76768ec1cfba2ef64c59 100644 --- a/net/sched/sch_ets.c +++ b/net/sched/sch_ets.c @@ -661,7 +661,7 @@ static int ets_qdisc_change(struct Qdisc *sch, struct nlattr *opt, for (i = q->nbands; i < oldbands; i++) { if (i >= q->nstrict && q->classes[i].qdisc->q.qlen) list_del_init(&q->classes[i].alist); - qdisc_purge_queue(q->classes[i].qdisc); + qdisc_tree_flush_backlog(q->classes[i].qdisc); } q->nstrict = nstrict; memcpy(q->prio2band, priomap, sizeof(priomap)); diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index afcb83d469ff60b1b4bc17216d8af6330568df32..5d9cccfac4a15542e8a59fb091c1150807e5d976 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -175,11 +175,6 @@ struct hfsc_sched { #define HT_INFINITY 0xffffffffffffffffULL /* infinite time value */ -static bool cl_in_el_or_vttree(struct hfsc_class *cl) -{ - return ((cl->cl_flags & HFSC_FSC) && cl->cl_nactive) || - ((cl->cl_flags & HFSC_RSC) && !RB_EMPTY_NODE(&cl->el_node)); -} /* * eligible tree holds backlogged classes being sorted by their eligible times. @@ -1045,8 +1040,6 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid, if (cl == NULL) return -ENOBUFS; - RB_CLEAR_NODE(&cl->el_node); - err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack); if (err) { kfree(cl); @@ -1577,10 +1570,7 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free) return err; } - sch->qstats.backlog += len; - sch->q.qlen++; - - if (first && !cl_in_el_or_vttree(cl)) { + if (first && !cl->cl_nactive) { if (cl->cl_flags & HFSC_RSC) init_ed(cl, len); if (cl->cl_flags & HFSC_FSC) @@ -1595,6 +1585,9 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free) } + sch->qstats.backlog += len; + sch->q.qlen++; + return NET_XMIT_SUCCESS; } diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 113b305b0d154cfe684a1b4f27323f0869b58a36..716da8c6b3def3fee007ed80dc71156b80e5e82a 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -821,9 +821,7 @@ static struct htb_class *htb_lookup_leaf(struct htb_prio *hprio, const int prio) u32 *pid; } stk[TC_HTB_MAXDEPTH], *sp = stk; - if (unlikely(!hprio->row.rb_node)) - return NULL; - + BUG_ON(!hprio->row.rb_node); sp->root = hprio->row.rb_node; sp->pptr = &hprio->ptr; sp->pid = &hprio->last_ptr_id; diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index fdd9caa41e80fb07cb32865f52ff885b3fec71e3..fdc5ef52c3ee92c40232a5af7c68ce920b61b7e6 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c @@ -211,7 +211,7 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt, memcpy(q->prio2band, qopt->priomap, TC_PRIO_MAX+1); for (i = q->bands; i < oldbands; i++) - qdisc_purge_queue(q->queues[i]); + qdisc_tree_flush_backlog(q->queues[i]); for (i = oldbands; i < q->bands; i++) { q->queues[i] = queues[i]; diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c index c3f9a6375b4ea601ea6dd21a57bb07dee1ed2787..5e557b960bde33799d8e9050fc9fe42ce454f132 100644 --- a/net/sched/sch_qfq.c +++ b/net/sched/sch_qfq.c @@ -412,7 +412,7 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, bool existing = false; struct nlattr *tb[TCA_QFQ_MAX + 1]; struct qfq_aggregate *new_agg = NULL; - u32 weight, lmax, inv_w, old_weight, old_lmax; + u32 weight, lmax, inv_w; int err; int delta_w; @@ -446,16 +446,12 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, inv_w = ONE_FP / weight; weight = ONE_FP / inv_w; - if (cl != NULL) { - sch_tree_lock(sch); - old_weight = cl->agg->class_weight; - old_lmax = cl->agg->lmax; - sch_tree_unlock(sch); - if (lmax == old_lmax && weight == old_weight) - return 0; /* nothing to change */ - } + if (cl != NULL && + lmax == cl->agg->lmax && + weight == cl->agg->class_weight) + return 0; /* nothing to change */ - delta_w = weight - (cl ? old_weight : 0); + delta_w = weight - (cl ? cl->agg->class_weight : 0); if (q->wsum + delta_w > QFQ_MAX_WSUM) { NL_SET_ERR_MSG_FMT_MOD(extack, @@ -539,6 +535,9 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, static void qfq_destroy_class(struct Qdisc *sch, struct qfq_class *cl) { + struct qfq_sched *q = qdisc_priv(sch); + + qfq_rm_from_agg(q, cl); gen_kill_estimator(&cl->rate_est); qdisc_put(cl->qdisc); kfree(cl); @@ -559,7 +558,6 @@ static int qfq_delete_class(struct Qdisc *sch, unsigned long arg, qdisc_purge_queue(cl->qdisc); qdisc_class_hash_remove(&q->clhash, &cl->common); - qfq_rm_from_agg(q, cl); sch_tree_unlock(sch); @@ -630,7 +628,6 @@ static int qfq_dump_class(struct Qdisc *sch, unsigned long arg, { struct qfq_class *cl = (struct qfq_class *)arg; struct nlattr *nest; - u32 class_weight, lmax; tcm->tcm_parent = TC_H_ROOT; tcm->tcm_handle = cl->common.classid; @@ -639,13 +636,8 @@ static int qfq_dump_class(struct Qdisc *sch, unsigned long arg, nest = nla_nest_start_noflag(skb, TCA_OPTIONS); if (nest == NULL) goto nla_put_failure; - - sch_tree_lock(sch); - class_weight = cl->agg->class_weight; - lmax = cl->agg->lmax; - sch_tree_unlock(sch); - if (nla_put_u32(skb, TCA_QFQ_WEIGHT, class_weight) || - nla_put_u32(skb, TCA_QFQ_LMAX, lmax)) + if (nla_put_u32(skb, TCA_QFQ_WEIGHT, cl->agg->class_weight) || + nla_put_u32(skb, TCA_QFQ_LMAX, cl->agg->lmax)) goto nla_put_failure; return nla_nest_end(skb, nest); @@ -662,10 +654,8 @@ static int qfq_dump_class_stats(struct Qdisc *sch, unsigned long arg, memset(&xstats, 0, sizeof(xstats)); - sch_tree_lock(sch); xstats.weight = cl->agg->class_weight; xstats.lmax = cl->agg->lmax; - sch_tree_unlock(sch); if (gnet_stats_copy_basic(d, NULL, &cl->bstats, true) < 0 || gnet_stats_copy_rate_est(d, &cl->rate_est) < 0 || @@ -1504,7 +1494,6 @@ static void qfq_destroy_qdisc(struct Qdisc *sch) for (i = 0; i < q->clhash.hashsize; i++) { hlist_for_each_entry_safe(cl, next, &q->clhash.hash[i], common.hnode) { - qfq_rm_from_agg(q, cl); qfq_destroy_class(sch, cl); } } diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index 3c6b4460cf2c0ce6e585c1702080dca6a9fa1965..16277b6a0238dabc18ef78768ad4495d23999025 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c @@ -283,7 +283,7 @@ static int __red_change(struct Qdisc *sch, struct nlattr **tb, q->userbits = userbits; q->limit = ctl->limit; if (child) { - qdisc_purge_queue(q->qdisc); + qdisc_tree_flush_backlog(q->qdisc); old_child = q->qdisc; q->qdisc = child; } diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index e871cb53946a3ec77cc00b7e059931e54c25aaab..002941d35b643cfc0247caf340037746f308685b 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c @@ -310,10 +310,7 @@ static unsigned int sfq_drop(struct Qdisc *sch, struct sk_buff **to_free) /* It is difficult to believe, but ALL THE SLOTS HAVE LENGTH 1. */ x = q->tail->next; slot = &q->slots[x]; - if (slot->next == x) - q->tail = NULL; /* no more active slots */ - else - q->tail->next = slot->next; + q->tail->next = slot->next; q->ht[slot->hash] = SFQ_EMPTY_SLOT; goto drop; } @@ -656,14 +653,6 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt, NL_SET_ERR_MSG_MOD(extack, "invalid quantum"); return -EINVAL; } - - if (ctl->perturb_period < 0 || - ctl->perturb_period > INT_MAX / HZ) { - NL_SET_ERR_MSG_MOD(extack, "invalid perturb period"); - return -EINVAL; - } - perturb_period = ctl->perturb_period * HZ; - if (ctl_v1 && !red_check_params(ctl_v1->qth_min, ctl_v1->qth_max, ctl_v1->Wlog, ctl_v1->Scell_log, NULL)) return -EINVAL; @@ -680,12 +669,14 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt, headdrop = q->headdrop; maxdepth = q->maxdepth; maxflows = q->maxflows; + perturb_period = q->perturb_period; quantum = q->quantum; flags = q->flags; /* update and validate configuration */ if (ctl->quantum) quantum = ctl->quantum; + perturb_period = ctl->perturb_period * HZ; if (ctl->flows) maxflows = min_t(u32, ctl->flows, SFQ_MAX_FLOWS); if (ctl->divisor) { diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c index d162e2dd860255f13052d76ae5cda949ae7abe6b..951a87909c2974b704032fd547a3fda78cca96df 100644 --- a/net/sched/sch_taprio.c +++ b/net/sched/sch_taprio.c @@ -1338,15 +1338,13 @@ static int taprio_dev_notifier(struct notifier_block *nb, unsigned long event, stab = rtnl_dereference(q->root->stab); - rcu_read_lock(); - oper = rcu_dereference(q->oper_sched); + oper = rtnl_dereference(q->oper_sched); if (oper) taprio_update_queue_max_sdu(q, oper, stab); - admin = rcu_dereference(q->admin_sched); + admin = rtnl_dereference(q->admin_sched); if (admin) taprio_update_queue_max_sdu(q, admin, stab); - rcu_read_unlock(); break; } diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 61dd5c8f23101d589d47fde052e79ad74aa4d28b..f92174008499bb4e8b33d75744a792ca763c7d1c 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -452,7 +452,7 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt, sch_tree_lock(sch); if (child) { - qdisc_purge_queue(q->qdisc); + qdisc_tree_flush_backlog(q->qdisc); old = q->qdisc; q->qdisc = child; } diff --git a/net/sctp/socket.c b/net/sctp/socket.c index adc04e88f349f064f319773ff2d752f3148d591e..b84c5e0a76f52de2f9d82295af9d0f568cd08e36 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -9094,8 +9094,7 @@ static void __sctp_write_space(struct sctp_association *asoc) wq = rcu_dereference(sk->sk_wq); if (wq) { if (waitqueue_active(&wq->wait)) - wake_up_interruptible_poll(&wq->wait, EPOLLOUT | - EPOLLWRNORM | EPOLLWRBAND); + wake_up_interruptible(&wq->wait); /* Note that we try to include the Async I/O support * here by modeling from the current TCP/UDP code. diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 63756607f63272adcff912f86699a58835fb8bdc..4ffb2bcaf3648e5be617477cef77bb34f9a8f2ac 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -2733,13 +2733,8 @@ rpc_decode_header(struct rpc_task *task, struct xdr_stream *xdr) case -EPROTONOSUPPORT: goto out_err; case -EACCES: - /* possible RPCSEC_GSS out-of-sequence event (RFC2203), - * reset recv state and keep waiting, don't retransmit - */ - task->tk_rqstp->rq_reply_bytes_recvd = 0; - task->tk_status = xprt_request_enqueue_receive(task); - task->tk_action = call_transmit_status; - return -EBADMSG; + /* Re-encode with a fresh cred */ + fallthrough; default: goto out_garbage; } diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index f90d84492bbedc7861457dc5a1fb4e6435539f30..29df05879c8e956783469f16a2d693efdba6e33e 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -2724,11 +2724,6 @@ static void xs_tcp_tls_setup_socket(struct work_struct *work) } rpc_shutdown_client(lower_clnt); - /* Check for ingress data that arrived before the socket's - * ->data_ready callback was set up. - */ - xs_poll_check_readable(upper_transport); - out_unlock: current_restore_flags(pflags, PF_MEMALLOC); upper_transport->clnt = NULL; diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c index ea5bb131ebd0602f224f79250be15164ba917f35..c524421ec6525259a65ae6189946b69a43402a01 100644 --- a/net/tipc/crypto.c +++ b/net/tipc/crypto.c @@ -425,7 +425,7 @@ static void tipc_aead_free(struct rcu_head *rp) } free_percpu(aead->tfm_entry); kfree_sensitive(aead->key); - kfree_sensitive(aead); + kfree(aead); } static int tipc_aead_users(struct tipc_aead __rcu *aead) @@ -817,20 +817,12 @@ static int tipc_aead_encrypt(struct tipc_aead *aead, struct sk_buff *skb, goto exit; } - /* Get net to avoid freed tipc_crypto when delete namespace */ - if (!maybe_get_net(aead->crypto->net)) { - tipc_bearer_put(b); - rc = -ENODEV; - goto exit; - } - /* Now, do encrypt */ rc = crypto_aead_encrypt(req); if (rc == -EINPROGRESS || rc == -EBUSY) return rc; tipc_bearer_put(b); - put_net(aead->crypto->net); exit: kfree(ctx); @@ -868,7 +860,6 @@ static void tipc_aead_encrypt_done(void *data, int err) kfree(tx_ctx); tipc_bearer_put(b); tipc_aead_put(aead); - put_net(net); } /** diff --git a/net/tipc/topsrv.c b/net/tipc/topsrv.c index ffe577bf6b5155fd32e30d5a7198bcfaa31d50b6..8ee0c07d00e9bb16259ff2776a111b55885e8bda 100644 --- a/net/tipc/topsrv.c +++ b/net/tipc/topsrv.c @@ -704,10 +704,8 @@ static void tipc_topsrv_stop(struct net *net) for (id = 0; srv->idr_in_use; id++) { con = idr_find(&srv->conn_idr, id); if (con) { - conn_get(con); spin_unlock_bh(&srv->idr_lock); tipc_conn_close(con); - conn_put(con); spin_lock_bh(&srv->idr_lock); } } diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c index e993bd6ed7c26f434b05f2c4370ad371d6f1ae30..b16ca400ff559c348fe37fa55fb8e1f857a49c20 100644 --- a/net/tipc/udp_media.c +++ b/net/tipc/udp_media.c @@ -489,7 +489,7 @@ int tipc_udp_nl_dump_remoteip(struct sk_buff *skb, struct netlink_callback *cb) rtnl_lock(); b = tipc_bearer_find(net, bname); - if (!b || b->bcast_addr.media_id != TIPC_MEDIA_TYPE_UDP) { + if (!b) { rtnl_unlock(); return -EINVAL; } @@ -500,7 +500,7 @@ int tipc_udp_nl_dump_remoteip(struct sk_buff *skb, struct netlink_callback *cb) rtnl_lock(); b = rtnl_dereference(tn->bearer_list[bid]); - if (!b || b->bcast_addr.media_id != TIPC_MEDIA_TYPE_UDP) { + if (!b) { rtnl_unlock(); return -EINVAL; } diff --git a/net/tls/tls_strp.c b/net/tls/tls_strp.c index bea60b0160d1fc34f3c57c475b2a8716d4670bd9..1852fac3e72b7614ef56cb02b5f9cb3b6203a78e 100644 --- a/net/tls/tls_strp.c +++ b/net/tls/tls_strp.c @@ -511,8 +511,9 @@ static int tls_strp_read_sock(struct tls_strparser *strp) if (inq < strp->stm.full_len) return tls_strp_read_copy(strp, true); - tls_strp_load_anchor_with_queue(strp, inq); if (!strp->stm.full_len) { + tls_strp_load_anchor_with_queue(strp, inq); + sz = tls_rx_msg_size(strp, strp->anchor); if (sz < 0) { tls_strp_abort_strp(strp, sz); diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 4a9a3aed5d6d4141a3a45f34fe10373132e5d1a4..6e30fe879d538e2cbae0d2a2f2721da0c302649c 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -908,13 +908,6 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk, &msg_redir, send, flags); lock_sock(sk); if (err < 0) { - /* Regardless of whether the data represented by - * msg_redir is sent successfully, we have already - * uncharged it via sk_msg_return_zero(). The - * msg->sg.size represents the remaining unprocessed - * data, which needs to be uncharged here. - */ - sk_mem_uncharge(sk, msg->sg.size); *copied -= sk_msg_free_nocharge(sk, &msg_redir); msg->sg.size = 0; } @@ -1127,13 +1120,9 @@ static int tls_sw_sendmsg_locked(struct sock *sk, struct msghdr *msg, num_async++; else if (ret == -ENOMEM) goto wait_for_memory; - else if (ctx->open_rec && ret == -ENOSPC) { - if (msg_pl->cork_bytes) { - ret = 0; - goto send_end; - } + else if (ctx->open_rec && ret == -ENOSPC) goto rollback_iter; - } else if (ret != -EAGAIN) + else if (ret != -EAGAIN) goto send_end; } continue; diff --git a/net/unix/Kconfig b/net/unix/Kconfig index 8b5d04210d7cf1963ab85e423d87a55e4ab52e8d..28b232f281ab16083ff9c28377b73e2a79c6a380 100644 --- a/net/unix/Kconfig +++ b/net/unix/Kconfig @@ -16,6 +16,11 @@ config UNIX Say Y unless you know what you are doing. +config UNIX_SCM + bool + depends on UNIX + default y + config AF_UNIX_OOB bool depends on UNIX diff --git a/net/unix/Makefile b/net/unix/Makefile index 4ddd125c4642c78f9eb105ed0d3bd973c3b89de3..20491825b4d0da5bfa9b2b3352125360956b7f34 100644 --- a/net/unix/Makefile +++ b/net/unix/Makefile @@ -11,3 +11,5 @@ unix-$(CONFIG_BPF_SYSCALL) += unix_bpf.o obj-$(CONFIG_UNIX_DIAG) += unix_diag.o unix_diag-y := diag.o + +obj-$(CONFIG_UNIX_SCM) += scm.o diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index f89cd01247f6bb1aca1f66a6f0405da413885c51..ab23c8d72122b22eedd522e583733a944ea032e8 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -117,6 +117,8 @@ #include #include +#include "scm.h" + static atomic_long_t unix_nr_socks; static struct hlist_head bsd_socket_buckets[UNIX_HASH_SIZE / 2]; static spinlock_t bsd_socket_locks[UNIX_HASH_SIZE / 2]; @@ -125,46 +127,6 @@ static spinlock_t bsd_socket_locks[UNIX_HASH_SIZE / 2]; * hash table is protected with spinlock. * each socket state is protected by separate spinlock. */ -#ifdef CONFIG_PROVE_LOCKING -#define cmp_ptr(l, r) (((l) > (r)) - ((l) < (r))) - -static int unix_table_lock_cmp_fn(const struct lockdep_map *a, - const struct lockdep_map *b) -{ - return cmp_ptr(a, b); -} - -static int unix_state_lock_cmp_fn(const struct lockdep_map *_a, - const struct lockdep_map *_b) -{ - const struct unix_sock *a, *b; - - a = container_of(_a, struct unix_sock, lock.dep_map); - b = container_of(_b, struct unix_sock, lock.dep_map); - - /* unix_state_double_lock(): ascending address order. */ - return cmp_ptr(a, b); -} - -static int unix_recvq_lock_cmp_fn(const struct lockdep_map *_a, - const struct lockdep_map *_b) -{ - const struct sock *a, *b; - - a = container_of(_a, struct sock, sk_receive_queue.lock.dep_map); - b = container_of(_b, struct sock, sk_receive_queue.lock.dep_map); - - /* unix_collect_skb(): listener -> embryo order. */ - if (a->sk_state == TCP_LISTEN && unix_sk(b)->listener == a) - return -1; - - /* Should never happen. Just to be symmetric. */ - if (b->sk_state == TCP_LISTEN && unix_sk(a)->listener == b) - return 1; - - return 0; -} -#endif static unsigned int unix_unbound_hash(struct sock *sk) { @@ -207,7 +169,7 @@ static void unix_table_double_lock(struct net *net, swap(hash1, hash2); spin_lock(&net->unx.table.locks[hash1]); - spin_lock(&net->unx.table.locks[hash2]); + spin_lock_nested(&net->unx.table.locks[hash2], SINGLE_DEPTH_NESTING); } static void unix_table_double_unlock(struct net *net, @@ -630,11 +592,6 @@ static void unix_sock_destructor(struct sock *sk) #endif } -static unsigned int unix_skb_len(const struct sk_buff *skb) -{ - return skb->len - UNIXCB(skb).consumed; -} - static void unix_release_sock(struct sock *sk, int embrion) { struct unix_sock *u = unix_sk(sk); @@ -662,23 +619,20 @@ static void unix_release_sock(struct sock *sk, int embrion) unix_state_unlock(sk); #if IS_ENABLED(CONFIG_AF_UNIX_OOB) - u->oob_skb = NULL; + if (u->oob_skb) { + kfree_skb(u->oob_skb); + u->oob_skb = NULL; + } #endif wake_up_interruptible_all(&u->peer_wait); if (skpair != NULL) { if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) { - struct sk_buff *skb = skb_peek(&sk->sk_receive_queue); - -#if IS_ENABLED(CONFIG_AF_UNIX_OOB) - if (skb && !unix_skb_len(skb)) - skb = skb_peek_next(skb, &sk->sk_receive_queue); -#endif unix_state_lock(skpair); /* No more writes */ WRITE_ONCE(skpair->sk_shutdown, SHUTDOWN_MASK); - if (skb || embrion) + if (!skb_queue_empty_lockless(&sk->sk_receive_queue) || embrion) WRITE_ONCE(skpair->sk_err, ECONNRESET); unix_state_unlock(skpair); skpair->sk_state_change(skpair); @@ -1025,15 +979,12 @@ static struct sock *unix_create1(struct net *net, struct socket *sock, int kern, sk->sk_write_space = unix_write_space; sk->sk_max_ack_backlog = READ_ONCE(net->unx.sysctl_max_dgram_qlen); sk->sk_destruct = unix_sock_destructor; - lock_set_cmp_fn(&sk->sk_receive_queue.lock, unix_recvq_lock_cmp_fn, NULL); - u = unix_sk(sk); - u->listener = NULL; - u->vertex = NULL; + u->inflight = 0; u->path.dentry = NULL; u->path.mnt = NULL; spin_lock_init(&u->lock); - lock_set_cmp_fn(&u->lock, unix_state_lock_cmp_fn, NULL); + INIT_LIST_HEAD(&u->link); mutex_init(&u->iolock); /* single task reading lock */ mutex_init(&u->bindlock); /* single task binding lock */ init_waitqueue_head(&u->peer_wait); @@ -1382,12 +1333,11 @@ static void unix_state_double_lock(struct sock *sk1, struct sock *sk2) unix_state_lock(sk1); return; } - if (sk1 > sk2) swap(sk1, sk2); unix_state_lock(sk1); - unix_state_lock(sk2); + unix_state_lock_nested(sk2, U_LOCK_SECOND); } static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2) @@ -1633,7 +1583,6 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, newsk->sk_type = sk->sk_type; init_peercred(newsk); newu = unix_sk(newsk); - newu->listener = other; RCU_INIT_POINTER(newsk->sk_wq, &newu->peer_wq); otheru = unix_sk(other); @@ -1729,8 +1678,8 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags, bool kern) { struct sock *sk = sock->sk; - struct sk_buff *skb; struct sock *tsk; + struct sk_buff *skb; int err; err = -EOPNOTSUPP; @@ -1760,7 +1709,6 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags, /* attach accepted sock to socket */ unix_state_lock(tsk); - unix_update_edges(unix_sk(tsk)); newsock->state = SS_CONNECTED; unix_sock_inherit_flags(sock, newsock); sock_graft(tsk, newsock); @@ -1804,65 +1752,51 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int peer) return err; } -/* The "user->unix_inflight" variable is protected by the garbage - * collection lock, and we just read it locklessly here. If you go - * over the limit, there might be a tiny race in actually noticing - * it across threads. Tough. - */ -static inline bool too_many_unix_fds(struct task_struct *p) -{ - struct user_struct *user = current_user(); - - if (unlikely(READ_ONCE(user->unix_inflight) > task_rlimit(p, RLIMIT_NOFILE))) - return !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN); - return false; -} - -static int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb) -{ - if (too_many_unix_fds(current)) - return -ETOOMANYREFS; - - /* Need to duplicate file references for the sake of garbage - * collection. Otherwise a socket in the fps might become a - * candidate for GC while the skb is not yet queued. - */ - UNIXCB(skb).fp = scm_fp_dup(scm->fp); - if (!UNIXCB(skb).fp) - return -ENOMEM; - - if (unix_prepare_fpl(UNIXCB(skb).fp)) - return -ENOMEM; - - return 0; -} - -static void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb) -{ - scm->fp = UNIXCB(skb).fp; - UNIXCB(skb).fp = NULL; - - unix_destroy_fpl(scm->fp); -} - static void unix_peek_fds(struct scm_cookie *scm, struct sk_buff *skb) { scm->fp = scm_fp_dup(UNIXCB(skb).fp); -} - -static void unix_destruct_scm(struct sk_buff *skb) -{ - struct scm_cookie scm; - - memset(&scm, 0, sizeof(scm)); - scm.pid = UNIXCB(skb).pid; - if (UNIXCB(skb).fp) - unix_detach_fds(&scm, skb); - /* Alas, it calls VFS */ - /* So fscking what? fput() had been SMP-safe since the last Summer */ - scm_destroy(&scm); - sock_wfree(skb); + /* + * Garbage collection of unix sockets starts by selecting a set of + * candidate sockets which have reference only from being in flight + * (total_refs == inflight_refs). This condition is checked once during + * the candidate collection phase, and candidates are marked as such, so + * that non-candidates can later be ignored. While inflight_refs is + * protected by unix_gc_lock, total_refs (file count) is not, hence this + * is an instantaneous decision. + * + * Once a candidate, however, the socket must not be reinstalled into a + * file descriptor while the garbage collection is in progress. + * + * If the above conditions are met, then the directed graph of + * candidates (*) does not change while unix_gc_lock is held. + * + * Any operations that changes the file count through file descriptors + * (dup, close, sendmsg) does not change the graph since candidates are + * not installed in fds. + * + * Dequeing a candidate via recvmsg would install it into an fd, but + * that takes unix_gc_lock to decrement the inflight count, so it's + * serialized with garbage collection. + * + * MSG_PEEK is special in that it does not change the inflight count, + * yet does install the socket into an fd. The following lock/unlock + * pair is to ensure serialization with garbage collection. It must be + * done between incrementing the file count and installing the file into + * an fd. + * + * If garbage collection starts after the barrier provided by the + * lock/unlock, then it will see the elevated refcount and not mark this + * as a candidate. If a garbage collection is already in progress + * before the file count was incremented, then the lock/unlock pair will + * ensure that garbage collection is finished before progressing to + * installing the fd. + * + * (*) A -> B where B is on the queue of A or B is on the queue of C + * which is on the queue of listening socket A. + */ + spin_lock(&unix_gc_lock); + spin_unlock(&unix_gc_lock); } static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds) @@ -1921,10 +1855,8 @@ static void scm_stat_add(struct sock *sk, struct sk_buff *skb) struct scm_fp_list *fp = UNIXCB(skb).fp; struct unix_sock *u = unix_sk(sk); - if (unlikely(fp && fp->count)) { + if (unlikely(fp && fp->count)) atomic_add(fp->count, &u->scm_stat.nr_fds); - unix_add_edges(fp, u); - } } static void scm_stat_del(struct sock *sk, struct sk_buff *skb) @@ -1932,10 +1864,8 @@ static void scm_stat_del(struct sock *sk, struct sk_buff *skb) struct scm_fp_list *fp = UNIXCB(skb).fp; struct unix_sock *u = unix_sk(sk); - if (unlikely(fp && fp->count)) { + if (unlikely(fp && fp->count)) atomic_sub(fp->count, &u->scm_stat.nr_fds); - unix_del_edges(fp); - } } /* @@ -1955,12 +1885,11 @@ static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg, long timeo; int err; + wait_for_unix_gc(); err = scm_send(sock, msg, &scm, false); if (err < 0) return err; - wait_for_unix_gc(scm.fp); - err = -EOPNOTSUPP; if (msg->msg_flags&MSG_OOB) goto out; @@ -2197,9 +2126,13 @@ static int queue_oob(struct socket *sock, struct msghdr *msg, struct sock *other } maybe_add_creds(skb, sock, other); + skb_get(skb); + scm_stat_add(other, skb); spin_lock(&other->sk_receive_queue.lock); + if (ousk->oob_skb) + consume_skb(ousk->oob_skb); WRITE_ONCE(ousk->oob_skb, skb); __skb_queue_tail(&other->sk_receive_queue, skb); spin_unlock(&other->sk_receive_queue.lock); @@ -2224,12 +2157,11 @@ static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg, bool fds_sent = false; int data_len; + wait_for_unix_gc(); err = scm_send(sock, msg, &scm, false); if (err < 0) return err; - wait_for_unix_gc(scm.fp); - err = -EOPNOTSUPP; if (msg->msg_flags & MSG_OOB) { #if IS_ENABLED(CONFIG_AF_UNIX_OOB) @@ -2563,6 +2495,11 @@ static long unix_stream_data_wait(struct sock *sk, long timeo, return timeo; } +static unsigned int unix_skb_len(const struct sk_buff *skb) +{ + return skb->len - UNIXCB(skb).consumed; +} + struct unix_stream_read_state { int (*recv_actor)(struct sk_buff *, int, int, struct unix_stream_read_state *); @@ -2577,11 +2514,11 @@ struct unix_stream_read_state { #if IS_ENABLED(CONFIG_AF_UNIX_OOB) static int unix_stream_recv_urg(struct unix_stream_read_state *state) { - struct sk_buff *oob_skb, *read_skb = NULL; struct socket *sock = state->socket; struct sock *sk = sock->sk; struct unix_sock *u = unix_sk(sk); int chunk = 1; + struct sk_buff *oob_skb; mutex_lock(&u->iolock); unix_state_lock(sk); @@ -2596,15 +2533,10 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state) oob_skb = u->oob_skb; - if (!(state->flags & MSG_PEEK)) { + if (!(state->flags & MSG_PEEK)) WRITE_ONCE(u->oob_skb, NULL); - - if (oob_skb->prev != (struct sk_buff *)&sk->sk_receive_queue && - !unix_skb_len(oob_skb->prev)) { - read_skb = oob_skb->prev; - __skb_unlink(read_skb, &sk->sk_receive_queue); - } - } + else + skb_get(oob_skb); spin_unlock(&sk->sk_receive_queue.lock); unix_state_unlock(sk); @@ -2614,9 +2546,9 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state) if (!(state->flags & MSG_PEEK)) UNIXCB(oob_skb).consumed += 1; - mutex_unlock(&u->iolock); + consume_skb(oob_skb); - consume_skb(read_skb); + mutex_unlock(&u->iolock); if (chunk < 0) return -EFAULT; @@ -2643,10 +2575,12 @@ static struct sk_buff *manage_oob(struct sk_buff *skb, struct sock *sk, if (copied) { skb = NULL; } else if (!(flags & MSG_PEEK)) { - WRITE_ONCE(u->oob_skb, NULL); - - if (!sock_flag(sk, SOCK_URGINLINE)) { + if (sock_flag(sk, SOCK_URGINLINE)) { + WRITE_ONCE(u->oob_skb, NULL); + consume_skb(skb); + } else { __skb_unlink(skb, &sk->sk_receive_queue); + WRITE_ONCE(u->oob_skb, NULL); unlinked_skb = skb; skb = skb_peek(&sk->sk_receive_queue); } @@ -2657,7 +2591,10 @@ static struct sk_buff *manage_oob(struct sk_buff *skb, struct sock *sk, spin_unlock(&sk->sk_receive_queue.lock); - kfree_skb(unlinked_skb); + if (unlinked_skb) { + WARN_ON_ONCE(skb_unref(unlinked_skb)); + kfree_skb(unlinked_skb); + } } return skb; } @@ -2700,6 +2637,7 @@ static int unix_stream_read_skb(struct sock *sk, skb_read_actor_t recv_actor) unix_state_unlock(sk); if (drop) { + WARN_ON_ONCE(skb_unref(skb)); kfree_skb(skb); return -EAGAIN; } @@ -3640,7 +3578,6 @@ static int __net_init unix_net_init(struct net *net) for (i = 0; i < UNIX_HASH_SIZE; i++) { spin_lock_init(&net->unx.table.locks[i]); - lock_set_cmp_fn(&net->unx.table.locks[i], unix_table_lock_cmp_fn, NULL); INIT_HLIST_HEAD(&net->unx.table.buckets[i]); } diff --git a/net/unix/garbage.c b/net/unix/garbage.c index 0068e758be4ddb8c63b5263923e7d0046e2e2f9e..2a758531e10271173cd13cc48aaa78044843262f 100644 --- a/net/unix/garbage.c +++ b/net/unix/garbage.c @@ -81,533 +81,278 @@ #include #include -struct unix_sock *unix_get_socket(struct file *filp) -{ - struct inode *inode = file_inode(filp); - - /* Socket ? */ - if (S_ISSOCK(inode->i_mode) && !(filp->f_mode & FMODE_PATH)) { - struct socket *sock = SOCKET_I(inode); - const struct proto_ops *ops; - struct sock *sk = sock->sk; - - ops = READ_ONCE(sock->ops); - - /* PF_UNIX ? */ - if (sk && ops && ops->family == PF_UNIX) - return unix_sk(sk); - } - - return NULL; -} - -static struct unix_vertex *unix_edge_successor(struct unix_edge *edge) -{ - /* If an embryo socket has a fd, - * the listener indirectly holds the fd's refcnt. - */ - if (edge->successor->listener) - return unix_sk(edge->successor->listener)->vertex; - - return edge->successor->vertex; -} +#include "scm.h" -static bool unix_graph_maybe_cyclic; -static bool unix_graph_grouped; +/* Internal data structures and random procedures: */ -static void unix_update_graph(struct unix_vertex *vertex) -{ - /* If the receiver socket is not inflight, no cyclic - * reference could be formed. - */ - if (!vertex) - return; - - unix_graph_maybe_cyclic = true; - unix_graph_grouped = false; -} - -static LIST_HEAD(unix_unvisited_vertices); - -enum unix_vertex_index { - UNIX_VERTEX_INDEX_MARK1, - UNIX_VERTEX_INDEX_MARK2, - UNIX_VERTEX_INDEX_START, -}; +static LIST_HEAD(gc_candidates); +static DECLARE_WAIT_QUEUE_HEAD(unix_gc_wait); -static unsigned long unix_vertex_unvisited_index = UNIX_VERTEX_INDEX_MARK1; - -static void unix_add_edge(struct scm_fp_list *fpl, struct unix_edge *edge) +static void scan_inflight(struct sock *x, void (*func)(struct unix_sock *), + struct sk_buff_head *hitlist) { - struct unix_vertex *vertex = edge->predecessor->vertex; - - if (!vertex) { - vertex = list_first_entry(&fpl->vertices, typeof(*vertex), entry); - vertex->index = unix_vertex_unvisited_index; - vertex->out_degree = 0; - INIT_LIST_HEAD(&vertex->edges); - INIT_LIST_HEAD(&vertex->scc_entry); - - list_move_tail(&vertex->entry, &unix_unvisited_vertices); - edge->predecessor->vertex = vertex; + struct sk_buff *skb; + struct sk_buff *next; + + spin_lock(&x->sk_receive_queue.lock); + skb_queue_walk_safe(&x->sk_receive_queue, skb, next) { + /* Do we have file descriptors ? */ + if (UNIXCB(skb).fp) { + bool hit = false; + /* Process the descriptors of this socket */ + int nfd = UNIXCB(skb).fp->count; + struct file **fp = UNIXCB(skb).fp->fp; + + while (nfd--) { + /* Get the socket the fd matches if it indeed does so */ + struct sock *sk = unix_get_socket(*fp++); + + if (sk) { + struct unix_sock *u = unix_sk(sk); + + /* Ignore non-candidates, they could + * have been added to the queues after + * starting the garbage collection + */ + if (test_bit(UNIX_GC_CANDIDATE, &u->gc_flags)) { + hit = true; + + func(u); + } + } + } + if (hit && hitlist != NULL) { + __skb_unlink(skb, &x->sk_receive_queue); + __skb_queue_tail(hitlist, skb); + } + } } - - vertex->out_degree++; - list_add_tail(&edge->vertex_entry, &vertex->edges); - - unix_update_graph(unix_edge_successor(edge)); + spin_unlock(&x->sk_receive_queue.lock); } -static void unix_del_edge(struct scm_fp_list *fpl, struct unix_edge *edge) +static void scan_children(struct sock *x, void (*func)(struct unix_sock *), + struct sk_buff_head *hitlist) { - struct unix_vertex *vertex = edge->predecessor->vertex; + if (x->sk_state != TCP_LISTEN) { + scan_inflight(x, func, hitlist); + } else { + struct sk_buff *skb; + struct sk_buff *next; + struct unix_sock *u; + LIST_HEAD(embryos); - if (!fpl->dead) - unix_update_graph(unix_edge_successor(edge)); + /* For a listening socket collect the queued embryos + * and perform a scan on them as well. + */ + spin_lock(&x->sk_receive_queue.lock); + skb_queue_walk_safe(&x->sk_receive_queue, skb, next) { + u = unix_sk(skb->sk); - list_del(&edge->vertex_entry); - vertex->out_degree--; + /* An embryo cannot be in-flight, so it's safe + * to use the list link. + */ + BUG_ON(!list_empty(&u->link)); + list_add_tail(&u->link, &embryos); + } + spin_unlock(&x->sk_receive_queue.lock); - if (!vertex->out_degree) { - edge->predecessor->vertex = NULL; - list_move_tail(&vertex->entry, &fpl->vertices); + while (!list_empty(&embryos)) { + u = list_entry(embryos.next, struct unix_sock, link); + scan_inflight(&u->sk, func, hitlist); + list_del_init(&u->link); + } } } -static void unix_free_vertices(struct scm_fp_list *fpl) +static void dec_inflight(struct unix_sock *usk) { - struct unix_vertex *vertex, *next_vertex; - - list_for_each_entry_safe(vertex, next_vertex, &fpl->vertices, entry) { - list_del(&vertex->entry); - kfree(vertex); - } + usk->inflight--; } -static DEFINE_SPINLOCK(unix_gc_lock); -unsigned int unix_tot_inflight; - -void unix_add_edges(struct scm_fp_list *fpl, struct unix_sock *receiver) +static void inc_inflight(struct unix_sock *usk) { - int i = 0, j = 0; - - spin_lock(&unix_gc_lock); - - if (!fpl->count_unix) - goto out; - - do { - struct unix_sock *inflight = unix_get_socket(fpl->fp[j++]); - struct unix_edge *edge; - - if (!inflight) - continue; - - edge = fpl->edges + i++; - edge->predecessor = inflight; - edge->successor = receiver; - - unix_add_edge(fpl, edge); - } while (i < fpl->count_unix); - - receiver->scm_stat.nr_unix_fds += fpl->count_unix; - WRITE_ONCE(unix_tot_inflight, unix_tot_inflight + fpl->count_unix); -out: - WRITE_ONCE(fpl->user->unix_inflight, fpl->user->unix_inflight + fpl->count); - - spin_unlock(&unix_gc_lock); - - fpl->inflight = true; - - unix_free_vertices(fpl); + usk->inflight++; } -void unix_del_edges(struct scm_fp_list *fpl) +static void inc_inflight_move_tail(struct unix_sock *u) { - struct unix_sock *receiver; - int i = 0; - - spin_lock(&unix_gc_lock); - - if (!fpl->count_unix) - goto out; - - do { - struct unix_edge *edge = fpl->edges + i++; - - unix_del_edge(fpl, edge); - } while (i < fpl->count_unix); - - if (!fpl->dead) { - receiver = fpl->edges[0].successor; - receiver->scm_stat.nr_unix_fds -= fpl->count_unix; - } - WRITE_ONCE(unix_tot_inflight, unix_tot_inflight - fpl->count_unix); -out: - WRITE_ONCE(fpl->user->unix_inflight, fpl->user->unix_inflight - fpl->count); - - spin_unlock(&unix_gc_lock); - - fpl->inflight = false; -} + u->inflight++; -void unix_update_edges(struct unix_sock *receiver) -{ - /* nr_unix_fds is only updated under unix_state_lock(). - * If it's 0 here, the embryo socket is not part of the - * inflight graph, and GC will not see it, so no lock needed. + /* If this still might be part of a cycle, move it to the end + * of the list, so that it's checked even if it was already + * passed over */ - if (!receiver->scm_stat.nr_unix_fds) { - receiver->listener = NULL; - } else { - spin_lock(&unix_gc_lock); - unix_update_graph(unix_sk(receiver->listener)->vertex); - receiver->listener = NULL; - spin_unlock(&unix_gc_lock); - } + if (test_bit(UNIX_GC_MAYBE_CYCLE, &u->gc_flags)) + list_move_tail(&u->link, &gc_candidates); } -int unix_prepare_fpl(struct scm_fp_list *fpl) -{ - struct unix_vertex *vertex; - int i; - - if (!fpl->count_unix) - return 0; - - for (i = 0; i < fpl->count_unix; i++) { - vertex = kmalloc(sizeof(*vertex), GFP_KERNEL); - if (!vertex) - goto err; - - list_add(&vertex->entry, &fpl->vertices); - } - - fpl->edges = kvmalloc_array(fpl->count_unix, sizeof(*fpl->edges), - GFP_KERNEL_ACCOUNT); - if (!fpl->edges) - goto err; - - return 0; - -err: - unix_free_vertices(fpl); - return -ENOMEM; -} +static bool gc_in_progress; +#define UNIX_INFLIGHT_TRIGGER_GC 16000 -void unix_destroy_fpl(struct scm_fp_list *fpl) +void wait_for_unix_gc(void) { - if (fpl->inflight) - unix_del_edges(fpl); - - kvfree(fpl->edges); - unix_free_vertices(fpl); + /* If number of inflight sockets is insane, + * force a garbage collect right now. + * Paired with the WRITE_ONCE() in unix_inflight(), + * unix_notinflight() and gc_in_progress(). + */ + if (READ_ONCE(unix_tot_inflight) > UNIX_INFLIGHT_TRIGGER_GC && + !READ_ONCE(gc_in_progress)) + unix_gc(); + wait_event(unix_gc_wait, !READ_ONCE(gc_in_progress)); } -static bool unix_vertex_dead(struct unix_vertex *vertex) +/* The external entry point: unix_gc() */ +void unix_gc(void) { - struct unix_edge *edge; + struct sk_buff *next_skb, *skb; struct unix_sock *u; - long total_ref; - - list_for_each_entry(edge, &vertex->edges, vertex_entry) { - struct unix_vertex *next_vertex = unix_edge_successor(edge); - - /* The vertex's fd can be received by a non-inflight socket. */ - if (!next_vertex) - return false; - - /* The vertex's fd can be received by an inflight socket in - * another SCC. - */ - if (next_vertex->scc_index != vertex->scc_index) - return false; - } - - /* No receiver exists out of the same SCC. */ - - edge = list_first_entry(&vertex->edges, typeof(*edge), vertex_entry); - u = edge->predecessor; - total_ref = file_count(u->sk.sk_socket->file); - - /* If not close()d, total_ref > out_degree. */ - if (total_ref != vertex->out_degree) - return false; - - return true; -} - -static void unix_collect_skb(struct list_head *scc, struct sk_buff_head *hitlist) -{ - struct unix_vertex *vertex; - - list_for_each_entry_reverse(vertex, scc, scc_entry) { - struct sk_buff_head *queue; - struct unix_edge *edge; - struct unix_sock *u; - - edge = list_first_entry(&vertex->edges, typeof(*edge), vertex_entry); - u = edge->predecessor; - queue = &u->sk.sk_receive_queue; + struct unix_sock *next; + struct sk_buff_head hitlist; + struct list_head cursor; + LIST_HEAD(not_cycle_list); - spin_lock(&queue->lock); + spin_lock(&unix_gc_lock); - if (u->sk.sk_state == TCP_LISTEN) { - struct sk_buff *skb; + /* Avoid a recursive GC. */ + if (gc_in_progress) + goto out; - skb_queue_walk(queue, skb) { - struct sk_buff_head *embryo_queue = &skb->sk->sk_receive_queue; + /* Paired with READ_ONCE() in wait_for_unix_gc(). */ + WRITE_ONCE(gc_in_progress, true); - spin_lock(&embryo_queue->lock); - skb_queue_splice_init(embryo_queue, hitlist); - spin_unlock(&embryo_queue->lock); + /* First, select candidates for garbage collection. Only + * in-flight sockets are considered, and from those only ones + * which don't have any external reference. + * + * Holding unix_gc_lock will protect these candidates from + * being detached, and hence from gaining an external + * reference. Since there are no possible receivers, all + * buffers currently on the candidates' queues stay there + * during the garbage collection. + * + * We also know that no new candidate can be added onto the + * receive queues. Other, non candidate sockets _can_ be + * added to queue, so we must make sure only to touch + * candidates. + * + * Embryos, though never candidates themselves, affect which + * candidates are reachable by the garbage collector. Before + * being added to a listener's queue, an embryo may already + * receive data carrying SCM_RIGHTS, potentially making the + * passed socket a candidate that is not yet reachable by the + * collector. It becomes reachable once the embryo is + * enqueued. Therefore, we must ensure that no SCM-laden + * embryo appears in a (candidate) listener's queue between + * consecutive scan_children() calls. + */ + list_for_each_entry_safe(u, next, &gc_inflight_list, link) { + struct sock *sk = &u->sk; + long total_refs; + + total_refs = file_count(sk->sk_socket->file); + + BUG_ON(!u->inflight); + BUG_ON(total_refs < u->inflight); + if (total_refs == u->inflight) { + list_move_tail(&u->link, &gc_candidates); + __set_bit(UNIX_GC_CANDIDATE, &u->gc_flags); + __set_bit(UNIX_GC_MAYBE_CYCLE, &u->gc_flags); + + if (sk->sk_state == TCP_LISTEN) { + unix_state_lock_nested(sk, U_LOCK_GC_LISTENER); + unix_state_unlock(sk); } - } else { - skb_queue_splice_init(queue, hitlist); } - - spin_unlock(&queue->lock); } -} - -static bool unix_scc_cyclic(struct list_head *scc) -{ - struct unix_vertex *vertex; - struct unix_edge *edge; - - /* SCC containing multiple vertices ? */ - if (!list_is_singular(scc)) - return true; - - vertex = list_first_entry(scc, typeof(*vertex), scc_entry); - - /* Self-reference or a embryo-listener circle ? */ - list_for_each_entry(edge, &vertex->edges, vertex_entry) { - if (unix_edge_successor(edge) == vertex) - return true; - } - - return false; -} -static LIST_HEAD(unix_visited_vertices); -static unsigned long unix_vertex_grouped_index = UNIX_VERTEX_INDEX_MARK2; - -static void __unix_walk_scc(struct unix_vertex *vertex, unsigned long *last_index, - struct sk_buff_head *hitlist) -{ - LIST_HEAD(vertex_stack); - struct unix_edge *edge; - LIST_HEAD(edge_stack); - -next_vertex: - /* Push vertex to vertex_stack and mark it as on-stack - * (index >= UNIX_VERTEX_INDEX_START). - * The vertex will be popped when finalising SCC later. + /* Now remove all internal in-flight reference to children of + * the candidates. */ - list_add(&vertex->scc_entry, &vertex_stack); - - vertex->index = *last_index; - vertex->scc_index = *last_index; - (*last_index)++; + list_for_each_entry(u, &gc_candidates, link) + scan_children(&u->sk, dec_inflight, NULL); - /* Explore neighbour vertices (receivers of the current vertex's fd). */ - list_for_each_entry(edge, &vertex->edges, vertex_entry) { - struct unix_vertex *next_vertex = unix_edge_successor(edge); - - if (!next_vertex) - continue; - - if (next_vertex->index == unix_vertex_unvisited_index) { - /* Iterative deepening depth first search - * - * 1. Push a forward edge to edge_stack and set - * the successor to vertex for the next iteration. - */ - list_add(&edge->stack_entry, &edge_stack); - - vertex = next_vertex; - goto next_vertex; - - /* 2. Pop the edge directed to the current vertex - * and restore the ancestor for backtracking. - */ -prev_vertex: - edge = list_first_entry(&edge_stack, typeof(*edge), stack_entry); - list_del_init(&edge->stack_entry); + /* Restore the references for children of all candidates, + * which have remaining references. Do this recursively, so + * only those remain, which form cyclic references. + * + * Use a "cursor" link, to make the list traversal safe, even + * though elements might be moved about. + */ + list_add(&cursor, &gc_candidates); + while (cursor.next != &gc_candidates) { + u = list_entry(cursor.next, struct unix_sock, link); - next_vertex = vertex; - vertex = edge->predecessor->vertex; + /* Move cursor to after the current position. */ + list_move(&cursor, &u->link); - /* If the successor has a smaller scc_index, two vertices - * are in the same SCC, so propagate the smaller scc_index - * to skip SCC finalisation. - */ - vertex->scc_index = min(vertex->scc_index, next_vertex->scc_index); - } else if (next_vertex->index != unix_vertex_grouped_index) { - /* Loop detected by a back/cross edge. - * - * The successor is on vertex_stack, so two vertices are in - * the same SCC. If the successor has a smaller *scc_index*, - * propagate it to skip SCC finalisation. - */ - vertex->scc_index = min(vertex->scc_index, next_vertex->scc_index); - } else { - /* The successor was already grouped as another SCC */ + if (u->inflight) { + list_move_tail(&u->link, ¬_cycle_list); + __clear_bit(UNIX_GC_MAYBE_CYCLE, &u->gc_flags); + scan_children(&u->sk, inc_inflight_move_tail, NULL); } } + list_del(&cursor); - if (vertex->index == vertex->scc_index) { - struct unix_vertex *v; - struct list_head scc; - bool scc_dead = true; - - /* SCC finalised. - * - * If the scc_index was not updated, all the vertices above on - * vertex_stack are in the same SCC. Group them using scc_entry. - */ - __list_cut_position(&scc, &vertex_stack, &vertex->scc_entry); - - list_for_each_entry_reverse(v, &scc, scc_entry) { - /* Don't restart DFS from this vertex in unix_walk_scc(). */ - list_move_tail(&v->entry, &unix_visited_vertices); - - /* Mark vertex as off-stack. */ - v->index = unix_vertex_grouped_index; - - if (scc_dead) - scc_dead = unix_vertex_dead(v); + /* Now gc_candidates contains only garbage. Restore original + * inflight counters for these as well, and remove the skbuffs + * which are creating the cycle(s). + */ + skb_queue_head_init(&hitlist); + list_for_each_entry(u, &gc_candidates, link) { + scan_children(&u->sk, inc_inflight, &hitlist); + +#if IS_ENABLED(CONFIG_AF_UNIX_OOB) + if (u->oob_skb) { + kfree_skb(u->oob_skb); + u->oob_skb = NULL; } - - if (scc_dead) - unix_collect_skb(&scc, hitlist); - else if (!unix_graph_maybe_cyclic) - unix_graph_maybe_cyclic = unix_scc_cyclic(&scc); - - list_del(&scc); +#endif } - /* Need backtracking ? */ - if (!list_empty(&edge_stack)) - goto prev_vertex; -} - -static void unix_walk_scc(struct sk_buff_head *hitlist) -{ - unsigned long last_index = UNIX_VERTEX_INDEX_START; - - unix_graph_maybe_cyclic = false; - - /* Visit every vertex exactly once. - * __unix_walk_scc() moves visited vertices to unix_visited_vertices. + /* not_cycle_list contains those sockets which do not make up a + * cycle. Restore these to the inflight list. */ - while (!list_empty(&unix_unvisited_vertices)) { - struct unix_vertex *vertex; - - vertex = list_first_entry(&unix_unvisited_vertices, typeof(*vertex), entry); - __unix_walk_scc(vertex, &last_index, hitlist); + while (!list_empty(¬_cycle_list)) { + u = list_entry(not_cycle_list.next, struct unix_sock, link); + __clear_bit(UNIX_GC_CANDIDATE, &u->gc_flags); + list_move_tail(&u->link, &gc_inflight_list); } - list_replace_init(&unix_visited_vertices, &unix_unvisited_vertices); - swap(unix_vertex_unvisited_index, unix_vertex_grouped_index); - - unix_graph_grouped = true; -} - -static void unix_walk_scc_fast(struct sk_buff_head *hitlist) -{ - unix_graph_maybe_cyclic = false; - - while (!list_empty(&unix_unvisited_vertices)) { - struct unix_vertex *vertex; - struct list_head scc; - bool scc_dead = true; - - vertex = list_first_entry(&unix_unvisited_vertices, typeof(*vertex), entry); - list_add(&scc, &vertex->scc_entry); - - list_for_each_entry_reverse(vertex, &scc, scc_entry) { - list_move_tail(&vertex->entry, &unix_visited_vertices); + spin_unlock(&unix_gc_lock); - if (scc_dead) - scc_dead = unix_vertex_dead(vertex); + /* We need io_uring to clean its registered files, ignore all io_uring + * originated skbs. It's fine as io_uring doesn't keep references to + * other io_uring instances and so killing all other files in the cycle + * will put all io_uring references forcing it to go through normal + * release.path eventually putting registered files. + */ + skb_queue_walk_safe(&hitlist, skb, next_skb) { + if (skb->destructor == io_uring_destruct_scm) { + __skb_unlink(skb, &hitlist); + skb_queue_tail(&skb->sk->sk_receive_queue, skb); } - - if (scc_dead) - unix_collect_skb(&scc, hitlist); - else if (!unix_graph_maybe_cyclic) - unix_graph_maybe_cyclic = unix_scc_cyclic(&scc); - - list_del(&scc); } - list_replace_init(&unix_visited_vertices, &unix_unvisited_vertices); -} - -static bool gc_in_progress; - -static void __unix_gc(struct work_struct *work) -{ - struct sk_buff_head hitlist; - struct sk_buff *skb; + /* Here we are. Hitlist is filled. Die. */ + __skb_queue_purge(&hitlist); spin_lock(&unix_gc_lock); - if (!unix_graph_maybe_cyclic) { - spin_unlock(&unix_gc_lock); - goto skip_gc; - } - - __skb_queue_head_init(&hitlist); - - if (unix_graph_grouped) - unix_walk_scc_fast(&hitlist); - else - unix_walk_scc(&hitlist); - - spin_unlock(&unix_gc_lock); + /* There could be io_uring registered files, just push them back to + * the inflight list + */ + list_for_each_entry_safe(u, next, &gc_candidates, link) + list_move_tail(&u->link, &gc_inflight_list); - skb_queue_walk(&hitlist, skb) { - if (UNIXCB(skb).fp) - UNIXCB(skb).fp->dead = true; - } + /* All candidates should have been detached by now. */ + BUG_ON(!list_empty(&gc_candidates)); - __skb_queue_purge(&hitlist); -skip_gc: + /* Paired with READ_ONCE() in wait_for_unix_gc(). */ WRITE_ONCE(gc_in_progress, false); -} - -static DECLARE_WORK(unix_gc_work, __unix_gc); - -void unix_gc(void) -{ - WRITE_ONCE(gc_in_progress, true); - queue_work(system_unbound_wq, &unix_gc_work); -} - -#define UNIX_INFLIGHT_TRIGGER_GC 16000 -#define UNIX_INFLIGHT_SANE_USER (SCM_MAX_FD * 8) -void wait_for_unix_gc(struct scm_fp_list *fpl) -{ - /* If number of inflight sockets is insane, - * force a garbage collect right now. - * - * Paired with the WRITE_ONCE() in unix_inflight(), - * unix_notinflight(), and __unix_gc(). - */ - if (READ_ONCE(unix_tot_inflight) > UNIX_INFLIGHT_TRIGGER_GC && - !READ_ONCE(gc_in_progress)) - unix_gc(); + wake_up(&unix_gc_wait); - /* Penalise users who want to send AF_UNIX sockets - * but whose sockets have not been received yet. - */ - if (!fpl || !fpl->count_unix || - READ_ONCE(fpl->user->unix_inflight) < UNIX_INFLIGHT_SANE_USER) - return; - - if (READ_ONCE(gc_in_progress)) - flush_work(&unix_gc_work); + out: + spin_unlock(&unix_gc_lock); } diff --git a/net/unix/scm.c b/net/unix/scm.c new file mode 100644 index 0000000000000000000000000000000000000000..e92f2fad64105dbec3a3f8da103e73659a244b7d --- /dev/null +++ b/net/unix/scm.c @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "scm.h" + +unsigned int unix_tot_inflight; +EXPORT_SYMBOL(unix_tot_inflight); + +LIST_HEAD(gc_inflight_list); +EXPORT_SYMBOL(gc_inflight_list); + +DEFINE_SPINLOCK(unix_gc_lock); +EXPORT_SYMBOL(unix_gc_lock); + +struct sock *unix_get_socket(struct file *filp) +{ + struct sock *u_sock = NULL; + struct inode *inode = file_inode(filp); + + /* Socket ? */ + if (S_ISSOCK(inode->i_mode) && !(filp->f_mode & FMODE_PATH)) { + struct socket *sock = SOCKET_I(inode); + const struct proto_ops *ops = READ_ONCE(sock->ops); + struct sock *s = sock->sk; + + /* PF_UNIX ? */ + if (s && ops && ops->family == PF_UNIX) + u_sock = s; + } + + return u_sock; +} +EXPORT_SYMBOL(unix_get_socket); + +/* Keep the number of times in flight count for the file + * descriptor if it is for an AF_UNIX socket. + */ +void unix_inflight(struct user_struct *user, struct file *fp) +{ + struct sock *s = unix_get_socket(fp); + + spin_lock(&unix_gc_lock); + + if (s) { + struct unix_sock *u = unix_sk(s); + + if (!u->inflight) { + BUG_ON(!list_empty(&u->link)); + list_add_tail(&u->link, &gc_inflight_list); + } else { + BUG_ON(list_empty(&u->link)); + } + u->inflight++; + /* Paired with READ_ONCE() in wait_for_unix_gc() */ + WRITE_ONCE(unix_tot_inflight, unix_tot_inflight + 1); + } + WRITE_ONCE(user->unix_inflight, user->unix_inflight + 1); + spin_unlock(&unix_gc_lock); +} + +void unix_notinflight(struct user_struct *user, struct file *fp) +{ + struct sock *s = unix_get_socket(fp); + + spin_lock(&unix_gc_lock); + + if (s) { + struct unix_sock *u = unix_sk(s); + + BUG_ON(!u->inflight); + BUG_ON(list_empty(&u->link)); + + u->inflight--; + if (!u->inflight) + list_del_init(&u->link); + /* Paired with READ_ONCE() in wait_for_unix_gc() */ + WRITE_ONCE(unix_tot_inflight, unix_tot_inflight - 1); + } + WRITE_ONCE(user->unix_inflight, user->unix_inflight - 1); + spin_unlock(&unix_gc_lock); +} + +/* + * The "user->unix_inflight" variable is protected by the garbage + * collection lock, and we just read it locklessly here. If you go + * over the limit, there might be a tiny race in actually noticing + * it across threads. Tough. + */ +static inline bool too_many_unix_fds(struct task_struct *p) +{ + struct user_struct *user = current_user(); + + if (unlikely(READ_ONCE(user->unix_inflight) > task_rlimit(p, RLIMIT_NOFILE))) + return !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN); + return false; +} + +int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb) +{ + int i; + + if (too_many_unix_fds(current)) + return -ETOOMANYREFS; + + /* + * Need to duplicate file references for the sake of garbage + * collection. Otherwise a socket in the fps might become a + * candidate for GC while the skb is not yet queued. + */ + UNIXCB(skb).fp = scm_fp_dup(scm->fp); + if (!UNIXCB(skb).fp) + return -ENOMEM; + + for (i = scm->fp->count - 1; i >= 0; i--) + unix_inflight(scm->fp->user, scm->fp->fp[i]); + return 0; +} +EXPORT_SYMBOL(unix_attach_fds); + +void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb) +{ + int i; + + scm->fp = UNIXCB(skb).fp; + UNIXCB(skb).fp = NULL; + + for (i = scm->fp->count-1; i >= 0; i--) + unix_notinflight(scm->fp->user, scm->fp->fp[i]); +} +EXPORT_SYMBOL(unix_detach_fds); + +void unix_destruct_scm(struct sk_buff *skb) +{ + struct scm_cookie scm; + + memset(&scm, 0, sizeof(scm)); + scm.pid = UNIXCB(skb).pid; + if (UNIXCB(skb).fp) + unix_detach_fds(&scm, skb); + + /* Alas, it calls VFS */ + /* So fscking what? fput() had been SMP-safe since the last Summer */ + scm_destroy(&scm); + sock_wfree(skb); +} +EXPORT_SYMBOL(unix_destruct_scm); + +void io_uring_destruct_scm(struct sk_buff *skb) +{ + unix_destruct_scm(skb); +} +EXPORT_SYMBOL(io_uring_destruct_scm); diff --git a/net/unix/scm.h b/net/unix/scm.h new file mode 100644 index 0000000000000000000000000000000000000000..5a255a477f16093e83fbf5b7569caa395754e9da --- /dev/null +++ b/net/unix/scm.h @@ -0,0 +1,10 @@ +#ifndef NET_UNIX_SCM_H +#define NET_UNIX_SCM_H + +extern struct list_head gc_inflight_list; +extern spinlock_t unix_gc_lock; + +int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb); +void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb); + +#endif diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index f20b117e5255ef7e4e0625c6bb9bdfea72842d1b..f8f1a49689da6cb7db2841173dc9df5290889b1a 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -406,8 +406,6 @@ EXPORT_SYMBOL_GPL(vsock_enqueue_accept); static bool vsock_use_local_transport(unsigned int remote_cid) { - lockdep_assert_held(&vsock_register_mutex); - if (!transport_local) return false; @@ -465,8 +463,6 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk) remote_flags = vsk->remote_addr.svm_flags; - mutex_lock(&vsock_register_mutex); - switch (sk->sk_type) { case SOCK_DGRAM: new_transport = transport_dgram; @@ -482,15 +478,12 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk) new_transport = transport_h2g; break; default: - ret = -ESOCKTNOSUPPORT; - goto err; + return -ESOCKTNOSUPPORT; } if (vsk->transport) { - if (vsk->transport == new_transport) { - ret = 0; - goto err; - } + if (vsk->transport == new_transport) + return 0; /* transport->release() must be called with sock lock acquired. * This path can only be taken during vsock_connect(), where we @@ -514,16 +507,8 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk) /* We increase the module refcnt to prevent the transport unloading * while there are open sockets assigned to it. */ - if (!new_transport || !try_module_get(new_transport->module)) { - ret = -ENODEV; - goto err; - } - - /* It's safe to release the mutex after a successful try_module_get(). - * Whichever transport `new_transport` points at, it won't go away until - * the last module_put() below or in vsock_deassign_transport(). - */ - mutex_unlock(&vsock_register_mutex); + if (!new_transport || !try_module_get(new_transport->module)) + return -ENODEV; if (sk->sk_type == SOCK_SEQPACKET) { if (!new_transport->seqpacket_allow || @@ -542,31 +527,12 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk) vsk->transport = new_transport; return 0; -err: - mutex_unlock(&vsock_register_mutex); - return ret; } EXPORT_SYMBOL_GPL(vsock_assign_transport); -/* - * Provide safe access to static transport_{h2g,g2h,dgram,local} callbacks. - * Otherwise we may race with module removal. Do not use on `vsk->transport`. - */ -static u32 vsock_registered_transport_cid(const struct vsock_transport **transport) -{ - u32 cid = VMADDR_CID_ANY; - - mutex_lock(&vsock_register_mutex); - if (*transport) - cid = (*transport)->get_local_cid(); - mutex_unlock(&vsock_register_mutex); - - return cid; -} - bool vsock_find_cid(unsigned int cid) { - if (cid == vsock_registered_transport_cid(&transport_g2h)) + if (transport_g2h && cid == transport_g2h->get_local_cid()) return true; if (transport_h2g && cid == VMADDR_CID_HOST) @@ -2425,19 +2391,18 @@ static long vsock_dev_do_ioctl(struct file *filp, unsigned int cmd, void __user *ptr) { u32 __user *p = ptr; + u32 cid = VMADDR_CID_ANY; int retval = 0; - u32 cid; switch (cmd) { case IOCTL_VM_SOCKETS_GET_LOCAL_CID: /* To be compatible with the VMCI behavior, we prioritize the * guest CID instead of well-know host CID (VMADDR_CID_HOST). */ - cid = vsock_registered_transport_cid(&transport_g2h); - if (cid == VMADDR_CID_ANY) - cid = vsock_registered_transport_cid(&transport_h2g); - if (cid == VMADDR_CID_ANY) - cid = vsock_registered_transport_cid(&transport_local); + if (transport_g2h) + cid = transport_g2h->get_local_cid(); + else if (transport_h2g) + cid = transport_h2g->get_local_cid(); if (put_user(cid, p) != 0) retval = -EFAULT; diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c index 7eccd6708d6649235e14bf988dad302adf674ebe..b370070194fa4ac0df45a073d389ffccf69a0029 100644 --- a/net/vmw_vsock/vmci_transport.c +++ b/net/vmw_vsock/vmci_transport.c @@ -119,8 +119,6 @@ vmci_transport_packet_init(struct vmci_transport_packet *pkt, u16 proto, struct vmci_handle handle) { - memset(pkt, 0, sizeof(*pkt)); - /* We register the stream control handler as an any cid handle so we * must always send from a source address of VMADDR_CID_ANY */ @@ -133,6 +131,8 @@ vmci_transport_packet_init(struct vmci_transport_packet *pkt, pkt->type = type; pkt->src_port = src->svm_port; pkt->dst_port = dst->svm_port; + memset(&pkt->proto, 0, sizeof(pkt->proto)); + memset(&pkt->_reserved2, 0, sizeof(pkt->_reserved2)); switch (pkt->type) { case VMCI_TRANSPORT_PACKET_TYPE_INVALID: diff --git a/net/wireless/core.c b/net/wireless/core.c index f6693983b5e9867e379f9bcc0dae54f751fa6773..a2b15349324b6ec11a45749c9f00cb2996a711b1 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -550,9 +550,6 @@ struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv, INIT_WORK(&rdev->mgmt_registrations_update_wk, cfg80211_mgmt_registrations_update_wk); spin_lock_init(&rdev->mgmt_registrations_lock); - INIT_WORK(&rdev->wiphy_work, cfg80211_wiphy_work); - INIT_LIST_HEAD(&rdev->wiphy_work_list); - spin_lock_init(&rdev->wiphy_work_lock); #ifdef CONFIG_CFG80211_DEFAULT_PS rdev->wiphy.flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; @@ -570,6 +567,9 @@ struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv, return NULL; } + INIT_WORK(&rdev->wiphy_work, cfg80211_wiphy_work); + INIT_LIST_HEAD(&rdev->wiphy_work_list); + spin_lock_init(&rdev->wiphy_work_lock); INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work); INIT_WORK(&rdev->conn_work, cfg80211_conn_work); INIT_WORK(&rdev->event_work, cfg80211_event_work); diff --git a/net/wireless/util.c b/net/wireless/util.c index 24e5af65da58ea0502133173612acd2bf0c985c4..7acd8d0db61a76937a9ac7524cc7654cca92c5eb 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -826,52 +826,6 @@ bool ieee80211_is_valid_amsdu(struct sk_buff *skb, u8 mesh_hdr) } EXPORT_SYMBOL(ieee80211_is_valid_amsdu); - -/* - * Detects if an MSDU frame was maliciously converted into an A-MSDU - * frame by an adversary. This is done by parsing the received frame - * as if it were a regular MSDU, even though the A-MSDU flag is set. - * - * For non-mesh interfaces, detection involves checking whether the - * payload, when interpreted as an MSDU, begins with a valid RFC1042 - * header. This is done by comparing the A-MSDU subheader's destination - * address to the start of the RFC1042 header. - * - * For mesh interfaces, the MSDU includes a 6-byte Mesh Control field - * and an optional variable-length Mesh Address Extension field before - * the RFC1042 header. The position of the RFC1042 header must therefore - * be calculated based on the mesh header length. - * - * Since this function intentionally parses an A-MSDU frame as an MSDU, - * it only assumes that the A-MSDU subframe header is present, and - * beyond this it performs its own bounds checks under the assumption - * that the frame is instead parsed as a non-aggregated MSDU. - */ -static bool -is_amsdu_aggregation_attack(struct ethhdr *eth, struct sk_buff *skb, - enum nl80211_iftype iftype) -{ - int offset; - - /* Non-mesh case can be directly compared */ - if (iftype != NL80211_IFTYPE_MESH_POINT) - return ether_addr_equal(eth->h_dest, rfc1042_header); - - offset = __ieee80211_get_mesh_hdrlen(eth->h_dest[0]); - if (offset == 6) { - /* Mesh case with empty address extension field */ - return ether_addr_equal(eth->h_source, rfc1042_header); - } else if (offset + ETH_ALEN <= skb->len) { - /* Mesh case with non-empty address extension field */ - u8 temp[ETH_ALEN]; - - skb_copy_bits(skb, offset, temp, ETH_ALEN); - return ether_addr_equal(temp, rfc1042_header); - } - - return false; -} - void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, const u8 *addr, enum nl80211_iftype iftype, const unsigned int extra_headroom, @@ -913,10 +867,8 @@ void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, /* the last MSDU has no padding */ if (subframe_len > remaining) goto purge; - /* mitigate A-MSDU aggregation injection attacks, to be - * checked when processing first subframe (offset == 0). - */ - if (offset == 0 && is_amsdu_aggregation_attack(&hdr.eth, skb, iftype)) + /* mitigate A-MSDU aggregation injection attacks */ + if (ether_addr_equal(hdr.eth.h_dest, rfc1042_header)) goto purge; offset += sizeof(struct ethhdr); diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c index 7188d3592dde4ee9d38dfd7291860c8a53248fea..04dc0c8a837076d4e6ef59ae495d73d3fbdf39b6 100644 --- a/net/xfrm/xfrm_device.c +++ b/net/xfrm/xfrm_device.c @@ -371,6 +371,7 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp, xdo->dev = dev; netdev_tracker_alloc(dev, &xdo->dev_tracker, GFP_ATOMIC); + xdo->real_dev = dev; xdo->type = XFRM_DEV_OFFLOAD_PACKET; switch (dir) { case XFRM_POLICY_IN: @@ -392,6 +393,7 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp, err = dev->xfrmdev_ops->xdo_dev_policy_add(xp, extack); if (err) { xdo->dev = NULL; + xdo->real_dev = NULL; xdo->type = XFRM_DEV_OFFLOAD_UNSPECIFIED; xdo->dir = 0; netdev_put(dev, &xdo->dev_tracker); diff --git a/net/xfrm/xfrm_interface_core.c b/net/xfrm/xfrm_interface_core.c index ca6db1e960ce64e1b7b62758f6821d3ae5b776ba..e21cc71095bb27012f774f50ace5e3c2c52e243d 100644 --- a/net/xfrm/xfrm_interface_core.c +++ b/net/xfrm/xfrm_interface_core.c @@ -880,7 +880,7 @@ static int xfrmi_changelink(struct net_device *dev, struct nlattr *tb[], return -EINVAL; } - if (p.collect_md || xi->p.collect_md) { + if (p.collect_md) { NL_SET_ERR_MSG(extack, "collect_md can't be changed"); return -EINVAL; } @@ -891,6 +891,11 @@ static int xfrmi_changelink(struct net_device *dev, struct nlattr *tb[], } else { if (xi->dev != dev) return -EEXIST; + if (xi->p.collect_md) { + NL_SET_ERR_MSG(extack, + "device can't be changed to collect_md"); + return -EINVAL; + } } return xfrmi_update(xi, &p); diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 2edb0f868c5738cc95dbd668145a9066d7ff3615..68b3f9e7edffd4eb3ddcf68294070027d9435404 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -1603,9 +1603,6 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl) struct xfrm_policy *delpol; struct hlist_head *chain; - /* Sanitize mark before store */ - policy->mark.v &= policy->mark.m; - spin_lock_bh(&net->xfrm.xfrm_policy_lock); chain = policy_hash_bysel(net, &policy->selector, policy->family, dir); if (chain) diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index d2bd5bddfb05d8cf0ea173374b8d5fcaa68fad1b..8a6e8656d014f2951c9895eb7f075e6d8a9eb2f8 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -754,6 +754,9 @@ int __xfrm_state_delete(struct xfrm_state *x) net->xfrm.state_num--; spin_unlock(&net->xfrm.xfrm_state_lock); + if (x->encap_sk) + sock_put(rcu_dereference_raw(x->encap_sk)); + xfrm_dev_state_delete(x); /* All xfrm_state objects are created by xfrm_state_alloc. @@ -1326,6 +1329,7 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, xso->type = XFRM_DEV_OFFLOAD_PACKET; xso->dir = xdo->dir; xso->dev = xdo->dev; + xso->real_dev = xdo->real_dev; xso->flags = XFRM_DEV_OFFLOAD_FLAG_ACQ; netdev_hold(xso->dev, &xso->dev_tracker, GFP_ATOMIC); error = xso->dev->xfrmdev_ops->xdo_dev_state_add(x, NULL); @@ -1333,6 +1337,7 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, xso->dir = 0; netdev_put(xso->dev, &xso->dev_tracker); xso->dev = NULL; + xso->real_dev = NULL; xso->type = XFRM_DEV_OFFLOAD_UNSPECIFIED; x->km.state = XFRM_STATE_DEAD; to_put = x; @@ -1473,9 +1478,6 @@ static void __xfrm_state_insert(struct xfrm_state *x) list_add(&x->km.all, &net->xfrm.state_all); - /* Sanitize mark before store */ - x->mark.v &= x->mark.m; - h = xfrm_dst_hash(net, &x->id.daddr, &x->props.saddr, x->props.reqid, x->props.family); XFRM_STATE_INSERT(bydst, &x->bydst, net->xfrm.state_bydst + h, diff --git a/rust/macros/module.rs b/rust/macros/module.rs index 7614a7198ce206220efe27141a6e404c2be414fb..7dee348ef0cc82d0bd05f3ad27526643e8786a99 100644 --- a/rust/macros/module.rs +++ b/rust/macros/module.rs @@ -249,7 +249,6 @@ mod __module_init {{ #[cfg(MODULE)] #[doc(hidden)] #[no_mangle] - #[link_section = \".exit.text\"] pub extern \"C\" fn cleanup_module() {{ // SAFETY: // - This function is inaccessible to the outside due to the double diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn index 570f64e2ddf10777a367e17d6cefdd336d4dd1f8..0ea3281a92e1eb4f9c121e6e202e93dcfcd93935 100644 --- a/scripts/Makefile.extrawarn +++ b/scripts/Makefile.extrawarn @@ -29,18 +29,6 @@ KBUILD_CFLAGS-$(CONFIG_CC_NO_ARRAY_BOUNDS) += -Wno-array-bounds ifdef CONFIG_CC_IS_CLANG # The kernel builds with '-std=gnu11' so use of GNU extensions is acceptable. KBUILD_CFLAGS += -Wno-gnu - -# Clang may emit a warning when a const variable, such as the dummy variables -# in typecheck(), or const member of an aggregate type are not initialized, -# which can result in unexpected behavior. However, in many audited cases of -# the "field" variant of the warning, this is intentional because the field is -# never used within a particular call path, the field is within a union with -# other non-const members, or the containing object is not const so the field -# can be modified via memcpy() / memset(). While the variable warning also gets -# disabled with this same switch, there should not be too much coverage lost -# because -Wuninitialized will still flag when an uninitialized const variable -# is used. -KBUILD_CFLAGS += $(call cc-disable-warning, default-const-init-unsafe) else # gcc inanely warns about local variables called 'main' diff --git a/scripts/checkstack.pl b/scripts/checkstack.pl index aad423c5181a96241f68021489bc42d2b71f8718..f27d552aec43f2b41aacf195069510c3121be03b 100755 --- a/scripts/checkstack.pl +++ b/scripts/checkstack.pl @@ -68,6 +68,9 @@ my (@stack, $re, $dre, $sub, $x, $xs, $funcre, $min_stack); # 2f60: 48 81 ec e8 05 00 00 sub $0x5e8,%rsp $re = qr/^.*[as][du][db] \$(0x$x{1,8}),\%(e|r)sp$/o; $dre = qr/^.*[as][du][db] (%.*),\%(e|r)sp$/o; + } elsif ($arch eq 'ia64') { + #e0000000044011fc: 01 0f fc 8c adds r12=-384,r12 + $re = qr/.*adds.*r12=-(([0-9]{2}|[3-9])[0-9]{2}),r12/o; } elsif ($arch eq 'm68k') { # 2b6c: 4e56 fb70 linkw %fp,#-1168 # 1df770: defc ffe4 addaw #-28,%sp diff --git a/scripts/gcc-plugins/gcc-common.h b/scripts/gcc-plugins/gcc-common.h index 90e83d62adb547195fb1bc7c8dca8513b6ff8967..1ae39b9f4a95effebba186e43ed2c9ce755a7f5f 100644 --- a/scripts/gcc-plugins/gcc-common.h +++ b/scripts/gcc-plugins/gcc-common.h @@ -128,38 +128,6 @@ static inline tree build_const_char_string(int len, const char *str) return cstr; } -static inline void __add_type_attr(tree type, const char *attr, tree args) -{ - tree oldattr; - - if (type == NULL_TREE) - return; - oldattr = lookup_attribute(attr, TYPE_ATTRIBUTES(type)); - if (oldattr != NULL_TREE) { - gcc_assert(TREE_VALUE(oldattr) == args || TREE_VALUE(TREE_VALUE(oldattr)) == TREE_VALUE(args)); - return; - } - - TYPE_ATTRIBUTES(type) = copy_list(TYPE_ATTRIBUTES(type)); - TYPE_ATTRIBUTES(type) = tree_cons(get_identifier(attr), args, TYPE_ATTRIBUTES(type)); -} - -static inline void add_type_attr(tree type, const char *attr, tree args) -{ - tree main_variant = TYPE_MAIN_VARIANT(type); - - __add_type_attr(TYPE_CANONICAL(type), attr, args); - __add_type_attr(TYPE_CANONICAL(main_variant), attr, args); - __add_type_attr(main_variant, attr, args); - - for (type = TYPE_NEXT_VARIANT(main_variant); type; type = TYPE_NEXT_VARIANT(type)) { - if (!lookup_attribute(attr, TYPE_ATTRIBUTES(type))) - TYPE_ATTRIBUTES(type) = TYPE_ATTRIBUTES(main_variant); - - __add_type_attr(TYPE_CANONICAL(type), attr, args); - } -} - #define PASS_INFO(NAME, REF, ID, POS) \ struct register_pass_info NAME##_pass_info = { \ .pass = make_##NAME##_pass(), \ diff --git a/scripts/gcc-plugins/randomize_layout_plugin.c b/scripts/gcc-plugins/randomize_layout_plugin.c index e70eef049ada667e195b403774ba0a05f6b342d8..746ff2d272f25667d31dbe2299ce00e2f9ea000a 100644 --- a/scripts/gcc-plugins/randomize_layout_plugin.c +++ b/scripts/gcc-plugins/randomize_layout_plugin.c @@ -77,9 +77,6 @@ static tree handle_randomize_layout_attr(tree *node, tree name, tree args, int f if (TYPE_P(*node)) { type = *node; - } else if (TREE_CODE(*node) == FIELD_DECL) { - *no_add_attrs = false; - return NULL_TREE; } else { gcc_assert(TREE_CODE(*node) == TYPE_DECL); type = TREE_TYPE(*node); @@ -351,18 +348,35 @@ static int relayout_struct(tree type) shuffle(type, (tree *)newtree, shuffle_length); + /* + * set up a bogus anonymous struct field designed to error out on unnamed struct initializers + * as gcc provides no other way to detect such code + */ + list = make_node(FIELD_DECL); + TREE_CHAIN(list) = newtree[0]; + TREE_TYPE(list) = void_type_node; + DECL_SIZE(list) = bitsize_zero_node; + DECL_NONADDRESSABLE_P(list) = 1; + DECL_FIELD_BIT_OFFSET(list) = bitsize_zero_node; + DECL_SIZE_UNIT(list) = size_zero_node; + DECL_FIELD_OFFSET(list) = size_zero_node; + DECL_CONTEXT(list) = type; + // to satisfy the constify plugin + TREE_READONLY(list) = 1; + for (i = 0; i < num_fields - 1; i++) TREE_CHAIN(newtree[i]) = newtree[i+1]; TREE_CHAIN(newtree[num_fields - 1]) = NULL_TREE; - add_type_attr(type, "randomize_performed", NULL_TREE); - add_type_attr(type, "designated_init", NULL_TREE); - if (has_flexarray) - add_type_attr(type, "has_flexarray", NULL_TREE); - main_variant = TYPE_MAIN_VARIANT(type); - for (variant = main_variant; variant; variant = TYPE_NEXT_VARIANT(variant)) - TYPE_FIELDS(variant) = newtree[0]; + for (variant = main_variant; variant; variant = TYPE_NEXT_VARIANT(variant)) { + TYPE_FIELDS(variant) = list; + TYPE_ATTRIBUTES(variant) = copy_list(TYPE_ATTRIBUTES(variant)); + TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("randomize_performed"), NULL_TREE, TYPE_ATTRIBUTES(variant)); + TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("designated_init"), NULL_TREE, TYPE_ATTRIBUTES(variant)); + if (has_flexarray) + TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("has_flexarray"), NULL_TREE, TYPE_ATTRIBUTES(type)); + } /* * force a re-layout of the main variant @@ -430,8 +444,10 @@ static void randomize_type(tree type) if (lookup_attribute("randomize_layout", TYPE_ATTRIBUTES(TYPE_MAIN_VARIANT(type))) || is_pure_ops_struct(type)) relayout_struct(type); - add_type_attr(type, "randomize_considered", NULL_TREE); - + for (variant = TYPE_MAIN_VARIANT(type); variant; variant = TYPE_NEXT_VARIANT(variant)) { + TYPE_ATTRIBUTES(type) = copy_list(TYPE_ATTRIBUTES(type)); + TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("randomize_considered"), NULL_TREE, TYPE_ATTRIBUTES(type)); + } #ifdef __DEBUG_PLUGIN fprintf(stderr, "Marking randomize_considered on struct %s\n", ORIG_TYPE_NAME(type)); #ifdef __DEBUG_VERBOSE diff --git a/scripts/gdb/linux/constants.py.in b/scripts/gdb/linux/constants.py.in index 866c13468ebf82e7d0f91290775395b200eaac3b..e810e0c27ff18d3adc16fda616888e45f6e7d7da 100644 --- a/scripts/gdb/linux/constants.py.in +++ b/scripts/gdb/linux/constants.py.in @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -94,12 +93,6 @@ LX_GDBPARSED(RADIX_TREE_MAP_SIZE) LX_GDBPARSED(RADIX_TREE_MAP_SHIFT) LX_GDBPARSED(RADIX_TREE_MAP_MASK) -/* linux/maple_tree.h */ -LX_VALUE(MAPLE_NODE_SLOTS) -LX_VALUE(MAPLE_RANGE64_SLOTS) -LX_VALUE(MAPLE_ARANGE64_SLOTS) -LX_GDBPARSED(MAPLE_NODE_MASK) - /* linux/vmalloc.h */ LX_VALUE(VM_IOREMAP) LX_VALUE(VM_ALLOC) diff --git a/scripts/gdb/linux/interrupts.py b/scripts/gdb/linux/interrupts.py index b371a62213a005289a559c02c3d16edafd4087c7..ef478e273791f359edc722b28c4d35f55bc8e2ee 100644 --- a/scripts/gdb/linux/interrupts.py +++ b/scripts/gdb/linux/interrupts.py @@ -7,7 +7,7 @@ import gdb from linux import constants from linux import cpus from linux import utils -from linux import mapletree +from linux import radixtree irq_desc_type = utils.CachedType("struct irq_desc") @@ -23,12 +23,12 @@ def irqd_is_level(desc): def show_irq_desc(prec, irq): text = "" - desc = mapletree.mtree_load(gdb.parse_and_eval("&sparse_irqs"), irq) + desc = radixtree.lookup(gdb.parse_and_eval("&irq_desc_tree"), irq) if desc is None: return text - desc = desc.cast(irq_desc_type.get_type().pointer()) - if desc == 0: + desc = desc.cast(irq_desc_type.get_type()) + if desc is None: return text if irq_settings_is_hidden(desc): @@ -110,7 +110,7 @@ def x86_show_mce(prec, var, pfx, desc): pvar = gdb.parse_and_eval(var) text = "%*s: " % (prec, pfx) for cpu in cpus.each_online_cpu(): - text += "%10u " % (cpus.per_cpu(pvar, cpu).dereference()) + text += "%10u " % (cpus.per_cpu(pvar, cpu)) text += " %s\n" % (desc) return text @@ -142,7 +142,7 @@ def x86_show_interupts(prec): if constants.LX_CONFIG_X86_MCE: text += x86_show_mce(prec, "&mce_exception_count", "MCE", "Machine check exceptions") - text += x86_show_mce(prec, "&mce_poll_count", "MCP", "Machine check polls") + text == x86_show_mce(prec, "&mce_poll_count", "MCP", "Machine check polls") text += show_irq_err_count(prec) @@ -221,8 +221,8 @@ class LxInterruptList(gdb.Command): gdb.write("CPU%-8d" % cpu) gdb.write("\n") - if utils.gdb_eval_or_none("&sparse_irqs") is None: - raise gdb.GdbError("Unable to find the sparse IRQ tree, is CONFIG_SPARSE_IRQ enabled?") + if utils.gdb_eval_or_none("&irq_desc_tree") is None: + return for irq in range(nr_irqs): gdb.write(show_irq_desc(prec, irq)) diff --git a/scripts/gdb/linux/mapletree.py b/scripts/gdb/linux/mapletree.py deleted file mode 100644 index d52d51c0a03fcbeffdeeb954af9437dcc3221aa5..0000000000000000000000000000000000000000 --- a/scripts/gdb/linux/mapletree.py +++ /dev/null @@ -1,252 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Maple tree helpers -# -# Copyright (c) 2025 Broadcom -# -# Authors: -# Florian Fainelli - -import gdb - -from linux import utils -from linux import constants -from linux import xarray - -maple_tree_root_type = utils.CachedType("struct maple_tree") -maple_node_type = utils.CachedType("struct maple_node") -maple_enode_type = utils.CachedType("void") - -maple_dense = 0 -maple_leaf_64 = 1 -maple_range_64 = 2 -maple_arange_64 = 3 - -class Mas(object): - ma_active = 0 - ma_start = 1 - ma_root = 2 - ma_none = 3 - ma_pause = 4 - ma_overflow = 5 - ma_underflow = 6 - ma_error = 7 - - def __init__(self, mt, first, end): - if mt.type == maple_tree_root_type.get_type().pointer(): - self.tree = mt.dereference() - elif mt.type != maple_tree_root_type.get_type(): - raise gdb.GdbError("must be {} not {}" - .format(maple_tree_root_type.get_type().pointer(), mt.type)) - self.tree = mt - self.index = first - self.last = end - self.node = None - self.status = self.ma_start - self.min = 0 - self.max = -1 - - def is_start(self): - # mas_is_start() - return self.status == self.ma_start - - def is_ptr(self): - # mas_is_ptr() - return self.status == self.ma_root - - def is_none(self): - # mas_is_none() - return self.status == self.ma_none - - def root(self): - # mas_root() - return self.tree['ma_root'].cast(maple_enode_type.get_type().pointer()) - - def start(self): - # mas_start() - if self.is_start() is False: - return None - - self.min = 0 - self.max = ~0 - - while True: - self.depth = 0 - root = self.root() - if xarray.xa_is_node(root): - self.depth = 0 - self.status = self.ma_active - self.node = mte_safe_root(root) - self.offset = 0 - if mte_dead_node(self.node) is True: - continue - - return None - - self.node = None - # Empty tree - if root is None: - self.status = self.ma_none - self.offset = constants.LX_MAPLE_NODE_SLOTS - return None - - # Single entry tree - self.status = self.ma_root - self.offset = constants.LX_MAPLE_NODE_SLOTS - - if self.index != 0: - return None - - return root - - return None - - def reset(self): - # mas_reset() - self.status = self.ma_start - self.node = None - -def mte_safe_root(node): - if node.type != maple_enode_type.get_type().pointer(): - raise gdb.GdbError("{} must be {} not {}" - .format(mte_safe_root.__name__, maple_enode_type.get_type().pointer(), node.type)) - ulong_type = utils.get_ulong_type() - indirect_ptr = node.cast(ulong_type) & ~0x2 - val = indirect_ptr.cast(maple_enode_type.get_type().pointer()) - return val - -def mte_node_type(entry): - ulong_type = utils.get_ulong_type() - val = None - if entry.type == maple_enode_type.get_type().pointer(): - val = entry.cast(ulong_type) - elif entry.type == ulong_type: - val = entry - else: - raise gdb.GdbError("{} must be {} not {}" - .format(mte_node_type.__name__, maple_enode_type.get_type().pointer(), entry.type)) - return (val >> 0x3) & 0xf - -def ma_dead_node(node): - if node.type != maple_node_type.get_type().pointer(): - raise gdb.GdbError("{} must be {} not {}" - .format(ma_dead_node.__name__, maple_node_type.get_type().pointer(), node.type)) - ulong_type = utils.get_ulong_type() - parent = node['parent'] - indirect_ptr = node['parent'].cast(ulong_type) & ~constants.LX_MAPLE_NODE_MASK - return indirect_ptr == node - -def mte_to_node(enode): - ulong_type = utils.get_ulong_type() - if enode.type == maple_enode_type.get_type().pointer(): - indirect_ptr = enode.cast(ulong_type) - elif enode.type == ulong_type: - indirect_ptr = enode - else: - raise gdb.GdbError("{} must be {} not {}" - .format(mte_to_node.__name__, maple_enode_type.get_type().pointer(), enode.type)) - indirect_ptr = indirect_ptr & ~constants.LX_MAPLE_NODE_MASK - return indirect_ptr.cast(maple_node_type.get_type().pointer()) - -def mte_dead_node(enode): - if enode.type != maple_enode_type.get_type().pointer(): - raise gdb.GdbError("{} must be {} not {}" - .format(mte_dead_node.__name__, maple_enode_type.get_type().pointer(), enode.type)) - node = mte_to_node(enode) - return ma_dead_node(node) - -def ma_is_leaf(tp): - result = tp < maple_range_64 - return tp < maple_range_64 - -def mt_pivots(t): - if t == maple_dense: - return 0 - elif t == maple_leaf_64 or t == maple_range_64: - return constants.LX_MAPLE_RANGE64_SLOTS - 1 - elif t == maple_arange_64: - return constants.LX_MAPLE_ARANGE64_SLOTS - 1 - -def ma_pivots(node, t): - if node.type != maple_node_type.get_type().pointer(): - raise gdb.GdbError("{}: must be {} not {}" - .format(ma_pivots.__name__, maple_node_type.get_type().pointer(), node.type)) - if t == maple_arange_64: - return node['ma64']['pivot'] - elif t == maple_leaf_64 or t == maple_range_64: - return node['mr64']['pivot'] - else: - return None - -def ma_slots(node, tp): - if node.type != maple_node_type.get_type().pointer(): - raise gdb.GdbError("{}: must be {} not {}" - .format(ma_slots.__name__, maple_node_type.get_type().pointer(), node.type)) - if tp == maple_arange_64: - return node['ma64']['slot'] - elif tp == maple_range_64 or tp == maple_leaf_64: - return node['mr64']['slot'] - elif tp == maple_dense: - return node['slot'] - else: - return None - -def mt_slot(mt, slots, offset): - ulong_type = utils.get_ulong_type() - return slots[offset].cast(ulong_type) - -def mtree_lookup_walk(mas): - ulong_type = utils.get_ulong_type() - n = mas.node - - while True: - node = mte_to_node(n) - tp = mte_node_type(n) - pivots = ma_pivots(node, tp) - end = mt_pivots(tp) - offset = 0 - while True: - if pivots[offset] >= mas.index: - break - if offset >= end: - break - offset += 1 - - slots = ma_slots(node, tp) - n = mt_slot(mas.tree, slots, offset) - if ma_dead_node(node) is True: - mas.reset() - return None - break - - if ma_is_leaf(tp) is True: - break - - return n - -def mtree_load(mt, index): - ulong_type = utils.get_ulong_type() - # MT_STATE(...) - mas = Mas(mt, index, index) - entry = None - - while True: - entry = mas.start() - if mas.is_none(): - return None - - if mas.is_ptr(): - if index != 0: - entry = None - return entry - - entry = mtree_lookup_walk(mas) - if entry is None and mas.is_start(): - continue - else: - break - - if xarray.xa_is_zero(entry): - return None - - return entry diff --git a/scripts/gdb/linux/tasks.py b/scripts/gdb/linux/tasks.py index 5be53b372a693871972ee950a91718facf203bf4..17ec19e9b5bf6a93e95e224cc21c88320c5ad4ba 100644 --- a/scripts/gdb/linux/tasks.py +++ b/scripts/gdb/linux/tasks.py @@ -86,12 +86,21 @@ LxPs() thread_info_type = utils.CachedType("struct thread_info") +ia64_task_size = None + def get_thread_info(task): thread_info_ptr_type = thread_info_type.get_type().pointer() - if task.type.fields()[0].type == thread_info_type.get_type(): - return task['thread_info'] - thread_info = task['stack'].cast(thread_info_ptr_type) + if utils.is_target_arch("ia64"): + global ia64_task_size + if ia64_task_size is None: + ia64_task_size = gdb.parse_and_eval("sizeof(struct task_struct)") + thread_info_addr = task.address + ia64_task_size + thread_info = thread_info_addr.cast(thread_info_ptr_type) + else: + if task.type.fields()[0].type == thread_info_type.get_type(): + return task['thread_info'] + thread_info = task['stack'].cast(thread_info_ptr_type) return thread_info.dereference() diff --git a/scripts/gdb/linux/xarray.py b/scripts/gdb/linux/xarray.py deleted file mode 100644 index f4477b5def75fc8dff61f603337a20679cc6b7ec..0000000000000000000000000000000000000000 --- a/scripts/gdb/linux/xarray.py +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Xarray helpers -# -# Copyright (c) 2025 Broadcom -# -# Authors: -# Florian Fainelli - -import gdb - -from linux import utils -from linux import constants - -def xa_is_internal(entry): - ulong_type = utils.get_ulong_type() - return ((entry.cast(ulong_type) & 3) == 2) - -def xa_mk_internal(v): - return ((v << 2) | 2) - -def xa_is_zero(entry): - ulong_type = utils.get_ulong_type() - return entry.cast(ulong_type) == xa_mk_internal(257) - -def xa_is_node(entry): - ulong_type = utils.get_ulong_type() - return xa_is_internal(entry) and (entry.cast(ulong_type) > 4096) diff --git a/scripts/head-object-list.txt b/scripts/head-object-list.txt index 890f69005bab41c6d0977f2a3e95de5143d4fbba..26359968744ef1e9d5e40937e3ac4055d3a7bf2a 100644 --- a/scripts/head-object-list.txt +++ b/scripts/head-object-list.txt @@ -17,6 +17,7 @@ arch/arm/kernel/head-nommu.o arch/arm/kernel/head.o arch/csky/kernel/head.o arch/hexagon/kernel/head.o +arch/ia64/kernel/head.o arch/loongarch/kernel/head.o arch/m68k/68000/head.o arch/m68k/coldfire/head.o diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 3795c36a9181aaca25fb39d3771e4531e67063f8..eccc87a441e713a8b9013e3b286a176688ece372 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -247,7 +247,7 @@ search_help[] = " -> PCI support (PCI [=y])\n" "(1) -> PCI access mode ( [=y])\n" " Defined at drivers/pci/Kconfig:47\n" - " Depends on: X86_LOCAL_APIC && X86_IO_APIC\n" + " Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" " Selects: LIBCRC32\n" " Selected by: BAR [=n]\n" "-----------------------------------------------------------------\n" diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c index 8cd72fe259740583f76701a6be4445f7d366417f..143a2c351d5764b5e9e1b175ad16bb40d3b5d2aa 100644 --- a/scripts/kconfig/nconf.c +++ b/scripts/kconfig/nconf.c @@ -216,7 +216,7 @@ search_help[] = "Symbol: FOO [ = m]\n" "Prompt: Foo bus is used to drive the bar HW\n" "Defined at drivers/pci/Kconfig:47\n" -"Depends on: X86_LOCAL_APIC && X86_IO_APIC\n" +"Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" "Location:\n" " -> Bus options (PCI, PCMCIA, EISA, ISA)\n" " -> PCI support (PCI [ = y])\n" diff --git a/scripts/package/kernel.spec b/scripts/package/kernel.spec index f58726671fb37424308c678126e5edd4a22dc5f3..3eee0143e0c5cc7671e640aad2368446e94805e0 100644 --- a/scripts/package/kernel.spec +++ b/scripts/package/kernel.spec @@ -55,12 +55,18 @@ patch -p1 < %{SOURCE2} %{make} %{makeflags} KERNELRELEASE=%{KERNELRELEASE} KBUILD_BUILD_VERSION=%{release} %install -mkdir -p %{buildroot}/lib/modules/%{KERNELRELEASE} -cp $(%{make} %{makeflags} -s image_name) %{buildroot}/lib/modules/%{KERNELRELEASE}/vmlinuz +mkdir -p %{buildroot}/boot +%ifarch ia64 +mkdir -p %{buildroot}/boot/efi +cp $(%{make} %{makeflags} -s image_name) %{buildroot}/boot/efi/vmlinuz-%{KERNELRELEASE} +ln -s efi/vmlinuz-%{KERNELRELEASE} %{buildroot}/boot/ +%else +cp $(%{make} %{makeflags} -s image_name) %{buildroot}/boot/vmlinuz-%{KERNELRELEASE} +%endif %{make} %{makeflags} INSTALL_MOD_PATH=%{buildroot} modules_install %{make} %{makeflags} INSTALL_HDR_PATH=%{buildroot}/usr headers_install -cp System.map %{buildroot}/lib/modules/%{KERNELRELEASE} -cp .config %{buildroot}/lib/modules/%{KERNELRELEASE}/config +cp System.map %{buildroot}/boot/System.map-%{KERNELRELEASE} +cp .config %{buildroot}/boot/config-%{KERNELRELEASE} ln -fns /usr/src/kernels/%{KERNELRELEASE} %{buildroot}/lib/modules/%{KERNELRELEASE}/build %if %{with_devel} %{make} %{makeflags} run-command KBUILD_RUN_COMMAND='${srctree}/scripts/package/install-extmod-build %{buildroot}/usr/src/kernels/%{KERNELRELEASE}' @@ -70,14 +76,13 @@ ln -fns /usr/src/kernels/%{KERNELRELEASE} %{buildroot}/lib/modules/%{KERNELRELEA rm -rf %{buildroot} %post -if [ -x /usr/bin/kernel-install ]; then - /usr/bin/kernel-install add %{KERNELRELEASE} /lib/modules/%{KERNELRELEASE}/vmlinuz +if [ -x /sbin/installkernel -a -r /boot/vmlinuz-%{KERNELRELEASE} -a -r /boot/System.map-%{KERNELRELEASE} ]; then +cp /boot/vmlinuz-%{KERNELRELEASE} /boot/.vmlinuz-%{KERNELRELEASE}-rpm +cp /boot/System.map-%{KERNELRELEASE} /boot/.System.map-%{KERNELRELEASE}-rpm +rm -f /boot/vmlinuz-%{KERNELRELEASE} /boot/System.map-%{KERNELRELEASE} +/sbin/installkernel %{KERNELRELEASE} /boot/.vmlinuz-%{KERNELRELEASE}-rpm /boot/.System.map-%{KERNELRELEASE}-rpm +rm -f /boot/.vmlinuz-%{KERNELRELEASE}-rpm /boot/.System.map-%{KERNELRELEASE}-rpm fi -for file in vmlinuz System.map config; do - if ! cmp --silent "/lib/modules/%{KERNELRELEASE}/${file}" "/boot/${file}-%{KERNELRELEASE}"; then - cp "/lib/modules/%{KERNELRELEASE}/${file}" "/boot/${file}-%{KERNELRELEASE}" - fi -done %preun if [ -x /sbin/new-kernel-pkg ]; then @@ -95,6 +100,7 @@ fi %defattr (-, root, root) /lib/modules/%{KERNELRELEASE} %exclude /lib/modules/%{KERNELRELEASE}/build +/boot/* %files headers %defattr (-, root, root) diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian index c1a36da85e84f66aa12bccffe05909889fb7ffa9..5044224cf6714b3e5738f1e6d30dda05c589e3ff 100755 --- a/scripts/package/mkdebian +++ b/scripts/package/mkdebian @@ -26,7 +26,7 @@ set_debarch() { # Attempt to find the correct Debian architecture case "$UTS_MACHINE" in - i386|alpha|m68k|riscv*) + i386|ia64|alpha|m68k|riscv*) debarch="$UTS_MACHINE" ;; x86_64) debarch=amd64 ;; diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c index 3e4f54799cc0a5a366a222b66ef87d9abd9b5a36..40ae6b2c7a6da590f36d33caa543fd1376ba4945 100644 --- a/scripts/recordmcount.c +++ b/scripts/recordmcount.c @@ -590,6 +590,7 @@ static int do_file(char const *const fname) ideal_nop = ideal_nop4_arm64; is_fake_mcount64 = arm64_is_fake_mcount; break; + case EM_IA_64: reltype = R_IA64_IMM64; break; case EM_MIPS: /* reltype: e_class */ break; case EM_LOONGARCH: /* reltype: e_class */ break; case EM_PPC: reltype = R_PPC_ADDR32; break; diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl index f84df9e383fd0acf75b9afb87422aff9c088e3a8..6a4645a5797603c7a60ad95c4eaed5c25fbb49e2 100755 --- a/scripts/recordmcount.pl +++ b/scripts/recordmcount.pl @@ -275,6 +275,13 @@ if ($arch eq "x86_64") { $section_type = '%progbits'; $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_AARCH64_CALL26\\s+_mcount\$"; $type = ".quad"; +} elsif ($arch eq "ia64") { + $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; + $type = "data8"; + + if ($is_module eq "0") { + $cc .= " -mconstant-gp"; + } } elsif ($arch eq "sparc64") { # In the objdump output there are giblets like: # 0000000000000000 : diff --git a/scripts/xz_wrap.sh b/scripts/xz_wrap.sh index d06baf626abe79d11401cb4a831b06e450c0b360..76e9cbcfbeab457bde700e733a5aae9f5ca1598f 100755 --- a/scripts/xz_wrap.sh +++ b/scripts/xz_wrap.sh @@ -15,6 +15,7 @@ LZMA2OPTS= case $SRCARCH in x86) BCJ=--x86 ;; powerpc) BCJ=--powerpc ;; + ia64) BCJ=--ia64; LZMA2OPTS=pb=4 ;; arm) BCJ=--arm ;; sparc) BCJ=--sparc ;; esac diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c index 0fbbc62ed3edec00d55b71a2012709dad6a15be4..95fcd2d3433e4ba6a26ef92adb46835b1a4216b0 100644 --- a/security/selinux/xfrm.c +++ b/security/selinux/xfrm.c @@ -95,7 +95,7 @@ static int selinux_xfrm_alloc_user(struct xfrm_sec_ctx **ctxp, ctx->ctx_doi = XFRM_SC_DOI_LSM; ctx->ctx_alg = XFRM_SC_ALG_SELINUX; - ctx->ctx_len = str_len + 1; + ctx->ctx_len = str_len; memcpy(ctx->ctx_str, &uctx[1], str_len); ctx->ctx_str[str_len] = '\0'; rc = security_context_to_sid(ctx->ctx_str, str_len, diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index 471de2d1b37ad1b8efb252fd73bd95660bcd8aad..728c211142d145df7143856d3a0ea1912f173760 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c @@ -1085,7 +1085,8 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream) runtime->oss.params = 0; runtime->oss.prepare = 1; runtime->oss.buffer_used = 0; - snd_pcm_runtime_buffer_set_silence(runtime); + if (runtime->dma_area) + snd_pcm_format_set_silence(runtime->format, runtime->dma_area, bytes_to_samples(runtime, runtime->dma_bytes)); runtime->oss.period_frames = snd_pcm_alsa_frames(substream, oss_period_size); diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 31fc20350fd96e37bdd23fde9866f76cf9442d3a..e40de64ec85cb51cb889e78a5f4f375a92622f15 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -703,17 +703,6 @@ static void snd_pcm_buffer_access_unlock(struct snd_pcm_runtime *runtime) atomic_inc(&runtime->buffer_accessing); } -/* fill the PCM buffer with the current silence format; called from pcm_oss.c */ -void snd_pcm_runtime_buffer_set_silence(struct snd_pcm_runtime *runtime) -{ - snd_pcm_buffer_access_lock(runtime); - if (runtime->dma_area) - snd_pcm_format_set_silence(runtime->format, runtime->dma_area, - bytes_to_samples(runtime, runtime->dma_bytes)); - snd_pcm_buffer_access_unlock(runtime); -} -EXPORT_SYMBOL_GPL(snd_pcm_runtime_buffer_set_silence); - #if IS_ENABLED(CONFIG_SND_PCM_OSS) #define is_oss_stream(substream) ((substream)->oss.oss) #else diff --git a/sound/isa/sb/sb16_main.c b/sound/isa/sb/sb16_main.c index 1497a7822eee6818604c4497687a787f2f2c172b..a9b87e159b2d11c67416ad9447999e46f46bd768 100644 --- a/sound/isa/sb/sb16_main.c +++ b/sound/isa/sb/sb16_main.c @@ -703,9 +703,6 @@ static int snd_sb16_dma_control_put(struct snd_kcontrol *kcontrol, struct snd_ct unsigned char nval, oval; int change; - if (chip->mode & (SB_MODE_PLAYBACK | SB_MODE_CAPTURE)) - return -EBUSY; - nval = ucontrol->value.enumerated.item[0]; if (nval > 2) return -EINVAL; @@ -714,10 +711,6 @@ static int snd_sb16_dma_control_put(struct snd_kcontrol *kcontrol, struct snd_ct change = nval != oval; snd_sb16_set_dma_mode(chip, nval); spin_unlock_irqrestore(&chip->reg_lock, flags); - if (change) { - snd_dma_disable(chip->dma8); - snd_dma_disable(chip->dma16); - } return change; } diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c index 95786bdadfe6a55a3e42dde8fe0877ae9b831f0c..b7ca2a83fbb0862a8ac1c5ba9e1f8b051a9a3b79 100644 --- a/sound/pci/hda/hda_bind.c +++ b/sound/pci/hda/hda_bind.c @@ -44,7 +44,7 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev) struct hda_codec *codec = container_of(dev, struct hda_codec, core); /* ignore unsol events during shutdown */ - if (codec->card->shutdown || codec->bus->shutdown) + if (codec->bus->shutdown) return; /* ignore unsol events during system suspend/resume */ diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 059693e03fd9626dfd434186b402b5c8d5b7a5a7..3a0df631d25d917e43c9592d378ddf105cdd6734 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -2266,8 +2266,6 @@ static const struct snd_pci_quirk power_save_denylist[] = { SND_PCI_QUIRK(0x1734, 0x1232, "KONTRON SinglePC", 0), /* Dell ALC3271 */ SND_PCI_QUIRK(0x1028, 0x0962, "Dell ALC3271", 0), - /* https://bugzilla.kernel.org/show_bug.cgi?id=220210 */ - SND_PCI_QUIRK(0x17aa, 0x5079, "Lenovo Thinkpad E15", 0), {} }; #endif /* CONFIG_PM */ @@ -2727,9 +2725,6 @@ static const struct pci_device_id azx_ids[] = { { PCI_VDEVICE(ATI, 0xab38), .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | AZX_DCAPS_PM_RUNTIME }, - { PCI_VDEVICE(ATI, 0xab40), - .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | - AZX_DCAPS_PM_RUNTIME }, /* GLENFLY */ { PCI_DEVICE(PCI_VENDOR_ID_GLENFLY, PCI_ANY_ID), .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, diff --git a/sound/pci/hda/hda_tegra.c b/sound/pci/hda/hda_tegra.c index 12a144a269ee894ae1738dc3120f3419219447cc..d967e70a705859721a040155de8f512c83ab225e 100644 --- a/sound/pci/hda/hda_tegra.c +++ b/sound/pci/hda/hda_tegra.c @@ -72,10 +72,6 @@ struct hda_tegra_soc { bool has_hda2codec_2x_reset; bool has_hda2hdmi; - bool has_hda2codec_2x; - bool input_stream; - bool always_on; - bool requires_init; }; struct hda_tegra { @@ -191,9 +187,7 @@ static int __maybe_unused hda_tegra_runtime_resume(struct device *dev) if (rc != 0) return rc; if (chip->running) { - if (hda->soc->requires_init) - hda_tegra_init(hda); - + hda_tegra_init(hda); azx_init_chip(chip, 1); /* disable controller wake up event*/ azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) & @@ -258,8 +252,7 @@ static int hda_tegra_init_chip(struct azx *chip, struct platform_device *pdev) bus->remap_addr = hda->regs + HDA_BAR0; bus->addr = res->start + HDA_BAR0; - if (hda->soc->requires_init) - hda_tegra_init(hda); + hda_tegra_init(hda); return 0; } @@ -332,7 +325,7 @@ static int hda_tegra_first_init(struct azx *chip, struct platform_device *pdev) * starts with offset 0 which is wrong as HW register for output stream * offset starts with 4. */ - if (!hda->soc->input_stream) + if (of_device_is_compatible(np, "nvidia,tegra234-hda")) chip->capture_streams = 4; chip->playback_streams = (gcap >> 12) & 0x0f; @@ -428,6 +421,7 @@ static int hda_tegra_create(struct snd_card *card, chip->driver_caps = driver_caps; chip->driver_type = driver_caps & 0xff; chip->dev_index = 0; + chip->jackpoll_interval = msecs_to_jiffies(5000); INIT_LIST_HEAD(&chip->pcm_list); chip->codec_probe_mask = -1; @@ -444,16 +438,7 @@ static int hda_tegra_create(struct snd_card *card, chip->bus.core.sync_write = 0; chip->bus.core.needs_damn_long_delay = 1; chip->bus.core.aligned_mmio = 1; - - /* - * HDA power domain and clocks are always on for Tegra264 and - * the jack detection logic would work always, so no need of - * jack polling mechanism running. - */ - if (!hda->soc->always_on) { - chip->jackpoll_interval = msecs_to_jiffies(5000); - chip->bus.jackpoll_in_suspend = 1; - } + chip->bus.jackpoll_in_suspend = 1; err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); if (err < 0) { @@ -467,44 +452,22 @@ static int hda_tegra_create(struct snd_card *card, static const struct hda_tegra_soc tegra30_data = { .has_hda2codec_2x_reset = true, .has_hda2hdmi = true, - .has_hda2codec_2x = true, - .input_stream = true, - .always_on = false, - .requires_init = true, }; static const struct hda_tegra_soc tegra194_data = { .has_hda2codec_2x_reset = false, .has_hda2hdmi = true, - .has_hda2codec_2x = true, - .input_stream = true, - .always_on = false, - .requires_init = true, }; static const struct hda_tegra_soc tegra234_data = { .has_hda2codec_2x_reset = true, .has_hda2hdmi = false, - .has_hda2codec_2x = true, - .input_stream = false, - .always_on = false, - .requires_init = true, -}; - -static const struct hda_tegra_soc tegra264_data = { - .has_hda2codec_2x_reset = true, - .has_hda2hdmi = false, - .has_hda2codec_2x = false, - .input_stream = false, - .always_on = true, - .requires_init = false, }; static const struct of_device_id hda_tegra_match[] = { { .compatible = "nvidia,tegra30-hda", .data = &tegra30_data }, { .compatible = "nvidia,tegra194-hda", .data = &tegra194_data }, { .compatible = "nvidia,tegra234-hda", .data = &tegra234_data }, - { .compatible = "nvidia,tegra264-hda", .data = &tegra264_data }, {}, }; MODULE_DEVICE_TABLE(of, hda_tegra_match); @@ -559,9 +522,7 @@ static int hda_tegra_probe(struct platform_device *pdev) hda->clocks[hda->nclocks++].id = "hda"; if (hda->soc->has_hda2hdmi) hda->clocks[hda->nclocks++].id = "hda2hdmi"; - - if (hda->soc->has_hda2codec_2x) - hda->clocks[hda->nclocks++].id = "hda2codec_2x"; + hda->clocks[hda->nclocks++].id = "hda2codec_2x"; err = devm_clk_bulk_get(&pdev->dev, hda->nclocks, hda->clocks); if (err < 0) diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index f2c03fbf892f1b2cccfde3f430221e4404d6cd82..f030700cd60d75f034514e3743fdcba4de5082d9 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -4559,9 +4559,6 @@ HDA_CODEC_ENTRY(0x10de002e, "Tegra186 HDMI/DP1", patch_tegra_hdmi), HDA_CODEC_ENTRY(0x10de002f, "Tegra194 HDMI/DP2", patch_tegra_hdmi), HDA_CODEC_ENTRY(0x10de0030, "Tegra194 HDMI/DP3", patch_tegra_hdmi), HDA_CODEC_ENTRY(0x10de0031, "Tegra234 HDMI/DP", patch_tegra234_hdmi), -HDA_CODEC_ENTRY(0x10de0033, "SoC 33 HDMI/DP", patch_tegra234_hdmi), -HDA_CODEC_ENTRY(0x10de0034, "Tegra264 HDMI/DP", patch_tegra234_hdmi), -HDA_CODEC_ENTRY(0x10de0035, "SoC 35 HDMI/DP", patch_tegra234_hdmi), HDA_CODEC_ENTRY(0x10de0040, "GPU 40 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de0041, "GPU 41 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de0042, "GPU 42 HDMI/DP", patch_nvhdmi), @@ -4600,32 +4597,15 @@ HDA_CODEC_ENTRY(0x10de0097, "GPU 97 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de0098, "GPU 98 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de0099, "GPU 99 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de009a, "GPU 9a HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de009b, "GPU 9b HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de009c, "GPU 9c HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de009d, "GPU 9d HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de009e, "GPU 9e HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de009f, "GPU 9f HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de00a0, "GPU a0 HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00a1, "GPU a1 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de00a3, "GPU a3 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de00a4, "GPU a4 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de00a5, "GPU a5 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de00a6, "GPU a6 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de00a7, "GPU a7 HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00a8, "GPU a8 HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00a9, "GPU a9 HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00aa, "GPU aa HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00ab, "GPU ab HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00ad, "GPU ad HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00ae, "GPU ae HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00af, "GPU af HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00b0, "GPU b0 HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00b1, "GPU b1 HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00c0, "GPU c0 HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00c1, "GPU c1 HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00c3, "GPU c3 HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00c4, "GPU c4 HDMI/DP", patch_nvhdmi), -HDA_CODEC_ENTRY(0x10de00c5, "GPU c5 HDMI/DP", patch_nvhdmi), HDA_CODEC_ENTRY(0x10de8001, "MCP73 HDMI", patch_nvhdmi_2ch), HDA_CODEC_ENTRY(0x10de8067, "MCP67/68 HDMI", patch_nvhdmi_2ch), HDA_CODEC_ENTRY(0x67663d82, "Arise 82 HDMI/DP", patch_gf_hdmi), diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index e12e3134b5e16bed0e78f6d9294e7fcb78dac624..a13795e405a4d8a50e639a1f90fe387f0ae6b957 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -6790,41 +6790,6 @@ static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec, } } -/* GPIO1 = amplifier on/off */ -static void alc285_fixup_hp_spectre_x360_df1(struct hda_codec *codec, - const struct hda_fixup *fix, - int action) -{ - struct alc_spec *spec = codec->spec; - static const hda_nid_t conn[] = { 0x02 }; - static const struct hda_pintbl pincfgs[] = { - { 0x14, 0x90170110 }, /* front/high speakers */ - { 0x17, 0x90170130 }, /* back/bass speakers */ - { } - }; - - // enable mute led - alc285_fixup_hp_mute_led_coefbit(codec, fix, action); - - switch (action) { - case HDA_FIXUP_ACT_PRE_PROBE: - /* needed for amp of back speakers */ - spec->gpio_mask |= 0x01; - spec->gpio_dir |= 0x01; - snd_hda_apply_pincfgs(codec, pincfgs); - /* share DAC to have unified volume control */ - snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn); - snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); - break; - case HDA_FIXUP_ACT_INIT: - /* need to toggle GPIO to enable the amp of back speakers */ - alc_update_gpio_data(codec, 0x01, true); - msleep(100); - alc_update_gpio_data(codec, 0x01, false); - break; - } -} - static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec, const struct hda_fixup *fix, int action) { @@ -7436,7 +7401,6 @@ enum { ALC280_FIXUP_HP_9480M, ALC245_FIXUP_HP_X360_AMP, ALC285_FIXUP_HP_SPECTRE_X360_EB1, - ALC285_FIXUP_HP_SPECTRE_X360_DF1, ALC285_FIXUP_HP_ENVY_X360, ALC288_FIXUP_DELL_HEADSET_MODE, ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, @@ -9475,10 +9439,6 @@ static const struct hda_fixup alc269_fixups[] = { .type = HDA_FIXUP_FUNC, .v.func = alc285_fixup_hp_spectre_x360_eb1 }, - [ALC285_FIXUP_HP_SPECTRE_X360_DF1] = { - .type = HDA_FIXUP_FUNC, - .v.func = alc285_fixup_hp_spectre_x360_df1 - }, [ALC285_FIXUP_HP_ENVY_X360] = { .type = HDA_FIXUP_FUNC, .v.func = alc285_fixup_hp_envy_x360, @@ -9952,7 +9912,6 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), - SND_PCI_QUIRK(0x1028, 0x0879, "Dell Latitude 5420 Rugged", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), @@ -10079,7 +10038,6 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x86c1, "HP Laptop 15-da3001TU", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO), SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1), - SND_PCI_QUIRK(0x103c, 0x863e, "HP Spectre x360 15-df1xxx", ALC285_FIXUP_HP_SPECTRE_X360_DF1), SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1), SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT), @@ -10103,7 +10061,6 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x87cc, "HP Pavilion 15-eg0xxx", ALC287_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x87d3, "HP Laptop 15-gw0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), SND_PCI_QUIRK(0x103c, 0x87df, "HP ProBook 430 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED), @@ -10152,7 +10109,6 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x897d, "HP mt440 Mobile Thin Client U74", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4), - SND_PCI_QUIRK(0x103c, 0x898a, "HP Pavilion 15-eg100", ALC287_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), @@ -10304,7 +10260,6 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2), - SND_PCI_QUIRK(0x1043, 0x1a8e, "ASUS G712LWS", ALC294_FIXUP_LENOVO_MIC_LOCATION), SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B), SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC), @@ -10328,7 +10283,6 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE), SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2), - SND_PCI_QUIRK(0x1043, 0x1e10, "ASUS VivoBook X507UAR", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502), SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS), @@ -10579,7 +10533,6 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x38f9, "Thinkbook 16P Gen5", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x17aa, 0x38fa, "Thinkbook 16P Gen5", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), - SND_PCI_QUIRK(0x17aa, 0x390d, "Lenovo Yoga Pro 7 14ASP10", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), SND_PCI_QUIRK(0x17aa, 0x3913, "Lenovo 145", ALC236_FIXUP_LENOVO_INV_DMIC), SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI), @@ -10833,7 +10786,6 @@ static const struct hda_model_fixup alc269_fixup_models[] = { {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"}, {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"}, {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"}, - {.id = ALC285_FIXUP_HP_SPECTRE_X360_DF1, .name = "alc285-hp-spectre-x360-df1"}, {.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"}, {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"}, {.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"}, diff --git a/sound/soc/amd/yc/acp6x-mach.c b/sound/soc/amd/yc/acp6x-mach.c index 66ef8f4fd02cd44bb1ddc70fa6b12ec54da5d65f..622df58a9694213f12c1033064bfa7c8b7caafce 100644 --- a/sound/soc/amd/yc/acp6x-mach.c +++ b/sound/soc/amd/yc/acp6x-mach.c @@ -311,13 +311,6 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "83AS"), } }, - { - .driver_data = &acp6x_card, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_NAME, "83HN"), - } - }, { .driver_data = &acp6x_card, .matches = { @@ -346,13 +339,6 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "83Q3"), } }, - { - .driver_data = &acp6x_card, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "RB"), - DMI_MATCH(DMI_PRODUCT_NAME, "Nitro ANV15-41"), - } - }, { .driver_data = &acp6x_card, .matches = { @@ -360,13 +346,6 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "83J2"), } }, - { - .driver_data = &acp6x_card, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_NAME, "83J3"), - } - }, { .driver_data = &acp6x_card, .matches = { @@ -381,7 +360,7 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "M5402RA"), } }, - { + { .driver_data = &acp6x_card, .matches = { DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), @@ -458,13 +437,6 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "Bravo 17 D7VEK"), } }, - { - .driver_data = &acp6x_card, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "Micro-Star International Co., Ltd."), - DMI_MATCH(DMI_PRODUCT_NAME, "Bravo 17 D7VF"), - } - }, { .driver_data = &acp6x_card, .matches = { @@ -528,13 +500,6 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "OMEN by HP Gaming Laptop 16z-n000"), } }, - { - .driver_data = &acp6x_card, - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "HP"), - DMI_MATCH(DMI_PRODUCT_NAME, "Victus by HP Gaming Laptop 15-fb2xxx"), - } - }, { .driver_data = &acp6x_card, .matches = { diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c index 0e96caa607fb8c08fb0a753392c51a799e47ee73..ce77934f3eef313a556a05c8e139a8d1f4dda60b 100644 --- a/sound/soc/apple/mca.c +++ b/sound/soc/apple/mca.c @@ -464,28 +464,6 @@ static int mca_configure_serdes(struct mca_cluster *cl, int serdes_unit, return -EINVAL; } -static int mca_fe_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct mca_cluster *cl = mca_dai_to_cluster(dai); - unsigned int mask, nchannels; - - if (cl->tdm_slots) { - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - mask = cl->tdm_tx_mask; - else - mask = cl->tdm_rx_mask; - - nchannels = hweight32(mask); - } else { - nchannels = 2; - } - - return snd_pcm_hw_constraint_minmax(substream->runtime, - SNDRV_PCM_HW_PARAM_CHANNELS, - 1, nchannels); -} - static int mca_fe_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { @@ -702,7 +680,6 @@ static int mca_fe_hw_params(struct snd_pcm_substream *substream, } static const struct snd_soc_dai_ops mca_fe_ops = { - .startup = mca_fe_startup, .set_fmt = mca_fe_set_fmt, .set_bclk_ratio = mca_set_bclk_ratio, .set_tdm_slot = mca_fe_set_tdm_slot, diff --git a/sound/soc/codecs/cs35l56-shared.c b/sound/soc/codecs/cs35l56-shared.c index 25ee7477709e76a2311cdc091627a9e0c201472a..d3db89c93b331d7ce4bc8f995f140f32818e1a0a 100644 --- a/sound/soc/codecs/cs35l56-shared.c +++ b/sound/soc/codecs/cs35l56-shared.c @@ -661,7 +661,7 @@ int cs35l56_hw_init(struct cs35l56_base *cs35l56_base) break; default: dev_err(cs35l56_base->dev, "Unknown device %x\n", devid); - return -ENODEV; + return ret; } ret = regmap_read(cs35l56_base->regmap, CS35L56_DSP_RESTRICT_STS1, &secured); diff --git a/sound/soc/codecs/cs42l43-jack.c b/sound/soc/codecs/cs42l43-jack.c index 6d8455c1bee6d85f92486350031f796df232aca9..0b8e88b19888ec36013f6ef47946a28a98f170a6 100644 --- a/sound/soc/codecs/cs42l43-jack.c +++ b/sound/soc/codecs/cs42l43-jack.c @@ -642,10 +642,6 @@ static int cs42l43_run_type_detect(struct cs42l43_codec *priv) reinit_completion(&priv->type_detect); - regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL, - CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK, - CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK); - cs42l43_start_hs_bias(priv, true); regmap_update_bits(cs42l43->regmap, CS42L43_HS2, CS42L43_HSDET_MODE_MASK, 0x3 << CS42L43_HSDET_MODE_SHIFT); @@ -657,9 +653,6 @@ static int cs42l43_run_type_detect(struct cs42l43_codec *priv) CS42L43_HSDET_MODE_MASK, 0x2 << CS42L43_HSDET_MODE_SHIFT); cs42l43_stop_hs_bias(priv); - regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL, - CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK, 0); - if (!time_left) return -ETIMEDOUT; diff --git a/sound/soc/codecs/hda.c b/sound/soc/codecs/hda.c index 42aca0a63c441e99f119a719e291751bc605bb33..d57b043d6bfefee2caeba910fd33a236e041aa4c 100644 --- a/sound/soc/codecs/hda.c +++ b/sound/soc/codecs/hda.c @@ -150,7 +150,7 @@ int hda_codec_probe_complete(struct hda_codec *codec) ret = snd_hda_codec_build_controls(codec); if (ret < 0) { dev_err(&hdev->dev, "unable to create controls %d\n", ret); - return ret; + goto out; } /* Bus suspended codecs as it does not manage their pm */ @@ -158,7 +158,7 @@ int hda_codec_probe_complete(struct hda_codec *codec) /* rpm was forbidden in snd_hda_codec_device_new() */ snd_hda_codec_set_power_save(codec, 2000); snd_hda_codec_register(codec); - +out: /* Complement pm_runtime_get_sync(bus) in probe */ pm_runtime_mark_last_busy(bus->dev); pm_runtime_put_autosuspend(bus->dev); diff --git a/sound/soc/codecs/pcm3168a.c b/sound/soc/codecs/pcm3168a.c index 329549936bd5c3a39977a52b45c9237d8c0698f9..9d6431338fb7153cbe47b994a79220dfa5a5561a 100644 --- a/sound/soc/codecs/pcm3168a.c +++ b/sound/soc/codecs/pcm3168a.c @@ -494,9 +494,9 @@ static int pcm3168a_hw_params(struct snd_pcm_substream *substream, } break; case 24: - if (!provider_mode && ((format == SND_SOC_DAIFMT_DSP_A) || - (format == SND_SOC_DAIFMT_DSP_B))) { - dev_err(component->dev, "24-bit slots not supported in consumer mode using DSP\n"); + if (provider_mode || (format == SND_SOC_DAIFMT_DSP_A) || + (format == SND_SOC_DAIFMT_DSP_B)) { + dev_err(component->dev, "24-bit slots not supported in provider mode, or consumer mode using DSP\n"); return -EINVAL; } break; diff --git a/sound/soc/codecs/rt722-sdca-sdw.c b/sound/soc/codecs/rt722-sdca-sdw.c index c0bb1b4b2dcb59e2896807be195aa39079edc0a3..c382cb6be60256eafd1041f72601203df4da6065 100644 --- a/sound/soc/codecs/rt722-sdca-sdw.c +++ b/sound/soc/codecs/rt722-sdca-sdw.c @@ -28,50 +28,9 @@ static bool rt722_sdca_readable_register(struct device *dev, unsigned int reg) 0): case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_GE49, RT722_SDCA_CTL_DETECTED_MODE, 0): - case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_XU03, RT722_SDCA_CTL_SELECTED_MODE, - 0): - case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU05, - RT722_SDCA_CTL_FU_MUTE, CH_L) ... - SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU05, - RT722_SDCA_CTL_FU_MUTE, CH_R): - case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_XU0D, - RT722_SDCA_CTL_SELECTED_MODE, 0): - case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU0F, - RT722_SDCA_CTL_FU_MUTE, CH_L) ... - SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU0F, - RT722_SDCA_CTL_FU_MUTE, CH_R): - case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_PDE40, - RT722_SDCA_CTL_REQ_POWER_STATE, 0): - case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_PDE12, - RT722_SDCA_CTL_REQ_POWER_STATE, 0): - case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_CS01, - RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0): - case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_CS11, - RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0): - case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_USER_FU1E, - RT722_SDCA_CTL_FU_MUTE, CH_01) ... - SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_USER_FU1E, - RT722_SDCA_CTL_FU_MUTE, CH_04): - case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_IT26, - RT722_SDCA_CTL_VENDOR_DEF, 0): - case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_PDE2A, - RT722_SDCA_CTL_REQ_POWER_STATE, 0): - case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_CS1F, - RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0): - case SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01, - RT722_SDCA_CTL_HIDTX_CURRENT_OWNER, 0) ... - SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01, - RT722_SDCA_CTL_HIDTX_MESSAGE_LENGTH, 0): - case SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_USER_FU06, - RT722_SDCA_CTL_FU_MUTE, CH_L) ... - SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_USER_FU06, - RT722_SDCA_CTL_FU_MUTE, CH_R): - case SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_OT23, - RT722_SDCA_CTL_VENDOR_DEF, CH_08): - case SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_PDE23, - RT722_SDCA_CTL_REQ_POWER_STATE, 0): - case SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_CS31, - RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0): + case SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01, RT722_SDCA_CTL_HIDTX_CURRENT_OWNER, + 0) ... SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01, + RT722_SDCA_CTL_HIDTX_MESSAGE_LENGTH, 0): case RT722_BUF_ADDR_HID1 ... RT722_BUF_ADDR_HID2: return true; default: @@ -115,7 +74,6 @@ static bool rt722_sdca_mbq_readable_register(struct device *dev, unsigned int re case 0x5600000 ... 0x5600007: case 0x5700000 ... 0x5700004: case 0x5800000 ... 0x5800004: - case 0x5810000: case 0x5b00003: case 0x5c00011: case 0x5d00006: @@ -123,7 +81,6 @@ static bool rt722_sdca_mbq_readable_register(struct device *dev, unsigned int re case 0x5f00030: case 0x6100000 ... 0x6100051: case 0x6100055 ... 0x6100057: - case 0x6100060: case 0x6100062: case 0x6100064 ... 0x6100065: case 0x6100067: diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c index 054c6f860675a131f177f6dbc846ae968450182e..72d6356b898148a170495a606cb7fba994bb0764 100644 --- a/sound/soc/codecs/tas2764.c +++ b/sound/soc/codecs/tas2764.c @@ -542,7 +542,7 @@ static int tas2764_codec_probe(struct snd_soc_component *component) tas2764_reset(tas2764); if (tas2764->irq) { - ret = snd_soc_component_write(tas2764->component, TAS2764_INT_MASK0, 0x00); + ret = snd_soc_component_write(tas2764->component, TAS2764_INT_MASK0, 0xff); if (ret < 0) return ret; diff --git a/sound/soc/codecs/tas2770.c b/sound/soc/codecs/tas2770.c index 181b16530e5bc95ea050a4161b2da0bd1bd9a30b..5c6b825c757b334620dd0a1bf661c2e3ee0b0a6b 100644 --- a/sound/soc/codecs/tas2770.c +++ b/sound/soc/codecs/tas2770.c @@ -158,37 +158,11 @@ static const struct snd_kcontrol_new isense_switch = static const struct snd_kcontrol_new vsense_switch = SOC_DAPM_SINGLE("Switch", TAS2770_PWR_CTRL, 2, 1, 1); -static int sense_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); - struct tas2770_priv *tas2770 = snd_soc_component_get_drvdata(component); - - /* - * Powering up ISENSE/VSENSE requires a trip through the shutdown state. - * Do that here to ensure that our changes are applied properly, otherwise - * we might end up with non-functional IVSENSE if playback started earlier, - * which would break software speaker protection. - */ - switch (event) { - case SND_SOC_DAPM_PRE_REG: - return snd_soc_component_update_bits(component, TAS2770_PWR_CTRL, - TAS2770_PWR_CTRL_MASK, - TAS2770_PWR_CTRL_SHUTDOWN); - case SND_SOC_DAPM_POST_REG: - return tas2770_update_pwr_ctrl(tas2770); - default: - return 0; - } -} - static const struct snd_soc_dapm_widget tas2770_dapm_widgets[] = { SND_SOC_DAPM_AIF_IN("ASI1", "ASI1 Playback", 0, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_MUX("ASI1 Sel", SND_SOC_NOPM, 0, 0, &tas2770_asi1_mux), - SND_SOC_DAPM_SWITCH_E("ISENSE", TAS2770_PWR_CTRL, 3, 1, &isense_switch, - sense_event, SND_SOC_DAPM_PRE_REG | SND_SOC_DAPM_POST_REG), - SND_SOC_DAPM_SWITCH_E("VSENSE", TAS2770_PWR_CTRL, 2, 1, &vsense_switch, - sense_event, SND_SOC_DAPM_PRE_REG | SND_SOC_DAPM_POST_REG), + SND_SOC_DAPM_SWITCH("ISENSE", TAS2770_PWR_CTRL, 3, 1, &isense_switch), + SND_SOC_DAPM_SWITCH("VSENSE", TAS2770_PWR_CTRL, 2, 1, &vsense_switch), SND_SOC_DAPM_DAC_E("DAC", NULL, SND_SOC_NOPM, 0, 0, tas2770_dac_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_OUTPUT("OUT"), diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c index 8d5d186fd58022642a9eb71a3763dc93f8739c21..a05b553e6472f48f0c837d427506c673b9bc6ede 100644 --- a/sound/soc/codecs/wcd9335.c +++ b/sound/soc/codecs/wcd9335.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include #include @@ -329,7 +329,8 @@ struct wcd9335_codec { int comp_enabled[COMPANDER_MAX]; int intr1; - struct gpio_desc *reset_gpio; + int reset_gpio; + struct regulator_bulk_data supplies[WCD9335_MAX_SUPPLY]; unsigned int rx_port_value[WCD9335_RX_MAX]; unsigned int tx_port_value[WCD9335_TX_MAX]; @@ -356,10 +357,6 @@ struct wcd9335_irq { char *name; }; -static const char * const wcd9335_supplies[] = { - "vdd-buck", "vdd-buck-sido", "vdd-tx", "vdd-rx", "vdd-io", -}; - static const struct wcd9335_slim_ch wcd9335_tx_chs[WCD9335_TX_MAX] = { WCD9335_SLIM_TX_CH(0), WCD9335_SLIM_TX_CH(1), @@ -5035,30 +5032,53 @@ static const struct regmap_irq_chip wcd9335_regmap_irq1_chip = { static int wcd9335_parse_dt(struct wcd9335_codec *wcd) { struct device *dev = wcd->dev; + struct device_node *np = dev->of_node; int ret; - wcd->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); - if (IS_ERR(wcd->reset_gpio)) - return dev_err_probe(dev, PTR_ERR(wcd->reset_gpio), "Reset GPIO missing from DT\n"); + wcd->reset_gpio = of_get_named_gpio(np, "reset-gpios", 0); + if (wcd->reset_gpio < 0) { + dev_err(dev, "Reset GPIO missing from DT\n"); + return wcd->reset_gpio; + } wcd->mclk = devm_clk_get(dev, "mclk"); - if (IS_ERR(wcd->mclk)) - return dev_err_probe(dev, PTR_ERR(wcd->mclk), "mclk not found\n"); + if (IS_ERR(wcd->mclk)) { + dev_err(dev, "mclk not found\n"); + return PTR_ERR(wcd->mclk); + } wcd->native_clk = devm_clk_get(dev, "slimbus"); - if (IS_ERR(wcd->native_clk)) - return dev_err_probe(dev, PTR_ERR(wcd->native_clk), "slimbus clock not found\n"); + if (IS_ERR(wcd->native_clk)) { + dev_err(dev, "slimbus clock not found\n"); + return PTR_ERR(wcd->native_clk); + } - ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(wcd9335_supplies), - wcd9335_supplies); - if (ret) - return dev_err_probe(dev, ret, "Failed to get and enable supplies\n"); + wcd->supplies[0].supply = "vdd-buck"; + wcd->supplies[1].supply = "vdd-buck-sido"; + wcd->supplies[2].supply = "vdd-tx"; + wcd->supplies[3].supply = "vdd-rx"; + wcd->supplies[4].supply = "vdd-io"; + + ret = regulator_bulk_get(dev, WCD9335_MAX_SUPPLY, wcd->supplies); + if (ret) { + dev_err(dev, "Failed to get supplies: err = %d\n", ret); + return ret; + } return 0; } static int wcd9335_power_on_reset(struct wcd9335_codec *wcd) { + struct device *dev = wcd->dev; + int ret; + + ret = regulator_bulk_enable(WCD9335_MAX_SUPPLY, wcd->supplies); + if (ret) { + dev_err(dev, "Failed to get supplies: err = %d\n", ret); + return ret; + } + /* * For WCD9335, it takes about 600us for the Vout_A and * Vout_D to be ready after BUCK_SIDO is powered up. @@ -5068,9 +5088,9 @@ static int wcd9335_power_on_reset(struct wcd9335_codec *wcd) */ usleep_range(600, 650); - gpiod_set_value(wcd->reset_gpio, 1); + gpio_direction_output(wcd->reset_gpio, 0); msleep(20); - gpiod_set_value(wcd->reset_gpio, 0); + gpio_set_value(wcd->reset_gpio, 1); msleep(20); return 0; @@ -5143,8 +5163,10 @@ static int wcd9335_slim_probe(struct slim_device *slim) wcd->dev = dev; ret = wcd9335_parse_dt(wcd); - if (ret) + if (ret) { + dev_err(dev, "Error parsing DT: %d\n", ret); return ret; + } ret = wcd9335_power_on_reset(wcd); if (ret) diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c index 72dc23c994bcd6c310357888014f93cc4bb9486b..b793263291dc8d66520c04723c3f14b7ba2c1601 100644 --- a/sound/soc/fsl/fsl_asrc.c +++ b/sound/soc/fsl/fsl_asrc.c @@ -517,8 +517,7 @@ static int fsl_asrc_config_pair(struct fsl_asrc_pair *pair, bool use_ideal_rate) regmap_update_bits(asrc->regmap, REG_ASRCTR, ASRCTR_ATSi_MASK(index), ASRCTR_ATS(index)); regmap_update_bits(asrc->regmap, REG_ASRCTR, - ASRCTR_IDRi_MASK(index) | ASRCTR_USRi_MASK(index), - ASRCTR_USR(index)); + ASRCTR_USRi_MASK(index), 0); /* Set the input and output clock sources */ regmap_update_bits(asrc->regmap, REG_ASRCSR, diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c index 886f5c29939b8e7f86479981090c1d9e2d0e12f8..aa15f56ca139d24861c07a69256450126e182902 100644 --- a/sound/soc/fsl/fsl_sai.c +++ b/sound/soc/fsl/fsl_sai.c @@ -762,15 +762,13 @@ static void fsl_sai_config_disable(struct fsl_sai *sai, int dir) * anymore. Add software reset to fix this issue. * This is a hardware bug, and will be fix in the * next sai version. - * - * In consumer mode, this can happen even after a - * single open/close, especially if both tx and rx - * are running concurrently. */ - /* Software Reset */ - regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), FSL_SAI_CSR_SR); - /* Clear SR bit to finish the reset */ - regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), 0); + if (!sai->is_consumer_mode) { + /* Software Reset */ + regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), FSL_SAI_CSR_SR); + /* Clear SR bit to finish the reset */ + regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), 0); + } } static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd, diff --git a/sound/soc/fsl/imx-card.c b/sound/soc/fsl/imx-card.c index bb304de5cc38a3c5e174d44505217ed9d6749855..7128bcf3a743e1c4845bb95e15247a273f97f50b 100644 --- a/sound/soc/fsl/imx-card.c +++ b/sound/soc/fsl/imx-card.c @@ -517,7 +517,7 @@ static int imx_card_parse_of(struct imx_card_data *data) if (!card->dai_link) return -ENOMEM; - data->link_data = devm_kcalloc(dev, num_links, sizeof(*link_data), GFP_KERNEL); + data->link_data = devm_kcalloc(dev, num_links, sizeof(*link), GFP_KERNEL); if (!data->link_data) return -ENOMEM; diff --git a/sound/soc/intel/avs/debugfs.c b/sound/soc/intel/avs/debugfs.c index 26d0c3a5a9542db5920971c6cb0f10d67ba445ea..bdd388ec01eaf76609ca9d979f9d83980406242f 100644 --- a/sound/soc/intel/avs/debugfs.c +++ b/sound/soc/intel/avs/debugfs.c @@ -371,10 +371,7 @@ static ssize_t trace_control_write(struct file *file, const char __user *from, s return ret; num_elems = *array; - if (!num_elems) { - ret = -EINVAL; - goto free_array; - } + resource_mask = array[1]; /* * Disable if just resource mask is provided - no log priority flags. @@ -382,7 +379,6 @@ static ssize_t trace_control_write(struct file *file, const char __user *from, s * Enable input format: mask, prio1, .., prioN * Where 'N' equals number of bits set in the 'mask'. */ - resource_mask = array[1]; if (num_elems == 1) { ret = disable_logs(adev, resource_mask); } else { diff --git a/sound/soc/intel/avs/ipc.c b/sound/soc/intel/avs/ipc.c index afd472906ede4c27ebdb1aa591958002963e7ec3..74f676fdfba29d02d773bf0c3e04ec2394727d3c 100644 --- a/sound/soc/intel/avs/ipc.c +++ b/sound/soc/intel/avs/ipc.c @@ -169,9 +169,7 @@ static void avs_dsp_exception_caught(struct avs_dev *adev, union avs_notify_msg dev_crit(adev->dev, "communication severed, rebooting dsp..\n"); - /* Avoid deadlock as the exception may be the response to SET_D0IX. */ - if (current_work() != &ipc->d0ix_work.work) - cancel_delayed_work_sync(&ipc->d0ix_work); + cancel_delayed_work_sync(&ipc->d0ix_work); ipc->in_d0ix = false; /* Re-enabled on recovery completion. */ pm_runtime_disable(adev->dev); diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c index 6a85e8fdcae6465b190658568f557df14ee521ee..ce80adc30fe946babdd3f9d4f5d0da307939ce87 100644 --- a/sound/soc/intel/boards/bytcr_rt5640.c +++ b/sound/soc/intel/boards/bytcr_rt5640.c @@ -576,19 +576,6 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = { BYT_RT5640_SSP0_AIF2 | BYT_RT5640_MCLK_EN), }, - { /* Acer Aspire SW3-013 */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Acer"), - DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW3-013"), - }, - .driver_data = (void *)(BYT_RT5640_DMIC1_MAP | - BYT_RT5640_JD_SRC_JD2_IN4N | - BYT_RT5640_OVCD_TH_2000UA | - BYT_RT5640_OVCD_SF_0P75 | - BYT_RT5640_DIFF_MIC | - BYT_RT5640_SSP0_AIF1 | - BYT_RT5640_MCLK_EN), - }, { .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Acer"), diff --git a/sound/soc/meson/meson-card-utils.c b/sound/soc/meson/meson-card-utils.c index 1adaf0041a48043b32f443d889413010e9a5bc9d..f7fd9c013e19f7f46235eefefc18f980b6311970 100644 --- a/sound/soc/meson/meson-card-utils.c +++ b/sound/soc/meson/meson-card-utils.c @@ -231,7 +231,7 @@ static int meson_card_parse_of_optional(struct snd_soc_card *card, const char *p)) { /* If property is not provided, don't fail ... */ - if (!of_property_present(card->dev->of_node, propname)) + if (!of_property_read_bool(card->dev->of_node, propname)) return 0; /* ... but do fail if it is provided and the parsing fails */ diff --git a/sound/soc/qcom/sdm845.c b/sound/soc/qcom/sdm845.c index 39d22304ce43ffcdb52eee61e7f23a3824c08eff..3eb29645a6377c3f0830e8611e0c26b14785d09d 100644 --- a/sound/soc/qcom/sdm845.c +++ b/sound/soc/qcom/sdm845.c @@ -90,10 +90,6 @@ static int sdm845_slim_snd_hw_params(struct snd_pcm_substream *substream, else ret = snd_soc_dai_set_channel_map(cpu_dai, tx_ch_cnt, tx_ch, 0, NULL); - if (ret != 0 && ret != -ENOTSUPP) { - dev_err(rtd->dev, "failed to set cpu chan map, err:%d\n", ret); - return ret; - } } return 0; diff --git a/sound/soc/sof/ipc4-control.c b/sound/soc/sof/ipc4-control.c index 84145209dec493816951de7d16dbb87c21470ab0..b4cdcec33e120944522c572acaf722a2e82a0acb 100644 --- a/sound/soc/sof/ipc4-control.c +++ b/sound/soc/sof/ipc4-control.c @@ -483,14 +483,6 @@ static int sof_ipc4_bytes_ext_put(struct snd_sof_control *scontrol, return -EINVAL; } - /* Check header id */ - if (header.numid != SOF_CTRL_CMD_BINARY) { - dev_err_ratelimited(scomp->dev, - "Incorrect numid for bytes put %d\n", - header.numid); - return -EINVAL; - } - /* Verify the ABI header first */ if (copy_from_user(&abi_hdr, tlvd->tlv, sizeof(abi_hdr))) return -EFAULT; @@ -573,8 +565,7 @@ static int _sof_ipc4_bytes_ext_get(struct snd_sof_control *scontrol, if (data_size > size) return -ENOSPC; - /* Set header id and length */ - header.numid = SOF_CTRL_CMD_BINARY; + header.numid = scontrol->comp_id; header.length = data_size; if (copy_to_user(tlvd, &header, sizeof(struct snd_ctl_tlv))) diff --git a/sound/soc/sof/ipc4-pcm.c b/sound/soc/sof/ipc4-pcm.c index a29632423ccda10d6fb7f08109373d372bd07253..e8acf60c27a7435900b1fb2191127e7319803572 100644 --- a/sound/soc/sof/ipc4-pcm.c +++ b/sound/soc/sof/ipc4-pcm.c @@ -615,15 +615,13 @@ static int sof_ipc4_pcm_setup(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm /* allocate memory for max number of pipeline IDs */ pipeline_list->pipelines = kcalloc(ipc4_data->max_num_pipelines, - sizeof(*pipeline_list->pipelines), - GFP_KERNEL); + sizeof(struct snd_sof_widget *), GFP_KERNEL); if (!pipeline_list->pipelines) { sof_ipc4_pcm_free(sdev, spcm); return -ENOMEM; } - /* Delay reporting is only supported on playback */ - if (!support_info || stream == SNDRV_PCM_STREAM_CAPTURE) + if (!support_info) continue; stream_info = kzalloc(sizeof(*stream_info), GFP_KERNEL); diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c index c18a1fdd40ee3885bebeb127101c9b8d815528c9..7afded323150c819d024e3abd46f14321437ae88 100644 --- a/sound/soc/sof/topology.c +++ b/sound/soc/sof/topology.c @@ -1057,7 +1057,7 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp, struct snd_sof_dai *dai) { struct snd_soc_card *card = scomp->card; - struct snd_soc_pcm_runtime *rtd, *full, *partial; + struct snd_soc_pcm_runtime *rtd; struct snd_soc_dai *cpu_dai; int stream; int i; @@ -1074,22 +1074,12 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp, else goto end; - full = NULL; - partial = NULL; list_for_each_entry(rtd, &card->rtd_list, list) { /* does stream match DAI link ? */ - if (rtd->dai_link->stream_name) { - if (!strcmp(rtd->dai_link->stream_name, w->sname)) { - full = rtd; - break; - } else if (strstr(rtd->dai_link->stream_name, w->sname)) { - partial = rtd; - } - } - } + if (!rtd->dai_link->stream_name || + !strstr(rtd->dai_link->stream_name, w->sname)) + continue; - rtd = full ? full : partial; - if (rtd) { for_each_rtd_cpu_dais(rtd, i, cpu_dai) { /* * Please create DAI widget in the right order diff --git a/sound/soc/tegra/tegra210_ahub.c b/sound/soc/tegra/tegra210_ahub.c index 140cb27f73287edce7db3ac226850eed5432f908..ab3c6b2544d205d2272d84372be409d3e6f20cff 100644 --- a/sound/soc/tegra/tegra210_ahub.c +++ b/sound/soc/tegra/tegra210_ahub.c @@ -1359,8 +1359,6 @@ static int tegra_ahub_probe(struct platform_device *pdev) return -ENOMEM; ahub->soc_data = of_device_get_match_data(&pdev->dev); - if (!ahub->soc_data) - return -ENODEV; platform_set_drvdata(pdev, ahub); diff --git a/sound/soc/ti/omap-hdmi.c b/sound/soc/ti/omap-hdmi.c index 72fabf22a02ee7a4d9706bac048bb4a65496ed06..0a731b21e5a58d6d303bb56b4c233f30dd153edf 100644 --- a/sound/soc/ti/omap-hdmi.c +++ b/sound/soc/ti/omap-hdmi.c @@ -361,20 +361,17 @@ static int omap_hdmi_audio_probe(struct platform_device *pdev) if (!card->dai_link) return -ENOMEM; - compnent = devm_kzalloc(dev, 2 * sizeof(*compnent), GFP_KERNEL); + compnent = devm_kzalloc(dev, sizeof(*compnent), GFP_KERNEL); if (!compnent) return -ENOMEM; - card->dai_link->cpus = &compnent[0]; + card->dai_link->cpus = compnent; card->dai_link->num_cpus = 1; card->dai_link->codecs = &asoc_dummy_dlc; card->dai_link->num_codecs = 1; - card->dai_link->platforms = &compnent[1]; - card->dai_link->num_platforms = 1; card->dai_link->name = card->name; card->dai_link->stream_name = card->name; card->dai_link->cpus->dai_name = dev_name(ad->dssdev); - card->dai_link->platforms->name = dev_name(ad->dssdev); card->num_links = 1; card->dev = dev; diff --git a/sound/usb/implicit.c b/sound/usb/implicit.c index 77f06da93151e88d7a4a5547e2dd4b2c2b2174e8..4727043fd74580de6464e3076df0e997285a570e 100644 --- a/sound/usb/implicit.c +++ b/sound/usb/implicit.c @@ -57,7 +57,6 @@ static const struct snd_usb_implicit_fb_match playback_implicit_fb_quirks[] = { IMPLICIT_FB_FIXED_DEV(0x31e9, 0x0002, 0x81, 2), /* Solid State Logic SSL2+ */ IMPLICIT_FB_FIXED_DEV(0x0499, 0x172f, 0x81, 2), /* Steinberg UR22C */ IMPLICIT_FB_FIXED_DEV(0x0d9a, 0x00df, 0x81, 2), /* RTX6001 */ - IMPLICIT_FB_FIXED_DEV(0x19f7, 0x000a, 0x84, 3), /* RODE AI-1 */ IMPLICIT_FB_FIXED_DEV(0x22f0, 0x0006, 0x81, 3), /* Allen&Heath Qu-16 */ IMPLICIT_FB_FIXED_DEV(0x1686, 0xf029, 0x82, 2), /* Zoom UAC-2 */ IMPLICIT_FB_FIXED_DEV(0x2466, 0x8003, 0x86, 2), /* Fractal Audio Axe-Fx II */ diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c index faac7df1fbcf02158d6fee0e9ed581ce972d7623..0e9b5431a47f20bed79a46840f585cf5a34f16fa 100644 --- a/sound/usb/mixer_maps.c +++ b/sound/usb/mixer_maps.c @@ -383,13 +383,6 @@ static const struct usbmix_name_map ms_usb_link_map[] = { { 0 } /* terminator */ }; -/* KTMicro USB */ -static struct usbmix_name_map s31b2_0022_map[] = { - { 23, "Speaker Playback" }, - { 18, "Headphone Playback" }, - { 0 } -}; - /* ASUS ROG Zenith II with Realtek ALC1220-VB */ static const struct usbmix_name_map asus_zenith_ii_map[] = { { 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */ @@ -699,11 +692,6 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = { .id = USB_ID(0x045e, 0x083c), .map = ms_usb_link_map, }, - { - /* KTMicro USB */ - .id = USB_ID(0X31b2, 0x0022), - .map = s31b2_0022_map, - }, { 0 } /* terminator */ }; diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index f19c808444c97a9dfe1dd7179d0902dbee3d4326..0b8b20550ab381ac51eeada547e6d4fcc7cadda5 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2182,8 +2182,6 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_DISABLE_AUTOSUSPEND), DEVICE_FLG(0x17aa, 0x104d, /* Lenovo ThinkStation P620 Internal Speaker + Front Headset */ QUIRK_FLAG_DISABLE_AUTOSUSPEND), - DEVICE_FLG(0x17ef, 0x3083, /* Lenovo TBT3 dock */ - QUIRK_FLAG_GET_SAMPLE_RATE), DEVICE_FLG(0x1852, 0x5062, /* Luxman D-08u */ QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY), DEVICE_FLG(0x1852, 0x5065, /* Luxman DA-06 */ diff --git a/sound/usb/stream.c b/sound/usb/stream.c index 0f1558ef8555357a671ce28b627589d482f9cc15..e14c725acebf2c1dbf69f56b421081a3beb1b1cb 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -982,8 +982,6 @@ snd_usb_get_audioformat_uac3(struct snd_usb_audio *chip, * and request Cluster Descriptor */ wLength = le16_to_cpu(hc_header.wLength); - if (wLength < sizeof(cluster)) - return NULL; cluster = kzalloc(wLength, GFP_KERNEL); if (!cluster) return ERR_PTR(-ENOMEM); diff --git a/tools/arch/x86/include/asm/msr-index.h b/tools/arch/x86/include/asm/msr-index.h index 76f9cad9fb62b190d733a90e017f92b7dbe72a4c..1d111350197f3169a8eec402d77980dd617c6b95 100644 --- a/tools/arch/x86/include/asm/msr-index.h +++ b/tools/arch/x86/include/asm/msr-index.h @@ -550,7 +550,6 @@ #define MSR_AMD64_OSVW_STATUS 0xc0010141 #define MSR_AMD_PPIN_CTL 0xc00102f0 #define MSR_AMD_PPIN 0xc00102f1 -#define MSR_AMD64_CPUID_FN_7 0xc0011002 #define MSR_AMD64_CPUID_FN_1 0xc0011004 #define MSR_AMD64_LS_CFG 0xc0011020 #define MSR_AMD64_DC_CFG 0xc0011022 diff --git a/tools/arch/x86/kcpuid/kcpuid.c b/tools/arch/x86/kcpuid/kcpuid.c index 8c2644f3497e64bb4748c46a2761368092be34e3..b7965dfff33a9a333286c4a4ee335c47b0c6490d 100644 --- a/tools/arch/x86/kcpuid/kcpuid.c +++ b/tools/arch/x86/kcpuid/kcpuid.c @@ -1,12 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 #define _GNU_SOURCE -#include -#include -#include #include +#include #include #include +#include #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #define min(a, b) (((a) < (b)) ? (a) : (b)) @@ -157,14 +156,14 @@ static bool cpuid_store(struct cpuid_range *range, u32 f, int subleaf, if (!func->leafs) { func->leafs = malloc(sizeof(struct subleaf)); if (!func->leafs) - err(EXIT_FAILURE, NULL); + perror("malloc func leaf"); func->nr = 1; } else { s = func->nr; func->leafs = realloc(func->leafs, (s + 1) * sizeof(*leaf)); if (!func->leafs) - err(EXIT_FAILURE, NULL); + perror("realloc f->leafs"); func->nr++; } @@ -223,7 +222,7 @@ struct cpuid_range *setup_cpuid_range(u32 input_eax) range = malloc(sizeof(struct cpuid_range)); if (!range) - err(EXIT_FAILURE, NULL); + perror("malloc range"); if (input_eax & 0x80000000) range->is_ext = true; @@ -232,7 +231,7 @@ struct cpuid_range *setup_cpuid_range(u32 input_eax) range->funcs = malloc(sizeof(struct cpuid_func) * idx_func); if (!range->funcs) - err(EXIT_FAILURE, NULL); + perror("malloc range->funcs"); range->nr = idx_func; memset(range->funcs, 0, sizeof(struct cpuid_func) * idx_func); @@ -388,8 +387,8 @@ static int parse_line(char *line) return 0; err_exit: - warnx("Wrong line format:\n" - "\tline[%d]: %s", flines, line); + printf("Warning: wrong line format:\n"); + printf("\tline[%d]: %s\n", flines, line); return -1; } @@ -411,8 +410,10 @@ static void parse_text(void) file = fopen("./cpuid.csv", "r"); } - if (!file) - err(EXIT_FAILURE, "%s", filename); + if (!file) { + printf("Fail to open '%s'\n", filename); + return; + } while (1) { ret = getline(&line, &len, file); @@ -520,7 +521,7 @@ static inline struct cpuid_func *index_to_func(u32 index) func_idx = index & 0xffff; if ((func_idx + 1) > (u32)range->nr) { - warnx("Invalid input index (0x%x)", index); + printf("ERR: invalid input index (0x%x)\n", index); return NULL; } return &range->funcs[func_idx]; @@ -552,7 +553,7 @@ static void show_info(void) return; } - warnx("Invalid input subleaf (0x%x)", user_sub); + printf("ERR: invalid input subleaf (0x%x)\n", user_sub); } show_func(func); @@ -583,15 +584,15 @@ static void setup_platform_cpuid(void) static void usage(void) { - warnx("kcpuid [-abdfhr] [-l leaf] [-s subleaf]\n" - "\t-a|--all Show both bit flags and complex bit fields info\n" - "\t-b|--bitflags Show boolean flags only\n" - "\t-d|--detail Show details of the flag/fields (default)\n" - "\t-f|--flags Specify the CPUID CSV file\n" - "\t-h|--help Show usage info\n" - "\t-l|--leaf=index Specify the leaf you want to check\n" - "\t-r|--raw Show raw CPUID data\n" - "\t-s|--subleaf=sub Specify the subleaf you want to check" + printf("kcpuid [-abdfhr] [-l leaf] [-s subleaf]\n" + "\t-a|--all Show both bit flags and complex bit fields info\n" + "\t-b|--bitflags Show boolean flags only\n" + "\t-d|--detail Show details of the flag/fields (default)\n" + "\t-f|--flags Specify the cpuid csv file\n" + "\t-h|--help Show usage info\n" + "\t-l|--leaf=index Specify the leaf you want to check\n" + "\t-r|--raw Show raw cpuid data\n" + "\t-s|--subleaf=sub Specify the subleaf you want to check\n" ); } @@ -642,7 +643,7 @@ static int parse_options(int argc, char *argv[]) user_sub = strtoul(optarg, NULL, 0); break; default: - warnx("Invalid option '%c'", optopt); + printf("%s: Invalid option '%c'\n", argv[0], optopt); return -1; } diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c index 0a764426d93586f07719b85104604759ca903c61..9b75639434b8157360ef08f82648beeb6f4cd940 100644 --- a/tools/bpf/bpftool/common.c +++ b/tools/bpf/bpftool/common.c @@ -461,11 +461,10 @@ int get_fd_type(int fd) p_err("can't read link type: %s", strerror(errno)); return -1; } - if (n == sizeof(buf)) { + if (n == sizeof(path)) { p_err("can't read link type: path too long!"); return -1; } - buf[n] = '\0'; if (strstr(buf, "bpf-map")) return BPF_OBJ_MAP; diff --git a/tools/bpf/resolve_btfids/Makefile b/tools/bpf/resolve_btfids/Makefile index b0072e64b01023f4ce712786d535be4233c0a8df..4b8079f294f65b284481e9a2bf6ff52594a4669a 100644 --- a/tools/bpf/resolve_btfids/Makefile +++ b/tools/bpf/resolve_btfids/Makefile @@ -19,7 +19,7 @@ endif # Overrides for the prepare step libraries. HOST_OVERRIDES := AR="$(HOSTAR)" CC="$(HOSTCC)" LD="$(HOSTLD)" ARCH="$(HOSTARCH)" \ - CROSS_COMPILE="" CLANG_CROSS_FLAGS="" EXTRA_CFLAGS="$(HOSTCFLAGS)" + CROSS_COMPILE="" EXTRA_CFLAGS="$(HOSTCFLAGS)" RM ?= rm HOSTCC ?= gcc diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile index 4f869fff28fe439319067adaaecc3e25be2b1179..dad79ede4e0ae0030ee401a1daf5d59ff871dcb6 100644 --- a/tools/build/feature/Makefile +++ b/tools/build/feature/Makefile @@ -80,30 +80,7 @@ FILES= \ FILES := $(addprefix $(OUTPUT),$(FILES)) -# Some distros provide the command $(CROSS_COMPILE)pkg-config for -# searching packges installed with Multiarch. Use it for cross -# compilation if it is existed. -ifneq (, $(shell which $(CROSS_COMPILE)pkg-config)) - PKG_CONFIG ?= $(CROSS_COMPILE)pkg-config -else - PKG_CONFIG ?= pkg-config - - # PKG_CONFIG_PATH or PKG_CONFIG_LIBDIR, alongside PKG_CONFIG_SYSROOT_DIR - # for modified system root, are required for the cross compilation. - # If these PKG_CONFIG environment variables are not set, Multiarch library - # paths are used instead. - ifdef CROSS_COMPILE - ifeq ($(PKG_CONFIG_LIBDIR)$(PKG_CONFIG_PATH)$(PKG_CONFIG_SYSROOT_DIR),) - CROSS_ARCH = $(shell $(CC) -dumpmachine) - PKG_CONFIG_LIBDIR := /usr/local/$(CROSS_ARCH)/lib/pkgconfig/ - PKG_CONFIG_LIBDIR := $(PKG_CONFIG_LIBDIR):/usr/local/lib/$(CROSS_ARCH)/pkgconfig/ - PKG_CONFIG_LIBDIR := $(PKG_CONFIG_LIBDIR):/usr/lib/$(CROSS_ARCH)/pkgconfig/ - PKG_CONFIG_LIBDIR := $(PKG_CONFIG_LIBDIR):/usr/local/share/pkgconfig/ - PKG_CONFIG_LIBDIR := $(PKG_CONFIG_LIBDIR):/usr/share/pkgconfig/ - export PKG_CONFIG_LIBDIR - endif - endif -endif +PKG_CONFIG ?= $(CROSS_COMPILE)pkg-config all: $(FILES) diff --git a/tools/include/linux/kallsyms.h b/tools/include/linux/kallsyms.h index f61a01dd7eb7c7833a335c21b660c0c9332bbeff..5a37ccbec54fbc603108ad9346c0351c8a3c56a8 100644 --- a/tools/include/linux/kallsyms.h +++ b/tools/include/linux/kallsyms.h @@ -18,7 +18,6 @@ static inline const char *kallsyms_lookup(unsigned long addr, return NULL; } -#ifdef HAVE_BACKTRACE_SUPPORT #include #include static inline void print_ip_sym(const char *loglvl, unsigned long ip) @@ -31,8 +30,5 @@ static inline void print_ip_sym(const char *loglvl, unsigned long ip) free(name); } -#else -static inline void print_ip_sym(const char *loglvl, unsigned long ip) {} -#endif #endif diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 2e064a1032a0509d0df0fdf779545ae5c75a59f7..2a90f04a4160db9b6203b694c0f5ae1841636333 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -1913,7 +1913,6 @@ union bpf_attr { * for updates resulting in a null checksum the value is set to * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates * the checksum is to be computed against a pseudo-header. - * Flag **BPF_F_IPV6** should be set for IPv6 packets. * * This helper works in combination with **bpf_csum_diff**\ (), * which does not update the checksum in-place, but offers more @@ -5921,7 +5920,6 @@ enum { BPF_F_PSEUDO_HDR = (1ULL << 4), BPF_F_MARK_MANGLED_0 = (1ULL << 5), BPF_F_MARK_ENFORCE = (1ULL << 6), - BPF_F_IPV6 = (1ULL << 7), }; /* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ diff --git a/tools/lib/bpf/bpf_core_read.h b/tools/lib/bpf/bpf_core_read.h index b3fc384595a9f351267e1a67458f9ee3518f9114..e2b9e8415c04465d67fbee5b6b52a5e05edef669 100644 --- a/tools/lib/bpf/bpf_core_read.h +++ b/tools/lib/bpf/bpf_core_read.h @@ -312,13 +312,7 @@ enum bpf_enum_value_kind { #define ___arrow10(a, b, c, d, e, f, g, h, i, j) a->b->c->d->e->f->g->h->i->j #define ___arrow(...) ___apply(___arrow, ___narg(__VA_ARGS__))(__VA_ARGS__) -#if defined(__clang__) && (__clang_major__ >= 19) -#define ___type(...) __typeof_unqual__(___arrow(__VA_ARGS__)) -#elif defined(__GNUC__) && (__GNUC__ >= 14) -#define ___type(...) __typeof_unqual__(___arrow(__VA_ARGS__)) -#else #define ___type(...) typeof(___arrow(__VA_ARGS__)) -#endif #define ___read(read_fn, dst, src_type, src, accessor) \ read_fn((void *)(dst), sizeof(*(dst)), &((src_type)(src))->accessor) diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c index 2e9f28cece3ffe998c2bb208dbbed266005a177c..8484b563b53d0a70b73ff53faec0dec3db36bb33 100644 --- a/tools/lib/bpf/btf.c +++ b/tools/lib/bpf/btf.c @@ -3922,19 +3922,6 @@ static bool btf_dedup_identical_structs(struct btf_dedup *d, __u32 id1, __u32 id return true; } -static bool btf_dedup_identical_ptrs(struct btf_dedup *d, __u32 id1, __u32 id2) -{ - struct btf_type *t1, *t2; - - t1 = btf_type_by_id(d->btf, id1); - t2 = btf_type_by_id(d->btf, id2); - - if (!btf_is_ptr(t1) || !btf_is_ptr(t2)) - return false; - - return t1->type == t2->type; -} - /* * Check equivalence of BTF type graph formed by candidate struct/union (we'll * call it "candidate graph" in this description for brevity) to a type graph @@ -4067,9 +4054,6 @@ static int btf_dedup_is_equiv(struct btf_dedup *d, __u32 cand_id, */ if (btf_dedup_identical_structs(d, hypot_type_id, cand_id)) return 1; - /* A similar case is again observed for PTRs. */ - if (btf_dedup_identical_ptrs(d, hypot_type_id, cand_id)) - return 1; return 0; } diff --git a/tools/lib/bpf/btf_dump.c b/tools/lib/bpf/btf_dump.c index cf4db51b99eb5de10f6a890c068944c5f0f22eac..ebf56d21d08eeda2fff570a92491754e6d73773f 100644 --- a/tools/lib/bpf/btf_dump.c +++ b/tools/lib/bpf/btf_dump.c @@ -225,9 +225,6 @@ static void btf_dump_free_names(struct hashmap *map) size_t bkt; struct hashmap_entry *cur; - if (!map) - return; - hashmap__for_each_entry(map, cur, bkt) free((void *)cur->pkey); diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index aefbfa2df6207cdc6a4f7e02361e66e82a3c629d..fa2abe56e845d9ce72fe8525dc41bab0642338b7 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -246,7 +246,7 @@ void libbpf_print(enum libbpf_print_level level, const char *format, ...) old_errno = errno; va_start(args, format); - print_fn(level, format, args); + __libbpf_pr(level, format, args); va_end(args); errno = old_errno; @@ -554,7 +554,7 @@ struct extern_desc { int sym_idx; int btf_id; int sec_btf_id; - char *name; + const char *name; char *essent_name; bool is_set; bool is_weak; @@ -838,7 +838,7 @@ bpf_object__add_programs(struct bpf_object *obj, Elf_Data *sec_data, return -LIBBPF_ERRNO__FORMAT; } - if (sec_off + prog_sz > sec_sz || sec_off + prog_sz < sec_off) { + if (sec_off + prog_sz > sec_sz) { pr_warn("sec '%s': program at offset %zu crosses section boundary\n", sec_name, sec_off); return -LIBBPF_ERRNO__FORMAT; @@ -3822,9 +3822,7 @@ static int bpf_object__collect_externs(struct bpf_object *obj) return ext->btf_id; } t = btf__type_by_id(obj->btf, ext->btf_id); - ext->name = strdup(btf__name_by_offset(obj->btf, t->name_off)); - if (!ext->name) - return -ENOMEM; + ext->name = btf__name_by_offset(obj->btf, t->name_off); ext->sym_idx = i; ext->is_weak = ELF64_ST_BIND(sym->st_info) == STB_WEAK; @@ -8459,10 +8457,8 @@ void bpf_object__close(struct bpf_object *obj) zfree(&obj->btf_custom_path); zfree(&obj->kconfig); - for (i = 0; i < obj->nr_extern; i++) { - zfree(&obj->externs[i].name); + for (i = 0; i < obj->nr_extern; i++) zfree(&obj->externs[i].essent_name); - } zfree(&obj->externs); obj->nr_extern = 0; @@ -12457,6 +12453,7 @@ struct perf_buffer *perf_buffer__new(int map_fd, size_t page_cnt, attr.config = PERF_COUNT_SW_BPF_OUTPUT; attr.type = PERF_TYPE_SOFTWARE; attr.sample_type = PERF_SAMPLE_RAW; + attr.sample_period = sample_period; attr.wakeup_events = sample_period; p.attr = &attr; diff --git a/tools/lib/bpf/linker.c b/tools/lib/bpf/linker.c index e1b3136643aa86f9e905acff3e78ee61ef722a6a..a3a190d13db8a04f8d54c4f94a38ea1ad3feff5b 100644 --- a/tools/lib/bpf/linker.c +++ b/tools/lib/bpf/linker.c @@ -1187,7 +1187,7 @@ static int linker_append_sec_data(struct bpf_linker *linker, struct src_obj *obj } else { if (!secs_match(dst_sec, src_sec)) { pr_warn("ELF sections %s are incompatible\n", src_sec->sec_name); - return -EINVAL; + return -1; } /* "license" and "version" sections are deduped */ @@ -2034,7 +2034,7 @@ static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *ob } } else if (!secs_match(dst_sec, src_sec)) { pr_warn("sections %s are not compatible\n", src_sec->sec_name); - return -EINVAL; + return -1; } /* shdr->sh_link points to SYMTAB */ diff --git a/tools/lib/bpf/nlattr.c b/tools/lib/bpf/nlattr.c index 06663f9ea581f9b77731d80baaf89d3994b91548..975e265eab3bfec5378a5c4849813dfb672ce018 100644 --- a/tools/lib/bpf/nlattr.c +++ b/tools/lib/bpf/nlattr.c @@ -63,16 +63,16 @@ static int validate_nla(struct nlattr *nla, int maxtype, minlen = nla_attr_minlen[pt->type]; if (libbpf_nla_len(nla) < minlen) - return -EINVAL; + return -1; if (pt->maxlen && libbpf_nla_len(nla) > pt->maxlen) - return -EINVAL; + return -1; if (pt->type == LIBBPF_NLA_STRING) { char *data = libbpf_nla_data(nla); if (data[libbpf_nla_len(nla) - 1] != '\0') - return -EINVAL; + return -1; } return 0; @@ -118,18 +118,19 @@ int libbpf_nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, if (policy) { err = validate_nla(nla, maxtype, policy); if (err < 0) - return err; + goto errout; } - if (tb[type]) { + if (tb[type]) pr_warn("Attribute of type %#x found multiple times in message, " "previous attribute is being ignored.\n", type); - } tb[type] = nla; } - return 0; + err = 0; +errout: + return err; } /** diff --git a/tools/net/ynl/lib/ynl.c b/tools/net/ynl/lib/ynl.c index 0871f86c6b66669d74363e270db9d7886b7f9ecb..ae61ae5b02bf88b913dc75cdc023892f27fb38c5 100644 --- a/tools/net/ynl/lib/ynl.c +++ b/tools/net/ynl/lib/ynl.c @@ -368,7 +368,7 @@ int ynl_attr_validate(struct ynl_parse_arg *yarg, const struct nlattr *attr) "Invalid attribute (binary %s)", policy->name); return -1; case YNL_PT_NUL_STR: - if (len && (!policy->len || len <= policy->len) && !data[len - 1]) + if ((!policy->len || len <= policy->len) && !data[len - 1]) break; yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, "Invalid attribute (string %s)", policy->name); diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index 9da9f878f50f7b8a7927a2c4dd17101189ebe5be..d66b52407e19c6f4dde9fded0da2d8dcf0a95d45 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -554,8 +554,6 @@ ifndef NO_LIBELF ifeq ($(feature-libdebuginfod), 1) CFLAGS += -DHAVE_DEBUGINFOD_SUPPORT EXTLIBS += -ldebuginfod - else - $(warning No elfutils/debuginfod.h found, no debuginfo server support, please install libdebuginfod-dev/elfutils-debuginfod-client-devel or equivalent) endif endif diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index ff72a0d9dea0c389ecdeee105ab90ee78cb24a6d..b97224a8a65b9d6f21b67340c60cecbb61994819 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf @@ -188,32 +188,7 @@ HOSTLD ?= ld HOSTAR ?= ar CLANG ?= clang -# Some distros provide the command $(CROSS_COMPILE)pkg-config for -# searching packges installed with Multiarch. Use it for cross -# compilation if it is existed. -ifneq (, $(shell which $(CROSS_COMPILE)pkg-config)) - PKG_CONFIG ?= $(CROSS_COMPILE)pkg-config -else - PKG_CONFIG ?= pkg-config - - # PKG_CONFIG_PATH or PKG_CONFIG_LIBDIR, alongside PKG_CONFIG_SYSROOT_DIR - # for modified system root, is required for the cross compilation. - # If these PKG_CONFIG environment variables are not set, Multiarch library - # paths are used instead. - ifdef CROSS_COMPILE - ifeq ($(PKG_CONFIG_LIBDIR)$(PKG_CONFIG_PATH)$(PKG_CONFIG_SYSROOT_DIR),) - CROSS_ARCH = $(shell $(CC) -dumpmachine) - PKG_CONFIG_LIBDIR := /usr/local/$(CROSS_ARCH)/lib/pkgconfig/ - PKG_CONFIG_LIBDIR := $(PKG_CONFIG_LIBDIR):/usr/local/lib/$(CROSS_ARCH)/pkgconfig/ - PKG_CONFIG_LIBDIR := $(PKG_CONFIG_LIBDIR):/usr/lib/$(CROSS_ARCH)/pkgconfig/ - PKG_CONFIG_LIBDIR := $(PKG_CONFIG_LIBDIR):/usr/local/share/pkgconfig/ - PKG_CONFIG_LIBDIR := $(PKG_CONFIG_LIBDIR):/usr/share/pkgconfig/ - export PKG_CONFIG_LIBDIR - $(warning Missing PKG_CONFIG_LIBDIR, PKG_CONFIG_PATH and PKG_CONFIG_SYSROOT_DIR for cross compilation,) - $(warning set PKG_CONFIG_LIBDIR for using Multiarch libs.) - endif - endif -endif +PKG_CONFIG = $(CROSS_COMPILE)pkg-config RM = rm -f LN = ln -f diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 81f77c0505fde00c5dddfb3737203da050473b69..b94ae33a343c2a321f603e192082d9f2658d5d07 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -3427,7 +3427,7 @@ static struct option __record_options[] = { "sample selected machine registers on interrupt," " use '-I?' to list register names", parse_intr_regs), OPT_CALLBACK_OPTARG(0, "user-regs", &record.opts.sample_user_regs, NULL, "any register", - "sample selected machine registers in user space," + "sample selected machine registers on interrupt," " use '--user-regs=?' to list register names", parse_user_regs), OPT_BOOLEAN(0, "running-time", &record.opts.running_time, "Record running/enabled time of read (:S) events"), diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 7ee3285af10c99c9f5fe90bf68d94cf1cbd933de..12bdbf3ecc6ae4c0668c191089cb35f6af8761ac 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -2586,8 +2586,8 @@ errno_print: { else if (sc->fmt->errpid) { struct thread *child = machine__find_thread(trace->host, ret, ret); - fprintf(trace->output, "%ld", ret); if (child != NULL) { + fprintf(trace->output, "%ld", ret); if (thread__comm_set(child)) fprintf(trace->output, " (%s)", thread__comm_str(child)); thread__put(child); @@ -3589,13 +3589,10 @@ static int trace__set_filter_loop_pids(struct trace *trace) if (!strcmp(thread__comm_str(parent), "sshd") || strstarts(thread__comm_str(parent), "gnome-terminal")) { pids[nr++] = thread__tid(parent); - thread__put(parent); break; } - thread__put(thread); thread = parent; } - thread__put(thread); err = evlist__append_tp_filter_pids(trace->evlist, nr, pids); if (!err && trace->filter_pids.map) diff --git a/tools/perf/scripts/python/exported-sql-viewer.py b/tools/perf/scripts/python/exported-sql-viewer.py index 99742013676b3d7d8c74fd3e858177dcbd7cfaa6..13f2d8a8161096e8f8f9b691146629dafeee4538 100755 --- a/tools/perf/scripts/python/exported-sql-viewer.py +++ b/tools/perf/scripts/python/exported-sql-viewer.py @@ -680,10 +680,7 @@ class CallGraphModelBase(TreeModel): s = value.replace("%", "\%") s = s.replace("_", "\_") # Translate * and ? into SQL LIKE pattern characters % and _ - if sys.version_info[0] == 3: - trans = str.maketrans("*?", "%_") - else: - trans = string.maketrans("*?", "%_") + trans = string.maketrans("*?", "%_") match = " LIKE '" + str(s).translate(trans) + "'" else: match = " GLOB '" + str(value) + "'" diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c index 2c7bdf4fd55edd96787bd007cd65fee4890502ad..e52b031bedc5a9b545fe9b6c8d3f93b6aaefd03d 100644 --- a/tools/perf/tests/switch-tracking.c +++ b/tools/perf/tests/switch-tracking.c @@ -258,7 +258,7 @@ static int compar(const void *a, const void *b) const struct event_node *nodeb = b; s64 cmp = nodea->event_time - nodeb->event_time; - return cmp < 0 ? -1 : (cmp > 0 ? 1 : 0); + return cmp; } static int process_events(struct evlist *evlist, diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index a53a0257a4bca2965d059818cc3ee99594a50e66..bb59d27642ccf291bd2e1306b59b2c44720600e2 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -3239,10 +3239,10 @@ static int evsel__hists_browse(struct evsel *evsel, int nr_events, const char *h /* * No need to set actions->dso here since * it's just to remove the current filter. + * Ditto for thread below. */ do_zoom_dso(browser, actions); } else if (top == &browser->hists->thread_filter) { - actions->thread = thread; do_zoom_thread(browser, actions); } else if (top == &browser->hists->socket_filter) { do_zoom_socket(browser, actions); diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c index e9f97c0c335827e773f1ed4a56cc7f6eb6938c02..4db9a098f592620974a68eb881862001970b5bcc 100644 --- a/tools/perf/util/intel-pt.c +++ b/tools/perf/util/intel-pt.c @@ -127,7 +127,6 @@ struct intel_pt { bool single_pebs; bool sample_pebs; - int pebs_data_src_fmt; struct evsel *pebs_evsel; u64 evt_sample_type; @@ -176,7 +175,6 @@ enum switch_state { struct intel_pt_pebs_event { struct evsel *evsel; u64 id; - int data_src_fmt; }; struct intel_pt_queue { @@ -2234,146 +2232,7 @@ static void intel_pt_add_lbrs(struct branch_stack *br_stack, } } -#define P(a, b) PERF_MEM_S(a, b) -#define OP_LH (P(OP, LOAD) | P(LVL, HIT)) -#define LEVEL(x) P(LVLNUM, x) -#define REM P(REMOTE, REMOTE) -#define SNOOP_NONE_MISS (P(SNOOP, NONE) | P(SNOOP, MISS)) - -#define PERF_PEBS_DATA_SOURCE_GRT_MAX 0x10 -#define PERF_PEBS_DATA_SOURCE_GRT_MASK (PERF_PEBS_DATA_SOURCE_GRT_MAX - 1) - -/* Based on kernel __intel_pmu_pebs_data_source_grt() and pebs_data_source */ -static const u64 pebs_data_source_grt[PERF_PEBS_DATA_SOURCE_GRT_MAX] = { - P(OP, LOAD) | P(LVL, MISS) | LEVEL(L3) | P(SNOOP, NA), /* L3 miss|SNP N/A */ - OP_LH | P(LVL, L1) | LEVEL(L1) | P(SNOOP, NONE), /* L1 hit|SNP None */ - OP_LH | P(LVL, LFB) | LEVEL(LFB) | P(SNOOP, NONE), /* LFB/MAB hit|SNP None */ - OP_LH | P(LVL, L2) | LEVEL(L2) | P(SNOOP, NONE), /* L2 hit|SNP None */ - OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, NONE), /* L3 hit|SNP None */ - OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HIT), /* L3 hit|SNP Hit */ - OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HITM), /* L3 hit|SNP HitM */ - OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HITM), /* L3 hit|SNP HitM */ - OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOPX, FWD), /* L3 hit|SNP Fwd */ - OP_LH | P(LVL, REM_CCE1) | REM | LEVEL(L3) | P(SNOOP, HITM), /* Remote L3 hit|SNP HitM */ - OP_LH | P(LVL, LOC_RAM) | LEVEL(RAM) | P(SNOOP, HIT), /* RAM hit|SNP Hit */ - OP_LH | P(LVL, REM_RAM1) | REM | LEVEL(L3) | P(SNOOP, HIT), /* Remote L3 hit|SNP Hit */ - OP_LH | P(LVL, LOC_RAM) | LEVEL(RAM) | SNOOP_NONE_MISS, /* RAM hit|SNP None or Miss */ - OP_LH | P(LVL, REM_RAM1) | LEVEL(RAM) | REM | SNOOP_NONE_MISS, /* Remote RAM hit|SNP None or Miss */ - OP_LH | P(LVL, IO) | LEVEL(NA) | P(SNOOP, NONE), /* I/O hit|SNP None */ - OP_LH | P(LVL, UNC) | LEVEL(NA) | P(SNOOP, NONE), /* Uncached hit|SNP None */ -}; - -/* Based on kernel __intel_pmu_pebs_data_source_cmt() and pebs_data_source */ -static const u64 pebs_data_source_cmt[PERF_PEBS_DATA_SOURCE_GRT_MAX] = { - P(OP, LOAD) | P(LVL, MISS) | LEVEL(L3) | P(SNOOP, NA), /* L3 miss|SNP N/A */ - OP_LH | P(LVL, L1) | LEVEL(L1) | P(SNOOP, NONE), /* L1 hit|SNP None */ - OP_LH | P(LVL, LFB) | LEVEL(LFB) | P(SNOOP, NONE), /* LFB/MAB hit|SNP None */ - OP_LH | P(LVL, L2) | LEVEL(L2) | P(SNOOP, NONE), /* L2 hit|SNP None */ - OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, NONE), /* L3 hit|SNP None */ - OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, MISS), /* L3 hit|SNP Hit */ - OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HIT), /* L3 hit|SNP HitM */ - OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOPX, FWD), /* L3 hit|SNP HitM */ - OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HITM), /* L3 hit|SNP Fwd */ - OP_LH | P(LVL, REM_CCE1) | REM | LEVEL(L3) | P(SNOOP, HITM), /* Remote L3 hit|SNP HitM */ - OP_LH | P(LVL, LOC_RAM) | LEVEL(RAM) | P(SNOOP, NONE), /* RAM hit|SNP Hit */ - OP_LH | LEVEL(RAM) | REM | P(SNOOP, NONE), /* Remote L3 hit|SNP Hit */ - OP_LH | LEVEL(RAM) | REM | P(SNOOPX, FWD), /* RAM hit|SNP None or Miss */ - OP_LH | LEVEL(RAM) | REM | P(SNOOP, HITM), /* Remote RAM hit|SNP None or Miss */ - OP_LH | P(LVL, IO) | LEVEL(NA) | P(SNOOP, NONE), /* I/O hit|SNP None */ - OP_LH | P(LVL, UNC) | LEVEL(NA) | P(SNOOP, NONE), /* Uncached hit|SNP None */ -}; - -/* Based on kernel pebs_set_tlb_lock() */ -static inline void pebs_set_tlb_lock(u64 *val, bool tlb, bool lock) -{ - /* - * TLB access - * 0 = did not miss 2nd level TLB - * 1 = missed 2nd level TLB - */ - if (tlb) - *val |= P(TLB, MISS) | P(TLB, L2); - else - *val |= P(TLB, HIT) | P(TLB, L1) | P(TLB, L2); - - /* locked prefix */ - if (lock) - *val |= P(LOCK, LOCKED); -} - -/* Based on kernel __grt_latency_data() */ -static u64 intel_pt_grt_latency_data(u8 dse, bool tlb, bool lock, bool blk, - const u64 *pebs_data_source) -{ - u64 val; - - dse &= PERF_PEBS_DATA_SOURCE_GRT_MASK; - val = pebs_data_source[dse]; - - pebs_set_tlb_lock(&val, tlb, lock); - - if (blk) - val |= P(BLK, DATA); - else - val |= P(BLK, NA); - - return val; -} - -/* Default value for data source */ -#define PERF_MEM_NA (PERF_MEM_S(OP, NA) |\ - PERF_MEM_S(LVL, NA) |\ - PERF_MEM_S(SNOOP, NA) |\ - PERF_MEM_S(LOCK, NA) |\ - PERF_MEM_S(TLB, NA) |\ - PERF_MEM_S(LVLNUM, NA)) - -enum DATA_SRC_FORMAT { - DATA_SRC_FORMAT_ERR = -1, - DATA_SRC_FORMAT_NA = 0, - DATA_SRC_FORMAT_GRT = 1, - DATA_SRC_FORMAT_CMT = 2, -}; - -/* Based on kernel grt_latency_data() and cmt_latency_data */ -static u64 intel_pt_get_data_src(u64 mem_aux_info, int data_src_fmt) -{ - switch (data_src_fmt) { - case DATA_SRC_FORMAT_GRT: { - union { - u64 val; - struct { - unsigned int dse:4; - unsigned int locked:1; - unsigned int stlb_miss:1; - unsigned int fwd_blk:1; - unsigned int reserved:25; - }; - } x = {.val = mem_aux_info}; - return intel_pt_grt_latency_data(x.dse, x.stlb_miss, x.locked, x.fwd_blk, - pebs_data_source_grt); - } - case DATA_SRC_FORMAT_CMT: { - union { - u64 val; - struct { - unsigned int dse:5; - unsigned int locked:1; - unsigned int stlb_miss:1; - unsigned int fwd_blk:1; - unsigned int reserved:24; - }; - } x = {.val = mem_aux_info}; - return intel_pt_grt_latency_data(x.dse, x.stlb_miss, x.locked, x.fwd_blk, - pebs_data_source_cmt); - } - default: - return PERF_MEM_NA; - } -} - -static int intel_pt_do_synth_pebs_sample(struct intel_pt_queue *ptq, struct evsel *evsel, - u64 id, int data_src_fmt) +static int intel_pt_do_synth_pebs_sample(struct intel_pt_queue *ptq, struct evsel *evsel, u64 id) { const struct intel_pt_blk_items *items = &ptq->state->items; struct perf_sample sample = { .ip = 0, }; @@ -2491,18 +2350,6 @@ static int intel_pt_do_synth_pebs_sample(struct intel_pt_queue *ptq, struct evse } } - if (sample_type & PERF_SAMPLE_DATA_SRC) { - if (items->has_mem_aux_info && data_src_fmt) { - if (data_src_fmt < 0) { - pr_err("Intel PT missing data_src info\n"); - return -1; - } - sample.data_src = intel_pt_get_data_src(items->mem_aux_info, data_src_fmt); - } else { - sample.data_src = PERF_MEM_NA; - } - } - if (sample_type & PERF_SAMPLE_TRANSACTION && items->has_tsx_aux_info) { u64 ax = items->has_rax ? items->rax : 0; /* Refer kernel's intel_hsw_transaction() */ @@ -2521,10 +2368,9 @@ static int intel_pt_synth_single_pebs_sample(struct intel_pt_queue *ptq) { struct intel_pt *pt = ptq->pt; struct evsel *evsel = pt->pebs_evsel; - int data_src_fmt = pt->pebs_data_src_fmt; u64 id = evsel->core.id[0]; - return intel_pt_do_synth_pebs_sample(ptq, evsel, id, data_src_fmt); + return intel_pt_do_synth_pebs_sample(ptq, evsel, id); } static int intel_pt_synth_pebs_sample(struct intel_pt_queue *ptq) @@ -2549,7 +2395,7 @@ static int intel_pt_synth_pebs_sample(struct intel_pt_queue *ptq) hw_id); return intel_pt_synth_single_pebs_sample(ptq); } - err = intel_pt_do_synth_pebs_sample(ptq, pe->evsel, pe->id, pe->data_src_fmt); + err = intel_pt_do_synth_pebs_sample(ptq, pe->evsel, pe->id); if (err) return err; } @@ -3509,49 +3355,6 @@ static int intel_pt_process_itrace_start(struct intel_pt *pt, event->itrace_start.tid); } -/* - * Events with data_src are identified by L1_Hit_Indication - * refer https://github.com/intel/perfmon - */ -static int intel_pt_data_src_fmt(struct intel_pt *pt, struct evsel *evsel) -{ - struct perf_env *env = pt->machine->env; - int fmt = DATA_SRC_FORMAT_NA; - - if (!env->cpuid) - return DATA_SRC_FORMAT_ERR; - - /* - * PEBS-via-PT is only supported on E-core non-hybrid. Of those only - * Gracemont and Crestmont have data_src. Check for: - * Alderlake N (Gracemont) - * Sierra Forest (Crestmont) - * Grand Ridge (Crestmont) - */ - - if (!strncmp(env->cpuid, "GenuineIntel,6,190,", 19)) - fmt = DATA_SRC_FORMAT_GRT; - - if (!strncmp(env->cpuid, "GenuineIntel,6,175,", 19) || - !strncmp(env->cpuid, "GenuineIntel,6,182,", 19)) - fmt = DATA_SRC_FORMAT_CMT; - - if (fmt == DATA_SRC_FORMAT_NA) - return fmt; - - /* - * Only data_src events are: - * mem-loads event=0xd0,umask=0x5 - * mem-stores event=0xd0,umask=0x6 - */ - if (evsel->core.attr.type == PERF_TYPE_RAW && - ((evsel->core.attr.config & 0xffff) == 0x5d0 || - (evsel->core.attr.config & 0xffff) == 0x6d0)) - return fmt; - - return DATA_SRC_FORMAT_NA; -} - static int intel_pt_process_aux_output_hw_id(struct intel_pt *pt, union perf_event *event, struct perf_sample *sample) @@ -3572,7 +3375,6 @@ static int intel_pt_process_aux_output_hw_id(struct intel_pt *pt, ptq->pebs[hw_id].evsel = evsel; ptq->pebs[hw_id].id = sample->id; - ptq->pebs[hw_id].data_src_fmt = intel_pt_data_src_fmt(pt, evsel); return 0; } @@ -4144,7 +3946,6 @@ static void intel_pt_setup_pebs_events(struct intel_pt *pt) } pt->single_pebs = true; pt->sample_pebs = true; - pt->pebs_data_src_fmt = intel_pt_data_src_fmt(pt, evsel); pt->pebs_evsel = evsel; } } diff --git a/tools/perf/util/print-events.c b/tools/perf/util/print-events.c index fb11a967c450dc0fb90b3b029981987fe0d3573d..9bee082194d5eae0ca071e2baf6f319ebf8f788f 100644 --- a/tools/perf/util/print-events.c +++ b/tools/perf/util/print-events.c @@ -271,7 +271,6 @@ bool is_event_supported(u8 type, u64 config) ret = evsel__open(evsel, NULL, tmap) >= 0; } - evsel__close(evsel); evsel__delete(evsel); } diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_nf.c b/tools/testing/selftests/bpf/prog_tests/bpf_nf.c index f80660c00a1a751f3b968f2ef2d0ca3b3fd731a3..b30ff6b3b81ae31c4c54968810a55e5a4b1d9424 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_nf.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_nf.c @@ -63,12 +63,6 @@ static void test_bpf_nf_ct(int mode) .repeat = 1, ); - if (SYS_NOFAIL("iptables-legacy --version")) { - fprintf(stdout, "Missing required iptables-legacy tool\n"); - test__skip(); - return; - } - skel = test_bpf_nf__open_and_load(); if (!ASSERT_OK_PTR(skel, "test_bpf_nf__open_and_load")) return; diff --git a/tools/testing/selftests/bpf/prog_tests/dummy_st_ops.c b/tools/testing/selftests/bpf/prog_tests/dummy_st_ops.c index dd926c00f41469d9ddf818c1c379eb9e4820ebbe..d3d94596ab79cf0f4b1d78a60a03b69231da17f4 100644 --- a/tools/testing/selftests/bpf/prog_tests/dummy_st_ops.c +++ b/tools/testing/selftests/bpf/prog_tests/dummy_st_ops.c @@ -147,6 +147,31 @@ static void test_dummy_sleepable(void) dummy_st_ops_success__destroy(skel); } +/* dummy_st_ops.test_sleepable() parameter is not marked as nullable, + * thus bpf_prog_test_run_opts() below should be rejected as it tries + * to pass NULL for this parameter. + */ +static void test_dummy_sleepable_reject_null(void) +{ + __u64 args[1] = {0}; + LIBBPF_OPTS(bpf_test_run_opts, attr, + .ctx_in = args, + .ctx_size_in = sizeof(args), + ); + struct dummy_st_ops_success *skel; + int fd, err; + + skel = dummy_st_ops_success__open_and_load(); + if (!ASSERT_OK_PTR(skel, "dummy_st_ops_load")) + return; + + fd = bpf_program__fd(skel->progs.test_sleepable); + err = bpf_prog_test_run_opts(fd, &attr); + ASSERT_EQ(err, -EINVAL, "test_run"); + + dummy_st_ops_success__destroy(skel); +} + void test_dummy_st_ops(void) { if (test__start_subtest("dummy_st_ops_attach")) @@ -159,6 +184,8 @@ void test_dummy_st_ops(void) test_dummy_multiple_args(); if (test__start_subtest("dummy_sleepable")) test_dummy_sleepable(); + if (test__start_subtest("dummy_sleepable_reject_null")) + test_dummy_sleepable_reject_null(); RUN_TESTS(dummy_st_ops_fail); } diff --git a/tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c b/tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c index a84c41862ff8c99b147075f0d9101974c272bc8f..2c57ceede095eb7b6e124a30dad0412eb886a807 100644 --- a/tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c +++ b/tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c @@ -12,6 +12,7 @@ #include #include #include +#include "network_helpers.h" #define STACK_SIZE (1024 * 1024) static char child_stack[STACK_SIZE]; @@ -74,6 +75,50 @@ static int test_current_pid_tgid_tp(void *args) return ret; } +static int test_current_pid_tgid_cgrp(void *args) +{ + struct test_ns_current_pid_tgid__bss *bss; + struct test_ns_current_pid_tgid *skel; + int server_fd = -1, ret = -1, err; + int cgroup_fd = *(int *)args; + pid_t tgid, pid; + + skel = test_ns_current_pid_tgid__open(); + if (!ASSERT_OK_PTR(skel, "test_ns_current_pid_tgid__open")) + return ret; + + bpf_program__set_autoload(skel->progs.cgroup_bind4, true); + + err = test_ns_current_pid_tgid__load(skel); + if (!ASSERT_OK(err, "test_ns_current_pid_tgid__load")) + goto cleanup; + + bss = skel->bss; + if (get_pid_tgid(&pid, &tgid, bss)) + goto cleanup; + + skel->links.cgroup_bind4 = bpf_program__attach_cgroup( + skel->progs.cgroup_bind4, cgroup_fd); + if (!ASSERT_OK_PTR(skel->links.cgroup_bind4, "bpf_program__attach_cgroup")) + goto cleanup; + + server_fd = start_server(AF_INET, SOCK_STREAM, NULL, 0, 0); + if (!ASSERT_GE(server_fd, 0, "start_server")) + goto cleanup; + + if (!ASSERT_EQ(bss->user_pid, pid, "pid")) + goto cleanup; + if (!ASSERT_EQ(bss->user_tgid, tgid, "tgid")) + goto cleanup; + ret = 0; + +cleanup: + if (server_fd >= 0) + close(server_fd); + test_ns_current_pid_tgid__destroy(skel); + return ret; +} + static void test_ns_current_pid_tgid_new_ns(int (*fn)(void *), void *arg) { int wstatus; @@ -95,6 +140,25 @@ static void test_ns_current_pid_tgid_new_ns(int (*fn)(void *), void *arg) return; } +static void test_in_netns(int (*fn)(void *), void *arg) +{ + struct nstoken *nstoken = NULL; + + SYS(cleanup, "ip netns add ns_current_pid_tgid"); + SYS(cleanup, "ip -net ns_current_pid_tgid link set dev lo up"); + + nstoken = open_netns("ns_current_pid_tgid"); + if (!ASSERT_OK_PTR(nstoken, "open_netns")) + goto cleanup; + + test_ns_current_pid_tgid_new_ns(fn, arg); + +cleanup: + if (nstoken) + close_netns(nstoken); + SYS_NOFAIL("ip netns del ns_current_pid_tgid"); +} + /* TODO: use a different tracepoint */ void serial_test_ns_current_pid_tgid(void) { @@ -102,4 +166,13 @@ void serial_test_ns_current_pid_tgid(void) test_current_pid_tgid_tp(NULL); if (test__start_subtest("new_ns_tp")) test_ns_current_pid_tgid_new_ns(test_current_pid_tgid_tp, NULL); + if (test__start_subtest("new_ns_cgrp")) { + int cgroup_fd = -1; + + cgroup_fd = test__join_cgroup("/sock_addr"); + if (ASSERT_GE(cgroup_fd, 0, "join_cgroup")) { + test_in_netns(test_current_pid_tgid_cgrp, &cgroup_fd); + close(cgroup_fd); + } + } } diff --git a/tools/testing/selftests/bpf/progs/dummy_st_ops_success.c b/tools/testing/selftests/bpf/progs/dummy_st_ops_success.c index 151e3a3ea27fb8efe5a2a6dca98aab011b632bd3..ec0c595d47af8439ba15636c3000236ca4b678e9 100644 --- a/tools/testing/selftests/bpf/progs/dummy_st_ops_success.c +++ b/tools/testing/selftests/bpf/progs/dummy_st_ops_success.c @@ -11,8 +11,17 @@ int BPF_PROG(test_1, struct bpf_dummy_ops_state *state) { int ret; - if (!state) - return 0xf2f3f4f5; + /* Check that 'state' nullable status is detected correctly. + * If 'state' argument would be assumed non-null by verifier + * the code below would be deleted as dead (which it shouldn't). + * Hide it from the compiler behind 'asm' block to avoid + * unnecessary optimizations. + */ + asm volatile ( + "if %[state] != 0 goto +2;" + "r0 = 0xf2f3f4f5;" + "exit;" + ::[state]"p"(state)); ret = state->val; state->val = 0x5a; diff --git a/tools/testing/selftests/bpf/progs/test_global_map_resize.c b/tools/testing/selftests/bpf/progs/test_global_map_resize.c index 9be0e32cfeeea4864d02b3978e10130f8f8261f2..1fbb73d3e5d5a0139d5653ae6b5e2fbcfd87f2e1 100644 --- a/tools/testing/selftests/bpf/progs/test_global_map_resize.c +++ b/tools/testing/selftests/bpf/progs/test_global_map_resize.c @@ -31,16 +31,6 @@ int my_int_last SEC(".data.array_not_last"); int percpu_arr[1] SEC(".data.percpu_arr"); -/* at least one extern is included, to ensure that a specific - * regression is tested whereby resizing resulted in a free-after-use - * bug after type information is invalidated by the resize operation. - * - * There isn't a particularly good API to test for this specific condition, - * but by having externs for the resizing tests it will cover this path. - */ -extern int LINUX_KERNEL_VERSION __kconfig; -long version_sink; - SEC("tp/syscalls/sys_enter_getpid") int bss_array_sum(void *ctx) { @@ -53,9 +43,6 @@ int bss_array_sum(void *ctx) for (size_t i = 0; i < bss_array_len; ++i) sum += array[i]; - /* see above; ensure this is not optimized out */ - version_sink = LINUX_KERNEL_VERSION; - return 0; } @@ -71,8 +58,5 @@ int data_array_sum(void *ctx) for (size_t i = 0; i < data_array_len; ++i) sum += my_array[i]; - /* see above; ensure this is not optimized out */ - version_sink = LINUX_KERNEL_VERSION; - return 0; } diff --git a/tools/testing/selftests/bpf/progs/test_ns_current_pid_tgid.c b/tools/testing/selftests/bpf/progs/test_ns_current_pid_tgid.c index aa3ec7ca16d9b638a9132855bca1a58852f78bb4..d0010e698f66881e85904d0fe0a357b5fd5c0f8d 100644 --- a/tools/testing/selftests/bpf/progs/test_ns_current_pid_tgid.c +++ b/tools/testing/selftests/bpf/progs/test_ns_current_pid_tgid.c @@ -28,4 +28,11 @@ int tp_handler(const void *ctx) return 0; } +SEC("?cgroup/bind4") +int cgroup_bind4(struct bpf_sock_addr *ctx) +{ + get_pid_tgid(); + return 1; +} + char _license[] SEC("license") = "GPL"; diff --git a/tools/testing/selftests/bpf/test_lru_map.c b/tools/testing/selftests/bpf/test_lru_map.c index 0921939532c6c2105f0d5197a7b39bf6af910287..fda7589c50236c4164b3078ef0139c97495475bf 100644 --- a/tools/testing/selftests/bpf/test_lru_map.c +++ b/tools/testing/selftests/bpf/test_lru_map.c @@ -138,18 +138,6 @@ static int sched_next_online(int pid, int *next_to_try) return ret; } -/* Derive target_free from map_size, same as bpf_common_lru_populate */ -static unsigned int __tgt_size(unsigned int map_size) -{ - return (map_size / nr_cpus) / 2; -} - -/* Inverse of how bpf_common_lru_populate derives target_free from map_size. */ -static unsigned int __map_size(unsigned int tgt_free) -{ - return tgt_free * nr_cpus * 2; -} - /* Size of the LRU map is 2 * Add key=1 (+1 key) * Add key=2 (+1 key) @@ -243,11 +231,11 @@ static void test_lru_sanity0(int map_type, int map_flags) printf("Pass\n"); } -/* Verify that unreferenced elements are recycled before referenced ones. - * Insert elements. - * Reference a subset of these. - * Insert more, enough to trigger recycling. - * Verify that unreferenced are recycled. +/* Size of the LRU map is 1.5*tgt_free + * Insert 1 to tgt_free (+tgt_free keys) + * Lookup 1 to tgt_free/2 + * Insert 1+tgt_free to 2*tgt_free (+tgt_free keys) + * => 1+tgt_free/2 to LOCALFREE_TARGET will be removed by LRU */ static void test_lru_sanity1(int map_type, int map_flags, unsigned int tgt_free) { @@ -269,7 +257,7 @@ static void test_lru_sanity1(int map_type, int map_flags, unsigned int tgt_free) batch_size = tgt_free / 2; assert(batch_size * 2 == tgt_free); - map_size = __map_size(tgt_free) + batch_size; + map_size = tgt_free + batch_size; lru_map_fd = create_map(map_type, map_flags, map_size); assert(lru_map_fd != -1); @@ -278,13 +266,13 @@ static void test_lru_sanity1(int map_type, int map_flags, unsigned int tgt_free) value[0] = 1234; - /* Insert map_size - batch_size keys */ - end_key = 1 + __map_size(tgt_free); + /* Insert 1 to tgt_free (+tgt_free keys) */ + end_key = 1 + tgt_free; for (key = 1; key < end_key; key++) assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST)); - /* Lookup 1 to batch_size */ + /* Lookup 1 to tgt_free/2 */ end_key = 1 + batch_size; for (key = 1; key < end_key; key++) { assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value)); @@ -292,13 +280,12 @@ static void test_lru_sanity1(int map_type, int map_flags, unsigned int tgt_free) BPF_NOEXIST)); } - /* Insert another map_size - batch_size keys - * Map will contain 1 to batch_size plus these latest, i.e., - * => previous 1+batch_size to map_size - batch_size will have been + /* Insert 1+tgt_free to 2*tgt_free + * => 1+tgt_free/2 to LOCALFREE_TARGET will be * removed by LRU */ - key = 1 + __map_size(tgt_free); - end_key = key + __map_size(tgt_free); + key = 1 + tgt_free; + end_key = key + tgt_free; for (; key < end_key; key++) { assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST)); @@ -314,8 +301,17 @@ static void test_lru_sanity1(int map_type, int map_flags, unsigned int tgt_free) printf("Pass\n"); } -/* Verify that insertions exceeding map size will recycle the oldest. - * Verify that unreferenced elements are recycled before referenced. +/* Size of the LRU map 1.5 * tgt_free + * Insert 1 to tgt_free (+tgt_free keys) + * Update 1 to tgt_free/2 + * => The original 1 to tgt_free/2 will be removed due to + * the LRU shrink process + * Re-insert 1 to tgt_free/2 again and do a lookup immeidately + * Insert 1+tgt_free to tgt_free*3/2 + * Insert 1+tgt_free*3/2 to tgt_free*5/2 + * => Key 1+tgt_free to tgt_free*3/2 + * will be removed from LRU because it has never + * been lookup and ref bit is not set */ static void test_lru_sanity2(int map_type, int map_flags, unsigned int tgt_free) { @@ -338,7 +334,7 @@ static void test_lru_sanity2(int map_type, int map_flags, unsigned int tgt_free) batch_size = tgt_free / 2; assert(batch_size * 2 == tgt_free); - map_size = __map_size(tgt_free) + batch_size; + map_size = tgt_free + batch_size; lru_map_fd = create_map(map_type, map_flags, map_size); assert(lru_map_fd != -1); @@ -347,8 +343,8 @@ static void test_lru_sanity2(int map_type, int map_flags, unsigned int tgt_free) value[0] = 1234; - /* Insert map_size - batch_size keys */ - end_key = 1 + __map_size(tgt_free); + /* Insert 1 to tgt_free (+tgt_free keys) */ + end_key = 1 + tgt_free; for (key = 1; key < end_key; key++) assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST)); @@ -361,7 +357,8 @@ static void test_lru_sanity2(int map_type, int map_flags, unsigned int tgt_free) * shrink the inactive list to get tgt_free * number of free nodes. * - * Hence, the oldest key is removed from the LRU list. + * Hence, the oldest key 1 to tgt_free/2 + * are removed from the LRU list. */ key = 1; if (map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH) { @@ -373,7 +370,8 @@ static void test_lru_sanity2(int map_type, int map_flags, unsigned int tgt_free) BPF_EXIST)); } - /* Re-insert 1 to batch_size again and do a lookup immediately. + /* Re-insert 1 to tgt_free/2 again and do a lookup + * immeidately. */ end_key = 1 + batch_size; value[0] = 4321; @@ -389,18 +387,17 @@ static void test_lru_sanity2(int map_type, int map_flags, unsigned int tgt_free) value[0] = 1234; - /* Insert batch_size new elements */ - key = 1 + __map_size(tgt_free); - end_key = key + batch_size; - for (; key < end_key; key++) + /* Insert 1+tgt_free to tgt_free*3/2 */ + end_key = 1 + tgt_free + batch_size; + for (key = 1 + tgt_free; key < end_key; key++) /* These newly added but not referenced keys will be * gone during the next LRU shrink. */ assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST)); - /* Insert map_size - batch_size elements */ - end_key += __map_size(tgt_free); + /* Insert 1+tgt_free*3/2 to tgt_free*5/2 */ + end_key = key + tgt_free; for (; key < end_key; key++) { assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST)); @@ -416,12 +413,12 @@ static void test_lru_sanity2(int map_type, int map_flags, unsigned int tgt_free) printf("Pass\n"); } -/* Test the active/inactive list rotation - * - * Fill the whole map, deplete the free list. - * Reference all except the last lru->target_free elements. - * Insert lru->target_free new elements. This triggers one shrink. - * Verify that the non-referenced elements are replaced. +/* Size of the LRU map is 2*tgt_free + * It is to test the active/inactive list rotation + * Insert 1 to 2*tgt_free (+2*tgt_free keys) + * Lookup key 1 to tgt_free*3/2 + * Add 1+2*tgt_free to tgt_free*5/2 (+tgt_free/2 keys) + * => key 1+tgt_free*3/2 to 2*tgt_free are removed from LRU */ static void test_lru_sanity3(int map_type, int map_flags, unsigned int tgt_free) { @@ -440,7 +437,8 @@ static void test_lru_sanity3(int map_type, int map_flags, unsigned int tgt_free) assert(sched_next_online(0, &next_cpu) != -1); - batch_size = __tgt_size(tgt_free); + batch_size = tgt_free / 2; + assert(batch_size * 2 == tgt_free); map_size = tgt_free * 2; lru_map_fd = create_map(map_type, map_flags, map_size); @@ -451,21 +449,23 @@ static void test_lru_sanity3(int map_type, int map_flags, unsigned int tgt_free) value[0] = 1234; - /* Fill the map */ - end_key = 1 + map_size; + /* Insert 1 to 2*tgt_free (+2*tgt_free keys) */ + end_key = 1 + (2 * tgt_free); for (key = 1; key < end_key; key++) assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST)); - /* Reference all but the last batch_size */ - end_key = 1 + map_size - batch_size; + /* Lookup key 1 to tgt_free*3/2 */ + end_key = tgt_free + batch_size; for (key = 1; key < end_key; key++) { assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value)); assert(!bpf_map_update_elem(expected_map_fd, &key, value, BPF_NOEXIST)); } - /* Insert new batch_size: replaces the non-referenced elements */ + /* Add 1+2*tgt_free to tgt_free*5/2 + * (+tgt_free/2 keys) + */ key = 2 * tgt_free + 1; end_key = key + batch_size; for (; key < end_key; key++) { @@ -500,8 +500,7 @@ static void test_lru_sanity4(int map_type, int map_flags, unsigned int tgt_free) lru_map_fd = create_map(map_type, map_flags, 3 * tgt_free * nr_cpus); else - lru_map_fd = create_map(map_type, map_flags, - 3 * __map_size(tgt_free)); + lru_map_fd = create_map(map_type, map_flags, 3 * tgt_free); assert(lru_map_fd != -1); expected_map_fd = create_map(BPF_MAP_TYPE_HASH, 0, diff --git a/tools/testing/selftests/net/forwarding/bridge_mdb.sh b/tools/testing/selftests/net/forwarding/bridge_mdb.sh index c151374ddf04022963170433b63ae2e6ffc05eb1..a3678dfe5848a25505f6ab117b3b8bde37fabcab 100755 --- a/tools/testing/selftests/net/forwarding/bridge_mdb.sh +++ b/tools/testing/selftests/net/forwarding/bridge_mdb.sh @@ -149,7 +149,7 @@ cfg_test_host_common() check_err $? "Failed to add $name host entry" bridge mdb replace dev br0 port br0 grp $grp $state vid 10 &> /dev/null - check_err $? "Failed to replace $name host entry" + check_fail $? "Managed to replace $name host entry" bridge mdb del dev br0 port br0 grp $grp $state vid 10 bridge mdb get dev br0 grp $grp vid 10 &> /dev/null diff --git a/tools/testing/selftests/net/mptcp/Makefile b/tools/testing/selftests/net/mptcp/Makefile index 3c2fb9efb0b140f29cb4ee187e029d16ab60efcf..7b936a92685949199fae2a31451a5f74c288b627 100644 --- a/tools/testing/selftests/net/mptcp/Makefile +++ b/tools/testing/selftests/net/mptcp/Makefile @@ -4,8 +4,7 @@ top_srcdir = ../../../../.. CFLAGS = -Wall -Wl,--no-as-needed -O2 -g -I$(top_srcdir)/usr/include $(KHDR_INCLUDES) -TEST_PROGS := mptcp_connect.sh mptcp_connect_mmap.sh mptcp_connect_sendfile.sh \ - mptcp_connect_checksum.sh pm_netlink.sh mptcp_join.sh diag.sh \ +TEST_PROGS := mptcp_connect.sh pm_netlink.sh mptcp_join.sh diag.sh \ simult_flows.sh mptcp_sockopt.sh userspace_pm.sh TEST_GEN_FILES = mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_inq diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect_checksum.sh b/tools/testing/selftests/net/mptcp/mptcp_connect_checksum.sh deleted file mode 100644 index ce93ec2f107fba2a699387188932a2680bc9ded7..0000000000000000000000000000000000000000 --- a/tools/testing/selftests/net/mptcp/mptcp_connect_checksum.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -# SPDX-License-Identifier: GPL-2.0 - -MPTCP_LIB_KSFT_TEST="$(basename "${0}" .sh)" \ - "$(dirname "${0}")/mptcp_connect.sh" -C "${@}" diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect_mmap.sh b/tools/testing/selftests/net/mptcp/mptcp_connect_mmap.sh deleted file mode 100644 index 5dd30f9394af6a88b14936a64c50ac9566be2e6e..0000000000000000000000000000000000000000 --- a/tools/testing/selftests/net/mptcp/mptcp_connect_mmap.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -# SPDX-License-Identifier: GPL-2.0 - -MPTCP_LIB_KSFT_TEST="$(basename "${0}" .sh)" \ - "$(dirname "${0}")/mptcp_connect.sh" -m mmap "${@}" diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect_sendfile.sh b/tools/testing/selftests/net/mptcp/mptcp_connect_sendfile.sh deleted file mode 100644 index 1d16fb1cc9bb6d1f88a9fdc11206237ca2b790bb..0000000000000000000000000000000000000000 --- a/tools/testing/selftests/net/mptcp/mptcp_connect_sendfile.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -# SPDX-License-Identifier: GPL-2.0 - -MPTCP_LIB_KSFT_TEST="$(basename "${0}" .sh)" \ - "$(dirname "${0}")/mptcp_connect.sh" -m sendfile "${@}" diff --git a/tools/testing/selftests/net/udpgro.sh b/tools/testing/selftests/net/udpgro.sh index b65cf09f9914e91392a53403ae614c64acbc32e4..53341c8135e8895e5de7d5a2b9b091c6862d8023 100755 --- a/tools/testing/selftests/net/udpgro.sh +++ b/tools/testing/selftests/net/udpgro.sh @@ -50,7 +50,7 @@ run_one() { cfg_veth - ip netns exec "${PEER_NS}" ./udpgso_bench_rx -C 1000 -R 100 ${rx_args} & + ip netns exec "${PEER_NS}" ./udpgso_bench_rx -C 1000 -R 10 ${rx_args} & local PID1=$! wait_local_port_listen ${PEER_NS} 8000 udp @@ -97,7 +97,7 @@ run_one_nat() { # will land on the 'plain' one ip netns exec "${PEER_NS}" ./udpgso_bench_rx -G ${family} -b ${addr1} -n 0 & local PID1=$! - ip netns exec "${PEER_NS}" ./udpgso_bench_rx -C 1000 -R 100 ${family} -b ${addr2%/*} ${rx_args} & + ip netns exec "${PEER_NS}" ./udpgso_bench_rx -C 1000 -R 10 ${family} -b ${addr2%/*} ${rx_args} & local PID2=$! wait_local_port_listen "${PEER_NS}" 8000 udp @@ -119,9 +119,9 @@ run_one_2sock() { cfg_veth - ip netns exec "${PEER_NS}" ./udpgso_bench_rx -C 1000 -R 100 ${rx_args} -p 12345 & + ip netns exec "${PEER_NS}" ./udpgso_bench_rx -C 1000 -R 10 ${rx_args} -p 12345 & local PID1=$! - ip netns exec "${PEER_NS}" ./udpgso_bench_rx -C 2000 -R 100 ${rx_args} & + ip netns exec "${PEER_NS}" ./udpgso_bench_rx -C 2000 -R 10 ${rx_args} & local PID2=$! wait_local_port_listen "${PEER_NS}" 12345 udp diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c index 15325ca35f1e2b26d1b1bd0cfca3661532f2d0be..cacf6507f6905519e88a262e8398323c53b2c34b 100644 --- a/tools/testing/selftests/seccomp/seccomp_bpf.c +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c @@ -3154,15 +3154,12 @@ TEST(syscall_restart) ret = get_syscall(_metadata, child_pid); #if defined(__arm__) /* + * FIXME: * - native ARM registers do NOT expose true syscall. * - compat ARM registers on ARM64 DO expose true syscall. - * - values of utsbuf.machine include 'armv8l' or 'armb8b' - * for ARM64 running in compat mode. */ ASSERT_EQ(0, uname(&utsbuf)); - if ((strncmp(utsbuf.machine, "arm", 3) == 0) && - (strncmp(utsbuf.machine, "armv8l", 6) != 0) && - (strncmp(utsbuf.machine, "armv8b", 6) != 0)) { + if (strncmp(utsbuf.machine, "arm", 3) == 0) { EXPECT_EQ(__NR_nanosleep, ret); } else #endif diff --git a/tools/testing/selftests/x86/Makefile b/tools/testing/selftests/x86/Makefile index 13ce9a53d5dec534431607bc5d6df1337ee8aa10..7e8c937627dd946d0a41af2dba9125e5694074e2 100644 --- a/tools/testing/selftests/x86/Makefile +++ b/tools/testing/selftests/x86/Makefile @@ -12,7 +12,7 @@ CAN_BUILD_WITH_NOPIE := $(shell ./check_cc.sh "$(CC)" trivial_program.c -no-pie) TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs syscall_nt test_mremap_vdso \ check_initial_reg_state sigreturn iopl ioperm \ - test_vsyscall mov_ss_trap sigtrap_loop \ + test_vsyscall mov_ss_trap \ syscall_arg_fault fsgsbase_restore sigaltstack TARGETS_C_32BIT_ONLY := entry_from_vm86 test_syscall_vdso unwind_vdso \ test_FCMOV test_FCOMI test_FISTTP \ diff --git a/tools/testing/selftests/x86/sigtrap_loop.c b/tools/testing/selftests/x86/sigtrap_loop.c deleted file mode 100644 index 9d065479e89f94f745a7835381c44ab1968eed1d..0000000000000000000000000000000000000000 --- a/tools/testing/selftests/x86/sigtrap_loop.c +++ /dev/null @@ -1,101 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (C) 2025 Intel Corporation - */ -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include - -#ifdef __x86_64__ -# define REG_IP REG_RIP -#else -# define REG_IP REG_EIP -#endif - -static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *), int flags) -{ - struct sigaction sa; - - memset(&sa, 0, sizeof(sa)); - sa.sa_sigaction = handler; - sa.sa_flags = SA_SIGINFO | flags; - sigemptyset(&sa.sa_mask); - - if (sigaction(sig, &sa, 0)) - err(1, "sigaction"); - - return; -} - -static void sigtrap(int sig, siginfo_t *info, void *ctx_void) -{ - ucontext_t *ctx = (ucontext_t *)ctx_void; - static unsigned int loop_count_on_same_ip; - static unsigned long last_trap_ip; - - if (last_trap_ip == ctx->uc_mcontext.gregs[REG_IP]) { - printf("\tTrapped at %016lx\n", last_trap_ip); - - /* - * If the same IP is hit more than 10 times in a row, it is - * _considered_ an infinite loop. - */ - if (++loop_count_on_same_ip > 10) { - printf("[FAIL]\tDetected SIGTRAP infinite loop\n"); - exit(1); - } - - return; - } - - loop_count_on_same_ip = 0; - last_trap_ip = ctx->uc_mcontext.gregs[REG_IP]; - printf("\tTrapped at %016lx\n", last_trap_ip); -} - -int main(int argc, char *argv[]) -{ - sethandler(SIGTRAP, sigtrap, 0); - - /* - * Set the Trap Flag (TF) to single-step the test code, therefore to - * trigger a SIGTRAP signal after each instruction until the TF is - * cleared. - * - * Because the arithmetic flags are not significant here, the TF is - * set by pushing 0x302 onto the stack and then popping it into the - * flags register. - * - * Four instructions in the following asm code are executed with the - * TF set, thus the SIGTRAP handler is expected to run four times. - */ - printf("[RUN]\tSIGTRAP infinite loop detection\n"); - asm volatile( -#ifdef __x86_64__ - /* - * Avoid clobbering the redzone - * - * Equivalent to "sub $128, %rsp", however -128 can be encoded - * in a single byte immediate while 128 uses 4 bytes. - */ - "add $-128, %rsp\n\t" -#endif - "push $0x302\n\t" - "popf\n\t" - "nop\n\t" - "nop\n\t" - "push $0x202\n\t" - "popf\n\t" -#ifdef __x86_64__ - "sub $-128, %rsp\n\t" -#endif - ); - - printf("[OK]\tNo SIGTRAP infinite loop detected\n"); - return 0; -}