diff options
author | Jens Axboe <axboe@fb.com> | 2016-09-15 10:38:34 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-09-15 10:38:34 -0400 |
commit | 474b313de79e034e269955de23231da769a521b7 (patch) | |
tree | 877e3c883aff3edfe4f378c69f7ba738b0d8ef94 | |
parent | 2849450ad39d2e699fda2d5c6f41e05d87fd7004 (diff) | |
parent | ee8d41e53efe14bfc5ea5866e1178b06d78a7c95 (diff) |
Merge branch 'irq/for-block' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into for-4.9/msi-irq
532 files changed, 4230 insertions, 2541 deletions
@@ -88,6 +88,7 @@ Kay Sievers <kay.sievers@vrfy.org> | |||
88 | Kenneth W Chen <kenneth.w.chen@intel.com> | 88 | Kenneth W Chen <kenneth.w.chen@intel.com> |
89 | Konstantin Khlebnikov <koct9i@gmail.com> <k.khlebnikov@samsung.com> | 89 | Konstantin Khlebnikov <koct9i@gmail.com> <k.khlebnikov@samsung.com> |
90 | Koushik <raghavendra.koushik@neterion.com> | 90 | Koushik <raghavendra.koushik@neterion.com> |
91 | Krzysztof Kozlowski <krzk@kernel.org> <k.kozlowski@samsung.com> | ||
91 | Krzysztof Kozlowski <krzk@kernel.org> <k.kozlowski.k@gmail.com> | 92 | Krzysztof Kozlowski <krzk@kernel.org> <k.kozlowski.k@gmail.com> |
92 | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 93 | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
93 | Leonid I Ananiev <leonid.i.ananiev@intel.com> | 94 | Leonid I Ananiev <leonid.i.ananiev@intel.com> |
@@ -158,6 +159,8 @@ Valdis Kletnieks <Valdis.Kletnieks@vt.edu> | |||
158 | Viresh Kumar <vireshk@kernel.org> <viresh.kumar@st.com> | 159 | Viresh Kumar <vireshk@kernel.org> <viresh.kumar@st.com> |
159 | Viresh Kumar <vireshk@kernel.org> <viresh.linux@gmail.com> | 160 | Viresh Kumar <vireshk@kernel.org> <viresh.linux@gmail.com> |
160 | Viresh Kumar <vireshk@kernel.org> <viresh.kumar2@arm.com> | 161 | Viresh Kumar <vireshk@kernel.org> <viresh.kumar2@arm.com> |
162 | Vladimir Davydov <vdavydov.dev@gmail.com> <vdavydov@virtuozzo.com> | ||
163 | Vladimir Davydov <vdavydov.dev@gmail.com> <vdavydov@parallels.com> | ||
161 | Takashi YOSHII <takashi.yoshii.zj@renesas.com> | 164 | Takashi YOSHII <takashi.yoshii.zj@renesas.com> |
162 | Yusuke Goda <goda.yusuke@renesas.com> | 165 | Yusuke Goda <goda.yusuke@renesas.com> |
163 | Gustavo Padovan <gustavo@las.ic.unicamp.br> | 166 | Gustavo Padovan <gustavo@las.ic.unicamp.br> |
diff --git a/Documentation/ABI/stable/sysfs-devices b/Documentation/ABI/stable/sysfs-devices index 43f78b88da28..df449d79b563 100644 --- a/Documentation/ABI/stable/sysfs-devices +++ b/Documentation/ABI/stable/sysfs-devices | |||
@@ -1,7 +1,7 @@ | |||
1 | # Note: This documents additional properties of any device beyond what | 1 | # Note: This documents additional properties of any device beyond what |
2 | # is documented in Documentation/sysfs-rules.txt | 2 | # is documented in Documentation/sysfs-rules.txt |
3 | 3 | ||
4 | What: /sys/devices/*/of_path | 4 | What: /sys/devices/*/of_node |
5 | Date: February 2015 | 5 | Date: February 2015 |
6 | Contact: Device Tree mailing list <devicetree@vger.kernel.org> | 6 | Contact: Device Tree mailing list <devicetree@vger.kernel.org> |
7 | Description: | 7 | Description: |
diff --git a/Documentation/PCI/pci.txt b/Documentation/PCI/pci.txt index 123881f62219..77f49dc5be23 100644 --- a/Documentation/PCI/pci.txt +++ b/Documentation/PCI/pci.txt | |||
@@ -124,7 +124,6 @@ initialization with a pointer to a structure describing the driver | |||
124 | 124 | ||
125 | The ID table is an array of struct pci_device_id entries ending with an | 125 | The ID table is an array of struct pci_device_id entries ending with an |
126 | all-zero entry. Definitions with static const are generally preferred. | 126 | all-zero entry. Definitions with static const are generally preferred. |
127 | Use of the deprecated macro DEFINE_PCI_DEVICE_TABLE should be avoided. | ||
128 | 127 | ||
129 | Each entry consists of: | 128 | Each entry consists of: |
130 | 129 | ||
diff --git a/Documentation/arm/CCN.txt b/Documentation/arm/CCN.txt index ffca443a19b4..15cdb7bc57c3 100644 --- a/Documentation/arm/CCN.txt +++ b/Documentation/arm/CCN.txt | |||
@@ -18,13 +18,17 @@ and config2 fields of the perf_event_attr structure. The "events" | |||
18 | directory provides configuration templates for all documented | 18 | directory provides configuration templates for all documented |
19 | events, that can be used with perf tool. For example "xp_valid_flit" | 19 | events, that can be used with perf tool. For example "xp_valid_flit" |
20 | is an equivalent of "type=0x8,event=0x4". Other parameters must be | 20 | is an equivalent of "type=0x8,event=0x4". Other parameters must be |
21 | explicitly specified. For events originating from device, "node" | 21 | explicitly specified. |
22 | defines its index. All crosspoint events require "xp" (index), | ||
23 | "port" (device port number) and "vc" (virtual channel ID) and | ||
24 | "dir" (direction). Watchpoints (special "event" value 0xfe) also | ||
25 | require comparator values ("cmp_l" and "cmp_h") and "mask", being | ||
26 | index of the comparator mask. | ||
27 | 22 | ||
23 | For events originating from device, "node" defines its index. | ||
24 | |||
25 | Crosspoint PMU events require "xp" (index), "bus" (bus number) | ||
26 | and "vc" (virtual channel ID). | ||
27 | |||
28 | Crosspoint watchpoint-based events (special "event" value 0xfe) | ||
29 | require "xp" and "vc" as as above plus "port" (device port index), | ||
30 | "dir" (transmit/receive direction), comparator values ("cmp_l" | ||
31 | and "cmp_h") and "mask", being index of the comparator mask. | ||
28 | Masks are defined separately from the event description | 32 | Masks are defined separately from the event description |
29 | (due to limited number of the config values) in the "cmp_mask" | 33 | (due to limited number of the config values) in the "cmp_mask" |
30 | directory, with first 8 configurable by user and additional | 34 | directory, with first 8 configurable by user and additional |
diff --git a/Documentation/cpu-freq/cpufreq-stats.txt b/Documentation/cpu-freq/cpufreq-stats.txt index fc647492e940..8d9773f23550 100644 --- a/Documentation/cpu-freq/cpufreq-stats.txt +++ b/Documentation/cpu-freq/cpufreq-stats.txt | |||
@@ -103,7 +103,7 @@ Config Main Menu | |||
103 | Power management options (ACPI, APM) ---> | 103 | Power management options (ACPI, APM) ---> |
104 | CPU Frequency scaling ---> | 104 | CPU Frequency scaling ---> |
105 | [*] CPU Frequency scaling | 105 | [*] CPU Frequency scaling |
106 | <*> CPU frequency translation statistics | 106 | [*] CPU frequency translation statistics |
107 | [*] CPU frequency translation statistics details | 107 | [*] CPU frequency translation statistics details |
108 | 108 | ||
109 | 109 | ||
diff --git a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt index bf99e2f24788..205593f56fe7 100644 --- a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt +++ b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt | |||
@@ -16,6 +16,11 @@ Required properties: | |||
16 | - vref-supply: The regulator supply ADC reference voltage. | 16 | - vref-supply: The regulator supply ADC reference voltage. |
17 | - #io-channel-cells: Should be 1, see ../iio-bindings.txt | 17 | - #io-channel-cells: Should be 1, see ../iio-bindings.txt |
18 | 18 | ||
19 | Optional properties: | ||
20 | - resets: Must contain an entry for each entry in reset-names if need support | ||
21 | this option. See ../reset/reset.txt for details. | ||
22 | - reset-names: Must include the name "saradc-apb". | ||
23 | |||
19 | Example: | 24 | Example: |
20 | saradc: saradc@2006c000 { | 25 | saradc: saradc@2006c000 { |
21 | compatible = "rockchip,saradc"; | 26 | compatible = "rockchip,saradc"; |
@@ -23,6 +28,8 @@ Example: | |||
23 | interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; | 28 | interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; |
24 | clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; | 29 | clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; |
25 | clock-names = "saradc", "apb_pclk"; | 30 | clock-names = "saradc", "apb_pclk"; |
31 | resets = <&cru SRST_SARADC>; | ||
32 | reset-names = "saradc-apb"; | ||
26 | #io-channel-cells = <1>; | 33 | #io-channel-cells = <1>; |
27 | vref-supply = <&vcc18>; | 34 | vref-supply = <&vcc18>; |
28 | }; | 35 | }; |
diff --git a/Documentation/devicetree/bindings/serial/8250.txt b/Documentation/devicetree/bindings/serial/8250.txt index f5561ac7e17e..936ab5b87324 100644 --- a/Documentation/devicetree/bindings/serial/8250.txt +++ b/Documentation/devicetree/bindings/serial/8250.txt | |||
@@ -42,9 +42,6 @@ Optional properties: | |||
42 | - auto-flow-control: one way to enable automatic flow control support. The | 42 | - auto-flow-control: one way to enable automatic flow control support. The |
43 | driver is allowed to detect support for the capability even without this | 43 | driver is allowed to detect support for the capability even without this |
44 | property. | 44 | property. |
45 | - {rts,cts,dtr,dsr,rng,dcd}-gpios: specify a GPIO for RTS/CTS/DTR/DSR/RI/DCD | ||
46 | line respectively. It will use specified GPIO instead of the peripheral | ||
47 | function pin for the UART feature. If unsure, don't specify this property. | ||
48 | 45 | ||
49 | Note: | 46 | Note: |
50 | * fsl,ns16550: | 47 | * fsl,ns16550: |
@@ -66,19 +63,3 @@ Example: | |||
66 | interrupts = <10>; | 63 | interrupts = <10>; |
67 | reg-shift = <2>; | 64 | reg-shift = <2>; |
68 | }; | 65 | }; |
69 | |||
70 | Example for OMAP UART using GPIO-based modem control signals: | ||
71 | |||
72 | uart4: serial@49042000 { | ||
73 | compatible = "ti,omap3-uart"; | ||
74 | reg = <0x49042000 0x400>; | ||
75 | interrupts = <80>; | ||
76 | ti,hwmods = "uart4"; | ||
77 | clock-frequency = <48000000>; | ||
78 | cts-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>; | ||
79 | rts-gpios = <&gpio3 6 GPIO_ACTIVE_LOW>; | ||
80 | dtr-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>; | ||
81 | dsr-gpios = <&gpio1 13 GPIO_ACTIVE_LOW>; | ||
82 | dcd-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>; | ||
83 | rng-gpios = <&gpio1 15 GPIO_ACTIVE_LOW>; | ||
84 | }; | ||
diff --git a/Documentation/filesystems/overlayfs.txt b/Documentation/filesystems/overlayfs.txt index d6259c786316..bcbf9710e4af 100644 --- a/Documentation/filesystems/overlayfs.txt +++ b/Documentation/filesystems/overlayfs.txt | |||
@@ -183,12 +183,10 @@ The copy_up operation essentially creates a new, identical file and | |||
183 | moves it over to the old name. The new file may be on a different | 183 | moves it over to the old name. The new file may be on a different |
184 | filesystem, so both st_dev and st_ino of the file may change. | 184 | filesystem, so both st_dev and st_ino of the file may change. |
185 | 185 | ||
186 | Any open files referring to this inode will access the old data and | 186 | Any open files referring to this inode will access the old data. |
187 | metadata. Similarly any file locks obtained before copy_up will not | ||
188 | apply to the copied up file. | ||
189 | 187 | ||
190 | On a file opened with O_RDONLY fchmod(2), fchown(2), futimesat(2) and | 188 | Any file locks (and leases) obtained before copy_up will not apply |
191 | fsetxattr(2) will fail with EROFS. | 189 | to the copied up file. |
192 | 190 | ||
193 | If a file with multiple hard links is copied up, then this will | 191 | If a file with multiple hard links is copied up, then this will |
194 | "break" the link. Changes will not be propagated to other names | 192 | "break" the link. Changes will not be propagated to other names |
diff --git a/Documentation/i2c/slave-interface b/Documentation/i2c/slave-interface index 80807adb8ded..7e2a228f21bc 100644 --- a/Documentation/i2c/slave-interface +++ b/Documentation/i2c/slave-interface | |||
@@ -145,6 +145,11 @@ If you want to add slave support to the bus driver: | |||
145 | 145 | ||
146 | * Catch the slave interrupts and send appropriate i2c_slave_events to the backend. | 146 | * Catch the slave interrupts and send appropriate i2c_slave_events to the backend. |
147 | 147 | ||
148 | Note that most hardware supports being master _and_ slave on the same bus. So, | ||
149 | if you extend a bus driver, please make sure that the driver supports that as | ||
150 | well. In almost all cases, slave support does not need to disable the master | ||
151 | functionality. | ||
152 | |||
148 | Check the i2c-rcar driver as an example. | 153 | Check the i2c-rcar driver as an example. |
149 | 154 | ||
150 | 155 | ||
diff --git a/Documentation/networking/dsa/dsa.txt b/Documentation/networking/dsa/dsa.txt index 9d05ed7f7da5..f20c884c048a 100644 --- a/Documentation/networking/dsa/dsa.txt +++ b/Documentation/networking/dsa/dsa.txt | |||
@@ -587,26 +587,6 @@ of DSA, would be the its port-based VLAN, used by the associated bridge device. | |||
587 | TODO | 587 | TODO |
588 | ==== | 588 | ==== |
589 | 589 | ||
590 | The platform device problem | ||
591 | --------------------------- | ||
592 | DSA is currently implemented as a platform device driver which is far from ideal | ||
593 | as was discussed in this thread: | ||
594 | |||
595 | http://permalink.gmane.org/gmane.linux.network/329848 | ||
596 | |||
597 | This basically prevents the device driver model to be properly used and applied, | ||
598 | and support non-MDIO, non-MMIO Ethernet connected switches. | ||
599 | |||
600 | Another problem with the platform device driver approach is that it prevents the | ||
601 | use of a modular switch drivers build due to a circular dependency, illustrated | ||
602 | here: | ||
603 | |||
604 | http://comments.gmane.org/gmane.linux.network/345803 | ||
605 | |||
606 | Attempts of reworking this has been done here: | ||
607 | |||
608 | https://lwn.net/Articles/643149/ | ||
609 | |||
610 | Making SWITCHDEV and DSA converge towards an unified codebase | 590 | Making SWITCHDEV and DSA converge towards an unified codebase |
611 | ------------------------------------------------------------- | 591 | ------------------------------------------------------------- |
612 | 592 | ||
diff --git a/Documentation/powerpc/transactional_memory.txt b/Documentation/powerpc/transactional_memory.txt index ba0a2a4a54ba..e32fdbb4c9a7 100644 --- a/Documentation/powerpc/transactional_memory.txt +++ b/Documentation/powerpc/transactional_memory.txt | |||
@@ -167,6 +167,8 @@ signal will be rolled back anyway. | |||
167 | For signals taken in non-TM or suspended mode, we use the | 167 | For signals taken in non-TM or suspended mode, we use the |
168 | normal/non-checkpointed stack pointer. | 168 | normal/non-checkpointed stack pointer. |
169 | 169 | ||
170 | Any transaction initiated inside a sighandler and suspended on return | ||
171 | from the sighandler to the kernel will get reclaimed and discarded. | ||
170 | 172 | ||
171 | Failure cause codes used by kernel | 173 | Failure cause codes used by kernel |
172 | ================================== | 174 | ================================== |
diff --git a/Documentation/rapidio/mport_cdev.txt b/Documentation/rapidio/mport_cdev.txt index 6e491a662461..a53f786ee2e9 100644 --- a/Documentation/rapidio/mport_cdev.txt +++ b/Documentation/rapidio/mport_cdev.txt | |||
@@ -80,6 +80,10 @@ functionality of their platform when planning to use this driver: | |||
80 | 80 | ||
81 | III. Module parameters | 81 | III. Module parameters |
82 | 82 | ||
83 | - 'dma_timeout' - DMA transfer completion timeout (in msec, default value 3000). | ||
84 | This parameter set a maximum completion wait time for SYNC mode DMA | ||
85 | transfer requests and for RIO_WAIT_FOR_ASYNC ioctl requests. | ||
86 | |||
83 | - 'dbg_level' - This parameter allows to control amount of debug information | 87 | - 'dbg_level' - This parameter allows to control amount of debug information |
84 | generated by this device driver. This parameter is formed by set of | 88 | generated by this device driver. This parameter is formed by set of |
85 | bit masks that correspond to the specific functional blocks. | 89 | bit masks that correspond to the specific functional blocks. |
diff --git a/MAINTAINERS b/MAINTAINERS index 71aa5daeae8f..6781a3febd59 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -798,6 +798,7 @@ M: Laura Abbott <labbott@redhat.com> | |||
798 | M: Sumit Semwal <sumit.semwal@linaro.org> | 798 | M: Sumit Semwal <sumit.semwal@linaro.org> |
799 | L: devel@driverdev.osuosl.org | 799 | L: devel@driverdev.osuosl.org |
800 | S: Supported | 800 | S: Supported |
801 | F: Documentation/devicetree/bindings/staging/ion/ | ||
801 | F: drivers/staging/android/ion | 802 | F: drivers/staging/android/ion |
802 | F: drivers/staging/android/uapi/ion.h | 803 | F: drivers/staging/android/uapi/ion.h |
803 | F: drivers/staging/android/uapi/ion_test.h | 804 | F: drivers/staging/android/uapi/ion_test.h |
@@ -1623,7 +1624,7 @@ N: rockchip | |||
1623 | 1624 | ||
1624 | ARM/SAMSUNG EXYNOS ARM ARCHITECTURES | 1625 | ARM/SAMSUNG EXYNOS ARM ARCHITECTURES |
1625 | M: Kukjin Kim <kgene@kernel.org> | 1626 | M: Kukjin Kim <kgene@kernel.org> |
1626 | M: Krzysztof Kozlowski <k.kozlowski@samsung.com> | 1627 | M: Krzysztof Kozlowski <krzk@kernel.org> |
1627 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1628 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1628 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) | 1629 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) |
1629 | S: Maintained | 1630 | S: Maintained |
@@ -1643,7 +1644,6 @@ F: drivers/*/*s3c64xx* | |||
1643 | F: drivers/*/*s5pv210* | 1644 | F: drivers/*/*s5pv210* |
1644 | F: drivers/memory/samsung/* | 1645 | F: drivers/memory/samsung/* |
1645 | F: drivers/soc/samsung/* | 1646 | F: drivers/soc/samsung/* |
1646 | F: drivers/spi/spi-s3c* | ||
1647 | F: Documentation/arm/Samsung/ | 1647 | F: Documentation/arm/Samsung/ |
1648 | F: Documentation/devicetree/bindings/arm/samsung/ | 1648 | F: Documentation/devicetree/bindings/arm/samsung/ |
1649 | F: Documentation/devicetree/bindings/sram/samsung-sram.txt | 1649 | F: Documentation/devicetree/bindings/sram/samsung-sram.txt |
@@ -1831,6 +1831,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git | |||
1831 | ARM/UNIPHIER ARCHITECTURE | 1831 | ARM/UNIPHIER ARCHITECTURE |
1832 | M: Masahiro Yamada <yamada.masahiro@socionext.com> | 1832 | M: Masahiro Yamada <yamada.masahiro@socionext.com> |
1833 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1833 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1834 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-uniphier.git | ||
1834 | S: Maintained | 1835 | S: Maintained |
1835 | F: arch/arm/boot/dts/uniphier* | 1836 | F: arch/arm/boot/dts/uniphier* |
1836 | F: arch/arm/include/asm/hardware/cache-uniphier.h | 1837 | F: arch/arm/include/asm/hardware/cache-uniphier.h |
@@ -3247,7 +3248,7 @@ F: kernel/cpuset.c | |||
3247 | CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG) | 3248 | CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG) |
3248 | M: Johannes Weiner <hannes@cmpxchg.org> | 3249 | M: Johannes Weiner <hannes@cmpxchg.org> |
3249 | M: Michal Hocko <mhocko@kernel.org> | 3250 | M: Michal Hocko <mhocko@kernel.org> |
3250 | M: Vladimir Davydov <vdavydov@virtuozzo.com> | 3251 | M: Vladimir Davydov <vdavydov.dev@gmail.com> |
3251 | L: cgroups@vger.kernel.org | 3252 | L: cgroups@vger.kernel.org |
3252 | L: linux-mm@kvack.org | 3253 | L: linux-mm@kvack.org |
3253 | S: Maintained | 3254 | S: Maintained |
@@ -7464,7 +7465,8 @@ F: Documentation/devicetree/bindings/sound/max9860.txt | |||
7464 | F: sound/soc/codecs/max9860.* | 7465 | F: sound/soc/codecs/max9860.* |
7465 | 7466 | ||
7466 | MAXIM MUIC CHARGER DRIVERS FOR EXYNOS BASED BOARDS | 7467 | MAXIM MUIC CHARGER DRIVERS FOR EXYNOS BASED BOARDS |
7467 | M: Krzysztof Kozlowski <k.kozlowski@samsung.com> | 7468 | M: Krzysztof Kozlowski <krzk@kernel.org> |
7469 | M: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> | ||
7468 | L: linux-pm@vger.kernel.org | 7470 | L: linux-pm@vger.kernel.org |
7469 | S: Supported | 7471 | S: Supported |
7470 | F: drivers/power/max14577_charger.c | 7472 | F: drivers/power/max14577_charger.c |
@@ -7480,7 +7482,8 @@ F: include/dt-bindings/*/*max77802.h | |||
7480 | 7482 | ||
7481 | MAXIM PMIC AND MUIC DRIVERS FOR EXYNOS BASED BOARDS | 7483 | MAXIM PMIC AND MUIC DRIVERS FOR EXYNOS BASED BOARDS |
7482 | M: Chanwoo Choi <cw00.choi@samsung.com> | 7484 | M: Chanwoo Choi <cw00.choi@samsung.com> |
7483 | M: Krzysztof Kozlowski <k.kozlowski@samsung.com> | 7485 | M: Krzysztof Kozlowski <krzk@kernel.org> |
7486 | M: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> | ||
7484 | L: linux-kernel@vger.kernel.org | 7487 | L: linux-kernel@vger.kernel.org |
7485 | S: Supported | 7488 | S: Supported |
7486 | F: drivers/*/max14577*.c | 7489 | F: drivers/*/max14577*.c |
@@ -9246,7 +9249,7 @@ F: drivers/pinctrl/sh-pfc/ | |||
9246 | 9249 | ||
9247 | PIN CONTROLLER - SAMSUNG | 9250 | PIN CONTROLLER - SAMSUNG |
9248 | M: Tomasz Figa <tomasz.figa@gmail.com> | 9251 | M: Tomasz Figa <tomasz.figa@gmail.com> |
9249 | M: Krzysztof Kozlowski <k.kozlowski@samsung.com> | 9252 | M: Krzysztof Kozlowski <krzk@kernel.org> |
9250 | M: Sylwester Nawrocki <s.nawrocki@samsung.com> | 9253 | M: Sylwester Nawrocki <s.nawrocki@samsung.com> |
9251 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 9254 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
9252 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) | 9255 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) |
@@ -10179,7 +10182,7 @@ S: Maintained | |||
10179 | F: drivers/platform/x86/samsung-laptop.c | 10182 | F: drivers/platform/x86/samsung-laptop.c |
10180 | 10183 | ||
10181 | SAMSUNG AUDIO (ASoC) DRIVERS | 10184 | SAMSUNG AUDIO (ASoC) DRIVERS |
10182 | M: Krzysztof Kozlowski <k.kozlowski@samsung.com> | 10185 | M: Krzysztof Kozlowski <krzk@kernel.org> |
10183 | M: Sangbeom Kim <sbkim73@samsung.com> | 10186 | M: Sangbeom Kim <sbkim73@samsung.com> |
10184 | M: Sylwester Nawrocki <s.nawrocki@samsung.com> | 10187 | M: Sylwester Nawrocki <s.nawrocki@samsung.com> |
10185 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 10188 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
@@ -10194,7 +10197,8 @@ F: drivers/video/fbdev/s3c-fb.c | |||
10194 | 10197 | ||
10195 | SAMSUNG MULTIFUNCTION PMIC DEVICE DRIVERS | 10198 | SAMSUNG MULTIFUNCTION PMIC DEVICE DRIVERS |
10196 | M: Sangbeom Kim <sbkim73@samsung.com> | 10199 | M: Sangbeom Kim <sbkim73@samsung.com> |
10197 | M: Krzysztof Kozlowski <k.kozlowski@samsung.com> | 10200 | M: Krzysztof Kozlowski <krzk@kernel.org> |
10201 | M: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> | ||
10198 | L: linux-kernel@vger.kernel.org | 10202 | L: linux-kernel@vger.kernel.org |
10199 | L: linux-samsung-soc@vger.kernel.org | 10203 | L: linux-samsung-soc@vger.kernel.org |
10200 | S: Supported | 10204 | S: Supported |
@@ -10253,6 +10257,17 @@ S: Supported | |||
10253 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) | 10257 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) |
10254 | F: drivers/clk/samsung/ | 10258 | F: drivers/clk/samsung/ |
10255 | 10259 | ||
10260 | SAMSUNG SPI DRIVERS | ||
10261 | M: Kukjin Kim <kgene@kernel.org> | ||
10262 | M: Krzysztof Kozlowski <krzk@kernel.org> | ||
10263 | M: Andi Shyti <andi.shyti@samsung.com> | ||
10264 | L: linux-spi@vger.kernel.org | ||
10265 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) | ||
10266 | S: Maintained | ||
10267 | F: Documentation/devicetree/bindings/spi/spi-samsung.txt | ||
10268 | F: drivers/spi/spi-s3c* | ||
10269 | F: include/linux/platform_data/spi-s3c64xx.h | ||
10270 | |||
10256 | SAMSUNG SXGBE DRIVERS | 10271 | SAMSUNG SXGBE DRIVERS |
10257 | M: Byungho An <bh74.an@samsung.com> | 10272 | M: Byungho An <bh74.an@samsung.com> |
10258 | M: Girish K S <ks.giri@samsung.com> | 10273 | M: Girish K S <ks.giri@samsung.com> |
@@ -11232,12 +11247,8 @@ S: Odd Fixes | |||
11232 | F: drivers/staging/vt665?/ | 11247 | F: drivers/staging/vt665?/ |
11233 | 11248 | ||
11234 | STAGING - WILC1000 WIFI DRIVER | 11249 | STAGING - WILC1000 WIFI DRIVER |
11235 | M: Johnny Kim <johnny.kim@atmel.com> | 11250 | M: Aditya Shankar <aditya.shankar@microchip.com> |
11236 | M: Austin Shin <austin.shin@atmel.com> | 11251 | M: Ganesh Krishna <ganesh.krishna@microchip.com> |
11237 | M: Chris Park <chris.park@atmel.com> | ||
11238 | M: Tony Cho <tony.cho@atmel.com> | ||
11239 | M: Glen Lee <glen.lee@atmel.com> | ||
11240 | M: Leo Kim <leo.kim@atmel.com> | ||
11241 | L: linux-wireless@vger.kernel.org | 11252 | L: linux-wireless@vger.kernel.org |
11242 | S: Supported | 11253 | S: Supported |
11243 | F: drivers/staging/wilc1000/ | 11254 | F: drivers/staging/wilc1000/ |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 4 | 1 | VERSION = 4 |
2 | PATCHLEVEL = 8 | 2 | PATCHLEVEL = 8 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc4 | 4 | EXTRAVERSION = -rc6 |
5 | NAME = Psychotic Stoned Sheep | 5 | NAME = Psychotic Stoned Sheep |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/Kconfig b/arch/Kconfig index e9c9334507dd..fd6e9712af81 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
@@ -336,17 +336,6 @@ config HAVE_ARCH_SECCOMP_FILTER | |||
336 | results in the system call being skipped immediately. | 336 | results in the system call being skipped immediately. |
337 | - seccomp syscall wired up | 337 | - seccomp syscall wired up |
338 | 338 | ||
339 | For best performance, an arch should use seccomp_phase1 and | ||
340 | seccomp_phase2 directly. It should call seccomp_phase1 for all | ||
341 | syscalls if TIF_SECCOMP is set, but seccomp_phase1 does not | ||
342 | need to be called from a ptrace-safe context. It must then | ||
343 | call seccomp_phase2 if seccomp_phase1 returns anything other | ||
344 | than SECCOMP_PHASE1_OK or SECCOMP_PHASE1_SKIP. | ||
345 | |||
346 | As an additional optimization, an arch may provide seccomp_data | ||
347 | directly to seccomp_phase1; this avoids multiple calls | ||
348 | to the syscall_xyz helpers for every syscall. | ||
349 | |||
350 | config SECCOMP_FILTER | 339 | config SECCOMP_FILTER |
351 | def_bool y | 340 | def_bool y |
352 | depends on HAVE_ARCH_SECCOMP_FILTER && SECCOMP && NET | 341 | depends on HAVE_ARCH_SECCOMP_FILTER && SECCOMP && NET |
diff --git a/arch/arm/boot/dts/am335x-baltos.dtsi b/arch/arm/boot/dts/am335x-baltos.dtsi index c8609d8d2c55..b689172632ef 100644 --- a/arch/arm/boot/dts/am335x-baltos.dtsi +++ b/arch/arm/boot/dts/am335x-baltos.dtsi | |||
@@ -226,7 +226,7 @@ | |||
226 | 226 | ||
227 | #address-cells = <1>; | 227 | #address-cells = <1>; |
228 | #size-cells = <1>; | 228 | #size-cells = <1>; |
229 | elm_id = <&elm>; | 229 | ti,elm-id = <&elm>; |
230 | }; | 230 | }; |
231 | }; | 231 | }; |
232 | 232 | ||
diff --git a/arch/arm/boot/dts/am335x-igep0033.dtsi b/arch/arm/boot/dts/am335x-igep0033.dtsi index df63484ef9b3..e7d9ca1305fa 100644 --- a/arch/arm/boot/dts/am335x-igep0033.dtsi +++ b/arch/arm/boot/dts/am335x-igep0033.dtsi | |||
@@ -161,7 +161,7 @@ | |||
161 | 161 | ||
162 | #address-cells = <1>; | 162 | #address-cells = <1>; |
163 | #size-cells = <1>; | 163 | #size-cells = <1>; |
164 | elm_id = <&elm>; | 164 | ti,elm-id = <&elm>; |
165 | 165 | ||
166 | /* MTD partition table */ | 166 | /* MTD partition table */ |
167 | partition@0 { | 167 | partition@0 { |
diff --git a/arch/arm/boot/dts/am335x-phycore-som.dtsi b/arch/arm/boot/dts/am335x-phycore-som.dtsi index 86f773165d5c..1263c9d4cba3 100644 --- a/arch/arm/boot/dts/am335x-phycore-som.dtsi +++ b/arch/arm/boot/dts/am335x-phycore-som.dtsi | |||
@@ -197,7 +197,7 @@ | |||
197 | gpmc,wr-access-ns = <30>; | 197 | gpmc,wr-access-ns = <30>; |
198 | gpmc,wr-data-mux-bus-ns = <0>; | 198 | gpmc,wr-data-mux-bus-ns = <0>; |
199 | 199 | ||
200 | elm_id = <&elm>; | 200 | ti,elm-id = <&elm>; |
201 | 201 | ||
202 | #address-cells = <1>; | 202 | #address-cells = <1>; |
203 | #size-cells = <1>; | 203 | #size-cells = <1>; |
diff --git a/arch/arm/boot/dts/armada-388-clearfog.dts b/arch/arm/boot/dts/armada-388-clearfog.dts index 2e0556af6e5e..d3e6bd805006 100644 --- a/arch/arm/boot/dts/armada-388-clearfog.dts +++ b/arch/arm/boot/dts/armada-388-clearfog.dts | |||
@@ -390,12 +390,12 @@ | |||
390 | 390 | ||
391 | port@0 { | 391 | port@0 { |
392 | reg = <0>; | 392 | reg = <0>; |
393 | label = "lan1"; | 393 | label = "lan5"; |
394 | }; | 394 | }; |
395 | 395 | ||
396 | port@1 { | 396 | port@1 { |
397 | reg = <1>; | 397 | reg = <1>; |
398 | label = "lan2"; | 398 | label = "lan4"; |
399 | }; | 399 | }; |
400 | 400 | ||
401 | port@2 { | 401 | port@2 { |
@@ -405,12 +405,12 @@ | |||
405 | 405 | ||
406 | port@3 { | 406 | port@3 { |
407 | reg = <3>; | 407 | reg = <3>; |
408 | label = "lan4"; | 408 | label = "lan2"; |
409 | }; | 409 | }; |
410 | 410 | ||
411 | port@4 { | 411 | port@4 { |
412 | reg = <4>; | 412 | reg = <4>; |
413 | label = "lan5"; | 413 | label = "lan1"; |
414 | }; | 414 | }; |
415 | 415 | ||
416 | port@5 { | 416 | port@5 { |
diff --git a/arch/arm/boot/dts/exynos5410-odroidxu.dts b/arch/arm/boot/dts/exynos5410-odroidxu.dts index d9499310a301..f6d135245a4b 100644 --- a/arch/arm/boot/dts/exynos5410-odroidxu.dts +++ b/arch/arm/boot/dts/exynos5410-odroidxu.dts | |||
@@ -447,14 +447,11 @@ | |||
447 | samsung,dw-mshc-ciu-div = <3>; | 447 | samsung,dw-mshc-ciu-div = <3>; |
448 | samsung,dw-mshc-sdr-timing = <0 4>; | 448 | samsung,dw-mshc-sdr-timing = <0 4>; |
449 | samsung,dw-mshc-ddr-timing = <0 2>; | 449 | samsung,dw-mshc-ddr-timing = <0 2>; |
450 | samsung,dw-mshc-hs400-timing = <0 2>; | ||
451 | samsung,read-strobe-delay = <90>; | ||
452 | pinctrl-names = "default"; | 450 | pinctrl-names = "default"; |
453 | pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_bus1 &sd0_bus4 &sd0_bus8 &sd0_cd>; | 451 | pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_bus1 &sd0_bus4 &sd0_bus8 &sd0_cd>; |
454 | bus-width = <8>; | 452 | bus-width = <8>; |
455 | cap-mmc-highspeed; | 453 | cap-mmc-highspeed; |
456 | mmc-hs200-1_8v; | 454 | mmc-hs200-1_8v; |
457 | mmc-hs400-1_8v; | ||
458 | vmmc-supply = <&ldo20_reg>; | 455 | vmmc-supply = <&ldo20_reg>; |
459 | vqmmc-supply = <&ldo11_reg>; | 456 | vqmmc-supply = <&ldo11_reg>; |
460 | }; | 457 | }; |
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi index b620ac884cfd..b13b0b2db881 100644 --- a/arch/arm/boot/dts/imx6qdl.dtsi +++ b/arch/arm/boot/dts/imx6qdl.dtsi | |||
@@ -243,7 +243,7 @@ | |||
243 | clocks = <&clks IMX6QDL_CLK_SPDIF_GCLK>, <&clks IMX6QDL_CLK_OSC>, | 243 | clocks = <&clks IMX6QDL_CLK_SPDIF_GCLK>, <&clks IMX6QDL_CLK_OSC>, |
244 | <&clks IMX6QDL_CLK_SPDIF>, <&clks IMX6QDL_CLK_ASRC>, | 244 | <&clks IMX6QDL_CLK_SPDIF>, <&clks IMX6QDL_CLK_ASRC>, |
245 | <&clks IMX6QDL_CLK_DUMMY>, <&clks IMX6QDL_CLK_ESAI_EXTAL>, | 245 | <&clks IMX6QDL_CLK_DUMMY>, <&clks IMX6QDL_CLK_ESAI_EXTAL>, |
246 | <&clks IMX6QDL_CLK_IPG>, <&clks IMX6QDL_CLK_MLB>, | 246 | <&clks IMX6QDL_CLK_IPG>, <&clks IMX6QDL_CLK_DUMMY>, |
247 | <&clks IMX6QDL_CLK_DUMMY>, <&clks IMX6QDL_CLK_SPBA>; | 247 | <&clks IMX6QDL_CLK_DUMMY>, <&clks IMX6QDL_CLK_SPBA>; |
248 | clock-names = "core", "rxtx0", | 248 | clock-names = "core", "rxtx0", |
249 | "rxtx1", "rxtx2", | 249 | "rxtx1", "rxtx2", |
diff --git a/arch/arm/boot/dts/imx6sx-sabreauto.dts b/arch/arm/boot/dts/imx6sx-sabreauto.dts index 96ea936eeeb0..240a2864d044 100644 --- a/arch/arm/boot/dts/imx6sx-sabreauto.dts +++ b/arch/arm/boot/dts/imx6sx-sabreauto.dts | |||
@@ -64,7 +64,7 @@ | |||
64 | cd-gpios = <&gpio7 11 GPIO_ACTIVE_LOW>; | 64 | cd-gpios = <&gpio7 11 GPIO_ACTIVE_LOW>; |
65 | no-1-8-v; | 65 | no-1-8-v; |
66 | keep-power-in-suspend; | 66 | keep-power-in-suspend; |
67 | enable-sdio-wakup; | 67 | wakeup-source; |
68 | status = "okay"; | 68 | status = "okay"; |
69 | }; | 69 | }; |
70 | 70 | ||
diff --git a/arch/arm/boot/dts/imx7d-sdb.dts b/arch/arm/boot/dts/imx7d-sdb.dts index 95ee268ed510..2f33c463cbce 100644 --- a/arch/arm/boot/dts/imx7d-sdb.dts +++ b/arch/arm/boot/dts/imx7d-sdb.dts | |||
@@ -131,7 +131,7 @@ | |||
131 | ti,y-min = /bits/ 16 <0>; | 131 | ti,y-min = /bits/ 16 <0>; |
132 | ti,y-max = /bits/ 16 <0>; | 132 | ti,y-max = /bits/ 16 <0>; |
133 | ti,pressure-max = /bits/ 16 <0>; | 133 | ti,pressure-max = /bits/ 16 <0>; |
134 | ti,x-plat-ohms = /bits/ 16 <400>; | 134 | ti,x-plate-ohms = /bits/ 16 <400>; |
135 | wakeup-source; | 135 | wakeup-source; |
136 | }; | 136 | }; |
137 | }; | 137 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-ib62x0.dts b/arch/arm/boot/dts/kirkwood-ib62x0.dts index ef84d8699a76..5bf62897014c 100644 --- a/arch/arm/boot/dts/kirkwood-ib62x0.dts +++ b/arch/arm/boot/dts/kirkwood-ib62x0.dts | |||
@@ -113,7 +113,7 @@ | |||
113 | 113 | ||
114 | partition@e0000 { | 114 | partition@e0000 { |
115 | label = "u-boot environment"; | 115 | label = "u-boot environment"; |
116 | reg = <0xe0000 0x100000>; | 116 | reg = <0xe0000 0x20000>; |
117 | }; | 117 | }; |
118 | 118 | ||
119 | partition@100000 { | 119 | partition@100000 { |
diff --git a/arch/arm/boot/dts/kirkwood-openrd.dtsi b/arch/arm/boot/dts/kirkwood-openrd.dtsi index e4ecab112601..7175511a92da 100644 --- a/arch/arm/boot/dts/kirkwood-openrd.dtsi +++ b/arch/arm/boot/dts/kirkwood-openrd.dtsi | |||
@@ -116,6 +116,10 @@ | |||
116 | }; | 116 | }; |
117 | }; | 117 | }; |
118 | 118 | ||
119 | &pciec { | ||
120 | status = "okay"; | ||
121 | }; | ||
122 | |||
119 | &pcie0 { | 123 | &pcie0 { |
120 | status = "okay"; | 124 | status = "okay"; |
121 | }; | 125 | }; |
diff --git a/arch/arm/boot/dts/logicpd-som-lv.dtsi b/arch/arm/boot/dts/logicpd-som-lv.dtsi index 365f39ff58bb..0ff1c2de95bf 100644 --- a/arch/arm/boot/dts/logicpd-som-lv.dtsi +++ b/arch/arm/boot/dts/logicpd-som-lv.dtsi | |||
@@ -35,10 +35,15 @@ | |||
35 | ranges = <0 0 0x00000000 0x1000000>; /* CS0: 16MB for NAND */ | 35 | ranges = <0 0 0x00000000 0x1000000>; /* CS0: 16MB for NAND */ |
36 | 36 | ||
37 | nand@0,0 { | 37 | nand@0,0 { |
38 | linux,mtd-name = "micron,mt29f4g16abbda3w"; | 38 | compatible = "ti,omap2-nand"; |
39 | reg = <0 0 4>; /* CS0, offset 0, IO size 4 */ | 39 | reg = <0 0 4>; /* CS0, offset 0, IO size 4 */ |
40 | interrupt-parent = <&gpmc>; | ||
41 | interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */ | ||
42 | <1 IRQ_TYPE_NONE>; /* termcount */ | ||
43 | linux,mtd-name = "micron,mt29f4g16abbda3w"; | ||
40 | nand-bus-width = <16>; | 44 | nand-bus-width = <16>; |
41 | ti,nand-ecc-opt = "bch8"; | 45 | ti,nand-ecc-opt = "bch8"; |
46 | rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 */ | ||
42 | gpmc,sync-clk-ps = <0>; | 47 | gpmc,sync-clk-ps = <0>; |
43 | gpmc,cs-on-ns = <0>; | 48 | gpmc,cs-on-ns = <0>; |
44 | gpmc,cs-rd-off-ns = <44>; | 49 | gpmc,cs-rd-off-ns = <44>; |
@@ -54,10 +59,6 @@ | |||
54 | gpmc,wr-access-ns = <40>; | 59 | gpmc,wr-access-ns = <40>; |
55 | gpmc,wr-data-mux-bus-ns = <0>; | 60 | gpmc,wr-data-mux-bus-ns = <0>; |
56 | gpmc,device-width = <2>; | 61 | gpmc,device-width = <2>; |
57 | |||
58 | gpmc,page-burst-access-ns = <5>; | ||
59 | gpmc,cycle2cycle-delay-ns = <50>; | ||
60 | |||
61 | #address-cells = <1>; | 62 | #address-cells = <1>; |
62 | #size-cells = <1>; | 63 | #size-cells = <1>; |
63 | 64 | ||
diff --git a/arch/arm/boot/dts/logicpd-torpedo-som.dtsi b/arch/arm/boot/dts/logicpd-torpedo-som.dtsi index 5e9a13c0eaf7..1c2c74655416 100644 --- a/arch/arm/boot/dts/logicpd-torpedo-som.dtsi +++ b/arch/arm/boot/dts/logicpd-torpedo-som.dtsi | |||
@@ -46,6 +46,7 @@ | |||
46 | linux,mtd-name = "micron,mt29f4g16abbda3w"; | 46 | linux,mtd-name = "micron,mt29f4g16abbda3w"; |
47 | nand-bus-width = <16>; | 47 | nand-bus-width = <16>; |
48 | ti,nand-ecc-opt = "bch8"; | 48 | ti,nand-ecc-opt = "bch8"; |
49 | rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 */ | ||
49 | gpmc,sync-clk-ps = <0>; | 50 | gpmc,sync-clk-ps = <0>; |
50 | gpmc,cs-on-ns = <0>; | 51 | gpmc,cs-on-ns = <0>; |
51 | gpmc,cs-rd-off-ns = <44>; | 52 | gpmc,cs-rd-off-ns = <44>; |
diff --git a/arch/arm/boot/dts/omap3-overo-base.dtsi b/arch/arm/boot/dts/omap3-overo-base.dtsi index de256fa8da48..3e946cac55f3 100644 --- a/arch/arm/boot/dts/omap3-overo-base.dtsi +++ b/arch/arm/boot/dts/omap3-overo-base.dtsi | |||
@@ -223,7 +223,9 @@ | |||
223 | }; | 223 | }; |
224 | 224 | ||
225 | &gpmc { | 225 | &gpmc { |
226 | ranges = <0 0 0x00000000 0x20000000>; | 226 | ranges = <0 0 0x30000000 0x1000000>, /* CS0 */ |
227 | <4 0 0x2b000000 0x1000000>, /* CS4 */ | ||
228 | <5 0 0x2c000000 0x1000000>; /* CS5 */ | ||
227 | 229 | ||
228 | nand@0,0 { | 230 | nand@0,0 { |
229 | compatible = "ti,omap2-nand"; | 231 | compatible = "ti,omap2-nand"; |
diff --git a/arch/arm/boot/dts/omap3-overo-chestnut43-common.dtsi b/arch/arm/boot/dts/omap3-overo-chestnut43-common.dtsi index 7df27926ead2..4f4c6efbd518 100644 --- a/arch/arm/boot/dts/omap3-overo-chestnut43-common.dtsi +++ b/arch/arm/boot/dts/omap3-overo-chestnut43-common.dtsi | |||
@@ -55,8 +55,6 @@ | |||
55 | #include "omap-gpmc-smsc9221.dtsi" | 55 | #include "omap-gpmc-smsc9221.dtsi" |
56 | 56 | ||
57 | &gpmc { | 57 | &gpmc { |
58 | ranges = <5 0 0x2c000000 0x1000000>; /* CS5 */ | ||
59 | |||
60 | ethernet@gpmc { | 58 | ethernet@gpmc { |
61 | reg = <5 0 0xff>; | 59 | reg = <5 0 0xff>; |
62 | interrupt-parent = <&gpio6>; | 60 | interrupt-parent = <&gpio6>; |
diff --git a/arch/arm/boot/dts/omap3-overo-tobi-common.dtsi b/arch/arm/boot/dts/omap3-overo-tobi-common.dtsi index 9e24b6a1d07b..1b304e2f1bd2 100644 --- a/arch/arm/boot/dts/omap3-overo-tobi-common.dtsi +++ b/arch/arm/boot/dts/omap3-overo-tobi-common.dtsi | |||
@@ -27,8 +27,6 @@ | |||
27 | #include "omap-gpmc-smsc9221.dtsi" | 27 | #include "omap-gpmc-smsc9221.dtsi" |
28 | 28 | ||
29 | &gpmc { | 29 | &gpmc { |
30 | ranges = <5 0 0x2c000000 0x1000000>; /* CS5 */ | ||
31 | |||
32 | ethernet@gpmc { | 30 | ethernet@gpmc { |
33 | reg = <5 0 0xff>; | 31 | reg = <5 0 0xff>; |
34 | interrupt-parent = <&gpio6>; | 32 | interrupt-parent = <&gpio6>; |
diff --git a/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi b/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi index 334109e14613..82e98ee3023a 100644 --- a/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi +++ b/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi | |||
@@ -15,9 +15,6 @@ | |||
15 | #include "omap-gpmc-smsc9221.dtsi" | 15 | #include "omap-gpmc-smsc9221.dtsi" |
16 | 16 | ||
17 | &gpmc { | 17 | &gpmc { |
18 | ranges = <4 0 0x2b000000 0x1000000>, /* CS4 */ | ||
19 | <5 0 0x2c000000 0x1000000>; /* CS5 */ | ||
20 | |||
21 | smsc1: ethernet@gpmc { | 18 | smsc1: ethernet@gpmc { |
22 | reg = <5 0 0xff>; | 19 | reg = <5 0 0xff>; |
23 | interrupt-parent = <&gpio6>; | 20 | interrupt-parent = <&gpio6>; |
diff --git a/arch/arm/boot/dts/rk3066a.dtsi b/arch/arm/boot/dts/rk3066a.dtsi index c0ba86c3a2ab..0d0dae3a1694 100644 --- a/arch/arm/boot/dts/rk3066a.dtsi +++ b/arch/arm/boot/dts/rk3066a.dtsi | |||
@@ -197,6 +197,8 @@ | |||
197 | clock-names = "saradc", "apb_pclk"; | 197 | clock-names = "saradc", "apb_pclk"; |
198 | interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>; | 198 | interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>; |
199 | #io-channel-cells = <1>; | 199 | #io-channel-cells = <1>; |
200 | resets = <&cru SRST_SARADC>; | ||
201 | reset-names = "saradc-apb"; | ||
200 | status = "disabled"; | 202 | status = "disabled"; |
201 | }; | 203 | }; |
202 | 204 | ||
diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index cd33f0170890..91c4b3c7a8d5 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi | |||
@@ -279,6 +279,8 @@ | |||
279 | #io-channel-cells = <1>; | 279 | #io-channel-cells = <1>; |
280 | clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; | 280 | clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; |
281 | clock-names = "saradc", "apb_pclk"; | 281 | clock-names = "saradc", "apb_pclk"; |
282 | resets = <&cru SRST_SARADC>; | ||
283 | reset-names = "saradc-apb"; | ||
282 | status = "disabled"; | 284 | status = "disabled"; |
283 | }; | 285 | }; |
284 | 286 | ||
diff --git a/arch/arm/boot/dts/rk3xxx.dtsi b/arch/arm/boot/dts/rk3xxx.dtsi index 99bbcc2c9b89..e2cd683b4e4b 100644 --- a/arch/arm/boot/dts/rk3xxx.dtsi +++ b/arch/arm/boot/dts/rk3xxx.dtsi | |||
@@ -399,6 +399,8 @@ | |||
399 | #io-channel-cells = <1>; | 399 | #io-channel-cells = <1>; |
400 | clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; | 400 | clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; |
401 | clock-names = "saradc", "apb_pclk"; | 401 | clock-names = "saradc", "apb_pclk"; |
402 | resets = <&cru SRST_SARADC>; | ||
403 | reset-names = "saradc-apb"; | ||
402 | status = "disabled"; | 404 | status = "disabled"; |
403 | }; | 405 | }; |
404 | 406 | ||
diff --git a/arch/arm/boot/dts/sun5i-a13.dtsi b/arch/arm/boot/dts/sun5i-a13.dtsi index e012890e0cf2..a17ba0243db3 100644 --- a/arch/arm/boot/dts/sun5i-a13.dtsi +++ b/arch/arm/boot/dts/sun5i-a13.dtsi | |||
@@ -84,7 +84,7 @@ | |||
84 | trips { | 84 | trips { |
85 | cpu_alert0: cpu_alert0 { | 85 | cpu_alert0: cpu_alert0 { |
86 | /* milliCelsius */ | 86 | /* milliCelsius */ |
87 | temperature = <850000>; | 87 | temperature = <85000>; |
88 | hysteresis = <2000>; | 88 | hysteresis = <2000>; |
89 | type = "passive"; | 89 | type = "passive"; |
90 | }; | 90 | }; |
diff --git a/arch/arm/boot/dts/tegra114-dalmore.dts b/arch/arm/boot/dts/tegra114-dalmore.dts index 1dfc492cc004..1444fbd543e7 100644 --- a/arch/arm/boot/dts/tegra114-dalmore.dts +++ b/arch/arm/boot/dts/tegra114-dalmore.dts | |||
@@ -897,7 +897,7 @@ | |||
897 | palmas: tps65913@58 { | 897 | palmas: tps65913@58 { |
898 | compatible = "ti,palmas"; | 898 | compatible = "ti,palmas"; |
899 | reg = <0x58>; | 899 | reg = <0x58>; |
900 | interrupts = <0 86 IRQ_TYPE_LEVEL_LOW>; | 900 | interrupts = <0 86 IRQ_TYPE_LEVEL_HIGH>; |
901 | 901 | ||
902 | #interrupt-cells = <2>; | 902 | #interrupt-cells = <2>; |
903 | interrupt-controller; | 903 | interrupt-controller; |
diff --git a/arch/arm/boot/dts/tegra114-roth.dts b/arch/arm/boot/dts/tegra114-roth.dts index 70cf40996c3f..966a7fc044af 100644 --- a/arch/arm/boot/dts/tegra114-roth.dts +++ b/arch/arm/boot/dts/tegra114-roth.dts | |||
@@ -802,7 +802,7 @@ | |||
802 | palmas: pmic@58 { | 802 | palmas: pmic@58 { |
803 | compatible = "ti,palmas"; | 803 | compatible = "ti,palmas"; |
804 | reg = <0x58>; | 804 | reg = <0x58>; |
805 | interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_LOW>; | 805 | interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>; |
806 | 806 | ||
807 | #interrupt-cells = <2>; | 807 | #interrupt-cells = <2>; |
808 | interrupt-controller; | 808 | interrupt-controller; |
diff --git a/arch/arm/boot/dts/tegra114-tn7.dts b/arch/arm/boot/dts/tegra114-tn7.dts index 17dd14545862..a161fa1dfb61 100644 --- a/arch/arm/boot/dts/tegra114-tn7.dts +++ b/arch/arm/boot/dts/tegra114-tn7.dts | |||
@@ -63,7 +63,7 @@ | |||
63 | palmas: pmic@58 { | 63 | palmas: pmic@58 { |
64 | compatible = "ti,palmas"; | 64 | compatible = "ti,palmas"; |
65 | reg = <0x58>; | 65 | reg = <0x58>; |
66 | interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_LOW>; | 66 | interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>; |
67 | 67 | ||
68 | #interrupt-cells = <2>; | 68 | #interrupt-cells = <2>; |
69 | interrupt-controller; | 69 | interrupt-controller; |
diff --git a/arch/arm/boot/dts/tegra124-jetson-tk1.dts b/arch/arm/boot/dts/tegra124-jetson-tk1.dts index 6403e0de540e..e52b82449a79 100644 --- a/arch/arm/boot/dts/tegra124-jetson-tk1.dts +++ b/arch/arm/boot/dts/tegra124-jetson-tk1.dts | |||
@@ -1382,7 +1382,7 @@ | |||
1382 | * Pin 41: BR_UART1_TXD | 1382 | * Pin 41: BR_UART1_TXD |
1383 | * Pin 44: BR_UART1_RXD | 1383 | * Pin 44: BR_UART1_RXD |
1384 | */ | 1384 | */ |
1385 | serial@0,70006000 { | 1385 | serial@70006000 { |
1386 | compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; | 1386 | compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; |
1387 | status = "okay"; | 1387 | status = "okay"; |
1388 | }; | 1388 | }; |
@@ -1394,7 +1394,7 @@ | |||
1394 | * Pin 71: UART2_CTS_L | 1394 | * Pin 71: UART2_CTS_L |
1395 | * Pin 74: UART2_RTS_L | 1395 | * Pin 74: UART2_RTS_L |
1396 | */ | 1396 | */ |
1397 | serial@0,70006040 { | 1397 | serial@70006040 { |
1398 | compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; | 1398 | compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; |
1399 | status = "okay"; | 1399 | status = "okay"; |
1400 | }; | 1400 | }; |
diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S index 0b1e4a93d67e..15d073ae5da2 100644 --- a/arch/arm/kernel/hyp-stub.S +++ b/arch/arm/kernel/hyp-stub.S | |||
@@ -142,6 +142,19 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE | |||
142 | and r7, #0x1f @ Preserve HPMN | 142 | and r7, #0x1f @ Preserve HPMN |
143 | mcr p15, 4, r7, c1, c1, 1 @ HDCR | 143 | mcr p15, 4, r7, c1, c1, 1 @ HDCR |
144 | 144 | ||
145 | @ Make sure NS-SVC is initialised appropriately | ||
146 | mrc p15, 0, r7, c1, c0, 0 @ SCTLR | ||
147 | orr r7, #(1 << 5) @ CP15 barriers enabled | ||
148 | bic r7, #(3 << 7) @ Clear SED/ITD for v8 (RES0 for v7) | ||
149 | bic r7, #(3 << 19) @ WXN and UWXN disabled | ||
150 | mcr p15, 0, r7, c1, c0, 0 @ SCTLR | ||
151 | |||
152 | mrc p15, 0, r7, c0, c0, 0 @ MIDR | ||
153 | mcr p15, 4, r7, c0, c0, 0 @ VPIDR | ||
154 | |||
155 | mrc p15, 0, r7, c0, c0, 5 @ MPIDR | ||
156 | mcr p15, 4, r7, c0, c0, 5 @ VMPIDR | ||
157 | |||
145 | #if !defined(ZIMAGE) && defined(CONFIG_ARM_ARCH_TIMER) | 158 | #if !defined(ZIMAGE) && defined(CONFIG_ARM_ARCH_TIMER) |
146 | @ make CNTP_* and CNTPCT accessible from PL1 | 159 | @ make CNTP_* and CNTPCT accessible from PL1 |
147 | mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 | 160 | mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 |
diff --git a/arch/arm/mach-imx/mach-imx6ul.c b/arch/arm/mach-imx/mach-imx6ul.c index 5d9bfab279dd..6bb7d9cf1e38 100644 --- a/arch/arm/mach-imx/mach-imx6ul.c +++ b/arch/arm/mach-imx/mach-imx6ul.c | |||
@@ -64,6 +64,7 @@ static void __init imx6ul_init_machine(void) | |||
64 | if (parent == NULL) | 64 | if (parent == NULL) |
65 | pr_warn("failed to initialize soc device\n"); | 65 | pr_warn("failed to initialize soc device\n"); |
66 | 66 | ||
67 | of_platform_default_populate(NULL, NULL, parent); | ||
67 | imx6ul_enet_init(); | 68 | imx6ul_enet_init(); |
68 | imx_anatop_init(); | 69 | imx_anatop_init(); |
69 | imx6ul_pm_init(); | 70 | imx6ul_pm_init(); |
diff --git a/arch/arm/mach-imx/pm-imx6.c b/arch/arm/mach-imx/pm-imx6.c index 58924b3844df..fe708e26d021 100644 --- a/arch/arm/mach-imx/pm-imx6.c +++ b/arch/arm/mach-imx/pm-imx6.c | |||
@@ -295,7 +295,7 @@ int imx6_set_lpm(enum mxc_cpu_pwr_mode mode) | |||
295 | val &= ~BM_CLPCR_SBYOS; | 295 | val &= ~BM_CLPCR_SBYOS; |
296 | if (cpu_is_imx6sl()) | 296 | if (cpu_is_imx6sl()) |
297 | val |= BM_CLPCR_BYPASS_PMIC_READY; | 297 | val |= BM_CLPCR_BYPASS_PMIC_READY; |
298 | if (cpu_is_imx6sl() || cpu_is_imx6sx()) | 298 | if (cpu_is_imx6sl() || cpu_is_imx6sx() || cpu_is_imx6ul()) |
299 | val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS; | 299 | val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS; |
300 | else | 300 | else |
301 | val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS; | 301 | val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS; |
@@ -310,7 +310,7 @@ int imx6_set_lpm(enum mxc_cpu_pwr_mode mode) | |||
310 | val |= 0x3 << BP_CLPCR_STBY_COUNT; | 310 | val |= 0x3 << BP_CLPCR_STBY_COUNT; |
311 | val |= BM_CLPCR_VSTBY; | 311 | val |= BM_CLPCR_VSTBY; |
312 | val |= BM_CLPCR_SBYOS; | 312 | val |= BM_CLPCR_SBYOS; |
313 | if (cpu_is_imx6sl()) | 313 | if (cpu_is_imx6sl() || cpu_is_imx6sx()) |
314 | val |= BM_CLPCR_BYPASS_PMIC_READY; | 314 | val |= BM_CLPCR_BYPASS_PMIC_READY; |
315 | if (cpu_is_imx6sl() || cpu_is_imx6sx() || cpu_is_imx6ul()) | 315 | if (cpu_is_imx6sl() || cpu_is_imx6sx() || cpu_is_imx6ul()) |
316 | val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS; | 316 | val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS; |
diff --git a/arch/arm/mach-omap2/cm33xx.c b/arch/arm/mach-omap2/cm33xx.c index c073fb57dd13..6f2d0aec0513 100644 --- a/arch/arm/mach-omap2/cm33xx.c +++ b/arch/arm/mach-omap2/cm33xx.c | |||
@@ -220,9 +220,6 @@ static int am33xx_cm_wait_module_ready(u8 part, s16 inst, u16 clkctrl_offs, | |||
220 | { | 220 | { |
221 | int i = 0; | 221 | int i = 0; |
222 | 222 | ||
223 | if (!clkctrl_offs) | ||
224 | return 0; | ||
225 | |||
226 | omap_test_timeout(_is_module_ready(inst, clkctrl_offs), | 223 | omap_test_timeout(_is_module_ready(inst, clkctrl_offs), |
227 | MAX_MODULE_READY_TIME, i); | 224 | MAX_MODULE_READY_TIME, i); |
228 | 225 | ||
@@ -246,9 +243,6 @@ static int am33xx_cm_wait_module_idle(u8 part, s16 inst, u16 clkctrl_offs, | |||
246 | { | 243 | { |
247 | int i = 0; | 244 | int i = 0; |
248 | 245 | ||
249 | if (!clkctrl_offs) | ||
250 | return 0; | ||
251 | |||
252 | omap_test_timeout((_clkctrl_idlest(inst, clkctrl_offs) == | 246 | omap_test_timeout((_clkctrl_idlest(inst, clkctrl_offs) == |
253 | CLKCTRL_IDLEST_DISABLED), | 247 | CLKCTRL_IDLEST_DISABLED), |
254 | MAX_MODULE_READY_TIME, i); | 248 | MAX_MODULE_READY_TIME, i); |
diff --git a/arch/arm/mach-omap2/cminst44xx.c b/arch/arm/mach-omap2/cminst44xx.c index 2c0e07ed6b99..2ab27ade136a 100644 --- a/arch/arm/mach-omap2/cminst44xx.c +++ b/arch/arm/mach-omap2/cminst44xx.c | |||
@@ -278,9 +278,6 @@ static int omap4_cminst_wait_module_ready(u8 part, s16 inst, u16 clkctrl_offs, | |||
278 | { | 278 | { |
279 | int i = 0; | 279 | int i = 0; |
280 | 280 | ||
281 | if (!clkctrl_offs) | ||
282 | return 0; | ||
283 | |||
284 | omap_test_timeout(_is_module_ready(part, inst, clkctrl_offs), | 281 | omap_test_timeout(_is_module_ready(part, inst, clkctrl_offs), |
285 | MAX_MODULE_READY_TIME, i); | 282 | MAX_MODULE_READY_TIME, i); |
286 | 283 | ||
@@ -304,9 +301,6 @@ static int omap4_cminst_wait_module_idle(u8 part, s16 inst, u16 clkctrl_offs, | |||
304 | { | 301 | { |
305 | int i = 0; | 302 | int i = 0; |
306 | 303 | ||
307 | if (!clkctrl_offs) | ||
308 | return 0; | ||
309 | |||
310 | omap_test_timeout((_clkctrl_idlest(part, inst, clkctrl_offs) == | 304 | omap_test_timeout((_clkctrl_idlest(part, inst, clkctrl_offs) == |
311 | CLKCTRL_IDLEST_DISABLED), | 305 | CLKCTRL_IDLEST_DISABLED), |
312 | MAX_MODULE_DISABLE_TIME, i); | 306 | MAX_MODULE_DISABLE_TIME, i); |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 5b709383381c..1052b29697b8 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -1053,6 +1053,10 @@ static int _omap4_wait_target_disable(struct omap_hwmod *oh) | |||
1053 | if (oh->flags & HWMOD_NO_IDLEST) | 1053 | if (oh->flags & HWMOD_NO_IDLEST) |
1054 | return 0; | 1054 | return 0; |
1055 | 1055 | ||
1056 | if (!oh->prcm.omap4.clkctrl_offs && | ||
1057 | !(oh->prcm.omap4.flags & HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET)) | ||
1058 | return 0; | ||
1059 | |||
1056 | return omap_cm_wait_module_idle(oh->clkdm->prcm_partition, | 1060 | return omap_cm_wait_module_idle(oh->clkdm->prcm_partition, |
1057 | oh->clkdm->cm_inst, | 1061 | oh->clkdm->cm_inst, |
1058 | oh->prcm.omap4.clkctrl_offs, 0); | 1062 | oh->prcm.omap4.clkctrl_offs, 0); |
@@ -2971,6 +2975,10 @@ static int _omap4_wait_target_ready(struct omap_hwmod *oh) | |||
2971 | if (!_find_mpu_rt_port(oh)) | 2975 | if (!_find_mpu_rt_port(oh)) |
2972 | return 0; | 2976 | return 0; |
2973 | 2977 | ||
2978 | if (!oh->prcm.omap4.clkctrl_offs && | ||
2979 | !(oh->prcm.omap4.flags & HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET)) | ||
2980 | return 0; | ||
2981 | |||
2974 | /* XXX check module SIDLEMODE, hardreset status */ | 2982 | /* XXX check module SIDLEMODE, hardreset status */ |
2975 | 2983 | ||
2976 | return omap_cm_wait_module_ready(oh->clkdm->prcm_partition, | 2984 | return omap_cm_wait_module_ready(oh->clkdm->prcm_partition, |
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index 4041bad79a9a..78904017f18c 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
@@ -443,8 +443,12 @@ struct omap_hwmod_omap2_prcm { | |||
443 | * HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT: Some IP blocks don't have a PRCM | 443 | * HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT: Some IP blocks don't have a PRCM |
444 | * module-level context loss register associated with them; this | 444 | * module-level context loss register associated with them; this |
445 | * flag bit should be set in those cases | 445 | * flag bit should be set in those cases |
446 | * HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET: Some IP blocks have a valid CLKCTRL | ||
447 | * offset of zero; this flag bit should be set in those cases to | ||
448 | * distinguish from hwmods that have no clkctrl offset. | ||
446 | */ | 449 | */ |
447 | #define HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT (1 << 0) | 450 | #define HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT (1 << 0) |
451 | #define HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET (1 << 1) | ||
448 | 452 | ||
449 | /** | 453 | /** |
450 | * struct omap_hwmod_omap4_prcm - OMAP4-specific PRCM data | 454 | * struct omap_hwmod_omap4_prcm - OMAP4-specific PRCM data |
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c index 55c5878577f4..e2d84aa7f595 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #define CLKCTRL(oh, clkctrl) ((oh).prcm.omap4.clkctrl_offs = (clkctrl)) | 29 | #define CLKCTRL(oh, clkctrl) ((oh).prcm.omap4.clkctrl_offs = (clkctrl)) |
30 | #define RSTCTRL(oh, rstctrl) ((oh).prcm.omap4.rstctrl_offs = (rstctrl)) | 30 | #define RSTCTRL(oh, rstctrl) ((oh).prcm.omap4.rstctrl_offs = (rstctrl)) |
31 | #define RSTST(oh, rstst) ((oh).prcm.omap4.rstst_offs = (rstst)) | 31 | #define RSTST(oh, rstst) ((oh).prcm.omap4.rstst_offs = (rstst)) |
32 | #define PRCM_FLAGS(oh, flag) ((oh).prcm.omap4.flags = (flag)) | ||
32 | 33 | ||
33 | /* | 34 | /* |
34 | * 'l3' class | 35 | * 'l3' class |
@@ -1296,6 +1297,7 @@ static void omap_hwmod_am33xx_clkctrl(void) | |||
1296 | CLKCTRL(am33xx_i2c1_hwmod, AM33XX_CM_WKUP_I2C0_CLKCTRL_OFFSET); | 1297 | CLKCTRL(am33xx_i2c1_hwmod, AM33XX_CM_WKUP_I2C0_CLKCTRL_OFFSET); |
1297 | CLKCTRL(am33xx_wd_timer1_hwmod, AM33XX_CM_WKUP_WDT1_CLKCTRL_OFFSET); | 1298 | CLKCTRL(am33xx_wd_timer1_hwmod, AM33XX_CM_WKUP_WDT1_CLKCTRL_OFFSET); |
1298 | CLKCTRL(am33xx_rtc_hwmod, AM33XX_CM_RTC_RTC_CLKCTRL_OFFSET); | 1299 | CLKCTRL(am33xx_rtc_hwmod, AM33XX_CM_RTC_RTC_CLKCTRL_OFFSET); |
1300 | PRCM_FLAGS(am33xx_rtc_hwmod, HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET); | ||
1299 | CLKCTRL(am33xx_mmc2_hwmod, AM33XX_CM_PER_MMC2_CLKCTRL_OFFSET); | 1301 | CLKCTRL(am33xx_mmc2_hwmod, AM33XX_CM_PER_MMC2_CLKCTRL_OFFSET); |
1300 | CLKCTRL(am33xx_gpmc_hwmod, AM33XX_CM_PER_GPMC_CLKCTRL_OFFSET); | 1302 | CLKCTRL(am33xx_gpmc_hwmod, AM33XX_CM_PER_GPMC_CLKCTRL_OFFSET); |
1301 | CLKCTRL(am33xx_l4_ls_hwmod, AM33XX_CM_PER_L4LS_CLKCTRL_OFFSET); | 1303 | CLKCTRL(am33xx_l4_ls_hwmod, AM33XX_CM_PER_L4LS_CLKCTRL_OFFSET); |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index d72ee6185d5e..1cc4a6f3954e 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -722,8 +722,20 @@ static struct omap_hwmod omap3xxx_dss_dispc_hwmod = { | |||
722 | * display serial interface controller | 722 | * display serial interface controller |
723 | */ | 723 | */ |
724 | 724 | ||
725 | static struct omap_hwmod_class_sysconfig omap3xxx_dsi_sysc = { | ||
726 | .rev_offs = 0x0000, | ||
727 | .sysc_offs = 0x0010, | ||
728 | .syss_offs = 0x0014, | ||
729 | .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY | | ||
730 | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE | | ||
731 | SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS), | ||
732 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), | ||
733 | .sysc_fields = &omap_hwmod_sysc_type1, | ||
734 | }; | ||
735 | |||
725 | static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = { | 736 | static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = { |
726 | .name = "dsi", | 737 | .name = "dsi", |
738 | .sysc = &omap3xxx_dsi_sysc, | ||
727 | }; | 739 | }; |
728 | 740 | ||
729 | static struct omap_hwmod_irq_info omap3xxx_dsi1_irqs[] = { | 741 | static struct omap_hwmod_irq_info omap3xxx_dsi1_irqs[] = { |
diff --git a/arch/arm/mach-pxa/idp.c b/arch/arm/mach-pxa/idp.c index c410d84b243d..66070acaa888 100644 --- a/arch/arm/mach-pxa/idp.c +++ b/arch/arm/mach-pxa/idp.c | |||
@@ -83,7 +83,8 @@ static struct resource smc91x_resources[] = { | |||
83 | }; | 83 | }; |
84 | 84 | ||
85 | static struct smc91x_platdata smc91x_platdata = { | 85 | static struct smc91x_platdata smc91x_platdata = { |
86 | .flags = SMC91X_USE_32BIT | SMC91X_USE_DMA | SMC91X_NOWAIT, | 86 | .flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT | |
87 | SMC91X_USE_DMA | SMC91X_NOWAIT, | ||
87 | }; | 88 | }; |
88 | 89 | ||
89 | static struct platform_device smc91x_device = { | 90 | static struct platform_device smc91x_device = { |
diff --git a/arch/arm/mach-pxa/xcep.c b/arch/arm/mach-pxa/xcep.c index 3f06cd90567a..056369ef250e 100644 --- a/arch/arm/mach-pxa/xcep.c +++ b/arch/arm/mach-pxa/xcep.c | |||
@@ -120,7 +120,8 @@ static struct resource smc91x_resources[] = { | |||
120 | }; | 120 | }; |
121 | 121 | ||
122 | static struct smc91x_platdata xcep_smc91x_info = { | 122 | static struct smc91x_platdata xcep_smc91x_info = { |
123 | .flags = SMC91X_USE_32BIT | SMC91X_NOWAIT | SMC91X_USE_DMA, | 123 | .flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT | |
124 | SMC91X_NOWAIT | SMC91X_USE_DMA, | ||
124 | }; | 125 | }; |
125 | 126 | ||
126 | static struct platform_device smc91x_device = { | 127 | static struct platform_device smc91x_device = { |
diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c index baf174542e36..a0ead0ae23d6 100644 --- a/arch/arm/mach-realview/core.c +++ b/arch/arm/mach-realview/core.c | |||
@@ -93,7 +93,8 @@ static struct smsc911x_platform_config smsc911x_config = { | |||
93 | }; | 93 | }; |
94 | 94 | ||
95 | static struct smc91x_platdata smc91x_platdata = { | 95 | static struct smc91x_platdata smc91x_platdata = { |
96 | .flags = SMC91X_USE_32BIT | SMC91X_NOWAIT, | 96 | .flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT | |
97 | SMC91X_NOWAIT, | ||
97 | }; | 98 | }; |
98 | 99 | ||
99 | static struct platform_device realview_eth_device = { | 100 | static struct platform_device realview_eth_device = { |
diff --git a/arch/arm/mach-sa1100/clock.c b/arch/arm/mach-sa1100/clock.c index cbf53bb9c814..0db46895c82a 100644 --- a/arch/arm/mach-sa1100/clock.c +++ b/arch/arm/mach-sa1100/clock.c | |||
@@ -125,6 +125,8 @@ static unsigned long clk_36864_get_rate(struct clk *clk) | |||
125 | } | 125 | } |
126 | 126 | ||
127 | static struct clkops clk_36864_ops = { | 127 | static struct clkops clk_36864_ops = { |
128 | .enable = clk_cpu_enable, | ||
129 | .disable = clk_cpu_disable, | ||
128 | .get_rate = clk_36864_get_rate, | 130 | .get_rate = clk_36864_get_rate, |
129 | }; | 131 | }; |
130 | 132 | ||
@@ -140,9 +142,8 @@ static struct clk_lookup sa11xx_clkregs[] = { | |||
140 | CLKDEV_INIT(NULL, "OSTIMER0", &clk_36864), | 142 | CLKDEV_INIT(NULL, "OSTIMER0", &clk_36864), |
141 | }; | 143 | }; |
142 | 144 | ||
143 | static int __init sa11xx_clk_init(void) | 145 | int __init sa11xx_clk_init(void) |
144 | { | 146 | { |
145 | clkdev_add_table(sa11xx_clkregs, ARRAY_SIZE(sa11xx_clkregs)); | 147 | clkdev_add_table(sa11xx_clkregs, ARRAY_SIZE(sa11xx_clkregs)); |
146 | return 0; | 148 | return 0; |
147 | } | 149 | } |
148 | core_initcall(sa11xx_clk_init); | ||
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index 345e63f4eb71..3e09beddb6e8 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #include <mach/hardware.h> | 35 | #include <mach/hardware.h> |
36 | #include <mach/irqs.h> | 36 | #include <mach/irqs.h> |
37 | #include <mach/reset.h> | ||
37 | 38 | ||
38 | #include "generic.h" | 39 | #include "generic.h" |
39 | #include <clocksource/pxa.h> | 40 | #include <clocksource/pxa.h> |
@@ -95,6 +96,8 @@ static void sa1100_power_off(void) | |||
95 | 96 | ||
96 | void sa11x0_restart(enum reboot_mode mode, const char *cmd) | 97 | void sa11x0_restart(enum reboot_mode mode, const char *cmd) |
97 | { | 98 | { |
99 | clear_reset_status(RESET_STATUS_ALL); | ||
100 | |||
98 | if (mode == REBOOT_SOFT) { | 101 | if (mode == REBOOT_SOFT) { |
99 | /* Jump into ROM at address 0 */ | 102 | /* Jump into ROM at address 0 */ |
100 | soft_restart(0); | 103 | soft_restart(0); |
@@ -388,6 +391,7 @@ void __init sa1100_init_irq(void) | |||
388 | sa11x0_init_irq_nodt(IRQ_GPIO0_SC, irq_resource.start); | 391 | sa11x0_init_irq_nodt(IRQ_GPIO0_SC, irq_resource.start); |
389 | 392 | ||
390 | sa1100_init_gpio(); | 393 | sa1100_init_gpio(); |
394 | sa11xx_clk_init(); | ||
391 | } | 395 | } |
392 | 396 | ||
393 | /* | 397 | /* |
diff --git a/arch/arm/mach-sa1100/generic.h b/arch/arm/mach-sa1100/generic.h index 0d92e119b36b..68199b603ff7 100644 --- a/arch/arm/mach-sa1100/generic.h +++ b/arch/arm/mach-sa1100/generic.h | |||
@@ -44,3 +44,5 @@ int sa11x0_pm_init(void); | |||
44 | #else | 44 | #else |
45 | static inline int sa11x0_pm_init(void) { return 0; } | 45 | static inline int sa11x0_pm_init(void) { return 0; } |
46 | #endif | 46 | #endif |
47 | |||
48 | int sa11xx_clk_init(void); | ||
diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c index 1525d7b5f1b7..88149f85bc49 100644 --- a/arch/arm/mach-sa1100/pleb.c +++ b/arch/arm/mach-sa1100/pleb.c | |||
@@ -45,7 +45,7 @@ static struct resource smc91x_resources[] = { | |||
45 | }; | 45 | }; |
46 | 46 | ||
47 | static struct smc91x_platdata smc91x_platdata = { | 47 | static struct smc91x_platdata smc91x_platdata = { |
48 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, | 48 | .flags = SMC91X_USE_16BIT | SMC91X_USE_8BIT | SMC91X_NOWAIT, |
49 | }; | 49 | }; |
50 | 50 | ||
51 | static struct platform_device smc91x_device = { | 51 | static struct platform_device smc91x_device = { |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index a7123b4e129d..d00d52c9de3e 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <asm/hwcap.h> | 16 | #include <asm/hwcap.h> |
17 | #include <asm/pgtable-hwdef.h> | 17 | #include <asm/pgtable-hwdef.h> |
18 | #include <asm/pgtable.h> | 18 | #include <asm/pgtable.h> |
19 | #include <asm/memory.h> | ||
19 | 20 | ||
20 | #include "proc-macros.S" | 21 | #include "proc-macros.S" |
21 | 22 | ||
diff --git a/arch/arm64/boot/dts/rockchip/rk3368.dtsi b/arch/arm64/boot/dts/rockchip/rk3368.dtsi index d02a900378e1..4f44d1191bfd 100644 --- a/arch/arm64/boot/dts/rockchip/rk3368.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3368.dtsi | |||
@@ -270,6 +270,8 @@ | |||
270 | #io-channel-cells = <1>; | 270 | #io-channel-cells = <1>; |
271 | clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; | 271 | clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; |
272 | clock-names = "saradc", "apb_pclk"; | 272 | clock-names = "saradc", "apb_pclk"; |
273 | resets = <&cru SRST_SARADC>; | ||
274 | reset-names = "saradc-apb"; | ||
273 | status = "disabled"; | 275 | status = "disabled"; |
274 | }; | 276 | }; |
275 | 277 | ||
diff --git a/arch/arm64/include/asm/percpu.h b/arch/arm64/include/asm/percpu.h index 0a456bef8c79..2fee2f59288c 100644 --- a/arch/arm64/include/asm/percpu.h +++ b/arch/arm64/include/asm/percpu.h | |||
@@ -199,19 +199,19 @@ static inline unsigned long __percpu_xchg(void *ptr, unsigned long val, | |||
199 | #define _percpu_read(pcp) \ | 199 | #define _percpu_read(pcp) \ |
200 | ({ \ | 200 | ({ \ |
201 | typeof(pcp) __retval; \ | 201 | typeof(pcp) __retval; \ |
202 | preempt_disable(); \ | 202 | preempt_disable_notrace(); \ |
203 | __retval = (typeof(pcp))__percpu_read(raw_cpu_ptr(&(pcp)), \ | 203 | __retval = (typeof(pcp))__percpu_read(raw_cpu_ptr(&(pcp)), \ |
204 | sizeof(pcp)); \ | 204 | sizeof(pcp)); \ |
205 | preempt_enable(); \ | 205 | preempt_enable_notrace(); \ |
206 | __retval; \ | 206 | __retval; \ |
207 | }) | 207 | }) |
208 | 208 | ||
209 | #define _percpu_write(pcp, val) \ | 209 | #define _percpu_write(pcp, val) \ |
210 | do { \ | 210 | do { \ |
211 | preempt_disable(); \ | 211 | preempt_disable_notrace(); \ |
212 | __percpu_write(raw_cpu_ptr(&(pcp)), (unsigned long)(val), \ | 212 | __percpu_write(raw_cpu_ptr(&(pcp)), (unsigned long)(val), \ |
213 | sizeof(pcp)); \ | 213 | sizeof(pcp)); \ |
214 | preempt_enable(); \ | 214 | preempt_enable_notrace(); \ |
215 | } while(0) \ | 215 | } while(0) \ |
216 | 216 | ||
217 | #define _pcp_protect(operation, pcp, val) \ | 217 | #define _pcp_protect(operation, pcp, val) \ |
diff --git a/arch/arm64/include/asm/spinlock.h b/arch/arm64/include/asm/spinlock.h index e875a5a551d7..89206b568cd4 100644 --- a/arch/arm64/include/asm/spinlock.h +++ b/arch/arm64/include/asm/spinlock.h | |||
@@ -363,4 +363,14 @@ static inline int arch_read_trylock(arch_rwlock_t *rw) | |||
363 | #define arch_read_relax(lock) cpu_relax() | 363 | #define arch_read_relax(lock) cpu_relax() |
364 | #define arch_write_relax(lock) cpu_relax() | 364 | #define arch_write_relax(lock) cpu_relax() |
365 | 365 | ||
366 | /* | ||
367 | * Accesses appearing in program order before a spin_lock() operation | ||
368 | * can be reordered with accesses inside the critical section, by virtue | ||
369 | * of arch_spin_lock being constructed using acquire semantics. | ||
370 | * | ||
371 | * In cases where this is problematic (e.g. try_to_wake_up), an | ||
372 | * smp_mb__before_spinlock() can restore the required ordering. | ||
373 | */ | ||
374 | #define smp_mb__before_spinlock() smp_mb() | ||
375 | |||
366 | #endif /* __ASM_SPINLOCK_H */ | 376 | #endif /* __ASM_SPINLOCK_H */ |
diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S index 5bb61de23201..9d37e967fa19 100644 --- a/arch/arm64/mm/proc.S +++ b/arch/arm64/mm/proc.S | |||
@@ -100,7 +100,16 @@ ENTRY(cpu_do_resume) | |||
100 | 100 | ||
101 | msr tcr_el1, x8 | 101 | msr tcr_el1, x8 |
102 | msr vbar_el1, x9 | 102 | msr vbar_el1, x9 |
103 | |||
104 | /* | ||
105 | * __cpu_setup() cleared MDSCR_EL1.MDE and friends, before unmasking | ||
106 | * debug exceptions. By restoring MDSCR_EL1 here, we may take a debug | ||
107 | * exception. Mask them until local_dbg_restore() in cpu_suspend() | ||
108 | * resets them. | ||
109 | */ | ||
110 | disable_dbg | ||
103 | msr mdscr_el1, x10 | 111 | msr mdscr_el1, x10 |
112 | |||
104 | msr sctlr_el1, x12 | 113 | msr sctlr_el1, x12 |
105 | /* | 114 | /* |
106 | * Restore oslsr_el1 by writing oslar_el1 | 115 | * Restore oslsr_el1 by writing oslar_el1 |
diff --git a/arch/blackfin/mach-bf561/boards/cm_bf561.c b/arch/blackfin/mach-bf561/boards/cm_bf561.c index c6db52ba3a06..10c57771822d 100644 --- a/arch/blackfin/mach-bf561/boards/cm_bf561.c +++ b/arch/blackfin/mach-bf561/boards/cm_bf561.c | |||
@@ -146,7 +146,8 @@ static struct platform_device hitachi_fb_device = { | |||
146 | #include <linux/smc91x.h> | 146 | #include <linux/smc91x.h> |
147 | 147 | ||
148 | static struct smc91x_platdata smc91x_info = { | 148 | static struct smc91x_platdata smc91x_info = { |
149 | .flags = SMC91X_USE_32BIT | SMC91X_NOWAIT, | 149 | .flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT | |
150 | SMC91X_NOWAIT, | ||
150 | .leda = RPC_LED_100_10, | 151 | .leda = RPC_LED_100_10, |
151 | .ledb = RPC_LED_TX_RX, | 152 | .ledb = RPC_LED_TX_RX, |
152 | }; | 153 | }; |
diff --git a/arch/blackfin/mach-bf561/boards/ezkit.c b/arch/blackfin/mach-bf561/boards/ezkit.c index f35525b55819..57d1c43726d9 100644 --- a/arch/blackfin/mach-bf561/boards/ezkit.c +++ b/arch/blackfin/mach-bf561/boards/ezkit.c | |||
@@ -134,7 +134,8 @@ static struct platform_device net2272_bfin_device = { | |||
134 | #include <linux/smc91x.h> | 134 | #include <linux/smc91x.h> |
135 | 135 | ||
136 | static struct smc91x_platdata smc91x_info = { | 136 | static struct smc91x_platdata smc91x_info = { |
137 | .flags = SMC91X_USE_32BIT | SMC91X_NOWAIT, | 137 | .flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT | |
138 | SMC91X_NOWAIT, | ||
138 | .leda = RPC_LED_100_10, | 139 | .leda = RPC_LED_100_10, |
139 | .ledb = RPC_LED_TX_RX, | 140 | .ledb = RPC_LED_TX_RX, |
140 | }; | 141 | }; |
diff --git a/arch/ia64/include/asm/uaccess.h b/arch/ia64/include/asm/uaccess.h index 465c70982f40..0472927ebb9b 100644 --- a/arch/ia64/include/asm/uaccess.h +++ b/arch/ia64/include/asm/uaccess.h | |||
@@ -241,8 +241,7 @@ extern unsigned long __must_check __copy_user (void __user *to, const void __use | |||
241 | static inline unsigned long | 241 | static inline unsigned long |
242 | __copy_to_user (void __user *to, const void *from, unsigned long count) | 242 | __copy_to_user (void __user *to, const void *from, unsigned long count) |
243 | { | 243 | { |
244 | if (!__builtin_constant_p(count)) | 244 | check_object_size(from, count, true); |
245 | check_object_size(from, count, true); | ||
246 | 245 | ||
247 | return __copy_user(to, (__force void __user *) from, count); | 246 | return __copy_user(to, (__force void __user *) from, count); |
248 | } | 247 | } |
@@ -250,8 +249,7 @@ __copy_to_user (void __user *to, const void *from, unsigned long count) | |||
250 | static inline unsigned long | 249 | static inline unsigned long |
251 | __copy_from_user (void *to, const void __user *from, unsigned long count) | 250 | __copy_from_user (void *to, const void __user *from, unsigned long count) |
252 | { | 251 | { |
253 | if (!__builtin_constant_p(count)) | 252 | check_object_size(to, count, false); |
254 | check_object_size(to, count, false); | ||
255 | 253 | ||
256 | return __copy_user((__force void __user *) to, from, count); | 254 | return __copy_user((__force void __user *) to, from, count); |
257 | } | 255 | } |
@@ -265,8 +263,7 @@ __copy_from_user (void *to, const void __user *from, unsigned long count) | |||
265 | long __cu_len = (n); \ | 263 | long __cu_len = (n); \ |
266 | \ | 264 | \ |
267 | if (__access_ok(__cu_to, __cu_len, get_fs())) { \ | 265 | if (__access_ok(__cu_to, __cu_len, get_fs())) { \ |
268 | if (!__builtin_constant_p(n)) \ | 266 | check_object_size(__cu_from, __cu_len, true); \ |
269 | check_object_size(__cu_from, __cu_len, true); \ | ||
270 | __cu_len = __copy_user(__cu_to, (__force void __user *) __cu_from, __cu_len); \ | 267 | __cu_len = __copy_user(__cu_to, (__force void __user *) __cu_from, __cu_len); \ |
271 | } \ | 268 | } \ |
272 | __cu_len; \ | 269 | __cu_len; \ |
@@ -280,8 +277,7 @@ __copy_from_user (void *to, const void __user *from, unsigned long count) | |||
280 | \ | 277 | \ |
281 | __chk_user_ptr(__cu_from); \ | 278 | __chk_user_ptr(__cu_from); \ |
282 | if (__access_ok(__cu_from, __cu_len, get_fs())) { \ | 279 | if (__access_ok(__cu_from, __cu_len, get_fs())) { \ |
283 | if (!__builtin_constant_p(n)) \ | 280 | check_object_size(__cu_to, __cu_len, false); \ |
284 | check_object_size(__cu_to, __cu_len, false); \ | ||
285 | __cu_len = __copy_user((__force void __user *) __cu_to, __cu_from, __cu_len); \ | 281 | __cu_len = __copy_user((__force void __user *) __cu_to, __cu_from, __cu_len); \ |
286 | } \ | 282 | } \ |
287 | __cu_len; \ | 283 | __cu_len; \ |
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index cd8778103165..af12c2db9bb8 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
@@ -1,6 +1,5 @@ | |||
1 | config PARISC | 1 | config PARISC |
2 | def_bool y | 2 | def_bool y |
3 | select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS | ||
4 | select ARCH_MIGHT_HAVE_PC_PARPORT | 3 | select ARCH_MIGHT_HAVE_PC_PARPORT |
5 | select HAVE_IDE | 4 | select HAVE_IDE |
6 | select HAVE_OPROFILE | 5 | select HAVE_OPROFILE |
diff --git a/arch/parisc/configs/c8000_defconfig b/arch/parisc/configs/c8000_defconfig index 1a8f6f95689e..f6a4c016304b 100644 --- a/arch/parisc/configs/c8000_defconfig +++ b/arch/parisc/configs/c8000_defconfig | |||
@@ -245,7 +245,6 @@ CONFIG_DEBUG_RT_MUTEXES=y | |||
245 | CONFIG_PROVE_RCU_DELAY=y | 245 | CONFIG_PROVE_RCU_DELAY=y |
246 | CONFIG_DEBUG_BLOCK_EXT_DEVT=y | 246 | CONFIG_DEBUG_BLOCK_EXT_DEVT=y |
247 | CONFIG_LATENCYTOP=y | 247 | CONFIG_LATENCYTOP=y |
248 | CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y | ||
249 | CONFIG_KEYS=y | 248 | CONFIG_KEYS=y |
250 | # CONFIG_CRYPTO_HW is not set | 249 | # CONFIG_CRYPTO_HW is not set |
251 | CONFIG_FONTS=y | 250 | CONFIG_FONTS=y |
diff --git a/arch/parisc/configs/generic-64bit_defconfig b/arch/parisc/configs/generic-64bit_defconfig index 7e0792658952..c564e6e1fa23 100644 --- a/arch/parisc/configs/generic-64bit_defconfig +++ b/arch/parisc/configs/generic-64bit_defconfig | |||
@@ -291,7 +291,6 @@ CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y | |||
291 | CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y | 291 | CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y |
292 | # CONFIG_SCHED_DEBUG is not set | 292 | # CONFIG_SCHED_DEBUG is not set |
293 | CONFIG_TIMER_STATS=y | 293 | CONFIG_TIMER_STATS=y |
294 | CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y | ||
295 | CONFIG_CRYPTO_MANAGER=y | 294 | CONFIG_CRYPTO_MANAGER=y |
296 | CONFIG_CRYPTO_ECB=m | 295 | CONFIG_CRYPTO_ECB=m |
297 | CONFIG_CRYPTO_PCBC=m | 296 | CONFIG_CRYPTO_PCBC=m |
diff --git a/arch/parisc/include/asm/uaccess.h b/arch/parisc/include/asm/uaccess.h index 0f59fd9ca205..e9150487e20d 100644 --- a/arch/parisc/include/asm/uaccess.h +++ b/arch/parisc/include/asm/uaccess.h | |||
@@ -208,13 +208,13 @@ unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned lo | |||
208 | #define __copy_to_user_inatomic __copy_to_user | 208 | #define __copy_to_user_inatomic __copy_to_user |
209 | #define __copy_from_user_inatomic __copy_from_user | 209 | #define __copy_from_user_inatomic __copy_from_user |
210 | 210 | ||
211 | extern void copy_from_user_overflow(void) | 211 | extern void __compiletime_error("usercopy buffer size is too small") |
212 | #ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS | 212 | __bad_copy_user(void); |
213 | __compiletime_error("copy_from_user() buffer size is not provably correct") | 213 | |
214 | #else | 214 | static inline void copy_user_overflow(int size, unsigned long count) |
215 | __compiletime_warning("copy_from_user() buffer size is not provably correct") | 215 | { |
216 | #endif | 216 | WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count); |
217 | ; | 217 | } |
218 | 218 | ||
219 | static inline unsigned long __must_check copy_from_user(void *to, | 219 | static inline unsigned long __must_check copy_from_user(void *to, |
220 | const void __user *from, | 220 | const void __user *from, |
@@ -223,10 +223,12 @@ static inline unsigned long __must_check copy_from_user(void *to, | |||
223 | int sz = __compiletime_object_size(to); | 223 | int sz = __compiletime_object_size(to); |
224 | int ret = -EFAULT; | 224 | int ret = -EFAULT; |
225 | 225 | ||
226 | if (likely(sz == -1 || !__builtin_constant_p(n) || sz >= n)) | 226 | if (likely(sz == -1 || sz >= n)) |
227 | ret = __copy_from_user(to, from, n); | 227 | ret = __copy_from_user(to, from, n); |
228 | else | 228 | else if (!__builtin_constant_p(n)) |
229 | copy_from_user_overflow(); | 229 | copy_user_overflow(sz, n); |
230 | else | ||
231 | __bad_copy_user(); | ||
230 | 232 | ||
231 | return ret; | 233 | return ret; |
232 | } | 234 | } |
diff --git a/arch/powerpc/include/asm/cputhreads.h b/arch/powerpc/include/asm/cputhreads.h index 666bef4ebfae..9377bdf42eb8 100644 --- a/arch/powerpc/include/asm/cputhreads.h +++ b/arch/powerpc/include/asm/cputhreads.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ |
5 | #include <linux/cpumask.h> | 5 | #include <linux/cpumask.h> |
6 | #include <asm/cpu_has_feature.h> | ||
6 | 7 | ||
7 | /* | 8 | /* |
8 | * Mapping of threads to cores | 9 | * Mapping of threads to cores |
diff --git a/arch/powerpc/include/asm/hmi.h b/arch/powerpc/include/asm/hmi.h index 88b4901ac4ee..85b7a1a21e22 100644 --- a/arch/powerpc/include/asm/hmi.h +++ b/arch/powerpc/include/asm/hmi.h | |||
@@ -21,7 +21,7 @@ | |||
21 | #ifndef __ASM_PPC64_HMI_H__ | 21 | #ifndef __ASM_PPC64_HMI_H__ |
22 | #define __ASM_PPC64_HMI_H__ | 22 | #define __ASM_PPC64_HMI_H__ |
23 | 23 | ||
24 | #ifdef CONFIG_PPC_BOOK3S_64 | 24 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
25 | 25 | ||
26 | #define CORE_TB_RESYNC_REQ_BIT 63 | 26 | #define CORE_TB_RESYNC_REQ_BIT 63 |
27 | #define MAX_SUBCORE_PER_CORE 4 | 27 | #define MAX_SUBCORE_PER_CORE 4 |
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h index 148303e7771f..6a6792bb39fb 100644 --- a/arch/powerpc/include/asm/paca.h +++ b/arch/powerpc/include/asm/paca.h | |||
@@ -183,11 +183,6 @@ struct paca_struct { | |||
183 | */ | 183 | */ |
184 | u16 in_mce; | 184 | u16 in_mce; |
185 | u8 hmi_event_available; /* HMI event is available */ | 185 | u8 hmi_event_available; /* HMI event is available */ |
186 | /* | ||
187 | * Bitmap for sibling subcore status. See kvm/book3s_hv_ras.c for | ||
188 | * more details | ||
189 | */ | ||
190 | struct sibling_subcore_state *sibling_subcore_state; | ||
191 | #endif | 186 | #endif |
192 | 187 | ||
193 | /* Stuff for accurate time accounting */ | 188 | /* Stuff for accurate time accounting */ |
@@ -202,6 +197,13 @@ struct paca_struct { | |||
202 | struct kvmppc_book3s_shadow_vcpu shadow_vcpu; | 197 | struct kvmppc_book3s_shadow_vcpu shadow_vcpu; |
203 | #endif | 198 | #endif |
204 | struct kvmppc_host_state kvm_hstate; | 199 | struct kvmppc_host_state kvm_hstate; |
200 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | ||
201 | /* | ||
202 | * Bitmap for sibling subcore status. See kvm/book3s_hv_ras.c for | ||
203 | * more details | ||
204 | */ | ||
205 | struct sibling_subcore_state *sibling_subcore_state; | ||
206 | #endif | ||
205 | #endif | 207 | #endif |
206 | }; | 208 | }; |
207 | 209 | ||
diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h index b5e88e4a171a..c0309c59bed8 100644 --- a/arch/powerpc/include/asm/pci-bridge.h +++ b/arch/powerpc/include/asm/pci-bridge.h | |||
@@ -301,6 +301,7 @@ extern void pci_process_bridge_OF_ranges(struct pci_controller *hose, | |||
301 | /* Allocate & free a PCI host bridge structure */ | 301 | /* Allocate & free a PCI host bridge structure */ |
302 | extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev); | 302 | extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev); |
303 | extern void pcibios_free_controller(struct pci_controller *phb); | 303 | extern void pcibios_free_controller(struct pci_controller *phb); |
304 | extern void pcibios_free_controller_deferred(struct pci_host_bridge *bridge); | ||
304 | 305 | ||
305 | #ifdef CONFIG_PCI | 306 | #ifdef CONFIG_PCI |
306 | extern int pcibios_vaddr_is_ioport(void __iomem *address); | 307 | extern int pcibios_vaddr_is_ioport(void __iomem *address); |
diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h index c1dc6c14deb8..f1e382498bbb 100644 --- a/arch/powerpc/include/asm/uaccess.h +++ b/arch/powerpc/include/asm/uaccess.h | |||
@@ -311,14 +311,12 @@ static inline unsigned long copy_from_user(void *to, | |||
311 | unsigned long over; | 311 | unsigned long over; |
312 | 312 | ||
313 | if (access_ok(VERIFY_READ, from, n)) { | 313 | if (access_ok(VERIFY_READ, from, n)) { |
314 | if (!__builtin_constant_p(n)) | 314 | check_object_size(to, n, false); |
315 | check_object_size(to, n, false); | ||
316 | return __copy_tofrom_user((__force void __user *)to, from, n); | 315 | return __copy_tofrom_user((__force void __user *)to, from, n); |
317 | } | 316 | } |
318 | if ((unsigned long)from < TASK_SIZE) { | 317 | if ((unsigned long)from < TASK_SIZE) { |
319 | over = (unsigned long)from + n - TASK_SIZE; | 318 | over = (unsigned long)from + n - TASK_SIZE; |
320 | if (!__builtin_constant_p(n - over)) | 319 | check_object_size(to, n - over, false); |
321 | check_object_size(to, n - over, false); | ||
322 | return __copy_tofrom_user((__force void __user *)to, from, | 320 | return __copy_tofrom_user((__force void __user *)to, from, |
323 | n - over) + over; | 321 | n - over) + over; |
324 | } | 322 | } |
@@ -331,14 +329,12 @@ static inline unsigned long copy_to_user(void __user *to, | |||
331 | unsigned long over; | 329 | unsigned long over; |
332 | 330 | ||
333 | if (access_ok(VERIFY_WRITE, to, n)) { | 331 | if (access_ok(VERIFY_WRITE, to, n)) { |
334 | if (!__builtin_constant_p(n)) | 332 | check_object_size(from, n, true); |
335 | check_object_size(from, n, true); | ||
336 | return __copy_tofrom_user(to, (__force void __user *)from, n); | 333 | return __copy_tofrom_user(to, (__force void __user *)from, n); |
337 | } | 334 | } |
338 | if ((unsigned long)to < TASK_SIZE) { | 335 | if ((unsigned long)to < TASK_SIZE) { |
339 | over = (unsigned long)to + n - TASK_SIZE; | 336 | over = (unsigned long)to + n - TASK_SIZE; |
340 | if (!__builtin_constant_p(n)) | 337 | check_object_size(from, n - over, true); |
341 | check_object_size(from, n - over, true); | ||
342 | return __copy_tofrom_user(to, (__force void __user *)from, | 338 | return __copy_tofrom_user(to, (__force void __user *)from, |
343 | n - over) + over; | 339 | n - over) + over; |
344 | } | 340 | } |
@@ -383,8 +379,7 @@ static inline unsigned long __copy_from_user_inatomic(void *to, | |||
383 | return 0; | 379 | return 0; |
384 | } | 380 | } |
385 | 381 | ||
386 | if (!__builtin_constant_p(n)) | 382 | check_object_size(to, n, false); |
387 | check_object_size(to, n, false); | ||
388 | 383 | ||
389 | return __copy_tofrom_user((__force void __user *)to, from, n); | 384 | return __copy_tofrom_user((__force void __user *)to, from, n); |
390 | } | 385 | } |
@@ -412,8 +407,8 @@ static inline unsigned long __copy_to_user_inatomic(void __user *to, | |||
412 | if (ret == 0) | 407 | if (ret == 0) |
413 | return 0; | 408 | return 0; |
414 | } | 409 | } |
415 | if (!__builtin_constant_p(n)) | 410 | |
416 | check_object_size(from, n, true); | 411 | check_object_size(from, n, true); |
417 | 412 | ||
418 | return __copy_tofrom_user(to, (__force const void __user *)from, n); | 413 | return __copy_tofrom_user(to, (__force const void __user *)from, n); |
419 | } | 414 | } |
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index b2027a5cf508..fe4c075bcf50 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -41,7 +41,7 @@ obj-$(CONFIG_VDSO32) += vdso32/ | |||
41 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o | 41 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o |
42 | obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o | 42 | obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o |
43 | obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_power.o | 43 | obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_power.o |
44 | obj-$(CONFIG_PPC_BOOK3S_64) += mce.o mce_power.o hmi.o | 44 | obj-$(CONFIG_PPC_BOOK3S_64) += mce.o mce_power.o |
45 | obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o idle_book3e.o | 45 | obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o idle_book3e.o |
46 | obj-$(CONFIG_PPC64) += vdso64/ | 46 | obj-$(CONFIG_PPC64) += vdso64/ |
47 | obj-$(CONFIG_ALTIVEC) += vecemu.o | 47 | obj-$(CONFIG_ALTIVEC) += vecemu.o |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 6b8bc0dd09d4..5afd03e5e8b8 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -368,13 +368,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) | |||
368 | tabort_syscall: | 368 | tabort_syscall: |
369 | /* Firstly we need to enable TM in the kernel */ | 369 | /* Firstly we need to enable TM in the kernel */ |
370 | mfmsr r10 | 370 | mfmsr r10 |
371 | li r13, 1 | 371 | li r9, 1 |
372 | rldimi r10, r13, MSR_TM_LG, 63-MSR_TM_LG | 372 | rldimi r10, r9, MSR_TM_LG, 63-MSR_TM_LG |
373 | mtmsrd r10, 0 | 373 | mtmsrd r10, 0 |
374 | 374 | ||
375 | /* tabort, this dooms the transaction, nothing else */ | 375 | /* tabort, this dooms the transaction, nothing else */ |
376 | li r13, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT) | 376 | li r9, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT) |
377 | TABORT(R13) | 377 | TABORT(R9) |
378 | 378 | ||
379 | /* | 379 | /* |
380 | * Return directly to userspace. We have corrupted user register state, | 380 | * Return directly to userspace. We have corrupted user register state, |
@@ -382,8 +382,8 @@ tabort_syscall: | |||
382 | * resume after the tbegin of the aborted transaction with the | 382 | * resume after the tbegin of the aborted transaction with the |
383 | * checkpointed register state. | 383 | * checkpointed register state. |
384 | */ | 384 | */ |
385 | li r13, MSR_RI | 385 | li r9, MSR_RI |
386 | andc r10, r10, r13 | 386 | andc r10, r10, r9 |
387 | mtmsrd r10, 1 | 387 | mtmsrd r10, 1 |
388 | mtspr SPRN_SRR0, r11 | 388 | mtspr SPRN_SRR0, r11 |
389 | mtspr SPRN_SRR1, r12 | 389 | mtspr SPRN_SRR1, r12 |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index df6d45eb4115..bffec73dbffc 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -485,7 +485,23 @@ machine_check_fwnmi: | |||
485 | EXCEPTION_PROLOG_0(PACA_EXMC) | 485 | EXCEPTION_PROLOG_0(PACA_EXMC) |
486 | machine_check_pSeries_0: | 486 | machine_check_pSeries_0: |
487 | EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200) | 487 | EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200) |
488 | EXCEPTION_PROLOG_PSERIES_1(machine_check_common, EXC_STD) | 488 | /* |
489 | * The following is essentially EXCEPTION_PROLOG_PSERIES_1 with the | ||
490 | * difference that MSR_RI is not enabled, because PACA_EXMC is being | ||
491 | * used, so nested machine check corrupts it. machine_check_common | ||
492 | * enables MSR_RI. | ||
493 | */ | ||
494 | ld r12,PACAKBASE(r13) | ||
495 | ld r10,PACAKMSR(r13) | ||
496 | xori r10,r10,MSR_RI | ||
497 | mfspr r11,SPRN_SRR0 | ||
498 | LOAD_HANDLER(r12, machine_check_common) | ||
499 | mtspr SPRN_SRR0,r12 | ||
500 | mfspr r12,SPRN_SRR1 | ||
501 | mtspr SPRN_SRR1,r10 | ||
502 | rfid | ||
503 | b . /* prevent speculative execution */ | ||
504 | |||
489 | KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200) | 505 | KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200) |
490 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300) | 506 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300) |
491 | KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380) | 507 | KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380) |
@@ -969,14 +985,17 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX) | |||
969 | machine_check_common: | 985 | machine_check_common: |
970 | 986 | ||
971 | mfspr r10,SPRN_DAR | 987 | mfspr r10,SPRN_DAR |
972 | std r10,PACA_EXGEN+EX_DAR(r13) | 988 | std r10,PACA_EXMC+EX_DAR(r13) |
973 | mfspr r10,SPRN_DSISR | 989 | mfspr r10,SPRN_DSISR |
974 | stw r10,PACA_EXGEN+EX_DSISR(r13) | 990 | stw r10,PACA_EXMC+EX_DSISR(r13) |
975 | EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC) | 991 | EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC) |
976 | FINISH_NAP | 992 | FINISH_NAP |
977 | RECONCILE_IRQ_STATE(r10, r11) | 993 | RECONCILE_IRQ_STATE(r10, r11) |
978 | ld r3,PACA_EXGEN+EX_DAR(r13) | 994 | ld r3,PACA_EXMC+EX_DAR(r13) |
979 | lwz r4,PACA_EXGEN+EX_DSISR(r13) | 995 | lwz r4,PACA_EXMC+EX_DSISR(r13) |
996 | /* Enable MSR_RI when finished with PACA_EXMC */ | ||
997 | li r10,MSR_RI | ||
998 | mtmsrd r10,1 | ||
980 | std r3,_DAR(r1) | 999 | std r3,_DAR(r1) |
981 | std r4,_DSISR(r1) | 1000 | std r4,_DSISR(r1) |
982 | bl save_nvgprs | 1001 | bl save_nvgprs |
diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c index 3ed8ec09b5c9..e785cc9e1ecd 100644 --- a/arch/powerpc/kernel/kprobes.c +++ b/arch/powerpc/kernel/kprobes.c | |||
@@ -29,7 +29,7 @@ | |||
29 | #include <linux/kprobes.h> | 29 | #include <linux/kprobes.h> |
30 | #include <linux/ptrace.h> | 30 | #include <linux/ptrace.h> |
31 | #include <linux/preempt.h> | 31 | #include <linux/preempt.h> |
32 | #include <linux/module.h> | 32 | #include <linux/extable.h> |
33 | #include <linux/kdebug.h> | 33 | #include <linux/kdebug.h> |
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include <asm/code-patching.h> | 35 | #include <asm/code-patching.h> |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 7fdf324d5b51..e58908066b0e 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -154,6 +154,42 @@ void pcibios_free_controller(struct pci_controller *phb) | |||
154 | EXPORT_SYMBOL_GPL(pcibios_free_controller); | 154 | EXPORT_SYMBOL_GPL(pcibios_free_controller); |
155 | 155 | ||
156 | /* | 156 | /* |
157 | * This function is used to call pcibios_free_controller() | ||
158 | * in a deferred manner: a callback from the PCI subsystem. | ||
159 | * | ||
160 | * _*DO NOT*_ call pcibios_free_controller() explicitly if | ||
161 | * this is used (or it may access an invalid *phb pointer). | ||
162 | * | ||
163 | * The callback occurs when all references to the root bus | ||
164 | * are dropped (e.g., child buses/devices and their users). | ||
165 | * | ||
166 | * It's called as .release_fn() of 'struct pci_host_bridge' | ||
167 | * which is associated with the 'struct pci_controller.bus' | ||
168 | * (root bus) - it expects .release_data to hold a pointer | ||
169 | * to 'struct pci_controller'. | ||
170 | * | ||
171 | * In order to use it, register .release_fn()/release_data | ||
172 | * like this: | ||
173 | * | ||
174 | * pci_set_host_bridge_release(bridge, | ||
175 | * pcibios_free_controller_deferred | ||
176 | * (void *) phb); | ||
177 | * | ||
178 | * e.g. in the pcibios_root_bridge_prepare() callback from | ||
179 | * pci_create_root_bus(). | ||
180 | */ | ||
181 | void pcibios_free_controller_deferred(struct pci_host_bridge *bridge) | ||
182 | { | ||
183 | struct pci_controller *phb = (struct pci_controller *) | ||
184 | bridge->release_data; | ||
185 | |||
186 | pr_debug("domain %d, dynamic %d\n", phb->global_number, phb->is_dynamic); | ||
187 | |||
188 | pcibios_free_controller(phb); | ||
189 | } | ||
190 | EXPORT_SYMBOL_GPL(pcibios_free_controller_deferred); | ||
191 | |||
192 | /* | ||
157 | * The function is used to return the minimal alignment | 193 | * The function is used to return the minimal alignment |
158 | * for memory or I/O windows of the associated P2P bridge. | 194 | * for memory or I/O windows of the associated P2P bridge. |
159 | * By default, 4KiB alignment for I/O windows and 1MiB for | 195 | * By default, 4KiB alignment for I/O windows and 1MiB for |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 4e74fc588a3f..d3eff99e938c 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -695,7 +695,7 @@ unsigned char ibm_architecture_vec[] = { | |||
695 | OV4_MIN_ENT_CAP, /* minimum VP entitled capacity */ | 695 | OV4_MIN_ENT_CAP, /* minimum VP entitled capacity */ |
696 | 696 | ||
697 | /* option vector 5: PAPR/OF options */ | 697 | /* option vector 5: PAPR/OF options */ |
698 | VECTOR_LENGTH(18), /* length */ | 698 | VECTOR_LENGTH(21), /* length */ |
699 | 0, /* don't ignore, don't halt */ | 699 | 0, /* don't ignore, don't halt */ |
700 | OV5_FEAT(OV5_LPAR) | OV5_FEAT(OV5_SPLPAR) | OV5_FEAT(OV5_LARGE_PAGES) | | 700 | OV5_FEAT(OV5_LPAR) | OV5_FEAT(OV5_SPLPAR) | OV5_FEAT(OV5_LARGE_PAGES) | |
701 | OV5_FEAT(OV5_DRCONF_MEMORY) | OV5_FEAT(OV5_DONATE_DEDICATE_CPU) | | 701 | OV5_FEAT(OV5_DRCONF_MEMORY) | OV5_FEAT(OV5_DONATE_DEDICATE_CPU) | |
@@ -726,8 +726,11 @@ unsigned char ibm_architecture_vec[] = { | |||
726 | 0, | 726 | 0, |
727 | 0, | 727 | 0, |
728 | OV5_FEAT(OV5_PFO_HW_RNG) | OV5_FEAT(OV5_PFO_HW_ENCR) | | 728 | OV5_FEAT(OV5_PFO_HW_RNG) | OV5_FEAT(OV5_PFO_HW_ENCR) | |
729 | OV5_FEAT(OV5_PFO_HW_842), | 729 | OV5_FEAT(OV5_PFO_HW_842), /* Byte 17 */ |
730 | OV5_FEAT(OV5_SUB_PROCESSORS), | 730 | 0, /* Byte 18 */ |
731 | 0, /* Byte 19 */ | ||
732 | 0, /* Byte 20 */ | ||
733 | OV5_FEAT(OV5_SUB_PROCESSORS), /* Byte 21 */ | ||
731 | 734 | ||
732 | /* option vector 6: IBM PAPR hints */ | 735 | /* option vector 6: IBM PAPR hints */ |
733 | VECTOR_LENGTH(3), /* length */ | 736 | VECTOR_LENGTH(3), /* length */ |
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index b6aa378aff63..a7daf749b97f 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
@@ -1226,7 +1226,21 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8, | |||
1226 | (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16); | 1226 | (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16); |
1227 | if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf))) | 1227 | if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf))) |
1228 | goto bad; | 1228 | goto bad; |
1229 | |||
1229 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | 1230 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
1231 | /* | ||
1232 | * If there is a transactional state then throw it away. | ||
1233 | * The purpose of a sigreturn is to destroy all traces of the | ||
1234 | * signal frame, this includes any transactional state created | ||
1235 | * within in. We only check for suspended as we can never be | ||
1236 | * active in the kernel, we are active, there is nothing better to | ||
1237 | * do than go ahead and Bad Thing later. | ||
1238 | * The cause is not important as there will never be a | ||
1239 | * recheckpoint so it's not user visible. | ||
1240 | */ | ||
1241 | if (MSR_TM_SUSPENDED(mfmsr())) | ||
1242 | tm_reclaim_current(0); | ||
1243 | |||
1230 | if (__get_user(tmp, &rt_sf->uc.uc_link)) | 1244 | if (__get_user(tmp, &rt_sf->uc.uc_link)) |
1231 | goto bad; | 1245 | goto bad; |
1232 | uc_transact = (struct ucontext __user *)(uintptr_t)tmp; | 1246 | uc_transact = (struct ucontext __user *)(uintptr_t)tmp; |
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index 7e49984d4331..70409bb90a95 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
@@ -676,7 +676,21 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5, | |||
676 | if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set))) | 676 | if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set))) |
677 | goto badframe; | 677 | goto badframe; |
678 | set_current_blocked(&set); | 678 | set_current_blocked(&set); |
679 | |||
679 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | 680 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
681 | /* | ||
682 | * If there is a transactional state then throw it away. | ||
683 | * The purpose of a sigreturn is to destroy all traces of the | ||
684 | * signal frame, this includes any transactional state created | ||
685 | * within in. We only check for suspended as we can never be | ||
686 | * active in the kernel, we are active, there is nothing better to | ||
687 | * do than go ahead and Bad Thing later. | ||
688 | * The cause is not important as there will never be a | ||
689 | * recheckpoint so it's not user visible. | ||
690 | */ | ||
691 | if (MSR_TM_SUSPENDED(mfmsr())) | ||
692 | tm_reclaim_current(0); | ||
693 | |||
680 | if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR])) | 694 | if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR])) |
681 | goto badframe; | 695 | goto badframe; |
682 | if (MSR_TM_ACTIVE(msr)) { | 696 | if (MSR_TM_ACTIVE(msr)) { |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 25a39052bf6b..9c6f3fd58059 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -830,7 +830,7 @@ int __cpu_disable(void) | |||
830 | 830 | ||
831 | /* Update sibling maps */ | 831 | /* Update sibling maps */ |
832 | base = cpu_first_thread_sibling(cpu); | 832 | base = cpu_first_thread_sibling(cpu); |
833 | for (i = 0; i < threads_per_core; i++) { | 833 | for (i = 0; i < threads_per_core && base + i < nr_cpu_ids; i++) { |
834 | cpumask_clear_cpu(cpu, cpu_sibling_mask(base + i)); | 834 | cpumask_clear_cpu(cpu, cpu_sibling_mask(base + i)); |
835 | cpumask_clear_cpu(base + i, cpu_sibling_mask(cpu)); | 835 | cpumask_clear_cpu(base + i, cpu_sibling_mask(cpu)); |
836 | cpumask_clear_cpu(cpu, cpu_core_mask(base + i)); | 836 | cpumask_clear_cpu(cpu, cpu_core_mask(base + i)); |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 2cb589264cb7..62859ebe0062 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -25,7 +25,8 @@ | |||
25 | #include <linux/user.h> | 25 | #include <linux/user.h> |
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
28 | #include <linux/module.h> | 28 | #include <linux/extable.h> |
29 | #include <linux/module.h> /* print_modules */ | ||
29 | #include <linux/prctl.h> | 30 | #include <linux/prctl.h> |
30 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
31 | #include <linux/kprobes.h> | 32 | #include <linux/kprobes.h> |
diff --git a/arch/powerpc/kvm/Makefile b/arch/powerpc/kvm/Makefile index 1f9e5529e692..855d4b95d752 100644 --- a/arch/powerpc/kvm/Makefile +++ b/arch/powerpc/kvm/Makefile | |||
@@ -78,6 +78,7 @@ kvm-book3s_64-builtin-xics-objs-$(CONFIG_KVM_XICS) := \ | |||
78 | 78 | ||
79 | ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | 79 | ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
80 | kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) += \ | 80 | kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) += \ |
81 | book3s_hv_hmi.o \ | ||
81 | book3s_hv_rmhandlers.o \ | 82 | book3s_hv_rmhandlers.o \ |
82 | book3s_hv_rm_mmu.o \ | 83 | book3s_hv_rm_mmu.o \ |
83 | book3s_hv_ras.o \ | 84 | book3s_hv_ras.o \ |
diff --git a/arch/powerpc/kernel/hmi.c b/arch/powerpc/kvm/book3s_hv_hmi.c index e3f738eb1cac..e3f738eb1cac 100644 --- a/arch/powerpc/kernel/hmi.c +++ b/arch/powerpc/kvm/book3s_hv_hmi.c | |||
diff --git a/arch/powerpc/lib/checksum_32.S b/arch/powerpc/lib/checksum_32.S index 0a57fe6d49cc..aa8214f30c92 100644 --- a/arch/powerpc/lib/checksum_32.S +++ b/arch/powerpc/lib/checksum_32.S | |||
@@ -127,18 +127,19 @@ _GLOBAL(csum_partial_copy_generic) | |||
127 | stw r7,12(r1) | 127 | stw r7,12(r1) |
128 | stw r8,8(r1) | 128 | stw r8,8(r1) |
129 | 129 | ||
130 | rlwinm r0,r4,3,0x8 | ||
131 | rlwnm r6,r6,r0,0,31 /* odd destination address: rotate one byte */ | ||
132 | cmplwi cr7,r0,0 /* is destination address even ? */ | ||
133 | addic r12,r6,0 | 130 | addic r12,r6,0 |
134 | addi r6,r4,-4 | 131 | addi r6,r4,-4 |
135 | neg r0,r4 | 132 | neg r0,r4 |
136 | addi r4,r3,-4 | 133 | addi r4,r3,-4 |
137 | andi. r0,r0,CACHELINE_MASK /* # bytes to start of cache line */ | 134 | andi. r0,r0,CACHELINE_MASK /* # bytes to start of cache line */ |
135 | crset 4*cr7+eq | ||
138 | beq 58f | 136 | beq 58f |
139 | 137 | ||
140 | cmplw 0,r5,r0 /* is this more than total to do? */ | 138 | cmplw 0,r5,r0 /* is this more than total to do? */ |
141 | blt 63f /* if not much to do */ | 139 | blt 63f /* if not much to do */ |
140 | rlwinm r7,r6,3,0x8 | ||
141 | rlwnm r12,r12,r7,0,31 /* odd destination address: rotate one byte */ | ||
142 | cmplwi cr7,r7,0 /* is destination address even ? */ | ||
142 | andi. r8,r0,3 /* get it word-aligned first */ | 143 | andi. r8,r0,3 /* get it word-aligned first */ |
143 | mtctr r8 | 144 | mtctr r8 |
144 | beq+ 61f | 145 | beq+ 61f |
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index a4db22f65021..bb1ffc559f38 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/mm.h> | 26 | #include <linux/mm.h> |
27 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
28 | #include <linux/highmem.h> | 28 | #include <linux/highmem.h> |
29 | #include <linux/module.h> | 29 | #include <linux/extable.h> |
30 | #include <linux/kprobes.h> | 30 | #include <linux/kprobes.h> |
31 | #include <linux/kdebug.h> | 31 | #include <linux/kdebug.h> |
32 | #include <linux/perf_event.h> | 32 | #include <linux/perf_event.h> |
diff --git a/arch/powerpc/mm/slb_low.S b/arch/powerpc/mm/slb_low.S index dfdb90cb4403..9f1983404e1a 100644 --- a/arch/powerpc/mm/slb_low.S +++ b/arch/powerpc/mm/slb_low.S | |||
@@ -113,7 +113,12 @@ BEGIN_FTR_SECTION | |||
113 | END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT) | 113 | END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT) |
114 | b slb_finish_load_1T | 114 | b slb_finish_load_1T |
115 | 115 | ||
116 | 0: | 116 | 0: /* |
117 | * For userspace addresses, make sure this is region 0. | ||
118 | */ | ||
119 | cmpdi r9, 0 | ||
120 | bne 8f | ||
121 | |||
117 | /* when using slices, we extract the psize off the slice bitmaps | 122 | /* when using slices, we extract the psize off the slice bitmaps |
118 | * and then we need to get the sllp encoding off the mmu_psize_defs | 123 | * and then we need to get the sllp encoding off the mmu_psize_defs |
119 | * array. | 124 | * array. |
diff --git a/arch/powerpc/platforms/512x/mpc512x_lpbfifo.c b/arch/powerpc/platforms/512x/mpc512x_lpbfifo.c index 8eb82b043dd8..d93dd4acf40b 100644 --- a/arch/powerpc/platforms/512x/mpc512x_lpbfifo.c +++ b/arch/powerpc/platforms/512x/mpc512x_lpbfifo.c | |||
@@ -528,7 +528,6 @@ static struct platform_driver mpc512x_lpbfifo_driver = { | |||
528 | .remove = mpc512x_lpbfifo_remove, | 528 | .remove = mpc512x_lpbfifo_remove, |
529 | .driver = { | 529 | .driver = { |
530 | .name = DRV_NAME, | 530 | .name = DRV_NAME, |
531 | .owner = THIS_MODULE, | ||
532 | .of_match_table = mpc512x_lpbfifo_match, | 531 | .of_match_table = mpc512x_lpbfifo_match, |
533 | }, | 532 | }, |
534 | }; | 533 | }; |
diff --git a/arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c b/arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c index dbcd0303afed..63c5ab6489c9 100644 --- a/arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c +++ b/arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c | |||
@@ -222,7 +222,6 @@ static const struct of_device_id mcu_of_match_table[] = { | |||
222 | static struct i2c_driver mcu_driver = { | 222 | static struct i2c_driver mcu_driver = { |
223 | .driver = { | 223 | .driver = { |
224 | .name = "mcu-mpc8349emitx", | 224 | .name = "mcu-mpc8349emitx", |
225 | .owner = THIS_MODULE, | ||
226 | .of_match_table = mcu_of_match_table, | 225 | .of_match_table = mcu_of_match_table, |
227 | }, | 226 | }, |
228 | .probe = mcu_probe, | 227 | .probe = mcu_probe, |
diff --git a/arch/powerpc/platforms/embedded6xx/holly.c b/arch/powerpc/platforms/embedded6xx/holly.c index dafba1057a47..dfd310031549 100644 --- a/arch/powerpc/platforms/embedded6xx/holly.c +++ b/arch/powerpc/platforms/embedded6xx/holly.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/tty.h> | 26 | #include <linux/tty.h> |
27 | #include <linux/serial_core.h> | 27 | #include <linux/serial_core.h> |
28 | #include <linux/of_platform.h> | 28 | #include <linux/of_platform.h> |
29 | #include <linux/module.h> | 29 | #include <linux/extable.h> |
30 | 30 | ||
31 | #include <asm/time.h> | 31 | #include <asm/time.h> |
32 | #include <asm/machdep.h> | 32 | #include <asm/machdep.h> |
diff --git a/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c index 80804f9916ee..f97bab8e37a2 100644 --- a/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c +++ b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <linux/pci.h> | 23 | #include <linux/pci.h> |
24 | #include <linux/kdev_t.h> | 24 | #include <linux/kdev_t.h> |
25 | #include <linux/console.h> | 25 | #include <linux/console.h> |
26 | #include <linux/module.h> | 26 | #include <linux/extable.h> |
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | #include <linux/irq.h> | 28 | #include <linux/irq.h> |
29 | #include <linux/seq_file.h> | 29 | #include <linux/seq_file.h> |
diff --git a/arch/powerpc/platforms/powernv/opal-dump.c b/arch/powerpc/platforms/powernv/opal-dump.c index 2ee96431f736..4c827826c05e 100644 --- a/arch/powerpc/platforms/powernv/opal-dump.c +++ b/arch/powerpc/platforms/powernv/opal-dump.c | |||
@@ -370,6 +370,7 @@ static irqreturn_t process_dump(int irq, void *data) | |||
370 | uint32_t dump_id, dump_size, dump_type; | 370 | uint32_t dump_id, dump_size, dump_type; |
371 | struct dump_obj *dump; | 371 | struct dump_obj *dump; |
372 | char name[22]; | 372 | char name[22]; |
373 | struct kobject *kobj; | ||
373 | 374 | ||
374 | rc = dump_read_info(&dump_id, &dump_size, &dump_type); | 375 | rc = dump_read_info(&dump_id, &dump_size, &dump_type); |
375 | if (rc != OPAL_SUCCESS) | 376 | if (rc != OPAL_SUCCESS) |
@@ -381,8 +382,12 @@ static irqreturn_t process_dump(int irq, void *data) | |||
381 | * that gracefully and not create two conflicting | 382 | * that gracefully and not create two conflicting |
382 | * entries. | 383 | * entries. |
383 | */ | 384 | */ |
384 | if (kset_find_obj(dump_kset, name)) | 385 | kobj = kset_find_obj(dump_kset, name); |
386 | if (kobj) { | ||
387 | /* Drop reference added by kset_find_obj() */ | ||
388 | kobject_put(kobj); | ||
385 | return 0; | 389 | return 0; |
390 | } | ||
386 | 391 | ||
387 | dump = create_dump_obj(dump_id, dump_size, dump_type); | 392 | dump = create_dump_obj(dump_id, dump_size, dump_type); |
388 | if (!dump) | 393 | if (!dump) |
diff --git a/arch/powerpc/platforms/powernv/opal-elog.c b/arch/powerpc/platforms/powernv/opal-elog.c index 37f959bf392e..f2344cbd2f46 100644 --- a/arch/powerpc/platforms/powernv/opal-elog.c +++ b/arch/powerpc/platforms/powernv/opal-elog.c | |||
@@ -247,6 +247,7 @@ static irqreturn_t elog_event(int irq, void *data) | |||
247 | uint64_t elog_type; | 247 | uint64_t elog_type; |
248 | int rc; | 248 | int rc; |
249 | char name[2+16+1]; | 249 | char name[2+16+1]; |
250 | struct kobject *kobj; | ||
250 | 251 | ||
251 | rc = opal_get_elog_size(&id, &size, &type); | 252 | rc = opal_get_elog_size(&id, &size, &type); |
252 | if (rc != OPAL_SUCCESS) { | 253 | if (rc != OPAL_SUCCESS) { |
@@ -269,8 +270,12 @@ static irqreturn_t elog_event(int irq, void *data) | |||
269 | * that gracefully and not create two conflicting | 270 | * that gracefully and not create two conflicting |
270 | * entries. | 271 | * entries. |
271 | */ | 272 | */ |
272 | if (kset_find_obj(elog_kset, name)) | 273 | kobj = kset_find_obj(elog_kset, name); |
274 | if (kobj) { | ||
275 | /* Drop reference added by kset_find_obj() */ | ||
276 | kobject_put(kobj); | ||
273 | return IRQ_HANDLED; | 277 | return IRQ_HANDLED; |
278 | } | ||
274 | 279 | ||
275 | create_elog_obj(log_id, elog_size, elog_type); | 280 | create_elog_obj(log_id, elog_size, elog_type); |
276 | 281 | ||
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index fd9444f9fb0c..c16d790808f1 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
@@ -149,7 +149,7 @@ static void pnv_ioda_reserve_pe(struct pnv_phb *phb, int pe_no) | |||
149 | 149 | ||
150 | static struct pnv_ioda_pe *pnv_ioda_alloc_pe(struct pnv_phb *phb) | 150 | static struct pnv_ioda_pe *pnv_ioda_alloc_pe(struct pnv_phb *phb) |
151 | { | 151 | { |
152 | unsigned long pe = phb->ioda.total_pe_num - 1; | 152 | long pe; |
153 | 153 | ||
154 | for (pe = phb->ioda.total_pe_num - 1; pe >= 0; pe--) { | 154 | for (pe = phb->ioda.total_pe_num - 1; pe >= 0; pe--) { |
155 | if (!test_and_set_bit(pe, phb->ioda.pe_alloc)) | 155 | if (!test_and_set_bit(pe, phb->ioda.pe_alloc)) |
@@ -162,11 +162,12 @@ static struct pnv_ioda_pe *pnv_ioda_alloc_pe(struct pnv_phb *phb) | |||
162 | static void pnv_ioda_free_pe(struct pnv_ioda_pe *pe) | 162 | static void pnv_ioda_free_pe(struct pnv_ioda_pe *pe) |
163 | { | 163 | { |
164 | struct pnv_phb *phb = pe->phb; | 164 | struct pnv_phb *phb = pe->phb; |
165 | unsigned int pe_num = pe->pe_number; | ||
165 | 166 | ||
166 | WARN_ON(pe->pdev); | 167 | WARN_ON(pe->pdev); |
167 | 168 | ||
168 | memset(pe, 0, sizeof(struct pnv_ioda_pe)); | 169 | memset(pe, 0, sizeof(struct pnv_ioda_pe)); |
169 | clear_bit(pe->pe_number, phb->ioda.pe_alloc); | 170 | clear_bit(pe_num, phb->ioda.pe_alloc); |
170 | } | 171 | } |
171 | 172 | ||
172 | /* The default M64 BAR is shared by all PEs */ | 173 | /* The default M64 BAR is shared by all PEs */ |
@@ -3402,12 +3403,6 @@ static void pnv_ioda_release_pe(struct pnv_ioda_pe *pe) | |||
3402 | struct pnv_phb *phb = pe->phb; | 3403 | struct pnv_phb *phb = pe->phb; |
3403 | struct pnv_ioda_pe *slave, *tmp; | 3404 | struct pnv_ioda_pe *slave, *tmp; |
3404 | 3405 | ||
3405 | /* Release slave PEs in compound PE */ | ||
3406 | if (pe->flags & PNV_IODA_PE_MASTER) { | ||
3407 | list_for_each_entry_safe(slave, tmp, &pe->slaves, list) | ||
3408 | pnv_ioda_release_pe(slave); | ||
3409 | } | ||
3410 | |||
3411 | list_del(&pe->list); | 3406 | list_del(&pe->list); |
3412 | switch (phb->type) { | 3407 | switch (phb->type) { |
3413 | case PNV_PHB_IODA1: | 3408 | case PNV_PHB_IODA1: |
@@ -3422,6 +3417,15 @@ static void pnv_ioda_release_pe(struct pnv_ioda_pe *pe) | |||
3422 | 3417 | ||
3423 | pnv_ioda_release_pe_seg(pe); | 3418 | pnv_ioda_release_pe_seg(pe); |
3424 | pnv_ioda_deconfigure_pe(pe->phb, pe); | 3419 | pnv_ioda_deconfigure_pe(pe->phb, pe); |
3420 | |||
3421 | /* Release slave PEs in the compound PE */ | ||
3422 | if (pe->flags & PNV_IODA_PE_MASTER) { | ||
3423 | list_for_each_entry_safe(slave, tmp, &pe->slaves, list) { | ||
3424 | list_del(&slave->list); | ||
3425 | pnv_ioda_free_pe(slave); | ||
3426 | } | ||
3427 | } | ||
3428 | |||
3425 | pnv_ioda_free_pe(pe); | 3429 | pnv_ioda_free_pe(pe); |
3426 | } | 3430 | } |
3427 | 3431 | ||
diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c index fe16a50700de..09eba5a9929a 100644 --- a/arch/powerpc/platforms/pseries/pci.c +++ b/arch/powerpc/platforms/pseries/pci.c | |||
@@ -119,6 +119,10 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) | |||
119 | 119 | ||
120 | bus = bridge->bus; | 120 | bus = bridge->bus; |
121 | 121 | ||
122 | /* Rely on the pcibios_free_controller_deferred() callback. */ | ||
123 | pci_set_host_bridge_release(bridge, pcibios_free_controller_deferred, | ||
124 | (void *) pci_bus_to_host(bus)); | ||
125 | |||
122 | dn = pcibios_get_phb_of_node(bus); | 126 | dn = pcibios_get_phb_of_node(bus); |
123 | if (!dn) | 127 | if (!dn) |
124 | return 0; | 128 | return 0; |
diff --git a/arch/powerpc/platforms/pseries/pci_dlpar.c b/arch/powerpc/platforms/pseries/pci_dlpar.c index 906dbaa97fe2..547fd13e4f8e 100644 --- a/arch/powerpc/platforms/pseries/pci_dlpar.c +++ b/arch/powerpc/platforms/pseries/pci_dlpar.c | |||
@@ -106,8 +106,11 @@ int remove_phb_dynamic(struct pci_controller *phb) | |||
106 | release_resource(res); | 106 | release_resource(res); |
107 | } | 107 | } |
108 | 108 | ||
109 | /* Free pci_controller data structure */ | 109 | /* |
110 | pcibios_free_controller(phb); | 110 | * The pci_controller data structure is freed by |
111 | * the pcibios_free_controller_deferred() callback; | ||
112 | * see pseries_root_bridge_prepare(). | ||
113 | */ | ||
111 | 114 | ||
112 | return 0; | 115 | return 0; |
113 | } | 116 | } |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 4ffcaa6f8670..a39d20e8623d 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -41,7 +41,6 @@ | |||
41 | #include <linux/root_dev.h> | 41 | #include <linux/root_dev.h> |
42 | #include <linux/of.h> | 42 | #include <linux/of.h> |
43 | #include <linux/of_pci.h> | 43 | #include <linux/of_pci.h> |
44 | #include <linux/kexec.h> | ||
45 | 44 | ||
46 | #include <asm/mmu.h> | 45 | #include <asm/mmu.h> |
47 | #include <asm/processor.h> | 46 | #include <asm/processor.h> |
@@ -66,6 +65,7 @@ | |||
66 | #include <asm/eeh.h> | 65 | #include <asm/eeh.h> |
67 | #include <asm/reg.h> | 66 | #include <asm/reg.h> |
68 | #include <asm/plpar_wrappers.h> | 67 | #include <asm/plpar_wrappers.h> |
68 | #include <asm/kexec.h> | ||
69 | 69 | ||
70 | #include "pseries.h" | 70 | #include "pseries.h" |
71 | 71 | ||
diff --git a/arch/powerpc/sysdev/cpm1.c b/arch/powerpc/sysdev/cpm1.c index 6c110994d902..81d49476c47e 100644 --- a/arch/powerpc/sysdev/cpm1.c +++ b/arch/powerpc/sysdev/cpm1.c | |||
@@ -534,7 +534,8 @@ struct cpm1_gpio16_chip { | |||
534 | 534 | ||
535 | static void cpm1_gpio16_save_regs(struct of_mm_gpio_chip *mm_gc) | 535 | static void cpm1_gpio16_save_regs(struct of_mm_gpio_chip *mm_gc) |
536 | { | 536 | { |
537 | struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); | 537 | struct cpm1_gpio16_chip *cpm1_gc = |
538 | container_of(mm_gc, struct cpm1_gpio16_chip, mm_gc); | ||
538 | struct cpm_ioport16 __iomem *iop = mm_gc->regs; | 539 | struct cpm_ioport16 __iomem *iop = mm_gc->regs; |
539 | 540 | ||
540 | cpm1_gc->cpdata = in_be16(&iop->dat); | 541 | cpm1_gc->cpdata = in_be16(&iop->dat); |
@@ -649,7 +650,8 @@ struct cpm1_gpio32_chip { | |||
649 | 650 | ||
650 | static void cpm1_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc) | 651 | static void cpm1_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc) |
651 | { | 652 | { |
652 | struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); | 653 | struct cpm1_gpio32_chip *cpm1_gc = |
654 | container_of(mm_gc, struct cpm1_gpio32_chip, mm_gc); | ||
653 | struct cpm_ioport32b __iomem *iop = mm_gc->regs; | 655 | struct cpm_ioport32b __iomem *iop = mm_gc->regs; |
654 | 656 | ||
655 | cpm1_gc->cpdata = in_be32(&iop->dat); | 657 | cpm1_gc->cpdata = in_be32(&iop->dat); |
diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c index 911456d17713..947f42007734 100644 --- a/arch/powerpc/sysdev/cpm_common.c +++ b/arch/powerpc/sysdev/cpm_common.c | |||
@@ -94,7 +94,8 @@ struct cpm2_gpio32_chip { | |||
94 | 94 | ||
95 | static void cpm2_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc) | 95 | static void cpm2_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc) |
96 | { | 96 | { |
97 | struct cpm2_gpio32_chip *cpm2_gc = gpiochip_get_data(&mm_gc->gc); | 97 | struct cpm2_gpio32_chip *cpm2_gc = |
98 | container_of(mm_gc, struct cpm2_gpio32_chip, mm_gc); | ||
98 | struct cpm2_ioports __iomem *iop = mm_gc->regs; | 99 | struct cpm2_ioports __iomem *iop = mm_gc->regs; |
99 | 100 | ||
100 | cpm2_gc->cpdata = in_be32(&iop->dat); | 101 | cpm2_gc->cpdata = in_be32(&iop->dat); |
diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index 68e7c0dd2e45..3cc7cace194a 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c | |||
@@ -23,7 +23,7 @@ | |||
23 | */ | 23 | */ |
24 | 24 | ||
25 | #include <linux/init.h> | 25 | #include <linux/init.h> |
26 | #include <linux/module.h> | 26 | #include <linux/extable.h> |
27 | #include <linux/types.h> | 27 | #include <linux/types.h> |
28 | #include <linux/dma-mapping.h> | 28 | #include <linux/dma-mapping.h> |
29 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
diff --git a/arch/powerpc/sysdev/xics/icp-opal.c b/arch/powerpc/sysdev/xics/icp-opal.c index 57d72f10a97f..9114243fa1b5 100644 --- a/arch/powerpc/sysdev/xics/icp-opal.c +++ b/arch/powerpc/sysdev/xics/icp-opal.c | |||
@@ -23,10 +23,10 @@ | |||
23 | 23 | ||
24 | static void icp_opal_teardown_cpu(void) | 24 | static void icp_opal_teardown_cpu(void) |
25 | { | 25 | { |
26 | int cpu = smp_processor_id(); | 26 | int hw_cpu = hard_smp_processor_id(); |
27 | 27 | ||
28 | /* Clear any pending IPI */ | 28 | /* Clear any pending IPI */ |
29 | opal_int_set_mfrr(cpu, 0xff); | 29 | opal_int_set_mfrr(hw_cpu, 0xff); |
30 | } | 30 | } |
31 | 31 | ||
32 | static void icp_opal_flush_ipi(void) | 32 | static void icp_opal_flush_ipi(void) |
@@ -101,14 +101,16 @@ static void icp_opal_eoi(struct irq_data *d) | |||
101 | 101 | ||
102 | static void icp_opal_cause_ipi(int cpu, unsigned long data) | 102 | static void icp_opal_cause_ipi(int cpu, unsigned long data) |
103 | { | 103 | { |
104 | opal_int_set_mfrr(cpu, IPI_PRIORITY); | 104 | int hw_cpu = get_hard_smp_processor_id(cpu); |
105 | |||
106 | opal_int_set_mfrr(hw_cpu, IPI_PRIORITY); | ||
105 | } | 107 | } |
106 | 108 | ||
107 | static irqreturn_t icp_opal_ipi_action(int irq, void *dev_id) | 109 | static irqreturn_t icp_opal_ipi_action(int irq, void *dev_id) |
108 | { | 110 | { |
109 | int cpu = smp_processor_id(); | 111 | int hw_cpu = hard_smp_processor_id(); |
110 | 112 | ||
111 | opal_int_set_mfrr(cpu, 0xff); | 113 | opal_int_set_mfrr(hw_cpu, 0xff); |
112 | 114 | ||
113 | return smp_ipi_demux(); | 115 | return smp_ipi_demux(); |
114 | } | 116 | } |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index e751fe25d6ab..c109f073d454 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -68,7 +68,6 @@ config DEBUG_RODATA | |||
68 | config S390 | 68 | config S390 |
69 | def_bool y | 69 | def_bool y |
70 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE | 70 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE |
71 | select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS | ||
72 | select ARCH_HAS_DEVMEM_IS_ALLOWED | 71 | select ARCH_HAS_DEVMEM_IS_ALLOWED |
73 | select ARCH_HAS_ELF_RANDOMIZE | 72 | select ARCH_HAS_ELF_RANDOMIZE |
74 | select ARCH_HAS_GCOV_PROFILE_ALL | 73 | select ARCH_HAS_GCOV_PROFILE_ALL |
diff --git a/arch/s390/configs/default_defconfig b/arch/s390/configs/default_defconfig index 26e0c7f08814..412b1bd21029 100644 --- a/arch/s390/configs/default_defconfig +++ b/arch/s390/configs/default_defconfig | |||
@@ -602,7 +602,6 @@ CONFIG_FAIL_FUTEX=y | |||
602 | CONFIG_FAULT_INJECTION_DEBUG_FS=y | 602 | CONFIG_FAULT_INJECTION_DEBUG_FS=y |
603 | CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y | 603 | CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y |
604 | CONFIG_LATENCYTOP=y | 604 | CONFIG_LATENCYTOP=y |
605 | CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y | ||
606 | CONFIG_IRQSOFF_TRACER=y | 605 | CONFIG_IRQSOFF_TRACER=y |
607 | CONFIG_PREEMPT_TRACER=y | 606 | CONFIG_PREEMPT_TRACER=y |
608 | CONFIG_SCHED_TRACER=y | 607 | CONFIG_SCHED_TRACER=y |
diff --git a/arch/s390/configs/gcov_defconfig b/arch/s390/configs/gcov_defconfig index 24879dab47bc..bec279eb4b93 100644 --- a/arch/s390/configs/gcov_defconfig +++ b/arch/s390/configs/gcov_defconfig | |||
@@ -552,7 +552,6 @@ CONFIG_NOTIFIER_ERROR_INJECTION=m | |||
552 | CONFIG_CPU_NOTIFIER_ERROR_INJECT=m | 552 | CONFIG_CPU_NOTIFIER_ERROR_INJECT=m |
553 | CONFIG_PM_NOTIFIER_ERROR_INJECT=m | 553 | CONFIG_PM_NOTIFIER_ERROR_INJECT=m |
554 | CONFIG_LATENCYTOP=y | 554 | CONFIG_LATENCYTOP=y |
555 | CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y | ||
556 | CONFIG_BLK_DEV_IO_TRACE=y | 555 | CONFIG_BLK_DEV_IO_TRACE=y |
557 | # CONFIG_KPROBE_EVENT is not set | 556 | # CONFIG_KPROBE_EVENT is not set |
558 | CONFIG_TRACE_ENUM_MAP_FILE=y | 557 | CONFIG_TRACE_ENUM_MAP_FILE=y |
diff --git a/arch/s390/configs/performance_defconfig b/arch/s390/configs/performance_defconfig index a5c1e5f2a0ca..1751446a5bbb 100644 --- a/arch/s390/configs/performance_defconfig +++ b/arch/s390/configs/performance_defconfig | |||
@@ -549,7 +549,6 @@ CONFIG_TIMER_STATS=y | |||
549 | CONFIG_RCU_TORTURE_TEST=m | 549 | CONFIG_RCU_TORTURE_TEST=m |
550 | CONFIG_RCU_CPU_STALL_TIMEOUT=60 | 550 | CONFIG_RCU_CPU_STALL_TIMEOUT=60 |
551 | CONFIG_LATENCYTOP=y | 551 | CONFIG_LATENCYTOP=y |
552 | CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y | ||
553 | CONFIG_SCHED_TRACER=y | 552 | CONFIG_SCHED_TRACER=y |
554 | CONFIG_FTRACE_SYSCALLS=y | 553 | CONFIG_FTRACE_SYSCALLS=y |
555 | CONFIG_STACK_TRACER=y | 554 | CONFIG_STACK_TRACER=y |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index 73610f2e3b4f..2d40ef0a6295 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -172,7 +172,6 @@ CONFIG_DEBUG_NOTIFIERS=y | |||
172 | CONFIG_RCU_CPU_STALL_TIMEOUT=60 | 172 | CONFIG_RCU_CPU_STALL_TIMEOUT=60 |
173 | CONFIG_RCU_TRACE=y | 173 | CONFIG_RCU_TRACE=y |
174 | CONFIG_LATENCYTOP=y | 174 | CONFIG_LATENCYTOP=y |
175 | CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y | ||
176 | CONFIG_SCHED_TRACER=y | 175 | CONFIG_SCHED_TRACER=y |
177 | CONFIG_FTRACE_SYSCALLS=y | 176 | CONFIG_FTRACE_SYSCALLS=y |
178 | CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y | 177 | CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y |
diff --git a/arch/s390/include/asm/uaccess.h b/arch/s390/include/asm/uaccess.h index 9b49cf1daa8f..95aefdba4be2 100644 --- a/arch/s390/include/asm/uaccess.h +++ b/arch/s390/include/asm/uaccess.h | |||
@@ -311,6 +311,14 @@ int __get_user_bad(void) __attribute__((noreturn)); | |||
311 | #define __put_user_unaligned __put_user | 311 | #define __put_user_unaligned __put_user |
312 | #define __get_user_unaligned __get_user | 312 | #define __get_user_unaligned __get_user |
313 | 313 | ||
314 | extern void __compiletime_error("usercopy buffer size is too small") | ||
315 | __bad_copy_user(void); | ||
316 | |||
317 | static inline void copy_user_overflow(int size, unsigned long count) | ||
318 | { | ||
319 | WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count); | ||
320 | } | ||
321 | |||
314 | /** | 322 | /** |
315 | * copy_to_user: - Copy a block of data into user space. | 323 | * copy_to_user: - Copy a block of data into user space. |
316 | * @to: Destination address, in user space. | 324 | * @to: Destination address, in user space. |
@@ -332,12 +340,6 @@ copy_to_user(void __user *to, const void *from, unsigned long n) | |||
332 | return __copy_to_user(to, from, n); | 340 | return __copy_to_user(to, from, n); |
333 | } | 341 | } |
334 | 342 | ||
335 | void copy_from_user_overflow(void) | ||
336 | #ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS | ||
337 | __compiletime_warning("copy_from_user() buffer size is not provably correct") | ||
338 | #endif | ||
339 | ; | ||
340 | |||
341 | /** | 343 | /** |
342 | * copy_from_user: - Copy a block of data from user space. | 344 | * copy_from_user: - Copy a block of data from user space. |
343 | * @to: Destination address, in kernel space. | 345 | * @to: Destination address, in kernel space. |
@@ -362,7 +364,10 @@ copy_from_user(void *to, const void __user *from, unsigned long n) | |||
362 | 364 | ||
363 | might_fault(); | 365 | might_fault(); |
364 | if (unlikely(sz != -1 && sz < n)) { | 366 | if (unlikely(sz != -1 && sz < n)) { |
365 | copy_from_user_overflow(); | 367 | if (!__builtin_constant_p(n)) |
368 | copy_user_overflow(sz, n); | ||
369 | else | ||
370 | __bad_copy_user(); | ||
366 | return n; | 371 | return n; |
367 | } | 372 | } |
368 | return __copy_from_user(to, from, n); | 373 | return __copy_from_user(to, from, n); |
diff --git a/arch/sparc/include/asm/uaccess_32.h b/arch/sparc/include/asm/uaccess_32.h index 341a5a133f48..e722c510bb1b 100644 --- a/arch/sparc/include/asm/uaccess_32.h +++ b/arch/sparc/include/asm/uaccess_32.h | |||
@@ -249,8 +249,7 @@ unsigned long __copy_user(void __user *to, const void __user *from, unsigned lon | |||
249 | static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) | 249 | static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) |
250 | { | 250 | { |
251 | if (n && __access_ok((unsigned long) to, n)) { | 251 | if (n && __access_ok((unsigned long) to, n)) { |
252 | if (!__builtin_constant_p(n)) | 252 | check_object_size(from, n, true); |
253 | check_object_size(from, n, true); | ||
254 | return __copy_user(to, (__force void __user *) from, n); | 253 | return __copy_user(to, (__force void __user *) from, n); |
255 | } else | 254 | } else |
256 | return n; | 255 | return n; |
@@ -258,16 +257,14 @@ static inline unsigned long copy_to_user(void __user *to, const void *from, unsi | |||
258 | 257 | ||
259 | static inline unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n) | 258 | static inline unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n) |
260 | { | 259 | { |
261 | if (!__builtin_constant_p(n)) | 260 | check_object_size(from, n, true); |
262 | check_object_size(from, n, true); | ||
263 | return __copy_user(to, (__force void __user *) from, n); | 261 | return __copy_user(to, (__force void __user *) from, n); |
264 | } | 262 | } |
265 | 263 | ||
266 | static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) | 264 | static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) |
267 | { | 265 | { |
268 | if (n && __access_ok((unsigned long) from, n)) { | 266 | if (n && __access_ok((unsigned long) from, n)) { |
269 | if (!__builtin_constant_p(n)) | 267 | check_object_size(to, n, false); |
270 | check_object_size(to, n, false); | ||
271 | return __copy_user((__force void __user *) to, from, n); | 268 | return __copy_user((__force void __user *) to, from, n); |
272 | } else | 269 | } else |
273 | return n; | 270 | return n; |
diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h index 8bda94fab8e8..37a315d0ddd4 100644 --- a/arch/sparc/include/asm/uaccess_64.h +++ b/arch/sparc/include/asm/uaccess_64.h | |||
@@ -212,8 +212,7 @@ copy_from_user(void *to, const void __user *from, unsigned long size) | |||
212 | { | 212 | { |
213 | unsigned long ret; | 213 | unsigned long ret; |
214 | 214 | ||
215 | if (!__builtin_constant_p(size)) | 215 | check_object_size(to, size, false); |
216 | check_object_size(to, size, false); | ||
217 | 216 | ||
218 | ret = ___copy_from_user(to, from, size); | 217 | ret = ___copy_from_user(to, from, size); |
219 | if (unlikely(ret)) | 218 | if (unlikely(ret)) |
@@ -233,8 +232,8 @@ copy_to_user(void __user *to, const void *from, unsigned long size) | |||
233 | { | 232 | { |
234 | unsigned long ret; | 233 | unsigned long ret; |
235 | 234 | ||
236 | if (!__builtin_constant_p(size)) | 235 | check_object_size(from, size, true); |
237 | check_object_size(from, size, true); | 236 | |
238 | ret = ___copy_to_user(to, from, size); | 237 | ret = ___copy_to_user(to, from, size); |
239 | if (unlikely(ret)) | 238 | if (unlikely(ret)) |
240 | ret = copy_to_user_fixup(to, from, size); | 239 | ret = copy_to_user_fixup(to, from, size); |
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 4820a02838ac..78da75b670bc 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig | |||
@@ -4,7 +4,6 @@ | |||
4 | config TILE | 4 | config TILE |
5 | def_bool y | 5 | def_bool y |
6 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE | 6 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE |
7 | select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS | ||
8 | select ARCH_HAS_DEVMEM_IS_ALLOWED | 7 | select ARCH_HAS_DEVMEM_IS_ALLOWED |
9 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | 8 | select ARCH_HAVE_NMI_SAFE_CMPXCHG |
10 | select ARCH_WANT_FRAME_POINTERS | 9 | select ARCH_WANT_FRAME_POINTERS |
diff --git a/arch/tile/include/asm/uaccess.h b/arch/tile/include/asm/uaccess.h index 0a9c4265763b..a77369e91e54 100644 --- a/arch/tile/include/asm/uaccess.h +++ b/arch/tile/include/asm/uaccess.h | |||
@@ -416,14 +416,13 @@ _copy_from_user(void *to, const void __user *from, unsigned long n) | |||
416 | return n; | 416 | return n; |
417 | } | 417 | } |
418 | 418 | ||
419 | #ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS | 419 | extern void __compiletime_error("usercopy buffer size is too small") |
420 | /* | 420 | __bad_copy_user(void); |
421 | * There are still unprovable places in the generic code as of 2.6.34, so this | 421 | |
422 | * option is not really compatible with -Werror, which is more useful in | 422 | static inline void copy_user_overflow(int size, unsigned long count) |
423 | * general. | 423 | { |
424 | */ | 424 | WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count); |
425 | extern void copy_from_user_overflow(void) | 425 | } |
426 | __compiletime_warning("copy_from_user() size is not provably correct"); | ||
427 | 426 | ||
428 | static inline unsigned long __must_check copy_from_user(void *to, | 427 | static inline unsigned long __must_check copy_from_user(void *to, |
429 | const void __user *from, | 428 | const void __user *from, |
@@ -433,14 +432,13 @@ static inline unsigned long __must_check copy_from_user(void *to, | |||
433 | 432 | ||
434 | if (likely(sz == -1 || sz >= n)) | 433 | if (likely(sz == -1 || sz >= n)) |
435 | n = _copy_from_user(to, from, n); | 434 | n = _copy_from_user(to, from, n); |
435 | else if (!__builtin_constant_p(n)) | ||
436 | copy_user_overflow(sz, n); | ||
436 | else | 437 | else |
437 | copy_from_user_overflow(); | 438 | __bad_copy_user(); |
438 | 439 | ||
439 | return n; | 440 | return n; |
440 | } | 441 | } |
441 | #else | ||
442 | #define copy_from_user _copy_from_user | ||
443 | #endif | ||
444 | 442 | ||
445 | #ifdef __tilegx__ | 443 | #ifdef __tilegx__ |
446 | /** | 444 | /** |
diff --git a/arch/um/kernel/skas/syscall.c b/arch/um/kernel/skas/syscall.c index ef4b8f949b51..b783ac87d98a 100644 --- a/arch/um/kernel/skas/syscall.c +++ b/arch/um/kernel/skas/syscall.c | |||
@@ -21,21 +21,17 @@ void handle_syscall(struct uml_pt_regs *r) | |||
21 | PT_REGS_SET_SYSCALL_RETURN(regs, -ENOSYS); | 21 | PT_REGS_SET_SYSCALL_RETURN(regs, -ENOSYS); |
22 | 22 | ||
23 | if (syscall_trace_enter(regs)) | 23 | if (syscall_trace_enter(regs)) |
24 | return; | 24 | goto out; |
25 | 25 | ||
26 | /* Do the seccomp check after ptrace; failures should be fast. */ | 26 | /* Do the seccomp check after ptrace; failures should be fast. */ |
27 | if (secure_computing(NULL) == -1) | 27 | if (secure_computing(NULL) == -1) |
28 | return; | 28 | goto out; |
29 | 29 | ||
30 | /* Update the syscall number after orig_ax has potentially been updated | ||
31 | * with ptrace. | ||
32 | */ | ||
33 | UPT_SYSCALL_NR(r) = PT_SYSCALL_NR(r->gp); | ||
34 | syscall = UPT_SYSCALL_NR(r); | 30 | syscall = UPT_SYSCALL_NR(r); |
35 | |||
36 | if (syscall >= 0 && syscall <= __NR_syscall_max) | 31 | if (syscall >= 0 && syscall <= __NR_syscall_max) |
37 | PT_REGS_SET_SYSCALL_RETURN(regs, | 32 | PT_REGS_SET_SYSCALL_RETURN(regs, |
38 | EXECUTE_SYSCALL(syscall, regs)); | 33 | EXECUTE_SYSCALL(syscall, regs)); |
39 | 34 | ||
35 | out: | ||
40 | syscall_trace_leave(regs); | 36 | syscall_trace_leave(regs); |
41 | } | 37 | } |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index c580d8c33562..2a1f0ce7c59a 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -24,7 +24,6 @@ config X86 | |||
24 | select ARCH_DISCARD_MEMBLOCK | 24 | select ARCH_DISCARD_MEMBLOCK |
25 | select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI | 25 | select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI |
26 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE | 26 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE |
27 | select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS | ||
28 | select ARCH_HAS_DEVMEM_IS_ALLOWED | 27 | select ARCH_HAS_DEVMEM_IS_ALLOWED |
29 | select ARCH_HAS_ELF_RANDOMIZE | 28 | select ARCH_HAS_ELF_RANDOMIZE |
30 | select ARCH_HAS_FAST_MULTIPLIER | 29 | select ARCH_HAS_FAST_MULTIPLIER |
diff --git a/arch/x86/configs/tiny.config b/arch/x86/configs/tiny.config index 4e2ecfa23c15..4b429df40d7a 100644 --- a/arch/x86/configs/tiny.config +++ b/arch/x86/configs/tiny.config | |||
@@ -1 +1,3 @@ | |||
1 | CONFIG_NOHIGHMEM=y | 1 | CONFIG_NOHIGHMEM=y |
2 | # CONFIG_HIGHMEM4G is not set | ||
3 | # CONFIG_HIGHMEM64G is not set | ||
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h index a0ae610b9280..e3af86f58eaf 100644 --- a/arch/x86/include/asm/uaccess.h +++ b/arch/x86/include/asm/uaccess.h | |||
@@ -697,44 +697,15 @@ unsigned long __must_check _copy_from_user(void *to, const void __user *from, | |||
697 | unsigned long __must_check _copy_to_user(void __user *to, const void *from, | 697 | unsigned long __must_check _copy_to_user(void __user *to, const void *from, |
698 | unsigned n); | 698 | unsigned n); |
699 | 699 | ||
700 | #ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS | 700 | extern void __compiletime_error("usercopy buffer size is too small") |
701 | # define copy_user_diag __compiletime_error | 701 | __bad_copy_user(void); |
702 | #else | ||
703 | # define copy_user_diag __compiletime_warning | ||
704 | #endif | ||
705 | |||
706 | extern void copy_user_diag("copy_from_user() buffer size is too small") | ||
707 | copy_from_user_overflow(void); | ||
708 | extern void copy_user_diag("copy_to_user() buffer size is too small") | ||
709 | copy_to_user_overflow(void) __asm__("copy_from_user_overflow"); | ||
710 | |||
711 | #undef copy_user_diag | ||
712 | |||
713 | #ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS | ||
714 | |||
715 | extern void | ||
716 | __compiletime_warning("copy_from_user() buffer size is not provably correct") | ||
717 | __copy_from_user_overflow(void) __asm__("copy_from_user_overflow"); | ||
718 | #define __copy_from_user_overflow(size, count) __copy_from_user_overflow() | ||
719 | |||
720 | extern void | ||
721 | __compiletime_warning("copy_to_user() buffer size is not provably correct") | ||
722 | __copy_to_user_overflow(void) __asm__("copy_from_user_overflow"); | ||
723 | #define __copy_to_user_overflow(size, count) __copy_to_user_overflow() | ||
724 | |||
725 | #else | ||
726 | 702 | ||
727 | static inline void | 703 | static inline void copy_user_overflow(int size, unsigned long count) |
728 | __copy_from_user_overflow(int size, unsigned long count) | ||
729 | { | 704 | { |
730 | WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count); | 705 | WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count); |
731 | } | 706 | } |
732 | 707 | ||
733 | #define __copy_to_user_overflow __copy_from_user_overflow | 708 | static __always_inline unsigned long __must_check |
734 | |||
735 | #endif | ||
736 | |||
737 | static inline unsigned long __must_check | ||
738 | copy_from_user(void *to, const void __user *from, unsigned long n) | 709 | copy_from_user(void *to, const void __user *from, unsigned long n) |
739 | { | 710 | { |
740 | int sz = __compiletime_object_size(to); | 711 | int sz = __compiletime_object_size(to); |
@@ -743,36 +714,18 @@ copy_from_user(void *to, const void __user *from, unsigned long n) | |||
743 | 714 | ||
744 | kasan_check_write(to, n); | 715 | kasan_check_write(to, n); |
745 | 716 | ||
746 | /* | ||
747 | * While we would like to have the compiler do the checking for us | ||
748 | * even in the non-constant size case, any false positives there are | ||
749 | * a problem (especially when DEBUG_STRICT_USER_COPY_CHECKS, but even | ||
750 | * without - the [hopefully] dangerous looking nature of the warning | ||
751 | * would make people go look at the respecitive call sites over and | ||
752 | * over again just to find that there's no problem). | ||
753 | * | ||
754 | * And there are cases where it's just not realistic for the compiler | ||
755 | * to prove the count to be in range. For example when multiple call | ||
756 | * sites of a helper function - perhaps in different source files - | ||
757 | * all doing proper range checking, yet the helper function not doing | ||
758 | * so again. | ||
759 | * | ||
760 | * Therefore limit the compile time checking to the constant size | ||
761 | * case, and do only runtime checking for non-constant sizes. | ||
762 | */ | ||
763 | |||
764 | if (likely(sz < 0 || sz >= n)) { | 717 | if (likely(sz < 0 || sz >= n)) { |
765 | check_object_size(to, n, false); | 718 | check_object_size(to, n, false); |
766 | n = _copy_from_user(to, from, n); | 719 | n = _copy_from_user(to, from, n); |
767 | } else if (__builtin_constant_p(n)) | 720 | } else if (!__builtin_constant_p(n)) |
768 | copy_from_user_overflow(); | 721 | copy_user_overflow(sz, n); |
769 | else | 722 | else |
770 | __copy_from_user_overflow(sz, n); | 723 | __bad_copy_user(); |
771 | 724 | ||
772 | return n; | 725 | return n; |
773 | } | 726 | } |
774 | 727 | ||
775 | static inline unsigned long __must_check | 728 | static __always_inline unsigned long __must_check |
776 | copy_to_user(void __user *to, const void *from, unsigned long n) | 729 | copy_to_user(void __user *to, const void *from, unsigned long n) |
777 | { | 730 | { |
778 | int sz = __compiletime_object_size(from); | 731 | int sz = __compiletime_object_size(from); |
@@ -781,21 +734,17 @@ copy_to_user(void __user *to, const void *from, unsigned long n) | |||
781 | 734 | ||
782 | might_fault(); | 735 | might_fault(); |
783 | 736 | ||
784 | /* See the comment in copy_from_user() above. */ | ||
785 | if (likely(sz < 0 || sz >= n)) { | 737 | if (likely(sz < 0 || sz >= n)) { |
786 | check_object_size(from, n, true); | 738 | check_object_size(from, n, true); |
787 | n = _copy_to_user(to, from, n); | 739 | n = _copy_to_user(to, from, n); |
788 | } else if (__builtin_constant_p(n)) | 740 | } else if (!__builtin_constant_p(n)) |
789 | copy_to_user_overflow(); | 741 | copy_user_overflow(sz, n); |
790 | else | 742 | else |
791 | __copy_to_user_overflow(sz, n); | 743 | __bad_copy_user(); |
792 | 744 | ||
793 | return n; | 745 | return n; |
794 | } | 746 | } |
795 | 747 | ||
796 | #undef __copy_from_user_overflow | ||
797 | #undef __copy_to_user_overflow | ||
798 | |||
799 | /* | 748 | /* |
800 | * We rely on the nested NMI work to allow atomic faults from the NMI path; the | 749 | * We rely on the nested NMI work to allow atomic faults from the NMI path; the |
801 | * nested NMI paths are careful to preserve CR2. | 750 | * nested NMI paths are careful to preserve CR2. |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index f5c69d8974e1..b81fe2d63e15 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
@@ -669,6 +669,17 @@ static void init_amd_gh(struct cpuinfo_x86 *c) | |||
669 | set_cpu_bug(c, X86_BUG_AMD_TLB_MMATCH); | 669 | set_cpu_bug(c, X86_BUG_AMD_TLB_MMATCH); |
670 | } | 670 | } |
671 | 671 | ||
672 | #define MSR_AMD64_DE_CFG 0xC0011029 | ||
673 | |||
674 | static void init_amd_ln(struct cpuinfo_x86 *c) | ||
675 | { | ||
676 | /* | ||
677 | * Apply erratum 665 fix unconditionally so machines without a BIOS | ||
678 | * fix work. | ||
679 | */ | ||
680 | msr_set_bit(MSR_AMD64_DE_CFG, 31); | ||
681 | } | ||
682 | |||
672 | static void init_amd_bd(struct cpuinfo_x86 *c) | 683 | static void init_amd_bd(struct cpuinfo_x86 *c) |
673 | { | 684 | { |
674 | u64 value; | 685 | u64 value; |
@@ -726,6 +737,7 @@ static void init_amd(struct cpuinfo_x86 *c) | |||
726 | case 6: init_amd_k7(c); break; | 737 | case 6: init_amd_k7(c); break; |
727 | case 0xf: init_amd_k8(c); break; | 738 | case 0xf: init_amd_k8(c); break; |
728 | case 0x10: init_amd_gh(c); break; | 739 | case 0x10: init_amd_gh(c); break; |
740 | case 0x12: init_amd_ln(c); break; | ||
729 | case 0x15: init_amd_bd(c); break; | 741 | case 0x15: init_amd_bd(c); break; |
730 | } | 742 | } |
731 | 743 | ||
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index ad5bc9578a73..1acfd76e3e26 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
@@ -56,12 +56,12 @@ asm (".pushsection .entry.text, \"ax\"\n" | |||
56 | ".popsection"); | 56 | ".popsection"); |
57 | 57 | ||
58 | /* identity function, which can be inlined */ | 58 | /* identity function, which can be inlined */ |
59 | u32 _paravirt_ident_32(u32 x) | 59 | u32 notrace _paravirt_ident_32(u32 x) |
60 | { | 60 | { |
61 | return x; | 61 | return x; |
62 | } | 62 | } |
63 | 63 | ||
64 | u64 _paravirt_ident_64(u64 x) | 64 | u64 notrace _paravirt_ident_64(u64 x) |
65 | { | 65 | { |
66 | return x; | 66 | return x; |
67 | } | 67 | } |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index ecb1b69c1651..170cc4ff057b 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
@@ -927,9 +927,10 @@ int track_pfn_copy(struct vm_area_struct *vma) | |||
927 | } | 927 | } |
928 | 928 | ||
929 | /* | 929 | /* |
930 | * prot is passed in as a parameter for the new mapping. If the vma has a | 930 | * prot is passed in as a parameter for the new mapping. If the vma has |
931 | * linear pfn mapping for the entire range reserve the entire vma range with | 931 | * a linear pfn mapping for the entire range, or no vma is provided, |
932 | * single reserve_pfn_range call. | 932 | * reserve the entire pfn + size range with single reserve_pfn_range |
933 | * call. | ||
933 | */ | 934 | */ |
934 | int track_pfn_remap(struct vm_area_struct *vma, pgprot_t *prot, | 935 | int track_pfn_remap(struct vm_area_struct *vma, pgprot_t *prot, |
935 | unsigned long pfn, unsigned long addr, unsigned long size) | 936 | unsigned long pfn, unsigned long addr, unsigned long size) |
@@ -938,11 +939,12 @@ int track_pfn_remap(struct vm_area_struct *vma, pgprot_t *prot, | |||
938 | enum page_cache_mode pcm; | 939 | enum page_cache_mode pcm; |
939 | 940 | ||
940 | /* reserve the whole chunk starting from paddr */ | 941 | /* reserve the whole chunk starting from paddr */ |
941 | if (addr == vma->vm_start && size == (vma->vm_end - vma->vm_start)) { | 942 | if (!vma || (addr == vma->vm_start |
943 | && size == (vma->vm_end - vma->vm_start))) { | ||
942 | int ret; | 944 | int ret; |
943 | 945 | ||
944 | ret = reserve_pfn_range(paddr, size, prot, 0); | 946 | ret = reserve_pfn_range(paddr, size, prot, 0); |
945 | if (!ret) | 947 | if (ret == 0 && vma) |
946 | vma->vm_flags |= VM_PAT; | 948 | vma->vm_flags |= VM_PAT; |
947 | return ret; | 949 | return ret; |
948 | } | 950 | } |
@@ -997,7 +999,7 @@ void untrack_pfn(struct vm_area_struct *vma, unsigned long pfn, | |||
997 | resource_size_t paddr; | 999 | resource_size_t paddr; |
998 | unsigned long prot; | 1000 | unsigned long prot; |
999 | 1001 | ||
1000 | if (!(vma->vm_flags & VM_PAT)) | 1002 | if (vma && !(vma->vm_flags & VM_PAT)) |
1001 | return; | 1003 | return; |
1002 | 1004 | ||
1003 | /* free the chunk starting from pfn or the whole chunk */ | 1005 | /* free the chunk starting from pfn or the whole chunk */ |
@@ -1011,7 +1013,8 @@ void untrack_pfn(struct vm_area_struct *vma, unsigned long pfn, | |||
1011 | size = vma->vm_end - vma->vm_start; | 1013 | size = vma->vm_end - vma->vm_start; |
1012 | } | 1014 | } |
1013 | free_pfn_range(paddr, size); | 1015 | free_pfn_range(paddr, size); |
1014 | vma->vm_flags &= ~VM_PAT; | 1016 | if (vma) |
1017 | vma->vm_flags &= ~VM_PAT; | ||
1015 | } | 1018 | } |
1016 | 1019 | ||
1017 | /* | 1020 | /* |
diff --git a/arch/x86/um/ptrace_32.c b/arch/x86/um/ptrace_32.c index ebd4dd6ef73b..a7ef7b131e25 100644 --- a/arch/x86/um/ptrace_32.c +++ b/arch/x86/um/ptrace_32.c | |||
@@ -84,7 +84,10 @@ int putreg(struct task_struct *child, int regno, unsigned long value) | |||
84 | case EAX: | 84 | case EAX: |
85 | case EIP: | 85 | case EIP: |
86 | case UESP: | 86 | case UESP: |
87 | break; | ||
87 | case ORIG_EAX: | 88 | case ORIG_EAX: |
89 | /* Update the syscall number. */ | ||
90 | UPT_SYSCALL_NR(&child->thread.regs.regs) = value; | ||
88 | break; | 91 | break; |
89 | case FS: | 92 | case FS: |
90 | if (value && (value & 3) != 3) | 93 | if (value && (value & 3) != 3) |
diff --git a/arch/x86/um/ptrace_64.c b/arch/x86/um/ptrace_64.c index faab418876ce..0b5c184dd5b3 100644 --- a/arch/x86/um/ptrace_64.c +++ b/arch/x86/um/ptrace_64.c | |||
@@ -78,7 +78,11 @@ int putreg(struct task_struct *child, int regno, unsigned long value) | |||
78 | case RSI: | 78 | case RSI: |
79 | case RDI: | 79 | case RDI: |
80 | case RBP: | 80 | case RBP: |
81 | break; | ||
82 | |||
81 | case ORIG_RAX: | 83 | case ORIG_RAX: |
84 | /* Update the syscall number. */ | ||
85 | UPT_SYSCALL_NR(&child->thread.regs.regs) = value; | ||
82 | break; | 86 | break; |
83 | 87 | ||
84 | case FS: | 88 | case FS: |
diff --git a/crypto/cryptd.c b/crypto/cryptd.c index cf8037a87b2d..77207b41940c 100644 --- a/crypto/cryptd.c +++ b/crypto/cryptd.c | |||
@@ -733,13 +733,14 @@ static void cryptd_aead_crypt(struct aead_request *req, | |||
733 | rctx = aead_request_ctx(req); | 733 | rctx = aead_request_ctx(req); |
734 | compl = rctx->complete; | 734 | compl = rctx->complete; |
735 | 735 | ||
736 | tfm = crypto_aead_reqtfm(req); | ||
737 | |||
736 | if (unlikely(err == -EINPROGRESS)) | 738 | if (unlikely(err == -EINPROGRESS)) |
737 | goto out; | 739 | goto out; |
738 | aead_request_set_tfm(req, child); | 740 | aead_request_set_tfm(req, child); |
739 | err = crypt( req ); | 741 | err = crypt( req ); |
740 | 742 | ||
741 | out: | 743 | out: |
742 | tfm = crypto_aead_reqtfm(req); | ||
743 | ctx = crypto_aead_ctx(tfm); | 744 | ctx = crypto_aead_ctx(tfm); |
744 | refcnt = atomic_read(&ctx->refcnt); | 745 | refcnt = atomic_read(&ctx->refcnt); |
745 | 746 | ||
diff --git a/drivers/acpi/nfit/mce.c b/drivers/acpi/nfit/mce.c index 4c745bf389fe..161f91539ae6 100644 --- a/drivers/acpi/nfit/mce.c +++ b/drivers/acpi/nfit/mce.c | |||
@@ -42,7 +42,7 @@ static int nfit_handle_mce(struct notifier_block *nb, unsigned long val, | |||
42 | list_for_each_entry(nfit_spa, &acpi_desc->spas, list) { | 42 | list_for_each_entry(nfit_spa, &acpi_desc->spas, list) { |
43 | struct acpi_nfit_system_address *spa = nfit_spa->spa; | 43 | struct acpi_nfit_system_address *spa = nfit_spa->spa; |
44 | 44 | ||
45 | if (nfit_spa_type(spa) == NFIT_SPA_PM) | 45 | if (nfit_spa_type(spa) != NFIT_SPA_PM) |
46 | continue; | 46 | continue; |
47 | /* find the spa that covers the mce addr */ | 47 | /* find the spa that covers the mce addr */ |
48 | if (spa->address > mce->addr) | 48 | if (spa->address > mce->addr) |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index ad9fc84a8601..e878fc799af7 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -2054,7 +2054,7 @@ int __init acpi_scan_init(void) | |||
2054 | 2054 | ||
2055 | static struct acpi_probe_entry *ape; | 2055 | static struct acpi_probe_entry *ape; |
2056 | static int acpi_probe_count; | 2056 | static int acpi_probe_count; |
2057 | static DEFINE_SPINLOCK(acpi_probe_lock); | 2057 | static DEFINE_MUTEX(acpi_probe_mutex); |
2058 | 2058 | ||
2059 | static int __init acpi_match_madt(struct acpi_subtable_header *header, | 2059 | static int __init acpi_match_madt(struct acpi_subtable_header *header, |
2060 | const unsigned long end) | 2060 | const unsigned long end) |
@@ -2073,7 +2073,7 @@ int __init __acpi_probe_device_table(struct acpi_probe_entry *ap_head, int nr) | |||
2073 | if (acpi_disabled) | 2073 | if (acpi_disabled) |
2074 | return 0; | 2074 | return 0; |
2075 | 2075 | ||
2076 | spin_lock(&acpi_probe_lock); | 2076 | mutex_lock(&acpi_probe_mutex); |
2077 | for (ape = ap_head; nr; ape++, nr--) { | 2077 | for (ape = ap_head; nr; ape++, nr--) { |
2078 | if (ACPI_COMPARE_NAME(ACPI_SIG_MADT, ape->id)) { | 2078 | if (ACPI_COMPARE_NAME(ACPI_SIG_MADT, ape->id)) { |
2079 | acpi_probe_count = 0; | 2079 | acpi_probe_count = 0; |
@@ -2086,7 +2086,7 @@ int __init __acpi_probe_device_table(struct acpi_probe_entry *ap_head, int nr) | |||
2086 | count++; | 2086 | count++; |
2087 | } | 2087 | } |
2088 | } | 2088 | } |
2089 | spin_unlock(&acpi_probe_lock); | 2089 | mutex_unlock(&acpi_probe_mutex); |
2090 | 2090 | ||
2091 | return count; | 2091 | return count; |
2092 | } | 2092 | } |
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index 7461a587b39b..dcf2c724fd06 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c | |||
@@ -2524,7 +2524,7 @@ static int ahci_host_activate_multi_irqs(struct ata_host *host, | |||
2524 | 2524 | ||
2525 | /* Do not receive interrupts sent by dummy ports */ | 2525 | /* Do not receive interrupts sent by dummy ports */ |
2526 | if (!pp) { | 2526 | if (!pp) { |
2527 | disable_irq(irq + i); | 2527 | disable_irq(irq); |
2528 | continue; | 2528 | continue; |
2529 | } | 2529 | } |
2530 | 2530 | ||
diff --git a/drivers/ata/pata_ninja32.c b/drivers/ata/pata_ninja32.c index 633aa2934a18..44f97ad3c88d 100644 --- a/drivers/ata/pata_ninja32.c +++ b/drivers/ata/pata_ninja32.c | |||
@@ -144,7 +144,7 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id) | |||
144 | ap->ioaddr.altstatus_addr = base + 0x1E; | 144 | ap->ioaddr.altstatus_addr = base + 0x1E; |
145 | ap->ioaddr.bmdma_addr = base; | 145 | ap->ioaddr.bmdma_addr = base; |
146 | ata_sff_std_ports(&ap->ioaddr); | 146 | ata_sff_std_ports(&ap->ioaddr); |
147 | ap->pflags = ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE; | 147 | ap->pflags |= ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE; |
148 | 148 | ||
149 | ninja32_program(base); | 149 | ninja32_program(base); |
150 | /* FIXME: Should we disable them at remove ? */ | 150 | /* FIXME: Should we disable them at remove ? */ |
diff --git a/drivers/base/platform-msi.c b/drivers/base/platform-msi.c index 279e53989374..be6a599bc0c1 100644 --- a/drivers/base/platform-msi.c +++ b/drivers/base/platform-msi.c | |||
@@ -142,13 +142,12 @@ static int platform_msi_alloc_descs_with_irq(struct device *dev, int virq, | |||
142 | } | 142 | } |
143 | 143 | ||
144 | for (i = 0; i < nvec; i++) { | 144 | for (i = 0; i < nvec; i++) { |
145 | desc = alloc_msi_entry(dev); | 145 | desc = alloc_msi_entry(dev, 1, NULL); |
146 | if (!desc) | 146 | if (!desc) |
147 | break; | 147 | break; |
148 | 148 | ||
149 | desc->platform.msi_priv_data = data; | 149 | desc->platform.msi_priv_data = data; |
150 | desc->platform.msi_index = base + i; | 150 | desc->platform.msi_index = base + i; |
151 | desc->nvec_used = 1; | ||
152 | desc->irq = virq ? virq + i : 0; | 151 | desc->irq = virq ? virq + i : 0; |
153 | 152 | ||
154 | list_add_tail(&desc->list, dev_to_msi_list(dev)); | 153 | list_add_tail(&desc->list, dev_to_msi_list(dev)); |
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index e097d355cc04..17995fadebd7 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c | |||
@@ -301,7 +301,7 @@ static int rpm_idle(struct device *dev, int rpmflags) | |||
301 | int (*callback)(struct device *); | 301 | int (*callback)(struct device *); |
302 | int retval; | 302 | int retval; |
303 | 303 | ||
304 | trace_rpm_idle(dev, rpmflags); | 304 | trace_rpm_idle_rcuidle(dev, rpmflags); |
305 | retval = rpm_check_suspend_allowed(dev); | 305 | retval = rpm_check_suspend_allowed(dev); |
306 | if (retval < 0) | 306 | if (retval < 0) |
307 | ; /* Conditions are wrong. */ | 307 | ; /* Conditions are wrong. */ |
@@ -337,7 +337,7 @@ static int rpm_idle(struct device *dev, int rpmflags) | |||
337 | dev->power.request_pending = true; | 337 | dev->power.request_pending = true; |
338 | queue_work(pm_wq, &dev->power.work); | 338 | queue_work(pm_wq, &dev->power.work); |
339 | } | 339 | } |
340 | trace_rpm_return_int(dev, _THIS_IP_, 0); | 340 | trace_rpm_return_int_rcuidle(dev, _THIS_IP_, 0); |
341 | return 0; | 341 | return 0; |
342 | } | 342 | } |
343 | 343 | ||
@@ -352,7 +352,7 @@ static int rpm_idle(struct device *dev, int rpmflags) | |||
352 | wake_up_all(&dev->power.wait_queue); | 352 | wake_up_all(&dev->power.wait_queue); |
353 | 353 | ||
354 | out: | 354 | out: |
355 | trace_rpm_return_int(dev, _THIS_IP_, retval); | 355 | trace_rpm_return_int_rcuidle(dev, _THIS_IP_, retval); |
356 | return retval ? retval : rpm_suspend(dev, rpmflags | RPM_AUTO); | 356 | return retval ? retval : rpm_suspend(dev, rpmflags | RPM_AUTO); |
357 | } | 357 | } |
358 | 358 | ||
@@ -601,7 +601,7 @@ static int rpm_resume(struct device *dev, int rpmflags) | |||
601 | struct device *parent = NULL; | 601 | struct device *parent = NULL; |
602 | int retval = 0; | 602 | int retval = 0; |
603 | 603 | ||
604 | trace_rpm_resume(dev, rpmflags); | 604 | trace_rpm_resume_rcuidle(dev, rpmflags); |
605 | 605 | ||
606 | repeat: | 606 | repeat: |
607 | if (dev->power.runtime_error) | 607 | if (dev->power.runtime_error) |
@@ -764,7 +764,7 @@ static int rpm_resume(struct device *dev, int rpmflags) | |||
764 | spin_lock_irq(&dev->power.lock); | 764 | spin_lock_irq(&dev->power.lock); |
765 | } | 765 | } |
766 | 766 | ||
767 | trace_rpm_return_int(dev, _THIS_IP_, retval); | 767 | trace_rpm_return_int_rcuidle(dev, _THIS_IP_, retval); |
768 | 768 | ||
769 | return retval; | 769 | return retval; |
770 | } | 770 | } |
diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c index aa56af87d941..b11af3f2c1db 100644 --- a/drivers/base/regmap/regcache-rbtree.c +++ b/drivers/base/regmap/regcache-rbtree.c | |||
@@ -404,6 +404,7 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, | |||
404 | unsigned int new_base_reg, new_top_reg; | 404 | unsigned int new_base_reg, new_top_reg; |
405 | unsigned int min, max; | 405 | unsigned int min, max; |
406 | unsigned int max_dist; | 406 | unsigned int max_dist; |
407 | unsigned int dist, best_dist = UINT_MAX; | ||
407 | 408 | ||
408 | max_dist = map->reg_stride * sizeof(*rbnode_tmp) / | 409 | max_dist = map->reg_stride * sizeof(*rbnode_tmp) / |
409 | map->cache_word_size; | 410 | map->cache_word_size; |
@@ -423,24 +424,41 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg, | |||
423 | &base_reg, &top_reg); | 424 | &base_reg, &top_reg); |
424 | 425 | ||
425 | if (base_reg <= max && top_reg >= min) { | 426 | if (base_reg <= max && top_reg >= min) { |
426 | new_base_reg = min(reg, base_reg); | 427 | if (reg < base_reg) |
427 | new_top_reg = max(reg, top_reg); | 428 | dist = base_reg - reg; |
428 | } else { | 429 | else if (reg > top_reg) |
429 | if (max < base_reg) | 430 | dist = reg - top_reg; |
430 | node = node->rb_left; | ||
431 | else | 431 | else |
432 | node = node->rb_right; | 432 | dist = 0; |
433 | 433 | if (dist < best_dist) { | |
434 | continue; | 434 | rbnode = rbnode_tmp; |
435 | best_dist = dist; | ||
436 | new_base_reg = min(reg, base_reg); | ||
437 | new_top_reg = max(reg, top_reg); | ||
438 | } | ||
435 | } | 439 | } |
436 | 440 | ||
437 | ret = regcache_rbtree_insert_to_block(map, rbnode_tmp, | 441 | /* |
442 | * Keep looking, we want to choose the closest block, | ||
443 | * otherwise we might end up creating overlapping | ||
444 | * blocks, which breaks the rbtree. | ||
445 | */ | ||
446 | if (reg < base_reg) | ||
447 | node = node->rb_left; | ||
448 | else if (reg > top_reg) | ||
449 | node = node->rb_right; | ||
450 | else | ||
451 | break; | ||
452 | } | ||
453 | |||
454 | if (rbnode) { | ||
455 | ret = regcache_rbtree_insert_to_block(map, rbnode, | ||
438 | new_base_reg, | 456 | new_base_reg, |
439 | new_top_reg, reg, | 457 | new_top_reg, reg, |
440 | value); | 458 | value); |
441 | if (ret) | 459 | if (ret) |
442 | return ret; | 460 | return ret; |
443 | rbtree_ctx->cached_rbnode = rbnode_tmp; | 461 | rbtree_ctx->cached_rbnode = rbnode; |
444 | return 0; | 462 | return 0; |
445 | } | 463 | } |
446 | 464 | ||
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c index df7ff7290821..4e582561e1e7 100644 --- a/drivers/base/regmap/regcache.c +++ b/drivers/base/regmap/regcache.c | |||
@@ -38,10 +38,11 @@ static int regcache_hw_init(struct regmap *map) | |||
38 | 38 | ||
39 | /* calculate the size of reg_defaults */ | 39 | /* calculate the size of reg_defaults */ |
40 | for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) | 40 | for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) |
41 | if (!regmap_volatile(map, i * map->reg_stride)) | 41 | if (regmap_readable(map, i * map->reg_stride) && |
42 | !regmap_volatile(map, i * map->reg_stride)) | ||
42 | count++; | 43 | count++; |
43 | 44 | ||
44 | /* all registers are volatile, so just bypass */ | 45 | /* all registers are unreadable or volatile, so just bypass */ |
45 | if (!count) { | 46 | if (!count) { |
46 | map->cache_bypass = true; | 47 | map->cache_bypass = true; |
47 | return 0; | 48 | return 0; |
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 51fa7d66a393..25d26bb18970 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c | |||
@@ -1474,6 +1474,8 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg, | |||
1474 | ret = map->bus->write(map->bus_context, buf, len); | 1474 | ret = map->bus->write(map->bus_context, buf, len); |
1475 | 1475 | ||
1476 | kfree(buf); | 1476 | kfree(buf); |
1477 | } else if (ret != 0 && !map->cache_bypass && map->format.parse_val) { | ||
1478 | regcache_drop_region(map, reg, reg + 1); | ||
1477 | } | 1479 | } |
1478 | 1480 | ||
1479 | trace_regmap_hw_write_done(map, reg, val_len / map->format.val_bytes); | 1481 | trace_regmap_hw_write_done(map, reg, val_len / map->format.val_bytes); |
diff --git a/drivers/bus/arm-cci.c b/drivers/bus/arm-cci.c index 5755907f836f..ffa7c9dcbd7a 100644 --- a/drivers/bus/arm-cci.c +++ b/drivers/bus/arm-cci.c | |||
@@ -551,7 +551,7 @@ static struct attribute *cci5xx_pmu_event_attrs[] = { | |||
551 | CCI5xx_GLOBAL_EVENT_EXT_ATTR_ENTRY(cci_wrq, 0xB), | 551 | CCI5xx_GLOBAL_EVENT_EXT_ATTR_ENTRY(cci_wrq, 0xB), |
552 | CCI5xx_GLOBAL_EVENT_EXT_ATTR_ENTRY(cci_snoop_cd_hs, 0xC), | 552 | CCI5xx_GLOBAL_EVENT_EXT_ATTR_ENTRY(cci_snoop_cd_hs, 0xC), |
553 | CCI5xx_GLOBAL_EVENT_EXT_ATTR_ENTRY(cci_rq_stall_addr_hazard, 0xD), | 553 | CCI5xx_GLOBAL_EVENT_EXT_ATTR_ENTRY(cci_rq_stall_addr_hazard, 0xD), |
554 | CCI5xx_GLOBAL_EVENT_EXT_ATTR_ENTRY(cci_snopp_rq_stall_tt_full, 0xE), | 554 | CCI5xx_GLOBAL_EVENT_EXT_ATTR_ENTRY(cci_snoop_rq_stall_tt_full, 0xE), |
555 | CCI5xx_GLOBAL_EVENT_EXT_ATTR_ENTRY(cci_snoop_rq_tzmp1_prot, 0xF), | 555 | CCI5xx_GLOBAL_EVENT_EXT_ATTR_ENTRY(cci_snoop_rq_tzmp1_prot, 0xF), |
556 | NULL | 556 | NULL |
557 | }; | 557 | }; |
diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c index 97a9185af433..884c0305e290 100644 --- a/drivers/bus/arm-ccn.c +++ b/drivers/bus/arm-ccn.c | |||
@@ -187,6 +187,7 @@ struct arm_ccn { | |||
187 | struct arm_ccn_component *xp; | 187 | struct arm_ccn_component *xp; |
188 | 188 | ||
189 | struct arm_ccn_dt dt; | 189 | struct arm_ccn_dt dt; |
190 | int mn_id; | ||
190 | }; | 191 | }; |
191 | 192 | ||
192 | static DEFINE_MUTEX(arm_ccn_mutex); | 193 | static DEFINE_MUTEX(arm_ccn_mutex); |
@@ -212,6 +213,7 @@ static int arm_ccn_node_to_xp_port(int node) | |||
212 | #define CCN_CONFIG_TYPE(_config) (((_config) >> 8) & 0xff) | 213 | #define CCN_CONFIG_TYPE(_config) (((_config) >> 8) & 0xff) |
213 | #define CCN_CONFIG_EVENT(_config) (((_config) >> 16) & 0xff) | 214 | #define CCN_CONFIG_EVENT(_config) (((_config) >> 16) & 0xff) |
214 | #define CCN_CONFIG_PORT(_config) (((_config) >> 24) & 0x3) | 215 | #define CCN_CONFIG_PORT(_config) (((_config) >> 24) & 0x3) |
216 | #define CCN_CONFIG_BUS(_config) (((_config) >> 24) & 0x3) | ||
215 | #define CCN_CONFIG_VC(_config) (((_config) >> 26) & 0x7) | 217 | #define CCN_CONFIG_VC(_config) (((_config) >> 26) & 0x7) |
216 | #define CCN_CONFIG_DIR(_config) (((_config) >> 29) & 0x1) | 218 | #define CCN_CONFIG_DIR(_config) (((_config) >> 29) & 0x1) |
217 | #define CCN_CONFIG_MASK(_config) (((_config) >> 30) & 0xf) | 219 | #define CCN_CONFIG_MASK(_config) (((_config) >> 30) & 0xf) |
@@ -241,6 +243,7 @@ static CCN_FORMAT_ATTR(xp, "config:0-7"); | |||
241 | static CCN_FORMAT_ATTR(type, "config:8-15"); | 243 | static CCN_FORMAT_ATTR(type, "config:8-15"); |
242 | static CCN_FORMAT_ATTR(event, "config:16-23"); | 244 | static CCN_FORMAT_ATTR(event, "config:16-23"); |
243 | static CCN_FORMAT_ATTR(port, "config:24-25"); | 245 | static CCN_FORMAT_ATTR(port, "config:24-25"); |
246 | static CCN_FORMAT_ATTR(bus, "config:24-25"); | ||
244 | static CCN_FORMAT_ATTR(vc, "config:26-28"); | 247 | static CCN_FORMAT_ATTR(vc, "config:26-28"); |
245 | static CCN_FORMAT_ATTR(dir, "config:29-29"); | 248 | static CCN_FORMAT_ATTR(dir, "config:29-29"); |
246 | static CCN_FORMAT_ATTR(mask, "config:30-33"); | 249 | static CCN_FORMAT_ATTR(mask, "config:30-33"); |
@@ -253,6 +256,7 @@ static struct attribute *arm_ccn_pmu_format_attrs[] = { | |||
253 | &arm_ccn_pmu_format_attr_type.attr.attr, | 256 | &arm_ccn_pmu_format_attr_type.attr.attr, |
254 | &arm_ccn_pmu_format_attr_event.attr.attr, | 257 | &arm_ccn_pmu_format_attr_event.attr.attr, |
255 | &arm_ccn_pmu_format_attr_port.attr.attr, | 258 | &arm_ccn_pmu_format_attr_port.attr.attr, |
259 | &arm_ccn_pmu_format_attr_bus.attr.attr, | ||
256 | &arm_ccn_pmu_format_attr_vc.attr.attr, | 260 | &arm_ccn_pmu_format_attr_vc.attr.attr, |
257 | &arm_ccn_pmu_format_attr_dir.attr.attr, | 261 | &arm_ccn_pmu_format_attr_dir.attr.attr, |
258 | &arm_ccn_pmu_format_attr_mask.attr.attr, | 262 | &arm_ccn_pmu_format_attr_mask.attr.attr, |
@@ -328,6 +332,7 @@ struct arm_ccn_pmu_event { | |||
328 | static ssize_t arm_ccn_pmu_event_show(struct device *dev, | 332 | static ssize_t arm_ccn_pmu_event_show(struct device *dev, |
329 | struct device_attribute *attr, char *buf) | 333 | struct device_attribute *attr, char *buf) |
330 | { | 334 | { |
335 | struct arm_ccn *ccn = pmu_to_arm_ccn(dev_get_drvdata(dev)); | ||
331 | struct arm_ccn_pmu_event *event = container_of(attr, | 336 | struct arm_ccn_pmu_event *event = container_of(attr, |
332 | struct arm_ccn_pmu_event, attr); | 337 | struct arm_ccn_pmu_event, attr); |
333 | ssize_t res; | 338 | ssize_t res; |
@@ -349,10 +354,17 @@ static ssize_t arm_ccn_pmu_event_show(struct device *dev, | |||
349 | break; | 354 | break; |
350 | case CCN_TYPE_XP: | 355 | case CCN_TYPE_XP: |
351 | res += snprintf(buf + res, PAGE_SIZE - res, | 356 | res += snprintf(buf + res, PAGE_SIZE - res, |
352 | ",xp=?,port=?,vc=?,dir=?"); | 357 | ",xp=?,vc=?"); |
353 | if (event->event == CCN_EVENT_WATCHPOINT) | 358 | if (event->event == CCN_EVENT_WATCHPOINT) |
354 | res += snprintf(buf + res, PAGE_SIZE - res, | 359 | res += snprintf(buf + res, PAGE_SIZE - res, |
355 | ",cmp_l=?,cmp_h=?,mask=?"); | 360 | ",port=?,dir=?,cmp_l=?,cmp_h=?,mask=?"); |
361 | else | ||
362 | res += snprintf(buf + res, PAGE_SIZE - res, | ||
363 | ",bus=?"); | ||
364 | |||
365 | break; | ||
366 | case CCN_TYPE_MN: | ||
367 | res += snprintf(buf + res, PAGE_SIZE - res, ",node=%d", ccn->mn_id); | ||
356 | break; | 368 | break; |
357 | default: | 369 | default: |
358 | res += snprintf(buf + res, PAGE_SIZE - res, ",node=?"); | 370 | res += snprintf(buf + res, PAGE_SIZE - res, ",node=?"); |
@@ -383,9 +395,9 @@ static umode_t arm_ccn_pmu_events_is_visible(struct kobject *kobj, | |||
383 | } | 395 | } |
384 | 396 | ||
385 | static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = { | 397 | static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = { |
386 | CCN_EVENT_MN(eobarrier, "dir=0,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE), | 398 | CCN_EVENT_MN(eobarrier, "dir=1,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE), |
387 | CCN_EVENT_MN(ecbarrier, "dir=0,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE), | 399 | CCN_EVENT_MN(ecbarrier, "dir=1,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE), |
388 | CCN_EVENT_MN(dvmop, "dir=0,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE), | 400 | CCN_EVENT_MN(dvmop, "dir=1,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE), |
389 | CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY), | 401 | CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY), |
390 | CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY), | 402 | CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY), |
391 | CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY), | 403 | CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY), |
@@ -733,9 +745,10 @@ static int arm_ccn_pmu_event_init(struct perf_event *event) | |||
733 | 745 | ||
734 | if (has_branch_stack(event) || event->attr.exclude_user || | 746 | if (has_branch_stack(event) || event->attr.exclude_user || |
735 | event->attr.exclude_kernel || event->attr.exclude_hv || | 747 | event->attr.exclude_kernel || event->attr.exclude_hv || |
736 | event->attr.exclude_idle) { | 748 | event->attr.exclude_idle || event->attr.exclude_host || |
749 | event->attr.exclude_guest) { | ||
737 | dev_warn(ccn->dev, "Can't exclude execution levels!\n"); | 750 | dev_warn(ccn->dev, "Can't exclude execution levels!\n"); |
738 | return -EOPNOTSUPP; | 751 | return -EINVAL; |
739 | } | 752 | } |
740 | 753 | ||
741 | if (event->cpu < 0) { | 754 | if (event->cpu < 0) { |
@@ -759,6 +772,12 @@ static int arm_ccn_pmu_event_init(struct perf_event *event) | |||
759 | 772 | ||
760 | /* Validate node/xp vs topology */ | 773 | /* Validate node/xp vs topology */ |
761 | switch (type) { | 774 | switch (type) { |
775 | case CCN_TYPE_MN: | ||
776 | if (node_xp != ccn->mn_id) { | ||
777 | dev_warn(ccn->dev, "Invalid MN ID %d!\n", node_xp); | ||
778 | return -EINVAL; | ||
779 | } | ||
780 | break; | ||
762 | case CCN_TYPE_XP: | 781 | case CCN_TYPE_XP: |
763 | if (node_xp >= ccn->num_xps) { | 782 | if (node_xp >= ccn->num_xps) { |
764 | dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp); | 783 | dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp); |
@@ -886,6 +905,10 @@ static void arm_ccn_pmu_xp_dt_config(struct perf_event *event, int enable) | |||
886 | struct arm_ccn_component *xp; | 905 | struct arm_ccn_component *xp; |
887 | u32 val, dt_cfg; | 906 | u32 val, dt_cfg; |
888 | 907 | ||
908 | /* Nothing to do for cycle counter */ | ||
909 | if (hw->idx == CCN_IDX_PMU_CYCLE_COUNTER) | ||
910 | return; | ||
911 | |||
889 | if (CCN_CONFIG_TYPE(event->attr.config) == CCN_TYPE_XP) | 912 | if (CCN_CONFIG_TYPE(event->attr.config) == CCN_TYPE_XP) |
890 | xp = &ccn->xp[CCN_CONFIG_XP(event->attr.config)]; | 913 | xp = &ccn->xp[CCN_CONFIG_XP(event->attr.config)]; |
891 | else | 914 | else |
@@ -917,38 +940,17 @@ static void arm_ccn_pmu_event_start(struct perf_event *event, int flags) | |||
917 | arm_ccn_pmu_read_counter(ccn, hw->idx)); | 940 | arm_ccn_pmu_read_counter(ccn, hw->idx)); |
918 | hw->state = 0; | 941 | hw->state = 0; |
919 | 942 | ||
920 | /* | ||
921 | * Pin the timer, so that the overflows are handled by the chosen | ||
922 | * event->cpu (this is the same one as presented in "cpumask" | ||
923 | * attribute). | ||
924 | */ | ||
925 | if (!ccn->irq) | ||
926 | hrtimer_start(&ccn->dt.hrtimer, arm_ccn_pmu_timer_period(), | ||
927 | HRTIMER_MODE_REL_PINNED); | ||
928 | |||
929 | /* Set the DT bus input, engaging the counter */ | 943 | /* Set the DT bus input, engaging the counter */ |
930 | arm_ccn_pmu_xp_dt_config(event, 1); | 944 | arm_ccn_pmu_xp_dt_config(event, 1); |
931 | } | 945 | } |
932 | 946 | ||
933 | static void arm_ccn_pmu_event_stop(struct perf_event *event, int flags) | 947 | static void arm_ccn_pmu_event_stop(struct perf_event *event, int flags) |
934 | { | 948 | { |
935 | struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu); | ||
936 | struct hw_perf_event *hw = &event->hw; | 949 | struct hw_perf_event *hw = &event->hw; |
937 | u64 timeout; | ||
938 | 950 | ||
939 | /* Disable counting, setting the DT bus to pass-through mode */ | 951 | /* Disable counting, setting the DT bus to pass-through mode */ |
940 | arm_ccn_pmu_xp_dt_config(event, 0); | 952 | arm_ccn_pmu_xp_dt_config(event, 0); |
941 | 953 | ||
942 | if (!ccn->irq) | ||
943 | hrtimer_cancel(&ccn->dt.hrtimer); | ||
944 | |||
945 | /* Let the DT bus drain */ | ||
946 | timeout = arm_ccn_pmu_read_counter(ccn, CCN_IDX_PMU_CYCLE_COUNTER) + | ||
947 | ccn->num_xps; | ||
948 | while (arm_ccn_pmu_read_counter(ccn, CCN_IDX_PMU_CYCLE_COUNTER) < | ||
949 | timeout) | ||
950 | cpu_relax(); | ||
951 | |||
952 | if (flags & PERF_EF_UPDATE) | 954 | if (flags & PERF_EF_UPDATE) |
953 | arm_ccn_pmu_event_update(event); | 955 | arm_ccn_pmu_event_update(event); |
954 | 956 | ||
@@ -988,7 +990,7 @@ static void arm_ccn_pmu_xp_watchpoint_config(struct perf_event *event) | |||
988 | 990 | ||
989 | /* Comparison values */ | 991 | /* Comparison values */ |
990 | writel(cmp_l & 0xffffffff, source->base + CCN_XP_DT_CMP_VAL_L(wp)); | 992 | writel(cmp_l & 0xffffffff, source->base + CCN_XP_DT_CMP_VAL_L(wp)); |
991 | writel((cmp_l >> 32) & 0xefffffff, | 993 | writel((cmp_l >> 32) & 0x7fffffff, |
992 | source->base + CCN_XP_DT_CMP_VAL_L(wp) + 4); | 994 | source->base + CCN_XP_DT_CMP_VAL_L(wp) + 4); |
993 | writel(cmp_h & 0xffffffff, source->base + CCN_XP_DT_CMP_VAL_H(wp)); | 995 | writel(cmp_h & 0xffffffff, source->base + CCN_XP_DT_CMP_VAL_H(wp)); |
994 | writel((cmp_h >> 32) & 0x0fffffff, | 996 | writel((cmp_h >> 32) & 0x0fffffff, |
@@ -996,7 +998,7 @@ static void arm_ccn_pmu_xp_watchpoint_config(struct perf_event *event) | |||
996 | 998 | ||
997 | /* Mask */ | 999 | /* Mask */ |
998 | writel(mask_l & 0xffffffff, source->base + CCN_XP_DT_CMP_MASK_L(wp)); | 1000 | writel(mask_l & 0xffffffff, source->base + CCN_XP_DT_CMP_MASK_L(wp)); |
999 | writel((mask_l >> 32) & 0xefffffff, | 1001 | writel((mask_l >> 32) & 0x7fffffff, |
1000 | source->base + CCN_XP_DT_CMP_MASK_L(wp) + 4); | 1002 | source->base + CCN_XP_DT_CMP_MASK_L(wp) + 4); |
1001 | writel(mask_h & 0xffffffff, source->base + CCN_XP_DT_CMP_MASK_H(wp)); | 1003 | writel(mask_h & 0xffffffff, source->base + CCN_XP_DT_CMP_MASK_H(wp)); |
1002 | writel((mask_h >> 32) & 0x0fffffff, | 1004 | writel((mask_h >> 32) & 0x0fffffff, |
@@ -1014,7 +1016,7 @@ static void arm_ccn_pmu_xp_event_config(struct perf_event *event) | |||
1014 | hw->event_base = CCN_XP_DT_CONFIG__DT_CFG__XP_PMU_EVENT(hw->config_base); | 1016 | hw->event_base = CCN_XP_DT_CONFIG__DT_CFG__XP_PMU_EVENT(hw->config_base); |
1015 | 1017 | ||
1016 | id = (CCN_CONFIG_VC(event->attr.config) << 4) | | 1018 | id = (CCN_CONFIG_VC(event->attr.config) << 4) | |
1017 | (CCN_CONFIG_PORT(event->attr.config) << 3) | | 1019 | (CCN_CONFIG_BUS(event->attr.config) << 3) | |
1018 | (CCN_CONFIG_EVENT(event->attr.config) << 0); | 1020 | (CCN_CONFIG_EVENT(event->attr.config) << 0); |
1019 | 1021 | ||
1020 | val = readl(source->base + CCN_XP_PMU_EVENT_SEL); | 1022 | val = readl(source->base + CCN_XP_PMU_EVENT_SEL); |
@@ -1099,15 +1101,31 @@ static void arm_ccn_pmu_event_config(struct perf_event *event) | |||
1099 | spin_unlock(&ccn->dt.config_lock); | 1101 | spin_unlock(&ccn->dt.config_lock); |
1100 | } | 1102 | } |
1101 | 1103 | ||
1104 | static int arm_ccn_pmu_active_counters(struct arm_ccn *ccn) | ||
1105 | { | ||
1106 | return bitmap_weight(ccn->dt.pmu_counters_mask, | ||
1107 | CCN_NUM_PMU_EVENT_COUNTERS + 1); | ||
1108 | } | ||
1109 | |||
1102 | static int arm_ccn_pmu_event_add(struct perf_event *event, int flags) | 1110 | static int arm_ccn_pmu_event_add(struct perf_event *event, int flags) |
1103 | { | 1111 | { |
1104 | int err; | 1112 | int err; |
1105 | struct hw_perf_event *hw = &event->hw; | 1113 | struct hw_perf_event *hw = &event->hw; |
1114 | struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu); | ||
1106 | 1115 | ||
1107 | err = arm_ccn_pmu_event_alloc(event); | 1116 | err = arm_ccn_pmu_event_alloc(event); |
1108 | if (err) | 1117 | if (err) |
1109 | return err; | 1118 | return err; |
1110 | 1119 | ||
1120 | /* | ||
1121 | * Pin the timer, so that the overflows are handled by the chosen | ||
1122 | * event->cpu (this is the same one as presented in "cpumask" | ||
1123 | * attribute). | ||
1124 | */ | ||
1125 | if (!ccn->irq && arm_ccn_pmu_active_counters(ccn) == 1) | ||
1126 | hrtimer_start(&ccn->dt.hrtimer, arm_ccn_pmu_timer_period(), | ||
1127 | HRTIMER_MODE_REL_PINNED); | ||
1128 | |||
1111 | arm_ccn_pmu_event_config(event); | 1129 | arm_ccn_pmu_event_config(event); |
1112 | 1130 | ||
1113 | hw->state = PERF_HES_STOPPED; | 1131 | hw->state = PERF_HES_STOPPED; |
@@ -1120,9 +1138,14 @@ static int arm_ccn_pmu_event_add(struct perf_event *event, int flags) | |||
1120 | 1138 | ||
1121 | static void arm_ccn_pmu_event_del(struct perf_event *event, int flags) | 1139 | static void arm_ccn_pmu_event_del(struct perf_event *event, int flags) |
1122 | { | 1140 | { |
1141 | struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu); | ||
1142 | |||
1123 | arm_ccn_pmu_event_stop(event, PERF_EF_UPDATE); | 1143 | arm_ccn_pmu_event_stop(event, PERF_EF_UPDATE); |
1124 | 1144 | ||
1125 | arm_ccn_pmu_event_release(event); | 1145 | arm_ccn_pmu_event_release(event); |
1146 | |||
1147 | if (!ccn->irq && arm_ccn_pmu_active_counters(ccn) == 0) | ||
1148 | hrtimer_cancel(&ccn->dt.hrtimer); | ||
1126 | } | 1149 | } |
1127 | 1150 | ||
1128 | static void arm_ccn_pmu_event_read(struct perf_event *event) | 1151 | static void arm_ccn_pmu_event_read(struct perf_event *event) |
@@ -1130,6 +1153,24 @@ static void arm_ccn_pmu_event_read(struct perf_event *event) | |||
1130 | arm_ccn_pmu_event_update(event); | 1153 | arm_ccn_pmu_event_update(event); |
1131 | } | 1154 | } |
1132 | 1155 | ||
1156 | static void arm_ccn_pmu_enable(struct pmu *pmu) | ||
1157 | { | ||
1158 | struct arm_ccn *ccn = pmu_to_arm_ccn(pmu); | ||
1159 | |||
1160 | u32 val = readl(ccn->dt.base + CCN_DT_PMCR); | ||
1161 | val |= CCN_DT_PMCR__PMU_EN; | ||
1162 | writel(val, ccn->dt.base + CCN_DT_PMCR); | ||
1163 | } | ||
1164 | |||
1165 | static void arm_ccn_pmu_disable(struct pmu *pmu) | ||
1166 | { | ||
1167 | struct arm_ccn *ccn = pmu_to_arm_ccn(pmu); | ||
1168 | |||
1169 | u32 val = readl(ccn->dt.base + CCN_DT_PMCR); | ||
1170 | val &= ~CCN_DT_PMCR__PMU_EN; | ||
1171 | writel(val, ccn->dt.base + CCN_DT_PMCR); | ||
1172 | } | ||
1173 | |||
1133 | static irqreturn_t arm_ccn_pmu_overflow_handler(struct arm_ccn_dt *dt) | 1174 | static irqreturn_t arm_ccn_pmu_overflow_handler(struct arm_ccn_dt *dt) |
1134 | { | 1175 | { |
1135 | u32 pmovsr = readl(dt->base + CCN_DT_PMOVSR); | 1176 | u32 pmovsr = readl(dt->base + CCN_DT_PMOVSR); |
@@ -1252,6 +1293,8 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn) | |||
1252 | .start = arm_ccn_pmu_event_start, | 1293 | .start = arm_ccn_pmu_event_start, |
1253 | .stop = arm_ccn_pmu_event_stop, | 1294 | .stop = arm_ccn_pmu_event_stop, |
1254 | .read = arm_ccn_pmu_event_read, | 1295 | .read = arm_ccn_pmu_event_read, |
1296 | .pmu_enable = arm_ccn_pmu_enable, | ||
1297 | .pmu_disable = arm_ccn_pmu_disable, | ||
1255 | }; | 1298 | }; |
1256 | 1299 | ||
1257 | /* No overflow interrupt? Have to use a timer instead. */ | 1300 | /* No overflow interrupt? Have to use a timer instead. */ |
@@ -1361,6 +1404,8 @@ static int arm_ccn_init_nodes(struct arm_ccn *ccn, int region, | |||
1361 | 1404 | ||
1362 | switch (type) { | 1405 | switch (type) { |
1363 | case CCN_TYPE_MN: | 1406 | case CCN_TYPE_MN: |
1407 | ccn->mn_id = id; | ||
1408 | return 0; | ||
1364 | case CCN_TYPE_DT: | 1409 | case CCN_TYPE_DT: |
1365 | return 0; | 1410 | return 0; |
1366 | case CCN_TYPE_XP: | 1411 | case CCN_TYPE_XP: |
@@ -1471,8 +1516,9 @@ static int arm_ccn_probe(struct platform_device *pdev) | |||
1471 | /* Can set 'disable' bits, so can acknowledge interrupts */ | 1516 | /* Can set 'disable' bits, so can acknowledge interrupts */ |
1472 | writel(CCN_MN_ERRINT_STATUS__PMU_EVENTS__ENABLE, | 1517 | writel(CCN_MN_ERRINT_STATUS__PMU_EVENTS__ENABLE, |
1473 | ccn->base + CCN_MN_ERRINT_STATUS); | 1518 | ccn->base + CCN_MN_ERRINT_STATUS); |
1474 | err = devm_request_irq(ccn->dev, irq, arm_ccn_irq_handler, 0, | 1519 | err = devm_request_irq(ccn->dev, irq, arm_ccn_irq_handler, |
1475 | dev_name(ccn->dev), ccn); | 1520 | IRQF_NOBALANCING | IRQF_NO_THREAD, |
1521 | dev_name(ccn->dev), ccn); | ||
1476 | if (err) | 1522 | if (err) |
1477 | return err; | 1523 | return err; |
1478 | 1524 | ||
diff --git a/drivers/bus/vexpress-config.c b/drivers/bus/vexpress-config.c index c3cb76b363c6..9efdf1de4035 100644 --- a/drivers/bus/vexpress-config.c +++ b/drivers/bus/vexpress-config.c | |||
@@ -178,6 +178,7 @@ static int vexpress_config_populate(struct device_node *node) | |||
178 | 178 | ||
179 | parent = class_find_device(vexpress_config_class, NULL, bridge, | 179 | parent = class_find_device(vexpress_config_class, NULL, bridge, |
180 | vexpress_config_node_match); | 180 | vexpress_config_node_match); |
181 | of_node_put(bridge); | ||
181 | if (WARN_ON(!parent)) | 182 | if (WARN_ON(!parent)) |
182 | return -ENODEV; | 183 | return -ENODEV; |
183 | 184 | ||
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig index 56ad5a5936a9..8c0770bf8881 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig | |||
@@ -244,7 +244,7 @@ config HW_RANDOM_TX4939 | |||
244 | 244 | ||
245 | config HW_RANDOM_MXC_RNGA | 245 | config HW_RANDOM_MXC_RNGA |
246 | tristate "Freescale i.MX RNGA Random Number Generator" | 246 | tristate "Freescale i.MX RNGA Random Number Generator" |
247 | depends on ARCH_HAS_RNGA | 247 | depends on SOC_IMX31 |
248 | default HW_RANDOM | 248 | default HW_RANDOM |
249 | ---help--- | 249 | ---help--- |
250 | This driver provides kernel-side support for the Random Number | 250 | This driver provides kernel-side support for the Random Number |
diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c index 08c7e23ed535..0c75c3f1689f 100644 --- a/drivers/char/tpm/tpm2-cmd.c +++ b/drivers/char/tpm/tpm2-cmd.c | |||
@@ -957,7 +957,7 @@ int tpm2_auto_startup(struct tpm_chip *chip) | |||
957 | goto out; | 957 | goto out; |
958 | 958 | ||
959 | rc = tpm2_do_selftest(chip); | 959 | rc = tpm2_do_selftest(chip); |
960 | if (rc != TPM2_RC_INITIALIZE) { | 960 | if (rc != 0 && rc != TPM2_RC_INITIALIZE) { |
961 | dev_err(&chip->dev, "TPM self test failed\n"); | 961 | dev_err(&chip->dev, "TPM self test failed\n"); |
962 | goto out; | 962 | goto out; |
963 | } | 963 | } |
@@ -974,7 +974,6 @@ int tpm2_auto_startup(struct tpm_chip *chip) | |||
974 | } | 974 | } |
975 | } | 975 | } |
976 | 976 | ||
977 | return rc; | ||
978 | out: | 977 | out: |
979 | if (rc > 0) | 978 | if (rc > 0) |
980 | rc = -ENODEV; | 979 | rc = -ENODEV; |
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index d2406fe25533..5da47e26a012 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
@@ -165,6 +165,12 @@ struct ports_device { | |||
165 | */ | 165 | */ |
166 | struct virtqueue *c_ivq, *c_ovq; | 166 | struct virtqueue *c_ivq, *c_ovq; |
167 | 167 | ||
168 | /* | ||
169 | * A control packet buffer for guest->host requests, protected | ||
170 | * by c_ovq_lock. | ||
171 | */ | ||
172 | struct virtio_console_control cpkt; | ||
173 | |||
168 | /* Array of per-port IO virtqueues */ | 174 | /* Array of per-port IO virtqueues */ |
169 | struct virtqueue **in_vqs, **out_vqs; | 175 | struct virtqueue **in_vqs, **out_vqs; |
170 | 176 | ||
@@ -560,28 +566,29 @@ static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id, | |||
560 | unsigned int event, unsigned int value) | 566 | unsigned int event, unsigned int value) |
561 | { | 567 | { |
562 | struct scatterlist sg[1]; | 568 | struct scatterlist sg[1]; |
563 | struct virtio_console_control cpkt; | ||
564 | struct virtqueue *vq; | 569 | struct virtqueue *vq; |
565 | unsigned int len; | 570 | unsigned int len; |
566 | 571 | ||
567 | if (!use_multiport(portdev)) | 572 | if (!use_multiport(portdev)) |
568 | return 0; | 573 | return 0; |
569 | 574 | ||
570 | cpkt.id = cpu_to_virtio32(portdev->vdev, port_id); | ||
571 | cpkt.event = cpu_to_virtio16(portdev->vdev, event); | ||
572 | cpkt.value = cpu_to_virtio16(portdev->vdev, value); | ||
573 | |||
574 | vq = portdev->c_ovq; | 575 | vq = portdev->c_ovq; |
575 | 576 | ||
576 | sg_init_one(sg, &cpkt, sizeof(cpkt)); | ||
577 | |||
578 | spin_lock(&portdev->c_ovq_lock); | 577 | spin_lock(&portdev->c_ovq_lock); |
579 | if (virtqueue_add_outbuf(vq, sg, 1, &cpkt, GFP_ATOMIC) == 0) { | 578 | |
579 | portdev->cpkt.id = cpu_to_virtio32(portdev->vdev, port_id); | ||
580 | portdev->cpkt.event = cpu_to_virtio16(portdev->vdev, event); | ||
581 | portdev->cpkt.value = cpu_to_virtio16(portdev->vdev, value); | ||
582 | |||
583 | sg_init_one(sg, &portdev->cpkt, sizeof(struct virtio_console_control)); | ||
584 | |||
585 | if (virtqueue_add_outbuf(vq, sg, 1, &portdev->cpkt, GFP_ATOMIC) == 0) { | ||
580 | virtqueue_kick(vq); | 586 | virtqueue_kick(vq); |
581 | while (!virtqueue_get_buf(vq, &len) | 587 | while (!virtqueue_get_buf(vq, &len) |
582 | && !virtqueue_is_broken(vq)) | 588 | && !virtqueue_is_broken(vq)) |
583 | cpu_relax(); | 589 | cpu_relax(); |
584 | } | 590 | } |
591 | |||
585 | spin_unlock(&portdev->c_ovq_lock); | 592 | spin_unlock(&portdev->c_ovq_lock); |
586 | return 0; | 593 | return 0; |
587 | } | 594 | } |
diff --git a/drivers/clk/renesas/r8a7795-cpg-mssr.c b/drivers/clk/renesas/r8a7795-cpg-mssr.c index d359c92e13a6..e38bf60c0ff4 100644 --- a/drivers/clk/renesas/r8a7795-cpg-mssr.c +++ b/drivers/clk/renesas/r8a7795-cpg-mssr.c | |||
@@ -69,6 +69,7 @@ static const struct cpg_core_clk r8a7795_core_clks[] __initconst = { | |||
69 | DEF_FIXED(".s1", CLK_S1, CLK_PLL1_DIV2, 3, 1), | 69 | DEF_FIXED(".s1", CLK_S1, CLK_PLL1_DIV2, 3, 1), |
70 | DEF_FIXED(".s2", CLK_S2, CLK_PLL1_DIV2, 4, 1), | 70 | DEF_FIXED(".s2", CLK_S2, CLK_PLL1_DIV2, 4, 1), |
71 | DEF_FIXED(".s3", CLK_S3, CLK_PLL1_DIV2, 6, 1), | 71 | DEF_FIXED(".s3", CLK_S3, CLK_PLL1_DIV2, 6, 1), |
72 | DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), | ||
72 | 73 | ||
73 | /* Core Clock Outputs */ | 74 | /* Core Clock Outputs */ |
74 | DEF_FIXED("ztr", R8A7795_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), | 75 | DEF_FIXED("ztr", R8A7795_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), |
@@ -87,10 +88,10 @@ static const struct cpg_core_clk r8a7795_core_clks[] __initconst = { | |||
87 | DEF_FIXED("s3d2", R8A7795_CLK_S3D2, CLK_S3, 2, 1), | 88 | DEF_FIXED("s3d2", R8A7795_CLK_S3D2, CLK_S3, 2, 1), |
88 | DEF_FIXED("s3d4", R8A7795_CLK_S3D4, CLK_S3, 4, 1), | 89 | DEF_FIXED("s3d4", R8A7795_CLK_S3D4, CLK_S3, 4, 1), |
89 | 90 | ||
90 | DEF_GEN3_SD("sd0", R8A7795_CLK_SD0, CLK_PLL1_DIV2, 0x0074), | 91 | DEF_GEN3_SD("sd0", R8A7795_CLK_SD0, CLK_SDSRC, 0x0074), |
91 | DEF_GEN3_SD("sd1", R8A7795_CLK_SD1, CLK_PLL1_DIV2, 0x0078), | 92 | DEF_GEN3_SD("sd1", R8A7795_CLK_SD1, CLK_SDSRC, 0x0078), |
92 | DEF_GEN3_SD("sd2", R8A7795_CLK_SD2, CLK_PLL1_DIV2, 0x0268), | 93 | DEF_GEN3_SD("sd2", R8A7795_CLK_SD2, CLK_SDSRC, 0x0268), |
93 | DEF_GEN3_SD("sd3", R8A7795_CLK_SD3, CLK_PLL1_DIV2, 0x026c), | 94 | DEF_GEN3_SD("sd3", R8A7795_CLK_SD3, CLK_SDSRC, 0x026c), |
94 | 95 | ||
95 | DEF_FIXED("cl", R8A7795_CLK_CL, CLK_PLL1_DIV2, 48, 1), | 96 | DEF_FIXED("cl", R8A7795_CLK_CL, CLK_PLL1_DIV2, 48, 1), |
96 | DEF_FIXED("cp", R8A7795_CLK_CP, CLK_EXTAL, 2, 1), | 97 | DEF_FIXED("cp", R8A7795_CLK_CP, CLK_EXTAL, 2, 1), |
diff --git a/drivers/clk/rockchip/clk-rk3399.c b/drivers/clk/rockchip/clk-rk3399.c index c109d80e7a8a..cdfabeb9a034 100644 --- a/drivers/clk/rockchip/clk-rk3399.c +++ b/drivers/clk/rockchip/clk-rk3399.c | |||
@@ -833,9 +833,9 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = { | |||
833 | 833 | ||
834 | /* perihp */ | 834 | /* perihp */ |
835 | GATE(0, "cpll_aclk_perihp_src", "cpll", CLK_IGNORE_UNUSED, | 835 | GATE(0, "cpll_aclk_perihp_src", "cpll", CLK_IGNORE_UNUSED, |
836 | RK3399_CLKGATE_CON(5), 0, GFLAGS), | ||
837 | GATE(0, "gpll_aclk_perihp_src", "gpll", CLK_IGNORE_UNUSED, | ||
838 | RK3399_CLKGATE_CON(5), 1, GFLAGS), | 836 | RK3399_CLKGATE_CON(5), 1, GFLAGS), |
837 | GATE(0, "gpll_aclk_perihp_src", "gpll", CLK_IGNORE_UNUSED, | ||
838 | RK3399_CLKGATE_CON(5), 0, GFLAGS), | ||
839 | COMPOSITE(ACLK_PERIHP, "aclk_perihp", mux_aclk_perihp_p, CLK_IGNORE_UNUSED, | 839 | COMPOSITE(ACLK_PERIHP, "aclk_perihp", mux_aclk_perihp_p, CLK_IGNORE_UNUSED, |
840 | RK3399_CLKSEL_CON(14), 7, 1, MFLAGS, 0, 5, DFLAGS, | 840 | RK3399_CLKSEL_CON(14), 7, 1, MFLAGS, 0, 5, DFLAGS, |
841 | RK3399_CLKGATE_CON(5), 2, GFLAGS), | 841 | RK3399_CLKGATE_CON(5), 2, GFLAGS), |
@@ -923,9 +923,9 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = { | |||
923 | RK3399_CLKGATE_CON(6), 14, GFLAGS), | 923 | RK3399_CLKGATE_CON(6), 14, GFLAGS), |
924 | 924 | ||
925 | GATE(0, "cpll_aclk_emmc_src", "cpll", CLK_IGNORE_UNUSED, | 925 | GATE(0, "cpll_aclk_emmc_src", "cpll", CLK_IGNORE_UNUSED, |
926 | RK3399_CLKGATE_CON(6), 12, GFLAGS), | ||
927 | GATE(0, "gpll_aclk_emmc_src", "gpll", CLK_IGNORE_UNUSED, | ||
928 | RK3399_CLKGATE_CON(6), 13, GFLAGS), | 926 | RK3399_CLKGATE_CON(6), 13, GFLAGS), |
927 | GATE(0, "gpll_aclk_emmc_src", "gpll", CLK_IGNORE_UNUSED, | ||
928 | RK3399_CLKGATE_CON(6), 12, GFLAGS), | ||
929 | COMPOSITE_NOGATE(ACLK_EMMC, "aclk_emmc", mux_aclk_emmc_p, CLK_IGNORE_UNUSED, | 929 | COMPOSITE_NOGATE(ACLK_EMMC, "aclk_emmc", mux_aclk_emmc_p, CLK_IGNORE_UNUSED, |
930 | RK3399_CLKSEL_CON(21), 7, 1, MFLAGS, 0, 5, DFLAGS), | 930 | RK3399_CLKSEL_CON(21), 7, 1, MFLAGS, 0, 5, DFLAGS), |
931 | GATE(ACLK_EMMC_CORE, "aclk_emmccore", "aclk_emmc", CLK_IGNORE_UNUSED, | 931 | GATE(ACLK_EMMC_CORE, "aclk_emmccore", "aclk_emmc", CLK_IGNORE_UNUSED, |
@@ -1071,7 +1071,7 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = { | |||
1071 | /* vio */ | 1071 | /* vio */ |
1072 | COMPOSITE(ACLK_VIO, "aclk_vio", mux_pll_src_cpll_gpll_ppll_p, CLK_IGNORE_UNUSED, | 1072 | COMPOSITE(ACLK_VIO, "aclk_vio", mux_pll_src_cpll_gpll_ppll_p, CLK_IGNORE_UNUSED, |
1073 | RK3399_CLKSEL_CON(42), 6, 2, MFLAGS, 0, 5, DFLAGS, | 1073 | RK3399_CLKSEL_CON(42), 6, 2, MFLAGS, 0, 5, DFLAGS, |
1074 | RK3399_CLKGATE_CON(11), 10, GFLAGS), | 1074 | RK3399_CLKGATE_CON(11), 0, GFLAGS), |
1075 | COMPOSITE_NOMUX(PCLK_VIO, "pclk_vio", "aclk_vio", 0, | 1075 | COMPOSITE_NOMUX(PCLK_VIO, "pclk_vio", "aclk_vio", 0, |
1076 | RK3399_CLKSEL_CON(43), 0, 5, DFLAGS, | 1076 | RK3399_CLKSEL_CON(43), 0, 5, DFLAGS, |
1077 | RK3399_CLKGATE_CON(11), 1, GFLAGS), | 1077 | RK3399_CLKGATE_CON(11), 1, GFLAGS), |
@@ -1484,6 +1484,7 @@ static const char *const rk3399_cru_critical_clocks[] __initconst = { | |||
1484 | "hclk_perilp1", | 1484 | "hclk_perilp1", |
1485 | "hclk_perilp1_noc", | 1485 | "hclk_perilp1_noc", |
1486 | "aclk_dmac0_perilp", | 1486 | "aclk_dmac0_perilp", |
1487 | "aclk_emmc_noc", | ||
1487 | "gpll_hclk_perilp1_src", | 1488 | "gpll_hclk_perilp1_src", |
1488 | "gpll_aclk_perilp0_src", | 1489 | "gpll_aclk_perilp0_src", |
1489 | "gpll_aclk_perihp_src", | 1490 | "gpll_aclk_perihp_src", |
diff --git a/drivers/clk/sunxi-ng/ccu_common.c b/drivers/clk/sunxi-ng/ccu_common.c index fc17b5295e16..51d4bac97ab3 100644 --- a/drivers/clk/sunxi-ng/ccu_common.c +++ b/drivers/clk/sunxi-ng/ccu_common.c | |||
@@ -31,7 +31,7 @@ void ccu_helper_wait_for_lock(struct ccu_common *common, u32 lock) | |||
31 | return; | 31 | return; |
32 | 32 | ||
33 | WARN_ON(readl_relaxed_poll_timeout(common->base + common->reg, reg, | 33 | WARN_ON(readl_relaxed_poll_timeout(common->base + common->reg, reg, |
34 | !(reg & lock), 100, 70000)); | 34 | reg & lock, 100, 70000)); |
35 | } | 35 | } |
36 | 36 | ||
37 | int sunxi_ccu_probe(struct device_node *node, void __iomem *reg, | 37 | int sunxi_ccu_probe(struct device_node *node, void __iomem *reg, |
diff --git a/drivers/clk/tegra/clk-tegra114.c b/drivers/clk/tegra/clk-tegra114.c index 64da7b79a6e4..933b5dd698b8 100644 --- a/drivers/clk/tegra/clk-tegra114.c +++ b/drivers/clk/tegra/clk-tegra114.c | |||
@@ -428,7 +428,7 @@ static struct tegra_clk_pll_params pll_d_params = { | |||
428 | .div_nmp = &pllp_nmp, | 428 | .div_nmp = &pllp_nmp, |
429 | .freq_table = pll_d_freq_table, | 429 | .freq_table = pll_d_freq_table, |
430 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | 430 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | |
431 | TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE, | 431 | TEGRA_PLL_HAS_LOCK_ENABLE, |
432 | }; | 432 | }; |
433 | 433 | ||
434 | static struct tegra_clk_pll_params pll_d2_params = { | 434 | static struct tegra_clk_pll_params pll_d2_params = { |
@@ -446,7 +446,7 @@ static struct tegra_clk_pll_params pll_d2_params = { | |||
446 | .div_nmp = &pllp_nmp, | 446 | .div_nmp = &pllp_nmp, |
447 | .freq_table = pll_d_freq_table, | 447 | .freq_table = pll_d_freq_table, |
448 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | 448 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | |
449 | TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE, | 449 | TEGRA_PLL_HAS_LOCK_ENABLE, |
450 | }; | 450 | }; |
451 | 451 | ||
452 | static const struct pdiv_map pllu_p[] = { | 452 | static const struct pdiv_map pllu_p[] = { |
diff --git a/drivers/clocksource/timer-atmel-pit.c b/drivers/clocksource/timer-atmel-pit.c index 3494bc5a21d5..7f0f5b26d8c5 100644 --- a/drivers/clocksource/timer-atmel-pit.c +++ b/drivers/clocksource/timer-atmel-pit.c | |||
@@ -240,6 +240,7 @@ static int __init at91sam926x_pit_common_init(struct pit_data *data) | |||
240 | static int __init at91sam926x_pit_dt_init(struct device_node *node) | 240 | static int __init at91sam926x_pit_dt_init(struct device_node *node) |
241 | { | 241 | { |
242 | struct pit_data *data; | 242 | struct pit_data *data; |
243 | int ret; | ||
243 | 244 | ||
244 | data = kzalloc(sizeof(*data), GFP_KERNEL); | 245 | data = kzalloc(sizeof(*data), GFP_KERNEL); |
245 | if (!data) | 246 | if (!data) |
diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c index 0bb44d5b5df4..2ee40fd360ca 100644 --- a/drivers/cpufreq/cpufreq-dt-platdev.c +++ b/drivers/cpufreq/cpufreq-dt-platdev.c | |||
@@ -74,6 +74,8 @@ static const struct of_device_id machines[] __initconst = { | |||
74 | { .compatible = "ti,omap5", }, | 74 | { .compatible = "ti,omap5", }, |
75 | 75 | ||
76 | { .compatible = "xlnx,zynq-7000", }, | 76 | { .compatible = "xlnx,zynq-7000", }, |
77 | |||
78 | { } | ||
77 | }; | 79 | }; |
78 | 80 | ||
79 | static int __init cpufreq_dt_platdev_init(void) | 81 | static int __init cpufreq_dt_platdev_init(void) |
diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c index 6dc597126b79..b3044219772c 100644 --- a/drivers/crypto/caam/caamalg.c +++ b/drivers/crypto/caam/caamalg.c | |||
@@ -556,7 +556,10 @@ skip_enc: | |||
556 | 556 | ||
557 | /* Read and write assoclen bytes */ | 557 | /* Read and write assoclen bytes */ |
558 | append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ); | 558 | append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ); |
559 | append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ); | 559 | if (alg->caam.geniv) |
560 | append_math_add_imm_u32(desc, VARSEQOUTLEN, REG3, IMM, ivsize); | ||
561 | else | ||
562 | append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ); | ||
560 | 563 | ||
561 | /* Skip assoc data */ | 564 | /* Skip assoc data */ |
562 | append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF); | 565 | append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF); |
@@ -565,6 +568,14 @@ skip_enc: | |||
565 | append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG | | 568 | append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG | |
566 | KEY_VLF); | 569 | KEY_VLF); |
567 | 570 | ||
571 | if (alg->caam.geniv) { | ||
572 | append_seq_load(desc, ivsize, LDST_CLASS_1_CCB | | ||
573 | LDST_SRCDST_BYTE_CONTEXT | | ||
574 | (ctx1_iv_off << LDST_OFFSET_SHIFT)); | ||
575 | append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_CLASS2INFIFO | | ||
576 | (ctx1_iv_off << MOVE_OFFSET_SHIFT) | ivsize); | ||
577 | } | ||
578 | |||
568 | /* Load Counter into CONTEXT1 reg */ | 579 | /* Load Counter into CONTEXT1 reg */ |
569 | if (is_rfc3686) | 580 | if (is_rfc3686) |
570 | append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM | | 581 | append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM | |
@@ -2150,7 +2161,7 @@ static void init_authenc_job(struct aead_request *req, | |||
2150 | 2161 | ||
2151 | init_aead_job(req, edesc, all_contig, encrypt); | 2162 | init_aead_job(req, edesc, all_contig, encrypt); |
2152 | 2163 | ||
2153 | if (ivsize && (is_rfc3686 || !(alg->caam.geniv && encrypt))) | 2164 | if (ivsize && ((is_rfc3686 && encrypt) || !alg->caam.geniv)) |
2154 | append_load_as_imm(desc, req->iv, ivsize, | 2165 | append_load_as_imm(desc, req->iv, ivsize, |
2155 | LDST_CLASS_1_CCB | | 2166 | LDST_CLASS_1_CCB | |
2156 | LDST_SRCDST_BYTE_CONTEXT | | 2167 | LDST_SRCDST_BYTE_CONTEXT | |
@@ -2537,20 +2548,6 @@ static int aead_decrypt(struct aead_request *req) | |||
2537 | return ret; | 2548 | return ret; |
2538 | } | 2549 | } |
2539 | 2550 | ||
2540 | static int aead_givdecrypt(struct aead_request *req) | ||
2541 | { | ||
2542 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
2543 | unsigned int ivsize = crypto_aead_ivsize(aead); | ||
2544 | |||
2545 | if (req->cryptlen < ivsize) | ||
2546 | return -EINVAL; | ||
2547 | |||
2548 | req->cryptlen -= ivsize; | ||
2549 | req->assoclen += ivsize; | ||
2550 | |||
2551 | return aead_decrypt(req); | ||
2552 | } | ||
2553 | |||
2554 | /* | 2551 | /* |
2555 | * allocate and map the ablkcipher extended descriptor for ablkcipher | 2552 | * allocate and map the ablkcipher extended descriptor for ablkcipher |
2556 | */ | 2553 | */ |
@@ -3210,7 +3207,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3210 | .setkey = aead_setkey, | 3207 | .setkey = aead_setkey, |
3211 | .setauthsize = aead_setauthsize, | 3208 | .setauthsize = aead_setauthsize, |
3212 | .encrypt = aead_encrypt, | 3209 | .encrypt = aead_encrypt, |
3213 | .decrypt = aead_givdecrypt, | 3210 | .decrypt = aead_decrypt, |
3214 | .ivsize = AES_BLOCK_SIZE, | 3211 | .ivsize = AES_BLOCK_SIZE, |
3215 | .maxauthsize = MD5_DIGEST_SIZE, | 3212 | .maxauthsize = MD5_DIGEST_SIZE, |
3216 | }, | 3213 | }, |
@@ -3256,7 +3253,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3256 | .setkey = aead_setkey, | 3253 | .setkey = aead_setkey, |
3257 | .setauthsize = aead_setauthsize, | 3254 | .setauthsize = aead_setauthsize, |
3258 | .encrypt = aead_encrypt, | 3255 | .encrypt = aead_encrypt, |
3259 | .decrypt = aead_givdecrypt, | 3256 | .decrypt = aead_decrypt, |
3260 | .ivsize = AES_BLOCK_SIZE, | 3257 | .ivsize = AES_BLOCK_SIZE, |
3261 | .maxauthsize = SHA1_DIGEST_SIZE, | 3258 | .maxauthsize = SHA1_DIGEST_SIZE, |
3262 | }, | 3259 | }, |
@@ -3302,7 +3299,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3302 | .setkey = aead_setkey, | 3299 | .setkey = aead_setkey, |
3303 | .setauthsize = aead_setauthsize, | 3300 | .setauthsize = aead_setauthsize, |
3304 | .encrypt = aead_encrypt, | 3301 | .encrypt = aead_encrypt, |
3305 | .decrypt = aead_givdecrypt, | 3302 | .decrypt = aead_decrypt, |
3306 | .ivsize = AES_BLOCK_SIZE, | 3303 | .ivsize = AES_BLOCK_SIZE, |
3307 | .maxauthsize = SHA224_DIGEST_SIZE, | 3304 | .maxauthsize = SHA224_DIGEST_SIZE, |
3308 | }, | 3305 | }, |
@@ -3348,7 +3345,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3348 | .setkey = aead_setkey, | 3345 | .setkey = aead_setkey, |
3349 | .setauthsize = aead_setauthsize, | 3346 | .setauthsize = aead_setauthsize, |
3350 | .encrypt = aead_encrypt, | 3347 | .encrypt = aead_encrypt, |
3351 | .decrypt = aead_givdecrypt, | 3348 | .decrypt = aead_decrypt, |
3352 | .ivsize = AES_BLOCK_SIZE, | 3349 | .ivsize = AES_BLOCK_SIZE, |
3353 | .maxauthsize = SHA256_DIGEST_SIZE, | 3350 | .maxauthsize = SHA256_DIGEST_SIZE, |
3354 | }, | 3351 | }, |
@@ -3394,7 +3391,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3394 | .setkey = aead_setkey, | 3391 | .setkey = aead_setkey, |
3395 | .setauthsize = aead_setauthsize, | 3392 | .setauthsize = aead_setauthsize, |
3396 | .encrypt = aead_encrypt, | 3393 | .encrypt = aead_encrypt, |
3397 | .decrypt = aead_givdecrypt, | 3394 | .decrypt = aead_decrypt, |
3398 | .ivsize = AES_BLOCK_SIZE, | 3395 | .ivsize = AES_BLOCK_SIZE, |
3399 | .maxauthsize = SHA384_DIGEST_SIZE, | 3396 | .maxauthsize = SHA384_DIGEST_SIZE, |
3400 | }, | 3397 | }, |
@@ -3440,7 +3437,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3440 | .setkey = aead_setkey, | 3437 | .setkey = aead_setkey, |
3441 | .setauthsize = aead_setauthsize, | 3438 | .setauthsize = aead_setauthsize, |
3442 | .encrypt = aead_encrypt, | 3439 | .encrypt = aead_encrypt, |
3443 | .decrypt = aead_givdecrypt, | 3440 | .decrypt = aead_decrypt, |
3444 | .ivsize = AES_BLOCK_SIZE, | 3441 | .ivsize = AES_BLOCK_SIZE, |
3445 | .maxauthsize = SHA512_DIGEST_SIZE, | 3442 | .maxauthsize = SHA512_DIGEST_SIZE, |
3446 | }, | 3443 | }, |
@@ -3486,7 +3483,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3486 | .setkey = aead_setkey, | 3483 | .setkey = aead_setkey, |
3487 | .setauthsize = aead_setauthsize, | 3484 | .setauthsize = aead_setauthsize, |
3488 | .encrypt = aead_encrypt, | 3485 | .encrypt = aead_encrypt, |
3489 | .decrypt = aead_givdecrypt, | 3486 | .decrypt = aead_decrypt, |
3490 | .ivsize = DES3_EDE_BLOCK_SIZE, | 3487 | .ivsize = DES3_EDE_BLOCK_SIZE, |
3491 | .maxauthsize = MD5_DIGEST_SIZE, | 3488 | .maxauthsize = MD5_DIGEST_SIZE, |
3492 | }, | 3489 | }, |
@@ -3534,7 +3531,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3534 | .setkey = aead_setkey, | 3531 | .setkey = aead_setkey, |
3535 | .setauthsize = aead_setauthsize, | 3532 | .setauthsize = aead_setauthsize, |
3536 | .encrypt = aead_encrypt, | 3533 | .encrypt = aead_encrypt, |
3537 | .decrypt = aead_givdecrypt, | 3534 | .decrypt = aead_decrypt, |
3538 | .ivsize = DES3_EDE_BLOCK_SIZE, | 3535 | .ivsize = DES3_EDE_BLOCK_SIZE, |
3539 | .maxauthsize = SHA1_DIGEST_SIZE, | 3536 | .maxauthsize = SHA1_DIGEST_SIZE, |
3540 | }, | 3537 | }, |
@@ -3582,7 +3579,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3582 | .setkey = aead_setkey, | 3579 | .setkey = aead_setkey, |
3583 | .setauthsize = aead_setauthsize, | 3580 | .setauthsize = aead_setauthsize, |
3584 | .encrypt = aead_encrypt, | 3581 | .encrypt = aead_encrypt, |
3585 | .decrypt = aead_givdecrypt, | 3582 | .decrypt = aead_decrypt, |
3586 | .ivsize = DES3_EDE_BLOCK_SIZE, | 3583 | .ivsize = DES3_EDE_BLOCK_SIZE, |
3587 | .maxauthsize = SHA224_DIGEST_SIZE, | 3584 | .maxauthsize = SHA224_DIGEST_SIZE, |
3588 | }, | 3585 | }, |
@@ -3630,7 +3627,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3630 | .setkey = aead_setkey, | 3627 | .setkey = aead_setkey, |
3631 | .setauthsize = aead_setauthsize, | 3628 | .setauthsize = aead_setauthsize, |
3632 | .encrypt = aead_encrypt, | 3629 | .encrypt = aead_encrypt, |
3633 | .decrypt = aead_givdecrypt, | 3630 | .decrypt = aead_decrypt, |
3634 | .ivsize = DES3_EDE_BLOCK_SIZE, | 3631 | .ivsize = DES3_EDE_BLOCK_SIZE, |
3635 | .maxauthsize = SHA256_DIGEST_SIZE, | 3632 | .maxauthsize = SHA256_DIGEST_SIZE, |
3636 | }, | 3633 | }, |
@@ -3678,7 +3675,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3678 | .setkey = aead_setkey, | 3675 | .setkey = aead_setkey, |
3679 | .setauthsize = aead_setauthsize, | 3676 | .setauthsize = aead_setauthsize, |
3680 | .encrypt = aead_encrypt, | 3677 | .encrypt = aead_encrypt, |
3681 | .decrypt = aead_givdecrypt, | 3678 | .decrypt = aead_decrypt, |
3682 | .ivsize = DES3_EDE_BLOCK_SIZE, | 3679 | .ivsize = DES3_EDE_BLOCK_SIZE, |
3683 | .maxauthsize = SHA384_DIGEST_SIZE, | 3680 | .maxauthsize = SHA384_DIGEST_SIZE, |
3684 | }, | 3681 | }, |
@@ -3726,7 +3723,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3726 | .setkey = aead_setkey, | 3723 | .setkey = aead_setkey, |
3727 | .setauthsize = aead_setauthsize, | 3724 | .setauthsize = aead_setauthsize, |
3728 | .encrypt = aead_encrypt, | 3725 | .encrypt = aead_encrypt, |
3729 | .decrypt = aead_givdecrypt, | 3726 | .decrypt = aead_decrypt, |
3730 | .ivsize = DES3_EDE_BLOCK_SIZE, | 3727 | .ivsize = DES3_EDE_BLOCK_SIZE, |
3731 | .maxauthsize = SHA512_DIGEST_SIZE, | 3728 | .maxauthsize = SHA512_DIGEST_SIZE, |
3732 | }, | 3729 | }, |
@@ -3772,7 +3769,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3772 | .setkey = aead_setkey, | 3769 | .setkey = aead_setkey, |
3773 | .setauthsize = aead_setauthsize, | 3770 | .setauthsize = aead_setauthsize, |
3774 | .encrypt = aead_encrypt, | 3771 | .encrypt = aead_encrypt, |
3775 | .decrypt = aead_givdecrypt, | 3772 | .decrypt = aead_decrypt, |
3776 | .ivsize = DES_BLOCK_SIZE, | 3773 | .ivsize = DES_BLOCK_SIZE, |
3777 | .maxauthsize = MD5_DIGEST_SIZE, | 3774 | .maxauthsize = MD5_DIGEST_SIZE, |
3778 | }, | 3775 | }, |
@@ -3818,7 +3815,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3818 | .setkey = aead_setkey, | 3815 | .setkey = aead_setkey, |
3819 | .setauthsize = aead_setauthsize, | 3816 | .setauthsize = aead_setauthsize, |
3820 | .encrypt = aead_encrypt, | 3817 | .encrypt = aead_encrypt, |
3821 | .decrypt = aead_givdecrypt, | 3818 | .decrypt = aead_decrypt, |
3822 | .ivsize = DES_BLOCK_SIZE, | 3819 | .ivsize = DES_BLOCK_SIZE, |
3823 | .maxauthsize = SHA1_DIGEST_SIZE, | 3820 | .maxauthsize = SHA1_DIGEST_SIZE, |
3824 | }, | 3821 | }, |
@@ -3864,7 +3861,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3864 | .setkey = aead_setkey, | 3861 | .setkey = aead_setkey, |
3865 | .setauthsize = aead_setauthsize, | 3862 | .setauthsize = aead_setauthsize, |
3866 | .encrypt = aead_encrypt, | 3863 | .encrypt = aead_encrypt, |
3867 | .decrypt = aead_givdecrypt, | 3864 | .decrypt = aead_decrypt, |
3868 | .ivsize = DES_BLOCK_SIZE, | 3865 | .ivsize = DES_BLOCK_SIZE, |
3869 | .maxauthsize = SHA224_DIGEST_SIZE, | 3866 | .maxauthsize = SHA224_DIGEST_SIZE, |
3870 | }, | 3867 | }, |
@@ -3910,7 +3907,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3910 | .setkey = aead_setkey, | 3907 | .setkey = aead_setkey, |
3911 | .setauthsize = aead_setauthsize, | 3908 | .setauthsize = aead_setauthsize, |
3912 | .encrypt = aead_encrypt, | 3909 | .encrypt = aead_encrypt, |
3913 | .decrypt = aead_givdecrypt, | 3910 | .decrypt = aead_decrypt, |
3914 | .ivsize = DES_BLOCK_SIZE, | 3911 | .ivsize = DES_BLOCK_SIZE, |
3915 | .maxauthsize = SHA256_DIGEST_SIZE, | 3912 | .maxauthsize = SHA256_DIGEST_SIZE, |
3916 | }, | 3913 | }, |
@@ -3956,7 +3953,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
3956 | .setkey = aead_setkey, | 3953 | .setkey = aead_setkey, |
3957 | .setauthsize = aead_setauthsize, | 3954 | .setauthsize = aead_setauthsize, |
3958 | .encrypt = aead_encrypt, | 3955 | .encrypt = aead_encrypt, |
3959 | .decrypt = aead_givdecrypt, | 3956 | .decrypt = aead_decrypt, |
3960 | .ivsize = DES_BLOCK_SIZE, | 3957 | .ivsize = DES_BLOCK_SIZE, |
3961 | .maxauthsize = SHA384_DIGEST_SIZE, | 3958 | .maxauthsize = SHA384_DIGEST_SIZE, |
3962 | }, | 3959 | }, |
@@ -4002,7 +3999,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
4002 | .setkey = aead_setkey, | 3999 | .setkey = aead_setkey, |
4003 | .setauthsize = aead_setauthsize, | 4000 | .setauthsize = aead_setauthsize, |
4004 | .encrypt = aead_encrypt, | 4001 | .encrypt = aead_encrypt, |
4005 | .decrypt = aead_givdecrypt, | 4002 | .decrypt = aead_decrypt, |
4006 | .ivsize = DES_BLOCK_SIZE, | 4003 | .ivsize = DES_BLOCK_SIZE, |
4007 | .maxauthsize = SHA512_DIGEST_SIZE, | 4004 | .maxauthsize = SHA512_DIGEST_SIZE, |
4008 | }, | 4005 | }, |
@@ -4051,7 +4048,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
4051 | .setkey = aead_setkey, | 4048 | .setkey = aead_setkey, |
4052 | .setauthsize = aead_setauthsize, | 4049 | .setauthsize = aead_setauthsize, |
4053 | .encrypt = aead_encrypt, | 4050 | .encrypt = aead_encrypt, |
4054 | .decrypt = aead_givdecrypt, | 4051 | .decrypt = aead_decrypt, |
4055 | .ivsize = CTR_RFC3686_IV_SIZE, | 4052 | .ivsize = CTR_RFC3686_IV_SIZE, |
4056 | .maxauthsize = MD5_DIGEST_SIZE, | 4053 | .maxauthsize = MD5_DIGEST_SIZE, |
4057 | }, | 4054 | }, |
@@ -4102,7 +4099,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
4102 | .setkey = aead_setkey, | 4099 | .setkey = aead_setkey, |
4103 | .setauthsize = aead_setauthsize, | 4100 | .setauthsize = aead_setauthsize, |
4104 | .encrypt = aead_encrypt, | 4101 | .encrypt = aead_encrypt, |
4105 | .decrypt = aead_givdecrypt, | 4102 | .decrypt = aead_decrypt, |
4106 | .ivsize = CTR_RFC3686_IV_SIZE, | 4103 | .ivsize = CTR_RFC3686_IV_SIZE, |
4107 | .maxauthsize = SHA1_DIGEST_SIZE, | 4104 | .maxauthsize = SHA1_DIGEST_SIZE, |
4108 | }, | 4105 | }, |
@@ -4153,7 +4150,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
4153 | .setkey = aead_setkey, | 4150 | .setkey = aead_setkey, |
4154 | .setauthsize = aead_setauthsize, | 4151 | .setauthsize = aead_setauthsize, |
4155 | .encrypt = aead_encrypt, | 4152 | .encrypt = aead_encrypt, |
4156 | .decrypt = aead_givdecrypt, | 4153 | .decrypt = aead_decrypt, |
4157 | .ivsize = CTR_RFC3686_IV_SIZE, | 4154 | .ivsize = CTR_RFC3686_IV_SIZE, |
4158 | .maxauthsize = SHA224_DIGEST_SIZE, | 4155 | .maxauthsize = SHA224_DIGEST_SIZE, |
4159 | }, | 4156 | }, |
@@ -4204,7 +4201,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
4204 | .setkey = aead_setkey, | 4201 | .setkey = aead_setkey, |
4205 | .setauthsize = aead_setauthsize, | 4202 | .setauthsize = aead_setauthsize, |
4206 | .encrypt = aead_encrypt, | 4203 | .encrypt = aead_encrypt, |
4207 | .decrypt = aead_givdecrypt, | 4204 | .decrypt = aead_decrypt, |
4208 | .ivsize = CTR_RFC3686_IV_SIZE, | 4205 | .ivsize = CTR_RFC3686_IV_SIZE, |
4209 | .maxauthsize = SHA256_DIGEST_SIZE, | 4206 | .maxauthsize = SHA256_DIGEST_SIZE, |
4210 | }, | 4207 | }, |
@@ -4255,7 +4252,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
4255 | .setkey = aead_setkey, | 4252 | .setkey = aead_setkey, |
4256 | .setauthsize = aead_setauthsize, | 4253 | .setauthsize = aead_setauthsize, |
4257 | .encrypt = aead_encrypt, | 4254 | .encrypt = aead_encrypt, |
4258 | .decrypt = aead_givdecrypt, | 4255 | .decrypt = aead_decrypt, |
4259 | .ivsize = CTR_RFC3686_IV_SIZE, | 4256 | .ivsize = CTR_RFC3686_IV_SIZE, |
4260 | .maxauthsize = SHA384_DIGEST_SIZE, | 4257 | .maxauthsize = SHA384_DIGEST_SIZE, |
4261 | }, | 4258 | }, |
@@ -4306,7 +4303,7 @@ static struct caam_aead_alg driver_aeads[] = { | |||
4306 | .setkey = aead_setkey, | 4303 | .setkey = aead_setkey, |
4307 | .setauthsize = aead_setauthsize, | 4304 | .setauthsize = aead_setauthsize, |
4308 | .encrypt = aead_encrypt, | 4305 | .encrypt = aead_encrypt, |
4309 | .decrypt = aead_givdecrypt, | 4306 | .decrypt = aead_decrypt, |
4310 | .ivsize = CTR_RFC3686_IV_SIZE, | 4307 | .ivsize = CTR_RFC3686_IV_SIZE, |
4311 | .maxauthsize = SHA512_DIGEST_SIZE, | 4308 | .maxauthsize = SHA512_DIGEST_SIZE, |
4312 | }, | 4309 | }, |
diff --git a/drivers/crypto/qat/qat_common/qat_algs.c b/drivers/crypto/qat/qat_common/qat_algs.c index 769148dbaeb3..20f35df8a01f 100644 --- a/drivers/crypto/qat/qat_common/qat_algs.c +++ b/drivers/crypto/qat/qat_common/qat_algs.c | |||
@@ -1260,8 +1260,8 @@ static struct crypto_alg qat_algs[] = { { | |||
1260 | .setkey = qat_alg_ablkcipher_xts_setkey, | 1260 | .setkey = qat_alg_ablkcipher_xts_setkey, |
1261 | .decrypt = qat_alg_ablkcipher_decrypt, | 1261 | .decrypt = qat_alg_ablkcipher_decrypt, |
1262 | .encrypt = qat_alg_ablkcipher_encrypt, | 1262 | .encrypt = qat_alg_ablkcipher_encrypt, |
1263 | .min_keysize = AES_MIN_KEY_SIZE, | 1263 | .min_keysize = 2 * AES_MIN_KEY_SIZE, |
1264 | .max_keysize = AES_MAX_KEY_SIZE, | 1264 | .max_keysize = 2 * AES_MAX_KEY_SIZE, |
1265 | .ivsize = AES_BLOCK_SIZE, | 1265 | .ivsize = AES_BLOCK_SIZE, |
1266 | }, | 1266 | }, |
1267 | }, | 1267 | }, |
diff --git a/drivers/crypto/vmx/aes_xts.c b/drivers/crypto/vmx/aes_xts.c index cfb25413917c..24353ec336c5 100644 --- a/drivers/crypto/vmx/aes_xts.c +++ b/drivers/crypto/vmx/aes_xts.c | |||
@@ -129,8 +129,8 @@ static int p8_aes_xts_crypt(struct blkcipher_desc *desc, | |||
129 | 129 | ||
130 | blkcipher_walk_init(&walk, dst, src, nbytes); | 130 | blkcipher_walk_init(&walk, dst, src, nbytes); |
131 | 131 | ||
132 | iv = (u8 *)walk.iv; | ||
133 | ret = blkcipher_walk_virt(desc, &walk); | 132 | ret = blkcipher_walk_virt(desc, &walk); |
133 | iv = walk.iv; | ||
134 | memset(tweak, 0, AES_BLOCK_SIZE); | 134 | memset(tweak, 0, AES_BLOCK_SIZE); |
135 | aes_p8_encrypt(iv, tweak, &ctx->tweak_key); | 135 | aes_p8_encrypt(iv, tweak, &ctx->tweak_key); |
136 | 136 | ||
diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c index 803f3953b341..29f600f2c447 100644 --- a/drivers/dax/dax.c +++ b/drivers/dax/dax.c | |||
@@ -459,7 +459,7 @@ static int __dax_dev_pmd_fault(struct dax_dev *dax_dev, | |||
459 | } | 459 | } |
460 | 460 | ||
461 | pgoff = linear_page_index(vma, pmd_addr); | 461 | pgoff = linear_page_index(vma, pmd_addr); |
462 | phys = pgoff_to_phys(dax_dev, pgoff, PAGE_SIZE); | 462 | phys = pgoff_to_phys(dax_dev, pgoff, PMD_SIZE); |
463 | if (phys == -1) { | 463 | if (phys == -1) { |
464 | dev_dbg(dev, "%s: phys_to_pgoff(%#lx) failed\n", __func__, | 464 | dev_dbg(dev, "%s: phys_to_pgoff(%#lx) failed\n", __func__, |
465 | pgoff); | 465 | pgoff); |
diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c index e434ffe7bc5c..832cbd647145 100644 --- a/drivers/dma/at_xdmac.c +++ b/drivers/dma/at_xdmac.c | |||
@@ -2067,7 +2067,7 @@ err_dma_unregister: | |||
2067 | err_clk_disable: | 2067 | err_clk_disable: |
2068 | clk_disable_unprepare(atxdmac->clk); | 2068 | clk_disable_unprepare(atxdmac->clk); |
2069 | err_free_irq: | 2069 | err_free_irq: |
2070 | free_irq(atxdmac->irq, atxdmac->dma.dev); | 2070 | free_irq(atxdmac->irq, atxdmac); |
2071 | return ret; | 2071 | return ret; |
2072 | } | 2072 | } |
2073 | 2073 | ||
@@ -2081,7 +2081,7 @@ static int at_xdmac_remove(struct platform_device *pdev) | |||
2081 | dma_async_device_unregister(&atxdmac->dma); | 2081 | dma_async_device_unregister(&atxdmac->dma); |
2082 | clk_disable_unprepare(atxdmac->clk); | 2082 | clk_disable_unprepare(atxdmac->clk); |
2083 | 2083 | ||
2084 | free_irq(atxdmac->irq, atxdmac->dma.dev); | 2084 | free_irq(atxdmac->irq, atxdmac); |
2085 | 2085 | ||
2086 | for (i = 0; i < atxdmac->dma.chancnt; i++) { | 2086 | for (i = 0; i < atxdmac->dma.chancnt; i++) { |
2087 | struct at_xdmac_chan *atchan = &atxdmac->chan[i]; | 2087 | struct at_xdmac_chan *atchan = &atxdmac->chan[i]; |
diff --git a/drivers/dma/fsl_raid.c b/drivers/dma/fsl_raid.c index aad167eaaee8..de2a2a2b1d75 100644 --- a/drivers/dma/fsl_raid.c +++ b/drivers/dma/fsl_raid.c | |||
@@ -836,6 +836,7 @@ static int fsl_re_probe(struct platform_device *ofdev) | |||
836 | rc = of_property_read_u32(np, "reg", &off); | 836 | rc = of_property_read_u32(np, "reg", &off); |
837 | if (rc) { | 837 | if (rc) { |
838 | dev_err(dev, "Reg property not found in JQ node\n"); | 838 | dev_err(dev, "Reg property not found in JQ node\n"); |
839 | of_node_put(np); | ||
839 | return -ENODEV; | 840 | return -ENODEV; |
840 | } | 841 | } |
841 | /* Find out the Job Rings present under each JQ */ | 842 | /* Find out the Job Rings present under each JQ */ |
diff --git a/drivers/dma/img-mdc-dma.c b/drivers/dma/img-mdc-dma.c index a4c53be482cf..624f1e1e9c55 100644 --- a/drivers/dma/img-mdc-dma.c +++ b/drivers/dma/img-mdc-dma.c | |||
@@ -861,7 +861,6 @@ static int mdc_dma_probe(struct platform_device *pdev) | |||
861 | { | 861 | { |
862 | struct mdc_dma *mdma; | 862 | struct mdc_dma *mdma; |
863 | struct resource *res; | 863 | struct resource *res; |
864 | const struct of_device_id *match; | ||
865 | unsigned int i; | 864 | unsigned int i; |
866 | u32 val; | 865 | u32 val; |
867 | int ret; | 866 | int ret; |
@@ -871,8 +870,7 @@ static int mdc_dma_probe(struct platform_device *pdev) | |||
871 | return -ENOMEM; | 870 | return -ENOMEM; |
872 | platform_set_drvdata(pdev, mdma); | 871 | platform_set_drvdata(pdev, mdma); |
873 | 872 | ||
874 | match = of_match_device(mdc_dma_of_match, &pdev->dev); | 873 | mdma->soc = of_device_get_match_data(&pdev->dev); |
875 | mdma->soc = match->data; | ||
876 | 874 | ||
877 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 875 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
878 | mdma->regs = devm_ioremap_resource(&pdev->dev, res); | 876 | mdma->regs = devm_ioremap_resource(&pdev->dev, res); |
diff --git a/drivers/dma/pxa_dma.c b/drivers/dma/pxa_dma.c index dc7850a422b8..3f56f9ca4482 100644 --- a/drivers/dma/pxa_dma.c +++ b/drivers/dma/pxa_dma.c | |||
@@ -638,7 +638,7 @@ static bool pxad_try_hotchain(struct virt_dma_chan *vc, | |||
638 | vd_last_issued = list_entry(vc->desc_issued.prev, | 638 | vd_last_issued = list_entry(vc->desc_issued.prev, |
639 | struct virt_dma_desc, node); | 639 | struct virt_dma_desc, node); |
640 | pxad_desc_chain(vd_last_issued, vd); | 640 | pxad_desc_chain(vd_last_issued, vd); |
641 | if (is_chan_running(chan) || is_desc_completed(vd_last_issued)) | 641 | if (is_chan_running(chan) || is_desc_completed(vd)) |
642 | return true; | 642 | return true; |
643 | } | 643 | } |
644 | 644 | ||
@@ -671,6 +671,7 @@ static irqreturn_t pxad_chan_handler(int irq, void *dev_id) | |||
671 | struct virt_dma_desc *vd, *tmp; | 671 | struct virt_dma_desc *vd, *tmp; |
672 | unsigned int dcsr; | 672 | unsigned int dcsr; |
673 | unsigned long flags; | 673 | unsigned long flags; |
674 | bool vd_completed; | ||
674 | dma_cookie_t last_started = 0; | 675 | dma_cookie_t last_started = 0; |
675 | 676 | ||
676 | BUG_ON(!chan); | 677 | BUG_ON(!chan); |
@@ -681,15 +682,17 @@ static irqreturn_t pxad_chan_handler(int irq, void *dev_id) | |||
681 | 682 | ||
682 | spin_lock_irqsave(&chan->vc.lock, flags); | 683 | spin_lock_irqsave(&chan->vc.lock, flags); |
683 | list_for_each_entry_safe(vd, tmp, &chan->vc.desc_issued, node) { | 684 | list_for_each_entry_safe(vd, tmp, &chan->vc.desc_issued, node) { |
685 | vd_completed = is_desc_completed(vd); | ||
684 | dev_dbg(&chan->vc.chan.dev->device, | 686 | dev_dbg(&chan->vc.chan.dev->device, |
685 | "%s(): checking txd %p[%x]: completed=%d\n", | 687 | "%s(): checking txd %p[%x]: completed=%d dcsr=0x%x\n", |
686 | __func__, vd, vd->tx.cookie, is_desc_completed(vd)); | 688 | __func__, vd, vd->tx.cookie, vd_completed, |
689 | dcsr); | ||
687 | last_started = vd->tx.cookie; | 690 | last_started = vd->tx.cookie; |
688 | if (to_pxad_sw_desc(vd)->cyclic) { | 691 | if (to_pxad_sw_desc(vd)->cyclic) { |
689 | vchan_cyclic_callback(vd); | 692 | vchan_cyclic_callback(vd); |
690 | break; | 693 | break; |
691 | } | 694 | } |
692 | if (is_desc_completed(vd)) { | 695 | if (vd_completed) { |
693 | list_del(&vd->node); | 696 | list_del(&vd->node); |
694 | vchan_cookie_complete(vd); | 697 | vchan_cookie_complete(vd); |
695 | } else { | 698 | } else { |
diff --git a/drivers/dma/sh/usb-dmac.c b/drivers/dma/sh/usb-dmac.c index 749f1bd5d65d..06ecdc38cee0 100644 --- a/drivers/dma/sh/usb-dmac.c +++ b/drivers/dma/sh/usb-dmac.c | |||
@@ -600,27 +600,30 @@ static irqreturn_t usb_dmac_isr_channel(int irq, void *dev) | |||
600 | { | 600 | { |
601 | struct usb_dmac_chan *chan = dev; | 601 | struct usb_dmac_chan *chan = dev; |
602 | irqreturn_t ret = IRQ_NONE; | 602 | irqreturn_t ret = IRQ_NONE; |
603 | u32 mask = USB_DMACHCR_TE; | 603 | u32 mask = 0; |
604 | u32 check_bits = USB_DMACHCR_TE | USB_DMACHCR_SP; | ||
605 | u32 chcr; | 604 | u32 chcr; |
605 | bool xfer_end = false; | ||
606 | 606 | ||
607 | spin_lock(&chan->vc.lock); | 607 | spin_lock(&chan->vc.lock); |
608 | 608 | ||
609 | chcr = usb_dmac_chan_read(chan, USB_DMACHCR); | 609 | chcr = usb_dmac_chan_read(chan, USB_DMACHCR); |
610 | if (chcr & check_bits) | 610 | if (chcr & (USB_DMACHCR_TE | USB_DMACHCR_SP)) { |
611 | mask |= USB_DMACHCR_DE | check_bits; | 611 | mask |= USB_DMACHCR_DE | USB_DMACHCR_TE | USB_DMACHCR_SP; |
612 | if (chcr & USB_DMACHCR_DE) | ||
613 | xfer_end = true; | ||
614 | ret |= IRQ_HANDLED; | ||
615 | } | ||
612 | if (chcr & USB_DMACHCR_NULL) { | 616 | if (chcr & USB_DMACHCR_NULL) { |
613 | /* An interruption of TE will happen after we set FTE */ | 617 | /* An interruption of TE will happen after we set FTE */ |
614 | mask |= USB_DMACHCR_NULL; | 618 | mask |= USB_DMACHCR_NULL; |
615 | chcr |= USB_DMACHCR_FTE; | 619 | chcr |= USB_DMACHCR_FTE; |
616 | ret |= IRQ_HANDLED; | 620 | ret |= IRQ_HANDLED; |
617 | } | 621 | } |
618 | usb_dmac_chan_write(chan, USB_DMACHCR, chcr & ~mask); | 622 | if (mask) |
623 | usb_dmac_chan_write(chan, USB_DMACHCR, chcr & ~mask); | ||
619 | 624 | ||
620 | if (chcr & check_bits) { | 625 | if (xfer_end) |
621 | usb_dmac_isr_transfer_end(chan); | 626 | usb_dmac_isr_transfer_end(chan); |
622 | ret |= IRQ_HANDLED; | ||
623 | } | ||
624 | 627 | ||
625 | spin_unlock(&chan->vc.lock); | 628 | spin_unlock(&chan->vc.lock); |
626 | 629 | ||
diff --git a/drivers/firmware/arm_scpi.c b/drivers/firmware/arm_scpi.c index 438893762076..ce2bc2a38101 100644 --- a/drivers/firmware/arm_scpi.c +++ b/drivers/firmware/arm_scpi.c | |||
@@ -709,9 +709,10 @@ static int scpi_probe(struct platform_device *pdev) | |||
709 | struct mbox_client *cl = &pchan->cl; | 709 | struct mbox_client *cl = &pchan->cl; |
710 | struct device_node *shmem = of_parse_phandle(np, "shmem", idx); | 710 | struct device_node *shmem = of_parse_phandle(np, "shmem", idx); |
711 | 711 | ||
712 | if (of_address_to_resource(shmem, 0, &res)) { | 712 | ret = of_address_to_resource(shmem, 0, &res); |
713 | of_node_put(shmem); | ||
714 | if (ret) { | ||
713 | dev_err(dev, "failed to get SCPI payload mem resource\n"); | 715 | dev_err(dev, "failed to get SCPI payload mem resource\n"); |
714 | ret = -EINVAL; | ||
715 | goto err; | 716 | goto err; |
716 | } | 717 | } |
717 | 718 | ||
diff --git a/drivers/firmware/dmi-id.c b/drivers/firmware/dmi-id.c index 94a58a082b99..44c01390d035 100644 --- a/drivers/firmware/dmi-id.c +++ b/drivers/firmware/dmi-id.c | |||
@@ -229,14 +229,14 @@ static int __init dmi_id_init(void) | |||
229 | 229 | ||
230 | ret = device_register(dmi_dev); | 230 | ret = device_register(dmi_dev); |
231 | if (ret) | 231 | if (ret) |
232 | goto fail_free_dmi_dev; | 232 | goto fail_put_dmi_dev; |
233 | 233 | ||
234 | return 0; | 234 | return 0; |
235 | 235 | ||
236 | fail_free_dmi_dev: | 236 | fail_put_dmi_dev: |
237 | kfree(dmi_dev); | 237 | put_device(dmi_dev); |
238 | fail_class_unregister: | ||
239 | 238 | ||
239 | fail_class_unregister: | ||
240 | class_unregister(&dmi_class); | 240 | class_unregister(&dmi_class); |
241 | 241 | ||
242 | return ret; | 242 | return ret; |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 66a94103798b..24caedb00a7a 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
@@ -1131,6 +1131,7 @@ menu "SPI or I2C GPIO expanders" | |||
1131 | 1131 | ||
1132 | config GPIO_MCP23S08 | 1132 | config GPIO_MCP23S08 |
1133 | tristate "Microchip MCP23xxx I/O expander" | 1133 | tristate "Microchip MCP23xxx I/O expander" |
1134 | depends on OF_GPIO | ||
1134 | select GPIOLIB_IRQCHIP | 1135 | select GPIOLIB_IRQCHIP |
1135 | help | 1136 | help |
1136 | SPI/I2C driver for Microchip MCP23S08/MCP23S17/MCP23008/MCP23017 | 1137 | SPI/I2C driver for Microchip MCP23S08/MCP23S17/MCP23008/MCP23017 |
diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c index ac22efc1840e..99d37b56c258 100644 --- a/drivers/gpio/gpio-mcp23s08.c +++ b/drivers/gpio/gpio-mcp23s08.c | |||
@@ -564,7 +564,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, | |||
564 | mcp->chip.direction_output = mcp23s08_direction_output; | 564 | mcp->chip.direction_output = mcp23s08_direction_output; |
565 | mcp->chip.set = mcp23s08_set; | 565 | mcp->chip.set = mcp23s08_set; |
566 | mcp->chip.dbg_show = mcp23s08_dbg_show; | 566 | mcp->chip.dbg_show = mcp23s08_dbg_show; |
567 | #ifdef CONFIG_OF | 567 | #ifdef CONFIG_OF_GPIO |
568 | mcp->chip.of_gpio_n_cells = 2; | 568 | mcp->chip.of_gpio_n_cells = 2; |
569 | mcp->chip.of_node = dev->of_node; | 569 | mcp->chip.of_node = dev->of_node; |
570 | #endif | 570 | #endif |
diff --git a/drivers/gpio/gpio-sa1100.c b/drivers/gpio/gpio-sa1100.c index 0c99e8fb9af3..8d8ee0ebf14c 100644 --- a/drivers/gpio/gpio-sa1100.c +++ b/drivers/gpio/gpio-sa1100.c | |||
@@ -155,7 +155,7 @@ static int sa1100_gpio_irqdomain_map(struct irq_domain *d, | |||
155 | { | 155 | { |
156 | irq_set_chip_and_handler(irq, &sa1100_gpio_irq_chip, | 156 | irq_set_chip_and_handler(irq, &sa1100_gpio_irq_chip, |
157 | handle_edge_irq); | 157 | handle_edge_irq); |
158 | irq_set_noprobe(irq); | 158 | irq_set_probe(irq); |
159 | 159 | ||
160 | return 0; | 160 | return 0; |
161 | } | 161 | } |
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index 75e7b3919ea7..a28feb3edf33 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | #include <linux/io-mapping.h> | ||
20 | #include <linux/gpio/consumer.h> | 19 | #include <linux/gpio/consumer.h> |
21 | #include <linux/of.h> | 20 | #include <linux/of.h> |
22 | #include <linux/of_address.h> | 21 | #include <linux/of_address.h> |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index a31d7ef3032c..ec1282af2479 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | |||
@@ -280,7 +280,7 @@ void amdgpu_ib_pool_fini(struct amdgpu_device *adev) | |||
280 | int amdgpu_ib_ring_tests(struct amdgpu_device *adev) | 280 | int amdgpu_ib_ring_tests(struct amdgpu_device *adev) |
281 | { | 281 | { |
282 | unsigned i; | 282 | unsigned i; |
283 | int r; | 283 | int r, ret = 0; |
284 | 284 | ||
285 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { | 285 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { |
286 | struct amdgpu_ring *ring = adev->rings[i]; | 286 | struct amdgpu_ring *ring = adev->rings[i]; |
@@ -301,10 +301,11 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev) | |||
301 | } else { | 301 | } else { |
302 | /* still not good, but we can live with it */ | 302 | /* still not good, but we can live with it */ |
303 | DRM_ERROR("amdgpu: failed testing IB on ring %d (%d).\n", i, r); | 303 | DRM_ERROR("amdgpu: failed testing IB on ring %d (%d).\n", i, r); |
304 | ret = r; | ||
304 | } | 305 | } |
305 | } | 306 | } |
306 | } | 307 | } |
307 | return 0; | 308 | return ret; |
308 | } | 309 | } |
309 | 310 | ||
310 | /* | 311 | /* |
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index ee6466912497..77fdd9911c3c 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c | |||
@@ -52,6 +52,7 @@ static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev); | |||
52 | static void cik_sdma_set_irq_funcs(struct amdgpu_device *adev); | 52 | static void cik_sdma_set_irq_funcs(struct amdgpu_device *adev); |
53 | static void cik_sdma_set_buffer_funcs(struct amdgpu_device *adev); | 53 | static void cik_sdma_set_buffer_funcs(struct amdgpu_device *adev); |
54 | static void cik_sdma_set_vm_pte_funcs(struct amdgpu_device *adev); | 54 | static void cik_sdma_set_vm_pte_funcs(struct amdgpu_device *adev); |
55 | static int cik_sdma_soft_reset(void *handle); | ||
55 | 56 | ||
56 | MODULE_FIRMWARE("radeon/bonaire_sdma.bin"); | 57 | MODULE_FIRMWARE("radeon/bonaire_sdma.bin"); |
57 | MODULE_FIRMWARE("radeon/bonaire_sdma1.bin"); | 58 | MODULE_FIRMWARE("radeon/bonaire_sdma1.bin"); |
@@ -1037,6 +1038,8 @@ static int cik_sdma_resume(void *handle) | |||
1037 | { | 1038 | { |
1038 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 1039 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
1039 | 1040 | ||
1041 | cik_sdma_soft_reset(handle); | ||
1042 | |||
1040 | return cik_sdma_hw_init(adev); | 1043 | return cik_sdma_hw_init(adev); |
1041 | } | 1044 | } |
1042 | 1045 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index d869d058ef24..425413fcaf02 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | |||
@@ -2755,8 +2755,7 @@ static int gfx_v7_0_cp_compute_resume(struct amdgpu_device *adev) | |||
2755 | u64 wb_gpu_addr; | 2755 | u64 wb_gpu_addr; |
2756 | u32 *buf; | 2756 | u32 *buf; |
2757 | struct bonaire_mqd *mqd; | 2757 | struct bonaire_mqd *mqd; |
2758 | 2758 | struct amdgpu_ring *ring; | |
2759 | gfx_v7_0_cp_compute_enable(adev, true); | ||
2760 | 2759 | ||
2761 | /* fix up chicken bits */ | 2760 | /* fix up chicken bits */ |
2762 | tmp = RREG32(mmCP_CPF_DEBUG); | 2761 | tmp = RREG32(mmCP_CPF_DEBUG); |
@@ -2791,7 +2790,7 @@ static int gfx_v7_0_cp_compute_resume(struct amdgpu_device *adev) | |||
2791 | 2790 | ||
2792 | /* init the queues. Just two for now. */ | 2791 | /* init the queues. Just two for now. */ |
2793 | for (i = 0; i < adev->gfx.num_compute_rings; i++) { | 2792 | for (i = 0; i < adev->gfx.num_compute_rings; i++) { |
2794 | struct amdgpu_ring *ring = &adev->gfx.compute_ring[i]; | 2793 | ring = &adev->gfx.compute_ring[i]; |
2795 | 2794 | ||
2796 | if (ring->mqd_obj == NULL) { | 2795 | if (ring->mqd_obj == NULL) { |
2797 | r = amdgpu_bo_create(adev, | 2796 | r = amdgpu_bo_create(adev, |
@@ -2970,6 +2969,13 @@ static int gfx_v7_0_cp_compute_resume(struct amdgpu_device *adev) | |||
2970 | amdgpu_bo_unreserve(ring->mqd_obj); | 2969 | amdgpu_bo_unreserve(ring->mqd_obj); |
2971 | 2970 | ||
2972 | ring->ready = true; | 2971 | ring->ready = true; |
2972 | } | ||
2973 | |||
2974 | gfx_v7_0_cp_compute_enable(adev, true); | ||
2975 | |||
2976 | for (i = 0; i < adev->gfx.num_compute_rings; i++) { | ||
2977 | ring = &adev->gfx.compute_ring[i]; | ||
2978 | |||
2973 | r = amdgpu_ring_test_ring(ring); | 2979 | r = amdgpu_ring_test_ring(ring); |
2974 | if (r) | 2980 | if (r) |
2975 | ring->ready = false; | 2981 | ring->ready = false; |
diff --git a/drivers/gpu/drm/imx/imx-drm-core.c b/drivers/gpu/drm/imx/imx-drm-core.c index 9f7dafce3a4c..7bf90e9e6139 100644 --- a/drivers/gpu/drm/imx/imx-drm-core.c +++ b/drivers/gpu/drm/imx/imx-drm-core.c | |||
@@ -171,10 +171,34 @@ static void imx_drm_output_poll_changed(struct drm_device *drm) | |||
171 | drm_fbdev_cma_hotplug_event(imxdrm->fbhelper); | 171 | drm_fbdev_cma_hotplug_event(imxdrm->fbhelper); |
172 | } | 172 | } |
173 | 173 | ||
174 | static int imx_drm_atomic_check(struct drm_device *dev, | ||
175 | struct drm_atomic_state *state) | ||
176 | { | ||
177 | int ret; | ||
178 | |||
179 | ret = drm_atomic_helper_check_modeset(dev, state); | ||
180 | if (ret) | ||
181 | return ret; | ||
182 | |||
183 | ret = drm_atomic_helper_check_planes(dev, state); | ||
184 | if (ret) | ||
185 | return ret; | ||
186 | |||
187 | /* | ||
188 | * Check modeset again in case crtc_state->mode_changed is | ||
189 | * updated in plane's ->atomic_check callback. | ||
190 | */ | ||
191 | ret = drm_atomic_helper_check_modeset(dev, state); | ||
192 | if (ret) | ||
193 | return ret; | ||
194 | |||
195 | return ret; | ||
196 | } | ||
197 | |||
174 | static const struct drm_mode_config_funcs imx_drm_mode_config_funcs = { | 198 | static const struct drm_mode_config_funcs imx_drm_mode_config_funcs = { |
175 | .fb_create = drm_fb_cma_create, | 199 | .fb_create = drm_fb_cma_create, |
176 | .output_poll_changed = imx_drm_output_poll_changed, | 200 | .output_poll_changed = imx_drm_output_poll_changed, |
177 | .atomic_check = drm_atomic_helper_check, | 201 | .atomic_check = imx_drm_atomic_check, |
178 | .atomic_commit = drm_atomic_helper_commit, | 202 | .atomic_commit = drm_atomic_helper_commit, |
179 | }; | 203 | }; |
180 | 204 | ||
diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c index 08e188bc10fc..462056e4b9e4 100644 --- a/drivers/gpu/drm/imx/ipuv3-crtc.c +++ b/drivers/gpu/drm/imx/ipuv3-crtc.c | |||
@@ -76,6 +76,8 @@ static void ipu_crtc_disable(struct drm_crtc *crtc) | |||
76 | crtc->state->event = NULL; | 76 | crtc->state->event = NULL; |
77 | } | 77 | } |
78 | spin_unlock_irq(&crtc->dev->event_lock); | 78 | spin_unlock_irq(&crtc->dev->event_lock); |
79 | |||
80 | drm_crtc_vblank_off(crtc); | ||
79 | } | 81 | } |
80 | 82 | ||
81 | static void imx_drm_crtc_reset(struct drm_crtc *crtc) | 83 | static void imx_drm_crtc_reset(struct drm_crtc *crtc) |
@@ -175,6 +177,8 @@ static int ipu_crtc_atomic_check(struct drm_crtc *crtc, | |||
175 | static void ipu_crtc_atomic_begin(struct drm_crtc *crtc, | 177 | static void ipu_crtc_atomic_begin(struct drm_crtc *crtc, |
176 | struct drm_crtc_state *old_crtc_state) | 178 | struct drm_crtc_state *old_crtc_state) |
177 | { | 179 | { |
180 | drm_crtc_vblank_on(crtc); | ||
181 | |||
178 | spin_lock_irq(&crtc->dev->event_lock); | 182 | spin_lock_irq(&crtc->dev->event_lock); |
179 | if (crtc->state->event) { | 183 | if (crtc->state->event) { |
180 | WARN_ON(drm_crtc_vblank_get(crtc)); | 184 | WARN_ON(drm_crtc_vblank_get(crtc)); |
diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c index 4ad67d015ec7..29423e757d36 100644 --- a/drivers/gpu/drm/imx/ipuv3-plane.c +++ b/drivers/gpu/drm/imx/ipuv3-plane.c | |||
@@ -319,13 +319,14 @@ static int ipu_plane_atomic_check(struct drm_plane *plane, | |||
319 | return -EINVAL; | 319 | return -EINVAL; |
320 | 320 | ||
321 | /* | 321 | /* |
322 | * since we cannot touch active IDMAC channels, we do not support | 322 | * We support resizing active plane or changing its format by |
323 | * resizing the enabled plane or changing its format | 323 | * forcing CRTC mode change and disabling-enabling plane in plane's |
324 | * ->atomic_update callback. | ||
324 | */ | 325 | */ |
325 | if (old_fb && (state->src_w != old_state->src_w || | 326 | if (old_fb && (state->src_w != old_state->src_w || |
326 | state->src_h != old_state->src_h || | 327 | state->src_h != old_state->src_h || |
327 | fb->pixel_format != old_fb->pixel_format)) | 328 | fb->pixel_format != old_fb->pixel_format)) |
328 | return -EINVAL; | 329 | crtc_state->mode_changed = true; |
329 | 330 | ||
330 | eba = drm_plane_state_to_eba(state); | 331 | eba = drm_plane_state_to_eba(state); |
331 | 332 | ||
@@ -336,7 +337,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane, | |||
336 | return -EINVAL; | 337 | return -EINVAL; |
337 | 338 | ||
338 | if (old_fb && fb->pitches[0] != old_fb->pitches[0]) | 339 | if (old_fb && fb->pitches[0] != old_fb->pitches[0]) |
339 | return -EINVAL; | 340 | crtc_state->mode_changed = true; |
340 | 341 | ||
341 | switch (fb->pixel_format) { | 342 | switch (fb->pixel_format) { |
342 | case DRM_FORMAT_YUV420: | 343 | case DRM_FORMAT_YUV420: |
@@ -372,7 +373,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane, | |||
372 | return -EINVAL; | 373 | return -EINVAL; |
373 | 374 | ||
374 | if (old_fb && old_fb->pitches[1] != fb->pitches[1]) | 375 | if (old_fb && old_fb->pitches[1] != fb->pitches[1]) |
375 | return -EINVAL; | 376 | crtc_state->mode_changed = true; |
376 | } | 377 | } |
377 | 378 | ||
378 | return 0; | 379 | return 0; |
@@ -392,8 +393,14 @@ static void ipu_plane_atomic_update(struct drm_plane *plane, | |||
392 | enum ipu_color_space ics; | 393 | enum ipu_color_space ics; |
393 | 394 | ||
394 | if (old_state->fb) { | 395 | if (old_state->fb) { |
395 | ipu_plane_atomic_set_base(ipu_plane, old_state); | 396 | struct drm_crtc_state *crtc_state = state->crtc->state; |
396 | return; | 397 | |
398 | if (!crtc_state->mode_changed) { | ||
399 | ipu_plane_atomic_set_base(ipu_plane, old_state); | ||
400 | return; | ||
401 | } | ||
402 | |||
403 | ipu_disable_plane(plane); | ||
397 | } | 404 | } |
398 | 405 | ||
399 | switch (ipu_plane->dp_flow) { | 406 | switch (ipu_plane->dp_flow) { |
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h index b4bc7f1ef717..d0da52f2a806 100644 --- a/drivers/gpu/drm/msm/msm_drv.h +++ b/drivers/gpu/drm/msm/msm_drv.h | |||
@@ -157,6 +157,12 @@ struct msm_drm_private { | |||
157 | struct shrinker shrinker; | 157 | struct shrinker shrinker; |
158 | 158 | ||
159 | struct msm_vblank_ctrl vblank_ctrl; | 159 | struct msm_vblank_ctrl vblank_ctrl; |
160 | |||
161 | /* task holding struct_mutex.. currently only used in submit path | ||
162 | * to detect and reject faults from copy_from_user() for submit | ||
163 | * ioctl. | ||
164 | */ | ||
165 | struct task_struct *struct_mutex_task; | ||
160 | }; | 166 | }; |
161 | 167 | ||
162 | struct msm_format { | 168 | struct msm_format { |
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 6cd4af443139..85f3047e05ae 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c | |||
@@ -196,11 +196,20 @@ int msm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
196 | { | 196 | { |
197 | struct drm_gem_object *obj = vma->vm_private_data; | 197 | struct drm_gem_object *obj = vma->vm_private_data; |
198 | struct drm_device *dev = obj->dev; | 198 | struct drm_device *dev = obj->dev; |
199 | struct msm_drm_private *priv = dev->dev_private; | ||
199 | struct page **pages; | 200 | struct page **pages; |
200 | unsigned long pfn; | 201 | unsigned long pfn; |
201 | pgoff_t pgoff; | 202 | pgoff_t pgoff; |
202 | int ret; | 203 | int ret; |
203 | 204 | ||
205 | /* This should only happen if userspace tries to pass a mmap'd | ||
206 | * but unfaulted gem bo vaddr into submit ioctl, triggering | ||
207 | * a page fault while struct_mutex is already held. This is | ||
208 | * not a valid use-case so just bail. | ||
209 | */ | ||
210 | if (priv->struct_mutex_task == current) | ||
211 | return VM_FAULT_SIGBUS; | ||
212 | |||
204 | /* Make sure we don't parallel update on a fault, nor move or remove | 213 | /* Make sure we don't parallel update on a fault, nor move or remove |
205 | * something from beneath our feet | 214 | * something from beneath our feet |
206 | */ | 215 | */ |
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 9766f9ae4b7d..880d6a9af7c8 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c | |||
@@ -64,6 +64,14 @@ void msm_gem_submit_free(struct msm_gem_submit *submit) | |||
64 | kfree(submit); | 64 | kfree(submit); |
65 | } | 65 | } |
66 | 66 | ||
67 | static inline unsigned long __must_check | ||
68 | copy_from_user_inatomic(void *to, const void __user *from, unsigned long n) | ||
69 | { | ||
70 | if (access_ok(VERIFY_READ, from, n)) | ||
71 | return __copy_from_user_inatomic(to, from, n); | ||
72 | return -EFAULT; | ||
73 | } | ||
74 | |||
67 | static int submit_lookup_objects(struct msm_gem_submit *submit, | 75 | static int submit_lookup_objects(struct msm_gem_submit *submit, |
68 | struct drm_msm_gem_submit *args, struct drm_file *file) | 76 | struct drm_msm_gem_submit *args, struct drm_file *file) |
69 | { | 77 | { |
@@ -71,6 +79,7 @@ static int submit_lookup_objects(struct msm_gem_submit *submit, | |||
71 | int ret = 0; | 79 | int ret = 0; |
72 | 80 | ||
73 | spin_lock(&file->table_lock); | 81 | spin_lock(&file->table_lock); |
82 | pagefault_disable(); | ||
74 | 83 | ||
75 | for (i = 0; i < args->nr_bos; i++) { | 84 | for (i = 0; i < args->nr_bos; i++) { |
76 | struct drm_msm_gem_submit_bo submit_bo; | 85 | struct drm_msm_gem_submit_bo submit_bo; |
@@ -84,10 +93,15 @@ static int submit_lookup_objects(struct msm_gem_submit *submit, | |||
84 | */ | 93 | */ |
85 | submit->bos[i].flags = 0; | 94 | submit->bos[i].flags = 0; |
86 | 95 | ||
87 | ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo)); | 96 | ret = copy_from_user_inatomic(&submit_bo, userptr, sizeof(submit_bo)); |
88 | if (ret) { | 97 | if (unlikely(ret)) { |
89 | ret = -EFAULT; | 98 | pagefault_enable(); |
90 | goto out_unlock; | 99 | spin_unlock(&file->table_lock); |
100 | ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo)); | ||
101 | if (ret) | ||
102 | goto out; | ||
103 | spin_lock(&file->table_lock); | ||
104 | pagefault_disable(); | ||
91 | } | 105 | } |
92 | 106 | ||
93 | if (submit_bo.flags & ~MSM_SUBMIT_BO_FLAGS) { | 107 | if (submit_bo.flags & ~MSM_SUBMIT_BO_FLAGS) { |
@@ -127,9 +141,12 @@ static int submit_lookup_objects(struct msm_gem_submit *submit, | |||
127 | } | 141 | } |
128 | 142 | ||
129 | out_unlock: | 143 | out_unlock: |
130 | submit->nr_bos = i; | 144 | pagefault_enable(); |
131 | spin_unlock(&file->table_lock); | 145 | spin_unlock(&file->table_lock); |
132 | 146 | ||
147 | out: | ||
148 | submit->nr_bos = i; | ||
149 | |||
133 | return ret; | 150 | return ret; |
134 | } | 151 | } |
135 | 152 | ||
@@ -377,6 +394,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, | |||
377 | if (ret) | 394 | if (ret) |
378 | return ret; | 395 | return ret; |
379 | 396 | ||
397 | priv->struct_mutex_task = current; | ||
398 | |||
380 | submit = submit_create(dev, gpu, args->nr_bos, args->nr_cmds); | 399 | submit = submit_create(dev, gpu, args->nr_bos, args->nr_cmds); |
381 | if (!submit) { | 400 | if (!submit) { |
382 | ret = -ENOMEM; | 401 | ret = -ENOMEM; |
@@ -468,6 +487,7 @@ out: | |||
468 | if (ret) | 487 | if (ret) |
469 | msm_gem_submit_free(submit); | 488 | msm_gem_submit_free(submit); |
470 | out_unlock: | 489 | out_unlock: |
490 | priv->struct_mutex_task = NULL; | ||
471 | mutex_unlock(&dev->struct_mutex); | 491 | mutex_unlock(&dev->struct_mutex); |
472 | return ret; | 492 | return ret; |
473 | } | 493 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c index f2ad17aa33f0..dc57b628e074 100644 --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c | |||
@@ -225,6 +225,17 @@ static bool nouveau_pr3_present(struct pci_dev *pdev) | |||
225 | if (!parent_pdev) | 225 | if (!parent_pdev) |
226 | return false; | 226 | return false; |
227 | 227 | ||
228 | if (!parent_pdev->bridge_d3) { | ||
229 | /* | ||
230 | * Parent PCI bridge is currently not power managed. | ||
231 | * Since userspace can change these afterwards to be on | ||
232 | * the safe side we stick with _DSM and prevent usage of | ||
233 | * _PR3 from the bridge. | ||
234 | */ | ||
235 | pci_d3cold_disable(pdev); | ||
236 | return false; | ||
237 | } | ||
238 | |||
228 | parent_adev = ACPI_COMPANION(&parent_pdev->dev); | 239 | parent_adev = ACPI_COMPANION(&parent_pdev->dev); |
229 | if (!parent_adev) | 240 | if (!parent_adev) |
230 | return false; | 241 | return false; |
diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c index 8b42d31a7f0e..9ecef9385491 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.c +++ b/drivers/gpu/drm/vc4/vc4_drv.c | |||
@@ -57,21 +57,21 @@ static int vc4_get_param_ioctl(struct drm_device *dev, void *data, | |||
57 | switch (args->param) { | 57 | switch (args->param) { |
58 | case DRM_VC4_PARAM_V3D_IDENT0: | 58 | case DRM_VC4_PARAM_V3D_IDENT0: |
59 | ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev); | 59 | ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev); |
60 | if (ret) | 60 | if (ret < 0) |
61 | return ret; | 61 | return ret; |
62 | args->value = V3D_READ(V3D_IDENT0); | 62 | args->value = V3D_READ(V3D_IDENT0); |
63 | pm_runtime_put(&vc4->v3d->pdev->dev); | 63 | pm_runtime_put(&vc4->v3d->pdev->dev); |
64 | break; | 64 | break; |
65 | case DRM_VC4_PARAM_V3D_IDENT1: | 65 | case DRM_VC4_PARAM_V3D_IDENT1: |
66 | ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev); | 66 | ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev); |
67 | if (ret) | 67 | if (ret < 0) |
68 | return ret; | 68 | return ret; |
69 | args->value = V3D_READ(V3D_IDENT1); | 69 | args->value = V3D_READ(V3D_IDENT1); |
70 | pm_runtime_put(&vc4->v3d->pdev->dev); | 70 | pm_runtime_put(&vc4->v3d->pdev->dev); |
71 | break; | 71 | break; |
72 | case DRM_VC4_PARAM_V3D_IDENT2: | 72 | case DRM_VC4_PARAM_V3D_IDENT2: |
73 | ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev); | 73 | ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev); |
74 | if (ret) | 74 | if (ret < 0) |
75 | return ret; | 75 | return ret; |
76 | args->value = V3D_READ(V3D_IDENT2); | 76 | args->value = V3D_READ(V3D_IDENT2); |
77 | pm_runtime_put(&vc4->v3d->pdev->dev); | 77 | pm_runtime_put(&vc4->v3d->pdev->dev); |
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h index 489e3de0c050..428e24919ef1 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.h +++ b/drivers/gpu/drm/vc4/vc4_drv.h | |||
@@ -321,6 +321,15 @@ vc4_first_render_job(struct vc4_dev *vc4) | |||
321 | struct vc4_exec_info, head); | 321 | struct vc4_exec_info, head); |
322 | } | 322 | } |
323 | 323 | ||
324 | static inline struct vc4_exec_info * | ||
325 | vc4_last_render_job(struct vc4_dev *vc4) | ||
326 | { | ||
327 | if (list_empty(&vc4->render_job_list)) | ||
328 | return NULL; | ||
329 | return list_last_entry(&vc4->render_job_list, | ||
330 | struct vc4_exec_info, head); | ||
331 | } | ||
332 | |||
324 | /** | 333 | /** |
325 | * struct vc4_texture_sample_info - saves the offsets into the UBO for texture | 334 | * struct vc4_texture_sample_info - saves the offsets into the UBO for texture |
326 | * setup parameters. | 335 | * setup parameters. |
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c index 6155e8aca1c6..b262c5c26f10 100644 --- a/drivers/gpu/drm/vc4/vc4_gem.c +++ b/drivers/gpu/drm/vc4/vc4_gem.c | |||
@@ -534,8 +534,8 @@ vc4_cl_lookup_bos(struct drm_device *dev, | |||
534 | return -EINVAL; | 534 | return -EINVAL; |
535 | } | 535 | } |
536 | 536 | ||
537 | exec->bo = kcalloc(exec->bo_count, sizeof(struct drm_gem_cma_object *), | 537 | exec->bo = drm_calloc_large(exec->bo_count, |
538 | GFP_KERNEL); | 538 | sizeof(struct drm_gem_cma_object *)); |
539 | if (!exec->bo) { | 539 | if (!exec->bo) { |
540 | DRM_ERROR("Failed to allocate validated BO pointers\n"); | 540 | DRM_ERROR("Failed to allocate validated BO pointers\n"); |
541 | return -ENOMEM; | 541 | return -ENOMEM; |
@@ -572,8 +572,8 @@ vc4_cl_lookup_bos(struct drm_device *dev, | |||
572 | spin_unlock(&file_priv->table_lock); | 572 | spin_unlock(&file_priv->table_lock); |
573 | 573 | ||
574 | fail: | 574 | fail: |
575 | kfree(handles); | 575 | drm_free_large(handles); |
576 | return 0; | 576 | return ret; |
577 | } | 577 | } |
578 | 578 | ||
579 | static int | 579 | static int |
@@ -608,7 +608,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) | |||
608 | * read the contents back for validation, and I think the | 608 | * read the contents back for validation, and I think the |
609 | * bo->vaddr is uncached access. | 609 | * bo->vaddr is uncached access. |
610 | */ | 610 | */ |
611 | temp = kmalloc(temp_size, GFP_KERNEL); | 611 | temp = drm_malloc_ab(temp_size, 1); |
612 | if (!temp) { | 612 | if (!temp) { |
613 | DRM_ERROR("Failed to allocate storage for copying " | 613 | DRM_ERROR("Failed to allocate storage for copying " |
614 | "in bin/render CLs.\n"); | 614 | "in bin/render CLs.\n"); |
@@ -675,7 +675,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) | |||
675 | ret = vc4_validate_shader_recs(dev, exec); | 675 | ret = vc4_validate_shader_recs(dev, exec); |
676 | 676 | ||
677 | fail: | 677 | fail: |
678 | kfree(temp); | 678 | drm_free_large(temp); |
679 | return ret; | 679 | return ret; |
680 | } | 680 | } |
681 | 681 | ||
@@ -688,7 +688,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec) | |||
688 | if (exec->bo) { | 688 | if (exec->bo) { |
689 | for (i = 0; i < exec->bo_count; i++) | 689 | for (i = 0; i < exec->bo_count; i++) |
690 | drm_gem_object_unreference_unlocked(&exec->bo[i]->base); | 690 | drm_gem_object_unreference_unlocked(&exec->bo[i]->base); |
691 | kfree(exec->bo); | 691 | drm_free_large(exec->bo); |
692 | } | 692 | } |
693 | 693 | ||
694 | while (!list_empty(&exec->unref_list)) { | 694 | while (!list_empty(&exec->unref_list)) { |
@@ -942,8 +942,8 @@ vc4_gem_destroy(struct drm_device *dev) | |||
942 | vc4->overflow_mem = NULL; | 942 | vc4->overflow_mem = NULL; |
943 | } | 943 | } |
944 | 944 | ||
945 | vc4_bo_cache_destroy(dev); | ||
946 | |||
947 | if (vc4->hang_state) | 945 | if (vc4->hang_state) |
948 | vc4_free_hang_state(dev, vc4->hang_state); | 946 | vc4_free_hang_state(dev, vc4->hang_state); |
947 | |||
948 | vc4_bo_cache_destroy(dev); | ||
949 | } | 949 | } |
diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c index b0104a346a74..094bc6a475c1 100644 --- a/drivers/gpu/drm/vc4/vc4_irq.c +++ b/drivers/gpu/drm/vc4/vc4_irq.c | |||
@@ -83,8 +83,10 @@ vc4_overflow_mem_work(struct work_struct *work) | |||
83 | 83 | ||
84 | spin_lock_irqsave(&vc4->job_lock, irqflags); | 84 | spin_lock_irqsave(&vc4->job_lock, irqflags); |
85 | current_exec = vc4_first_bin_job(vc4); | 85 | current_exec = vc4_first_bin_job(vc4); |
86 | if (!current_exec) | ||
87 | current_exec = vc4_last_render_job(vc4); | ||
86 | if (current_exec) { | 88 | if (current_exec) { |
87 | vc4->overflow_mem->seqno = vc4->finished_seqno + 1; | 89 | vc4->overflow_mem->seqno = current_exec->seqno; |
88 | list_add_tail(&vc4->overflow_mem->unref_head, | 90 | list_add_tail(&vc4->overflow_mem->unref_head, |
89 | ¤t_exec->unref_list); | 91 | ¤t_exec->unref_list); |
90 | vc4->overflow_mem = NULL; | 92 | vc4->overflow_mem = NULL; |
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index d0203a115eff..4667012b46b7 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c | |||
@@ -2015,6 +2015,7 @@ static struct attribute *it87_attributes_in[] = { | |||
2015 | &sensor_dev_attr_in10_input.dev_attr.attr, /* 41 */ | 2015 | &sensor_dev_attr_in10_input.dev_attr.attr, /* 41 */ |
2016 | &sensor_dev_attr_in11_input.dev_attr.attr, /* 41 */ | 2016 | &sensor_dev_attr_in11_input.dev_attr.attr, /* 41 */ |
2017 | &sensor_dev_attr_in12_input.dev_attr.attr, /* 41 */ | 2017 | &sensor_dev_attr_in12_input.dev_attr.attr, /* 41 */ |
2018 | NULL | ||
2018 | }; | 2019 | }; |
2019 | 2020 | ||
2020 | static const struct attribute_group it87_group_in = { | 2021 | static const struct attribute_group it87_group_in = { |
diff --git a/drivers/i2c/busses/i2c-bcm-kona.c b/drivers/i2c/busses/i2c-bcm-kona.c index f98743277e3c..258cb9a40ab3 100644 --- a/drivers/i2c/busses/i2c-bcm-kona.c +++ b/drivers/i2c/busses/i2c-bcm-kona.c | |||
@@ -643,7 +643,7 @@ static int bcm_kona_i2c_xfer(struct i2c_adapter *adapter, | |||
643 | if (rc < 0) { | 643 | if (rc < 0) { |
644 | dev_err(dev->device, | 644 | dev_err(dev->device, |
645 | "restart cmd failed rc = %d\n", rc); | 645 | "restart cmd failed rc = %d\n", rc); |
646 | goto xfer_send_stop; | 646 | goto xfer_send_stop; |
647 | } | 647 | } |
648 | } | 648 | } |
649 | 649 | ||
diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c index 90bbd9f9dd8f..3c16a2f7c673 100644 --- a/drivers/i2c/busses/i2c-cadence.c +++ b/drivers/i2c/busses/i2c-cadence.c | |||
@@ -767,7 +767,7 @@ static int cdns_i2c_setclk(unsigned long clk_in, struct cdns_i2c *id) | |||
767 | * depending on the scaling direction. | 767 | * depending on the scaling direction. |
768 | * | 768 | * |
769 | * Return: NOTIFY_STOP if the rate change should be aborted, NOTIFY_OK | 769 | * Return: NOTIFY_STOP if the rate change should be aborted, NOTIFY_OK |
770 | * to acknowedge the change, NOTIFY_DONE if the notification is | 770 | * to acknowledge the change, NOTIFY_DONE if the notification is |
771 | * considered irrelevant. | 771 | * considered irrelevant. |
772 | */ | 772 | */ |
773 | static int cdns_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long | 773 | static int cdns_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long |
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index c6922b806fb7..fcd973d5131e 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c | |||
@@ -367,13 +367,17 @@ int i2c_dw_init(struct dw_i2c_dev *dev) | |||
367 | dev_dbg(dev->dev, "Fast-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); | 367 | dev_dbg(dev->dev, "Fast-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); |
368 | 368 | ||
369 | /* Configure SDA Hold Time if required */ | 369 | /* Configure SDA Hold Time if required */ |
370 | if (dev->sda_hold_time) { | 370 | reg = dw_readl(dev, DW_IC_COMP_VERSION); |
371 | reg = dw_readl(dev, DW_IC_COMP_VERSION); | 371 | if (reg >= DW_IC_SDA_HOLD_MIN_VERS) { |
372 | if (reg >= DW_IC_SDA_HOLD_MIN_VERS) | 372 | if (dev->sda_hold_time) { |
373 | dw_writel(dev, dev->sda_hold_time, DW_IC_SDA_HOLD); | 373 | dw_writel(dev, dev->sda_hold_time, DW_IC_SDA_HOLD); |
374 | else | 374 | } else { |
375 | dev_warn(dev->dev, | 375 | /* Keep previous hold time setting if no one set it */ |
376 | "Hardware too old to adjust SDA hold time."); | 376 | dev->sda_hold_time = dw_readl(dev, DW_IC_SDA_HOLD); |
377 | } | ||
378 | } else { | ||
379 | dev_warn(dev->dev, | ||
380 | "Hardware too old to adjust SDA hold time.\n"); | ||
377 | } | 381 | } |
378 | 382 | ||
379 | /* Configure Tx/Rx FIFO threshold levels */ | 383 | /* Configure Tx/Rx FIFO threshold levels */ |
diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c index 52407f3c9e1c..9bd849dacee8 100644 --- a/drivers/i2c/busses/i2c-rcar.c +++ b/drivers/i2c/busses/i2c-rcar.c | |||
@@ -378,7 +378,7 @@ static void rcar_i2c_dma(struct rcar_i2c_priv *priv) | |||
378 | } | 378 | } |
379 | 379 | ||
380 | dma_addr = dma_map_single(chan->device->dev, buf, len, dir); | 380 | dma_addr = dma_map_single(chan->device->dev, buf, len, dir); |
381 | if (dma_mapping_error(dev, dma_addr)) { | 381 | if (dma_mapping_error(chan->device->dev, dma_addr)) { |
382 | dev_dbg(dev, "dma map failed, using PIO\n"); | 382 | dev_dbg(dev, "dma map failed, using PIO\n"); |
383 | return; | 383 | return; |
384 | } | 384 | } |
diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c index 2bc8b01153d6..5c5b7cada8be 100644 --- a/drivers/i2c/busses/i2c-rk3x.c +++ b/drivers/i2c/busses/i2c-rk3x.c | |||
@@ -918,7 +918,7 @@ static void rk3x_i2c_adapt_div(struct rk3x_i2c *i2c, unsigned long clk_rate) | |||
918 | * Code adapted from i2c-cadence.c. | 918 | * Code adapted from i2c-cadence.c. |
919 | * | 919 | * |
920 | * Return: NOTIFY_STOP if the rate change should be aborted, NOTIFY_OK | 920 | * Return: NOTIFY_STOP if the rate change should be aborted, NOTIFY_OK |
921 | * to acknowedge the change, NOTIFY_DONE if the notification is | 921 | * to acknowledge the change, NOTIFY_DONE if the notification is |
922 | * considered irrelevant. | 922 | * considered irrelevant. |
923 | */ | 923 | */ |
924 | static int rk3x_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long | 924 | static int rk3x_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long |
@@ -1111,6 +1111,15 @@ static int rk3x_i2c_xfer(struct i2c_adapter *adap, | |||
1111 | return ret < 0 ? ret : num; | 1111 | return ret < 0 ? ret : num; |
1112 | } | 1112 | } |
1113 | 1113 | ||
1114 | static __maybe_unused int rk3x_i2c_resume(struct device *dev) | ||
1115 | { | ||
1116 | struct rk3x_i2c *i2c = dev_get_drvdata(dev); | ||
1117 | |||
1118 | rk3x_i2c_adapt_div(i2c, clk_get_rate(i2c->clk)); | ||
1119 | |||
1120 | return 0; | ||
1121 | } | ||
1122 | |||
1114 | static u32 rk3x_i2c_func(struct i2c_adapter *adap) | 1123 | static u32 rk3x_i2c_func(struct i2c_adapter *adap) |
1115 | { | 1124 | { |
1116 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_PROTOCOL_MANGLING; | 1125 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_PROTOCOL_MANGLING; |
@@ -1334,12 +1343,15 @@ static int rk3x_i2c_remove(struct platform_device *pdev) | |||
1334 | return 0; | 1343 | return 0; |
1335 | } | 1344 | } |
1336 | 1345 | ||
1346 | static SIMPLE_DEV_PM_OPS(rk3x_i2c_pm_ops, NULL, rk3x_i2c_resume); | ||
1347 | |||
1337 | static struct platform_driver rk3x_i2c_driver = { | 1348 | static struct platform_driver rk3x_i2c_driver = { |
1338 | .probe = rk3x_i2c_probe, | 1349 | .probe = rk3x_i2c_probe, |
1339 | .remove = rk3x_i2c_remove, | 1350 | .remove = rk3x_i2c_remove, |
1340 | .driver = { | 1351 | .driver = { |
1341 | .name = "rk3x-i2c", | 1352 | .name = "rk3x-i2c", |
1342 | .of_match_table = rk3x_i2c_match, | 1353 | .of_match_table = rk3x_i2c_match, |
1354 | .pm = &rk3x_i2c_pm_ops, | ||
1343 | }, | 1355 | }, |
1344 | }; | 1356 | }; |
1345 | 1357 | ||
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index 6fb3e2645992..05b1eeab9cf5 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c | |||
@@ -610,7 +610,7 @@ static void sh_mobile_i2c_xfer_dma(struct sh_mobile_i2c_data *pd) | |||
610 | return; | 610 | return; |
611 | 611 | ||
612 | dma_addr = dma_map_single(chan->device->dev, pd->msg->buf, pd->msg->len, dir); | 612 | dma_addr = dma_map_single(chan->device->dev, pd->msg->buf, pd->msg->len, dir); |
613 | if (dma_mapping_error(pd->dev, dma_addr)) { | 613 | if (dma_mapping_error(chan->device->dev, dma_addr)) { |
614 | dev_dbg(pd->dev, "dma map failed, using PIO\n"); | 614 | dev_dbg(pd->dev, "dma map failed, using PIO\n"); |
615 | return; | 615 | return; |
616 | } | 616 | } |
diff --git a/drivers/i2c/muxes/i2c-demux-pinctrl.c b/drivers/i2c/muxes/i2c-demux-pinctrl.c index 215ac87f606d..b3893f6282ba 100644 --- a/drivers/i2c/muxes/i2c-demux-pinctrl.c +++ b/drivers/i2c/muxes/i2c-demux-pinctrl.c | |||
@@ -37,8 +37,6 @@ struct i2c_demux_pinctrl_priv { | |||
37 | struct i2c_demux_pinctrl_chan chan[]; | 37 | struct i2c_demux_pinctrl_chan chan[]; |
38 | }; | 38 | }; |
39 | 39 | ||
40 | static struct property status_okay = { .name = "status", .length = 3, .value = "ok" }; | ||
41 | |||
42 | static int i2c_demux_master_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | 40 | static int i2c_demux_master_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) |
43 | { | 41 | { |
44 | struct i2c_demux_pinctrl_priv *priv = adap->algo_data; | 42 | struct i2c_demux_pinctrl_priv *priv = adap->algo_data; |
@@ -107,6 +105,7 @@ static int i2c_demux_activate_master(struct i2c_demux_pinctrl_priv *priv, u32 ne | |||
107 | of_changeset_revert(&priv->chan[new_chan].chgset); | 105 | of_changeset_revert(&priv->chan[new_chan].chgset); |
108 | err: | 106 | err: |
109 | dev_err(priv->dev, "failed to setup demux-adapter %d (%d)\n", new_chan, ret); | 107 | dev_err(priv->dev, "failed to setup demux-adapter %d (%d)\n", new_chan, ret); |
108 | priv->cur_chan = -EINVAL; | ||
110 | return ret; | 109 | return ret; |
111 | } | 110 | } |
112 | 111 | ||
@@ -192,6 +191,7 @@ static int i2c_demux_pinctrl_probe(struct platform_device *pdev) | |||
192 | { | 191 | { |
193 | struct device_node *np = pdev->dev.of_node; | 192 | struct device_node *np = pdev->dev.of_node; |
194 | struct i2c_demux_pinctrl_priv *priv; | 193 | struct i2c_demux_pinctrl_priv *priv; |
194 | struct property *props; | ||
195 | int num_chan, i, j, err; | 195 | int num_chan, i, j, err; |
196 | 196 | ||
197 | num_chan = of_count_phandle_with_args(np, "i2c-parent", NULL); | 197 | num_chan = of_count_phandle_with_args(np, "i2c-parent", NULL); |
@@ -202,7 +202,10 @@ static int i2c_demux_pinctrl_probe(struct platform_device *pdev) | |||
202 | 202 | ||
203 | priv = devm_kzalloc(&pdev->dev, sizeof(*priv) | 203 | priv = devm_kzalloc(&pdev->dev, sizeof(*priv) |
204 | + num_chan * sizeof(struct i2c_demux_pinctrl_chan), GFP_KERNEL); | 204 | + num_chan * sizeof(struct i2c_demux_pinctrl_chan), GFP_KERNEL); |
205 | if (!priv) | 205 | |
206 | props = devm_kcalloc(&pdev->dev, num_chan, sizeof(*props), GFP_KERNEL); | ||
207 | |||
208 | if (!priv || !props) | ||
206 | return -ENOMEM; | 209 | return -ENOMEM; |
207 | 210 | ||
208 | err = of_property_read_string(np, "i2c-bus-name", &priv->bus_name); | 211 | err = of_property_read_string(np, "i2c-bus-name", &priv->bus_name); |
@@ -220,8 +223,12 @@ static int i2c_demux_pinctrl_probe(struct platform_device *pdev) | |||
220 | } | 223 | } |
221 | priv->chan[i].parent_np = adap_np; | 224 | priv->chan[i].parent_np = adap_np; |
222 | 225 | ||
226 | props[i].name = devm_kstrdup(&pdev->dev, "status", GFP_KERNEL); | ||
227 | props[i].value = devm_kstrdup(&pdev->dev, "ok", GFP_KERNEL); | ||
228 | props[i].length = 3; | ||
229 | |||
223 | of_changeset_init(&priv->chan[i].chgset); | 230 | of_changeset_init(&priv->chan[i].chgset); |
224 | of_changeset_update_property(&priv->chan[i].chgset, adap_np, &status_okay); | 231 | of_changeset_update_property(&priv->chan[i].chgset, adap_np, &props[i]); |
225 | } | 232 | } |
226 | 233 | ||
227 | priv->num_chan = num_chan; | 234 | priv->num_chan = num_chan; |
diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig index 89d78208de3f..78f148ea9d9f 100644 --- a/drivers/iio/accel/Kconfig +++ b/drivers/iio/accel/Kconfig | |||
@@ -20,6 +20,8 @@ config BMA180 | |||
20 | config BMA220 | 20 | config BMA220 |
21 | tristate "Bosch BMA220 3-Axis Accelerometer Driver" | 21 | tristate "Bosch BMA220 3-Axis Accelerometer Driver" |
22 | depends on SPI | 22 | depends on SPI |
23 | select IIO_BUFFER | ||
24 | select IIO_TRIGGERED_BUFFER | ||
23 | help | 25 | help |
24 | Say yes here to add support for the Bosch BMA220 triaxial | 26 | Say yes here to add support for the Bosch BMA220 triaxial |
25 | acceleration sensor. | 27 | acceleration sensor. |
@@ -234,7 +236,8 @@ config STK8312 | |||
234 | config STK8BA50 | 236 | config STK8BA50 |
235 | tristate "Sensortek STK8BA50 3-Axis Accelerometer Driver" | 237 | tristate "Sensortek STK8BA50 3-Axis Accelerometer Driver" |
236 | depends on I2C | 238 | depends on I2C |
237 | depends on IIO_TRIGGER | 239 | select IIO_BUFFER |
240 | select IIO_TRIGGERED_BUFFER | ||
238 | help | 241 | help |
239 | Say yes here to get support for the Sensortek STK8BA50 3-axis | 242 | Say yes here to get support for the Sensortek STK8BA50 3-axis |
240 | accelerometer. | 243 | accelerometer. |
diff --git a/drivers/iio/accel/bma220_spi.c b/drivers/iio/accel/bma220_spi.c index 1098d10df8e8..5099f295dd37 100644 --- a/drivers/iio/accel/bma220_spi.c +++ b/drivers/iio/accel/bma220_spi.c | |||
@@ -253,7 +253,7 @@ static int bma220_probe(struct spi_device *spi) | |||
253 | if (ret < 0) | 253 | if (ret < 0) |
254 | return ret; | 254 | return ret; |
255 | 255 | ||
256 | ret = iio_triggered_buffer_setup(indio_dev, NULL, | 256 | ret = iio_triggered_buffer_setup(indio_dev, iio_pollfunc_store_time, |
257 | bma220_trigger_handler, NULL); | 257 | bma220_trigger_handler, NULL); |
258 | if (ret < 0) { | 258 | if (ret < 0) { |
259 | dev_err(&spi->dev, "iio triggered buffer setup failed\n"); | 259 | dev_err(&spi->dev, "iio triggered buffer setup failed\n"); |
diff --git a/drivers/iio/accel/bmc150-accel-core.c b/drivers/iio/accel/bmc150-accel-core.c index bf17aae66145..59b380dbf27f 100644 --- a/drivers/iio/accel/bmc150-accel-core.c +++ b/drivers/iio/accel/bmc150-accel-core.c | |||
@@ -67,6 +67,9 @@ | |||
67 | #define BMC150_ACCEL_REG_PMU_BW 0x10 | 67 | #define BMC150_ACCEL_REG_PMU_BW 0x10 |
68 | #define BMC150_ACCEL_DEF_BW 125 | 68 | #define BMC150_ACCEL_DEF_BW 125 |
69 | 69 | ||
70 | #define BMC150_ACCEL_REG_RESET 0x14 | ||
71 | #define BMC150_ACCEL_RESET_VAL 0xB6 | ||
72 | |||
70 | #define BMC150_ACCEL_REG_INT_MAP_0 0x19 | 73 | #define BMC150_ACCEL_REG_INT_MAP_0 0x19 |
71 | #define BMC150_ACCEL_INT_MAP_0_BIT_SLOPE BIT(2) | 74 | #define BMC150_ACCEL_INT_MAP_0_BIT_SLOPE BIT(2) |
72 | 75 | ||
@@ -1497,6 +1500,14 @@ static int bmc150_accel_chip_init(struct bmc150_accel_data *data) | |||
1497 | int ret, i; | 1500 | int ret, i; |
1498 | unsigned int val; | 1501 | unsigned int val; |
1499 | 1502 | ||
1503 | /* | ||
1504 | * Reset chip to get it in a known good state. A delay of 1.8ms after | ||
1505 | * reset is required according to the data sheets of supported chips. | ||
1506 | */ | ||
1507 | regmap_write(data->regmap, BMC150_ACCEL_REG_RESET, | ||
1508 | BMC150_ACCEL_RESET_VAL); | ||
1509 | usleep_range(1800, 2500); | ||
1510 | |||
1500 | ret = regmap_read(data->regmap, BMC150_ACCEL_REG_CHIP_ID, &val); | 1511 | ret = regmap_read(data->regmap, BMC150_ACCEL_REG_CHIP_ID, &val); |
1501 | if (ret < 0) { | 1512 | if (ret < 0) { |
1502 | dev_err(dev, "Error: Reading chip id\n"); | 1513 | dev_err(dev, "Error: Reading chip id\n"); |
diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c index 3a9f106787d2..9d72d4bcf5e9 100644 --- a/drivers/iio/accel/kxsd9.c +++ b/drivers/iio/accel/kxsd9.c | |||
@@ -160,11 +160,13 @@ static int kxsd9_read_raw(struct iio_dev *indio_dev, | |||
160 | if (ret < 0) | 160 | if (ret < 0) |
161 | goto error_ret; | 161 | goto error_ret; |
162 | *val = ret; | 162 | *val = ret; |
163 | ret = IIO_VAL_INT; | ||
163 | break; | 164 | break; |
164 | case IIO_CHAN_INFO_SCALE: | 165 | case IIO_CHAN_INFO_SCALE: |
165 | ret = spi_w8r8(st->us, KXSD9_READ(KXSD9_REG_CTRL_C)); | 166 | ret = spi_w8r8(st->us, KXSD9_READ(KXSD9_REG_CTRL_C)); |
166 | if (ret < 0) | 167 | if (ret < 0) |
167 | goto error_ret; | 168 | goto error_ret; |
169 | *val = 0; | ||
168 | *val2 = kxsd9_micro_scales[ret & KXSD9_FS_MASK]; | 170 | *val2 = kxsd9_micro_scales[ret & KXSD9_FS_MASK]; |
169 | ret = IIO_VAL_INT_PLUS_MICRO; | 171 | ret = IIO_VAL_INT_PLUS_MICRO; |
170 | break; | 172 | break; |
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 1de31bdd4ce4..767577298ee3 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig | |||
@@ -389,6 +389,7 @@ config QCOM_SPMI_VADC | |||
389 | config ROCKCHIP_SARADC | 389 | config ROCKCHIP_SARADC |
390 | tristate "Rockchip SARADC driver" | 390 | tristate "Rockchip SARADC driver" |
391 | depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) | 391 | depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) |
392 | depends on RESET_CONTROLLER | ||
392 | help | 393 | help |
393 | Say yes here to build support for the SARADC found in SoCs from | 394 | Say yes here to build support for the SARADC found in SoCs from |
394 | Rockchip. | 395 | Rockchip. |
diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c index b6163764489c..9704090b7908 100644 --- a/drivers/iio/adc/ad799x.c +++ b/drivers/iio/adc/ad799x.c | |||
@@ -527,6 +527,7 @@ static struct attribute_group ad799x_event_attrs_group = { | |||
527 | static const struct iio_info ad7991_info = { | 527 | static const struct iio_info ad7991_info = { |
528 | .read_raw = &ad799x_read_raw, | 528 | .read_raw = &ad799x_read_raw, |
529 | .driver_module = THIS_MODULE, | 529 | .driver_module = THIS_MODULE, |
530 | .update_scan_mode = ad799x_update_scan_mode, | ||
530 | }; | 531 | }; |
531 | 532 | ||
532 | static const struct iio_info ad7993_4_7_8_noirq_info = { | 533 | static const struct iio_info ad7993_4_7_8_noirq_info = { |
diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c index 52430ba171f3..0438c68015e8 100644 --- a/drivers/iio/adc/at91_adc.c +++ b/drivers/iio/adc/at91_adc.c | |||
@@ -381,8 +381,8 @@ static irqreturn_t at91_adc_rl_interrupt(int irq, void *private) | |||
381 | st->ts_bufferedmeasure = false; | 381 | st->ts_bufferedmeasure = false; |
382 | input_report_key(st->ts_input, BTN_TOUCH, 0); | 382 | input_report_key(st->ts_input, BTN_TOUCH, 0); |
383 | input_sync(st->ts_input); | 383 | input_sync(st->ts_input); |
384 | } else if (status & AT91_ADC_EOC(3)) { | 384 | } else if (status & AT91_ADC_EOC(3) && st->ts_input) { |
385 | /* Conversion finished */ | 385 | /* Conversion finished and we've a touchscreen */ |
386 | if (st->ts_bufferedmeasure) { | 386 | if (st->ts_bufferedmeasure) { |
387 | /* | 387 | /* |
388 | * Last measurement is always discarded, since it can | 388 | * Last measurement is always discarded, since it can |
diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c index f9ad6c2d6821..85d701291654 100644 --- a/drivers/iio/adc/rockchip_saradc.c +++ b/drivers/iio/adc/rockchip_saradc.c | |||
@@ -21,6 +21,8 @@ | |||
21 | #include <linux/of_device.h> | 21 | #include <linux/of_device.h> |
22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
23 | #include <linux/completion.h> | 23 | #include <linux/completion.h> |
24 | #include <linux/delay.h> | ||
25 | #include <linux/reset.h> | ||
24 | #include <linux/regulator/consumer.h> | 26 | #include <linux/regulator/consumer.h> |
25 | #include <linux/iio/iio.h> | 27 | #include <linux/iio/iio.h> |
26 | 28 | ||
@@ -53,6 +55,7 @@ struct rockchip_saradc { | |||
53 | struct clk *clk; | 55 | struct clk *clk; |
54 | struct completion completion; | 56 | struct completion completion; |
55 | struct regulator *vref; | 57 | struct regulator *vref; |
58 | struct reset_control *reset; | ||
56 | const struct rockchip_saradc_data *data; | 59 | const struct rockchip_saradc_data *data; |
57 | u16 last_val; | 60 | u16 last_val; |
58 | }; | 61 | }; |
@@ -190,6 +193,16 @@ static const struct of_device_id rockchip_saradc_match[] = { | |||
190 | }; | 193 | }; |
191 | MODULE_DEVICE_TABLE(of, rockchip_saradc_match); | 194 | MODULE_DEVICE_TABLE(of, rockchip_saradc_match); |
192 | 195 | ||
196 | /** | ||
197 | * Reset SARADC Controller. | ||
198 | */ | ||
199 | static void rockchip_saradc_reset_controller(struct reset_control *reset) | ||
200 | { | ||
201 | reset_control_assert(reset); | ||
202 | usleep_range(10, 20); | ||
203 | reset_control_deassert(reset); | ||
204 | } | ||
205 | |||
193 | static int rockchip_saradc_probe(struct platform_device *pdev) | 206 | static int rockchip_saradc_probe(struct platform_device *pdev) |
194 | { | 207 | { |
195 | struct rockchip_saradc *info = NULL; | 208 | struct rockchip_saradc *info = NULL; |
@@ -218,6 +231,20 @@ static int rockchip_saradc_probe(struct platform_device *pdev) | |||
218 | if (IS_ERR(info->regs)) | 231 | if (IS_ERR(info->regs)) |
219 | return PTR_ERR(info->regs); | 232 | return PTR_ERR(info->regs); |
220 | 233 | ||
234 | /* | ||
235 | * The reset should be an optional property, as it should work | ||
236 | * with old devicetrees as well | ||
237 | */ | ||
238 | info->reset = devm_reset_control_get(&pdev->dev, "saradc-apb"); | ||
239 | if (IS_ERR(info->reset)) { | ||
240 | ret = PTR_ERR(info->reset); | ||
241 | if (ret != -ENOENT) | ||
242 | return ret; | ||
243 | |||
244 | dev_dbg(&pdev->dev, "no reset control found\n"); | ||
245 | info->reset = NULL; | ||
246 | } | ||
247 | |||
221 | init_completion(&info->completion); | 248 | init_completion(&info->completion); |
222 | 249 | ||
223 | irq = platform_get_irq(pdev, 0); | 250 | irq = platform_get_irq(pdev, 0); |
@@ -252,6 +279,9 @@ static int rockchip_saradc_probe(struct platform_device *pdev) | |||
252 | return PTR_ERR(info->vref); | 279 | return PTR_ERR(info->vref); |
253 | } | 280 | } |
254 | 281 | ||
282 | if (info->reset) | ||
283 | rockchip_saradc_reset_controller(info->reset); | ||
284 | |||
255 | /* | 285 | /* |
256 | * Use a default value for the converter clock. | 286 | * Use a default value for the converter clock. |
257 | * This may become user-configurable in the future. | 287 | * This may become user-configurable in the future. |
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c index 1ef398770a1f..066abaf80201 100644 --- a/drivers/iio/adc/ti-ads1015.c +++ b/drivers/iio/adc/ti-ads1015.c | |||
@@ -489,7 +489,8 @@ static struct iio_info ads1115_info = { | |||
489 | #ifdef CONFIG_OF | 489 | #ifdef CONFIG_OF |
490 | static int ads1015_get_channels_config_of(struct i2c_client *client) | 490 | static int ads1015_get_channels_config_of(struct i2c_client *client) |
491 | { | 491 | { |
492 | struct ads1015_data *data = i2c_get_clientdata(client); | 492 | struct iio_dev *indio_dev = i2c_get_clientdata(client); |
493 | struct ads1015_data *data = iio_priv(indio_dev); | ||
493 | struct device_node *node; | 494 | struct device_node *node; |
494 | 495 | ||
495 | if (!client->dev.of_node || | 496 | if (!client->dev.of_node || |
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c index 8a368756881b..c3cfacca2541 100644 --- a/drivers/iio/adc/ti_am335x_adc.c +++ b/drivers/iio/adc/ti_am335x_adc.c | |||
@@ -32,6 +32,7 @@ | |||
32 | 32 | ||
33 | struct tiadc_device { | 33 | struct tiadc_device { |
34 | struct ti_tscadc_dev *mfd_tscadc; | 34 | struct ti_tscadc_dev *mfd_tscadc; |
35 | struct mutex fifo1_lock; /* to protect fifo access */ | ||
35 | int channels; | 36 | int channels; |
36 | u8 channel_line[8]; | 37 | u8 channel_line[8]; |
37 | u8 channel_step[8]; | 38 | u8 channel_step[8]; |
@@ -359,6 +360,7 @@ static int tiadc_read_raw(struct iio_dev *indio_dev, | |||
359 | int *val, int *val2, long mask) | 360 | int *val, int *val2, long mask) |
360 | { | 361 | { |
361 | struct tiadc_device *adc_dev = iio_priv(indio_dev); | 362 | struct tiadc_device *adc_dev = iio_priv(indio_dev); |
363 | int ret = IIO_VAL_INT; | ||
362 | int i, map_val; | 364 | int i, map_val; |
363 | unsigned int fifo1count, read, stepid; | 365 | unsigned int fifo1count, read, stepid; |
364 | bool found = false; | 366 | bool found = false; |
@@ -372,13 +374,14 @@ static int tiadc_read_raw(struct iio_dev *indio_dev, | |||
372 | if (!step_en) | 374 | if (!step_en) |
373 | return -EINVAL; | 375 | return -EINVAL; |
374 | 376 | ||
377 | mutex_lock(&adc_dev->fifo1_lock); | ||
375 | fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT); | 378 | fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT); |
376 | while (fifo1count--) | 379 | while (fifo1count--) |
377 | tiadc_readl(adc_dev, REG_FIFO1); | 380 | tiadc_readl(adc_dev, REG_FIFO1); |
378 | 381 | ||
379 | am335x_tsc_se_set_once(adc_dev->mfd_tscadc, step_en); | 382 | am335x_tsc_se_set_once(adc_dev->mfd_tscadc, step_en); |
380 | 383 | ||
381 | timeout = jiffies + usecs_to_jiffies | 384 | timeout = jiffies + msecs_to_jiffies |
382 | (IDLE_TIMEOUT * adc_dev->channels); | 385 | (IDLE_TIMEOUT * adc_dev->channels); |
383 | /* Wait for Fifo threshold interrupt */ | 386 | /* Wait for Fifo threshold interrupt */ |
384 | while (1) { | 387 | while (1) { |
@@ -388,7 +391,8 @@ static int tiadc_read_raw(struct iio_dev *indio_dev, | |||
388 | 391 | ||
389 | if (time_after(jiffies, timeout)) { | 392 | if (time_after(jiffies, timeout)) { |
390 | am335x_tsc_se_adc_done(adc_dev->mfd_tscadc); | 393 | am335x_tsc_se_adc_done(adc_dev->mfd_tscadc); |
391 | return -EAGAIN; | 394 | ret = -EAGAIN; |
395 | goto err_unlock; | ||
392 | } | 396 | } |
393 | } | 397 | } |
394 | map_val = adc_dev->channel_step[chan->scan_index]; | 398 | map_val = adc_dev->channel_step[chan->scan_index]; |
@@ -414,8 +418,11 @@ static int tiadc_read_raw(struct iio_dev *indio_dev, | |||
414 | am335x_tsc_se_adc_done(adc_dev->mfd_tscadc); | 418 | am335x_tsc_se_adc_done(adc_dev->mfd_tscadc); |
415 | 419 | ||
416 | if (found == false) | 420 | if (found == false) |
417 | return -EBUSY; | 421 | ret = -EBUSY; |
418 | return IIO_VAL_INT; | 422 | |
423 | err_unlock: | ||
424 | mutex_unlock(&adc_dev->fifo1_lock); | ||
425 | return ret; | ||
419 | } | 426 | } |
420 | 427 | ||
421 | static const struct iio_info tiadc_info = { | 428 | static const struct iio_info tiadc_info = { |
@@ -483,6 +490,7 @@ static int tiadc_probe(struct platform_device *pdev) | |||
483 | 490 | ||
484 | tiadc_step_config(indio_dev); | 491 | tiadc_step_config(indio_dev); |
485 | tiadc_writel(adc_dev, REG_FIFO1THR, FIFO1_THRESHOLD); | 492 | tiadc_writel(adc_dev, REG_FIFO1THR, FIFO1_THRESHOLD); |
493 | mutex_init(&adc_dev->fifo1_lock); | ||
486 | 494 | ||
487 | err = tiadc_channel_init(indio_dev, adc_dev->channels); | 495 | err = tiadc_channel_init(indio_dev, adc_dev->channels); |
488 | if (err < 0) | 496 | if (err < 0) |
diff --git a/drivers/iio/chemical/atlas-ph-sensor.c b/drivers/iio/chemical/atlas-ph-sensor.c index ae038a59d256..407f141a1eee 100644 --- a/drivers/iio/chemical/atlas-ph-sensor.c +++ b/drivers/iio/chemical/atlas-ph-sensor.c | |||
@@ -434,7 +434,7 @@ static int atlas_read_raw(struct iio_dev *indio_dev, | |||
434 | break; | 434 | break; |
435 | case IIO_ELECTRICALCONDUCTIVITY: | 435 | case IIO_ELECTRICALCONDUCTIVITY: |
436 | *val = 1; /* 0.00001 */ | 436 | *val = 1; /* 0.00001 */ |
437 | *val = 100000; | 437 | *val2 = 100000; |
438 | break; | 438 | break; |
439 | case IIO_CONCENTRATION: | 439 | case IIO_CONCENTRATION: |
440 | *val = 0; /* 0.000000001 */ | 440 | *val = 0; /* 0.000000001 */ |
diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c index e81f434760f4..dc33c1dd5191 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c | |||
@@ -56,8 +56,8 @@ static struct { | |||
56 | {HID_USAGE_SENSOR_ALS, 0, 1, 0}, | 56 | {HID_USAGE_SENSOR_ALS, 0, 1, 0}, |
57 | {HID_USAGE_SENSOR_ALS, HID_USAGE_SENSOR_UNITS_LUX, 1, 0}, | 57 | {HID_USAGE_SENSOR_ALS, HID_USAGE_SENSOR_UNITS_LUX, 1, 0}, |
58 | 58 | ||
59 | {HID_USAGE_SENSOR_PRESSURE, 0, 100000, 0}, | 59 | {HID_USAGE_SENSOR_PRESSURE, 0, 100, 0}, |
60 | {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 1, 0}, | 60 | {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 0, 1000}, |
61 | }; | 61 | }; |
62 | 62 | ||
63 | static int pow_10(unsigned power) | 63 | static int pow_10(unsigned power) |
diff --git a/drivers/iio/dac/stx104.c b/drivers/iio/dac/stx104.c index 792a97164cb2..bebbd00304ce 100644 --- a/drivers/iio/dac/stx104.c +++ b/drivers/iio/dac/stx104.c | |||
@@ -65,6 +65,16 @@ struct stx104_gpio { | |||
65 | unsigned int out_state; | 65 | unsigned int out_state; |
66 | }; | 66 | }; |
67 | 67 | ||
68 | /** | ||
69 | * struct stx104_dev - STX104 device private data structure | ||
70 | * @indio_dev: IIO device | ||
71 | * @chip: instance of the gpio_chip | ||
72 | */ | ||
73 | struct stx104_dev { | ||
74 | struct iio_dev *indio_dev; | ||
75 | struct gpio_chip *chip; | ||
76 | }; | ||
77 | |||
68 | static int stx104_read_raw(struct iio_dev *indio_dev, | 78 | static int stx104_read_raw(struct iio_dev *indio_dev, |
69 | struct iio_chan_spec const *chan, int *val, int *val2, long mask) | 79 | struct iio_chan_spec const *chan, int *val, int *val2, long mask) |
70 | { | 80 | { |
@@ -107,6 +117,7 @@ static const struct iio_chan_spec stx104_channels[STX104_NUM_CHAN] = { | |||
107 | static int stx104_gpio_get_direction(struct gpio_chip *chip, | 117 | static int stx104_gpio_get_direction(struct gpio_chip *chip, |
108 | unsigned int offset) | 118 | unsigned int offset) |
109 | { | 119 | { |
120 | /* GPIO 0-3 are input only, while the rest are output only */ | ||
110 | if (offset < 4) | 121 | if (offset < 4) |
111 | return 1; | 122 | return 1; |
112 | 123 | ||
@@ -169,6 +180,7 @@ static int stx104_probe(struct device *dev, unsigned int id) | |||
169 | struct iio_dev *indio_dev; | 180 | struct iio_dev *indio_dev; |
170 | struct stx104_iio *priv; | 181 | struct stx104_iio *priv; |
171 | struct stx104_gpio *stx104gpio; | 182 | struct stx104_gpio *stx104gpio; |
183 | struct stx104_dev *stx104dev; | ||
172 | int err; | 184 | int err; |
173 | 185 | ||
174 | indio_dev = devm_iio_device_alloc(dev, sizeof(*priv)); | 186 | indio_dev = devm_iio_device_alloc(dev, sizeof(*priv)); |
@@ -179,6 +191,10 @@ static int stx104_probe(struct device *dev, unsigned int id) | |||
179 | if (!stx104gpio) | 191 | if (!stx104gpio) |
180 | return -ENOMEM; | 192 | return -ENOMEM; |
181 | 193 | ||
194 | stx104dev = devm_kzalloc(dev, sizeof(*stx104dev), GFP_KERNEL); | ||
195 | if (!stx104dev) | ||
196 | return -ENOMEM; | ||
197 | |||
182 | if (!devm_request_region(dev, base[id], STX104_EXTENT, | 198 | if (!devm_request_region(dev, base[id], STX104_EXTENT, |
183 | dev_name(dev))) { | 199 | dev_name(dev))) { |
184 | dev_err(dev, "Unable to lock port addresses (0x%X-0x%X)\n", | 200 | dev_err(dev, "Unable to lock port addresses (0x%X-0x%X)\n", |
@@ -199,12 +215,6 @@ static int stx104_probe(struct device *dev, unsigned int id) | |||
199 | outw(0, base[id] + 4); | 215 | outw(0, base[id] + 4); |
200 | outw(0, base[id] + 6); | 216 | outw(0, base[id] + 6); |
201 | 217 | ||
202 | err = devm_iio_device_register(dev, indio_dev); | ||
203 | if (err) { | ||
204 | dev_err(dev, "IIO device registering failed (%d)\n", err); | ||
205 | return err; | ||
206 | } | ||
207 | |||
208 | stx104gpio->chip.label = dev_name(dev); | 218 | stx104gpio->chip.label = dev_name(dev); |
209 | stx104gpio->chip.parent = dev; | 219 | stx104gpio->chip.parent = dev; |
210 | stx104gpio->chip.owner = THIS_MODULE; | 220 | stx104gpio->chip.owner = THIS_MODULE; |
@@ -220,7 +230,9 @@ static int stx104_probe(struct device *dev, unsigned int id) | |||
220 | 230 | ||
221 | spin_lock_init(&stx104gpio->lock); | 231 | spin_lock_init(&stx104gpio->lock); |
222 | 232 | ||
223 | dev_set_drvdata(dev, stx104gpio); | 233 | stx104dev->indio_dev = indio_dev; |
234 | stx104dev->chip = &stx104gpio->chip; | ||
235 | dev_set_drvdata(dev, stx104dev); | ||
224 | 236 | ||
225 | err = gpiochip_add_data(&stx104gpio->chip, stx104gpio); | 237 | err = gpiochip_add_data(&stx104gpio->chip, stx104gpio); |
226 | if (err) { | 238 | if (err) { |
@@ -228,14 +240,22 @@ static int stx104_probe(struct device *dev, unsigned int id) | |||
228 | return err; | 240 | return err; |
229 | } | 241 | } |
230 | 242 | ||
243 | err = iio_device_register(indio_dev); | ||
244 | if (err) { | ||
245 | dev_err(dev, "IIO device registering failed (%d)\n", err); | ||
246 | gpiochip_remove(&stx104gpio->chip); | ||
247 | return err; | ||
248 | } | ||
249 | |||
231 | return 0; | 250 | return 0; |
232 | } | 251 | } |
233 | 252 | ||
234 | static int stx104_remove(struct device *dev, unsigned int id) | 253 | static int stx104_remove(struct device *dev, unsigned int id) |
235 | { | 254 | { |
236 | struct stx104_gpio *const stx104gpio = dev_get_drvdata(dev); | 255 | struct stx104_dev *const stx104dev = dev_get_drvdata(dev); |
237 | 256 | ||
238 | gpiochip_remove(&stx104gpio->chip); | 257 | iio_device_unregister(stx104dev->indio_dev); |
258 | gpiochip_remove(stx104dev->chip); | ||
239 | 259 | ||
240 | return 0; | 260 | return 0; |
241 | } | 261 | } |
diff --git a/drivers/iio/humidity/Kconfig b/drivers/iio/humidity/Kconfig index 738a86d9e4a9..d04124345992 100644 --- a/drivers/iio/humidity/Kconfig +++ b/drivers/iio/humidity/Kconfig | |||
@@ -6,6 +6,8 @@ menu "Humidity sensors" | |||
6 | config AM2315 | 6 | config AM2315 |
7 | tristate "Aosong AM2315 relative humidity and temperature sensor" | 7 | tristate "Aosong AM2315 relative humidity and temperature sensor" |
8 | depends on I2C | 8 | depends on I2C |
9 | select IIO_BUFFER | ||
10 | select IIO_TRIGGERED_BUFFER | ||
9 | help | 11 | help |
10 | If you say yes here you get support for the Aosong AM2315 | 12 | If you say yes here you get support for the Aosong AM2315 |
11 | relative humidity and ambient temperature sensor. | 13 | relative humidity and ambient temperature sensor. |
diff --git a/drivers/iio/humidity/am2315.c b/drivers/iio/humidity/am2315.c index 3e200f69e886..ff96b6d0fdae 100644 --- a/drivers/iio/humidity/am2315.c +++ b/drivers/iio/humidity/am2315.c | |||
@@ -244,7 +244,7 @@ static int am2315_probe(struct i2c_client *client, | |||
244 | indio_dev->channels = am2315_channels; | 244 | indio_dev->channels = am2315_channels; |
245 | indio_dev->num_channels = ARRAY_SIZE(am2315_channels); | 245 | indio_dev->num_channels = ARRAY_SIZE(am2315_channels); |
246 | 246 | ||
247 | ret = iio_triggered_buffer_setup(indio_dev, NULL, | 247 | ret = iio_triggered_buffer_setup(indio_dev, iio_pollfunc_store_time, |
248 | am2315_trigger_handler, NULL); | 248 | am2315_trigger_handler, NULL); |
249 | if (ret < 0) { | 249 | if (ret < 0) { |
250 | dev_err(&client->dev, "iio triggered buffer setup failed\n"); | 250 | dev_err(&client->dev, "iio triggered buffer setup failed\n"); |
diff --git a/drivers/iio/humidity/hdc100x.c b/drivers/iio/humidity/hdc100x.c index a03832a5fc95..e0c9c70c2a4a 100644 --- a/drivers/iio/humidity/hdc100x.c +++ b/drivers/iio/humidity/hdc100x.c | |||
@@ -142,7 +142,7 @@ static int hdc100x_get_measurement(struct hdc100x_data *data, | |||
142 | struct i2c_client *client = data->client; | 142 | struct i2c_client *client = data->client; |
143 | int delay = data->adc_int_us[chan->address]; | 143 | int delay = data->adc_int_us[chan->address]; |
144 | int ret; | 144 | int ret; |
145 | int val; | 145 | __be16 val; |
146 | 146 | ||
147 | /* start measurement */ | 147 | /* start measurement */ |
148 | ret = i2c_smbus_write_byte(client, chan->address); | 148 | ret = i2c_smbus_write_byte(client, chan->address); |
@@ -154,26 +154,13 @@ static int hdc100x_get_measurement(struct hdc100x_data *data, | |||
154 | /* wait for integration time to pass */ | 154 | /* wait for integration time to pass */ |
155 | usleep_range(delay, delay + 1000); | 155 | usleep_range(delay, delay + 1000); |
156 | 156 | ||
157 | /* | 157 | /* read measurement */ |
158 | * i2c_smbus_read_word_data cannot() be used here due to the command | 158 | ret = i2c_master_recv(data->client, (char *)&val, sizeof(val)); |
159 | * value not being understood and causes NAKs preventing any reading | ||
160 | * from being accessed. | ||
161 | */ | ||
162 | ret = i2c_smbus_read_byte(client); | ||
163 | if (ret < 0) { | 159 | if (ret < 0) { |
164 | dev_err(&client->dev, "cannot read high byte measurement"); | 160 | dev_err(&client->dev, "cannot read sensor data\n"); |
165 | return ret; | 161 | return ret; |
166 | } | 162 | } |
167 | val = ret << 8; | 163 | return be16_to_cpu(val); |
168 | |||
169 | ret = i2c_smbus_read_byte(client); | ||
170 | if (ret < 0) { | ||
171 | dev_err(&client->dev, "cannot read low byte measurement"); | ||
172 | return ret; | ||
173 | } | ||
174 | val |= ret; | ||
175 | |||
176 | return val; | ||
177 | } | 164 | } |
178 | 165 | ||
179 | static int hdc100x_get_heater_status(struct hdc100x_data *data) | 166 | static int hdc100x_get_heater_status(struct hdc100x_data *data) |
@@ -272,8 +259,8 @@ static int hdc100x_probe(struct i2c_client *client, | |||
272 | struct iio_dev *indio_dev; | 259 | struct iio_dev *indio_dev; |
273 | struct hdc100x_data *data; | 260 | struct hdc100x_data *data; |
274 | 261 | ||
275 | if (!i2c_check_functionality(client->adapter, | 262 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA | |
276 | I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BYTE)) | 263 | I2C_FUNC_SMBUS_BYTE | I2C_FUNC_I2C)) |
277 | return -EOPNOTSUPP; | 264 | return -EOPNOTSUPP; |
278 | 265 | ||
279 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | 266 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); |
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index 90462fcf5436..158aaf44dd95 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c | |||
@@ -107,9 +107,10 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, | |||
107 | { | 107 | { |
108 | struct iio_dev *indio_dev = filp->private_data; | 108 | struct iio_dev *indio_dev = filp->private_data; |
109 | struct iio_buffer *rb = indio_dev->buffer; | 109 | struct iio_buffer *rb = indio_dev->buffer; |
110 | DEFINE_WAIT_FUNC(wait, woken_wake_function); | ||
110 | size_t datum_size; | 111 | size_t datum_size; |
111 | size_t to_wait; | 112 | size_t to_wait; |
112 | int ret; | 113 | int ret = 0; |
113 | 114 | ||
114 | if (!indio_dev->info) | 115 | if (!indio_dev->info) |
115 | return -ENODEV; | 116 | return -ENODEV; |
@@ -131,19 +132,29 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, | |||
131 | else | 132 | else |
132 | to_wait = min_t(size_t, n / datum_size, rb->watermark); | 133 | to_wait = min_t(size_t, n / datum_size, rb->watermark); |
133 | 134 | ||
135 | add_wait_queue(&rb->pollq, &wait); | ||
134 | do { | 136 | do { |
135 | ret = wait_event_interruptible(rb->pollq, | 137 | if (!indio_dev->info) { |
136 | iio_buffer_ready(indio_dev, rb, to_wait, n / datum_size)); | 138 | ret = -ENODEV; |
137 | if (ret) | 139 | break; |
138 | return ret; | 140 | } |
139 | 141 | ||
140 | if (!indio_dev->info) | 142 | if (!iio_buffer_ready(indio_dev, rb, to_wait, n / datum_size)) { |
141 | return -ENODEV; | 143 | if (signal_pending(current)) { |
144 | ret = -ERESTARTSYS; | ||
145 | break; | ||
146 | } | ||
147 | |||
148 | wait_woken(&wait, TASK_INTERRUPTIBLE, | ||
149 | MAX_SCHEDULE_TIMEOUT); | ||
150 | continue; | ||
151 | } | ||
142 | 152 | ||
143 | ret = rb->access->read_first_n(rb, n, buf); | 153 | ret = rb->access->read_first_n(rb, n, buf); |
144 | if (ret == 0 && (filp->f_flags & O_NONBLOCK)) | 154 | if (ret == 0 && (filp->f_flags & O_NONBLOCK)) |
145 | ret = -EAGAIN; | 155 | ret = -EAGAIN; |
146 | } while (ret == 0); | 156 | } while (ret == 0); |
157 | remove_wait_queue(&rb->pollq, &wait); | ||
147 | 158 | ||
148 | return ret; | 159 | return ret; |
149 | } | 160 | } |
diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index f914d5d140e4..d2b889918c3e 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c | |||
@@ -613,9 +613,8 @@ ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals) | |||
613 | return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); | 613 | return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); |
614 | case IIO_VAL_FRACTIONAL: | 614 | case IIO_VAL_FRACTIONAL: |
615 | tmp = div_s64((s64)vals[0] * 1000000000LL, vals[1]); | 615 | tmp = div_s64((s64)vals[0] * 1000000000LL, vals[1]); |
616 | vals[1] = do_div(tmp, 1000000000LL); | 616 | vals[0] = (int)div_s64_rem(tmp, 1000000000, &vals[1]); |
617 | vals[0] = tmp; | 617 | return sprintf(buf, "%d.%09u\n", vals[0], abs(vals[1])); |
618 | return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); | ||
619 | case IIO_VAL_FRACTIONAL_LOG2: | 618 | case IIO_VAL_FRACTIONAL_LOG2: |
620 | tmp = (s64)vals[0] * 1000000000LL >> vals[1]; | 619 | tmp = (s64)vals[0] * 1000000000LL >> vals[1]; |
621 | vals[1] = do_div(tmp, 1000000000LL); | 620 | vals[1] = do_div(tmp, 1000000000LL); |
diff --git a/drivers/iio/light/Kconfig b/drivers/iio/light/Kconfig index 7c566f516572..3574945183fe 100644 --- a/drivers/iio/light/Kconfig +++ b/drivers/iio/light/Kconfig | |||
@@ -76,7 +76,6 @@ config BH1750 | |||
76 | config BH1780 | 76 | config BH1780 |
77 | tristate "ROHM BH1780 ambient light sensor" | 77 | tristate "ROHM BH1780 ambient light sensor" |
78 | depends on I2C | 78 | depends on I2C |
79 | depends on !SENSORS_BH1780 | ||
80 | help | 79 | help |
81 | Say Y here to build support for the ROHM BH1780GLI ambient | 80 | Say Y here to build support for the ROHM BH1780GLI ambient |
82 | light sensor. | 81 | light sensor. |
@@ -238,6 +237,8 @@ config MAX44000 | |||
238 | tristate "MAX44000 Ambient and Infrared Proximity Sensor" | 237 | tristate "MAX44000 Ambient and Infrared Proximity Sensor" |
239 | depends on I2C | 238 | depends on I2C |
240 | select REGMAP_I2C | 239 | select REGMAP_I2C |
240 | select IIO_BUFFER | ||
241 | select IIO_TRIGGERED_BUFFER | ||
241 | help | 242 | help |
242 | Say Y here if you want to build support for Maxim Integrated's | 243 | Say Y here if you want to build support for Maxim Integrated's |
243 | MAX44000 ambient and infrared proximity sensor device. | 244 | MAX44000 ambient and infrared proximity sensor device. |
diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c index 6943688e66df..e5a533cbd53f 100644 --- a/drivers/iio/pressure/bmp280-core.c +++ b/drivers/iio/pressure/bmp280-core.c | |||
@@ -970,7 +970,7 @@ int bmp280_common_probe(struct device *dev, | |||
970 | data->vdda = devm_regulator_get(dev, "vdda"); | 970 | data->vdda = devm_regulator_get(dev, "vdda"); |
971 | if (IS_ERR(data->vdda)) { | 971 | if (IS_ERR(data->vdda)) { |
972 | dev_err(dev, "failed to get VDDA regulator\n"); | 972 | dev_err(dev, "failed to get VDDA regulator\n"); |
973 | ret = PTR_ERR(data->vddd); | 973 | ret = PTR_ERR(data->vdda); |
974 | goto out_disable_vddd; | 974 | goto out_disable_vddd; |
975 | } | 975 | } |
976 | ret = regulator_enable(data->vdda); | 976 | ret = regulator_enable(data->vdda); |
@@ -1079,7 +1079,8 @@ EXPORT_SYMBOL(bmp280_common_remove); | |||
1079 | #ifdef CONFIG_PM | 1079 | #ifdef CONFIG_PM |
1080 | static int bmp280_runtime_suspend(struct device *dev) | 1080 | static int bmp280_runtime_suspend(struct device *dev) |
1081 | { | 1081 | { |
1082 | struct bmp280_data *data = dev_get_drvdata(dev); | 1082 | struct iio_dev *indio_dev = dev_get_drvdata(dev); |
1083 | struct bmp280_data *data = iio_priv(indio_dev); | ||
1083 | int ret; | 1084 | int ret; |
1084 | 1085 | ||
1085 | ret = regulator_disable(data->vdda); | 1086 | ret = regulator_disable(data->vdda); |
@@ -1090,7 +1091,8 @@ static int bmp280_runtime_suspend(struct device *dev) | |||
1090 | 1091 | ||
1091 | static int bmp280_runtime_resume(struct device *dev) | 1092 | static int bmp280_runtime_resume(struct device *dev) |
1092 | { | 1093 | { |
1093 | struct bmp280_data *data = dev_get_drvdata(dev); | 1094 | struct iio_dev *indio_dev = dev_get_drvdata(dev); |
1095 | struct bmp280_data *data = iio_priv(indio_dev); | ||
1094 | int ret; | 1096 | int ret; |
1095 | 1097 | ||
1096 | ret = regulator_enable(data->vddd); | 1098 | ret = regulator_enable(data->vddd); |
diff --git a/drivers/iio/proximity/as3935.c b/drivers/iio/proximity/as3935.c index 2e3a70e1b245..5656deb17261 100644 --- a/drivers/iio/proximity/as3935.c +++ b/drivers/iio/proximity/as3935.c | |||
@@ -397,7 +397,7 @@ static int as3935_probe(struct spi_device *spi) | |||
397 | return ret; | 397 | return ret; |
398 | } | 398 | } |
399 | 399 | ||
400 | ret = iio_triggered_buffer_setup(indio_dev, NULL, | 400 | ret = iio_triggered_buffer_setup(indio_dev, iio_pollfunc_store_time, |
401 | &as3935_trigger_handler, NULL); | 401 | &as3935_trigger_handler, NULL); |
402 | 402 | ||
403 | if (ret) { | 403 | if (ret) { |
diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c index 3a3c5d73bbfc..51c79b2fb0b8 100644 --- a/drivers/infiniband/core/multicast.c +++ b/drivers/infiniband/core/multicast.c | |||
@@ -106,7 +106,6 @@ struct mcast_group { | |||
106 | atomic_t refcount; | 106 | atomic_t refcount; |
107 | enum mcast_group_state state; | 107 | enum mcast_group_state state; |
108 | struct ib_sa_query *query; | 108 | struct ib_sa_query *query; |
109 | int query_id; | ||
110 | u16 pkey_index; | 109 | u16 pkey_index; |
111 | u8 leave_state; | 110 | u8 leave_state; |
112 | int retries; | 111 | int retries; |
@@ -340,11 +339,7 @@ static int send_join(struct mcast_group *group, struct mcast_member *member) | |||
340 | member->multicast.comp_mask, | 339 | member->multicast.comp_mask, |
341 | 3000, GFP_KERNEL, join_handler, group, | 340 | 3000, GFP_KERNEL, join_handler, group, |
342 | &group->query); | 341 | &group->query); |
343 | if (ret >= 0) { | 342 | return (ret > 0) ? 0 : ret; |
344 | group->query_id = ret; | ||
345 | ret = 0; | ||
346 | } | ||
347 | return ret; | ||
348 | } | 343 | } |
349 | 344 | ||
350 | static int send_leave(struct mcast_group *group, u8 leave_state) | 345 | static int send_leave(struct mcast_group *group, u8 leave_state) |
@@ -364,11 +359,7 @@ static int send_leave(struct mcast_group *group, u8 leave_state) | |||
364 | IB_SA_MCMEMBER_REC_JOIN_STATE, | 359 | IB_SA_MCMEMBER_REC_JOIN_STATE, |
365 | 3000, GFP_KERNEL, leave_handler, | 360 | 3000, GFP_KERNEL, leave_handler, |
366 | group, &group->query); | 361 | group, &group->query); |
367 | if (ret >= 0) { | 362 | return (ret > 0) ? 0 : ret; |
368 | group->query_id = ret; | ||
369 | ret = 0; | ||
370 | } | ||
371 | return ret; | ||
372 | } | 363 | } |
373 | 364 | ||
374 | static void join_group(struct mcast_group *group, struct mcast_member *member, | 365 | static void join_group(struct mcast_group *group, struct mcast_member *member, |
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c index edb1172b6f54..690435229be7 100644 --- a/drivers/infiniband/hw/cxgb4/qp.c +++ b/drivers/infiniband/hw/cxgb4/qp.c | |||
@@ -683,7 +683,7 @@ static int build_inv_stag(union t4_wr *wqe, struct ib_send_wr *wr, | |||
683 | return 0; | 683 | return 0; |
684 | } | 684 | } |
685 | 685 | ||
686 | void _free_qp(struct kref *kref) | 686 | static void _free_qp(struct kref *kref) |
687 | { | 687 | { |
688 | struct c4iw_qp *qhp; | 688 | struct c4iw_qp *qhp; |
689 | 689 | ||
diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c index b32638d58ae8..cc38004cea42 100644 --- a/drivers/infiniband/hw/hfi1/chip.c +++ b/drivers/infiniband/hw/hfi1/chip.c | |||
@@ -9490,6 +9490,78 @@ static void init_lcb(struct hfi1_devdata *dd) | |||
9490 | write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 0x00); | 9490 | write_csr(dd, DC_LCB_CFG_TX_FIFOS_RESET, 0x00); |
9491 | } | 9491 | } |
9492 | 9492 | ||
9493 | /* | ||
9494 | * Perform a test read on the QSFP. Return 0 on success, -ERRNO | ||
9495 | * on error. | ||
9496 | */ | ||
9497 | static int test_qsfp_read(struct hfi1_pportdata *ppd) | ||
9498 | { | ||
9499 | int ret; | ||
9500 | u8 status; | ||
9501 | |||
9502 | /* report success if not a QSFP */ | ||
9503 | if (ppd->port_type != PORT_TYPE_QSFP) | ||
9504 | return 0; | ||
9505 | |||
9506 | /* read byte 2, the status byte */ | ||
9507 | ret = one_qsfp_read(ppd, ppd->dd->hfi1_id, 2, &status, 1); | ||
9508 | if (ret < 0) | ||
9509 | return ret; | ||
9510 | if (ret != 1) | ||
9511 | return -EIO; | ||
9512 | |||
9513 | return 0; /* success */ | ||
9514 | } | ||
9515 | |||
9516 | /* | ||
9517 | * Values for QSFP retry. | ||
9518 | * | ||
9519 | * Give up after 10s (20 x 500ms). The overall timeout was empirically | ||
9520 | * arrived at from experience on a large cluster. | ||
9521 | */ | ||
9522 | #define MAX_QSFP_RETRIES 20 | ||
9523 | #define QSFP_RETRY_WAIT 500 /* msec */ | ||
9524 | |||
9525 | /* | ||
9526 | * Try a QSFP read. If it fails, schedule a retry for later. | ||
9527 | * Called on first link activation after driver load. | ||
9528 | */ | ||
9529 | static void try_start_link(struct hfi1_pportdata *ppd) | ||
9530 | { | ||
9531 | if (test_qsfp_read(ppd)) { | ||
9532 | /* read failed */ | ||
9533 | if (ppd->qsfp_retry_count >= MAX_QSFP_RETRIES) { | ||
9534 | dd_dev_err(ppd->dd, "QSFP not responding, giving up\n"); | ||
9535 | return; | ||
9536 | } | ||
9537 | dd_dev_info(ppd->dd, | ||
9538 | "QSFP not responding, waiting and retrying %d\n", | ||
9539 | (int)ppd->qsfp_retry_count); | ||
9540 | ppd->qsfp_retry_count++; | ||
9541 | queue_delayed_work(ppd->hfi1_wq, &ppd->start_link_work, | ||
9542 | msecs_to_jiffies(QSFP_RETRY_WAIT)); | ||
9543 | return; | ||
9544 | } | ||
9545 | ppd->qsfp_retry_count = 0; | ||
9546 | |||
9547 | /* | ||
9548 | * Tune the SerDes to a ballpark setting for optimal signal and bit | ||
9549 | * error rate. Needs to be done before starting the link. | ||
9550 | */ | ||
9551 | tune_serdes(ppd); | ||
9552 | start_link(ppd); | ||
9553 | } | ||
9554 | |||
9555 | /* | ||
9556 | * Workqueue function to start the link after a delay. | ||
9557 | */ | ||
9558 | void handle_start_link(struct work_struct *work) | ||
9559 | { | ||
9560 | struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata, | ||
9561 | start_link_work.work); | ||
9562 | try_start_link(ppd); | ||
9563 | } | ||
9564 | |||
9493 | int bringup_serdes(struct hfi1_pportdata *ppd) | 9565 | int bringup_serdes(struct hfi1_pportdata *ppd) |
9494 | { | 9566 | { |
9495 | struct hfi1_devdata *dd = ppd->dd; | 9567 | struct hfi1_devdata *dd = ppd->dd; |
@@ -9525,14 +9597,8 @@ int bringup_serdes(struct hfi1_pportdata *ppd) | |||
9525 | set_qsfp_int_n(ppd, 1); | 9597 | set_qsfp_int_n(ppd, 1); |
9526 | } | 9598 | } |
9527 | 9599 | ||
9528 | /* | 9600 | try_start_link(ppd); |
9529 | * Tune the SerDes to a ballpark setting for | 9601 | return 0; |
9530 | * optimal signal and bit error rate | ||
9531 | * Needs to be done before starting the link | ||
9532 | */ | ||
9533 | tune_serdes(ppd); | ||
9534 | |||
9535 | return start_link(ppd); | ||
9536 | } | 9602 | } |
9537 | 9603 | ||
9538 | void hfi1_quiet_serdes(struct hfi1_pportdata *ppd) | 9604 | void hfi1_quiet_serdes(struct hfi1_pportdata *ppd) |
@@ -9549,6 +9615,10 @@ void hfi1_quiet_serdes(struct hfi1_pportdata *ppd) | |||
9549 | ppd->driver_link_ready = 0; | 9615 | ppd->driver_link_ready = 0; |
9550 | ppd->link_enabled = 0; | 9616 | ppd->link_enabled = 0; |
9551 | 9617 | ||
9618 | ppd->qsfp_retry_count = MAX_QSFP_RETRIES; /* prevent more retries */ | ||
9619 | flush_delayed_work(&ppd->start_link_work); | ||
9620 | cancel_delayed_work_sync(&ppd->start_link_work); | ||
9621 | |||
9552 | ppd->offline_disabled_reason = | 9622 | ppd->offline_disabled_reason = |
9553 | HFI1_ODR_MASK(OPA_LINKDOWN_REASON_SMA_DISABLED); | 9623 | HFI1_ODR_MASK(OPA_LINKDOWN_REASON_SMA_DISABLED); |
9554 | set_link_down_reason(ppd, OPA_LINKDOWN_REASON_SMA_DISABLED, 0, | 9624 | set_link_down_reason(ppd, OPA_LINKDOWN_REASON_SMA_DISABLED, 0, |
@@ -12865,7 +12935,7 @@ fail: | |||
12865 | */ | 12935 | */ |
12866 | static int set_up_context_variables(struct hfi1_devdata *dd) | 12936 | static int set_up_context_variables(struct hfi1_devdata *dd) |
12867 | { | 12937 | { |
12868 | int num_kernel_contexts; | 12938 | unsigned long num_kernel_contexts; |
12869 | int total_contexts; | 12939 | int total_contexts; |
12870 | int ret; | 12940 | int ret; |
12871 | unsigned ngroups; | 12941 | unsigned ngroups; |
@@ -12894,9 +12964,9 @@ static int set_up_context_variables(struct hfi1_devdata *dd) | |||
12894 | */ | 12964 | */ |
12895 | if (num_kernel_contexts > (dd->chip_send_contexts - num_vls - 1)) { | 12965 | if (num_kernel_contexts > (dd->chip_send_contexts - num_vls - 1)) { |
12896 | dd_dev_err(dd, | 12966 | dd_dev_err(dd, |
12897 | "Reducing # kernel rcv contexts to: %d, from %d\n", | 12967 | "Reducing # kernel rcv contexts to: %d, from %lu\n", |
12898 | (int)(dd->chip_send_contexts - num_vls - 1), | 12968 | (int)(dd->chip_send_contexts - num_vls - 1), |
12899 | (int)num_kernel_contexts); | 12969 | num_kernel_contexts); |
12900 | num_kernel_contexts = dd->chip_send_contexts - num_vls - 1; | 12970 | num_kernel_contexts = dd->chip_send_contexts - num_vls - 1; |
12901 | } | 12971 | } |
12902 | /* | 12972 | /* |
diff --git a/drivers/infiniband/hw/hfi1/chip.h b/drivers/infiniband/hw/hfi1/chip.h index ed11107c50fe..e29573769efc 100644 --- a/drivers/infiniband/hw/hfi1/chip.h +++ b/drivers/infiniband/hw/hfi1/chip.h | |||
@@ -706,6 +706,7 @@ void handle_link_up(struct work_struct *work); | |||
706 | void handle_link_down(struct work_struct *work); | 706 | void handle_link_down(struct work_struct *work); |
707 | void handle_link_downgrade(struct work_struct *work); | 707 | void handle_link_downgrade(struct work_struct *work); |
708 | void handle_link_bounce(struct work_struct *work); | 708 | void handle_link_bounce(struct work_struct *work); |
709 | void handle_start_link(struct work_struct *work); | ||
709 | void handle_sma_message(struct work_struct *work); | 710 | void handle_sma_message(struct work_struct *work); |
710 | void reset_qsfp(struct hfi1_pportdata *ppd); | 711 | void reset_qsfp(struct hfi1_pportdata *ppd); |
711 | void qsfp_event(struct work_struct *work); | 712 | void qsfp_event(struct work_struct *work); |
diff --git a/drivers/infiniband/hw/hfi1/debugfs.c b/drivers/infiniband/hw/hfi1/debugfs.c index a49cc88f08a2..5e9be16f6cd3 100644 --- a/drivers/infiniband/hw/hfi1/debugfs.c +++ b/drivers/infiniband/hw/hfi1/debugfs.c | |||
@@ -59,6 +59,40 @@ | |||
59 | 59 | ||
60 | static struct dentry *hfi1_dbg_root; | 60 | static struct dentry *hfi1_dbg_root; |
61 | 61 | ||
62 | /* wrappers to enforce srcu in seq file */ | ||
63 | static ssize_t hfi1_seq_read( | ||
64 | struct file *file, | ||
65 | char __user *buf, | ||
66 | size_t size, | ||
67 | loff_t *ppos) | ||
68 | { | ||
69 | struct dentry *d = file->f_path.dentry; | ||
70 | int srcu_idx; | ||
71 | ssize_t r; | ||
72 | |||
73 | r = debugfs_use_file_start(d, &srcu_idx); | ||
74 | if (likely(!r)) | ||
75 | r = seq_read(file, buf, size, ppos); | ||
76 | debugfs_use_file_finish(srcu_idx); | ||
77 | return r; | ||
78 | } | ||
79 | |||
80 | static loff_t hfi1_seq_lseek( | ||
81 | struct file *file, | ||
82 | loff_t offset, | ||
83 | int whence) | ||
84 | { | ||
85 | struct dentry *d = file->f_path.dentry; | ||
86 | int srcu_idx; | ||
87 | loff_t r; | ||
88 | |||
89 | r = debugfs_use_file_start(d, &srcu_idx); | ||
90 | if (likely(!r)) | ||
91 | r = seq_lseek(file, offset, whence); | ||
92 | debugfs_use_file_finish(srcu_idx); | ||
93 | return r; | ||
94 | } | ||
95 | |||
62 | #define private2dd(file) (file_inode(file)->i_private) | 96 | #define private2dd(file) (file_inode(file)->i_private) |
63 | #define private2ppd(file) (file_inode(file)->i_private) | 97 | #define private2ppd(file) (file_inode(file)->i_private) |
64 | 98 | ||
@@ -87,8 +121,8 @@ static int _##name##_open(struct inode *inode, struct file *s) \ | |||
87 | static const struct file_operations _##name##_file_ops = { \ | 121 | static const struct file_operations _##name##_file_ops = { \ |
88 | .owner = THIS_MODULE, \ | 122 | .owner = THIS_MODULE, \ |
89 | .open = _##name##_open, \ | 123 | .open = _##name##_open, \ |
90 | .read = seq_read, \ | 124 | .read = hfi1_seq_read, \ |
91 | .llseek = seq_lseek, \ | 125 | .llseek = hfi1_seq_lseek, \ |
92 | .release = seq_release \ | 126 | .release = seq_release \ |
93 | } | 127 | } |
94 | 128 | ||
@@ -105,11 +139,9 @@ do { \ | |||
105 | DEBUGFS_FILE_CREATE(#name, parent, data, &_##name##_file_ops, S_IRUGO) | 139 | DEBUGFS_FILE_CREATE(#name, parent, data, &_##name##_file_ops, S_IRUGO) |
106 | 140 | ||
107 | static void *_opcode_stats_seq_start(struct seq_file *s, loff_t *pos) | 141 | static void *_opcode_stats_seq_start(struct seq_file *s, loff_t *pos) |
108 | __acquires(RCU) | ||
109 | { | 142 | { |
110 | struct hfi1_opcode_stats_perctx *opstats; | 143 | struct hfi1_opcode_stats_perctx *opstats; |
111 | 144 | ||
112 | rcu_read_lock(); | ||
113 | if (*pos >= ARRAY_SIZE(opstats->stats)) | 145 | if (*pos >= ARRAY_SIZE(opstats->stats)) |
114 | return NULL; | 146 | return NULL; |
115 | return pos; | 147 | return pos; |
@@ -126,9 +158,7 @@ static void *_opcode_stats_seq_next(struct seq_file *s, void *v, loff_t *pos) | |||
126 | } | 158 | } |
127 | 159 | ||
128 | static void _opcode_stats_seq_stop(struct seq_file *s, void *v) | 160 | static void _opcode_stats_seq_stop(struct seq_file *s, void *v) |
129 | __releases(RCU) | ||
130 | { | 161 | { |
131 | rcu_read_unlock(); | ||
132 | } | 162 | } |
133 | 163 | ||
134 | static int _opcode_stats_seq_show(struct seq_file *s, void *v) | 164 | static int _opcode_stats_seq_show(struct seq_file *s, void *v) |
@@ -285,12 +315,10 @@ DEBUGFS_SEQ_FILE_OPEN(qp_stats) | |||
285 | DEBUGFS_FILE_OPS(qp_stats); | 315 | DEBUGFS_FILE_OPS(qp_stats); |
286 | 316 | ||
287 | static void *_sdes_seq_start(struct seq_file *s, loff_t *pos) | 317 | static void *_sdes_seq_start(struct seq_file *s, loff_t *pos) |
288 | __acquires(RCU) | ||
289 | { | 318 | { |
290 | struct hfi1_ibdev *ibd; | 319 | struct hfi1_ibdev *ibd; |
291 | struct hfi1_devdata *dd; | 320 | struct hfi1_devdata *dd; |
292 | 321 | ||
293 | rcu_read_lock(); | ||
294 | ibd = (struct hfi1_ibdev *)s->private; | 322 | ibd = (struct hfi1_ibdev *)s->private; |
295 | dd = dd_from_dev(ibd); | 323 | dd = dd_from_dev(ibd); |
296 | if (!dd->per_sdma || *pos >= dd->num_sdma) | 324 | if (!dd->per_sdma || *pos >= dd->num_sdma) |
@@ -310,9 +338,7 @@ static void *_sdes_seq_next(struct seq_file *s, void *v, loff_t *pos) | |||
310 | } | 338 | } |
311 | 339 | ||
312 | static void _sdes_seq_stop(struct seq_file *s, void *v) | 340 | static void _sdes_seq_stop(struct seq_file *s, void *v) |
313 | __releases(RCU) | ||
314 | { | 341 | { |
315 | rcu_read_unlock(); | ||
316 | } | 342 | } |
317 | 343 | ||
318 | static int _sdes_seq_show(struct seq_file *s, void *v) | 344 | static int _sdes_seq_show(struct seq_file *s, void *v) |
@@ -339,11 +365,9 @@ static ssize_t dev_counters_read(struct file *file, char __user *buf, | |||
339 | struct hfi1_devdata *dd; | 365 | struct hfi1_devdata *dd; |
340 | ssize_t rval; | 366 | ssize_t rval; |
341 | 367 | ||
342 | rcu_read_lock(); | ||
343 | dd = private2dd(file); | 368 | dd = private2dd(file); |
344 | avail = hfi1_read_cntrs(dd, NULL, &counters); | 369 | avail = hfi1_read_cntrs(dd, NULL, &counters); |
345 | rval = simple_read_from_buffer(buf, count, ppos, counters, avail); | 370 | rval = simple_read_from_buffer(buf, count, ppos, counters, avail); |
346 | rcu_read_unlock(); | ||
347 | return rval; | 371 | return rval; |
348 | } | 372 | } |
349 | 373 | ||
@@ -356,11 +380,9 @@ static ssize_t dev_names_read(struct file *file, char __user *buf, | |||
356 | struct hfi1_devdata *dd; | 380 | struct hfi1_devdata *dd; |
357 | ssize_t rval; | 381 | ssize_t rval; |
358 | 382 | ||
359 | rcu_read_lock(); | ||
360 | dd = private2dd(file); | 383 | dd = private2dd(file); |
361 | avail = hfi1_read_cntrs(dd, &names, NULL); | 384 | avail = hfi1_read_cntrs(dd, &names, NULL); |
362 | rval = simple_read_from_buffer(buf, count, ppos, names, avail); | 385 | rval = simple_read_from_buffer(buf, count, ppos, names, avail); |
363 | rcu_read_unlock(); | ||
364 | return rval; | 386 | return rval; |
365 | } | 387 | } |
366 | 388 | ||
@@ -383,11 +405,9 @@ static ssize_t portnames_read(struct file *file, char __user *buf, | |||
383 | struct hfi1_devdata *dd; | 405 | struct hfi1_devdata *dd; |
384 | ssize_t rval; | 406 | ssize_t rval; |
385 | 407 | ||
386 | rcu_read_lock(); | ||
387 | dd = private2dd(file); | 408 | dd = private2dd(file); |
388 | avail = hfi1_read_portcntrs(dd->pport, &names, NULL); | 409 | avail = hfi1_read_portcntrs(dd->pport, &names, NULL); |
389 | rval = simple_read_from_buffer(buf, count, ppos, names, avail); | 410 | rval = simple_read_from_buffer(buf, count, ppos, names, avail); |
390 | rcu_read_unlock(); | ||
391 | return rval; | 411 | return rval; |
392 | } | 412 | } |
393 | 413 | ||
@@ -400,11 +420,9 @@ static ssize_t portcntrs_debugfs_read(struct file *file, char __user *buf, | |||
400 | struct hfi1_pportdata *ppd; | 420 | struct hfi1_pportdata *ppd; |
401 | ssize_t rval; | 421 | ssize_t rval; |
402 | 422 | ||
403 | rcu_read_lock(); | ||
404 | ppd = private2ppd(file); | 423 | ppd = private2ppd(file); |
405 | avail = hfi1_read_portcntrs(ppd, NULL, &counters); | 424 | avail = hfi1_read_portcntrs(ppd, NULL, &counters); |
406 | rval = simple_read_from_buffer(buf, count, ppos, counters, avail); | 425 | rval = simple_read_from_buffer(buf, count, ppos, counters, avail); |
407 | rcu_read_unlock(); | ||
408 | return rval; | 426 | return rval; |
409 | } | 427 | } |
410 | 428 | ||
@@ -434,16 +452,13 @@ static ssize_t asic_flags_read(struct file *file, char __user *buf, | |||
434 | int used; | 452 | int used; |
435 | int i; | 453 | int i; |
436 | 454 | ||
437 | rcu_read_lock(); | ||
438 | ppd = private2ppd(file); | 455 | ppd = private2ppd(file); |
439 | dd = ppd->dd; | 456 | dd = ppd->dd; |
440 | size = PAGE_SIZE; | 457 | size = PAGE_SIZE; |
441 | used = 0; | 458 | used = 0; |
442 | tmp = kmalloc(size, GFP_KERNEL); | 459 | tmp = kmalloc(size, GFP_KERNEL); |
443 | if (!tmp) { | 460 | if (!tmp) |
444 | rcu_read_unlock(); | ||
445 | return -ENOMEM; | 461 | return -ENOMEM; |
446 | } | ||
447 | 462 | ||
448 | scratch0 = read_csr(dd, ASIC_CFG_SCRATCH); | 463 | scratch0 = read_csr(dd, ASIC_CFG_SCRATCH); |
449 | used += scnprintf(tmp + used, size - used, | 464 | used += scnprintf(tmp + used, size - used, |
@@ -470,7 +485,6 @@ static ssize_t asic_flags_read(struct file *file, char __user *buf, | |||
470 | used += scnprintf(tmp + used, size - used, "Write bits to clear\n"); | 485 | used += scnprintf(tmp + used, size - used, "Write bits to clear\n"); |
471 | 486 | ||
472 | ret = simple_read_from_buffer(buf, count, ppos, tmp, used); | 487 | ret = simple_read_from_buffer(buf, count, ppos, tmp, used); |
473 | rcu_read_unlock(); | ||
474 | kfree(tmp); | 488 | kfree(tmp); |
475 | return ret; | 489 | return ret; |
476 | } | 490 | } |
@@ -486,15 +500,12 @@ static ssize_t asic_flags_write(struct file *file, const char __user *buf, | |||
486 | u64 scratch0; | 500 | u64 scratch0; |
487 | u64 clear; | 501 | u64 clear; |
488 | 502 | ||
489 | rcu_read_lock(); | ||
490 | ppd = private2ppd(file); | 503 | ppd = private2ppd(file); |
491 | dd = ppd->dd; | 504 | dd = ppd->dd; |
492 | 505 | ||
493 | buff = kmalloc(count + 1, GFP_KERNEL); | 506 | buff = kmalloc(count + 1, GFP_KERNEL); |
494 | if (!buff) { | 507 | if (!buff) |
495 | ret = -ENOMEM; | 508 | return -ENOMEM; |
496 | goto do_return; | ||
497 | } | ||
498 | 509 | ||
499 | ret = copy_from_user(buff, buf, count); | 510 | ret = copy_from_user(buff, buf, count); |
500 | if (ret > 0) { | 511 | if (ret > 0) { |
@@ -527,8 +538,6 @@ static ssize_t asic_flags_write(struct file *file, const char __user *buf, | |||
527 | 538 | ||
528 | do_free: | 539 | do_free: |
529 | kfree(buff); | 540 | kfree(buff); |
530 | do_return: | ||
531 | rcu_read_unlock(); | ||
532 | return ret; | 541 | return ret; |
533 | } | 542 | } |
534 | 543 | ||
@@ -542,18 +551,14 @@ static ssize_t qsfp_debugfs_dump(struct file *file, char __user *buf, | |||
542 | char *tmp; | 551 | char *tmp; |
543 | int ret; | 552 | int ret; |
544 | 553 | ||
545 | rcu_read_lock(); | ||
546 | ppd = private2ppd(file); | 554 | ppd = private2ppd(file); |
547 | tmp = kmalloc(PAGE_SIZE, GFP_KERNEL); | 555 | tmp = kmalloc(PAGE_SIZE, GFP_KERNEL); |
548 | if (!tmp) { | 556 | if (!tmp) |
549 | rcu_read_unlock(); | ||
550 | return -ENOMEM; | 557 | return -ENOMEM; |
551 | } | ||
552 | 558 | ||
553 | ret = qsfp_dump(ppd, tmp, PAGE_SIZE); | 559 | ret = qsfp_dump(ppd, tmp, PAGE_SIZE); |
554 | if (ret > 0) | 560 | if (ret > 0) |
555 | ret = simple_read_from_buffer(buf, count, ppos, tmp, ret); | 561 | ret = simple_read_from_buffer(buf, count, ppos, tmp, ret); |
556 | rcu_read_unlock(); | ||
557 | kfree(tmp); | 562 | kfree(tmp); |
558 | return ret; | 563 | return ret; |
559 | } | 564 | } |
@@ -569,7 +574,6 @@ static ssize_t __i2c_debugfs_write(struct file *file, const char __user *buf, | |||
569 | int offset; | 574 | int offset; |
570 | int total_written; | 575 | int total_written; |
571 | 576 | ||
572 | rcu_read_lock(); | ||
573 | ppd = private2ppd(file); | 577 | ppd = private2ppd(file); |
574 | 578 | ||
575 | /* byte offset format: [offsetSize][i2cAddr][offsetHigh][offsetLow] */ | 579 | /* byte offset format: [offsetSize][i2cAddr][offsetHigh][offsetLow] */ |
@@ -577,16 +581,12 @@ static ssize_t __i2c_debugfs_write(struct file *file, const char __user *buf, | |||
577 | offset = *ppos & 0xffff; | 581 | offset = *ppos & 0xffff; |
578 | 582 | ||
579 | /* explicitly reject invalid address 0 to catch cp and cat */ | 583 | /* explicitly reject invalid address 0 to catch cp and cat */ |
580 | if (i2c_addr == 0) { | 584 | if (i2c_addr == 0) |
581 | ret = -EINVAL; | 585 | return -EINVAL; |
582 | goto _return; | ||
583 | } | ||
584 | 586 | ||
585 | buff = kmalloc(count, GFP_KERNEL); | 587 | buff = kmalloc(count, GFP_KERNEL); |
586 | if (!buff) { | 588 | if (!buff) |
587 | ret = -ENOMEM; | 589 | return -ENOMEM; |
588 | goto _return; | ||
589 | } | ||
590 | 590 | ||
591 | ret = copy_from_user(buff, buf, count); | 591 | ret = copy_from_user(buff, buf, count); |
592 | if (ret > 0) { | 592 | if (ret > 0) { |
@@ -606,8 +606,6 @@ static ssize_t __i2c_debugfs_write(struct file *file, const char __user *buf, | |||
606 | 606 | ||
607 | _free: | 607 | _free: |
608 | kfree(buff); | 608 | kfree(buff); |
609 | _return: | ||
610 | rcu_read_unlock(); | ||
611 | return ret; | 609 | return ret; |
612 | } | 610 | } |
613 | 611 | ||
@@ -636,7 +634,6 @@ static ssize_t __i2c_debugfs_read(struct file *file, char __user *buf, | |||
636 | int offset; | 634 | int offset; |
637 | int total_read; | 635 | int total_read; |
638 | 636 | ||
639 | rcu_read_lock(); | ||
640 | ppd = private2ppd(file); | 637 | ppd = private2ppd(file); |
641 | 638 | ||
642 | /* byte offset format: [offsetSize][i2cAddr][offsetHigh][offsetLow] */ | 639 | /* byte offset format: [offsetSize][i2cAddr][offsetHigh][offsetLow] */ |
@@ -644,16 +641,12 @@ static ssize_t __i2c_debugfs_read(struct file *file, char __user *buf, | |||
644 | offset = *ppos & 0xffff; | 641 | offset = *ppos & 0xffff; |
645 | 642 | ||
646 | /* explicitly reject invalid address 0 to catch cp and cat */ | 643 | /* explicitly reject invalid address 0 to catch cp and cat */ |
647 | if (i2c_addr == 0) { | 644 | if (i2c_addr == 0) |
648 | ret = -EINVAL; | 645 | return -EINVAL; |
649 | goto _return; | ||
650 | } | ||
651 | 646 | ||
652 | buff = kmalloc(count, GFP_KERNEL); | 647 | buff = kmalloc(count, GFP_KERNEL); |
653 | if (!buff) { | 648 | if (!buff) |
654 | ret = -ENOMEM; | 649 | return -ENOMEM; |
655 | goto _return; | ||
656 | } | ||
657 | 650 | ||
658 | total_read = i2c_read(ppd, target, i2c_addr, offset, buff, count); | 651 | total_read = i2c_read(ppd, target, i2c_addr, offset, buff, count); |
659 | if (total_read < 0) { | 652 | if (total_read < 0) { |
@@ -673,8 +666,6 @@ static ssize_t __i2c_debugfs_read(struct file *file, char __user *buf, | |||
673 | 666 | ||
674 | _free: | 667 | _free: |
675 | kfree(buff); | 668 | kfree(buff); |
676 | _return: | ||
677 | rcu_read_unlock(); | ||
678 | return ret; | 669 | return ret; |
679 | } | 670 | } |
680 | 671 | ||
@@ -701,26 +692,20 @@ static ssize_t __qsfp_debugfs_write(struct file *file, const char __user *buf, | |||
701 | int ret; | 692 | int ret; |
702 | int total_written; | 693 | int total_written; |
703 | 694 | ||
704 | rcu_read_lock(); | 695 | if (*ppos + count > QSFP_PAGESIZE * 4) /* base page + page00-page03 */ |
705 | if (*ppos + count > QSFP_PAGESIZE * 4) { /* base page + page00-page03 */ | 696 | return -EINVAL; |
706 | ret = -EINVAL; | ||
707 | goto _return; | ||
708 | } | ||
709 | 697 | ||
710 | ppd = private2ppd(file); | 698 | ppd = private2ppd(file); |
711 | 699 | ||
712 | buff = kmalloc(count, GFP_KERNEL); | 700 | buff = kmalloc(count, GFP_KERNEL); |
713 | if (!buff) { | 701 | if (!buff) |
714 | ret = -ENOMEM; | 702 | return -ENOMEM; |
715 | goto _return; | ||
716 | } | ||
717 | 703 | ||
718 | ret = copy_from_user(buff, buf, count); | 704 | ret = copy_from_user(buff, buf, count); |
719 | if (ret > 0) { | 705 | if (ret > 0) { |
720 | ret = -EFAULT; | 706 | ret = -EFAULT; |
721 | goto _free; | 707 | goto _free; |
722 | } | 708 | } |
723 | |||
724 | total_written = qsfp_write(ppd, target, *ppos, buff, count); | 709 | total_written = qsfp_write(ppd, target, *ppos, buff, count); |
725 | if (total_written < 0) { | 710 | if (total_written < 0) { |
726 | ret = total_written; | 711 | ret = total_written; |
@@ -733,8 +718,6 @@ static ssize_t __qsfp_debugfs_write(struct file *file, const char __user *buf, | |||
733 | 718 | ||
734 | _free: | 719 | _free: |
735 | kfree(buff); | 720 | kfree(buff); |
736 | _return: | ||
737 | rcu_read_unlock(); | ||
738 | return ret; | 721 | return ret; |
739 | } | 722 | } |
740 | 723 | ||
@@ -761,7 +744,6 @@ static ssize_t __qsfp_debugfs_read(struct file *file, char __user *buf, | |||
761 | int ret; | 744 | int ret; |
762 | int total_read; | 745 | int total_read; |
763 | 746 | ||
764 | rcu_read_lock(); | ||
765 | if (*ppos + count > QSFP_PAGESIZE * 4) { /* base page + page00-page03 */ | 747 | if (*ppos + count > QSFP_PAGESIZE * 4) { /* base page + page00-page03 */ |
766 | ret = -EINVAL; | 748 | ret = -EINVAL; |
767 | goto _return; | 749 | goto _return; |
@@ -794,7 +776,6 @@ static ssize_t __qsfp_debugfs_read(struct file *file, char __user *buf, | |||
794 | _free: | 776 | _free: |
795 | kfree(buff); | 777 | kfree(buff); |
796 | _return: | 778 | _return: |
797 | rcu_read_unlock(); | ||
798 | return ret; | 779 | return ret; |
799 | } | 780 | } |
800 | 781 | ||
@@ -1010,7 +991,6 @@ void hfi1_dbg_ibdev_exit(struct hfi1_ibdev *ibd) | |||
1010 | debugfs_remove_recursive(ibd->hfi1_ibdev_dbg); | 991 | debugfs_remove_recursive(ibd->hfi1_ibdev_dbg); |
1011 | out: | 992 | out: |
1012 | ibd->hfi1_ibdev_dbg = NULL; | 993 | ibd->hfi1_ibdev_dbg = NULL; |
1013 | synchronize_rcu(); | ||
1014 | } | 994 | } |
1015 | 995 | ||
1016 | /* | 996 | /* |
@@ -1035,9 +1015,7 @@ static const char * const hfi1_statnames[] = { | |||
1035 | }; | 1015 | }; |
1036 | 1016 | ||
1037 | static void *_driver_stats_names_seq_start(struct seq_file *s, loff_t *pos) | 1017 | static void *_driver_stats_names_seq_start(struct seq_file *s, loff_t *pos) |
1038 | __acquires(RCU) | ||
1039 | { | 1018 | { |
1040 | rcu_read_lock(); | ||
1041 | if (*pos >= ARRAY_SIZE(hfi1_statnames)) | 1019 | if (*pos >= ARRAY_SIZE(hfi1_statnames)) |
1042 | return NULL; | 1020 | return NULL; |
1043 | return pos; | 1021 | return pos; |
@@ -1055,9 +1033,7 @@ static void *_driver_stats_names_seq_next( | |||
1055 | } | 1033 | } |
1056 | 1034 | ||
1057 | static void _driver_stats_names_seq_stop(struct seq_file *s, void *v) | 1035 | static void _driver_stats_names_seq_stop(struct seq_file *s, void *v) |
1058 | __releases(RCU) | ||
1059 | { | 1036 | { |
1060 | rcu_read_unlock(); | ||
1061 | } | 1037 | } |
1062 | 1038 | ||
1063 | static int _driver_stats_names_seq_show(struct seq_file *s, void *v) | 1039 | static int _driver_stats_names_seq_show(struct seq_file *s, void *v) |
@@ -1073,9 +1049,7 @@ DEBUGFS_SEQ_FILE_OPEN(driver_stats_names) | |||
1073 | DEBUGFS_FILE_OPS(driver_stats_names); | 1049 | DEBUGFS_FILE_OPS(driver_stats_names); |
1074 | 1050 | ||
1075 | static void *_driver_stats_seq_start(struct seq_file *s, loff_t *pos) | 1051 | static void *_driver_stats_seq_start(struct seq_file *s, loff_t *pos) |
1076 | __acquires(RCU) | ||
1077 | { | 1052 | { |
1078 | rcu_read_lock(); | ||
1079 | if (*pos >= ARRAY_SIZE(hfi1_statnames)) | 1053 | if (*pos >= ARRAY_SIZE(hfi1_statnames)) |
1080 | return NULL; | 1054 | return NULL; |
1081 | return pos; | 1055 | return pos; |
@@ -1090,9 +1064,7 @@ static void *_driver_stats_seq_next(struct seq_file *s, void *v, loff_t *pos) | |||
1090 | } | 1064 | } |
1091 | 1065 | ||
1092 | static void _driver_stats_seq_stop(struct seq_file *s, void *v) | 1066 | static void _driver_stats_seq_stop(struct seq_file *s, void *v) |
1093 | __releases(RCU) | ||
1094 | { | 1067 | { |
1095 | rcu_read_unlock(); | ||
1096 | } | 1068 | } |
1097 | 1069 | ||
1098 | static u64 hfi1_sps_ints(void) | 1070 | static u64 hfi1_sps_ints(void) |
diff --git a/drivers/infiniband/hw/hfi1/hfi.h b/drivers/infiniband/hw/hfi1/hfi.h index a021e660d482..325ec211370f 100644 --- a/drivers/infiniband/hw/hfi1/hfi.h +++ b/drivers/infiniband/hw/hfi1/hfi.h | |||
@@ -605,6 +605,7 @@ struct hfi1_pportdata { | |||
605 | struct work_struct freeze_work; | 605 | struct work_struct freeze_work; |
606 | struct work_struct link_downgrade_work; | 606 | struct work_struct link_downgrade_work; |
607 | struct work_struct link_bounce_work; | 607 | struct work_struct link_bounce_work; |
608 | struct delayed_work start_link_work; | ||
608 | /* host link state variables */ | 609 | /* host link state variables */ |
609 | struct mutex hls_lock; | 610 | struct mutex hls_lock; |
610 | u32 host_link_state; | 611 | u32 host_link_state; |
@@ -659,6 +660,7 @@ struct hfi1_pportdata { | |||
659 | u8 linkinit_reason; | 660 | u8 linkinit_reason; |
660 | u8 local_tx_rate; /* rate given to 8051 firmware */ | 661 | u8 local_tx_rate; /* rate given to 8051 firmware */ |
661 | u8 last_pstate; /* info only */ | 662 | u8 last_pstate; /* info only */ |
663 | u8 qsfp_retry_count; | ||
662 | 664 | ||
663 | /* placeholders for IB MAD packet settings */ | 665 | /* placeholders for IB MAD packet settings */ |
664 | u8 overrun_threshold; | 666 | u8 overrun_threshold; |
@@ -1804,7 +1806,7 @@ extern unsigned int hfi1_max_mtu; | |||
1804 | extern unsigned int hfi1_cu; | 1806 | extern unsigned int hfi1_cu; |
1805 | extern unsigned int user_credit_return_threshold; | 1807 | extern unsigned int user_credit_return_threshold; |
1806 | extern int num_user_contexts; | 1808 | extern int num_user_contexts; |
1807 | extern unsigned n_krcvqs; | 1809 | extern unsigned long n_krcvqs; |
1808 | extern uint krcvqs[]; | 1810 | extern uint krcvqs[]; |
1809 | extern int krcvqsset; | 1811 | extern int krcvqsset; |
1810 | extern uint kdeth_qp; | 1812 | extern uint kdeth_qp; |
diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c index b7935451093c..384b43d2fd49 100644 --- a/drivers/infiniband/hw/hfi1/init.c +++ b/drivers/infiniband/hw/hfi1/init.c | |||
@@ -94,7 +94,7 @@ module_param_array(krcvqs, uint, &krcvqsset, S_IRUGO); | |||
94 | MODULE_PARM_DESC(krcvqs, "Array of the number of non-control kernel receive queues by VL"); | 94 | MODULE_PARM_DESC(krcvqs, "Array of the number of non-control kernel receive queues by VL"); |
95 | 95 | ||
96 | /* computed based on above array */ | 96 | /* computed based on above array */ |
97 | unsigned n_krcvqs; | 97 | unsigned long n_krcvqs; |
98 | 98 | ||
99 | static unsigned hfi1_rcvarr_split = 25; | 99 | static unsigned hfi1_rcvarr_split = 25; |
100 | module_param_named(rcvarr_split, hfi1_rcvarr_split, uint, S_IRUGO); | 100 | module_param_named(rcvarr_split, hfi1_rcvarr_split, uint, S_IRUGO); |
@@ -500,6 +500,7 @@ void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd, | |||
500 | INIT_WORK(&ppd->link_downgrade_work, handle_link_downgrade); | 500 | INIT_WORK(&ppd->link_downgrade_work, handle_link_downgrade); |
501 | INIT_WORK(&ppd->sma_message_work, handle_sma_message); | 501 | INIT_WORK(&ppd->sma_message_work, handle_sma_message); |
502 | INIT_WORK(&ppd->link_bounce_work, handle_link_bounce); | 502 | INIT_WORK(&ppd->link_bounce_work, handle_link_bounce); |
503 | INIT_DELAYED_WORK(&ppd->start_link_work, handle_start_link); | ||
503 | INIT_WORK(&ppd->linkstate_active_work, receive_interrupt_work); | 504 | INIT_WORK(&ppd->linkstate_active_work, receive_interrupt_work); |
504 | INIT_WORK(&ppd->qsfp_info.qsfp_work, qsfp_event); | 505 | INIT_WORK(&ppd->qsfp_info.qsfp_work, qsfp_event); |
505 | 506 | ||
diff --git a/drivers/infiniband/hw/hfi1/mad.c b/drivers/infiniband/hw/hfi1/mad.c index 39e42c373a01..7ffc14f21523 100644 --- a/drivers/infiniband/hw/hfi1/mad.c +++ b/drivers/infiniband/hw/hfi1/mad.c | |||
@@ -2604,7 +2604,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp, | |||
2604 | u8 lq, num_vls; | 2604 | u8 lq, num_vls; |
2605 | u8 res_lli, res_ler; | 2605 | u8 res_lli, res_ler; |
2606 | u64 port_mask; | 2606 | u64 port_mask; |
2607 | unsigned long port_num; | 2607 | u8 port_num; |
2608 | unsigned long vl; | 2608 | unsigned long vl; |
2609 | u32 vl_select_mask; | 2609 | u32 vl_select_mask; |
2610 | int vfi; | 2610 | int vfi; |
@@ -2638,9 +2638,9 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp, | |||
2638 | */ | 2638 | */ |
2639 | port_mask = be64_to_cpu(req->port_select_mask[3]); | 2639 | port_mask = be64_to_cpu(req->port_select_mask[3]); |
2640 | port_num = find_first_bit((unsigned long *)&port_mask, | 2640 | port_num = find_first_bit((unsigned long *)&port_mask, |
2641 | sizeof(port_mask)); | 2641 | sizeof(port_mask) * 8); |
2642 | 2642 | ||
2643 | if ((u8)port_num != port) { | 2643 | if (port_num != port) { |
2644 | pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; | 2644 | pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; |
2645 | return reply((struct ib_mad_hdr *)pmp); | 2645 | return reply((struct ib_mad_hdr *)pmp); |
2646 | } | 2646 | } |
@@ -2842,7 +2842,7 @@ static int pma_get_opa_porterrors(struct opa_pma_mad *pmp, | |||
2842 | */ | 2842 | */ |
2843 | port_mask = be64_to_cpu(req->port_select_mask[3]); | 2843 | port_mask = be64_to_cpu(req->port_select_mask[3]); |
2844 | port_num = find_first_bit((unsigned long *)&port_mask, | 2844 | port_num = find_first_bit((unsigned long *)&port_mask, |
2845 | sizeof(port_mask)); | 2845 | sizeof(port_mask) * 8); |
2846 | 2846 | ||
2847 | if (port_num != port) { | 2847 | if (port_num != port) { |
2848 | pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; | 2848 | pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; |
@@ -3015,7 +3015,7 @@ static int pma_get_opa_errorinfo(struct opa_pma_mad *pmp, | |||
3015 | */ | 3015 | */ |
3016 | port_mask = be64_to_cpu(req->port_select_mask[3]); | 3016 | port_mask = be64_to_cpu(req->port_select_mask[3]); |
3017 | port_num = find_first_bit((unsigned long *)&port_mask, | 3017 | port_num = find_first_bit((unsigned long *)&port_mask, |
3018 | sizeof(port_mask)); | 3018 | sizeof(port_mask) * 8); |
3019 | 3019 | ||
3020 | if (port_num != port) { | 3020 | if (port_num != port) { |
3021 | pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; | 3021 | pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; |
@@ -3252,7 +3252,7 @@ static int pma_set_opa_errorinfo(struct opa_pma_mad *pmp, | |||
3252 | */ | 3252 | */ |
3253 | port_mask = be64_to_cpu(req->port_select_mask[3]); | 3253 | port_mask = be64_to_cpu(req->port_select_mask[3]); |
3254 | port_num = find_first_bit((unsigned long *)&port_mask, | 3254 | port_num = find_first_bit((unsigned long *)&port_mask, |
3255 | sizeof(port_mask)); | 3255 | sizeof(port_mask) * 8); |
3256 | 3256 | ||
3257 | if (port_num != port) { | 3257 | if (port_num != port) { |
3258 | pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; | 3258 | pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; |
diff --git a/drivers/infiniband/hw/hfi1/pio_copy.c b/drivers/infiniband/hw/hfi1/pio_copy.c index 8c25e1b58849..3a1ef3056282 100644 --- a/drivers/infiniband/hw/hfi1/pio_copy.c +++ b/drivers/infiniband/hw/hfi1/pio_copy.c | |||
@@ -771,6 +771,9 @@ void seg_pio_copy_mid(struct pio_buf *pbuf, const void *from, size_t nbytes) | |||
771 | read_extra_bytes(pbuf, from, to_fill); | 771 | read_extra_bytes(pbuf, from, to_fill); |
772 | from += to_fill; | 772 | from += to_fill; |
773 | nbytes -= to_fill; | 773 | nbytes -= to_fill; |
774 | /* may not be enough valid bytes left to align */ | ||
775 | if (extra > nbytes) | ||
776 | extra = nbytes; | ||
774 | 777 | ||
775 | /* ...now write carry */ | 778 | /* ...now write carry */ |
776 | dest = pbuf->start + (pbuf->qw_written * sizeof(u64)); | 779 | dest = pbuf->start + (pbuf->qw_written * sizeof(u64)); |
@@ -798,6 +801,15 @@ void seg_pio_copy_mid(struct pio_buf *pbuf, const void *from, size_t nbytes) | |||
798 | read_low_bytes(pbuf, from, extra); | 801 | read_low_bytes(pbuf, from, extra); |
799 | from += extra; | 802 | from += extra; |
800 | nbytes -= extra; | 803 | nbytes -= extra; |
804 | /* | ||
805 | * If no bytes are left, return early - we are done. | ||
806 | * NOTE: This short-circuit is *required* because | ||
807 | * "extra" may have been reduced in size and "from" | ||
808 | * is not aligned, as required when leaving this | ||
809 | * if block. | ||
810 | */ | ||
811 | if (nbytes == 0) | ||
812 | return; | ||
801 | } | 813 | } |
802 | 814 | ||
803 | /* at this point, from is QW aligned */ | 815 | /* at this point, from is QW aligned */ |
diff --git a/drivers/infiniband/hw/hfi1/user_sdma.c b/drivers/infiniband/hw/hfi1/user_sdma.c index 0ecf27903dc2..1694037d1eee 100644 --- a/drivers/infiniband/hw/hfi1/user_sdma.c +++ b/drivers/infiniband/hw/hfi1/user_sdma.c | |||
@@ -114,6 +114,8 @@ MODULE_PARM_DESC(sdma_comp_size, "Size of User SDMA completion ring. Default: 12 | |||
114 | #define KDETH_HCRC_LOWER_SHIFT 24 | 114 | #define KDETH_HCRC_LOWER_SHIFT 24 |
115 | #define KDETH_HCRC_LOWER_MASK 0xff | 115 | #define KDETH_HCRC_LOWER_MASK 0xff |
116 | 116 | ||
117 | #define AHG_KDETH_INTR_SHIFT 12 | ||
118 | |||
117 | #define PBC2LRH(x) ((((x) & 0xfff) << 2) - 4) | 119 | #define PBC2LRH(x) ((((x) & 0xfff) << 2) - 4) |
118 | #define LRH2PBC(x) ((((x) >> 2) + 1) & 0xfff) | 120 | #define LRH2PBC(x) ((((x) >> 2) + 1) & 0xfff) |
119 | 121 | ||
@@ -1480,7 +1482,8 @@ static int set_txreq_header_ahg(struct user_sdma_request *req, | |||
1480 | /* Clear KDETH.SH on last packet */ | 1482 | /* Clear KDETH.SH on last packet */ |
1481 | if (unlikely(tx->flags & TXREQ_FLAGS_REQ_LAST_PKT)) { | 1483 | if (unlikely(tx->flags & TXREQ_FLAGS_REQ_LAST_PKT)) { |
1482 | val |= cpu_to_le16(KDETH_GET(hdr->kdeth.ver_tid_offset, | 1484 | val |= cpu_to_le16(KDETH_GET(hdr->kdeth.ver_tid_offset, |
1483 | INTR) >> 16); | 1485 | INTR) << |
1486 | AHG_KDETH_INTR_SHIFT); | ||
1484 | val &= cpu_to_le16(~(1U << 13)); | 1487 | val &= cpu_to_le16(~(1U << 13)); |
1485 | AHG_HEADER_SET(req->ahg, diff, 7, 16, 14, val); | 1488 | AHG_HEADER_SET(req->ahg, diff, 7, 16, 14, val); |
1486 | } else { | 1489 | } else { |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_hw.c b/drivers/infiniband/hw/i40iw/i40iw_hw.c index 3ee0cad96bc6..0c92a40b3e86 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_hw.c +++ b/drivers/infiniband/hw/i40iw/i40iw_hw.c | |||
@@ -265,6 +265,7 @@ void i40iw_next_iw_state(struct i40iw_qp *iwqp, | |||
265 | info.dont_send_fin = false; | 265 | info.dont_send_fin = false; |
266 | if (iwqp->sc_qp.term_flags && (state == I40IW_QP_STATE_ERROR)) | 266 | if (iwqp->sc_qp.term_flags && (state == I40IW_QP_STATE_ERROR)) |
267 | info.reset_tcp_conn = true; | 267 | info.reset_tcp_conn = true; |
268 | iwqp->hw_iwarp_state = state; | ||
268 | i40iw_hw_modify_qp(iwqp->iwdev, iwqp, &info, 0); | 269 | i40iw_hw_modify_qp(iwqp->iwdev, iwqp, &info, 0); |
269 | } | 270 | } |
270 | 271 | ||
diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c index 0cbbe4038298..445e230d5ff8 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_main.c +++ b/drivers/infiniband/hw/i40iw/i40iw_main.c | |||
@@ -100,7 +100,7 @@ static struct notifier_block i40iw_net_notifier = { | |||
100 | .notifier_call = i40iw_net_event | 100 | .notifier_call = i40iw_net_event |
101 | }; | 101 | }; |
102 | 102 | ||
103 | static int i40iw_notifiers_registered; | 103 | static atomic_t i40iw_notifiers_registered; |
104 | 104 | ||
105 | /** | 105 | /** |
106 | * i40iw_find_i40e_handler - find a handler given a client info | 106 | * i40iw_find_i40e_handler - find a handler given a client info |
@@ -1342,12 +1342,11 @@ exit: | |||
1342 | */ | 1342 | */ |
1343 | static void i40iw_register_notifiers(void) | 1343 | static void i40iw_register_notifiers(void) |
1344 | { | 1344 | { |
1345 | if (!i40iw_notifiers_registered) { | 1345 | if (atomic_inc_return(&i40iw_notifiers_registered) == 1) { |
1346 | register_inetaddr_notifier(&i40iw_inetaddr_notifier); | 1346 | register_inetaddr_notifier(&i40iw_inetaddr_notifier); |
1347 | register_inet6addr_notifier(&i40iw_inetaddr6_notifier); | 1347 | register_inet6addr_notifier(&i40iw_inetaddr6_notifier); |
1348 | register_netevent_notifier(&i40iw_net_notifier); | 1348 | register_netevent_notifier(&i40iw_net_notifier); |
1349 | } | 1349 | } |
1350 | i40iw_notifiers_registered++; | ||
1351 | } | 1350 | } |
1352 | 1351 | ||
1353 | /** | 1352 | /** |
@@ -1429,8 +1428,7 @@ static void i40iw_deinit_device(struct i40iw_device *iwdev, bool reset, bool del | |||
1429 | i40iw_del_macip_entry(iwdev, (u8)iwdev->mac_ip_table_idx); | 1428 | i40iw_del_macip_entry(iwdev, (u8)iwdev->mac_ip_table_idx); |
1430 | /* fallthrough */ | 1429 | /* fallthrough */ |
1431 | case INET_NOTIFIER: | 1430 | case INET_NOTIFIER: |
1432 | if (i40iw_notifiers_registered > 0) { | 1431 | if (!atomic_dec_return(&i40iw_notifiers_registered)) { |
1433 | i40iw_notifiers_registered--; | ||
1434 | unregister_netevent_notifier(&i40iw_net_notifier); | 1432 | unregister_netevent_notifier(&i40iw_net_notifier); |
1435 | unregister_inetaddr_notifier(&i40iw_inetaddr_notifier); | 1433 | unregister_inetaddr_notifier(&i40iw_inetaddr_notifier); |
1436 | unregister_inet6addr_notifier(&i40iw_inetaddr6_notifier); | 1434 | unregister_inet6addr_notifier(&i40iw_inetaddr6_notifier); |
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index 006db6436e3b..5df63dacaaa3 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c | |||
@@ -687,12 +687,6 @@ repoll: | |||
687 | is_error = (cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) == | 687 | is_error = (cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) == |
688 | MLX4_CQE_OPCODE_ERROR; | 688 | MLX4_CQE_OPCODE_ERROR; |
689 | 689 | ||
690 | if (unlikely((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) == MLX4_OPCODE_NOP && | ||
691 | is_send)) { | ||
692 | pr_warn("Completion for NOP opcode detected!\n"); | ||
693 | return -EAGAIN; | ||
694 | } | ||
695 | |||
696 | /* Resize CQ in progress */ | 690 | /* Resize CQ in progress */ |
697 | if (unlikely((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) == MLX4_CQE_OPCODE_RESIZE)) { | 691 | if (unlikely((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) == MLX4_CQE_OPCODE_RESIZE)) { |
698 | if (cq->resize_buf) { | 692 | if (cq->resize_buf) { |
@@ -718,12 +712,6 @@ repoll: | |||
718 | */ | 712 | */ |
719 | mqp = __mlx4_qp_lookup(to_mdev(cq->ibcq.device)->dev, | 713 | mqp = __mlx4_qp_lookup(to_mdev(cq->ibcq.device)->dev, |
720 | be32_to_cpu(cqe->vlan_my_qpn)); | 714 | be32_to_cpu(cqe->vlan_my_qpn)); |
721 | if (unlikely(!mqp)) { | ||
722 | pr_warn("CQ %06x with entry for unknown QPN %06x\n", | ||
723 | cq->mcq.cqn, be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK); | ||
724 | return -EAGAIN; | ||
725 | } | ||
726 | |||
727 | *cur_qp = to_mibqp(mqp); | 715 | *cur_qp = to_mibqp(mqp); |
728 | } | 716 | } |
729 | 717 | ||
@@ -736,11 +724,6 @@ repoll: | |||
736 | /* SRQ is also in the radix tree */ | 724 | /* SRQ is also in the radix tree */ |
737 | msrq = mlx4_srq_lookup(to_mdev(cq->ibcq.device)->dev, | 725 | msrq = mlx4_srq_lookup(to_mdev(cq->ibcq.device)->dev, |
738 | srq_num); | 726 | srq_num); |
739 | if (unlikely(!msrq)) { | ||
740 | pr_warn("CQ %06x with entry for unknown SRQN %06x\n", | ||
741 | cq->mcq.cqn, srq_num); | ||
742 | return -EAGAIN; | ||
743 | } | ||
744 | } | 727 | } |
745 | 728 | ||
746 | if (is_send) { | 729 | if (is_send) { |
@@ -891,7 +874,6 @@ int mlx4_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc) | |||
891 | struct mlx4_ib_qp *cur_qp = NULL; | 874 | struct mlx4_ib_qp *cur_qp = NULL; |
892 | unsigned long flags; | 875 | unsigned long flags; |
893 | int npolled; | 876 | int npolled; |
894 | int err = 0; | ||
895 | struct mlx4_ib_dev *mdev = to_mdev(cq->ibcq.device); | 877 | struct mlx4_ib_dev *mdev = to_mdev(cq->ibcq.device); |
896 | 878 | ||
897 | spin_lock_irqsave(&cq->lock, flags); | 879 | spin_lock_irqsave(&cq->lock, flags); |
@@ -901,8 +883,7 @@ int mlx4_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc) | |||
901 | } | 883 | } |
902 | 884 | ||
903 | for (npolled = 0; npolled < num_entries; ++npolled) { | 885 | for (npolled = 0; npolled < num_entries; ++npolled) { |
904 | err = mlx4_ib_poll_one(cq, &cur_qp, wc + npolled); | 886 | if (mlx4_ib_poll_one(cq, &cur_qp, wc + npolled)) |
905 | if (err) | ||
906 | break; | 887 | break; |
907 | } | 888 | } |
908 | 889 | ||
@@ -911,10 +892,7 @@ int mlx4_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc) | |||
911 | out: | 892 | out: |
912 | spin_unlock_irqrestore(&cq->lock, flags); | 893 | spin_unlock_irqrestore(&cq->lock, flags); |
913 | 894 | ||
914 | if (err == 0 || err == -EAGAIN) | 895 | return npolled; |
915 | return npolled; | ||
916 | else | ||
917 | return err; | ||
918 | } | 896 | } |
919 | 897 | ||
920 | int mlx4_ib_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) | 898 | int mlx4_ib_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) |
diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c index 308a358e5b46..e4fac9292e4a 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c | |||
@@ -553,12 +553,6 @@ repoll: | |||
553 | * from the table. | 553 | * from the table. |
554 | */ | 554 | */ |
555 | mqp = __mlx5_qp_lookup(dev->mdev, qpn); | 555 | mqp = __mlx5_qp_lookup(dev->mdev, qpn); |
556 | if (unlikely(!mqp)) { | ||
557 | mlx5_ib_warn(dev, "CQE@CQ %06x for unknown QPN %6x\n", | ||
558 | cq->mcq.cqn, qpn); | ||
559 | return -EINVAL; | ||
560 | } | ||
561 | |||
562 | *cur_qp = to_mibqp(mqp); | 556 | *cur_qp = to_mibqp(mqp); |
563 | } | 557 | } |
564 | 558 | ||
@@ -619,13 +613,6 @@ repoll: | |||
619 | read_lock(&dev->mdev->priv.mkey_table.lock); | 613 | read_lock(&dev->mdev->priv.mkey_table.lock); |
620 | mmkey = __mlx5_mr_lookup(dev->mdev, | 614 | mmkey = __mlx5_mr_lookup(dev->mdev, |
621 | mlx5_base_mkey(be32_to_cpu(sig_err_cqe->mkey))); | 615 | mlx5_base_mkey(be32_to_cpu(sig_err_cqe->mkey))); |
622 | if (unlikely(!mmkey)) { | ||
623 | read_unlock(&dev->mdev->priv.mkey_table.lock); | ||
624 | mlx5_ib_warn(dev, "CQE@CQ %06x for unknown MR %6x\n", | ||
625 | cq->mcq.cqn, be32_to_cpu(sig_err_cqe->mkey)); | ||
626 | return -EINVAL; | ||
627 | } | ||
628 | |||
629 | mr = to_mibmr(mmkey); | 616 | mr = to_mibmr(mmkey); |
630 | get_sig_err_item(sig_err_cqe, &mr->sig->err_item); | 617 | get_sig_err_item(sig_err_cqe, &mr->sig->err_item); |
631 | mr->sig->sig_err_exists = true; | 618 | mr->sig->sig_err_exists = true; |
@@ -676,7 +663,6 @@ int mlx5_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc) | |||
676 | unsigned long flags; | 663 | unsigned long flags; |
677 | int soft_polled = 0; | 664 | int soft_polled = 0; |
678 | int npolled; | 665 | int npolled; |
679 | int err = 0; | ||
680 | 666 | ||
681 | spin_lock_irqsave(&cq->lock, flags); | 667 | spin_lock_irqsave(&cq->lock, flags); |
682 | if (mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) { | 668 | if (mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) { |
@@ -688,8 +674,7 @@ int mlx5_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc) | |||
688 | soft_polled = poll_soft_wc(cq, num_entries, wc); | 674 | soft_polled = poll_soft_wc(cq, num_entries, wc); |
689 | 675 | ||
690 | for (npolled = 0; npolled < num_entries - soft_polled; npolled++) { | 676 | for (npolled = 0; npolled < num_entries - soft_polled; npolled++) { |
691 | err = mlx5_poll_one(cq, &cur_qp, wc + soft_polled + npolled); | 677 | if (mlx5_poll_one(cq, &cur_qp, wc + soft_polled + npolled)) |
692 | if (err) | ||
693 | break; | 678 | break; |
694 | } | 679 | } |
695 | 680 | ||
@@ -698,10 +683,7 @@ int mlx5_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc) | |||
698 | out: | 683 | out: |
699 | spin_unlock_irqrestore(&cq->lock, flags); | 684 | spin_unlock_irqrestore(&cq->lock, flags); |
700 | 685 | ||
701 | if (err == 0 || err == -EAGAIN) | 686 | return soft_polled + npolled; |
702 | return soft_polled + npolled; | ||
703 | else | ||
704 | return err; | ||
705 | } | 687 | } |
706 | 688 | ||
707 | int mlx5_ib_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) | 689 | int mlx5_ib_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) |
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 1b4094baa2de..8150ea372c53 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
@@ -1849,6 +1849,7 @@ static struct ib_flow *mlx5_ib_create_flow(struct ib_qp *qp, | |||
1849 | int domain) | 1849 | int domain) |
1850 | { | 1850 | { |
1851 | struct mlx5_ib_dev *dev = to_mdev(qp->device); | 1851 | struct mlx5_ib_dev *dev = to_mdev(qp->device); |
1852 | struct mlx5_ib_qp *mqp = to_mqp(qp); | ||
1852 | struct mlx5_ib_flow_handler *handler = NULL; | 1853 | struct mlx5_ib_flow_handler *handler = NULL; |
1853 | struct mlx5_flow_destination *dst = NULL; | 1854 | struct mlx5_flow_destination *dst = NULL; |
1854 | struct mlx5_ib_flow_prio *ft_prio; | 1855 | struct mlx5_ib_flow_prio *ft_prio; |
@@ -1875,7 +1876,10 @@ static struct ib_flow *mlx5_ib_create_flow(struct ib_qp *qp, | |||
1875 | } | 1876 | } |
1876 | 1877 | ||
1877 | dst->type = MLX5_FLOW_DESTINATION_TYPE_TIR; | 1878 | dst->type = MLX5_FLOW_DESTINATION_TYPE_TIR; |
1878 | dst->tir_num = to_mqp(qp)->raw_packet_qp.rq.tirn; | 1879 | if (mqp->flags & MLX5_IB_QP_RSS) |
1880 | dst->tir_num = mqp->rss_qp.tirn; | ||
1881 | else | ||
1882 | dst->tir_num = mqp->raw_packet_qp.rq.tirn; | ||
1879 | 1883 | ||
1880 | if (flow_attr->type == IB_FLOW_ATTR_NORMAL) { | 1884 | if (flow_attr->type == IB_FLOW_ATTR_NORMAL) { |
1881 | if (flow_attr->flags & IB_FLOW_ATTR_FLAGS_DONT_TRAP) { | 1885 | if (flow_attr->flags & IB_FLOW_ATTR_FLAGS_DONT_TRAP) { |
diff --git a/drivers/infiniband/hw/mlx5/mem.c b/drivers/infiniband/hw/mlx5/mem.c index 40df2cca0609..996b54e366b0 100644 --- a/drivers/infiniband/hw/mlx5/mem.c +++ b/drivers/infiniband/hw/mlx5/mem.c | |||
@@ -71,7 +71,7 @@ void mlx5_ib_cont_pages(struct ib_umem *umem, u64 addr, int *count, int *shift, | |||
71 | 71 | ||
72 | addr = addr >> page_shift; | 72 | addr = addr >> page_shift; |
73 | tmp = (unsigned long)addr; | 73 | tmp = (unsigned long)addr; |
74 | m = find_first_bit(&tmp, sizeof(tmp)); | 74 | m = find_first_bit(&tmp, BITS_PER_LONG); |
75 | skip = 1 << m; | 75 | skip = 1 << m; |
76 | mask = skip - 1; | 76 | mask = skip - 1; |
77 | i = 0; | 77 | i = 0; |
@@ -81,7 +81,7 @@ void mlx5_ib_cont_pages(struct ib_umem *umem, u64 addr, int *count, int *shift, | |||
81 | for (k = 0; k < len; k++) { | 81 | for (k = 0; k < len; k++) { |
82 | if (!(i & mask)) { | 82 | if (!(i & mask)) { |
83 | tmp = (unsigned long)pfn; | 83 | tmp = (unsigned long)pfn; |
84 | m = min_t(unsigned long, m, find_first_bit(&tmp, sizeof(tmp))); | 84 | m = min_t(unsigned long, m, find_first_bit(&tmp, BITS_PER_LONG)); |
85 | skip = 1 << m; | 85 | skip = 1 << m; |
86 | mask = skip - 1; | 86 | mask = skip - 1; |
87 | base = pfn; | 87 | base = pfn; |
@@ -89,7 +89,7 @@ void mlx5_ib_cont_pages(struct ib_umem *umem, u64 addr, int *count, int *shift, | |||
89 | } else { | 89 | } else { |
90 | if (base + p != pfn) { | 90 | if (base + p != pfn) { |
91 | tmp = (unsigned long)p; | 91 | tmp = (unsigned long)p; |
92 | m = find_first_bit(&tmp, sizeof(tmp)); | 92 | m = find_first_bit(&tmp, BITS_PER_LONG); |
93 | skip = 1 << m; | 93 | skip = 1 << m; |
94 | mask = skip - 1; | 94 | mask = skip - 1; |
95 | base = pfn; | 95 | base = pfn; |
diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h index 372385d0f993..95146f4aa3e3 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h | |||
@@ -402,6 +402,7 @@ enum mlx5_ib_qp_flags { | |||
402 | /* QP uses 1 as its source QP number */ | 402 | /* QP uses 1 as its source QP number */ |
403 | MLX5_IB_QP_SQPN_QP1 = 1 << 6, | 403 | MLX5_IB_QP_SQPN_QP1 = 1 << 6, |
404 | MLX5_IB_QP_CAP_SCATTER_FCS = 1 << 7, | 404 | MLX5_IB_QP_CAP_SCATTER_FCS = 1 << 7, |
405 | MLX5_IB_QP_RSS = 1 << 8, | ||
405 | }; | 406 | }; |
406 | 407 | ||
407 | struct mlx5_umr_wr { | 408 | struct mlx5_umr_wr { |
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index 0dd7d93cac95..affc3f6598ca 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c | |||
@@ -1449,6 +1449,7 @@ create_tir: | |||
1449 | kvfree(in); | 1449 | kvfree(in); |
1450 | /* qpn is reserved for that QP */ | 1450 | /* qpn is reserved for that QP */ |
1451 | qp->trans_qp.base.mqp.qpn = 0; | 1451 | qp->trans_qp.base.mqp.qpn = 0; |
1452 | qp->flags |= MLX5_IB_QP_RSS; | ||
1452 | return 0; | 1453 | return 0; |
1453 | 1454 | ||
1454 | err: | 1455 | err: |
@@ -3658,12 +3659,8 @@ static int begin_wqe(struct mlx5_ib_qp *qp, void **seg, | |||
3658 | struct ib_send_wr *wr, unsigned *idx, | 3659 | struct ib_send_wr *wr, unsigned *idx, |
3659 | int *size, int nreq) | 3660 | int *size, int nreq) |
3660 | { | 3661 | { |
3661 | int err = 0; | 3662 | if (unlikely(mlx5_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq))) |
3662 | 3663 | return -ENOMEM; | |
3663 | if (unlikely(mlx5_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq))) { | ||
3664 | err = -ENOMEM; | ||
3665 | return err; | ||
3666 | } | ||
3667 | 3664 | ||
3668 | *idx = qp->sq.cur_post & (qp->sq.wqe_cnt - 1); | 3665 | *idx = qp->sq.cur_post & (qp->sq.wqe_cnt - 1); |
3669 | *seg = mlx5_get_send_wqe(qp, *idx); | 3666 | *seg = mlx5_get_send_wqe(qp, *idx); |
@@ -3679,7 +3676,7 @@ static int begin_wqe(struct mlx5_ib_qp *qp, void **seg, | |||
3679 | *seg += sizeof(**ctrl); | 3676 | *seg += sizeof(**ctrl); |
3680 | *size = sizeof(**ctrl) / 16; | 3677 | *size = sizeof(**ctrl) / 16; |
3681 | 3678 | ||
3682 | return err; | 3679 | return 0; |
3683 | } | 3680 | } |
3684 | 3681 | ||
3685 | static void finish_wqe(struct mlx5_ib_qp *qp, | 3682 | static void finish_wqe(struct mlx5_ib_qp *qp, |
@@ -3758,7 +3755,7 @@ int mlx5_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
3758 | num_sge = wr->num_sge; | 3755 | num_sge = wr->num_sge; |
3759 | if (unlikely(num_sge > qp->sq.max_gs)) { | 3756 | if (unlikely(num_sge > qp->sq.max_gs)) { |
3760 | mlx5_ib_warn(dev, "\n"); | 3757 | mlx5_ib_warn(dev, "\n"); |
3761 | err = -ENOMEM; | 3758 | err = -EINVAL; |
3762 | *bad_wr = wr; | 3759 | *bad_wr = wr; |
3763 | goto out; | 3760 | goto out; |
3764 | } | 3761 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index 4f7d9b48df64..9dbfcc0ab577 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
@@ -478,6 +478,7 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb, | |||
478 | struct ipoib_ah *address, u32 qpn); | 478 | struct ipoib_ah *address, u32 qpn); |
479 | void ipoib_reap_ah(struct work_struct *work); | 479 | void ipoib_reap_ah(struct work_struct *work); |
480 | 480 | ||
481 | struct ipoib_path *__path_find(struct net_device *dev, void *gid); | ||
481 | void ipoib_mark_paths_invalid(struct net_device *dev); | 482 | void ipoib_mark_paths_invalid(struct net_device *dev); |
482 | void ipoib_flush_paths(struct net_device *dev); | 483 | void ipoib_flush_paths(struct net_device *dev); |
483 | int ipoib_check_sm_sendonly_fullmember_support(struct ipoib_dev_priv *priv); | 484 | int ipoib_check_sm_sendonly_fullmember_support(struct ipoib_dev_priv *priv); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c index 951d9abcca8b..4ad297d3de89 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c | |||
@@ -1318,6 +1318,8 @@ void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx) | |||
1318 | } | 1318 | } |
1319 | } | 1319 | } |
1320 | 1320 | ||
1321 | #define QPN_AND_OPTIONS_OFFSET 4 | ||
1322 | |||
1321 | static void ipoib_cm_tx_start(struct work_struct *work) | 1323 | static void ipoib_cm_tx_start(struct work_struct *work) |
1322 | { | 1324 | { |
1323 | struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv, | 1325 | struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv, |
@@ -1326,6 +1328,7 @@ static void ipoib_cm_tx_start(struct work_struct *work) | |||
1326 | struct ipoib_neigh *neigh; | 1328 | struct ipoib_neigh *neigh; |
1327 | struct ipoib_cm_tx *p; | 1329 | struct ipoib_cm_tx *p; |
1328 | unsigned long flags; | 1330 | unsigned long flags; |
1331 | struct ipoib_path *path; | ||
1329 | int ret; | 1332 | int ret; |
1330 | 1333 | ||
1331 | struct ib_sa_path_rec pathrec; | 1334 | struct ib_sa_path_rec pathrec; |
@@ -1338,7 +1341,19 @@ static void ipoib_cm_tx_start(struct work_struct *work) | |||
1338 | p = list_entry(priv->cm.start_list.next, typeof(*p), list); | 1341 | p = list_entry(priv->cm.start_list.next, typeof(*p), list); |
1339 | list_del_init(&p->list); | 1342 | list_del_init(&p->list); |
1340 | neigh = p->neigh; | 1343 | neigh = p->neigh; |
1344 | |||
1341 | qpn = IPOIB_QPN(neigh->daddr); | 1345 | qpn = IPOIB_QPN(neigh->daddr); |
1346 | /* | ||
1347 | * As long as the search is with these 2 locks, | ||
1348 | * path existence indicates its validity. | ||
1349 | */ | ||
1350 | path = __path_find(dev, neigh->daddr + QPN_AND_OPTIONS_OFFSET); | ||
1351 | if (!path) { | ||
1352 | pr_info("%s ignore not valid path %pI6\n", | ||
1353 | __func__, | ||
1354 | neigh->daddr + QPN_AND_OPTIONS_OFFSET); | ||
1355 | goto free_neigh; | ||
1356 | } | ||
1342 | memcpy(&pathrec, &p->path->pathrec, sizeof pathrec); | 1357 | memcpy(&pathrec, &p->path->pathrec, sizeof pathrec); |
1343 | 1358 | ||
1344 | spin_unlock_irqrestore(&priv->lock, flags); | 1359 | spin_unlock_irqrestore(&priv->lock, flags); |
@@ -1350,6 +1365,7 @@ static void ipoib_cm_tx_start(struct work_struct *work) | |||
1350 | spin_lock_irqsave(&priv->lock, flags); | 1365 | spin_lock_irqsave(&priv->lock, flags); |
1351 | 1366 | ||
1352 | if (ret) { | 1367 | if (ret) { |
1368 | free_neigh: | ||
1353 | neigh = p->neigh; | 1369 | neigh = p->neigh; |
1354 | if (neigh) { | 1370 | if (neigh) { |
1355 | neigh->cm = NULL; | 1371 | neigh->cm = NULL; |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 74bcaa064226..cc1c1b062ea5 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -485,7 +485,7 @@ int ipoib_set_mode(struct net_device *dev, const char *buf) | |||
485 | return -EINVAL; | 485 | return -EINVAL; |
486 | } | 486 | } |
487 | 487 | ||
488 | static struct ipoib_path *__path_find(struct net_device *dev, void *gid) | 488 | struct ipoib_path *__path_find(struct net_device *dev, void *gid) |
489 | { | 489 | { |
490 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 490 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
491 | struct rb_node *n = priv->path_tree.rb_node; | 491 | struct rb_node *n = priv->path_tree.rb_node; |
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index 7914c14478cd..cae9bbcc27e7 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c | |||
@@ -403,6 +403,7 @@ isert_init_conn(struct isert_conn *isert_conn) | |||
403 | INIT_LIST_HEAD(&isert_conn->node); | 403 | INIT_LIST_HEAD(&isert_conn->node); |
404 | init_completion(&isert_conn->login_comp); | 404 | init_completion(&isert_conn->login_comp); |
405 | init_completion(&isert_conn->login_req_comp); | 405 | init_completion(&isert_conn->login_req_comp); |
406 | init_waitqueue_head(&isert_conn->rem_wait); | ||
406 | kref_init(&isert_conn->kref); | 407 | kref_init(&isert_conn->kref); |
407 | mutex_init(&isert_conn->mutex); | 408 | mutex_init(&isert_conn->mutex); |
408 | INIT_WORK(&isert_conn->release_work, isert_release_work); | 409 | INIT_WORK(&isert_conn->release_work, isert_release_work); |
@@ -578,7 +579,8 @@ isert_connect_release(struct isert_conn *isert_conn) | |||
578 | BUG_ON(!device); | 579 | BUG_ON(!device); |
579 | 580 | ||
580 | isert_free_rx_descriptors(isert_conn); | 581 | isert_free_rx_descriptors(isert_conn); |
581 | if (isert_conn->cm_id) | 582 | if (isert_conn->cm_id && |
583 | !isert_conn->dev_removed) | ||
582 | rdma_destroy_id(isert_conn->cm_id); | 584 | rdma_destroy_id(isert_conn->cm_id); |
583 | 585 | ||
584 | if (isert_conn->qp) { | 586 | if (isert_conn->qp) { |
@@ -593,7 +595,10 @@ isert_connect_release(struct isert_conn *isert_conn) | |||
593 | 595 | ||
594 | isert_device_put(device); | 596 | isert_device_put(device); |
595 | 597 | ||
596 | kfree(isert_conn); | 598 | if (isert_conn->dev_removed) |
599 | wake_up_interruptible(&isert_conn->rem_wait); | ||
600 | else | ||
601 | kfree(isert_conn); | ||
597 | } | 602 | } |
598 | 603 | ||
599 | static void | 604 | static void |
@@ -753,6 +758,7 @@ static int | |||
753 | isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | 758 | isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) |
754 | { | 759 | { |
755 | struct isert_np *isert_np = cma_id->context; | 760 | struct isert_np *isert_np = cma_id->context; |
761 | struct isert_conn *isert_conn; | ||
756 | int ret = 0; | 762 | int ret = 0; |
757 | 763 | ||
758 | isert_info("%s (%d): status %d id %p np %p\n", | 764 | isert_info("%s (%d): status %d id %p np %p\n", |
@@ -773,10 +779,21 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | |||
773 | break; | 779 | break; |
774 | case RDMA_CM_EVENT_ADDR_CHANGE: /* FALLTHRU */ | 780 | case RDMA_CM_EVENT_ADDR_CHANGE: /* FALLTHRU */ |
775 | case RDMA_CM_EVENT_DISCONNECTED: /* FALLTHRU */ | 781 | case RDMA_CM_EVENT_DISCONNECTED: /* FALLTHRU */ |
776 | case RDMA_CM_EVENT_DEVICE_REMOVAL: /* FALLTHRU */ | ||
777 | case RDMA_CM_EVENT_TIMEWAIT_EXIT: /* FALLTHRU */ | 782 | case RDMA_CM_EVENT_TIMEWAIT_EXIT: /* FALLTHRU */ |
778 | ret = isert_disconnected_handler(cma_id, event->event); | 783 | ret = isert_disconnected_handler(cma_id, event->event); |
779 | break; | 784 | break; |
785 | case RDMA_CM_EVENT_DEVICE_REMOVAL: | ||
786 | isert_conn = cma_id->qp->qp_context; | ||
787 | isert_conn->dev_removed = true; | ||
788 | isert_disconnected_handler(cma_id, event->event); | ||
789 | wait_event_interruptible(isert_conn->rem_wait, | ||
790 | isert_conn->state == ISER_CONN_DOWN); | ||
791 | kfree(isert_conn); | ||
792 | /* | ||
793 | * return non-zero from the callback to destroy | ||
794 | * the rdma cm id | ||
795 | */ | ||
796 | return 1; | ||
780 | case RDMA_CM_EVENT_REJECTED: /* FALLTHRU */ | 797 | case RDMA_CM_EVENT_REJECTED: /* FALLTHRU */ |
781 | case RDMA_CM_EVENT_UNREACHABLE: /* FALLTHRU */ | 798 | case RDMA_CM_EVENT_UNREACHABLE: /* FALLTHRU */ |
782 | case RDMA_CM_EVENT_CONNECT_ERROR: | 799 | case RDMA_CM_EVENT_CONNECT_ERROR: |
diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h index fc791efe3a10..c02ada57d7f5 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.h +++ b/drivers/infiniband/ulp/isert/ib_isert.h | |||
@@ -158,6 +158,8 @@ struct isert_conn { | |||
158 | struct work_struct release_work; | 158 | struct work_struct release_work; |
159 | bool logout_posted; | 159 | bool logout_posted; |
160 | bool snd_w_inv; | 160 | bool snd_w_inv; |
161 | wait_queue_head_t rem_wait; | ||
162 | bool dev_removed; | ||
161 | }; | 163 | }; |
162 | 164 | ||
163 | #define ISERT_MAX_CQ 64 | 165 | #define ISERT_MAX_CQ 64 |
diff --git a/drivers/macintosh/ams/ams-i2c.c b/drivers/macintosh/ams/ams-i2c.c index 978eda8d6678..8a3ba565106f 100644 --- a/drivers/macintosh/ams/ams-i2c.c +++ b/drivers/macintosh/ams/ams-i2c.c | |||
@@ -73,7 +73,6 @@ MODULE_DEVICE_TABLE(i2c, ams_id); | |||
73 | static struct i2c_driver ams_i2c_driver = { | 73 | static struct i2c_driver ams_i2c_driver = { |
74 | .driver = { | 74 | .driver = { |
75 | .name = "ams", | 75 | .name = "ams", |
76 | .owner = THIS_MODULE, | ||
77 | }, | 76 | }, |
78 | .probe = ams_i2c_probe, | 77 | .probe = ams_i2c_probe, |
79 | .remove = ams_i2c_remove, | 78 | .remove = ams_i2c_remove, |
diff --git a/drivers/macintosh/windfarm_pm112.c b/drivers/macintosh/windfarm_pm112.c index 3024685e4cca..96d16fca68b2 100644 --- a/drivers/macintosh/windfarm_pm112.c +++ b/drivers/macintosh/windfarm_pm112.c | |||
@@ -668,7 +668,6 @@ static struct platform_driver wf_pm112_driver = { | |||
668 | .remove = wf_pm112_remove, | 668 | .remove = wf_pm112_remove, |
669 | .driver = { | 669 | .driver = { |
670 | .name = "windfarm", | 670 | .name = "windfarm", |
671 | .owner = THIS_MODULE, | ||
672 | }, | 671 | }, |
673 | }; | 672 | }; |
674 | 673 | ||
diff --git a/drivers/macintosh/windfarm_pm72.c b/drivers/macintosh/windfarm_pm72.c index 2f506b9d5a52..e88cfb36a74d 100644 --- a/drivers/macintosh/windfarm_pm72.c +++ b/drivers/macintosh/windfarm_pm72.c | |||
@@ -789,7 +789,6 @@ static struct platform_driver wf_pm72_driver = { | |||
789 | .remove = wf_pm72_remove, | 789 | .remove = wf_pm72_remove, |
790 | .driver = { | 790 | .driver = { |
791 | .name = "windfarm", | 791 | .name = "windfarm", |
792 | .owner = THIS_MODULE, | ||
793 | }, | 792 | }, |
794 | }; | 793 | }; |
795 | 794 | ||
diff --git a/drivers/macintosh/windfarm_rm31.c b/drivers/macintosh/windfarm_rm31.c index 82fc86a90c1a..bdfcb8a8bfbb 100644 --- a/drivers/macintosh/windfarm_rm31.c +++ b/drivers/macintosh/windfarm_rm31.c | |||
@@ -682,7 +682,6 @@ static struct platform_driver wf_rm31_driver = { | |||
682 | .remove = wf_rm31_remove, | 682 | .remove = wf_rm31_remove, |
683 | .driver = { | 683 | .driver = { |
684 | .name = "windfarm", | 684 | .name = "windfarm", |
685 | .owner = THIS_MODULE, | ||
686 | }, | 685 | }, |
687 | }; | 686 | }; |
688 | 687 | ||
diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig index 97c372908e78..7817d40d81e7 100644 --- a/drivers/mailbox/Kconfig +++ b/drivers/mailbox/Kconfig | |||
@@ -127,6 +127,7 @@ config XGENE_SLIMPRO_MBOX | |||
127 | config BCM_PDC_MBOX | 127 | config BCM_PDC_MBOX |
128 | tristate "Broadcom PDC Mailbox" | 128 | tristate "Broadcom PDC Mailbox" |
129 | depends on ARM64 || COMPILE_TEST | 129 | depends on ARM64 || COMPILE_TEST |
130 | depends on HAS_DMA | ||
130 | default ARCH_BCM_IPROC | 131 | default ARCH_BCM_IPROC |
131 | help | 132 | help |
132 | Mailbox implementation for the Broadcom PDC ring manager, | 133 | Mailbox implementation for the Broadcom PDC ring manager, |
diff --git a/drivers/mailbox/bcm-pdc-mailbox.c b/drivers/mailbox/bcm-pdc-mailbox.c index cbe0c1ee4ba9..c19dd820ea9b 100644 --- a/drivers/mailbox/bcm-pdc-mailbox.c +++ b/drivers/mailbox/bcm-pdc-mailbox.c | |||
@@ -469,7 +469,7 @@ static const struct file_operations pdc_debugfs_stats = { | |||
469 | * this directory for a SPU. | 469 | * this directory for a SPU. |
470 | * @pdcs: PDC state structure | 470 | * @pdcs: PDC state structure |
471 | */ | 471 | */ |
472 | void pdc_setup_debugfs(struct pdc_state *pdcs) | 472 | static void pdc_setup_debugfs(struct pdc_state *pdcs) |
473 | { | 473 | { |
474 | char spu_stats_name[16]; | 474 | char spu_stats_name[16]; |
475 | 475 | ||
@@ -485,7 +485,7 @@ void pdc_setup_debugfs(struct pdc_state *pdcs) | |||
485 | &pdc_debugfs_stats); | 485 | &pdc_debugfs_stats); |
486 | } | 486 | } |
487 | 487 | ||
488 | void pdc_free_debugfs(void) | 488 | static void pdc_free_debugfs(void) |
489 | { | 489 | { |
490 | if (debugfs_dir && simple_empty(debugfs_dir)) { | 490 | if (debugfs_dir && simple_empty(debugfs_dir)) { |
491 | debugfs_remove_recursive(debugfs_dir); | 491 | debugfs_remove_recursive(debugfs_dir); |
@@ -1191,10 +1191,11 @@ static void pdc_shutdown(struct mbox_chan *chan) | |||
1191 | { | 1191 | { |
1192 | struct pdc_state *pdcs = chan->con_priv; | 1192 | struct pdc_state *pdcs = chan->con_priv; |
1193 | 1193 | ||
1194 | if (pdcs) | 1194 | if (!pdcs) |
1195 | dev_dbg(&pdcs->pdev->dev, | 1195 | return; |
1196 | "Shutdown mailbox channel for PDC %u", pdcs->pdc_idx); | ||
1197 | 1196 | ||
1197 | dev_dbg(&pdcs->pdev->dev, | ||
1198 | "Shutdown mailbox channel for PDC %u", pdcs->pdc_idx); | ||
1198 | pdc_ring_free(pdcs); | 1199 | pdc_ring_free(pdcs); |
1199 | } | 1200 | } |
1200 | 1201 | ||
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 6fff794e0c72..13041ee37ad6 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -2183,19 +2183,29 @@ location_show(struct mddev *mddev, char *page) | |||
2183 | static ssize_t | 2183 | static ssize_t |
2184 | location_store(struct mddev *mddev, const char *buf, size_t len) | 2184 | location_store(struct mddev *mddev, const char *buf, size_t len) |
2185 | { | 2185 | { |
2186 | int rv; | ||
2186 | 2187 | ||
2188 | rv = mddev_lock(mddev); | ||
2189 | if (rv) | ||
2190 | return rv; | ||
2187 | if (mddev->pers) { | 2191 | if (mddev->pers) { |
2188 | if (!mddev->pers->quiesce) | 2192 | if (!mddev->pers->quiesce) { |
2189 | return -EBUSY; | 2193 | rv = -EBUSY; |
2190 | if (mddev->recovery || mddev->sync_thread) | 2194 | goto out; |
2191 | return -EBUSY; | 2195 | } |
2196 | if (mddev->recovery || mddev->sync_thread) { | ||
2197 | rv = -EBUSY; | ||
2198 | goto out; | ||
2199 | } | ||
2192 | } | 2200 | } |
2193 | 2201 | ||
2194 | if (mddev->bitmap || mddev->bitmap_info.file || | 2202 | if (mddev->bitmap || mddev->bitmap_info.file || |
2195 | mddev->bitmap_info.offset) { | 2203 | mddev->bitmap_info.offset) { |
2196 | /* bitmap already configured. Only option is to clear it */ | 2204 | /* bitmap already configured. Only option is to clear it */ |
2197 | if (strncmp(buf, "none", 4) != 0) | 2205 | if (strncmp(buf, "none", 4) != 0) { |
2198 | return -EBUSY; | 2206 | rv = -EBUSY; |
2207 | goto out; | ||
2208 | } | ||
2199 | if (mddev->pers) { | 2209 | if (mddev->pers) { |
2200 | mddev->pers->quiesce(mddev, 1); | 2210 | mddev->pers->quiesce(mddev, 1); |
2201 | bitmap_destroy(mddev); | 2211 | bitmap_destroy(mddev); |
@@ -2214,21 +2224,25 @@ location_store(struct mddev *mddev, const char *buf, size_t len) | |||
2214 | /* nothing to be done */; | 2224 | /* nothing to be done */; |
2215 | else if (strncmp(buf, "file:", 5) == 0) { | 2225 | else if (strncmp(buf, "file:", 5) == 0) { |
2216 | /* Not supported yet */ | 2226 | /* Not supported yet */ |
2217 | return -EINVAL; | 2227 | rv = -EINVAL; |
2228 | goto out; | ||
2218 | } else { | 2229 | } else { |
2219 | int rv; | ||
2220 | if (buf[0] == '+') | 2230 | if (buf[0] == '+') |
2221 | rv = kstrtoll(buf+1, 10, &offset); | 2231 | rv = kstrtoll(buf+1, 10, &offset); |
2222 | else | 2232 | else |
2223 | rv = kstrtoll(buf, 10, &offset); | 2233 | rv = kstrtoll(buf, 10, &offset); |
2224 | if (rv) | 2234 | if (rv) |
2225 | return rv; | 2235 | goto out; |
2226 | if (offset == 0) | 2236 | if (offset == 0) { |
2227 | return -EINVAL; | 2237 | rv = -EINVAL; |
2238 | goto out; | ||
2239 | } | ||
2228 | if (mddev->bitmap_info.external == 0 && | 2240 | if (mddev->bitmap_info.external == 0 && |
2229 | mddev->major_version == 0 && | 2241 | mddev->major_version == 0 && |
2230 | offset != mddev->bitmap_info.default_offset) | 2242 | offset != mddev->bitmap_info.default_offset) { |
2231 | return -EINVAL; | 2243 | rv = -EINVAL; |
2244 | goto out; | ||
2245 | } | ||
2232 | mddev->bitmap_info.offset = offset; | 2246 | mddev->bitmap_info.offset = offset; |
2233 | if (mddev->pers) { | 2247 | if (mddev->pers) { |
2234 | struct bitmap *bitmap; | 2248 | struct bitmap *bitmap; |
@@ -2245,7 +2259,7 @@ location_store(struct mddev *mddev, const char *buf, size_t len) | |||
2245 | mddev->pers->quiesce(mddev, 0); | 2259 | mddev->pers->quiesce(mddev, 0); |
2246 | if (rv) { | 2260 | if (rv) { |
2247 | bitmap_destroy(mddev); | 2261 | bitmap_destroy(mddev); |
2248 | return rv; | 2262 | goto out; |
2249 | } | 2263 | } |
2250 | } | 2264 | } |
2251 | } | 2265 | } |
@@ -2257,6 +2271,11 @@ location_store(struct mddev *mddev, const char *buf, size_t len) | |||
2257 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 2271 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
2258 | md_wakeup_thread(mddev->thread); | 2272 | md_wakeup_thread(mddev->thread); |
2259 | } | 2273 | } |
2274 | rv = 0; | ||
2275 | out: | ||
2276 | mddev_unlock(mddev); | ||
2277 | if (rv) | ||
2278 | return rv; | ||
2260 | return len; | 2279 | return len; |
2261 | } | 2280 | } |
2262 | 2281 | ||
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index 6571c81465e1..8625040bae92 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c | |||
@@ -1879,7 +1879,7 @@ static int __init dm_bufio_init(void) | |||
1879 | __cache_size_refresh(); | 1879 | __cache_size_refresh(); |
1880 | mutex_unlock(&dm_bufio_clients_lock); | 1880 | mutex_unlock(&dm_bufio_clients_lock); |
1881 | 1881 | ||
1882 | dm_bufio_wq = create_singlethread_workqueue("dm_bufio_cache"); | 1882 | dm_bufio_wq = alloc_workqueue("dm_bufio_cache", WQ_MEM_RECLAIM, 0); |
1883 | if (!dm_bufio_wq) | 1883 | if (!dm_bufio_wq) |
1884 | return -ENOMEM; | 1884 | return -ENOMEM; |
1885 | 1885 | ||
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 9ba0f0724d28..0448e7e35c8c 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
@@ -1453,7 +1453,7 @@ static int crypt_alloc_tfms(struct crypt_config *cc, char *ciphermode) | |||
1453 | unsigned i; | 1453 | unsigned i; |
1454 | int err; | 1454 | int err; |
1455 | 1455 | ||
1456 | cc->tfms = kmalloc(cc->tfms_count * sizeof(struct crypto_skcipher *), | 1456 | cc->tfms = kzalloc(cc->tfms_count * sizeof(struct crypto_skcipher *), |
1457 | GFP_KERNEL); | 1457 | GFP_KERNEL); |
1458 | if (!cc->tfms) | 1458 | if (!cc->tfms) |
1459 | return -ENOMEM; | 1459 | return -ENOMEM; |
@@ -1924,6 +1924,13 @@ static int crypt_map(struct dm_target *ti, struct bio *bio) | |||
1924 | return DM_MAPIO_REMAPPED; | 1924 | return DM_MAPIO_REMAPPED; |
1925 | } | 1925 | } |
1926 | 1926 | ||
1927 | /* | ||
1928 | * Check if bio is too large, split as needed. | ||
1929 | */ | ||
1930 | if (unlikely(bio->bi_iter.bi_size > (BIO_MAX_PAGES << PAGE_SHIFT)) && | ||
1931 | bio_data_dir(bio) == WRITE) | ||
1932 | dm_accept_partial_bio(bio, ((BIO_MAX_PAGES << PAGE_SHIFT) >> SECTOR_SHIFT)); | ||
1933 | |||
1927 | io = dm_per_bio_data(bio, cc->per_bio_data_size); | 1934 | io = dm_per_bio_data(bio, cc->per_bio_data_size); |
1928 | crypt_io_init(io, cc, bio, dm_target_offset(ti, bio->bi_iter.bi_sector)); | 1935 | crypt_io_init(io, cc, bio, dm_target_offset(ti, bio->bi_iter.bi_sector)); |
1929 | io->ctx.req = (struct skcipher_request *)(io + 1); | 1936 | io->ctx.req = (struct skcipher_request *)(io + 1); |
diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index 4ab68033f9d1..49e4d8d4558f 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c | |||
@@ -259,12 +259,12 @@ static int log_one_block(struct log_writes_c *lc, | |||
259 | goto out; | 259 | goto out; |
260 | sector++; | 260 | sector++; |
261 | 261 | ||
262 | bio = bio_alloc(GFP_KERNEL, block->vec_cnt); | 262 | atomic_inc(&lc->io_blocks); |
263 | bio = bio_alloc(GFP_KERNEL, min(block->vec_cnt, BIO_MAX_PAGES)); | ||
263 | if (!bio) { | 264 | if (!bio) { |
264 | DMERR("Couldn't alloc log bio"); | 265 | DMERR("Couldn't alloc log bio"); |
265 | goto error; | 266 | goto error; |
266 | } | 267 | } |
267 | atomic_inc(&lc->io_blocks); | ||
268 | bio->bi_iter.bi_size = 0; | 268 | bio->bi_iter.bi_size = 0; |
269 | bio->bi_iter.bi_sector = sector; | 269 | bio->bi_iter.bi_sector = sector; |
270 | bio->bi_bdev = lc->logdev->bdev; | 270 | bio->bi_bdev = lc->logdev->bdev; |
@@ -282,7 +282,7 @@ static int log_one_block(struct log_writes_c *lc, | |||
282 | if (ret != block->vecs[i].bv_len) { | 282 | if (ret != block->vecs[i].bv_len) { |
283 | atomic_inc(&lc->io_blocks); | 283 | atomic_inc(&lc->io_blocks); |
284 | submit_bio(bio); | 284 | submit_bio(bio); |
285 | bio = bio_alloc(GFP_KERNEL, block->vec_cnt - i); | 285 | bio = bio_alloc(GFP_KERNEL, min(block->vec_cnt - i, BIO_MAX_PAGES)); |
286 | if (!bio) { | 286 | if (!bio) { |
287 | DMERR("Couldn't alloc log bio"); | 287 | DMERR("Couldn't alloc log bio"); |
288 | goto error; | 288 | goto error; |
@@ -459,9 +459,9 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
459 | goto bad; | 459 | goto bad; |
460 | } | 460 | } |
461 | 461 | ||
462 | ret = -EINVAL; | ||
463 | lc->log_kthread = kthread_run(log_writes_kthread, lc, "log-write"); | 462 | lc->log_kthread = kthread_run(log_writes_kthread, lc, "log-write"); |
464 | if (!lc->log_kthread) { | 463 | if (IS_ERR(lc->log_kthread)) { |
464 | ret = PTR_ERR(lc->log_kthread); | ||
465 | ti->error = "Couldn't alloc kthread"; | 465 | ti->error = "Couldn't alloc kthread"; |
466 | dm_put_device(ti, lc->dev); | 466 | dm_put_device(ti, lc->dev); |
467 | dm_put_device(ti, lc->logdev); | 467 | dm_put_device(ti, lc->logdev); |
diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c index 41573f1f626f..34a840d9df76 100644 --- a/drivers/md/md-cluster.c +++ b/drivers/md/md-cluster.c | |||
@@ -834,8 +834,10 @@ static int join(struct mddev *mddev, int nodes) | |||
834 | goto err; | 834 | goto err; |
835 | } | 835 | } |
836 | cinfo->ack_lockres = lockres_init(mddev, "ack", ack_bast, 0); | 836 | cinfo->ack_lockres = lockres_init(mddev, "ack", ack_bast, 0); |
837 | if (!cinfo->ack_lockres) | 837 | if (!cinfo->ack_lockres) { |
838 | ret = -ENOMEM; | ||
838 | goto err; | 839 | goto err; |
840 | } | ||
839 | /* get sync CR lock on ACK. */ | 841 | /* get sync CR lock on ACK. */ |
840 | if (dlm_lock_sync(cinfo->ack_lockres, DLM_LOCK_CR)) | 842 | if (dlm_lock_sync(cinfo->ack_lockres, DLM_LOCK_CR)) |
841 | pr_err("md-cluster: failed to get a sync CR lock on ACK!(%d)\n", | 843 | pr_err("md-cluster: failed to get a sync CR lock on ACK!(%d)\n", |
@@ -849,8 +851,10 @@ static int join(struct mddev *mddev, int nodes) | |||
849 | pr_info("md-cluster: Joined cluster %s slot %d\n", str, cinfo->slot_number); | 851 | pr_info("md-cluster: Joined cluster %s slot %d\n", str, cinfo->slot_number); |
850 | snprintf(str, 64, "bitmap%04d", cinfo->slot_number - 1); | 852 | snprintf(str, 64, "bitmap%04d", cinfo->slot_number - 1); |
851 | cinfo->bitmap_lockres = lockres_init(mddev, str, NULL, 1); | 853 | cinfo->bitmap_lockres = lockres_init(mddev, str, NULL, 1); |
852 | if (!cinfo->bitmap_lockres) | 854 | if (!cinfo->bitmap_lockres) { |
855 | ret = -ENOMEM; | ||
853 | goto err; | 856 | goto err; |
857 | } | ||
854 | if (dlm_lock_sync(cinfo->bitmap_lockres, DLM_LOCK_PW)) { | 858 | if (dlm_lock_sync(cinfo->bitmap_lockres, DLM_LOCK_PW)) { |
855 | pr_err("Failed to get bitmap lock\n"); | 859 | pr_err("Failed to get bitmap lock\n"); |
856 | ret = -EINVAL; | 860 | ret = -EINVAL; |
@@ -858,8 +862,10 @@ static int join(struct mddev *mddev, int nodes) | |||
858 | } | 862 | } |
859 | 863 | ||
860 | cinfo->resync_lockres = lockres_init(mddev, "resync", NULL, 0); | 864 | cinfo->resync_lockres = lockres_init(mddev, "resync", NULL, 0); |
861 | if (!cinfo->resync_lockres) | 865 | if (!cinfo->resync_lockres) { |
866 | ret = -ENOMEM; | ||
862 | goto err; | 867 | goto err; |
868 | } | ||
863 | 869 | ||
864 | return 0; | 870 | return 0; |
865 | err: | 871 | err: |
diff --git a/drivers/md/md.c b/drivers/md/md.c index d646f6e444f0..67642bacd597 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -1604,11 +1604,8 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) | |||
1604 | mddev->new_chunk_sectors = mddev->chunk_sectors; | 1604 | mddev->new_chunk_sectors = mddev->chunk_sectors; |
1605 | } | 1605 | } |
1606 | 1606 | ||
1607 | if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL) { | 1607 | if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL) |
1608 | set_bit(MD_HAS_JOURNAL, &mddev->flags); | 1608 | set_bit(MD_HAS_JOURNAL, &mddev->flags); |
1609 | if (mddev->recovery_cp == MaxSector) | ||
1610 | set_bit(MD_JOURNAL_CLEAN, &mddev->flags); | ||
1611 | } | ||
1612 | } else if (mddev->pers == NULL) { | 1609 | } else if (mddev->pers == NULL) { |
1613 | /* Insist of good event counter while assembling, except for | 1610 | /* Insist of good event counter while assembling, except for |
1614 | * spares (which don't need an event count) */ | 1611 | * spares (which don't need an event count) */ |
@@ -5851,6 +5848,9 @@ static int get_array_info(struct mddev *mddev, void __user *arg) | |||
5851 | working++; | 5848 | working++; |
5852 | if (test_bit(In_sync, &rdev->flags)) | 5849 | if (test_bit(In_sync, &rdev->flags)) |
5853 | insync++; | 5850 | insync++; |
5851 | else if (test_bit(Journal, &rdev->flags)) | ||
5852 | /* TODO: add journal count to md_u.h */ | ||
5853 | ; | ||
5854 | else | 5854 | else |
5855 | spare++; | 5855 | spare++; |
5856 | } | 5856 | } |
@@ -7862,6 +7862,7 @@ void md_do_sync(struct md_thread *thread) | |||
7862 | */ | 7862 | */ |
7863 | 7863 | ||
7864 | do { | 7864 | do { |
7865 | int mddev2_minor = -1; | ||
7865 | mddev->curr_resync = 2; | 7866 | mddev->curr_resync = 2; |
7866 | 7867 | ||
7867 | try_again: | 7868 | try_again: |
@@ -7891,10 +7892,14 @@ void md_do_sync(struct md_thread *thread) | |||
7891 | prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE); | 7892 | prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE); |
7892 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && | 7893 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && |
7893 | mddev2->curr_resync >= mddev->curr_resync) { | 7894 | mddev2->curr_resync >= mddev->curr_resync) { |
7894 | printk(KERN_INFO "md: delaying %s of %s" | 7895 | if (mddev2_minor != mddev2->md_minor) { |
7895 | " until %s has finished (they" | 7896 | mddev2_minor = mddev2->md_minor; |
7896 | " share one or more physical units)\n", | 7897 | printk(KERN_INFO "md: delaying %s of %s" |
7897 | desc, mdname(mddev), mdname(mddev2)); | 7898 | " until %s has finished (they" |
7899 | " share one or more physical units)\n", | ||
7900 | desc, mdname(mddev), | ||
7901 | mdname(mddev2)); | ||
7902 | } | ||
7898 | mddev_put(mddev2); | 7903 | mddev_put(mddev2); |
7899 | if (signal_pending(current)) | 7904 | if (signal_pending(current)) |
7900 | flush_signals(current); | 7905 | flush_signals(current); |
@@ -8275,16 +8280,13 @@ no_add: | |||
8275 | static void md_start_sync(struct work_struct *ws) | 8280 | static void md_start_sync(struct work_struct *ws) |
8276 | { | 8281 | { |
8277 | struct mddev *mddev = container_of(ws, struct mddev, del_work); | 8282 | struct mddev *mddev = container_of(ws, struct mddev, del_work); |
8278 | int ret = 0; | ||
8279 | 8283 | ||
8280 | mddev->sync_thread = md_register_thread(md_do_sync, | 8284 | mddev->sync_thread = md_register_thread(md_do_sync, |
8281 | mddev, | 8285 | mddev, |
8282 | "resync"); | 8286 | "resync"); |
8283 | if (!mddev->sync_thread) { | 8287 | if (!mddev->sync_thread) { |
8284 | if (!(mddev_is_clustered(mddev) && ret == -EAGAIN)) | 8288 | printk(KERN_ERR "%s: could not start resync thread...\n", |
8285 | printk(KERN_ERR "%s: could not start resync" | 8289 | mdname(mddev)); |
8286 | " thread...\n", | ||
8287 | mdname(mddev)); | ||
8288 | /* leave the spares where they are, it shouldn't hurt */ | 8290 | /* leave the spares where they are, it shouldn't hurt */ |
8289 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); | 8291 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
8290 | clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); | 8292 | clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 0e4efcd10795..be1a9fca3b2d 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -1064,6 +1064,8 @@ static void __make_request(struct mddev *mddev, struct bio *bio) | |||
1064 | int max_sectors; | 1064 | int max_sectors; |
1065 | int sectors; | 1065 | int sectors; |
1066 | 1066 | ||
1067 | md_write_start(mddev, bio); | ||
1068 | |||
1067 | /* | 1069 | /* |
1068 | * Register the new request and wait if the reconstruction | 1070 | * Register the new request and wait if the reconstruction |
1069 | * thread has put up a bar for new requests. | 1071 | * thread has put up a bar for new requests. |
@@ -1445,8 +1447,6 @@ static void raid10_make_request(struct mddev *mddev, struct bio *bio) | |||
1445 | return; | 1447 | return; |
1446 | } | 1448 | } |
1447 | 1449 | ||
1448 | md_write_start(mddev, bio); | ||
1449 | |||
1450 | do { | 1450 | do { |
1451 | 1451 | ||
1452 | /* | 1452 | /* |
@@ -2465,20 +2465,21 @@ static int narrow_write_error(struct r10bio *r10_bio, int i) | |||
2465 | 2465 | ||
2466 | while (sect_to_write) { | 2466 | while (sect_to_write) { |
2467 | struct bio *wbio; | 2467 | struct bio *wbio; |
2468 | sector_t wsector; | ||
2468 | if (sectors > sect_to_write) | 2469 | if (sectors > sect_to_write) |
2469 | sectors = sect_to_write; | 2470 | sectors = sect_to_write; |
2470 | /* Write at 'sector' for 'sectors' */ | 2471 | /* Write at 'sector' for 'sectors' */ |
2471 | wbio = bio_clone_mddev(bio, GFP_NOIO, mddev); | 2472 | wbio = bio_clone_mddev(bio, GFP_NOIO, mddev); |
2472 | bio_trim(wbio, sector - bio->bi_iter.bi_sector, sectors); | 2473 | bio_trim(wbio, sector - bio->bi_iter.bi_sector, sectors); |
2473 | wbio->bi_iter.bi_sector = (r10_bio->devs[i].addr+ | 2474 | wsector = r10_bio->devs[i].addr + (sector - r10_bio->sector); |
2474 | choose_data_offset(r10_bio, rdev) + | 2475 | wbio->bi_iter.bi_sector = wsector + |
2475 | (sector - r10_bio->sector)); | 2476 | choose_data_offset(r10_bio, rdev); |
2476 | wbio->bi_bdev = rdev->bdev; | 2477 | wbio->bi_bdev = rdev->bdev; |
2477 | bio_set_op_attrs(wbio, REQ_OP_WRITE, 0); | 2478 | bio_set_op_attrs(wbio, REQ_OP_WRITE, 0); |
2478 | 2479 | ||
2479 | if (submit_bio_wait(wbio) < 0) | 2480 | if (submit_bio_wait(wbio) < 0) |
2480 | /* Failure! */ | 2481 | /* Failure! */ |
2481 | ok = rdev_set_badblocks(rdev, sector, | 2482 | ok = rdev_set_badblocks(rdev, wsector, |
2482 | sectors, 0) | 2483 | sectors, 0) |
2483 | && ok; | 2484 | && ok; |
2484 | 2485 | ||
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 8912407a4dd0..da583bb43c84 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -659,6 +659,7 @@ raid5_get_active_stripe(struct r5conf *conf, sector_t sector, | |||
659 | { | 659 | { |
660 | struct stripe_head *sh; | 660 | struct stripe_head *sh; |
661 | int hash = stripe_hash_locks_hash(sector); | 661 | int hash = stripe_hash_locks_hash(sector); |
662 | int inc_empty_inactive_list_flag; | ||
662 | 663 | ||
663 | pr_debug("get_stripe, sector %llu\n", (unsigned long long)sector); | 664 | pr_debug("get_stripe, sector %llu\n", (unsigned long long)sector); |
664 | 665 | ||
@@ -703,7 +704,12 @@ raid5_get_active_stripe(struct r5conf *conf, sector_t sector, | |||
703 | atomic_inc(&conf->active_stripes); | 704 | atomic_inc(&conf->active_stripes); |
704 | BUG_ON(list_empty(&sh->lru) && | 705 | BUG_ON(list_empty(&sh->lru) && |
705 | !test_bit(STRIPE_EXPANDING, &sh->state)); | 706 | !test_bit(STRIPE_EXPANDING, &sh->state)); |
707 | inc_empty_inactive_list_flag = 0; | ||
708 | if (!list_empty(conf->inactive_list + hash)) | ||
709 | inc_empty_inactive_list_flag = 1; | ||
706 | list_del_init(&sh->lru); | 710 | list_del_init(&sh->lru); |
711 | if (list_empty(conf->inactive_list + hash) && inc_empty_inactive_list_flag) | ||
712 | atomic_inc(&conf->empty_inactive_list_nr); | ||
707 | if (sh->group) { | 713 | if (sh->group) { |
708 | sh->group->stripes_cnt--; | 714 | sh->group->stripes_cnt--; |
709 | sh->group = NULL; | 715 | sh->group = NULL; |
@@ -762,6 +768,7 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh | |||
762 | sector_t head_sector, tmp_sec; | 768 | sector_t head_sector, tmp_sec; |
763 | int hash; | 769 | int hash; |
764 | int dd_idx; | 770 | int dd_idx; |
771 | int inc_empty_inactive_list_flag; | ||
765 | 772 | ||
766 | /* Don't cross chunks, so stripe pd_idx/qd_idx is the same */ | 773 | /* Don't cross chunks, so stripe pd_idx/qd_idx is the same */ |
767 | tmp_sec = sh->sector; | 774 | tmp_sec = sh->sector; |
@@ -779,7 +786,12 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh | |||
779 | atomic_inc(&conf->active_stripes); | 786 | atomic_inc(&conf->active_stripes); |
780 | BUG_ON(list_empty(&head->lru) && | 787 | BUG_ON(list_empty(&head->lru) && |
781 | !test_bit(STRIPE_EXPANDING, &head->state)); | 788 | !test_bit(STRIPE_EXPANDING, &head->state)); |
789 | inc_empty_inactive_list_flag = 0; | ||
790 | if (!list_empty(conf->inactive_list + hash)) | ||
791 | inc_empty_inactive_list_flag = 1; | ||
782 | list_del_init(&head->lru); | 792 | list_del_init(&head->lru); |
793 | if (list_empty(conf->inactive_list + hash) && inc_empty_inactive_list_flag) | ||
794 | atomic_inc(&conf->empty_inactive_list_nr); | ||
783 | if (head->group) { | 795 | if (head->group) { |
784 | head->group->stripes_cnt--; | 796 | head->group->stripes_cnt--; |
785 | head->group = NULL; | 797 | head->group = NULL; |
@@ -993,7 +1005,6 @@ again: | |||
993 | 1005 | ||
994 | set_bit(STRIPE_IO_STARTED, &sh->state); | 1006 | set_bit(STRIPE_IO_STARTED, &sh->state); |
995 | 1007 | ||
996 | bio_reset(bi); | ||
997 | bi->bi_bdev = rdev->bdev; | 1008 | bi->bi_bdev = rdev->bdev; |
998 | bio_set_op_attrs(bi, op, op_flags); | 1009 | bio_set_op_attrs(bi, op, op_flags); |
999 | bi->bi_end_io = op_is_write(op) | 1010 | bi->bi_end_io = op_is_write(op) |
@@ -1045,7 +1056,6 @@ again: | |||
1045 | 1056 | ||
1046 | set_bit(STRIPE_IO_STARTED, &sh->state); | 1057 | set_bit(STRIPE_IO_STARTED, &sh->state); |
1047 | 1058 | ||
1048 | bio_reset(rbi); | ||
1049 | rbi->bi_bdev = rrdev->bdev; | 1059 | rbi->bi_bdev = rrdev->bdev; |
1050 | bio_set_op_attrs(rbi, op, op_flags); | 1060 | bio_set_op_attrs(rbi, op, op_flags); |
1051 | BUG_ON(!op_is_write(op)); | 1061 | BUG_ON(!op_is_write(op)); |
@@ -1978,9 +1988,11 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) | |||
1978 | put_cpu(); | 1988 | put_cpu(); |
1979 | } | 1989 | } |
1980 | 1990 | ||
1981 | static struct stripe_head *alloc_stripe(struct kmem_cache *sc, gfp_t gfp) | 1991 | static struct stripe_head *alloc_stripe(struct kmem_cache *sc, gfp_t gfp, |
1992 | int disks) | ||
1982 | { | 1993 | { |
1983 | struct stripe_head *sh; | 1994 | struct stripe_head *sh; |
1995 | int i; | ||
1984 | 1996 | ||
1985 | sh = kmem_cache_zalloc(sc, gfp); | 1997 | sh = kmem_cache_zalloc(sc, gfp); |
1986 | if (sh) { | 1998 | if (sh) { |
@@ -1989,6 +2001,17 @@ static struct stripe_head *alloc_stripe(struct kmem_cache *sc, gfp_t gfp) | |||
1989 | INIT_LIST_HEAD(&sh->batch_list); | 2001 | INIT_LIST_HEAD(&sh->batch_list); |
1990 | INIT_LIST_HEAD(&sh->lru); | 2002 | INIT_LIST_HEAD(&sh->lru); |
1991 | atomic_set(&sh->count, 1); | 2003 | atomic_set(&sh->count, 1); |
2004 | for (i = 0; i < disks; i++) { | ||
2005 | struct r5dev *dev = &sh->dev[i]; | ||
2006 | |||
2007 | bio_init(&dev->req); | ||
2008 | dev->req.bi_io_vec = &dev->vec; | ||
2009 | dev->req.bi_max_vecs = 1; | ||
2010 | |||
2011 | bio_init(&dev->rreq); | ||
2012 | dev->rreq.bi_io_vec = &dev->rvec; | ||
2013 | dev->rreq.bi_max_vecs = 1; | ||
2014 | } | ||
1992 | } | 2015 | } |
1993 | return sh; | 2016 | return sh; |
1994 | } | 2017 | } |
@@ -1996,7 +2019,7 @@ static int grow_one_stripe(struct r5conf *conf, gfp_t gfp) | |||
1996 | { | 2019 | { |
1997 | struct stripe_head *sh; | 2020 | struct stripe_head *sh; |
1998 | 2021 | ||
1999 | sh = alloc_stripe(conf->slab_cache, gfp); | 2022 | sh = alloc_stripe(conf->slab_cache, gfp, conf->pool_size); |
2000 | if (!sh) | 2023 | if (!sh) |
2001 | return 0; | 2024 | return 0; |
2002 | 2025 | ||
@@ -2167,7 +2190,7 @@ static int resize_stripes(struct r5conf *conf, int newsize) | |||
2167 | mutex_lock(&conf->cache_size_mutex); | 2190 | mutex_lock(&conf->cache_size_mutex); |
2168 | 2191 | ||
2169 | for (i = conf->max_nr_stripes; i; i--) { | 2192 | for (i = conf->max_nr_stripes; i; i--) { |
2170 | nsh = alloc_stripe(sc, GFP_KERNEL); | 2193 | nsh = alloc_stripe(sc, GFP_KERNEL, newsize); |
2171 | if (!nsh) | 2194 | if (!nsh) |
2172 | break; | 2195 | break; |
2173 | 2196 | ||
@@ -2299,6 +2322,7 @@ static void raid5_end_read_request(struct bio * bi) | |||
2299 | (unsigned long long)sh->sector, i, atomic_read(&sh->count), | 2322 | (unsigned long long)sh->sector, i, atomic_read(&sh->count), |
2300 | bi->bi_error); | 2323 | bi->bi_error); |
2301 | if (i == disks) { | 2324 | if (i == disks) { |
2325 | bio_reset(bi); | ||
2302 | BUG(); | 2326 | BUG(); |
2303 | return; | 2327 | return; |
2304 | } | 2328 | } |
@@ -2402,6 +2426,7 @@ static void raid5_end_read_request(struct bio * bi) | |||
2402 | clear_bit(R5_LOCKED, &sh->dev[i].flags); | 2426 | clear_bit(R5_LOCKED, &sh->dev[i].flags); |
2403 | set_bit(STRIPE_HANDLE, &sh->state); | 2427 | set_bit(STRIPE_HANDLE, &sh->state); |
2404 | raid5_release_stripe(sh); | 2428 | raid5_release_stripe(sh); |
2429 | bio_reset(bi); | ||
2405 | } | 2430 | } |
2406 | 2431 | ||
2407 | static void raid5_end_write_request(struct bio *bi) | 2432 | static void raid5_end_write_request(struct bio *bi) |
@@ -2436,6 +2461,7 @@ static void raid5_end_write_request(struct bio *bi) | |||
2436 | (unsigned long long)sh->sector, i, atomic_read(&sh->count), | 2461 | (unsigned long long)sh->sector, i, atomic_read(&sh->count), |
2437 | bi->bi_error); | 2462 | bi->bi_error); |
2438 | if (i == disks) { | 2463 | if (i == disks) { |
2464 | bio_reset(bi); | ||
2439 | BUG(); | 2465 | BUG(); |
2440 | return; | 2466 | return; |
2441 | } | 2467 | } |
@@ -2479,22 +2505,13 @@ static void raid5_end_write_request(struct bio *bi) | |||
2479 | 2505 | ||
2480 | if (sh->batch_head && sh != sh->batch_head) | 2506 | if (sh->batch_head && sh != sh->batch_head) |
2481 | raid5_release_stripe(sh->batch_head); | 2507 | raid5_release_stripe(sh->batch_head); |
2508 | bio_reset(bi); | ||
2482 | } | 2509 | } |
2483 | 2510 | ||
2484 | static void raid5_build_block(struct stripe_head *sh, int i, int previous) | 2511 | static void raid5_build_block(struct stripe_head *sh, int i, int previous) |
2485 | { | 2512 | { |
2486 | struct r5dev *dev = &sh->dev[i]; | 2513 | struct r5dev *dev = &sh->dev[i]; |
2487 | 2514 | ||
2488 | bio_init(&dev->req); | ||
2489 | dev->req.bi_io_vec = &dev->vec; | ||
2490 | dev->req.bi_max_vecs = 1; | ||
2491 | dev->req.bi_private = sh; | ||
2492 | |||
2493 | bio_init(&dev->rreq); | ||
2494 | dev->rreq.bi_io_vec = &dev->rvec; | ||
2495 | dev->rreq.bi_max_vecs = 1; | ||
2496 | dev->rreq.bi_private = sh; | ||
2497 | |||
2498 | dev->flags = 0; | 2515 | dev->flags = 0; |
2499 | dev->sector = raid5_compute_blocknr(sh, i, previous); | 2516 | dev->sector = raid5_compute_blocknr(sh, i, previous); |
2500 | } | 2517 | } |
@@ -4628,7 +4645,9 @@ finish: | |||
4628 | } | 4645 | } |
4629 | 4646 | ||
4630 | if (!bio_list_empty(&s.return_bi)) { | 4647 | if (!bio_list_empty(&s.return_bi)) { |
4631 | if (test_bit(MD_CHANGE_PENDING, &conf->mddev->flags)) { | 4648 | if (test_bit(MD_CHANGE_PENDING, &conf->mddev->flags) && |
4649 | (s.failed <= conf->max_degraded || | ||
4650 | conf->mddev->external == 0)) { | ||
4632 | spin_lock_irq(&conf->device_lock); | 4651 | spin_lock_irq(&conf->device_lock); |
4633 | bio_list_merge(&conf->return_bi, &s.return_bi); | 4652 | bio_list_merge(&conf->return_bi, &s.return_bi); |
4634 | spin_unlock_irq(&conf->device_lock); | 4653 | spin_unlock_irq(&conf->device_lock); |
@@ -6826,11 +6845,14 @@ static int raid5_run(struct mddev *mddev) | |||
6826 | if (IS_ERR(conf)) | 6845 | if (IS_ERR(conf)) |
6827 | return PTR_ERR(conf); | 6846 | return PTR_ERR(conf); |
6828 | 6847 | ||
6829 | if (test_bit(MD_HAS_JOURNAL, &mddev->flags) && !journal_dev) { | 6848 | if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) { |
6830 | printk(KERN_ERR "md/raid:%s: journal disk is missing, force array readonly\n", | 6849 | if (!journal_dev) { |
6831 | mdname(mddev)); | 6850 | pr_err("md/raid:%s: journal disk is missing, force array readonly\n", |
6832 | mddev->ro = 1; | 6851 | mdname(mddev)); |
6833 | set_disk_ro(mddev->gendisk, 1); | 6852 | mddev->ro = 1; |
6853 | set_disk_ro(mddev->gendisk, 1); | ||
6854 | } else if (mddev->recovery_cp == MaxSector) | ||
6855 | set_bit(MD_JOURNAL_CLEAN, &mddev->flags); | ||
6834 | } | 6856 | } |
6835 | 6857 | ||
6836 | conf->min_offset_diff = min_offset_diff; | 6858 | conf->min_offset_diff = min_offset_diff; |
diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c index 869c83fb3c5d..f00f3e742265 100644 --- a/drivers/memory/omap-gpmc.c +++ b/drivers/memory/omap-gpmc.c | |||
@@ -2185,7 +2185,7 @@ static int gpmc_probe_dt(struct platform_device *pdev) | |||
2185 | return 0; | 2185 | return 0; |
2186 | } | 2186 | } |
2187 | 2187 | ||
2188 | static int gpmc_probe_dt_children(struct platform_device *pdev) | 2188 | static void gpmc_probe_dt_children(struct platform_device *pdev) |
2189 | { | 2189 | { |
2190 | int ret; | 2190 | int ret; |
2191 | struct device_node *child; | 2191 | struct device_node *child; |
@@ -2200,11 +2200,11 @@ static int gpmc_probe_dt_children(struct platform_device *pdev) | |||
2200 | else | 2200 | else |
2201 | ret = gpmc_probe_generic_child(pdev, child); | 2201 | ret = gpmc_probe_generic_child(pdev, child); |
2202 | 2202 | ||
2203 | if (ret) | 2203 | if (ret) { |
2204 | return ret; | 2204 | dev_err(&pdev->dev, "failed to probe DT child '%s': %d\n", |
2205 | child->name, ret); | ||
2206 | } | ||
2205 | } | 2207 | } |
2206 | |||
2207 | return 0; | ||
2208 | } | 2208 | } |
2209 | #else | 2209 | #else |
2210 | static int gpmc_probe_dt(struct platform_device *pdev) | 2210 | static int gpmc_probe_dt(struct platform_device *pdev) |
@@ -2212,9 +2212,8 @@ static int gpmc_probe_dt(struct platform_device *pdev) | |||
2212 | return 0; | 2212 | return 0; |
2213 | } | 2213 | } |
2214 | 2214 | ||
2215 | static int gpmc_probe_dt_children(struct platform_device *pdev) | 2215 | static void gpmc_probe_dt_children(struct platform_device *pdev) |
2216 | { | 2216 | { |
2217 | return 0; | ||
2218 | } | 2217 | } |
2219 | #endif /* CONFIG_OF */ | 2218 | #endif /* CONFIG_OF */ |
2220 | 2219 | ||
@@ -2369,16 +2368,10 @@ static int gpmc_probe(struct platform_device *pdev) | |||
2369 | goto setup_irq_failed; | 2368 | goto setup_irq_failed; |
2370 | } | 2369 | } |
2371 | 2370 | ||
2372 | rc = gpmc_probe_dt_children(pdev); | 2371 | gpmc_probe_dt_children(pdev); |
2373 | if (rc < 0) { | ||
2374 | dev_err(gpmc->dev, "failed to probe DT children\n"); | ||
2375 | goto dt_children_failed; | ||
2376 | } | ||
2377 | 2372 | ||
2378 | return 0; | 2373 | return 0; |
2379 | 2374 | ||
2380 | dt_children_failed: | ||
2381 | gpmc_free_irq(gpmc); | ||
2382 | setup_irq_failed: | 2375 | setup_irq_failed: |
2383 | gpmc_gpio_exit(gpmc); | 2376 | gpmc_gpio_exit(gpmc); |
2384 | gpio_init_failed: | 2377 | gpio_init_failed: |
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index a216b4667742..d00252828966 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig | |||
@@ -345,16 +345,6 @@ config SENSORS_TSL2550 | |||
345 | This driver can also be built as a module. If so, the module | 345 | This driver can also be built as a module. If so, the module |
346 | will be called tsl2550. | 346 | will be called tsl2550. |
347 | 347 | ||
348 | config SENSORS_BH1780 | ||
349 | tristate "ROHM BH1780GLI ambient light sensor" | ||
350 | depends on I2C && SYSFS | ||
351 | help | ||
352 | If you say yes here you get support for the ROHM BH1780GLI | ||
353 | ambient light sensor. | ||
354 | |||
355 | This driver can also be built as a module. If so, the module | ||
356 | will be called bh1780gli. | ||
357 | |||
358 | config SENSORS_BH1770 | 348 | config SENSORS_BH1770 |
359 | tristate "BH1770GLC / SFH7770 combined ALS - Proximity sensor" | 349 | tristate "BH1770GLC / SFH7770 combined ALS - Proximity sensor" |
360 | depends on I2C | 350 | depends on I2C |
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 7410c6d9a34d..fb32516ddfe2 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile | |||
@@ -19,7 +19,6 @@ obj-$(CONFIG_TIFM_CORE) += tifm_core.o | |||
19 | obj-$(CONFIG_TIFM_7XX1) += tifm_7xx1.o | 19 | obj-$(CONFIG_TIFM_7XX1) += tifm_7xx1.o |
20 | obj-$(CONFIG_PHANTOM) += phantom.o | 20 | obj-$(CONFIG_PHANTOM) += phantom.o |
21 | obj-$(CONFIG_QCOM_COINCELL) += qcom-coincell.o | 21 | obj-$(CONFIG_QCOM_COINCELL) += qcom-coincell.o |
22 | obj-$(CONFIG_SENSORS_BH1780) += bh1780gli.o | ||
23 | obj-$(CONFIG_SENSORS_BH1770) += bh1770glc.o | 22 | obj-$(CONFIG_SENSORS_BH1770) += bh1770glc.o |
24 | obj-$(CONFIG_SENSORS_APDS990X) += apds990x.o | 23 | obj-$(CONFIG_SENSORS_APDS990X) += apds990x.o |
25 | obj-$(CONFIG_SGI_IOC4) += ioc4.o | 24 | obj-$(CONFIG_SGI_IOC4) += ioc4.o |
diff --git a/drivers/misc/bh1780gli.c b/drivers/misc/bh1780gli.c deleted file mode 100644 index 7f90ce5a569a..000000000000 --- a/drivers/misc/bh1780gli.c +++ /dev/null | |||
@@ -1,259 +0,0 @@ | |||
1 | /* | ||
2 | * bh1780gli.c | ||
3 | * ROHM Ambient Light Sensor Driver | ||
4 | * | ||
5 | * Copyright (C) 2010 Texas Instruments | ||
6 | * Author: Hemanth V <hemanthv@ti.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License version 2 as published by | ||
10 | * the Free Software Foundation. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
13 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
14 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
15 | * more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License along with | ||
18 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
19 | */ | ||
20 | #include <linux/i2c.h> | ||
21 | #include <linux/slab.h> | ||
22 | #include <linux/mutex.h> | ||
23 | #include <linux/platform_device.h> | ||
24 | #include <linux/delay.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/of.h> | ||
27 | |||
28 | #define BH1780_REG_CONTROL 0x80 | ||
29 | #define BH1780_REG_PARTID 0x8A | ||
30 | #define BH1780_REG_MANFID 0x8B | ||
31 | #define BH1780_REG_DLOW 0x8C | ||
32 | #define BH1780_REG_DHIGH 0x8D | ||
33 | |||
34 | #define BH1780_REVMASK (0xf) | ||
35 | #define BH1780_POWMASK (0x3) | ||
36 | #define BH1780_POFF (0x0) | ||
37 | #define BH1780_PON (0x3) | ||
38 | |||
39 | /* power on settling time in ms */ | ||
40 | #define BH1780_PON_DELAY 2 | ||
41 | |||
42 | struct bh1780_data { | ||
43 | struct i2c_client *client; | ||
44 | int power_state; | ||
45 | /* lock for sysfs operations */ | ||
46 | struct mutex lock; | ||
47 | }; | ||
48 | |||
49 | static int bh1780_write(struct bh1780_data *ddata, u8 reg, u8 val, char *msg) | ||
50 | { | ||
51 | int ret = i2c_smbus_write_byte_data(ddata->client, reg, val); | ||
52 | if (ret < 0) | ||
53 | dev_err(&ddata->client->dev, | ||
54 | "i2c_smbus_write_byte_data failed error %d Register (%s)\n", | ||
55 | ret, msg); | ||
56 | return ret; | ||
57 | } | ||
58 | |||
59 | static int bh1780_read(struct bh1780_data *ddata, u8 reg, char *msg) | ||
60 | { | ||
61 | int ret = i2c_smbus_read_byte_data(ddata->client, reg); | ||
62 | if (ret < 0) | ||
63 | dev_err(&ddata->client->dev, | ||
64 | "i2c_smbus_read_byte_data failed error %d Register (%s)\n", | ||
65 | ret, msg); | ||
66 | return ret; | ||
67 | } | ||
68 | |||
69 | static ssize_t bh1780_show_lux(struct device *dev, | ||
70 | struct device_attribute *attr, char *buf) | ||
71 | { | ||
72 | struct platform_device *pdev = to_platform_device(dev); | ||
73 | struct bh1780_data *ddata = platform_get_drvdata(pdev); | ||
74 | int lsb, msb; | ||
75 | |||
76 | lsb = bh1780_read(ddata, BH1780_REG_DLOW, "DLOW"); | ||
77 | if (lsb < 0) | ||
78 | return lsb; | ||
79 | |||
80 | msb = bh1780_read(ddata, BH1780_REG_DHIGH, "DHIGH"); | ||
81 | if (msb < 0) | ||
82 | return msb; | ||
83 | |||
84 | return sprintf(buf, "%d\n", (msb << 8) | lsb); | ||
85 | } | ||
86 | |||
87 | static ssize_t bh1780_show_power_state(struct device *dev, | ||
88 | struct device_attribute *attr, | ||
89 | char *buf) | ||
90 | { | ||
91 | struct platform_device *pdev = to_platform_device(dev); | ||
92 | struct bh1780_data *ddata = platform_get_drvdata(pdev); | ||
93 | int state; | ||
94 | |||
95 | state = bh1780_read(ddata, BH1780_REG_CONTROL, "CONTROL"); | ||
96 | if (state < 0) | ||
97 | return state; | ||
98 | |||
99 | return sprintf(buf, "%d\n", state & BH1780_POWMASK); | ||
100 | } | ||
101 | |||
102 | static ssize_t bh1780_store_power_state(struct device *dev, | ||
103 | struct device_attribute *attr, | ||
104 | const char *buf, size_t count) | ||
105 | { | ||
106 | struct platform_device *pdev = to_platform_device(dev); | ||
107 | struct bh1780_data *ddata = platform_get_drvdata(pdev); | ||
108 | unsigned long val; | ||
109 | int error; | ||
110 | |||
111 | error = kstrtoul(buf, 0, &val); | ||
112 | if (error) | ||
113 | return error; | ||
114 | |||
115 | if (val < BH1780_POFF || val > BH1780_PON) | ||
116 | return -EINVAL; | ||
117 | |||
118 | mutex_lock(&ddata->lock); | ||
119 | |||
120 | error = bh1780_write(ddata, BH1780_REG_CONTROL, val, "CONTROL"); | ||
121 | if (error < 0) { | ||
122 | mutex_unlock(&ddata->lock); | ||
123 | return error; | ||
124 | } | ||
125 | |||
126 | msleep(BH1780_PON_DELAY); | ||
127 | ddata->power_state = val; | ||
128 | mutex_unlock(&ddata->lock); | ||
129 | |||
130 | return count; | ||
131 | } | ||
132 | |||
133 | static DEVICE_ATTR(lux, S_IRUGO, bh1780_show_lux, NULL); | ||
134 | |||
135 | static DEVICE_ATTR(power_state, S_IWUSR | S_IRUGO, | ||
136 | bh1780_show_power_state, bh1780_store_power_state); | ||
137 | |||
138 | static struct attribute *bh1780_attributes[] = { | ||
139 | &dev_attr_power_state.attr, | ||
140 | &dev_attr_lux.attr, | ||
141 | NULL | ||
142 | }; | ||
143 | |||
144 | static const struct attribute_group bh1780_attr_group = { | ||
145 | .attrs = bh1780_attributes, | ||
146 | }; | ||
147 | |||
148 | static int bh1780_probe(struct i2c_client *client, | ||
149 | const struct i2c_device_id *id) | ||
150 | { | ||
151 | int ret; | ||
152 | struct bh1780_data *ddata; | ||
153 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); | ||
154 | |||
155 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE)) | ||
156 | return -EIO; | ||
157 | |||
158 | ddata = devm_kzalloc(&client->dev, sizeof(struct bh1780_data), | ||
159 | GFP_KERNEL); | ||
160 | if (ddata == NULL) | ||
161 | return -ENOMEM; | ||
162 | |||
163 | ddata->client = client; | ||
164 | i2c_set_clientdata(client, ddata); | ||
165 | |||
166 | ret = bh1780_read(ddata, BH1780_REG_PARTID, "PART ID"); | ||
167 | if (ret < 0) | ||
168 | return ret; | ||
169 | |||
170 | dev_info(&client->dev, "Ambient Light Sensor, Rev : %d\n", | ||
171 | (ret & BH1780_REVMASK)); | ||
172 | |||
173 | mutex_init(&ddata->lock); | ||
174 | |||
175 | return sysfs_create_group(&client->dev.kobj, &bh1780_attr_group); | ||
176 | } | ||
177 | |||
178 | static int bh1780_remove(struct i2c_client *client) | ||
179 | { | ||
180 | sysfs_remove_group(&client->dev.kobj, &bh1780_attr_group); | ||
181 | |||
182 | return 0; | ||
183 | } | ||
184 | |||
185 | #ifdef CONFIG_PM_SLEEP | ||
186 | static int bh1780_suspend(struct device *dev) | ||
187 | { | ||
188 | struct bh1780_data *ddata; | ||
189 | int state, ret; | ||
190 | struct i2c_client *client = to_i2c_client(dev); | ||
191 | |||
192 | ddata = i2c_get_clientdata(client); | ||
193 | state = bh1780_read(ddata, BH1780_REG_CONTROL, "CONTROL"); | ||
194 | if (state < 0) | ||
195 | return state; | ||
196 | |||
197 | ddata->power_state = state & BH1780_POWMASK; | ||
198 | |||
199 | ret = bh1780_write(ddata, BH1780_REG_CONTROL, BH1780_POFF, | ||
200 | "CONTROL"); | ||
201 | |||
202 | if (ret < 0) | ||
203 | return ret; | ||
204 | |||
205 | return 0; | ||
206 | } | ||
207 | |||
208 | static int bh1780_resume(struct device *dev) | ||
209 | { | ||
210 | struct bh1780_data *ddata; | ||
211 | int state, ret; | ||
212 | struct i2c_client *client = to_i2c_client(dev); | ||
213 | |||
214 | ddata = i2c_get_clientdata(client); | ||
215 | state = ddata->power_state; | ||
216 | ret = bh1780_write(ddata, BH1780_REG_CONTROL, state, | ||
217 | "CONTROL"); | ||
218 | |||
219 | if (ret < 0) | ||
220 | return ret; | ||
221 | |||
222 | return 0; | ||
223 | } | ||
224 | #endif /* CONFIG_PM_SLEEP */ | ||
225 | |||
226 | static SIMPLE_DEV_PM_OPS(bh1780_pm, bh1780_suspend, bh1780_resume); | ||
227 | |||
228 | static const struct i2c_device_id bh1780_id[] = { | ||
229 | { "bh1780", 0 }, | ||
230 | { }, | ||
231 | }; | ||
232 | |||
233 | MODULE_DEVICE_TABLE(i2c, bh1780_id); | ||
234 | |||
235 | #ifdef CONFIG_OF | ||
236 | static const struct of_device_id of_bh1780_match[] = { | ||
237 | { .compatible = "rohm,bh1780gli", }, | ||
238 | {}, | ||
239 | }; | ||
240 | |||
241 | MODULE_DEVICE_TABLE(of, of_bh1780_match); | ||
242 | #endif | ||
243 | |||
244 | static struct i2c_driver bh1780_driver = { | ||
245 | .probe = bh1780_probe, | ||
246 | .remove = bh1780_remove, | ||
247 | .id_table = bh1780_id, | ||
248 | .driver = { | ||
249 | .name = "bh1780", | ||
250 | .pm = &bh1780_pm, | ||
251 | .of_match_table = of_match_ptr(of_bh1780_match), | ||
252 | }, | ||
253 | }; | ||
254 | |||
255 | module_i2c_driver(bh1780_driver); | ||
256 | |||
257 | MODULE_DESCRIPTION("BH1780GLI Ambient Light Sensor Driver"); | ||
258 | MODULE_LICENSE("GPL"); | ||
259 | MODULE_AUTHOR("Hemanth V <hemanthv@ti.com>"); | ||
diff --git a/drivers/misc/cxl/vphb.c b/drivers/misc/cxl/vphb.c index 7ada5f1b7bb6..3519acebfdab 100644 --- a/drivers/misc/cxl/vphb.c +++ b/drivers/misc/cxl/vphb.c | |||
@@ -230,6 +230,11 @@ int cxl_pci_vphb_add(struct cxl_afu *afu) | |||
230 | if (phb->bus == NULL) | 230 | if (phb->bus == NULL) |
231 | return -ENXIO; | 231 | return -ENXIO; |
232 | 232 | ||
233 | /* Set release hook on root bus */ | ||
234 | pci_set_host_bridge_release(to_pci_host_bridge(phb->bus->bridge), | ||
235 | pcibios_free_controller_deferred, | ||
236 | (void *) phb); | ||
237 | |||
233 | /* Claim resources. This might need some rework as well depending | 238 | /* Claim resources. This might need some rework as well depending |
234 | * whether we are doing probe-only or not, like assigning unassigned | 239 | * whether we are doing probe-only or not, like assigning unassigned |
235 | * resources etc... | 240 | * resources etc... |
@@ -256,7 +261,10 @@ void cxl_pci_vphb_remove(struct cxl_afu *afu) | |||
256 | afu->phb = NULL; | 261 | afu->phb = NULL; |
257 | 262 | ||
258 | pci_remove_root_bus(phb->bus); | 263 | pci_remove_root_bus(phb->bus); |
259 | pcibios_free_controller(phb); | 264 | /* |
265 | * We don't free phb here - that's handled by | ||
266 | * pcibios_free_controller_deferred() | ||
267 | */ | ||
260 | } | 268 | } |
261 | 269 | ||
262 | static bool _cxl_pci_is_vphb_device(struct pci_controller *phb) | 270 | static bool _cxl_pci_is_vphb_device(struct pci_controller *phb) |
diff --git a/drivers/misc/lkdtm_rodata.c b/drivers/misc/lkdtm_rodata.c index 166b1db3969f..3564477b8c2d 100644 --- a/drivers/misc/lkdtm_rodata.c +++ b/drivers/misc/lkdtm_rodata.c | |||
@@ -4,7 +4,7 @@ | |||
4 | */ | 4 | */ |
5 | #include "lkdtm.h" | 5 | #include "lkdtm.h" |
6 | 6 | ||
7 | void lkdtm_rodata_do_nothing(void) | 7 | void notrace lkdtm_rodata_do_nothing(void) |
8 | { | 8 | { |
9 | /* Does nothing. We just want an architecture agnostic "return". */ | 9 | /* Does nothing. We just want an architecture agnostic "return". */ |
10 | } | 10 | } |
diff --git a/drivers/misc/lkdtm_usercopy.c b/drivers/misc/lkdtm_usercopy.c index 5525a204db93..1dd611423d8b 100644 --- a/drivers/misc/lkdtm_usercopy.c +++ b/drivers/misc/lkdtm_usercopy.c | |||
@@ -9,7 +9,15 @@ | |||
9 | #include <linux/uaccess.h> | 9 | #include <linux/uaccess.h> |
10 | #include <asm/cacheflush.h> | 10 | #include <asm/cacheflush.h> |
11 | 11 | ||
12 | static size_t cache_size = 1024; | 12 | /* |
13 | * Many of the tests here end up using const sizes, but those would | ||
14 | * normally be ignored by hardened usercopy, so force the compiler | ||
15 | * into choosing the non-const path to make sure we trigger the | ||
16 | * hardened usercopy checks by added "unconst" to all the const copies, | ||
17 | * and making sure "cache_size" isn't optimized into a const. | ||
18 | */ | ||
19 | static volatile size_t unconst = 0; | ||
20 | static volatile size_t cache_size = 1024; | ||
13 | static struct kmem_cache *bad_cache; | 21 | static struct kmem_cache *bad_cache; |
14 | 22 | ||
15 | static const unsigned char test_text[] = "This is a test.\n"; | 23 | static const unsigned char test_text[] = "This is a test.\n"; |
@@ -67,14 +75,14 @@ static noinline void do_usercopy_stack(bool to_user, bool bad_frame) | |||
67 | if (to_user) { | 75 | if (to_user) { |
68 | pr_info("attempting good copy_to_user of local stack\n"); | 76 | pr_info("attempting good copy_to_user of local stack\n"); |
69 | if (copy_to_user((void __user *)user_addr, good_stack, | 77 | if (copy_to_user((void __user *)user_addr, good_stack, |
70 | sizeof(good_stack))) { | 78 | unconst + sizeof(good_stack))) { |
71 | pr_warn("copy_to_user failed unexpectedly?!\n"); | 79 | pr_warn("copy_to_user failed unexpectedly?!\n"); |
72 | goto free_user; | 80 | goto free_user; |
73 | } | 81 | } |
74 | 82 | ||
75 | pr_info("attempting bad copy_to_user of distant stack\n"); | 83 | pr_info("attempting bad copy_to_user of distant stack\n"); |
76 | if (copy_to_user((void __user *)user_addr, bad_stack, | 84 | if (copy_to_user((void __user *)user_addr, bad_stack, |
77 | sizeof(good_stack))) { | 85 | unconst + sizeof(good_stack))) { |
78 | pr_warn("copy_to_user failed, but lacked Oops\n"); | 86 | pr_warn("copy_to_user failed, but lacked Oops\n"); |
79 | goto free_user; | 87 | goto free_user; |
80 | } | 88 | } |
@@ -88,14 +96,14 @@ static noinline void do_usercopy_stack(bool to_user, bool bad_frame) | |||
88 | 96 | ||
89 | pr_info("attempting good copy_from_user of local stack\n"); | 97 | pr_info("attempting good copy_from_user of local stack\n"); |
90 | if (copy_from_user(good_stack, (void __user *)user_addr, | 98 | if (copy_from_user(good_stack, (void __user *)user_addr, |
91 | sizeof(good_stack))) { | 99 | unconst + sizeof(good_stack))) { |
92 | pr_warn("copy_from_user failed unexpectedly?!\n"); | 100 | pr_warn("copy_from_user failed unexpectedly?!\n"); |
93 | goto free_user; | 101 | goto free_user; |
94 | } | 102 | } |
95 | 103 | ||
96 | pr_info("attempting bad copy_from_user of distant stack\n"); | 104 | pr_info("attempting bad copy_from_user of distant stack\n"); |
97 | if (copy_from_user(bad_stack, (void __user *)user_addr, | 105 | if (copy_from_user(bad_stack, (void __user *)user_addr, |
98 | sizeof(good_stack))) { | 106 | unconst + sizeof(good_stack))) { |
99 | pr_warn("copy_from_user failed, but lacked Oops\n"); | 107 | pr_warn("copy_from_user failed, but lacked Oops\n"); |
100 | goto free_user; | 108 | goto free_user; |
101 | } | 109 | } |
@@ -109,7 +117,7 @@ static void do_usercopy_heap_size(bool to_user) | |||
109 | { | 117 | { |
110 | unsigned long user_addr; | 118 | unsigned long user_addr; |
111 | unsigned char *one, *two; | 119 | unsigned char *one, *two; |
112 | const size_t size = 1024; | 120 | size_t size = unconst + 1024; |
113 | 121 | ||
114 | one = kmalloc(size, GFP_KERNEL); | 122 | one = kmalloc(size, GFP_KERNEL); |
115 | two = kmalloc(size, GFP_KERNEL); | 123 | two = kmalloc(size, GFP_KERNEL); |
@@ -285,13 +293,14 @@ void lkdtm_USERCOPY_KERNEL(void) | |||
285 | 293 | ||
286 | pr_info("attempting good copy_to_user from kernel rodata\n"); | 294 | pr_info("attempting good copy_to_user from kernel rodata\n"); |
287 | if (copy_to_user((void __user *)user_addr, test_text, | 295 | if (copy_to_user((void __user *)user_addr, test_text, |
288 | sizeof(test_text))) { | 296 | unconst + sizeof(test_text))) { |
289 | pr_warn("copy_to_user failed unexpectedly?!\n"); | 297 | pr_warn("copy_to_user failed unexpectedly?!\n"); |
290 | goto free_user; | 298 | goto free_user; |
291 | } | 299 | } |
292 | 300 | ||
293 | pr_info("attempting bad copy_to_user from kernel text\n"); | 301 | pr_info("attempting bad copy_to_user from kernel text\n"); |
294 | if (copy_to_user((void __user *)user_addr, vm_mmap, PAGE_SIZE)) { | 302 | if (copy_to_user((void __user *)user_addr, vm_mmap, |
303 | unconst + PAGE_SIZE)) { | ||
295 | pr_warn("copy_to_user failed, but lacked Oops\n"); | 304 | pr_warn("copy_to_user failed, but lacked Oops\n"); |
296 | goto free_user; | 305 | goto free_user; |
297 | } | 306 | } |
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index e2fb44cc5c37..dc3a854e02d3 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c | |||
@@ -1263,8 +1263,14 @@ static bool mei_me_fw_type_nm(struct pci_dev *pdev) | |||
1263 | static bool mei_me_fw_type_sps(struct pci_dev *pdev) | 1263 | static bool mei_me_fw_type_sps(struct pci_dev *pdev) |
1264 | { | 1264 | { |
1265 | u32 reg; | 1265 | u32 reg; |
1266 | /* Read ME FW Status check for SPS Firmware */ | 1266 | unsigned int devfn; |
1267 | pci_read_config_dword(pdev, PCI_CFG_HFS_1, ®); | 1267 | |
1268 | /* | ||
1269 | * Read ME FW Status register to check for SPS Firmware | ||
1270 | * The SPS FW is only signaled in pci function 0 | ||
1271 | */ | ||
1272 | devfn = PCI_DEVFN(PCI_SLOT(pdev->devfn), 0); | ||
1273 | pci_bus_read_config_dword(pdev->bus, devfn, PCI_CFG_HFS_1, ®); | ||
1268 | trace_mei_pci_cfg_read(&pdev->dev, "PCI_CFG_HFS_1", PCI_CFG_HFS_1, reg); | 1274 | trace_mei_pci_cfg_read(&pdev->dev, "PCI_CFG_HFS_1", PCI_CFG_HFS_1, reg); |
1269 | /* if bits [19:16] = 15, running SPS Firmware */ | 1275 | /* if bits [19:16] = 15, running SPS Firmware */ |
1270 | return (reg & 0xf0000) == 0xf0000; | 1276 | return (reg & 0xf0000) == 0xf0000; |
diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index 64e64da6da44..71cea9b296b2 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c | |||
@@ -85,8 +85,8 @@ static const struct pci_device_id mei_me_pci_tbl[] = { | |||
85 | 85 | ||
86 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT, mei_me_pch8_cfg)}, | 86 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT, mei_me_pch8_cfg)}, |
87 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_2, mei_me_pch8_cfg)}, | 87 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_2, mei_me_pch8_cfg)}, |
88 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_H, mei_me_pch8_cfg)}, | 88 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_H, mei_me_pch8_sps_cfg)}, |
89 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_H_2, mei_me_pch8_cfg)}, | 89 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_H_2, mei_me_pch8_sps_cfg)}, |
90 | 90 | ||
91 | {MEI_PCI_DEVICE(MEI_DEV_ID_BXT_M, mei_me_pch8_cfg)}, | 91 | {MEI_PCI_DEVICE(MEI_DEV_ID_BXT_M, mei_me_pch8_cfg)}, |
92 | {MEI_PCI_DEVICE(MEI_DEV_ID_APL_I, mei_me_pch8_cfg)}, | 92 | {MEI_PCI_DEVICE(MEI_DEV_ID_APL_I, mei_me_pch8_cfg)}, |
diff --git a/drivers/net/dsa/bcm_sf2.h b/drivers/net/dsa/bcm_sf2.h index 463bed8cbe4c..dd446e466699 100644 --- a/drivers/net/dsa/bcm_sf2.h +++ b/drivers/net/dsa/bcm_sf2.h | |||
@@ -205,8 +205,8 @@ static inline void name##_writeq(struct bcm_sf2_priv *priv, u64 val, \ | |||
205 | static inline void intrl2_##which##_mask_clear(struct bcm_sf2_priv *priv, \ | 205 | static inline void intrl2_##which##_mask_clear(struct bcm_sf2_priv *priv, \ |
206 | u32 mask) \ | 206 | u32 mask) \ |
207 | { \ | 207 | { \ |
208 | intrl2_##which##_writel(priv, mask, INTRL2_CPU_MASK_CLEAR); \ | ||
209 | priv->irq##which##_mask &= ~(mask); \ | 208 | priv->irq##which##_mask &= ~(mask); \ |
209 | intrl2_##which##_writel(priv, mask, INTRL2_CPU_MASK_CLEAR); \ | ||
210 | } \ | 210 | } \ |
211 | static inline void intrl2_##which##_mask_set(struct bcm_sf2_priv *priv, \ | 211 | static inline void intrl2_##which##_mask_set(struct bcm_sf2_priv *priv, \ |
212 | u32 mask) \ | 212 | u32 mask) \ |
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index d1d9d3cf9139..710679067594 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c | |||
@@ -2656,15 +2656,19 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) | |||
2656 | return ret; | 2656 | return ret; |
2657 | } | 2657 | } |
2658 | 2658 | ||
2659 | /* Rate Control: disable ingress rate limiting. */ | ||
2659 | if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) || | 2660 | if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) || |
2660 | mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) || | 2661 | mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) || |
2661 | mv88e6xxx_6185_family(chip) || mv88e6xxx_6095_family(chip) || | ||
2662 | mv88e6xxx_6320_family(chip)) { | 2662 | mv88e6xxx_6320_family(chip)) { |
2663 | /* Rate Control: disable ingress rate limiting. */ | ||
2664 | ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), | 2663 | ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), |
2665 | PORT_RATE_CONTROL, 0x0001); | 2664 | PORT_RATE_CONTROL, 0x0001); |
2666 | if (ret) | 2665 | if (ret) |
2667 | return ret; | 2666 | return ret; |
2667 | } else if (mv88e6xxx_6185_family(chip) || mv88e6xxx_6095_family(chip)) { | ||
2668 | ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), | ||
2669 | PORT_RATE_CONTROL, 0x0000); | ||
2670 | if (ret) | ||
2671 | return ret; | ||
2668 | } | 2672 | } |
2669 | 2673 | ||
2670 | /* Port Control 1: disable trunking, disable sending | 2674 | /* Port Control 1: disable trunking, disable sending |
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c index 6453148d066a..4eb17daefc4f 100644 --- a/drivers/net/ethernet/atheros/alx/main.c +++ b/drivers/net/ethernet/atheros/alx/main.c | |||
@@ -1545,6 +1545,8 @@ static const struct pci_device_id alx_pci_tbl[] = { | |||
1545 | .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, | 1545 | .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, |
1546 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_E2400), | 1546 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_E2400), |
1547 | .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, | 1547 | .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, |
1548 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_E2500), | ||
1549 | .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, | ||
1548 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_AR8162), | 1550 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_AR8162), |
1549 | .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, | 1551 | .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, |
1550 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_AR8171) }, | 1552 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_AR8171) }, |
diff --git a/drivers/net/ethernet/atheros/alx/reg.h b/drivers/net/ethernet/atheros/alx/reg.h index 0959e6824cb6..1fc2d852249f 100644 --- a/drivers/net/ethernet/atheros/alx/reg.h +++ b/drivers/net/ethernet/atheros/alx/reg.h | |||
@@ -38,6 +38,7 @@ | |||
38 | #define ALX_DEV_ID_AR8161 0x1091 | 38 | #define ALX_DEV_ID_AR8161 0x1091 |
39 | #define ALX_DEV_ID_E2200 0xe091 | 39 | #define ALX_DEV_ID_E2200 0xe091 |
40 | #define ALX_DEV_ID_E2400 0xe0a1 | 40 | #define ALX_DEV_ID_E2400 0xe0a1 |
41 | #define ALX_DEV_ID_E2500 0xe0b1 | ||
41 | #define ALX_DEV_ID_AR8162 0x1090 | 42 | #define ALX_DEV_ID_AR8162 0x1090 |
42 | #define ALX_DEV_ID_AR8171 0x10A1 | 43 | #define ALX_DEV_ID_AR8171 0x10A1 |
43 | #define ALX_DEV_ID_AR8172 0x10A0 | 44 | #define ALX_DEV_ID_AR8172 0x10A0 |
diff --git a/drivers/net/ethernet/broadcom/bgmac-bcma.c b/drivers/net/ethernet/broadcom/bgmac-bcma.c index 9a9745c4047c..625235db644f 100644 --- a/drivers/net/ethernet/broadcom/bgmac-bcma.c +++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c | |||
@@ -159,7 +159,7 @@ static int bgmac_probe(struct bcma_device *core) | |||
159 | 159 | ||
160 | if (!bgmac_is_bcm4707_family(core)) { | 160 | if (!bgmac_is_bcm4707_family(core)) { |
161 | mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr); | 161 | mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr); |
162 | if (!IS_ERR(mii_bus)) { | 162 | if (IS_ERR(mii_bus)) { |
163 | err = PTR_ERR(mii_bus); | 163 | err = PTR_ERR(mii_bus); |
164 | goto err; | 164 | goto err; |
165 | } | 165 | } |
diff --git a/drivers/net/ethernet/cavium/thunder/nic_reg.h b/drivers/net/ethernet/cavium/thunder/nic_reg.h index afb10e326b4f..fab35a593898 100644 --- a/drivers/net/ethernet/cavium/thunder/nic_reg.h +++ b/drivers/net/ethernet/cavium/thunder/nic_reg.h | |||
@@ -170,7 +170,6 @@ | |||
170 | #define NIC_QSET_SQ_0_7_DOOR (0x010838) | 170 | #define NIC_QSET_SQ_0_7_DOOR (0x010838) |
171 | #define NIC_QSET_SQ_0_7_STATUS (0x010840) | 171 | #define NIC_QSET_SQ_0_7_STATUS (0x010840) |
172 | #define NIC_QSET_SQ_0_7_DEBUG (0x010848) | 172 | #define NIC_QSET_SQ_0_7_DEBUG (0x010848) |
173 | #define NIC_QSET_SQ_0_7_CNM_CHG (0x010860) | ||
174 | #define NIC_QSET_SQ_0_7_STAT_0_1 (0x010900) | 173 | #define NIC_QSET_SQ_0_7_STAT_0_1 (0x010900) |
175 | 174 | ||
176 | #define NIC_QSET_RBDR_0_1_CFG (0x010C00) | 175 | #define NIC_QSET_RBDR_0_1_CFG (0x010C00) |
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c index d2d8ef270142..ad4fddb55421 100644 --- a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c +++ b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c | |||
@@ -382,7 +382,10 @@ static void nicvf_get_regs(struct net_device *dev, | |||
382 | p[i++] = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_DOOR, q); | 382 | p[i++] = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_DOOR, q); |
383 | p[i++] = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_STATUS, q); | 383 | p[i++] = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_STATUS, q); |
384 | p[i++] = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_DEBUG, q); | 384 | p[i++] = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_DEBUG, q); |
385 | p[i++] = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_CNM_CHG, q); | 385 | /* Padding, was NIC_QSET_SQ_0_7_CNM_CHG, which |
386 | * produces bus errors when read | ||
387 | */ | ||
388 | p[i++] = 0; | ||
386 | p[i++] = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_STAT_0_1, q); | 389 | p[i++] = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_STAT_0_1, q); |
387 | reg_offset = NIC_QSET_SQ_0_7_STAT_0_1 | (1 << 3); | 390 | reg_offset = NIC_QSET_SQ_0_7_STAT_0_1 | (1 << 3); |
388 | p[i++] = nicvf_queue_reg_read(nic, reg_offset, q); | 391 | p[i++] = nicvf_queue_reg_read(nic, reg_offset, q); |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index c45de49dc963..c762a8c8c954 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
@@ -4335,6 +4335,11 @@ static void cfg_queues(struct adapter *adap) | |||
4335 | #endif | 4335 | #endif |
4336 | int ciq_size; | 4336 | int ciq_size; |
4337 | 4337 | ||
4338 | /* Reduce memory usage in kdump environment, disable all offload. | ||
4339 | */ | ||
4340 | if (is_kdump_kernel()) | ||
4341 | adap->params.offload = 0; | ||
4342 | |||
4338 | for_each_port(adap, i) | 4343 | for_each_port(adap, i) |
4339 | n10g += is_x_10g_port(&adap2pinfo(adap, i)->link_cfg); | 4344 | n10g += is_x_10g_port(&adap2pinfo(adap, i)->link_cfg); |
4340 | #ifdef CONFIG_CHELSIO_T4_DCB | 4345 | #ifdef CONFIG_CHELSIO_T4_DCB |
@@ -4365,11 +4370,6 @@ static void cfg_queues(struct adapter *adap) | |||
4365 | if (q10g > netif_get_num_default_rss_queues()) | 4370 | if (q10g > netif_get_num_default_rss_queues()) |
4366 | q10g = netif_get_num_default_rss_queues(); | 4371 | q10g = netif_get_num_default_rss_queues(); |
4367 | 4372 | ||
4368 | /* Reduce memory usage in kdump environment, disable all offload. | ||
4369 | */ | ||
4370 | if (is_kdump_kernel()) | ||
4371 | adap->params.offload = 0; | ||
4372 | |||
4373 | for_each_port(adap, i) { | 4373 | for_each_port(adap, i) { |
4374 | struct port_info *pi = adap2pinfo(adap, i); | 4374 | struct port_info *pi = adap2pinfo(adap, i); |
4375 | 4375 | ||
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index d20935dc8399..4b4f5bc0e279 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c | |||
@@ -2922,17 +2922,25 @@ static bool gfar_add_rx_frag(struct gfar_rx_buff *rxb, u32 lstatus, | |||
2922 | { | 2922 | { |
2923 | unsigned int size = lstatus & BD_LENGTH_MASK; | 2923 | unsigned int size = lstatus & BD_LENGTH_MASK; |
2924 | struct page *page = rxb->page; | 2924 | struct page *page = rxb->page; |
2925 | bool last = !!(lstatus & BD_LFLAG(RXBD_LAST)); | ||
2925 | 2926 | ||
2926 | /* Remove the FCS from the packet length */ | 2927 | /* Remove the FCS from the packet length */ |
2927 | if (likely(lstatus & BD_LFLAG(RXBD_LAST))) | 2928 | if (last) |
2928 | size -= ETH_FCS_LEN; | 2929 | size -= ETH_FCS_LEN; |
2929 | 2930 | ||
2930 | if (likely(first)) | 2931 | if (likely(first)) { |
2931 | skb_put(skb, size); | 2932 | skb_put(skb, size); |
2932 | else | 2933 | } else { |
2933 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, | 2934 | /* the last fragments' length contains the full frame length */ |
2934 | rxb->page_offset + RXBUF_ALIGNMENT, | 2935 | if (last) |
2935 | size, GFAR_RXB_TRUESIZE); | 2936 | size -= skb->len; |
2937 | |||
2938 | /* in case the last fragment consisted only of the FCS */ | ||
2939 | if (size > 0) | ||
2940 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, | ||
2941 | rxb->page_offset + RXBUF_ALIGNMENT, | ||
2942 | size, GFAR_RXB_TRUESIZE); | ||
2943 | } | ||
2936 | 2944 | ||
2937 | /* try reuse page */ | 2945 | /* try reuse page */ |
2938 | if (unlikely(page_count(page) != 1)) | 2946 | if (unlikely(page_count(page) != 1)) |
diff --git a/drivers/net/ethernet/freescale/gianfar.h b/drivers/net/ethernet/freescale/gianfar.h index 373fd094f2f3..6e8a9c8467b9 100644 --- a/drivers/net/ethernet/freescale/gianfar.h +++ b/drivers/net/ethernet/freescale/gianfar.h | |||
@@ -100,7 +100,8 @@ extern const char gfar_driver_version[]; | |||
100 | #define DEFAULT_RX_LFC_THR 16 | 100 | #define DEFAULT_RX_LFC_THR 16 |
101 | #define DEFAULT_LFC_PTVVAL 4 | 101 | #define DEFAULT_LFC_PTVVAL 4 |
102 | 102 | ||
103 | #define GFAR_RXB_SIZE 1536 | 103 | /* prevent fragmenation by HW in DSA environments */ |
104 | #define GFAR_RXB_SIZE roundup(1536 + 8, 64) | ||
104 | #define GFAR_SKBFRAG_SIZE (RXBUF_ALIGNMENT + GFAR_RXB_SIZE \ | 105 | #define GFAR_SKBFRAG_SIZE (RXBUF_ALIGNMENT + GFAR_RXB_SIZE \ |
105 | + SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) | 106 | + SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) |
106 | #define GFAR_RXB_TRUESIZE 2048 | 107 | #define GFAR_RXB_TRUESIZE 2048 |
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c index ff8b6a468b24..6ea872287307 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c | |||
@@ -328,9 +328,10 @@ static void hns_ppe_init_hw(struct hns_ppe_cb *ppe_cb) | |||
328 | static void hns_ppe_uninit_hw(struct hns_ppe_cb *ppe_cb) | 328 | static void hns_ppe_uninit_hw(struct hns_ppe_cb *ppe_cb) |
329 | { | 329 | { |
330 | u32 port; | 330 | u32 port; |
331 | struct dsaf_device *dsaf_dev = ppe_cb->ppe_common_cb->dsaf_dev; | ||
332 | 331 | ||
333 | if (ppe_cb->ppe_common_cb) { | 332 | if (ppe_cb->ppe_common_cb) { |
333 | struct dsaf_device *dsaf_dev = ppe_cb->ppe_common_cb->dsaf_dev; | ||
334 | |||
334 | port = ppe_cb->index; | 335 | port = ppe_cb->index; |
335 | dsaf_dev->misc_op->ppe_srst(dsaf_dev, port, 0); | 336 | dsaf_dev->misc_op->ppe_srst(dsaf_dev, port, 0); |
336 | } | 337 | } |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_client.c b/drivers/net/ethernet/intel/i40e/i40e_client.c index e1370c556a3c..618f18436618 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_client.c +++ b/drivers/net/ethernet/intel/i40e/i40e_client.c | |||
@@ -199,6 +199,7 @@ void i40e_notify_client_of_l2_param_changes(struct i40e_vsi *vsi) | |||
199 | void i40e_notify_client_of_netdev_open(struct i40e_vsi *vsi) | 199 | void i40e_notify_client_of_netdev_open(struct i40e_vsi *vsi) |
200 | { | 200 | { |
201 | struct i40e_client_instance *cdev; | 201 | struct i40e_client_instance *cdev; |
202 | int ret = 0; | ||
202 | 203 | ||
203 | if (!vsi) | 204 | if (!vsi) |
204 | return; | 205 | return; |
@@ -211,7 +212,14 @@ void i40e_notify_client_of_netdev_open(struct i40e_vsi *vsi) | |||
211 | "Cannot locate client instance open routine\n"); | 212 | "Cannot locate client instance open routine\n"); |
212 | continue; | 213 | continue; |
213 | } | 214 | } |
214 | cdev->client->ops->open(&cdev->lan_info, cdev->client); | 215 | if (!(test_bit(__I40E_CLIENT_INSTANCE_OPENED, |
216 | &cdev->state))) { | ||
217 | ret = cdev->client->ops->open(&cdev->lan_info, | ||
218 | cdev->client); | ||
219 | if (!ret) | ||
220 | set_bit(__I40E_CLIENT_INSTANCE_OPENED, | ||
221 | &cdev->state); | ||
222 | } | ||
215 | } | 223 | } |
216 | } | 224 | } |
217 | mutex_unlock(&i40e_client_instance_mutex); | 225 | mutex_unlock(&i40e_client_instance_mutex); |
@@ -407,12 +415,14 @@ struct i40e_vsi *i40e_vsi_lookup(struct i40e_pf *pf, | |||
407 | * i40e_client_add_instance - add a client instance struct to the instance list | 415 | * i40e_client_add_instance - add a client instance struct to the instance list |
408 | * @pf: pointer to the board struct | 416 | * @pf: pointer to the board struct |
409 | * @client: pointer to a client struct in the client list. | 417 | * @client: pointer to a client struct in the client list. |
418 | * @existing: if there was already an existing instance | ||
410 | * | 419 | * |
411 | * Returns cdev ptr on success, NULL on failure | 420 | * Returns cdev ptr on success or if already exists, NULL on failure |
412 | **/ | 421 | **/ |
413 | static | 422 | static |
414 | struct i40e_client_instance *i40e_client_add_instance(struct i40e_pf *pf, | 423 | struct i40e_client_instance *i40e_client_add_instance(struct i40e_pf *pf, |
415 | struct i40e_client *client) | 424 | struct i40e_client *client, |
425 | bool *existing) | ||
416 | { | 426 | { |
417 | struct i40e_client_instance *cdev; | 427 | struct i40e_client_instance *cdev; |
418 | struct netdev_hw_addr *mac = NULL; | 428 | struct netdev_hw_addr *mac = NULL; |
@@ -421,7 +431,7 @@ struct i40e_client_instance *i40e_client_add_instance(struct i40e_pf *pf, | |||
421 | mutex_lock(&i40e_client_instance_mutex); | 431 | mutex_lock(&i40e_client_instance_mutex); |
422 | list_for_each_entry(cdev, &i40e_client_instances, list) { | 432 | list_for_each_entry(cdev, &i40e_client_instances, list) { |
423 | if ((cdev->lan_info.pf == pf) && (cdev->client == client)) { | 433 | if ((cdev->lan_info.pf == pf) && (cdev->client == client)) { |
424 | cdev = NULL; | 434 | *existing = true; |
425 | goto out; | 435 | goto out; |
426 | } | 436 | } |
427 | } | 437 | } |
@@ -505,6 +515,7 @@ void i40e_client_subtask(struct i40e_pf *pf) | |||
505 | { | 515 | { |
506 | struct i40e_client_instance *cdev; | 516 | struct i40e_client_instance *cdev; |
507 | struct i40e_client *client; | 517 | struct i40e_client *client; |
518 | bool existing = false; | ||
508 | int ret = 0; | 519 | int ret = 0; |
509 | 520 | ||
510 | if (!(pf->flags & I40E_FLAG_SERVICE_CLIENT_REQUESTED)) | 521 | if (!(pf->flags & I40E_FLAG_SERVICE_CLIENT_REQUESTED)) |
@@ -528,18 +539,25 @@ void i40e_client_subtask(struct i40e_pf *pf) | |||
528 | /* check if L2 VSI is up, if not we are not ready */ | 539 | /* check if L2 VSI is up, if not we are not ready */ |
529 | if (test_bit(__I40E_DOWN, &pf->vsi[pf->lan_vsi]->state)) | 540 | if (test_bit(__I40E_DOWN, &pf->vsi[pf->lan_vsi]->state)) |
530 | continue; | 541 | continue; |
542 | } else { | ||
543 | dev_warn(&pf->pdev->dev, "This client %s is being instanciated at probe\n", | ||
544 | client->name); | ||
531 | } | 545 | } |
532 | 546 | ||
533 | /* Add the client instance to the instance list */ | 547 | /* Add the client instance to the instance list */ |
534 | cdev = i40e_client_add_instance(pf, client); | 548 | cdev = i40e_client_add_instance(pf, client, &existing); |
535 | if (!cdev) | 549 | if (!cdev) |
536 | continue; | 550 | continue; |
537 | 551 | ||
538 | /* Also up the ref_cnt of no. of instances of this client */ | 552 | if (!existing) { |
539 | atomic_inc(&client->ref_cnt); | 553 | /* Also up the ref_cnt for no. of instances of this |
540 | dev_info(&pf->pdev->dev, "Added instance of Client %s to PF%d bus=0x%02x func=0x%02x\n", | 554 | * client. |
541 | client->name, pf->hw.pf_id, | 555 | */ |
542 | pf->hw.bus.device, pf->hw.bus.func); | 556 | atomic_inc(&client->ref_cnt); |
557 | dev_info(&pf->pdev->dev, "Added instance of Client %s to PF%d bus=0x%02x func=0x%02x\n", | ||
558 | client->name, pf->hw.pf_id, | ||
559 | pf->hw.bus.device, pf->hw.bus.func); | ||
560 | } | ||
543 | 561 | ||
544 | /* Send an Open request to the client */ | 562 | /* Send an Open request to the client */ |
545 | atomic_inc(&cdev->ref_cnt); | 563 | atomic_inc(&cdev->ref_cnt); |
@@ -588,7 +606,8 @@ int i40e_lan_add_device(struct i40e_pf *pf) | |||
588 | pf->hw.pf_id, pf->hw.bus.device, pf->hw.bus.func); | 606 | pf->hw.pf_id, pf->hw.bus.device, pf->hw.bus.func); |
589 | 607 | ||
590 | /* Since in some cases register may have happened before a device gets | 608 | /* Since in some cases register may have happened before a device gets |
591 | * added, we can schedule a subtask to go initiate the clients. | 609 | * added, we can schedule a subtask to go initiate the clients if |
610 | * they can be launched at probe time. | ||
592 | */ | 611 | */ |
593 | pf->flags |= I40E_FLAG_SERVICE_CLIENT_REQUESTED; | 612 | pf->flags |= I40E_FLAG_SERVICE_CLIENT_REQUESTED; |
594 | i40e_service_event_schedule(pf); | 613 | i40e_service_event_schedule(pf); |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index c6ac7a61812f..828ed28c3c14 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -5431,7 +5431,6 @@ int i40e_open(struct net_device *netdev) | |||
5431 | wr32(&pf->hw, I40E_GLLAN_TSOMSK_L, be32_to_cpu(TCP_FLAG_CWR) >> 16); | 5431 | wr32(&pf->hw, I40E_GLLAN_TSOMSK_L, be32_to_cpu(TCP_FLAG_CWR) >> 16); |
5432 | 5432 | ||
5433 | udp_tunnel_get_rx_info(netdev); | 5433 | udp_tunnel_get_rx_info(netdev); |
5434 | i40e_notify_client_of_netdev_open(vsi); | ||
5435 | 5434 | ||
5436 | return 0; | 5435 | return 0; |
5437 | } | 5436 | } |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c index b4217f30e89c..c47b605e8651 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | |||
@@ -2958,8 +2958,10 @@ s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq) | |||
2958 | } | 2958 | } |
2959 | 2959 | ||
2960 | /* was that the last pool using this rar? */ | 2960 | /* was that the last pool using this rar? */ |
2961 | if (mpsar_lo == 0 && mpsar_hi == 0 && rar != 0) | 2961 | if (mpsar_lo == 0 && mpsar_hi == 0 && |
2962 | rar != 0 && rar != hw->mac.san_mac_rar_index) | ||
2962 | hw->mac.ops.clear_rar(hw, rar); | 2963 | hw->mac.ops.clear_rar(hw, rar); |
2964 | |||
2963 | return 0; | 2965 | return 0; |
2964 | } | 2966 | } |
2965 | 2967 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c index d6e2a1cae19a..c2ec01a22d55 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c | |||
@@ -143,13 +143,14 @@ static struct mlx5_cmd_layout *get_inst(struct mlx5_cmd *cmd, int idx) | |||
143 | return cmd->cmd_buf + (idx << cmd->log_stride); | 143 | return cmd->cmd_buf + (idx << cmd->log_stride); |
144 | } | 144 | } |
145 | 145 | ||
146 | static u8 xor8_buf(void *buf, int len) | 146 | static u8 xor8_buf(void *buf, size_t offset, int len) |
147 | { | 147 | { |
148 | u8 *ptr = buf; | 148 | u8 *ptr = buf; |
149 | u8 sum = 0; | 149 | u8 sum = 0; |
150 | int i; | 150 | int i; |
151 | int end = len + offset; | ||
151 | 152 | ||
152 | for (i = 0; i < len; i++) | 153 | for (i = offset; i < end; i++) |
153 | sum ^= ptr[i]; | 154 | sum ^= ptr[i]; |
154 | 155 | ||
155 | return sum; | 156 | return sum; |
@@ -157,41 +158,49 @@ static u8 xor8_buf(void *buf, int len) | |||
157 | 158 | ||
158 | static int verify_block_sig(struct mlx5_cmd_prot_block *block) | 159 | static int verify_block_sig(struct mlx5_cmd_prot_block *block) |
159 | { | 160 | { |
160 | if (xor8_buf(block->rsvd0, sizeof(*block) - sizeof(block->data) - 1) != 0xff) | 161 | size_t rsvd0_off = offsetof(struct mlx5_cmd_prot_block, rsvd0); |
162 | int xor_len = sizeof(*block) - sizeof(block->data) - 1; | ||
163 | |||
164 | if (xor8_buf(block, rsvd0_off, xor_len) != 0xff) | ||
161 | return -EINVAL; | 165 | return -EINVAL; |
162 | 166 | ||
163 | if (xor8_buf(block, sizeof(*block)) != 0xff) | 167 | if (xor8_buf(block, 0, sizeof(*block)) != 0xff) |
164 | return -EINVAL; | 168 | return -EINVAL; |
165 | 169 | ||
166 | return 0; | 170 | return 0; |
167 | } | 171 | } |
168 | 172 | ||
169 | static void calc_block_sig(struct mlx5_cmd_prot_block *block, u8 token, | 173 | static void calc_block_sig(struct mlx5_cmd_prot_block *block) |
170 | int csum) | ||
171 | { | 174 | { |
172 | block->token = token; | 175 | int ctrl_xor_len = sizeof(*block) - sizeof(block->data) - 2; |
173 | if (csum) { | 176 | size_t rsvd0_off = offsetof(struct mlx5_cmd_prot_block, rsvd0); |
174 | block->ctrl_sig = ~xor8_buf(block->rsvd0, sizeof(*block) - | 177 | |
175 | sizeof(block->data) - 2); | 178 | block->ctrl_sig = ~xor8_buf(block, rsvd0_off, ctrl_xor_len); |
176 | block->sig = ~xor8_buf(block, sizeof(*block) - 1); | 179 | block->sig = ~xor8_buf(block, 0, sizeof(*block) - 1); |
177 | } | ||
178 | } | 180 | } |
179 | 181 | ||
180 | static void calc_chain_sig(struct mlx5_cmd_msg *msg, u8 token, int csum) | 182 | static void calc_chain_sig(struct mlx5_cmd_msg *msg) |
181 | { | 183 | { |
182 | struct mlx5_cmd_mailbox *next = msg->next; | 184 | struct mlx5_cmd_mailbox *next = msg->next; |
183 | 185 | int size = msg->len; | |
184 | while (next) { | 186 | int blen = size - min_t(int, sizeof(msg->first.data), size); |
185 | calc_block_sig(next->buf, token, csum); | 187 | int n = (blen + MLX5_CMD_DATA_BLOCK_SIZE - 1) |
188 | / MLX5_CMD_DATA_BLOCK_SIZE; | ||
189 | int i = 0; | ||
190 | |||
191 | for (i = 0; i < n && next; i++) { | ||
192 | calc_block_sig(next->buf); | ||
186 | next = next->next; | 193 | next = next->next; |
187 | } | 194 | } |
188 | } | 195 | } |
189 | 196 | ||
190 | static void set_signature(struct mlx5_cmd_work_ent *ent, int csum) | 197 | static void set_signature(struct mlx5_cmd_work_ent *ent, int csum) |
191 | { | 198 | { |
192 | ent->lay->sig = ~xor8_buf(ent->lay, sizeof(*ent->lay)); | 199 | ent->lay->sig = ~xor8_buf(ent->lay, 0, sizeof(*ent->lay)); |
193 | calc_chain_sig(ent->in, ent->token, csum); | 200 | if (csum) { |
194 | calc_chain_sig(ent->out, ent->token, csum); | 201 | calc_chain_sig(ent->in); |
202 | calc_chain_sig(ent->out); | ||
203 | } | ||
195 | } | 204 | } |
196 | 205 | ||
197 | static void poll_timeout(struct mlx5_cmd_work_ent *ent) | 206 | static void poll_timeout(struct mlx5_cmd_work_ent *ent) |
@@ -222,12 +231,17 @@ static int verify_signature(struct mlx5_cmd_work_ent *ent) | |||
222 | struct mlx5_cmd_mailbox *next = ent->out->next; | 231 | struct mlx5_cmd_mailbox *next = ent->out->next; |
223 | int err; | 232 | int err; |
224 | u8 sig; | 233 | u8 sig; |
234 | int size = ent->out->len; | ||
235 | int blen = size - min_t(int, sizeof(ent->out->first.data), size); | ||
236 | int n = (blen + MLX5_CMD_DATA_BLOCK_SIZE - 1) | ||
237 | / MLX5_CMD_DATA_BLOCK_SIZE; | ||
238 | int i = 0; | ||
225 | 239 | ||
226 | sig = xor8_buf(ent->lay, sizeof(*ent->lay)); | 240 | sig = xor8_buf(ent->lay, 0, sizeof(*ent->lay)); |
227 | if (sig != 0xff) | 241 | if (sig != 0xff) |
228 | return -EINVAL; | 242 | return -EINVAL; |
229 | 243 | ||
230 | while (next) { | 244 | for (i = 0; i < n && next; i++) { |
231 | err = verify_block_sig(next->buf); | 245 | err = verify_block_sig(next->buf); |
232 | if (err) | 246 | if (err) |
233 | return err; | 247 | return err; |
@@ -656,7 +670,6 @@ static void cmd_work_handler(struct work_struct *work) | |||
656 | spin_unlock_irqrestore(&cmd->alloc_lock, flags); | 670 | spin_unlock_irqrestore(&cmd->alloc_lock, flags); |
657 | } | 671 | } |
658 | 672 | ||
659 | ent->token = alloc_token(cmd); | ||
660 | cmd->ent_arr[ent->idx] = ent; | 673 | cmd->ent_arr[ent->idx] = ent; |
661 | lay = get_inst(cmd, ent->idx); | 674 | lay = get_inst(cmd, ent->idx); |
662 | ent->lay = lay; | 675 | ent->lay = lay; |
@@ -766,7 +779,8 @@ static u8 *get_status_ptr(struct mlx5_outbox_hdr *out) | |||
766 | static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in, | 779 | static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in, |
767 | struct mlx5_cmd_msg *out, void *uout, int uout_size, | 780 | struct mlx5_cmd_msg *out, void *uout, int uout_size, |
768 | mlx5_cmd_cbk_t callback, | 781 | mlx5_cmd_cbk_t callback, |
769 | void *context, int page_queue, u8 *status) | 782 | void *context, int page_queue, u8 *status, |
783 | u8 token) | ||
770 | { | 784 | { |
771 | struct mlx5_cmd *cmd = &dev->cmd; | 785 | struct mlx5_cmd *cmd = &dev->cmd; |
772 | struct mlx5_cmd_work_ent *ent; | 786 | struct mlx5_cmd_work_ent *ent; |
@@ -783,6 +797,8 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in, | |||
783 | if (IS_ERR(ent)) | 797 | if (IS_ERR(ent)) |
784 | return PTR_ERR(ent); | 798 | return PTR_ERR(ent); |
785 | 799 | ||
800 | ent->token = token; | ||
801 | |||
786 | if (!callback) | 802 | if (!callback) |
787 | init_completion(&ent->done); | 803 | init_completion(&ent->done); |
788 | 804 | ||
@@ -854,7 +870,8 @@ static const struct file_operations fops = { | |||
854 | .write = dbg_write, | 870 | .write = dbg_write, |
855 | }; | 871 | }; |
856 | 872 | ||
857 | static int mlx5_copy_to_msg(struct mlx5_cmd_msg *to, void *from, int size) | 873 | static int mlx5_copy_to_msg(struct mlx5_cmd_msg *to, void *from, int size, |
874 | u8 token) | ||
858 | { | 875 | { |
859 | struct mlx5_cmd_prot_block *block; | 876 | struct mlx5_cmd_prot_block *block; |
860 | struct mlx5_cmd_mailbox *next; | 877 | struct mlx5_cmd_mailbox *next; |
@@ -880,6 +897,7 @@ static int mlx5_copy_to_msg(struct mlx5_cmd_msg *to, void *from, int size) | |||
880 | memcpy(block->data, from, copy); | 897 | memcpy(block->data, from, copy); |
881 | from += copy; | 898 | from += copy; |
882 | size -= copy; | 899 | size -= copy; |
900 | block->token = token; | ||
883 | next = next->next; | 901 | next = next->next; |
884 | } | 902 | } |
885 | 903 | ||
@@ -949,7 +967,8 @@ static void free_cmd_box(struct mlx5_core_dev *dev, | |||
949 | } | 967 | } |
950 | 968 | ||
951 | static struct mlx5_cmd_msg *mlx5_alloc_cmd_msg(struct mlx5_core_dev *dev, | 969 | static struct mlx5_cmd_msg *mlx5_alloc_cmd_msg(struct mlx5_core_dev *dev, |
952 | gfp_t flags, int size) | 970 | gfp_t flags, int size, |
971 | u8 token) | ||
953 | { | 972 | { |
954 | struct mlx5_cmd_mailbox *tmp, *head = NULL; | 973 | struct mlx5_cmd_mailbox *tmp, *head = NULL; |
955 | struct mlx5_cmd_prot_block *block; | 974 | struct mlx5_cmd_prot_block *block; |
@@ -978,6 +997,7 @@ static struct mlx5_cmd_msg *mlx5_alloc_cmd_msg(struct mlx5_core_dev *dev, | |||
978 | tmp->next = head; | 997 | tmp->next = head; |
979 | block->next = cpu_to_be64(tmp->next ? tmp->next->dma : 0); | 998 | block->next = cpu_to_be64(tmp->next ? tmp->next->dma : 0); |
980 | block->block_num = cpu_to_be32(n - i - 1); | 999 | block->block_num = cpu_to_be32(n - i - 1); |
1000 | block->token = token; | ||
981 | head = tmp; | 1001 | head = tmp; |
982 | } | 1002 | } |
983 | msg->next = head; | 1003 | msg->next = head; |
@@ -1352,7 +1372,7 @@ static struct mlx5_cmd_msg *alloc_msg(struct mlx5_core_dev *dev, int in_size, | |||
1352 | } | 1372 | } |
1353 | 1373 | ||
1354 | if (IS_ERR(msg)) | 1374 | if (IS_ERR(msg)) |
1355 | msg = mlx5_alloc_cmd_msg(dev, gfp, in_size); | 1375 | msg = mlx5_alloc_cmd_msg(dev, gfp, in_size, 0); |
1356 | 1376 | ||
1357 | return msg; | 1377 | return msg; |
1358 | } | 1378 | } |
@@ -1377,6 +1397,7 @@ static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out, | |||
1377 | int err; | 1397 | int err; |
1378 | u8 status = 0; | 1398 | u8 status = 0; |
1379 | u32 drv_synd; | 1399 | u32 drv_synd; |
1400 | u8 token; | ||
1380 | 1401 | ||
1381 | if (pci_channel_offline(dev->pdev) || | 1402 | if (pci_channel_offline(dev->pdev) || |
1382 | dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) { | 1403 | dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) { |
@@ -1395,20 +1416,22 @@ static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out, | |||
1395 | return err; | 1416 | return err; |
1396 | } | 1417 | } |
1397 | 1418 | ||
1398 | err = mlx5_copy_to_msg(inb, in, in_size); | 1419 | token = alloc_token(&dev->cmd); |
1420 | |||
1421 | err = mlx5_copy_to_msg(inb, in, in_size, token); | ||
1399 | if (err) { | 1422 | if (err) { |
1400 | mlx5_core_warn(dev, "err %d\n", err); | 1423 | mlx5_core_warn(dev, "err %d\n", err); |
1401 | goto out_in; | 1424 | goto out_in; |
1402 | } | 1425 | } |
1403 | 1426 | ||
1404 | outb = mlx5_alloc_cmd_msg(dev, gfp, out_size); | 1427 | outb = mlx5_alloc_cmd_msg(dev, gfp, out_size, token); |
1405 | if (IS_ERR(outb)) { | 1428 | if (IS_ERR(outb)) { |
1406 | err = PTR_ERR(outb); | 1429 | err = PTR_ERR(outb); |
1407 | goto out_in; | 1430 | goto out_in; |
1408 | } | 1431 | } |
1409 | 1432 | ||
1410 | err = mlx5_cmd_invoke(dev, inb, outb, out, out_size, callback, context, | 1433 | err = mlx5_cmd_invoke(dev, inb, outb, out, out_size, callback, context, |
1411 | pages_queue, &status); | 1434 | pages_queue, &status, token); |
1412 | if (err) | 1435 | if (err) |
1413 | goto out_out; | 1436 | goto out_out; |
1414 | 1437 | ||
@@ -1476,7 +1499,7 @@ static int create_msg_cache(struct mlx5_core_dev *dev) | |||
1476 | INIT_LIST_HEAD(&cmd->cache.med.head); | 1499 | INIT_LIST_HEAD(&cmd->cache.med.head); |
1477 | 1500 | ||
1478 | for (i = 0; i < NUM_LONG_LISTS; i++) { | 1501 | for (i = 0; i < NUM_LONG_LISTS; i++) { |
1479 | msg = mlx5_alloc_cmd_msg(dev, GFP_KERNEL, LONG_LIST_SIZE); | 1502 | msg = mlx5_alloc_cmd_msg(dev, GFP_KERNEL, LONG_LIST_SIZE, 0); |
1480 | if (IS_ERR(msg)) { | 1503 | if (IS_ERR(msg)) { |
1481 | err = PTR_ERR(msg); | 1504 | err = PTR_ERR(msg); |
1482 | goto ex_err; | 1505 | goto ex_err; |
@@ -1486,7 +1509,7 @@ static int create_msg_cache(struct mlx5_core_dev *dev) | |||
1486 | } | 1509 | } |
1487 | 1510 | ||
1488 | for (i = 0; i < NUM_MED_LISTS; i++) { | 1511 | for (i = 0; i < NUM_MED_LISTS; i++) { |
1489 | msg = mlx5_alloc_cmd_msg(dev, GFP_KERNEL, MED_LIST_SIZE); | 1512 | msg = mlx5_alloc_cmd_msg(dev, GFP_KERNEL, MED_LIST_SIZE, 0); |
1490 | if (IS_ERR(msg)) { | 1513 | if (IS_ERR(msg)) { |
1491 | err = PTR_ERR(msg); | 1514 | err = PTR_ERR(msg); |
1492 | goto ex_err; | 1515 | goto ex_err; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index 1b495efa7490..bf722aa88cf0 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h | |||
@@ -73,8 +73,12 @@ | |||
73 | #define MLX5_MPWRQ_PAGES_PER_WQE BIT(MLX5_MPWRQ_WQE_PAGE_ORDER) | 73 | #define MLX5_MPWRQ_PAGES_PER_WQE BIT(MLX5_MPWRQ_WQE_PAGE_ORDER) |
74 | #define MLX5_MPWRQ_STRIDES_PER_PAGE (MLX5_MPWRQ_NUM_STRIDES >> \ | 74 | #define MLX5_MPWRQ_STRIDES_PER_PAGE (MLX5_MPWRQ_NUM_STRIDES >> \ |
75 | MLX5_MPWRQ_WQE_PAGE_ORDER) | 75 | MLX5_MPWRQ_WQE_PAGE_ORDER) |
76 | #define MLX5_CHANNEL_MAX_NUM_MTTS (ALIGN(MLX5_MPWRQ_PAGES_PER_WQE, 8) * \ | 76 | |
77 | BIT(MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE_MPW)) | 77 | #define MLX5_MTT_OCTW(npages) (ALIGN(npages, 8) / 2) |
78 | #define MLX5E_REQUIRED_MTTS(rqs, wqes)\ | ||
79 | (rqs * wqes * ALIGN(MLX5_MPWRQ_PAGES_PER_WQE, 8)) | ||
80 | #define MLX5E_VALID_NUM_MTTS(num_mtts) (MLX5_MTT_OCTW(num_mtts) <= U16_MAX) | ||
81 | |||
78 | #define MLX5_UMR_ALIGN (2048) | 82 | #define MLX5_UMR_ALIGN (2048) |
79 | #define MLX5_MPWRQ_SMALL_PACKET_THRESHOLD (128) | 83 | #define MLX5_MPWRQ_SMALL_PACKET_THRESHOLD (128) |
80 | 84 | ||
@@ -219,9 +223,8 @@ struct mlx5e_tstamp { | |||
219 | }; | 223 | }; |
220 | 224 | ||
221 | enum { | 225 | enum { |
222 | MLX5E_RQ_STATE_POST_WQES_ENABLE, | 226 | MLX5E_RQ_STATE_FLUSH, |
223 | MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, | 227 | MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, |
224 | MLX5E_RQ_STATE_FLUSH_TIMEOUT, | ||
225 | MLX5E_RQ_STATE_AM, | 228 | MLX5E_RQ_STATE_AM, |
226 | }; | 229 | }; |
227 | 230 | ||
@@ -304,6 +307,7 @@ struct mlx5e_rq { | |||
304 | 307 | ||
305 | unsigned long state; | 308 | unsigned long state; |
306 | int ix; | 309 | int ix; |
310 | u32 mpwqe_mtt_offset; | ||
307 | 311 | ||
308 | struct mlx5e_rx_am am; /* Adaptive Moderation */ | 312 | struct mlx5e_rx_am am; /* Adaptive Moderation */ |
309 | 313 | ||
@@ -365,9 +369,8 @@ struct mlx5e_sq_dma { | |||
365 | }; | 369 | }; |
366 | 370 | ||
367 | enum { | 371 | enum { |
368 | MLX5E_SQ_STATE_WAKE_TXQ_ENABLE, | 372 | MLX5E_SQ_STATE_FLUSH, |
369 | MLX5E_SQ_STATE_BF_ENABLE, | 373 | MLX5E_SQ_STATE_BF_ENABLE, |
370 | MLX5E_SQ_STATE_TX_TIMEOUT, | ||
371 | }; | 374 | }; |
372 | 375 | ||
373 | struct mlx5e_ico_wqe_info { | 376 | struct mlx5e_ico_wqe_info { |
@@ -698,7 +701,6 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget); | |||
698 | bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget); | 701 | bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget); |
699 | int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget); | 702 | int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget); |
700 | void mlx5e_free_tx_descs(struct mlx5e_sq *sq); | 703 | void mlx5e_free_tx_descs(struct mlx5e_sq *sq); |
701 | void mlx5e_free_rx_descs(struct mlx5e_rq *rq); | ||
702 | 704 | ||
703 | void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); | 705 | void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); |
704 | void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); | 706 | void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); |
@@ -814,11 +816,6 @@ static inline int mlx5e_get_max_num_channels(struct mlx5_core_dev *mdev) | |||
814 | MLX5E_MAX_NUM_CHANNELS); | 816 | MLX5E_MAX_NUM_CHANNELS); |
815 | } | 817 | } |
816 | 818 | ||
817 | static inline int mlx5e_get_mtt_octw(int npages) | ||
818 | { | ||
819 | return ALIGN(npages, 8) / 2; | ||
820 | } | ||
821 | |||
822 | extern const struct ethtool_ops mlx5e_ethtool_ops; | 819 | extern const struct ethtool_ops mlx5e_ethtool_ops; |
823 | #ifdef CONFIG_MLX5_CORE_EN_DCB | 820 | #ifdef CONFIG_MLX5_CORE_EN_DCB |
824 | extern const struct dcbnl_rtnl_ops mlx5e_dcbnl_ops; | 821 | extern const struct dcbnl_rtnl_ops mlx5e_dcbnl_ops; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_common.c b/drivers/net/ethernet/mellanox/mlx5/core/en_common.c index 673043ccd76c..9cce153e1035 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_common.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_common.c | |||
@@ -139,7 +139,7 @@ int mlx5e_refresh_tirs_self_loopback_enable(struct mlx5_core_dev *mdev) | |||
139 | struct mlx5e_tir *tir; | 139 | struct mlx5e_tir *tir; |
140 | void *in; | 140 | void *in; |
141 | int inlen; | 141 | int inlen; |
142 | int err; | 142 | int err = 0; |
143 | 143 | ||
144 | inlen = MLX5_ST_SZ_BYTES(modify_tir_in); | 144 | inlen = MLX5_ST_SZ_BYTES(modify_tir_in); |
145 | in = mlx5_vzalloc(inlen); | 145 | in = mlx5_vzalloc(inlen); |
@@ -151,10 +151,11 @@ int mlx5e_refresh_tirs_self_loopback_enable(struct mlx5_core_dev *mdev) | |||
151 | list_for_each_entry(tir, &mdev->mlx5e_res.td.tirs_list, list) { | 151 | list_for_each_entry(tir, &mdev->mlx5e_res.td.tirs_list, list) { |
152 | err = mlx5_core_modify_tir(mdev, tir->tirn, in, inlen); | 152 | err = mlx5_core_modify_tir(mdev, tir->tirn, in, inlen); |
153 | if (err) | 153 | if (err) |
154 | return err; | 154 | goto out; |
155 | } | 155 | } |
156 | 156 | ||
157 | out: | ||
157 | kvfree(in); | 158 | kvfree(in); |
158 | 159 | ||
159 | return 0; | 160 | return err; |
160 | } | 161 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c index caa9a3ccc3f3..762af16ed021 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | |||
@@ -127,29 +127,40 @@ int mlx5e_dcbnl_ieee_setets_core(struct mlx5e_priv *priv, struct ieee_ets *ets) | |||
127 | return mlx5_set_port_tc_bw_alloc(mdev, tc_tx_bw); | 127 | return mlx5_set_port_tc_bw_alloc(mdev, tc_tx_bw); |
128 | } | 128 | } |
129 | 129 | ||
130 | static int mlx5e_dbcnl_validate_ets(struct ieee_ets *ets) | 130 | static int mlx5e_dbcnl_validate_ets(struct net_device *netdev, |
131 | struct ieee_ets *ets) | ||
131 | { | 132 | { |
132 | int bw_sum = 0; | 133 | int bw_sum = 0; |
133 | int i; | 134 | int i; |
134 | 135 | ||
135 | /* Validate Priority */ | 136 | /* Validate Priority */ |
136 | for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { | 137 | for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { |
137 | if (ets->prio_tc[i] >= MLX5E_MAX_PRIORITY) | 138 | if (ets->prio_tc[i] >= MLX5E_MAX_PRIORITY) { |
139 | netdev_err(netdev, | ||
140 | "Failed to validate ETS: priority value greater than max(%d)\n", | ||
141 | MLX5E_MAX_PRIORITY); | ||
138 | return -EINVAL; | 142 | return -EINVAL; |
143 | } | ||
139 | } | 144 | } |
140 | 145 | ||
141 | /* Validate Bandwidth Sum */ | 146 | /* Validate Bandwidth Sum */ |
142 | for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { | 147 | for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { |
143 | if (ets->tc_tsa[i] == IEEE_8021QAZ_TSA_ETS) { | 148 | if (ets->tc_tsa[i] == IEEE_8021QAZ_TSA_ETS) { |
144 | if (!ets->tc_tx_bw[i]) | 149 | if (!ets->tc_tx_bw[i]) { |
150 | netdev_err(netdev, | ||
151 | "Failed to validate ETS: BW 0 is illegal\n"); | ||
145 | return -EINVAL; | 152 | return -EINVAL; |
153 | } | ||
146 | 154 | ||
147 | bw_sum += ets->tc_tx_bw[i]; | 155 | bw_sum += ets->tc_tx_bw[i]; |
148 | } | 156 | } |
149 | } | 157 | } |
150 | 158 | ||
151 | if (bw_sum != 0 && bw_sum != 100) | 159 | if (bw_sum != 0 && bw_sum != 100) { |
160 | netdev_err(netdev, | ||
161 | "Failed to validate ETS: BW sum is illegal\n"); | ||
152 | return -EINVAL; | 162 | return -EINVAL; |
163 | } | ||
153 | return 0; | 164 | return 0; |
154 | } | 165 | } |
155 | 166 | ||
@@ -159,7 +170,7 @@ static int mlx5e_dcbnl_ieee_setets(struct net_device *netdev, | |||
159 | struct mlx5e_priv *priv = netdev_priv(netdev); | 170 | struct mlx5e_priv *priv = netdev_priv(netdev); |
160 | int err; | 171 | int err; |
161 | 172 | ||
162 | err = mlx5e_dbcnl_validate_ets(ets); | 173 | err = mlx5e_dbcnl_validate_ets(netdev, ets); |
163 | if (err) | 174 | if (err) |
164 | return err; | 175 | return err; |
165 | 176 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c index 4a3757e60441..d0cf8fa22659 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | |||
@@ -352,15 +352,61 @@ static void mlx5e_get_ethtool_stats(struct net_device *dev, | |||
352 | sq_stats_desc, j); | 352 | sq_stats_desc, j); |
353 | } | 353 | } |
354 | 354 | ||
355 | static u32 mlx5e_rx_wqes_to_packets(struct mlx5e_priv *priv, int rq_wq_type, | ||
356 | int num_wqe) | ||
357 | { | ||
358 | int packets_per_wqe; | ||
359 | int stride_size; | ||
360 | int num_strides; | ||
361 | int wqe_size; | ||
362 | |||
363 | if (rq_wq_type != MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ) | ||
364 | return num_wqe; | ||
365 | |||
366 | stride_size = 1 << priv->params.mpwqe_log_stride_sz; | ||
367 | num_strides = 1 << priv->params.mpwqe_log_num_strides; | ||
368 | wqe_size = stride_size * num_strides; | ||
369 | |||
370 | packets_per_wqe = wqe_size / | ||
371 | ALIGN(ETH_DATA_LEN, stride_size); | ||
372 | return (1 << (order_base_2(num_wqe * packets_per_wqe) - 1)); | ||
373 | } | ||
374 | |||
375 | static u32 mlx5e_packets_to_rx_wqes(struct mlx5e_priv *priv, int rq_wq_type, | ||
376 | int num_packets) | ||
377 | { | ||
378 | int packets_per_wqe; | ||
379 | int stride_size; | ||
380 | int num_strides; | ||
381 | int wqe_size; | ||
382 | int num_wqes; | ||
383 | |||
384 | if (rq_wq_type != MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ) | ||
385 | return num_packets; | ||
386 | |||
387 | stride_size = 1 << priv->params.mpwqe_log_stride_sz; | ||
388 | num_strides = 1 << priv->params.mpwqe_log_num_strides; | ||
389 | wqe_size = stride_size * num_strides; | ||
390 | |||
391 | num_packets = (1 << order_base_2(num_packets)); | ||
392 | |||
393 | packets_per_wqe = wqe_size / | ||
394 | ALIGN(ETH_DATA_LEN, stride_size); | ||
395 | num_wqes = DIV_ROUND_UP(num_packets, packets_per_wqe); | ||
396 | return 1 << (order_base_2(num_wqes)); | ||
397 | } | ||
398 | |||
355 | static void mlx5e_get_ringparam(struct net_device *dev, | 399 | static void mlx5e_get_ringparam(struct net_device *dev, |
356 | struct ethtool_ringparam *param) | 400 | struct ethtool_ringparam *param) |
357 | { | 401 | { |
358 | struct mlx5e_priv *priv = netdev_priv(dev); | 402 | struct mlx5e_priv *priv = netdev_priv(dev); |
359 | int rq_wq_type = priv->params.rq_wq_type; | 403 | int rq_wq_type = priv->params.rq_wq_type; |
360 | 404 | ||
361 | param->rx_max_pending = 1 << mlx5_max_log_rq_size(rq_wq_type); | 405 | param->rx_max_pending = mlx5e_rx_wqes_to_packets(priv, rq_wq_type, |
406 | 1 << mlx5_max_log_rq_size(rq_wq_type)); | ||
362 | param->tx_max_pending = 1 << MLX5E_PARAMS_MAXIMUM_LOG_SQ_SIZE; | 407 | param->tx_max_pending = 1 << MLX5E_PARAMS_MAXIMUM_LOG_SQ_SIZE; |
363 | param->rx_pending = 1 << priv->params.log_rq_size; | 408 | param->rx_pending = mlx5e_rx_wqes_to_packets(priv, rq_wq_type, |
409 | 1 << priv->params.log_rq_size); | ||
364 | param->tx_pending = 1 << priv->params.log_sq_size; | 410 | param->tx_pending = 1 << priv->params.log_sq_size; |
365 | } | 411 | } |
366 | 412 | ||
@@ -370,9 +416,13 @@ static int mlx5e_set_ringparam(struct net_device *dev, | |||
370 | struct mlx5e_priv *priv = netdev_priv(dev); | 416 | struct mlx5e_priv *priv = netdev_priv(dev); |
371 | bool was_opened; | 417 | bool was_opened; |
372 | int rq_wq_type = priv->params.rq_wq_type; | 418 | int rq_wq_type = priv->params.rq_wq_type; |
419 | u32 rx_pending_wqes; | ||
420 | u32 min_rq_size; | ||
421 | u32 max_rq_size; | ||
373 | u16 min_rx_wqes; | 422 | u16 min_rx_wqes; |
374 | u8 log_rq_size; | 423 | u8 log_rq_size; |
375 | u8 log_sq_size; | 424 | u8 log_sq_size; |
425 | u32 num_mtts; | ||
376 | int err = 0; | 426 | int err = 0; |
377 | 427 | ||
378 | if (param->rx_jumbo_pending) { | 428 | if (param->rx_jumbo_pending) { |
@@ -385,18 +435,36 @@ static int mlx5e_set_ringparam(struct net_device *dev, | |||
385 | __func__); | 435 | __func__); |
386 | return -EINVAL; | 436 | return -EINVAL; |
387 | } | 437 | } |
388 | if (param->rx_pending < (1 << mlx5_min_log_rq_size(rq_wq_type))) { | 438 | |
439 | min_rq_size = mlx5e_rx_wqes_to_packets(priv, rq_wq_type, | ||
440 | 1 << mlx5_min_log_rq_size(rq_wq_type)); | ||
441 | max_rq_size = mlx5e_rx_wqes_to_packets(priv, rq_wq_type, | ||
442 | 1 << mlx5_max_log_rq_size(rq_wq_type)); | ||
443 | rx_pending_wqes = mlx5e_packets_to_rx_wqes(priv, rq_wq_type, | ||
444 | param->rx_pending); | ||
445 | |||
446 | if (param->rx_pending < min_rq_size) { | ||
389 | netdev_info(dev, "%s: rx_pending (%d) < min (%d)\n", | 447 | netdev_info(dev, "%s: rx_pending (%d) < min (%d)\n", |
390 | __func__, param->rx_pending, | 448 | __func__, param->rx_pending, |
391 | 1 << mlx5_min_log_rq_size(rq_wq_type)); | 449 | min_rq_size); |
392 | return -EINVAL; | 450 | return -EINVAL; |
393 | } | 451 | } |
394 | if (param->rx_pending > (1 << mlx5_max_log_rq_size(rq_wq_type))) { | 452 | if (param->rx_pending > max_rq_size) { |
395 | netdev_info(dev, "%s: rx_pending (%d) > max (%d)\n", | 453 | netdev_info(dev, "%s: rx_pending (%d) > max (%d)\n", |
396 | __func__, param->rx_pending, | 454 | __func__, param->rx_pending, |
397 | 1 << mlx5_max_log_rq_size(rq_wq_type)); | 455 | max_rq_size); |
398 | return -EINVAL; | 456 | return -EINVAL; |
399 | } | 457 | } |
458 | |||
459 | num_mtts = MLX5E_REQUIRED_MTTS(priv->params.num_channels, | ||
460 | rx_pending_wqes); | ||
461 | if (priv->params.rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ && | ||
462 | !MLX5E_VALID_NUM_MTTS(num_mtts)) { | ||
463 | netdev_info(dev, "%s: rx_pending (%d) request can't be satisfied, try to reduce.\n", | ||
464 | __func__, param->rx_pending); | ||
465 | return -EINVAL; | ||
466 | } | ||
467 | |||
400 | if (param->tx_pending < (1 << MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE)) { | 468 | if (param->tx_pending < (1 << MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE)) { |
401 | netdev_info(dev, "%s: tx_pending (%d) < min (%d)\n", | 469 | netdev_info(dev, "%s: tx_pending (%d) < min (%d)\n", |
402 | __func__, param->tx_pending, | 470 | __func__, param->tx_pending, |
@@ -410,9 +478,9 @@ static int mlx5e_set_ringparam(struct net_device *dev, | |||
410 | return -EINVAL; | 478 | return -EINVAL; |
411 | } | 479 | } |
412 | 480 | ||
413 | log_rq_size = order_base_2(param->rx_pending); | 481 | log_rq_size = order_base_2(rx_pending_wqes); |
414 | log_sq_size = order_base_2(param->tx_pending); | 482 | log_sq_size = order_base_2(param->tx_pending); |
415 | min_rx_wqes = mlx5_min_rx_wqes(rq_wq_type, param->rx_pending); | 483 | min_rx_wqes = mlx5_min_rx_wqes(rq_wq_type, rx_pending_wqes); |
416 | 484 | ||
417 | if (log_rq_size == priv->params.log_rq_size && | 485 | if (log_rq_size == priv->params.log_rq_size && |
418 | log_sq_size == priv->params.log_sq_size && | 486 | log_sq_size == priv->params.log_sq_size && |
@@ -454,6 +522,7 @@ static int mlx5e_set_channels(struct net_device *dev, | |||
454 | unsigned int count = ch->combined_count; | 522 | unsigned int count = ch->combined_count; |
455 | bool arfs_enabled; | 523 | bool arfs_enabled; |
456 | bool was_opened; | 524 | bool was_opened; |
525 | u32 num_mtts; | ||
457 | int err = 0; | 526 | int err = 0; |
458 | 527 | ||
459 | if (!count) { | 528 | if (!count) { |
@@ -472,6 +541,14 @@ static int mlx5e_set_channels(struct net_device *dev, | |||
472 | return -EINVAL; | 541 | return -EINVAL; |
473 | } | 542 | } |
474 | 543 | ||
544 | num_mtts = MLX5E_REQUIRED_MTTS(count, BIT(priv->params.log_rq_size)); | ||
545 | if (priv->params.rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ && | ||
546 | !MLX5E_VALID_NUM_MTTS(num_mtts)) { | ||
547 | netdev_info(dev, "%s: rx count (%d) request can't be satisfied, try to reduce.\n", | ||
548 | __func__, count); | ||
549 | return -EINVAL; | ||
550 | } | ||
551 | |||
475 | if (priv->params.num_channels == count) | 552 | if (priv->params.num_channels == count) |
476 | return 0; | 553 | return 0; |
477 | 554 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 870bea37c57c..2459c7f3db8d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | |||
@@ -39,13 +39,6 @@ | |||
39 | #include "eswitch.h" | 39 | #include "eswitch.h" |
40 | #include "vxlan.h" | 40 | #include "vxlan.h" |
41 | 41 | ||
42 | enum { | ||
43 | MLX5_EN_QP_FLUSH_TIMEOUT_MS = 5000, | ||
44 | MLX5_EN_QP_FLUSH_MSLEEP_QUANT = 20, | ||
45 | MLX5_EN_QP_FLUSH_MAX_ITER = MLX5_EN_QP_FLUSH_TIMEOUT_MS / | ||
46 | MLX5_EN_QP_FLUSH_MSLEEP_QUANT, | ||
47 | }; | ||
48 | |||
49 | struct mlx5e_rq_param { | 42 | struct mlx5e_rq_param { |
50 | u32 rqc[MLX5_ST_SZ_DW(rqc)]; | 43 | u32 rqc[MLX5_ST_SZ_DW(rqc)]; |
51 | struct mlx5_wq_param wq; | 44 | struct mlx5_wq_param wq; |
@@ -162,6 +155,7 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv) | |||
162 | s->tx_queue_stopped += sq_stats->stopped; | 155 | s->tx_queue_stopped += sq_stats->stopped; |
163 | s->tx_queue_wake += sq_stats->wake; | 156 | s->tx_queue_wake += sq_stats->wake; |
164 | s->tx_queue_dropped += sq_stats->dropped; | 157 | s->tx_queue_dropped += sq_stats->dropped; |
158 | s->tx_xmit_more += sq_stats->xmit_more; | ||
165 | s->tx_csum_partial_inner += sq_stats->csum_partial_inner; | 159 | s->tx_csum_partial_inner += sq_stats->csum_partial_inner; |
166 | tx_offload_none += sq_stats->csum_none; | 160 | tx_offload_none += sq_stats->csum_none; |
167 | } | 161 | } |
@@ -340,6 +334,9 @@ static int mlx5e_create_rq(struct mlx5e_channel *c, | |||
340 | rq->alloc_wqe = mlx5e_alloc_rx_mpwqe; | 334 | rq->alloc_wqe = mlx5e_alloc_rx_mpwqe; |
341 | rq->dealloc_wqe = mlx5e_dealloc_rx_mpwqe; | 335 | rq->dealloc_wqe = mlx5e_dealloc_rx_mpwqe; |
342 | 336 | ||
337 | rq->mpwqe_mtt_offset = c->ix * | ||
338 | MLX5E_REQUIRED_MTTS(1, BIT(priv->params.log_rq_size)); | ||
339 | |||
343 | rq->mpwqe_stride_sz = BIT(priv->params.mpwqe_log_stride_sz); | 340 | rq->mpwqe_stride_sz = BIT(priv->params.mpwqe_log_stride_sz); |
344 | rq->mpwqe_num_strides = BIT(priv->params.mpwqe_log_num_strides); | 341 | rq->mpwqe_num_strides = BIT(priv->params.mpwqe_log_num_strides); |
345 | rq->wqe_sz = rq->mpwqe_stride_sz * rq->mpwqe_num_strides; | 342 | rq->wqe_sz = rq->mpwqe_stride_sz * rq->mpwqe_num_strides; |
@@ -428,7 +425,6 @@ static int mlx5e_enable_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param) | |||
428 | 425 | ||
429 | MLX5_SET(rqc, rqc, cqn, rq->cq.mcq.cqn); | 426 | MLX5_SET(rqc, rqc, cqn, rq->cq.mcq.cqn); |
430 | MLX5_SET(rqc, rqc, state, MLX5_RQC_STATE_RST); | 427 | MLX5_SET(rqc, rqc, state, MLX5_RQC_STATE_RST); |
431 | MLX5_SET(rqc, rqc, flush_in_error_en, 1); | ||
432 | MLX5_SET(rqc, rqc, vsd, priv->params.vlan_strip_disable); | 428 | MLX5_SET(rqc, rqc, vsd, priv->params.vlan_strip_disable); |
433 | MLX5_SET(wq, wq, log_wq_pg_sz, rq->wq_ctrl.buf.page_shift - | 429 | MLX5_SET(wq, wq, log_wq_pg_sz, rq->wq_ctrl.buf.page_shift - |
434 | MLX5_ADAPTER_PAGE_SHIFT); | 430 | MLX5_ADAPTER_PAGE_SHIFT); |
@@ -525,6 +521,27 @@ static int mlx5e_wait_for_min_rx_wqes(struct mlx5e_rq *rq) | |||
525 | return -ETIMEDOUT; | 521 | return -ETIMEDOUT; |
526 | } | 522 | } |
527 | 523 | ||
524 | static void mlx5e_free_rx_descs(struct mlx5e_rq *rq) | ||
525 | { | ||
526 | struct mlx5_wq_ll *wq = &rq->wq; | ||
527 | struct mlx5e_rx_wqe *wqe; | ||
528 | __be16 wqe_ix_be; | ||
529 | u16 wqe_ix; | ||
530 | |||
531 | /* UMR WQE (if in progress) is always at wq->head */ | ||
532 | if (test_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state)) | ||
533 | mlx5e_free_rx_fragmented_mpwqe(rq, &rq->wqe_info[wq->head]); | ||
534 | |||
535 | while (!mlx5_wq_ll_is_empty(wq)) { | ||
536 | wqe_ix_be = *wq->tail_next; | ||
537 | wqe_ix = be16_to_cpu(wqe_ix_be); | ||
538 | wqe = mlx5_wq_ll_get_wqe(&rq->wq, wqe_ix); | ||
539 | rq->dealloc_wqe(rq, wqe_ix); | ||
540 | mlx5_wq_ll_pop(&rq->wq, wqe_ix_be, | ||
541 | &wqe->next.next_wqe_index); | ||
542 | } | ||
543 | } | ||
544 | |||
528 | static int mlx5e_open_rq(struct mlx5e_channel *c, | 545 | static int mlx5e_open_rq(struct mlx5e_channel *c, |
529 | struct mlx5e_rq_param *param, | 546 | struct mlx5e_rq_param *param, |
530 | struct mlx5e_rq *rq) | 547 | struct mlx5e_rq *rq) |
@@ -548,8 +565,6 @@ static int mlx5e_open_rq(struct mlx5e_channel *c, | |||
548 | if (param->am_enabled) | 565 | if (param->am_enabled) |
549 | set_bit(MLX5E_RQ_STATE_AM, &c->rq.state); | 566 | set_bit(MLX5E_RQ_STATE_AM, &c->rq.state); |
550 | 567 | ||
551 | set_bit(MLX5E_RQ_STATE_POST_WQES_ENABLE, &rq->state); | ||
552 | |||
553 | sq->ico_wqe_info[pi].opcode = MLX5_OPCODE_NOP; | 568 | sq->ico_wqe_info[pi].opcode = MLX5_OPCODE_NOP; |
554 | sq->ico_wqe_info[pi].num_wqebbs = 1; | 569 | sq->ico_wqe_info[pi].num_wqebbs = 1; |
555 | mlx5e_send_nop(sq, true); /* trigger mlx5e_post_rx_wqes() */ | 570 | mlx5e_send_nop(sq, true); /* trigger mlx5e_post_rx_wqes() */ |
@@ -566,23 +581,8 @@ err_destroy_rq: | |||
566 | 581 | ||
567 | static void mlx5e_close_rq(struct mlx5e_rq *rq) | 582 | static void mlx5e_close_rq(struct mlx5e_rq *rq) |
568 | { | 583 | { |
569 | int tout = 0; | 584 | set_bit(MLX5E_RQ_STATE_FLUSH, &rq->state); |
570 | int err; | ||
571 | |||
572 | clear_bit(MLX5E_RQ_STATE_POST_WQES_ENABLE, &rq->state); | ||
573 | napi_synchronize(&rq->channel->napi); /* prevent mlx5e_post_rx_wqes */ | 585 | napi_synchronize(&rq->channel->napi); /* prevent mlx5e_post_rx_wqes */ |
574 | |||
575 | err = mlx5e_modify_rq_state(rq, MLX5_RQC_STATE_RDY, MLX5_RQC_STATE_ERR); | ||
576 | while (!mlx5_wq_ll_is_empty(&rq->wq) && !err && | ||
577 | tout++ < MLX5_EN_QP_FLUSH_MAX_ITER) | ||
578 | msleep(MLX5_EN_QP_FLUSH_MSLEEP_QUANT); | ||
579 | |||
580 | if (err || tout == MLX5_EN_QP_FLUSH_MAX_ITER) | ||
581 | set_bit(MLX5E_RQ_STATE_FLUSH_TIMEOUT, &rq->state); | ||
582 | |||
583 | /* avoid destroying rq before mlx5e_poll_rx_cq() is done with it */ | ||
584 | napi_synchronize(&rq->channel->napi); | ||
585 | |||
586 | cancel_work_sync(&rq->am.work); | 586 | cancel_work_sync(&rq->am.work); |
587 | 587 | ||
588 | mlx5e_disable_rq(rq); | 588 | mlx5e_disable_rq(rq); |
@@ -821,7 +821,6 @@ static int mlx5e_open_sq(struct mlx5e_channel *c, | |||
821 | goto err_disable_sq; | 821 | goto err_disable_sq; |
822 | 822 | ||
823 | if (sq->txq) { | 823 | if (sq->txq) { |
824 | set_bit(MLX5E_SQ_STATE_WAKE_TXQ_ENABLE, &sq->state); | ||
825 | netdev_tx_reset_queue(sq->txq); | 824 | netdev_tx_reset_queue(sq->txq); |
826 | netif_tx_start_queue(sq->txq); | 825 | netif_tx_start_queue(sq->txq); |
827 | } | 826 | } |
@@ -845,38 +844,20 @@ static inline void netif_tx_disable_queue(struct netdev_queue *txq) | |||
845 | 844 | ||
846 | static void mlx5e_close_sq(struct mlx5e_sq *sq) | 845 | static void mlx5e_close_sq(struct mlx5e_sq *sq) |
847 | { | 846 | { |
848 | int tout = 0; | 847 | set_bit(MLX5E_SQ_STATE_FLUSH, &sq->state); |
849 | int err; | 848 | /* prevent netif_tx_wake_queue */ |
849 | napi_synchronize(&sq->channel->napi); | ||
850 | 850 | ||
851 | if (sq->txq) { | 851 | if (sq->txq) { |
852 | clear_bit(MLX5E_SQ_STATE_WAKE_TXQ_ENABLE, &sq->state); | ||
853 | /* prevent netif_tx_wake_queue */ | ||
854 | napi_synchronize(&sq->channel->napi); | ||
855 | netif_tx_disable_queue(sq->txq); | 852 | netif_tx_disable_queue(sq->txq); |
856 | 853 | ||
857 | /* ensure hw is notified of all pending wqes */ | 854 | /* last doorbell out, godspeed .. */ |
858 | if (mlx5e_sq_has_room_for(sq, 1)) | 855 | if (mlx5e_sq_has_room_for(sq, 1)) |
859 | mlx5e_send_nop(sq, true); | 856 | mlx5e_send_nop(sq, true); |
860 | |||
861 | err = mlx5e_modify_sq(sq, MLX5_SQC_STATE_RDY, | ||
862 | MLX5_SQC_STATE_ERR, false, 0); | ||
863 | if (err) | ||
864 | set_bit(MLX5E_SQ_STATE_TX_TIMEOUT, &sq->state); | ||
865 | } | ||
866 | |||
867 | /* wait till sq is empty, unless a TX timeout occurred on this SQ */ | ||
868 | while (sq->cc != sq->pc && | ||
869 | !test_bit(MLX5E_SQ_STATE_TX_TIMEOUT, &sq->state)) { | ||
870 | msleep(MLX5_EN_QP_FLUSH_MSLEEP_QUANT); | ||
871 | if (tout++ > MLX5_EN_QP_FLUSH_MAX_ITER) | ||
872 | set_bit(MLX5E_SQ_STATE_TX_TIMEOUT, &sq->state); | ||
873 | } | 857 | } |
874 | 858 | ||
875 | /* avoid destroying sq before mlx5e_poll_tx_cq() is done with it */ | ||
876 | napi_synchronize(&sq->channel->napi); | ||
877 | |||
878 | mlx5e_free_tx_descs(sq); | ||
879 | mlx5e_disable_sq(sq); | 859 | mlx5e_disable_sq(sq); |
860 | mlx5e_free_tx_descs(sq); | ||
880 | mlx5e_destroy_sq(sq); | 861 | mlx5e_destroy_sq(sq); |
881 | } | 862 | } |
882 | 863 | ||
@@ -1826,10 +1807,6 @@ int mlx5e_open_locked(struct net_device *netdev) | |||
1826 | netif_set_real_num_tx_queues(netdev, num_txqs); | 1807 | netif_set_real_num_tx_queues(netdev, num_txqs); |
1827 | netif_set_real_num_rx_queues(netdev, priv->params.num_channels); | 1808 | netif_set_real_num_rx_queues(netdev, priv->params.num_channels); |
1828 | 1809 | ||
1829 | err = mlx5e_set_dev_port_mtu(netdev); | ||
1830 | if (err) | ||
1831 | goto err_clear_state_opened_flag; | ||
1832 | |||
1833 | err = mlx5e_open_channels(priv); | 1810 | err = mlx5e_open_channels(priv); |
1834 | if (err) { | 1811 | if (err) { |
1835 | netdev_err(netdev, "%s: mlx5e_open_channels failed, %d\n", | 1812 | netdev_err(netdev, "%s: mlx5e_open_channels failed, %d\n", |
@@ -2573,6 +2550,7 @@ static int mlx5e_change_mtu(struct net_device *netdev, int new_mtu) | |||
2573 | u16 max_mtu; | 2550 | u16 max_mtu; |
2574 | u16 min_mtu; | 2551 | u16 min_mtu; |
2575 | int err = 0; | 2552 | int err = 0; |
2553 | bool reset; | ||
2576 | 2554 | ||
2577 | mlx5_query_port_max_mtu(mdev, &max_mtu, 1); | 2555 | mlx5_query_port_max_mtu(mdev, &max_mtu, 1); |
2578 | 2556 | ||
@@ -2588,13 +2566,18 @@ static int mlx5e_change_mtu(struct net_device *netdev, int new_mtu) | |||
2588 | 2566 | ||
2589 | mutex_lock(&priv->state_lock); | 2567 | mutex_lock(&priv->state_lock); |
2590 | 2568 | ||
2569 | reset = !priv->params.lro_en && | ||
2570 | (priv->params.rq_wq_type != | ||
2571 | MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ); | ||
2572 | |||
2591 | was_opened = test_bit(MLX5E_STATE_OPENED, &priv->state); | 2573 | was_opened = test_bit(MLX5E_STATE_OPENED, &priv->state); |
2592 | if (was_opened) | 2574 | if (was_opened && reset) |
2593 | mlx5e_close_locked(netdev); | 2575 | mlx5e_close_locked(netdev); |
2594 | 2576 | ||
2595 | netdev->mtu = new_mtu; | 2577 | netdev->mtu = new_mtu; |
2578 | mlx5e_set_dev_port_mtu(netdev); | ||
2596 | 2579 | ||
2597 | if (was_opened) | 2580 | if (was_opened && reset) |
2598 | err = mlx5e_open_locked(netdev); | 2581 | err = mlx5e_open_locked(netdev); |
2599 | 2582 | ||
2600 | mutex_unlock(&priv->state_lock); | 2583 | mutex_unlock(&priv->state_lock); |
@@ -2794,7 +2777,7 @@ static void mlx5e_tx_timeout(struct net_device *dev) | |||
2794 | if (!netif_xmit_stopped(netdev_get_tx_queue(dev, i))) | 2777 | if (!netif_xmit_stopped(netdev_get_tx_queue(dev, i))) |
2795 | continue; | 2778 | continue; |
2796 | sched_work = true; | 2779 | sched_work = true; |
2797 | set_bit(MLX5E_SQ_STATE_TX_TIMEOUT, &sq->state); | 2780 | set_bit(MLX5E_SQ_STATE_FLUSH, &sq->state); |
2798 | netdev_err(dev, "TX timeout on queue: %d, SQ: 0x%x, CQ: 0x%x, SQ Cons: 0x%x SQ Prod: 0x%x\n", | 2781 | netdev_err(dev, "TX timeout on queue: %d, SQ: 0x%x, CQ: 0x%x, SQ Cons: 0x%x SQ Prod: 0x%x\n", |
2799 | i, sq->sqn, sq->cq.mcq.cqn, sq->cc, sq->pc); | 2782 | i, sq->sqn, sq->cq.mcq.cqn, sq->cc, sq->pc); |
2800 | } | 2783 | } |
@@ -3231,8 +3214,8 @@ static int mlx5e_create_umr_mkey(struct mlx5e_priv *priv) | |||
3231 | struct mlx5_create_mkey_mbox_in *in; | 3214 | struct mlx5_create_mkey_mbox_in *in; |
3232 | struct mlx5_mkey_seg *mkc; | 3215 | struct mlx5_mkey_seg *mkc; |
3233 | int inlen = sizeof(*in); | 3216 | int inlen = sizeof(*in); |
3234 | u64 npages = | 3217 | u64 npages = MLX5E_REQUIRED_MTTS(priv->profile->max_nch(mdev), |
3235 | priv->profile->max_nch(mdev) * MLX5_CHANNEL_MAX_NUM_MTTS; | 3218 | BIT(MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE_MPW)); |
3236 | int err; | 3219 | int err; |
3237 | 3220 | ||
3238 | in = mlx5_vzalloc(inlen); | 3221 | in = mlx5_vzalloc(inlen); |
@@ -3246,10 +3229,12 @@ static int mlx5e_create_umr_mkey(struct mlx5e_priv *priv) | |||
3246 | MLX5_PERM_LOCAL_WRITE | | 3229 | MLX5_PERM_LOCAL_WRITE | |
3247 | MLX5_ACCESS_MODE_MTT; | 3230 | MLX5_ACCESS_MODE_MTT; |
3248 | 3231 | ||
3232 | npages = min_t(u32, ALIGN(U16_MAX, 4) * 2, npages); | ||
3233 | |||
3249 | mkc->qpn_mkey7_0 = cpu_to_be32(0xffffff << 8); | 3234 | mkc->qpn_mkey7_0 = cpu_to_be32(0xffffff << 8); |
3250 | mkc->flags_pd = cpu_to_be32(mdev->mlx5e_res.pdn); | 3235 | mkc->flags_pd = cpu_to_be32(mdev->mlx5e_res.pdn); |
3251 | mkc->len = cpu_to_be64(npages << PAGE_SHIFT); | 3236 | mkc->len = cpu_to_be64(npages << PAGE_SHIFT); |
3252 | mkc->xlt_oct_size = cpu_to_be32(mlx5e_get_mtt_octw(npages)); | 3237 | mkc->xlt_oct_size = cpu_to_be32(MLX5_MTT_OCTW(npages)); |
3253 | mkc->log2_page_size = PAGE_SHIFT; | 3238 | mkc->log2_page_size = PAGE_SHIFT; |
3254 | 3239 | ||
3255 | err = mlx5_core_create_mkey(mdev, &priv->umr_mkey, in, inlen, NULL, | 3240 | err = mlx5_core_create_mkey(mdev, &priv->umr_mkey, in, inlen, NULL, |
@@ -3385,6 +3370,7 @@ static void mlx5e_nic_enable(struct mlx5e_priv *priv) | |||
3385 | queue_work(priv->wq, &priv->set_rx_mode_work); | 3370 | queue_work(priv->wq, &priv->set_rx_mode_work); |
3386 | 3371 | ||
3387 | if (MLX5_CAP_GEN(mdev, vport_group_manager)) { | 3372 | if (MLX5_CAP_GEN(mdev, vport_group_manager)) { |
3373 | mlx5_query_nic_vport_mac_address(mdev, 0, rep.hw_id); | ||
3388 | rep.load = mlx5e_nic_rep_load; | 3374 | rep.load = mlx5e_nic_rep_load; |
3389 | rep.unload = mlx5e_nic_rep_unload; | 3375 | rep.unload = mlx5e_nic_rep_unload; |
3390 | rep.vport = 0; | 3376 | rep.vport = 0; |
@@ -3463,6 +3449,8 @@ void *mlx5e_create_netdev(struct mlx5_core_dev *mdev, | |||
3463 | 3449 | ||
3464 | mlx5e_init_l2_addr(priv); | 3450 | mlx5e_init_l2_addr(priv); |
3465 | 3451 | ||
3452 | mlx5e_set_dev_port_mtu(netdev); | ||
3453 | |||
3466 | err = register_netdev(netdev); | 3454 | err = register_netdev(netdev); |
3467 | if (err) { | 3455 | if (err) { |
3468 | mlx5_core_err(mdev, "register_netdev failed, %d\n", err); | 3456 | mlx5_core_err(mdev, "register_netdev failed, %d\n", err); |
@@ -3501,16 +3489,20 @@ static void mlx5e_register_vport_rep(struct mlx5_core_dev *mdev) | |||
3501 | struct mlx5_eswitch *esw = mdev->priv.eswitch; | 3489 | struct mlx5_eswitch *esw = mdev->priv.eswitch; |
3502 | int total_vfs = MLX5_TOTAL_VPORTS(mdev); | 3490 | int total_vfs = MLX5_TOTAL_VPORTS(mdev); |
3503 | int vport; | 3491 | int vport; |
3492 | u8 mac[ETH_ALEN]; | ||
3504 | 3493 | ||
3505 | if (!MLX5_CAP_GEN(mdev, vport_group_manager)) | 3494 | if (!MLX5_CAP_GEN(mdev, vport_group_manager)) |
3506 | return; | 3495 | return; |
3507 | 3496 | ||
3497 | mlx5_query_nic_vport_mac_address(mdev, 0, mac); | ||
3498 | |||
3508 | for (vport = 1; vport < total_vfs; vport++) { | 3499 | for (vport = 1; vport < total_vfs; vport++) { |
3509 | struct mlx5_eswitch_rep rep; | 3500 | struct mlx5_eswitch_rep rep; |
3510 | 3501 | ||
3511 | rep.load = mlx5e_vport_rep_load; | 3502 | rep.load = mlx5e_vport_rep_load; |
3512 | rep.unload = mlx5e_vport_rep_unload; | 3503 | rep.unload = mlx5e_vport_rep_unload; |
3513 | rep.vport = vport; | 3504 | rep.vport = vport; |
3505 | ether_addr_copy(rep.hw_id, mac); | ||
3514 | mlx5_eswitch_register_vport_rep(esw, &rep); | 3506 | mlx5_eswitch_register_vport_rep(esw, &rep); |
3515 | } | 3507 | } |
3516 | } | 3508 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index 1c7d8b8314bf..134de4a11f1d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | |||
@@ -135,17 +135,16 @@ static const struct ethtool_ops mlx5e_rep_ethtool_ops = { | |||
135 | int mlx5e_attr_get(struct net_device *dev, struct switchdev_attr *attr) | 135 | int mlx5e_attr_get(struct net_device *dev, struct switchdev_attr *attr) |
136 | { | 136 | { |
137 | struct mlx5e_priv *priv = netdev_priv(dev); | 137 | struct mlx5e_priv *priv = netdev_priv(dev); |
138 | struct mlx5_eswitch_rep *rep = priv->ppriv; | ||
138 | struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; | 139 | struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; |
139 | u8 mac[ETH_ALEN]; | ||
140 | 140 | ||
141 | if (esw->mode == SRIOV_NONE) | 141 | if (esw->mode == SRIOV_NONE) |
142 | return -EOPNOTSUPP; | 142 | return -EOPNOTSUPP; |
143 | 143 | ||
144 | switch (attr->id) { | 144 | switch (attr->id) { |
145 | case SWITCHDEV_ATTR_ID_PORT_PARENT_ID: | 145 | case SWITCHDEV_ATTR_ID_PORT_PARENT_ID: |
146 | mlx5_query_nic_vport_mac_address(priv->mdev, 0, mac); | ||
147 | attr->u.ppid.id_len = ETH_ALEN; | 146 | attr->u.ppid.id_len = ETH_ALEN; |
148 | memcpy(&attr->u.ppid.id, &mac, ETH_ALEN); | 147 | ether_addr_copy(attr->u.ppid.id, rep->hw_id); |
149 | break; | 148 | break; |
150 | default: | 149 | default: |
151 | return -EOPNOTSUPP; | 150 | return -EOPNOTSUPP; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c index 9f2a16a507e0..b6f8ebbdb487 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | |||
@@ -324,9 +324,9 @@ mlx5e_copy_skb_header_fragmented_mpwqe(struct device *pdev, | |||
324 | } | 324 | } |
325 | } | 325 | } |
326 | 326 | ||
327 | static u16 mlx5e_get_wqe_mtt_offset(u16 rq_ix, u16 wqe_ix) | 327 | static u32 mlx5e_get_wqe_mtt_offset(struct mlx5e_rq *rq, u16 wqe_ix) |
328 | { | 328 | { |
329 | return rq_ix * MLX5_CHANNEL_MAX_NUM_MTTS + | 329 | return rq->mpwqe_mtt_offset + |
330 | wqe_ix * ALIGN(MLX5_MPWRQ_PAGES_PER_WQE, 8); | 330 | wqe_ix * ALIGN(MLX5_MPWRQ_PAGES_PER_WQE, 8); |
331 | } | 331 | } |
332 | 332 | ||
@@ -340,7 +340,7 @@ static void mlx5e_build_umr_wqe(struct mlx5e_rq *rq, | |||
340 | struct mlx5_wqe_data_seg *dseg = &wqe->data; | 340 | struct mlx5_wqe_data_seg *dseg = &wqe->data; |
341 | struct mlx5e_mpw_info *wi = &rq->wqe_info[ix]; | 341 | struct mlx5e_mpw_info *wi = &rq->wqe_info[ix]; |
342 | u8 ds_cnt = DIV_ROUND_UP(sizeof(*wqe), MLX5_SEND_WQE_DS); | 342 | u8 ds_cnt = DIV_ROUND_UP(sizeof(*wqe), MLX5_SEND_WQE_DS); |
343 | u16 umr_wqe_mtt_offset = mlx5e_get_wqe_mtt_offset(rq->ix, ix); | 343 | u32 umr_wqe_mtt_offset = mlx5e_get_wqe_mtt_offset(rq, ix); |
344 | 344 | ||
345 | memset(wqe, 0, sizeof(*wqe)); | 345 | memset(wqe, 0, sizeof(*wqe)); |
346 | cseg->opmod_idx_opcode = | 346 | cseg->opmod_idx_opcode = |
@@ -353,9 +353,9 @@ static void mlx5e_build_umr_wqe(struct mlx5e_rq *rq, | |||
353 | 353 | ||
354 | ucseg->flags = MLX5_UMR_TRANSLATION_OFFSET_EN; | 354 | ucseg->flags = MLX5_UMR_TRANSLATION_OFFSET_EN; |
355 | ucseg->klm_octowords = | 355 | ucseg->klm_octowords = |
356 | cpu_to_be16(mlx5e_get_mtt_octw(MLX5_MPWRQ_PAGES_PER_WQE)); | 356 | cpu_to_be16(MLX5_MTT_OCTW(MLX5_MPWRQ_PAGES_PER_WQE)); |
357 | ucseg->bsf_octowords = | 357 | ucseg->bsf_octowords = |
358 | cpu_to_be16(mlx5e_get_mtt_octw(umr_wqe_mtt_offset)); | 358 | cpu_to_be16(MLX5_MTT_OCTW(umr_wqe_mtt_offset)); |
359 | ucseg->mkey_mask = cpu_to_be64(MLX5_MKEY_MASK_FREE); | 359 | ucseg->mkey_mask = cpu_to_be64(MLX5_MKEY_MASK_FREE); |
360 | 360 | ||
361 | dseg->lkey = sq->mkey_be; | 361 | dseg->lkey = sq->mkey_be; |
@@ -423,7 +423,7 @@ static int mlx5e_alloc_rx_fragmented_mpwqe(struct mlx5e_rq *rq, | |||
423 | { | 423 | { |
424 | struct mlx5e_mpw_info *wi = &rq->wqe_info[ix]; | 424 | struct mlx5e_mpw_info *wi = &rq->wqe_info[ix]; |
425 | int mtt_sz = mlx5e_get_wqe_mtt_sz(); | 425 | int mtt_sz = mlx5e_get_wqe_mtt_sz(); |
426 | u32 dma_offset = mlx5e_get_wqe_mtt_offset(rq->ix, ix) << PAGE_SHIFT; | 426 | u64 dma_offset = (u64)mlx5e_get_wqe_mtt_offset(rq, ix) << PAGE_SHIFT; |
427 | int i; | 427 | int i; |
428 | 428 | ||
429 | wi->umr.dma_info = kmalloc(sizeof(*wi->umr.dma_info) * | 429 | wi->umr.dma_info = kmalloc(sizeof(*wi->umr.dma_info) * |
@@ -506,6 +506,12 @@ void mlx5e_post_rx_fragmented_mpwqe(struct mlx5e_rq *rq) | |||
506 | struct mlx5e_rx_wqe *wqe = mlx5_wq_ll_get_wqe(wq, wq->head); | 506 | struct mlx5e_rx_wqe *wqe = mlx5_wq_ll_get_wqe(wq, wq->head); |
507 | 507 | ||
508 | clear_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state); | 508 | clear_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state); |
509 | |||
510 | if (unlikely(test_bit(MLX5E_RQ_STATE_FLUSH, &rq->state))) { | ||
511 | mlx5e_free_rx_fragmented_mpwqe(rq, &rq->wqe_info[wq->head]); | ||
512 | return; | ||
513 | } | ||
514 | |||
509 | mlx5_wq_ll_push(wq, be16_to_cpu(wqe->next.next_wqe_index)); | 515 | mlx5_wq_ll_push(wq, be16_to_cpu(wqe->next.next_wqe_index)); |
510 | rq->stats.mpwqe_frag++; | 516 | rq->stats.mpwqe_frag++; |
511 | 517 | ||
@@ -595,26 +601,9 @@ void mlx5e_dealloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix) | |||
595 | wi->free_wqe(rq, wi); | 601 | wi->free_wqe(rq, wi); |
596 | } | 602 | } |
597 | 603 | ||
598 | void mlx5e_free_rx_descs(struct mlx5e_rq *rq) | ||
599 | { | ||
600 | struct mlx5_wq_ll *wq = &rq->wq; | ||
601 | struct mlx5e_rx_wqe *wqe; | ||
602 | __be16 wqe_ix_be; | ||
603 | u16 wqe_ix; | ||
604 | |||
605 | while (!mlx5_wq_ll_is_empty(wq)) { | ||
606 | wqe_ix_be = *wq->tail_next; | ||
607 | wqe_ix = be16_to_cpu(wqe_ix_be); | ||
608 | wqe = mlx5_wq_ll_get_wqe(&rq->wq, wqe_ix); | ||
609 | rq->dealloc_wqe(rq, wqe_ix); | ||
610 | mlx5_wq_ll_pop(&rq->wq, wqe_ix_be, | ||
611 | &wqe->next.next_wqe_index); | ||
612 | } | ||
613 | } | ||
614 | |||
615 | #define RQ_CANNOT_POST(rq) \ | 604 | #define RQ_CANNOT_POST(rq) \ |
616 | (!test_bit(MLX5E_RQ_STATE_POST_WQES_ENABLE, &rq->state) || \ | 605 | (test_bit(MLX5E_RQ_STATE_FLUSH, &rq->state) || \ |
617 | test_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state)) | 606 | test_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state)) |
618 | 607 | ||
619 | bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq) | 608 | bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq) |
620 | { | 609 | { |
@@ -916,7 +905,7 @@ int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget) | |||
916 | struct mlx5e_rq *rq = container_of(cq, struct mlx5e_rq, cq); | 905 | struct mlx5e_rq *rq = container_of(cq, struct mlx5e_rq, cq); |
917 | int work_done = 0; | 906 | int work_done = 0; |
918 | 907 | ||
919 | if (unlikely(test_bit(MLX5E_RQ_STATE_FLUSH_TIMEOUT, &rq->state))) | 908 | if (unlikely(test_bit(MLX5E_RQ_STATE_FLUSH, &rq->state))) |
920 | return 0; | 909 | return 0; |
921 | 910 | ||
922 | if (cq->decmprs_left) | 911 | if (cq->decmprs_left) |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h index 7b9d8a989b52..499487ce3b53 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h | |||
@@ -70,6 +70,7 @@ struct mlx5e_sw_stats { | |||
70 | u64 tx_queue_stopped; | 70 | u64 tx_queue_stopped; |
71 | u64 tx_queue_wake; | 71 | u64 tx_queue_wake; |
72 | u64 tx_queue_dropped; | 72 | u64 tx_queue_dropped; |
73 | u64 tx_xmit_more; | ||
73 | u64 rx_wqe_err; | 74 | u64 rx_wqe_err; |
74 | u64 rx_mpwqe_filler; | 75 | u64 rx_mpwqe_filler; |
75 | u64 rx_mpwqe_frag; | 76 | u64 rx_mpwqe_frag; |
@@ -101,6 +102,7 @@ static const struct counter_desc sw_stats_desc[] = { | |||
101 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) }, | 102 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) }, |
102 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) }, | 103 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) }, |
103 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) }, | 104 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) }, |
105 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xmit_more) }, | ||
104 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_wqe_err) }, | 106 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_wqe_err) }, |
105 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler) }, | 107 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler) }, |
106 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_frag) }, | 108 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_frag) }, |
@@ -298,6 +300,7 @@ struct mlx5e_sq_stats { | |||
298 | /* commonly accessed in data path */ | 300 | /* commonly accessed in data path */ |
299 | u64 packets; | 301 | u64 packets; |
300 | u64 bytes; | 302 | u64 bytes; |
303 | u64 xmit_more; | ||
301 | u64 tso_packets; | 304 | u64 tso_packets; |
302 | u64 tso_bytes; | 305 | u64 tso_bytes; |
303 | u64 tso_inner_packets; | 306 | u64 tso_inner_packets; |
@@ -324,6 +327,7 @@ static const struct counter_desc sq_stats_desc[] = { | |||
324 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, stopped) }, | 327 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, stopped) }, |
325 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, wake) }, | 328 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, wake) }, |
326 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, dropped) }, | 329 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, dropped) }, |
330 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, xmit_more) }, | ||
327 | }; | 331 | }; |
328 | 332 | ||
329 | #define NUM_SW_COUNTERS ARRAY_SIZE(sw_stats_desc) | 333 | #define NUM_SW_COUNTERS ARRAY_SIZE(sw_stats_desc) |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index dc8b1cb0fdc8..22cfc4ac1837 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | |||
@@ -170,7 +170,7 @@ static int parse_cls_flower(struct mlx5e_priv *priv, struct mlx5_flow_spec *spec | |||
170 | if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_CONTROL)) { | 170 | if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_CONTROL)) { |
171 | struct flow_dissector_key_control *key = | 171 | struct flow_dissector_key_control *key = |
172 | skb_flow_dissector_target(f->dissector, | 172 | skb_flow_dissector_target(f->dissector, |
173 | FLOW_DISSECTOR_KEY_BASIC, | 173 | FLOW_DISSECTOR_KEY_CONTROL, |
174 | f->key); | 174 | f->key); |
175 | addr_type = key->addr_type; | 175 | addr_type = key->addr_type; |
176 | } | 176 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c index e073bf59890d..988eca99ee0f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | |||
@@ -375,6 +375,7 @@ static netdev_tx_t mlx5e_sq_xmit(struct mlx5e_sq *sq, struct sk_buff *skb) | |||
375 | 375 | ||
376 | sq->stats.packets++; | 376 | sq->stats.packets++; |
377 | sq->stats.bytes += num_bytes; | 377 | sq->stats.bytes += num_bytes; |
378 | sq->stats.xmit_more += skb->xmit_more; | ||
378 | return NETDEV_TX_OK; | 379 | return NETDEV_TX_OK; |
379 | 380 | ||
380 | dma_unmap_wqe_err: | 381 | dma_unmap_wqe_err: |
@@ -394,35 +395,6 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev) | |||
394 | return mlx5e_sq_xmit(sq, skb); | 395 | return mlx5e_sq_xmit(sq, skb); |
395 | } | 396 | } |
396 | 397 | ||
397 | void mlx5e_free_tx_descs(struct mlx5e_sq *sq) | ||
398 | { | ||
399 | struct mlx5e_tx_wqe_info *wi; | ||
400 | struct sk_buff *skb; | ||
401 | u16 ci; | ||
402 | int i; | ||
403 | |||
404 | while (sq->cc != sq->pc) { | ||
405 | ci = sq->cc & sq->wq.sz_m1; | ||
406 | skb = sq->skb[ci]; | ||
407 | wi = &sq->wqe_info[ci]; | ||
408 | |||
409 | if (!skb) { /* nop */ | ||
410 | sq->cc++; | ||
411 | continue; | ||
412 | } | ||
413 | |||
414 | for (i = 0; i < wi->num_dma; i++) { | ||
415 | struct mlx5e_sq_dma *dma = | ||
416 | mlx5e_dma_get(sq, sq->dma_fifo_cc++); | ||
417 | |||
418 | mlx5e_tx_dma_unmap(sq->pdev, dma); | ||
419 | } | ||
420 | |||
421 | dev_kfree_skb_any(skb); | ||
422 | sq->cc += wi->num_wqebbs; | ||
423 | } | ||
424 | } | ||
425 | |||
426 | bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget) | 398 | bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget) |
427 | { | 399 | { |
428 | struct mlx5e_sq *sq; | 400 | struct mlx5e_sq *sq; |
@@ -434,7 +406,7 @@ bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget) | |||
434 | 406 | ||
435 | sq = container_of(cq, struct mlx5e_sq, cq); | 407 | sq = container_of(cq, struct mlx5e_sq, cq); |
436 | 408 | ||
437 | if (unlikely(test_bit(MLX5E_SQ_STATE_TX_TIMEOUT, &sq->state))) | 409 | if (unlikely(test_bit(MLX5E_SQ_STATE_FLUSH, &sq->state))) |
438 | return false; | 410 | return false; |
439 | 411 | ||
440 | npkts = 0; | 412 | npkts = 0; |
@@ -512,11 +484,39 @@ bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget) | |||
512 | netdev_tx_completed_queue(sq->txq, npkts, nbytes); | 484 | netdev_tx_completed_queue(sq->txq, npkts, nbytes); |
513 | 485 | ||
514 | if (netif_tx_queue_stopped(sq->txq) && | 486 | if (netif_tx_queue_stopped(sq->txq) && |
515 | mlx5e_sq_has_room_for(sq, MLX5E_SQ_STOP_ROOM) && | 487 | mlx5e_sq_has_room_for(sq, MLX5E_SQ_STOP_ROOM)) { |
516 | likely(test_bit(MLX5E_SQ_STATE_WAKE_TXQ_ENABLE, &sq->state))) { | 488 | netif_tx_wake_queue(sq->txq); |
517 | netif_tx_wake_queue(sq->txq); | 489 | sq->stats.wake++; |
518 | sq->stats.wake++; | ||
519 | } | 490 | } |
520 | 491 | ||
521 | return (i == MLX5E_TX_CQ_POLL_BUDGET); | 492 | return (i == MLX5E_TX_CQ_POLL_BUDGET); |
522 | } | 493 | } |
494 | |||
495 | void mlx5e_free_tx_descs(struct mlx5e_sq *sq) | ||
496 | { | ||
497 | struct mlx5e_tx_wqe_info *wi; | ||
498 | struct sk_buff *skb; | ||
499 | u16 ci; | ||
500 | int i; | ||
501 | |||
502 | while (sq->cc != sq->pc) { | ||
503 | ci = sq->cc & sq->wq.sz_m1; | ||
504 | skb = sq->skb[ci]; | ||
505 | wi = &sq->wqe_info[ci]; | ||
506 | |||
507 | if (!skb) { /* nop */ | ||
508 | sq->cc++; | ||
509 | continue; | ||
510 | } | ||
511 | |||
512 | for (i = 0; i < wi->num_dma; i++) { | ||
513 | struct mlx5e_sq_dma *dma = | ||
514 | mlx5e_dma_get(sq, sq->dma_fifo_cc++); | ||
515 | |||
516 | mlx5e_tx_dma_unmap(sq->pdev, dma); | ||
517 | } | ||
518 | |||
519 | dev_kfree_skb_any(skb); | ||
520 | sq->cc += wi->num_wqebbs; | ||
521 | } | ||
522 | } | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c index 64ae2e800daa..9bf33bb69210 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c | |||
@@ -51,16 +51,18 @@ struct mlx5_cqe64 *mlx5e_get_cqe(struct mlx5e_cq *cq) | |||
51 | 51 | ||
52 | static void mlx5e_poll_ico_cq(struct mlx5e_cq *cq) | 52 | static void mlx5e_poll_ico_cq(struct mlx5e_cq *cq) |
53 | { | 53 | { |
54 | struct mlx5e_sq *sq = container_of(cq, struct mlx5e_sq, cq); | ||
54 | struct mlx5_wq_cyc *wq; | 55 | struct mlx5_wq_cyc *wq; |
55 | struct mlx5_cqe64 *cqe; | 56 | struct mlx5_cqe64 *cqe; |
56 | struct mlx5e_sq *sq; | ||
57 | u16 sqcc; | 57 | u16 sqcc; |
58 | 58 | ||
59 | if (unlikely(test_bit(MLX5E_SQ_STATE_FLUSH, &sq->state))) | ||
60 | return; | ||
61 | |||
59 | cqe = mlx5e_get_cqe(cq); | 62 | cqe = mlx5e_get_cqe(cq); |
60 | if (likely(!cqe)) | 63 | if (likely(!cqe)) |
61 | return; | 64 | return; |
62 | 65 | ||
63 | sq = container_of(cq, struct mlx5e_sq, cq); | ||
64 | wq = &sq->wq; | 66 | wq = &sq->wq; |
65 | 67 | ||
66 | /* sq->cc must be updated only after mlx5_cqwq_update_db_record(), | 68 | /* sq->cc must be updated only after mlx5_cqwq_update_db_record(), |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c index f6d667797ee1..8b78f156214e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | |||
@@ -1451,7 +1451,8 @@ static void esw_enable_vport(struct mlx5_eswitch *esw, int vport_num, | |||
1451 | 1451 | ||
1452 | esw_debug(esw->dev, "Enabling VPORT(%d)\n", vport_num); | 1452 | esw_debug(esw->dev, "Enabling VPORT(%d)\n", vport_num); |
1453 | 1453 | ||
1454 | if (vport_num) { /* Only VFs need ACLs for VST and spoofchk filtering */ | 1454 | /* Only VFs need ACLs for VST and spoofchk filtering */ |
1455 | if (vport_num && esw->mode == SRIOV_LEGACY) { | ||
1455 | esw_vport_ingress_config(esw, vport); | 1456 | esw_vport_ingress_config(esw, vport); |
1456 | esw_vport_egress_config(esw, vport); | 1457 | esw_vport_egress_config(esw, vport); |
1457 | } | 1458 | } |
@@ -1502,7 +1503,7 @@ static void esw_disable_vport(struct mlx5_eswitch *esw, int vport_num) | |||
1502 | */ | 1503 | */ |
1503 | esw_vport_change_handle_locked(vport); | 1504 | esw_vport_change_handle_locked(vport); |
1504 | vport->enabled_events = 0; | 1505 | vport->enabled_events = 0; |
1505 | if (vport_num) { | 1506 | if (vport_num && esw->mode == SRIOV_LEGACY) { |
1506 | esw_vport_disable_egress_acl(esw, vport); | 1507 | esw_vport_disable_egress_acl(esw, vport); |
1507 | esw_vport_disable_ingress_acl(esw, vport); | 1508 | esw_vport_disable_ingress_acl(esw, vport); |
1508 | } | 1509 | } |
@@ -1767,7 +1768,7 @@ int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw, | |||
1767 | vport, err); | 1768 | vport, err); |
1768 | 1769 | ||
1769 | mutex_lock(&esw->state_lock); | 1770 | mutex_lock(&esw->state_lock); |
1770 | if (evport->enabled) | 1771 | if (evport->enabled && esw->mode == SRIOV_LEGACY) |
1771 | err = esw_vport_ingress_config(esw, evport); | 1772 | err = esw_vport_ingress_config(esw, evport); |
1772 | mutex_unlock(&esw->state_lock); | 1773 | mutex_unlock(&esw->state_lock); |
1773 | return err; | 1774 | return err; |
@@ -1839,7 +1840,7 @@ int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw, | |||
1839 | mutex_lock(&esw->state_lock); | 1840 | mutex_lock(&esw->state_lock); |
1840 | evport->vlan = vlan; | 1841 | evport->vlan = vlan; |
1841 | evport->qos = qos; | 1842 | evport->qos = qos; |
1842 | if (evport->enabled) { | 1843 | if (evport->enabled && esw->mode == SRIOV_LEGACY) { |
1843 | err = esw_vport_ingress_config(esw, evport); | 1844 | err = esw_vport_ingress_config(esw, evport); |
1844 | if (err) | 1845 | if (err) |
1845 | goto out; | 1846 | goto out; |
@@ -1868,10 +1869,11 @@ int mlx5_eswitch_set_vport_spoofchk(struct mlx5_eswitch *esw, | |||
1868 | mutex_lock(&esw->state_lock); | 1869 | mutex_lock(&esw->state_lock); |
1869 | pschk = evport->spoofchk; | 1870 | pschk = evport->spoofchk; |
1870 | evport->spoofchk = spoofchk; | 1871 | evport->spoofchk = spoofchk; |
1871 | if (evport->enabled) | 1872 | if (evport->enabled && esw->mode == SRIOV_LEGACY) { |
1872 | err = esw_vport_ingress_config(esw, evport); | 1873 | err = esw_vport_ingress_config(esw, evport); |
1873 | if (err) | 1874 | if (err) |
1874 | evport->spoofchk = pschk; | 1875 | evport->spoofchk = pschk; |
1876 | } | ||
1875 | mutex_unlock(&esw->state_lock); | 1877 | mutex_unlock(&esw->state_lock); |
1876 | 1878 | ||
1877 | return err; | 1879 | return err; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h index c0b05603fc31..a96140971d77 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h | |||
@@ -174,6 +174,7 @@ struct mlx5_eswitch_rep { | |||
174 | void *priv_data; | 174 | void *priv_data; |
175 | struct list_head vport_sqs_list; | 175 | struct list_head vport_sqs_list; |
176 | bool valid; | 176 | bool valid; |
177 | u8 hw_id[ETH_ALEN]; | ||
177 | }; | 178 | }; |
178 | 179 | ||
179 | struct mlx5_esw_offload { | 180 | struct mlx5_esw_offload { |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c index a357e8eeeed8..3dc83a9459a4 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | |||
@@ -113,7 +113,7 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *esw, int vport, u32 sqn | |||
113 | dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT; | 113 | dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT; |
114 | dest.vport_num = vport; | 114 | dest.vport_num = vport; |
115 | 115 | ||
116 | flow_rule = mlx5_add_flow_rule(esw->fdb_table.fdb, spec, | 116 | flow_rule = mlx5_add_flow_rule(esw->fdb_table.offloads.fdb, spec, |
117 | MLX5_FLOW_CONTEXT_ACTION_FWD_DEST, | 117 | MLX5_FLOW_CONTEXT_ACTION_FWD_DEST, |
118 | 0, &dest); | 118 | 0, &dest); |
119 | if (IS_ERR(flow_rule)) | 119 | if (IS_ERR(flow_rule)) |
@@ -535,7 +535,7 @@ void esw_offloads_cleanup(struct mlx5_eswitch *esw, int nvports) | |||
535 | esw_destroy_offloads_fdb_table(esw); | 535 | esw_destroy_offloads_fdb_table(esw); |
536 | } | 536 | } |
537 | 537 | ||
538 | static int mlx5_esw_mode_from_devlink(u16 mode, u16 *mlx5_mode) | 538 | static int esw_mode_from_devlink(u16 mode, u16 *mlx5_mode) |
539 | { | 539 | { |
540 | switch (mode) { | 540 | switch (mode) { |
541 | case DEVLINK_ESWITCH_MODE_LEGACY: | 541 | case DEVLINK_ESWITCH_MODE_LEGACY: |
@@ -551,6 +551,22 @@ static int mlx5_esw_mode_from_devlink(u16 mode, u16 *mlx5_mode) | |||
551 | return 0; | 551 | return 0; |
552 | } | 552 | } |
553 | 553 | ||
554 | static int esw_mode_to_devlink(u16 mlx5_mode, u16 *mode) | ||
555 | { | ||
556 | switch (mlx5_mode) { | ||
557 | case SRIOV_LEGACY: | ||
558 | *mode = DEVLINK_ESWITCH_MODE_LEGACY; | ||
559 | break; | ||
560 | case SRIOV_OFFLOADS: | ||
561 | *mode = DEVLINK_ESWITCH_MODE_SWITCHDEV; | ||
562 | break; | ||
563 | default: | ||
564 | return -EINVAL; | ||
565 | } | ||
566 | |||
567 | return 0; | ||
568 | } | ||
569 | |||
554 | int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode) | 570 | int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode) |
555 | { | 571 | { |
556 | struct mlx5_core_dev *dev; | 572 | struct mlx5_core_dev *dev; |
@@ -566,7 +582,7 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode) | |||
566 | if (cur_mlx5_mode == SRIOV_NONE) | 582 | if (cur_mlx5_mode == SRIOV_NONE) |
567 | return -EOPNOTSUPP; | 583 | return -EOPNOTSUPP; |
568 | 584 | ||
569 | if (mlx5_esw_mode_from_devlink(mode, &mlx5_mode)) | 585 | if (esw_mode_from_devlink(mode, &mlx5_mode)) |
570 | return -EINVAL; | 586 | return -EINVAL; |
571 | 587 | ||
572 | if (cur_mlx5_mode == mlx5_mode) | 588 | if (cur_mlx5_mode == mlx5_mode) |
@@ -592,9 +608,7 @@ int mlx5_devlink_eswitch_mode_get(struct devlink *devlink, u16 *mode) | |||
592 | if (dev->priv.eswitch->mode == SRIOV_NONE) | 608 | if (dev->priv.eswitch->mode == SRIOV_NONE) |
593 | return -EOPNOTSUPP; | 609 | return -EOPNOTSUPP; |
594 | 610 | ||
595 | *mode = dev->priv.eswitch->mode; | 611 | return esw_mode_to_devlink(dev->priv.eswitch->mode, mode); |
596 | |||
597 | return 0; | ||
598 | } | 612 | } |
599 | 613 | ||
600 | void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw, | 614 | void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw, |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c index 75bb8c864557..3d6c1f65e586 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | |||
@@ -80,7 +80,7 @@ | |||
80 | LEFTOVERS_NUM_PRIOS) | 80 | LEFTOVERS_NUM_PRIOS) |
81 | 81 | ||
82 | #define ETHTOOL_PRIO_NUM_LEVELS 1 | 82 | #define ETHTOOL_PRIO_NUM_LEVELS 1 |
83 | #define ETHTOOL_NUM_PRIOS 10 | 83 | #define ETHTOOL_NUM_PRIOS 11 |
84 | #define ETHTOOL_MIN_LEVEL (KERNEL_MIN_LEVEL + ETHTOOL_NUM_PRIOS) | 84 | #define ETHTOOL_MIN_LEVEL (KERNEL_MIN_LEVEL + ETHTOOL_NUM_PRIOS) |
85 | /* Vlan, mac, ttc, aRFS */ | 85 | /* Vlan, mac, ttc, aRFS */ |
86 | #define KERNEL_NIC_PRIO_NUM_LEVELS 4 | 86 | #define KERNEL_NIC_PRIO_NUM_LEVELS 4 |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c index c2877e9de8a1..3a9195b4169d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c | |||
@@ -126,12 +126,21 @@ static struct rb_node *mlx5_fc_stats_query(struct mlx5_core_dev *dev, | |||
126 | for (node = &first->node; node; node = rb_next(node)) { | 126 | for (node = &first->node; node; node = rb_next(node)) { |
127 | struct mlx5_fc *counter = rb_entry(node, struct mlx5_fc, node); | 127 | struct mlx5_fc *counter = rb_entry(node, struct mlx5_fc, node); |
128 | struct mlx5_fc_cache *c = &counter->cache; | 128 | struct mlx5_fc_cache *c = &counter->cache; |
129 | u64 packets; | ||
130 | u64 bytes; | ||
129 | 131 | ||
130 | if (counter->id > last_id) | 132 | if (counter->id > last_id) |
131 | break; | 133 | break; |
132 | 134 | ||
133 | mlx5_cmd_fc_bulk_get(dev, b, | 135 | mlx5_cmd_fc_bulk_get(dev, b, |
134 | counter->id, &c->packets, &c->bytes); | 136 | counter->id, &packets, &bytes); |
137 | |||
138 | if (c->packets == packets) | ||
139 | continue; | ||
140 | |||
141 | c->packets = packets; | ||
142 | c->bytes = bytes; | ||
143 | c->lastuse = jiffies; | ||
135 | } | 144 | } |
136 | 145 | ||
137 | out: | 146 | out: |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index 4f491d43e77d..2385bae92672 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | |||
@@ -1420,36 +1420,12 @@ static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev, | |||
1420 | dev_info(&pdev->dev, "%s was called\n", __func__); | 1420 | dev_info(&pdev->dev, "%s was called\n", __func__); |
1421 | mlx5_enter_error_state(dev); | 1421 | mlx5_enter_error_state(dev); |
1422 | mlx5_unload_one(dev, priv); | 1422 | mlx5_unload_one(dev, priv); |
1423 | pci_save_state(pdev); | ||
1423 | mlx5_pci_disable_device(dev); | 1424 | mlx5_pci_disable_device(dev); |
1424 | return state == pci_channel_io_perm_failure ? | 1425 | return state == pci_channel_io_perm_failure ? |
1425 | PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET; | 1426 | PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET; |
1426 | } | 1427 | } |
1427 | 1428 | ||
1428 | static pci_ers_result_t mlx5_pci_slot_reset(struct pci_dev *pdev) | ||
1429 | { | ||
1430 | struct mlx5_core_dev *dev = pci_get_drvdata(pdev); | ||
1431 | int err = 0; | ||
1432 | |||
1433 | dev_info(&pdev->dev, "%s was called\n", __func__); | ||
1434 | |||
1435 | err = mlx5_pci_enable_device(dev); | ||
1436 | if (err) { | ||
1437 | dev_err(&pdev->dev, "%s: mlx5_pci_enable_device failed with error code: %d\n" | ||
1438 | , __func__, err); | ||
1439 | return PCI_ERS_RESULT_DISCONNECT; | ||
1440 | } | ||
1441 | pci_set_master(pdev); | ||
1442 | pci_set_power_state(pdev, PCI_D0); | ||
1443 | pci_restore_state(pdev); | ||
1444 | |||
1445 | return err ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED; | ||
1446 | } | ||
1447 | |||
1448 | void mlx5_disable_device(struct mlx5_core_dev *dev) | ||
1449 | { | ||
1450 | mlx5_pci_err_detected(dev->pdev, 0); | ||
1451 | } | ||
1452 | |||
1453 | /* wait for the device to show vital signs by waiting | 1429 | /* wait for the device to show vital signs by waiting |
1454 | * for the health counter to start counting. | 1430 | * for the health counter to start counting. |
1455 | */ | 1431 | */ |
@@ -1477,21 +1453,44 @@ static int wait_vital(struct pci_dev *pdev) | |||
1477 | return -ETIMEDOUT; | 1453 | return -ETIMEDOUT; |
1478 | } | 1454 | } |
1479 | 1455 | ||
1480 | static void mlx5_pci_resume(struct pci_dev *pdev) | 1456 | static pci_ers_result_t mlx5_pci_slot_reset(struct pci_dev *pdev) |
1481 | { | 1457 | { |
1482 | struct mlx5_core_dev *dev = pci_get_drvdata(pdev); | 1458 | struct mlx5_core_dev *dev = pci_get_drvdata(pdev); |
1483 | struct mlx5_priv *priv = &dev->priv; | ||
1484 | int err; | 1459 | int err; |
1485 | 1460 | ||
1486 | dev_info(&pdev->dev, "%s was called\n", __func__); | 1461 | dev_info(&pdev->dev, "%s was called\n", __func__); |
1487 | 1462 | ||
1488 | pci_save_state(pdev); | 1463 | err = mlx5_pci_enable_device(dev); |
1489 | err = wait_vital(pdev); | ||
1490 | if (err) { | 1464 | if (err) { |
1465 | dev_err(&pdev->dev, "%s: mlx5_pci_enable_device failed with error code: %d\n" | ||
1466 | , __func__, err); | ||
1467 | return PCI_ERS_RESULT_DISCONNECT; | ||
1468 | } | ||
1469 | |||
1470 | pci_set_master(pdev); | ||
1471 | pci_restore_state(pdev); | ||
1472 | |||
1473 | if (wait_vital(pdev)) { | ||
1491 | dev_err(&pdev->dev, "%s: wait_vital timed out\n", __func__); | 1474 | dev_err(&pdev->dev, "%s: wait_vital timed out\n", __func__); |
1492 | return; | 1475 | return PCI_ERS_RESULT_DISCONNECT; |
1493 | } | 1476 | } |
1494 | 1477 | ||
1478 | return PCI_ERS_RESULT_RECOVERED; | ||
1479 | } | ||
1480 | |||
1481 | void mlx5_disable_device(struct mlx5_core_dev *dev) | ||
1482 | { | ||
1483 | mlx5_pci_err_detected(dev->pdev, 0); | ||
1484 | } | ||
1485 | |||
1486 | static void mlx5_pci_resume(struct pci_dev *pdev) | ||
1487 | { | ||
1488 | struct mlx5_core_dev *dev = pci_get_drvdata(pdev); | ||
1489 | struct mlx5_priv *priv = &dev->priv; | ||
1490 | int err; | ||
1491 | |||
1492 | dev_info(&pdev->dev, "%s was called\n", __func__); | ||
1493 | |||
1495 | err = mlx5_load_one(dev, priv); | 1494 | err = mlx5_load_one(dev, priv); |
1496 | if (err) | 1495 | if (err) |
1497 | dev_err(&pdev->dev, "%s: mlx5_load_one failed with error code: %d\n" | 1496 | dev_err(&pdev->dev, "%s: mlx5_load_one failed with error code: %d\n" |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/port.h b/drivers/net/ethernet/mellanox/mlxsw/port.h index f33b997f2b61..af371a82c35b 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/port.h +++ b/drivers/net/ethernet/mellanox/mlxsw/port.h | |||
@@ -56,6 +56,7 @@ | |||
56 | #define MLXSW_PORT_PHY_BITS_MASK (MLXSW_PORT_MAX_PHY_PORTS - 1) | 56 | #define MLXSW_PORT_PHY_BITS_MASK (MLXSW_PORT_MAX_PHY_PORTS - 1) |
57 | 57 | ||
58 | #define MLXSW_PORT_CPU_PORT 0x0 | 58 | #define MLXSW_PORT_CPU_PORT 0x0 |
59 | #define MLXSW_PORT_ROUTER_PORT (MLXSW_PORT_MAX_PHY_PORTS + 2) | ||
59 | 60 | ||
60 | #define MLXSW_PORT_DONT_CARE (MLXSW_PORT_MAX_PORTS) | 61 | #define MLXSW_PORT_DONT_CARE (MLXSW_PORT_MAX_PORTS) |
61 | 62 | ||
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 1f8168906811..7291f2c4b0c7 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | |||
@@ -3324,6 +3324,39 @@ static struct mlxsw_sp_fid *mlxsw_sp_bridge_fid_get(struct mlxsw_sp *mlxsw_sp, | |||
3324 | return mlxsw_sp_fid_find(mlxsw_sp, fid); | 3324 | return mlxsw_sp_fid_find(mlxsw_sp, fid); |
3325 | } | 3325 | } |
3326 | 3326 | ||
3327 | static enum mlxsw_flood_table_type mlxsw_sp_flood_table_type_get(u16 fid) | ||
3328 | { | ||
3329 | return mlxsw_sp_fid_is_vfid(fid) ? MLXSW_REG_SFGC_TABLE_TYPE_FID : | ||
3330 | MLXSW_REG_SFGC_TABLE_TYPE_FID_OFFEST; | ||
3331 | } | ||
3332 | |||
3333 | static u16 mlxsw_sp_flood_table_index_get(u16 fid) | ||
3334 | { | ||
3335 | return mlxsw_sp_fid_is_vfid(fid) ? mlxsw_sp_fid_to_vfid(fid) : fid; | ||
3336 | } | ||
3337 | |||
3338 | static int mlxsw_sp_router_port_flood_set(struct mlxsw_sp *mlxsw_sp, u16 fid, | ||
3339 | bool set) | ||
3340 | { | ||
3341 | enum mlxsw_flood_table_type table_type; | ||
3342 | char *sftr_pl; | ||
3343 | u16 index; | ||
3344 | int err; | ||
3345 | |||
3346 | sftr_pl = kmalloc(MLXSW_REG_SFTR_LEN, GFP_KERNEL); | ||
3347 | if (!sftr_pl) | ||
3348 | return -ENOMEM; | ||
3349 | |||
3350 | table_type = mlxsw_sp_flood_table_type_get(fid); | ||
3351 | index = mlxsw_sp_flood_table_index_get(fid); | ||
3352 | mlxsw_reg_sftr_pack(sftr_pl, MLXSW_SP_FLOOD_TABLE_BM, index, table_type, | ||
3353 | 1, MLXSW_PORT_ROUTER_PORT, set); | ||
3354 | err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sftr), sftr_pl); | ||
3355 | |||
3356 | kfree(sftr_pl); | ||
3357 | return err; | ||
3358 | } | ||
3359 | |||
3327 | static enum mlxsw_reg_ritr_if_type mlxsw_sp_rif_type_get(u16 fid) | 3360 | static enum mlxsw_reg_ritr_if_type mlxsw_sp_rif_type_get(u16 fid) |
3328 | { | 3361 | { |
3329 | if (mlxsw_sp_fid_is_vfid(fid)) | 3362 | if (mlxsw_sp_fid_is_vfid(fid)) |
@@ -3360,10 +3393,14 @@ static int mlxsw_sp_rif_bridge_create(struct mlxsw_sp *mlxsw_sp, | |||
3360 | if (rif == MLXSW_SP_RIF_MAX) | 3393 | if (rif == MLXSW_SP_RIF_MAX) |
3361 | return -ERANGE; | 3394 | return -ERANGE; |
3362 | 3395 | ||
3363 | err = mlxsw_sp_rif_bridge_op(mlxsw_sp, l3_dev, f->fid, rif, true); | 3396 | err = mlxsw_sp_router_port_flood_set(mlxsw_sp, f->fid, true); |
3364 | if (err) | 3397 | if (err) |
3365 | return err; | 3398 | return err; |
3366 | 3399 | ||
3400 | err = mlxsw_sp_rif_bridge_op(mlxsw_sp, l3_dev, f->fid, rif, true); | ||
3401 | if (err) | ||
3402 | goto err_rif_bridge_op; | ||
3403 | |||
3367 | err = mlxsw_sp_rif_fdb_op(mlxsw_sp, l3_dev->dev_addr, f->fid, true); | 3404 | err = mlxsw_sp_rif_fdb_op(mlxsw_sp, l3_dev->dev_addr, f->fid, true); |
3368 | if (err) | 3405 | if (err) |
3369 | goto err_rif_fdb_op; | 3406 | goto err_rif_fdb_op; |
@@ -3385,6 +3422,8 @@ err_rif_alloc: | |||
3385 | mlxsw_sp_rif_fdb_op(mlxsw_sp, l3_dev->dev_addr, f->fid, false); | 3422 | mlxsw_sp_rif_fdb_op(mlxsw_sp, l3_dev->dev_addr, f->fid, false); |
3386 | err_rif_fdb_op: | 3423 | err_rif_fdb_op: |
3387 | mlxsw_sp_rif_bridge_op(mlxsw_sp, l3_dev, f->fid, rif, false); | 3424 | mlxsw_sp_rif_bridge_op(mlxsw_sp, l3_dev, f->fid, rif, false); |
3425 | err_rif_bridge_op: | ||
3426 | mlxsw_sp_router_port_flood_set(mlxsw_sp, f->fid, false); | ||
3388 | return err; | 3427 | return err; |
3389 | } | 3428 | } |
3390 | 3429 | ||
@@ -3404,6 +3443,8 @@ void mlxsw_sp_rif_bridge_destroy(struct mlxsw_sp *mlxsw_sp, | |||
3404 | 3443 | ||
3405 | mlxsw_sp_rif_bridge_op(mlxsw_sp, l3_dev, f->fid, rif, false); | 3444 | mlxsw_sp_rif_bridge_op(mlxsw_sp, l3_dev, f->fid, rif, false); |
3406 | 3445 | ||
3446 | mlxsw_sp_router_port_flood_set(mlxsw_sp, f->fid, false); | ||
3447 | |||
3407 | netdev_dbg(l3_dev, "RIF=%d destroyed\n", rif); | 3448 | netdev_dbg(l3_dev, "RIF=%d destroyed\n", rif); |
3408 | } | 3449 | } |
3409 | 3450 | ||
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c index 237418a0e6e0..953b214f38d0 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c | |||
@@ -717,22 +717,18 @@ int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, | |||
717 | u8 local_port = mlxsw_sp_port->local_port; | 717 | u8 local_port = mlxsw_sp_port->local_port; |
718 | u8 pg_buff = tc_index; | 718 | u8 pg_buff = tc_index; |
719 | enum mlxsw_reg_sbxx_dir dir = pool_type; | 719 | enum mlxsw_reg_sbxx_dir dir = pool_type; |
720 | u8 pool = pool_index; | 720 | u8 pool = pool_get(pool_index); |
721 | u32 max_buff; | 721 | u32 max_buff; |
722 | int err; | 722 | int err; |
723 | 723 | ||
724 | if (dir != dir_get(pool_index)) | ||
725 | return -EINVAL; | ||
726 | |||
724 | err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool, dir, | 727 | err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool, dir, |
725 | threshold, &max_buff); | 728 | threshold, &max_buff); |
726 | if (err) | 729 | if (err) |
727 | return err; | 730 | return err; |
728 | 731 | ||
729 | if (pool_type == DEVLINK_SB_POOL_TYPE_EGRESS) { | ||
730 | if (pool < MLXSW_SP_SB_POOL_COUNT) | ||
731 | return -EINVAL; | ||
732 | pool -= MLXSW_SP_SB_POOL_COUNT; | ||
733 | } else if (pool >= MLXSW_SP_SB_POOL_COUNT) { | ||
734 | return -EINVAL; | ||
735 | } | ||
736 | return mlxsw_sp_sb_cm_write(mlxsw_sp, local_port, pg_buff, dir, | 732 | return mlxsw_sp_sb_cm_write(mlxsw_sp, local_port, pg_buff, dir, |
737 | 0, max_buff, pool); | 733 | 0, max_buff, pool); |
738 | } | 734 | } |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index 90bb93b037ec..917ddd1e422f 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | |||
@@ -657,7 +657,7 @@ int mlxsw_sp_router_neigh_construct(struct net_device *dev, | |||
657 | return 0; | 657 | return 0; |
658 | } | 658 | } |
659 | 659 | ||
660 | r = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); | 660 | r = mlxsw_sp_rif_find_by_dev(mlxsw_sp, n->dev); |
661 | if (WARN_ON(!r)) | 661 | if (WARN_ON(!r)) |
662 | return -EINVAL; | 662 | return -EINVAL; |
663 | 663 | ||
diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c index 4d4ecba0aad9..8e13ec84c538 100644 --- a/drivers/net/ethernet/nxp/lpc_eth.c +++ b/drivers/net/ethernet/nxp/lpc_eth.c | |||
@@ -475,14 +475,6 @@ static void __lpc_get_mac(struct netdata_local *pldat, u8 *mac) | |||
475 | mac[5] = tmp >> 8; | 475 | mac[5] = tmp >> 8; |
476 | } | 476 | } |
477 | 477 | ||
478 | static void __lpc_eth_clock_enable(struct netdata_local *pldat, bool enable) | ||
479 | { | ||
480 | if (enable) | ||
481 | clk_prepare_enable(pldat->clk); | ||
482 | else | ||
483 | clk_disable_unprepare(pldat->clk); | ||
484 | } | ||
485 | |||
486 | static void __lpc_params_setup(struct netdata_local *pldat) | 478 | static void __lpc_params_setup(struct netdata_local *pldat) |
487 | { | 479 | { |
488 | u32 tmp; | 480 | u32 tmp; |
@@ -1056,7 +1048,7 @@ static int lpc_eth_close(struct net_device *ndev) | |||
1056 | writel(0, LPC_ENET_MAC2(pldat->net_base)); | 1048 | writel(0, LPC_ENET_MAC2(pldat->net_base)); |
1057 | spin_unlock_irqrestore(&pldat->lock, flags); | 1049 | spin_unlock_irqrestore(&pldat->lock, flags); |
1058 | 1050 | ||
1059 | __lpc_eth_clock_enable(pldat, false); | 1051 | clk_disable_unprepare(pldat->clk); |
1060 | 1052 | ||
1061 | return 0; | 1053 | return 0; |
1062 | } | 1054 | } |
@@ -1197,11 +1189,14 @@ static int lpc_eth_ioctl(struct net_device *ndev, struct ifreq *req, int cmd) | |||
1197 | static int lpc_eth_open(struct net_device *ndev) | 1189 | static int lpc_eth_open(struct net_device *ndev) |
1198 | { | 1190 | { |
1199 | struct netdata_local *pldat = netdev_priv(ndev); | 1191 | struct netdata_local *pldat = netdev_priv(ndev); |
1192 | int ret; | ||
1200 | 1193 | ||
1201 | if (netif_msg_ifup(pldat)) | 1194 | if (netif_msg_ifup(pldat)) |
1202 | dev_dbg(&pldat->pdev->dev, "enabling %s\n", ndev->name); | 1195 | dev_dbg(&pldat->pdev->dev, "enabling %s\n", ndev->name); |
1203 | 1196 | ||
1204 | __lpc_eth_clock_enable(pldat, true); | 1197 | ret = clk_prepare_enable(pldat->clk); |
1198 | if (ret) | ||
1199 | return ret; | ||
1205 | 1200 | ||
1206 | /* Suspended PHY makes LPC ethernet core block, so resume now */ | 1201 | /* Suspended PHY makes LPC ethernet core block, so resume now */ |
1207 | phy_resume(ndev->phydev); | 1202 | phy_resume(ndev->phydev); |
@@ -1320,7 +1315,9 @@ static int lpc_eth_drv_probe(struct platform_device *pdev) | |||
1320 | } | 1315 | } |
1321 | 1316 | ||
1322 | /* Enable network clock */ | 1317 | /* Enable network clock */ |
1323 | __lpc_eth_clock_enable(pldat, true); | 1318 | ret = clk_prepare_enable(pldat->clk); |
1319 | if (ret) | ||
1320 | goto err_out_clk_put; | ||
1324 | 1321 | ||
1325 | /* Map IO space */ | 1322 | /* Map IO space */ |
1326 | pldat->net_base = ioremap(res->start, resource_size(res)); | 1323 | pldat->net_base = ioremap(res->start, resource_size(res)); |
@@ -1454,6 +1451,7 @@ err_out_iounmap: | |||
1454 | iounmap(pldat->net_base); | 1451 | iounmap(pldat->net_base); |
1455 | err_out_disable_clocks: | 1452 | err_out_disable_clocks: |
1456 | clk_disable_unprepare(pldat->clk); | 1453 | clk_disable_unprepare(pldat->clk); |
1454 | err_out_clk_put: | ||
1457 | clk_put(pldat->clk); | 1455 | clk_put(pldat->clk); |
1458 | err_out_free_dev: | 1456 | err_out_free_dev: |
1459 | free_netdev(ndev); | 1457 | free_netdev(ndev); |
diff --git a/drivers/net/ethernet/qlogic/qed/qed.h b/drivers/net/ethernet/qlogic/qed/qed.h index 35e53771533f..45ab74676573 100644 --- a/drivers/net/ethernet/qlogic/qed/qed.h +++ b/drivers/net/ethernet/qlogic/qed/qed.h | |||
@@ -561,9 +561,18 @@ struct qed_dev { | |||
561 | static inline u8 qed_concrete_to_sw_fid(struct qed_dev *cdev, | 561 | static inline u8 qed_concrete_to_sw_fid(struct qed_dev *cdev, |
562 | u32 concrete_fid) | 562 | u32 concrete_fid) |
563 | { | 563 | { |
564 | u8 vfid = GET_FIELD(concrete_fid, PXP_CONCRETE_FID_VFID); | ||
564 | u8 pfid = GET_FIELD(concrete_fid, PXP_CONCRETE_FID_PFID); | 565 | u8 pfid = GET_FIELD(concrete_fid, PXP_CONCRETE_FID_PFID); |
566 | u8 vf_valid = GET_FIELD(concrete_fid, | ||
567 | PXP_CONCRETE_FID_VFVALID); | ||
568 | u8 sw_fid; | ||
565 | 569 | ||
566 | return pfid; | 570 | if (vf_valid) |
571 | sw_fid = vfid + MAX_NUM_PFS; | ||
572 | else | ||
573 | sw_fid = pfid; | ||
574 | |||
575 | return sw_fid; | ||
567 | } | 576 | } |
568 | 577 | ||
569 | #define PURE_LB_TC 8 | 578 | #define PURE_LB_TC 8 |
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c index e4bd02e46e57..a6eb6af8cbe8 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_main.c +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c | |||
@@ -722,11 +722,14 @@ netdev_tx_t qede_start_xmit(struct sk_buff *skb, | |||
722 | txq->tx_db.data.bd_prod = | 722 | txq->tx_db.data.bd_prod = |
723 | cpu_to_le16(qed_chain_get_prod_idx(&txq->tx_pbl)); | 723 | cpu_to_le16(qed_chain_get_prod_idx(&txq->tx_pbl)); |
724 | 724 | ||
725 | if (!skb->xmit_more || netif_tx_queue_stopped(netdev_txq)) | 725 | if (!skb->xmit_more || netif_xmit_stopped(netdev_txq)) |
726 | qede_update_tx_producer(txq); | 726 | qede_update_tx_producer(txq); |
727 | 727 | ||
728 | if (unlikely(qed_chain_get_elem_left(&txq->tx_pbl) | 728 | if (unlikely(qed_chain_get_elem_left(&txq->tx_pbl) |
729 | < (MAX_SKB_FRAGS + 1))) { | 729 | < (MAX_SKB_FRAGS + 1))) { |
730 | if (skb->xmit_more) | ||
731 | qede_update_tx_producer(txq); | ||
732 | |||
730 | netif_tx_stop_queue(netdev_txq); | 733 | netif_tx_stop_queue(netdev_txq); |
731 | DP_VERBOSE(edev, NETIF_MSG_TX_QUEUED, | 734 | DP_VERBOSE(edev, NETIF_MSG_TX_QUEUED, |
732 | "Stop queue was called\n"); | 735 | "Stop queue was called\n"); |
diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c index deae10d7426d..5297bf77211c 100644 --- a/drivers/net/ethernet/realtek/8139cp.c +++ b/drivers/net/ethernet/realtek/8139cp.c | |||
@@ -467,8 +467,8 @@ static int cp_rx_poll(struct napi_struct *napi, int budget) | |||
467 | unsigned int rx_tail = cp->rx_tail; | 467 | unsigned int rx_tail = cp->rx_tail; |
468 | int rx; | 468 | int rx; |
469 | 469 | ||
470 | rx_status_loop: | ||
471 | rx = 0; | 470 | rx = 0; |
471 | rx_status_loop: | ||
472 | cpw16(IntrStatus, cp_rx_intr_mask); | 472 | cpw16(IntrStatus, cp_rx_intr_mask); |
473 | 473 | ||
474 | while (rx < budget) { | 474 | while (rx < budget) { |
diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c index f658fee74f18..e00a669e9e09 100644 --- a/drivers/net/ethernet/sfc/ef10.c +++ b/drivers/net/ethernet/sfc/ef10.c | |||
@@ -1517,13 +1517,14 @@ static void efx_ef10_get_stat_mask(struct efx_nic *efx, unsigned long *mask) | |||
1517 | } | 1517 | } |
1518 | 1518 | ||
1519 | #if BITS_PER_LONG == 64 | 1519 | #if BITS_PER_LONG == 64 |
1520 | BUILD_BUG_ON(BITS_TO_LONGS(EF10_STAT_COUNT) != 2); | ||
1520 | mask[0] = raw_mask[0]; | 1521 | mask[0] = raw_mask[0]; |
1521 | mask[1] = raw_mask[1]; | 1522 | mask[1] = raw_mask[1]; |
1522 | #else | 1523 | #else |
1524 | BUILD_BUG_ON(BITS_TO_LONGS(EF10_STAT_COUNT) != 3); | ||
1523 | mask[0] = raw_mask[0] & 0xffffffff; | 1525 | mask[0] = raw_mask[0] & 0xffffffff; |
1524 | mask[1] = raw_mask[0] >> 32; | 1526 | mask[1] = raw_mask[0] >> 32; |
1525 | mask[2] = raw_mask[1] & 0xffffffff; | 1527 | mask[2] = raw_mask[1] & 0xffffffff; |
1526 | mask[3] = raw_mask[1] >> 32; | ||
1527 | #endif | 1528 | #endif |
1528 | } | 1529 | } |
1529 | 1530 | ||
diff --git a/drivers/net/ethernet/smsc/smc91x.c b/drivers/net/ethernet/smsc/smc91x.c index 726b80f45906..503a3b6dce91 100644 --- a/drivers/net/ethernet/smsc/smc91x.c +++ b/drivers/net/ethernet/smsc/smc91x.c | |||
@@ -2275,6 +2275,13 @@ static int smc_drv_probe(struct platform_device *pdev) | |||
2275 | if (pd) { | 2275 | if (pd) { |
2276 | memcpy(&lp->cfg, pd, sizeof(lp->cfg)); | 2276 | memcpy(&lp->cfg, pd, sizeof(lp->cfg)); |
2277 | lp->io_shift = SMC91X_IO_SHIFT(lp->cfg.flags); | 2277 | lp->io_shift = SMC91X_IO_SHIFT(lp->cfg.flags); |
2278 | |||
2279 | if (!SMC_8BIT(lp) && !SMC_16BIT(lp)) { | ||
2280 | dev_err(&pdev->dev, | ||
2281 | "at least one of 8-bit or 16-bit access support is required.\n"); | ||
2282 | ret = -ENXIO; | ||
2283 | goto out_free_netdev; | ||
2284 | } | ||
2278 | } | 2285 | } |
2279 | 2286 | ||
2280 | #if IS_BUILTIN(CONFIG_OF) | 2287 | #if IS_BUILTIN(CONFIG_OF) |
diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index 1a55c7976df0..e17671c9d1b0 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h | |||
@@ -37,6 +37,27 @@ | |||
37 | #include <linux/smc91x.h> | 37 | #include <linux/smc91x.h> |
38 | 38 | ||
39 | /* | 39 | /* |
40 | * Any 16-bit access is performed with two 8-bit accesses if the hardware | ||
41 | * can't do it directly. Most registers are 16-bit so those are mandatory. | ||
42 | */ | ||
43 | #define SMC_outw_b(x, a, r) \ | ||
44 | do { \ | ||
45 | unsigned int __val16 = (x); \ | ||
46 | unsigned int __reg = (r); \ | ||
47 | SMC_outb(__val16, a, __reg); \ | ||
48 | SMC_outb(__val16 >> 8, a, __reg + (1 << SMC_IO_SHIFT)); \ | ||
49 | } while (0) | ||
50 | |||
51 | #define SMC_inw_b(a, r) \ | ||
52 | ({ \ | ||
53 | unsigned int __val16; \ | ||
54 | unsigned int __reg = r; \ | ||
55 | __val16 = SMC_inb(a, __reg); \ | ||
56 | __val16 |= SMC_inb(a, __reg + (1 << SMC_IO_SHIFT)) << 8; \ | ||
57 | __val16; \ | ||
58 | }) | ||
59 | |||
60 | /* | ||
40 | * Define your architecture specific bus configuration parameters here. | 61 | * Define your architecture specific bus configuration parameters here. |
41 | */ | 62 | */ |
42 | 63 | ||
@@ -55,10 +76,30 @@ | |||
55 | #define SMC_IO_SHIFT (lp->io_shift) | 76 | #define SMC_IO_SHIFT (lp->io_shift) |
56 | 77 | ||
57 | #define SMC_inb(a, r) readb((a) + (r)) | 78 | #define SMC_inb(a, r) readb((a) + (r)) |
58 | #define SMC_inw(a, r) readw((a) + (r)) | 79 | #define SMC_inw(a, r) \ |
80 | ({ \ | ||
81 | unsigned int __smc_r = r; \ | ||
82 | SMC_16BIT(lp) ? readw((a) + __smc_r) : \ | ||
83 | SMC_8BIT(lp) ? SMC_inw_b(a, __smc_r) : \ | ||
84 | ({ BUG(); 0; }); \ | ||
85 | }) | ||
86 | |||
59 | #define SMC_inl(a, r) readl((a) + (r)) | 87 | #define SMC_inl(a, r) readl((a) + (r)) |
60 | #define SMC_outb(v, a, r) writeb(v, (a) + (r)) | 88 | #define SMC_outb(v, a, r) writeb(v, (a) + (r)) |
89 | #define SMC_outw(v, a, r) \ | ||
90 | do { \ | ||
91 | unsigned int __v = v, __smc_r = r; \ | ||
92 | if (SMC_16BIT(lp)) \ | ||
93 | __SMC_outw(__v, a, __smc_r); \ | ||
94 | else if (SMC_8BIT(lp)) \ | ||
95 | SMC_outw_b(__v, a, __smc_r); \ | ||
96 | else \ | ||
97 | BUG(); \ | ||
98 | } while (0) | ||
99 | |||
61 | #define SMC_outl(v, a, r) writel(v, (a) + (r)) | 100 | #define SMC_outl(v, a, r) writel(v, (a) + (r)) |
101 | #define SMC_insb(a, r, p, l) readsb((a) + (r), p, l) | ||
102 | #define SMC_outsb(a, r, p, l) writesb((a) + (r), p, l) | ||
62 | #define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) | 103 | #define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) |
63 | #define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) | 104 | #define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) |
64 | #define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) | 105 | #define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) |
@@ -66,7 +107,7 @@ | |||
66 | #define SMC_IRQ_FLAGS (-1) /* from resource */ | 107 | #define SMC_IRQ_FLAGS (-1) /* from resource */ |
67 | 108 | ||
68 | /* We actually can't write halfwords properly if not word aligned */ | 109 | /* We actually can't write halfwords properly if not word aligned */ |
69 | static inline void SMC_outw(u16 val, void __iomem *ioaddr, int reg) | 110 | static inline void __SMC_outw(u16 val, void __iomem *ioaddr, int reg) |
70 | { | 111 | { |
71 | if ((machine_is_mainstone() || machine_is_stargate2() || | 112 | if ((machine_is_mainstone() || machine_is_stargate2() || |
72 | machine_is_pxa_idp()) && reg & 2) { | 113 | machine_is_pxa_idp()) && reg & 2) { |
@@ -416,24 +457,8 @@ smc_pxa_dma_insw(void __iomem *ioaddr, struct smc_local *lp, int reg, int dma, | |||
416 | 457 | ||
417 | #if ! SMC_CAN_USE_16BIT | 458 | #if ! SMC_CAN_USE_16BIT |
418 | 459 | ||
419 | /* | 460 | #define SMC_outw(x, ioaddr, reg) SMC_outw_b(x, ioaddr, reg) |
420 | * Any 16-bit access is performed with two 8-bit accesses if the hardware | 461 | #define SMC_inw(ioaddr, reg) SMC_inw_b(ioaddr, reg) |
421 | * can't do it directly. Most registers are 16-bit so those are mandatory. | ||
422 | */ | ||
423 | #define SMC_outw(x, ioaddr, reg) \ | ||
424 | do { \ | ||
425 | unsigned int __val16 = (x); \ | ||
426 | SMC_outb( __val16, ioaddr, reg ); \ | ||
427 | SMC_outb( __val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT));\ | ||
428 | } while (0) | ||
429 | #define SMC_inw(ioaddr, reg) \ | ||
430 | ({ \ | ||
431 | unsigned int __val16; \ | ||
432 | __val16 = SMC_inb( ioaddr, reg ); \ | ||
433 | __val16 |= SMC_inb( ioaddr, reg + (1 << SMC_IO_SHIFT)) << 8; \ | ||
434 | __val16; \ | ||
435 | }) | ||
436 | |||
437 | #define SMC_insw(a, r, p, l) BUG() | 462 | #define SMC_insw(a, r, p, l) BUG() |
438 | #define SMC_outsw(a, r, p, l) BUG() | 463 | #define SMC_outsw(a, r, p, l) BUG() |
439 | 464 | ||
diff --git a/drivers/net/ethernet/synopsys/dwc_eth_qos.c b/drivers/net/ethernet/synopsys/dwc_eth_qos.c index 9f159a775af3..5a3941bf250f 100644 --- a/drivers/net/ethernet/synopsys/dwc_eth_qos.c +++ b/drivers/net/ethernet/synopsys/dwc_eth_qos.c | |||
@@ -1622,13 +1622,7 @@ static void dwceqos_init_hw(struct net_local *lp) | |||
1622 | DWCEQOS_MMC_CTRL_RSTONRD); | 1622 | DWCEQOS_MMC_CTRL_RSTONRD); |
1623 | dwceqos_enable_mmc_interrupt(lp); | 1623 | dwceqos_enable_mmc_interrupt(lp); |
1624 | 1624 | ||
1625 | /* Enable Interrupts */ | 1625 | dwceqos_write(lp, REG_DWCEQOS_DMA_CH0_IE, 0); |
1626 | dwceqos_write(lp, REG_DWCEQOS_DMA_CH0_IE, | ||
1627 | DWCEQOS_DMA_CH0_IE_NIE | | ||
1628 | DWCEQOS_DMA_CH0_IE_RIE | DWCEQOS_DMA_CH0_IE_TIE | | ||
1629 | DWCEQOS_DMA_CH0_IE_AIE | | ||
1630 | DWCEQOS_DMA_CH0_IE_FBEE); | ||
1631 | |||
1632 | dwceqos_write(lp, REG_DWCEQOS_MAC_IE, 0); | 1626 | dwceqos_write(lp, REG_DWCEQOS_MAC_IE, 0); |
1633 | 1627 | ||
1634 | dwceqos_write(lp, REG_DWCEQOS_MAC_CFG, DWCEQOS_MAC_CFG_IPC | | 1628 | dwceqos_write(lp, REG_DWCEQOS_MAC_CFG, DWCEQOS_MAC_CFG_IPC | |
@@ -1905,6 +1899,15 @@ static int dwceqos_open(struct net_device *ndev) | |||
1905 | netif_start_queue(ndev); | 1899 | netif_start_queue(ndev); |
1906 | tasklet_enable(&lp->tx_bdreclaim_tasklet); | 1900 | tasklet_enable(&lp->tx_bdreclaim_tasklet); |
1907 | 1901 | ||
1902 | /* Enable Interrupts -- do this only after we enable NAPI and the | ||
1903 | * tasklet. | ||
1904 | */ | ||
1905 | dwceqos_write(lp, REG_DWCEQOS_DMA_CH0_IE, | ||
1906 | DWCEQOS_DMA_CH0_IE_NIE | | ||
1907 | DWCEQOS_DMA_CH0_IE_RIE | DWCEQOS_DMA_CH0_IE_TIE | | ||
1908 | DWCEQOS_DMA_CH0_IE_AIE | | ||
1909 | DWCEQOS_DMA_CH0_IE_FBEE); | ||
1910 | |||
1908 | return 0; | 1911 | return 0; |
1909 | } | 1912 | } |
1910 | 1913 | ||
diff --git a/drivers/net/ethernet/tehuti/tehuti.c b/drivers/net/ethernet/tehuti/tehuti.c index 7452b5f9d024..7108c68f16d3 100644 --- a/drivers/net/ethernet/tehuti/tehuti.c +++ b/drivers/net/ethernet/tehuti/tehuti.c | |||
@@ -1987,7 +1987,7 @@ bdx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1987 | if ((readl(nic->regs + FPGA_VER) & 0xFFF) >= 378) { | 1987 | if ((readl(nic->regs + FPGA_VER) & 0xFFF) >= 378) { |
1988 | err = pci_enable_msi(pdev); | 1988 | err = pci_enable_msi(pdev); |
1989 | if (err) | 1989 | if (err) |
1990 | pr_err("Can't eneble msi. error is %d\n", err); | 1990 | pr_err("Can't enable msi. error is %d\n", err); |
1991 | else | 1991 | else |
1992 | nic->irq_type = IRQ_MSI; | 1992 | nic->irq_type = IRQ_MSI; |
1993 | } else | 1993 | } else |
diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c index 3cee84a24815..93dc10b10c09 100644 --- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c +++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c | |||
@@ -1131,11 +1131,13 @@ static int xemaclite_of_probe(struct platform_device *ofdev) | |||
1131 | lp->rx_ping_pong = get_bool(ofdev, "xlnx,rx-ping-pong"); | 1131 | lp->rx_ping_pong = get_bool(ofdev, "xlnx,rx-ping-pong"); |
1132 | mac_address = of_get_mac_address(ofdev->dev.of_node); | 1132 | mac_address = of_get_mac_address(ofdev->dev.of_node); |
1133 | 1133 | ||
1134 | if (mac_address) | 1134 | if (mac_address) { |
1135 | /* Set the MAC address. */ | 1135 | /* Set the MAC address. */ |
1136 | memcpy(ndev->dev_addr, mac_address, ETH_ALEN); | 1136 | memcpy(ndev->dev_addr, mac_address, ETH_ALEN); |
1137 | else | 1137 | } else { |
1138 | dev_warn(dev, "No MAC address found\n"); | 1138 | dev_warn(dev, "No MAC address found, using random\n"); |
1139 | eth_hw_addr_random(ndev); | ||
1140 | } | ||
1139 | 1141 | ||
1140 | /* Clear the Tx CSR's in case this is a restart */ | 1142 | /* Clear the Tx CSR's in case this is a restart */ |
1141 | __raw_writel(0, lp->base_addr + XEL_TSR_OFFSET); | 1143 | __raw_writel(0, lp->base_addr + XEL_TSR_OFFSET); |
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 053e87905b94..885ac9cbab5a 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c | |||
@@ -964,7 +964,7 @@ static struct phy_driver ksphy_driver[] = { | |||
964 | .get_strings = kszphy_get_strings, | 964 | .get_strings = kszphy_get_strings, |
965 | .get_stats = kszphy_get_stats, | 965 | .get_stats = kszphy_get_stats, |
966 | .suspend = genphy_suspend, | 966 | .suspend = genphy_suspend, |
967 | .resume = genphy_resume, | 967 | .resume = kszphy_resume, |
968 | }, { | 968 | }, { |
969 | .phy_id = PHY_ID_KSZ8873MLL, | 969 | .phy_id = PHY_ID_KSZ8873MLL, |
970 | .phy_id_mask = MICREL_PHY_ID_MASK, | 970 | .phy_id_mask = MICREL_PHY_ID_MASK, |
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index c5dc2c363f96..c6f66832a1a6 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
@@ -722,8 +722,10 @@ phy_err: | |||
722 | int phy_start_interrupts(struct phy_device *phydev) | 722 | int phy_start_interrupts(struct phy_device *phydev) |
723 | { | 723 | { |
724 | atomic_set(&phydev->irq_disable, 0); | 724 | atomic_set(&phydev->irq_disable, 0); |
725 | if (request_irq(phydev->irq, phy_interrupt, 0, "phy_interrupt", | 725 | if (request_irq(phydev->irq, phy_interrupt, |
726 | phydev) < 0) { | 726 | IRQF_SHARED, |
727 | "phy_interrupt", | ||
728 | phydev) < 0) { | ||
727 | pr_warn("%s: Can't get IRQ %d (PHY)\n", | 729 | pr_warn("%s: Can't get IRQ %d (PHY)\n", |
728 | phydev->mdio.bus->name, phydev->irq); | 730 | phydev->mdio.bus->name, phydev->irq); |
729 | phydev->irq = PHY_POLL; | 731 | phydev->irq = PHY_POLL; |
diff --git a/drivers/net/team/team_mode_loadbalance.c b/drivers/net/team/team_mode_loadbalance.c index cdb19b385d42..b228bea7931f 100644 --- a/drivers/net/team/team_mode_loadbalance.c +++ b/drivers/net/team/team_mode_loadbalance.c | |||
@@ -14,9 +14,23 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/errno.h> | 15 | #include <linux/errno.h> |
16 | #include <linux/netdevice.h> | 16 | #include <linux/netdevice.h> |
17 | #include <linux/etherdevice.h> | ||
17 | #include <linux/filter.h> | 18 | #include <linux/filter.h> |
18 | #include <linux/if_team.h> | 19 | #include <linux/if_team.h> |
19 | 20 | ||
21 | static rx_handler_result_t lb_receive(struct team *team, struct team_port *port, | ||
22 | struct sk_buff *skb) | ||
23 | { | ||
24 | if (unlikely(skb->protocol == htons(ETH_P_SLOW))) { | ||
25 | /* LACPDU packets should go to exact delivery */ | ||
26 | const unsigned char *dest = eth_hdr(skb)->h_dest; | ||
27 | |||
28 | if (is_link_local_ether_addr(dest) && dest[5] == 0x02) | ||
29 | return RX_HANDLER_EXACT; | ||
30 | } | ||
31 | return RX_HANDLER_ANOTHER; | ||
32 | } | ||
33 | |||
20 | struct lb_priv; | 34 | struct lb_priv; |
21 | 35 | ||
22 | typedef struct team_port *lb_select_tx_port_func_t(struct team *, | 36 | typedef struct team_port *lb_select_tx_port_func_t(struct team *, |
@@ -652,6 +666,7 @@ static const struct team_mode_ops lb_mode_ops = { | |||
652 | .port_enter = lb_port_enter, | 666 | .port_enter = lb_port_enter, |
653 | .port_leave = lb_port_leave, | 667 | .port_leave = lb_port_leave, |
654 | .port_disabled = lb_port_disabled, | 668 | .port_disabled = lb_port_disabled, |
669 | .receive = lb_receive, | ||
655 | .transmit = lb_transmit, | 670 | .transmit = lb_transmit, |
656 | }; | 671 | }; |
657 | 672 | ||
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 9c8b5bc2b9d8..6f9df375c5d4 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -894,11 +894,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev) | |||
894 | if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC))) | 894 | if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC))) |
895 | goto drop; | 895 | goto drop; |
896 | 896 | ||
897 | if (skb->sk && sk_fullsock(skb->sk)) { | 897 | skb_tx_timestamp(skb); |
898 | sock_tx_timestamp(skb->sk, skb->sk->sk_tsflags, | ||
899 | &skb_shinfo(skb)->tx_flags); | ||
900 | sw_tx_timestamp(skb); | ||
901 | } | ||
902 | 898 | ||
903 | /* Orphan the skb - required as we might hang on to it | 899 | /* Orphan the skb - required as we might hang on to it |
904 | * for indefinite time. | 900 | * for indefinite time. |
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index 770212baaf05..528b9c9c4e60 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c | |||
@@ -1009,6 +1009,7 @@ static int kaweth_probe( | |||
1009 | struct net_device *netdev; | 1009 | struct net_device *netdev; |
1010 | const eth_addr_t bcast_addr = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; | 1010 | const eth_addr_t bcast_addr = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; |
1011 | int result = 0; | 1011 | int result = 0; |
1012 | int rv = -EIO; | ||
1012 | 1013 | ||
1013 | dev_dbg(dev, | 1014 | dev_dbg(dev, |
1014 | "Kawasaki Device Probe (Device number:%d): 0x%4.4x:0x%4.4x:0x%4.4x\n", | 1015 | "Kawasaki Device Probe (Device number:%d): 0x%4.4x:0x%4.4x:0x%4.4x\n", |
@@ -1029,6 +1030,7 @@ static int kaweth_probe( | |||
1029 | kaweth = netdev_priv(netdev); | 1030 | kaweth = netdev_priv(netdev); |
1030 | kaweth->dev = udev; | 1031 | kaweth->dev = udev; |
1031 | kaweth->net = netdev; | 1032 | kaweth->net = netdev; |
1033 | kaweth->intf = intf; | ||
1032 | 1034 | ||
1033 | spin_lock_init(&kaweth->device_lock); | 1035 | spin_lock_init(&kaweth->device_lock); |
1034 | init_waitqueue_head(&kaweth->term_wait); | 1036 | init_waitqueue_head(&kaweth->term_wait); |
@@ -1048,6 +1050,10 @@ static int kaweth_probe( | |||
1048 | /* Download the firmware */ | 1050 | /* Download the firmware */ |
1049 | dev_info(dev, "Downloading firmware...\n"); | 1051 | dev_info(dev, "Downloading firmware...\n"); |
1050 | kaweth->firmware_buf = (__u8 *)__get_free_page(GFP_KERNEL); | 1052 | kaweth->firmware_buf = (__u8 *)__get_free_page(GFP_KERNEL); |
1053 | if (!kaweth->firmware_buf) { | ||
1054 | rv = -ENOMEM; | ||
1055 | goto err_free_netdev; | ||
1056 | } | ||
1051 | if ((result = kaweth_download_firmware(kaweth, | 1057 | if ((result = kaweth_download_firmware(kaweth, |
1052 | "kaweth/new_code.bin", | 1058 | "kaweth/new_code.bin", |
1053 | 100, | 1059 | 100, |
@@ -1139,8 +1145,6 @@ err_fw: | |||
1139 | 1145 | ||
1140 | dev_dbg(dev, "Initializing net device.\n"); | 1146 | dev_dbg(dev, "Initializing net device.\n"); |
1141 | 1147 | ||
1142 | kaweth->intf = intf; | ||
1143 | |||
1144 | kaweth->tx_urb = usb_alloc_urb(0, GFP_KERNEL); | 1148 | kaweth->tx_urb = usb_alloc_urb(0, GFP_KERNEL); |
1145 | if (!kaweth->tx_urb) | 1149 | if (!kaweth->tx_urb) |
1146 | goto err_free_netdev; | 1150 | goto err_free_netdev; |
@@ -1204,7 +1208,7 @@ err_only_tx: | |||
1204 | err_free_netdev: | 1208 | err_free_netdev: |
1205 | free_netdev(netdev); | 1209 | free_netdev(netdev); |
1206 | 1210 | ||
1207 | return -EIO; | 1211 | return rv; |
1208 | } | 1212 | } |
1209 | 1213 | ||
1210 | /**************************************************************** | 1214 | /**************************************************************** |
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index c68fe495d3f9..4244b9d4418e 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
@@ -914,7 +914,9 @@ vmxnet3_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
914 | { | 914 | { |
915 | struct Vmxnet3_TxDataDesc *tdd; | 915 | struct Vmxnet3_TxDataDesc *tdd; |
916 | 916 | ||
917 | tdd = tq->data_ring.base + tq->tx_ring.next2fill; | 917 | tdd = (struct Vmxnet3_TxDataDesc *)((u8 *)tq->data_ring.base + |
918 | tq->tx_ring.next2fill * | ||
919 | tq->txdata_desc_size); | ||
918 | 920 | ||
919 | memcpy(tdd->data, skb->data, ctx->copy_size); | 921 | memcpy(tdd->data, skb->data, ctx->copy_size); |
920 | netdev_dbg(adapter->netdev, | 922 | netdev_dbg(adapter->netdev, |
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index 74fc03072b87..7dc37a090549 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h | |||
@@ -69,10 +69,10 @@ | |||
69 | /* | 69 | /* |
70 | * Version numbers | 70 | * Version numbers |
71 | */ | 71 | */ |
72 | #define VMXNET3_DRIVER_VERSION_STRING "1.4.9.0-k" | 72 | #define VMXNET3_DRIVER_VERSION_STRING "1.4.a.0-k" |
73 | 73 | ||
74 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ | 74 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ |
75 | #define VMXNET3_DRIVER_VERSION_NUM 0x01040900 | 75 | #define VMXNET3_DRIVER_VERSION_NUM 0x01040a00 |
76 | 76 | ||
77 | #if defined(CONFIG_PCI_MSI) | 77 | #if defined(CONFIG_PCI_MSI) |
78 | /* RSS only makes sense if MSI-X is supported. */ | 78 | /* RSS only makes sense if MSI-X is supported. */ |
diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c index 458daf927336..935866fe5ec2 100644 --- a/drivers/nvdimm/bus.c +++ b/drivers/nvdimm/bus.c | |||
@@ -185,8 +185,12 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys, | |||
185 | return -ENXIO; | 185 | return -ENXIO; |
186 | 186 | ||
187 | nd_desc = nvdimm_bus->nd_desc; | 187 | nd_desc = nvdimm_bus->nd_desc; |
188 | /* | ||
189 | * if ndctl does not exist, it's PMEM_LEGACY and | ||
190 | * we want to just pretend everything is handled. | ||
191 | */ | ||
188 | if (!nd_desc->ndctl) | 192 | if (!nd_desc->ndctl) |
189 | return -ENXIO; | 193 | return len; |
190 | 194 | ||
191 | memset(&ars_cap, 0, sizeof(ars_cap)); | 195 | memset(&ars_cap, 0, sizeof(ars_cap)); |
192 | ars_cap.address = phys; | 196 | ars_cap.address = phys; |
diff --git a/drivers/nvme/host/Kconfig b/drivers/nvme/host/Kconfig index db39d53cdfb9..f7d37a62f874 100644 --- a/drivers/nvme/host/Kconfig +++ b/drivers/nvme/host/Kconfig | |||
@@ -30,8 +30,8 @@ config NVME_FABRICS | |||
30 | 30 | ||
31 | config NVME_RDMA | 31 | config NVME_RDMA |
32 | tristate "NVM Express over Fabrics RDMA host driver" | 32 | tristate "NVM Express over Fabrics RDMA host driver" |
33 | depends on INFINIBAND | 33 | depends on INFINIBAND && BLOCK |
34 | depends on BLK_DEV_NVME | 34 | select NVME_CORE |
35 | select NVME_FABRICS | 35 | select NVME_FABRICS |
36 | select SG_POOL | 36 | select SG_POOL |
37 | help | 37 | help |
diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c index dc996761042f..4eff49174466 100644 --- a/drivers/nvme/host/fabrics.c +++ b/drivers/nvme/host/fabrics.c | |||
@@ -47,8 +47,10 @@ static struct nvmf_host *nvmf_host_add(const char *hostnqn) | |||
47 | 47 | ||
48 | mutex_lock(&nvmf_hosts_mutex); | 48 | mutex_lock(&nvmf_hosts_mutex); |
49 | host = __nvmf_host_find(hostnqn); | 49 | host = __nvmf_host_find(hostnqn); |
50 | if (host) | 50 | if (host) { |
51 | kref_get(&host->ref); | ||
51 | goto out_unlock; | 52 | goto out_unlock; |
53 | } | ||
52 | 54 | ||
53 | host = kmalloc(sizeof(*host), GFP_KERNEL); | 55 | host = kmalloc(sizeof(*host), GFP_KERNEL); |
54 | if (!host) | 56 | if (!host) |
@@ -56,7 +58,7 @@ static struct nvmf_host *nvmf_host_add(const char *hostnqn) | |||
56 | 58 | ||
57 | kref_init(&host->ref); | 59 | kref_init(&host->ref); |
58 | memcpy(host->nqn, hostnqn, NVMF_NQN_SIZE); | 60 | memcpy(host->nqn, hostnqn, NVMF_NQN_SIZE); |
59 | uuid_le_gen(&host->id); | 61 | uuid_be_gen(&host->id); |
60 | 62 | ||
61 | list_add_tail(&host->list, &nvmf_hosts); | 63 | list_add_tail(&host->list, &nvmf_hosts); |
62 | out_unlock: | 64 | out_unlock: |
@@ -73,9 +75,9 @@ static struct nvmf_host *nvmf_host_default(void) | |||
73 | return NULL; | 75 | return NULL; |
74 | 76 | ||
75 | kref_init(&host->ref); | 77 | kref_init(&host->ref); |
76 | uuid_le_gen(&host->id); | 78 | uuid_be_gen(&host->id); |
77 | snprintf(host->nqn, NVMF_NQN_SIZE, | 79 | snprintf(host->nqn, NVMF_NQN_SIZE, |
78 | "nqn.2014-08.org.nvmexpress:NVMf:uuid:%pUl", &host->id); | 80 | "nqn.2014-08.org.nvmexpress:NVMf:uuid:%pUb", &host->id); |
79 | 81 | ||
80 | mutex_lock(&nvmf_hosts_mutex); | 82 | mutex_lock(&nvmf_hosts_mutex); |
81 | list_add_tail(&host->list, &nvmf_hosts); | 83 | list_add_tail(&host->list, &nvmf_hosts); |
@@ -363,7 +365,14 @@ int nvmf_connect_admin_queue(struct nvme_ctrl *ctrl) | |||
363 | cmd.connect.opcode = nvme_fabrics_command; | 365 | cmd.connect.opcode = nvme_fabrics_command; |
364 | cmd.connect.fctype = nvme_fabrics_type_connect; | 366 | cmd.connect.fctype = nvme_fabrics_type_connect; |
365 | cmd.connect.qid = 0; | 367 | cmd.connect.qid = 0; |
366 | cmd.connect.sqsize = cpu_to_le16(ctrl->sqsize); | 368 | |
369 | /* | ||
370 | * fabrics spec sets a minimum of depth 32 for admin queue, | ||
371 | * so set the queue with this depth always until | ||
372 | * justification otherwise. | ||
373 | */ | ||
374 | cmd.connect.sqsize = cpu_to_le16(NVMF_AQ_DEPTH - 1); | ||
375 | |||
367 | /* | 376 | /* |
368 | * Set keep-alive timeout in seconds granularity (ms * 1000) | 377 | * Set keep-alive timeout in seconds granularity (ms * 1000) |
369 | * and add a grace period for controller kato enforcement | 378 | * and add a grace period for controller kato enforcement |
@@ -375,7 +384,7 @@ int nvmf_connect_admin_queue(struct nvme_ctrl *ctrl) | |||
375 | if (!data) | 384 | if (!data) |
376 | return -ENOMEM; | 385 | return -ENOMEM; |
377 | 386 | ||
378 | memcpy(&data->hostid, &ctrl->opts->host->id, sizeof(uuid_le)); | 387 | memcpy(&data->hostid, &ctrl->opts->host->id, sizeof(uuid_be)); |
379 | data->cntlid = cpu_to_le16(0xffff); | 388 | data->cntlid = cpu_to_le16(0xffff); |
380 | strncpy(data->subsysnqn, ctrl->opts->subsysnqn, NVMF_NQN_SIZE); | 389 | strncpy(data->subsysnqn, ctrl->opts->subsysnqn, NVMF_NQN_SIZE); |
381 | strncpy(data->hostnqn, ctrl->opts->host->nqn, NVMF_NQN_SIZE); | 390 | strncpy(data->hostnqn, ctrl->opts->host->nqn, NVMF_NQN_SIZE); |
@@ -434,7 +443,7 @@ int nvmf_connect_io_queue(struct nvme_ctrl *ctrl, u16 qid) | |||
434 | if (!data) | 443 | if (!data) |
435 | return -ENOMEM; | 444 | return -ENOMEM; |
436 | 445 | ||
437 | memcpy(&data->hostid, &ctrl->opts->host->id, sizeof(uuid_le)); | 446 | memcpy(&data->hostid, &ctrl->opts->host->id, sizeof(uuid_be)); |
438 | data->cntlid = cpu_to_le16(ctrl->cntlid); | 447 | data->cntlid = cpu_to_le16(ctrl->cntlid); |
439 | strncpy(data->subsysnqn, ctrl->opts->subsysnqn, NVMF_NQN_SIZE); | 448 | strncpy(data->subsysnqn, ctrl->opts->subsysnqn, NVMF_NQN_SIZE); |
440 | strncpy(data->hostnqn, ctrl->opts->host->nqn, NVMF_NQN_SIZE); | 449 | strncpy(data->hostnqn, ctrl->opts->host->nqn, NVMF_NQN_SIZE); |
diff --git a/drivers/nvme/host/fabrics.h b/drivers/nvme/host/fabrics.h index 89df52c8be97..46e460aee52d 100644 --- a/drivers/nvme/host/fabrics.h +++ b/drivers/nvme/host/fabrics.h | |||
@@ -34,7 +34,7 @@ struct nvmf_host { | |||
34 | struct kref ref; | 34 | struct kref ref; |
35 | struct list_head list; | 35 | struct list_head list; |
36 | char nqn[NVMF_NQN_SIZE]; | 36 | char nqn[NVMF_NQN_SIZE]; |
37 | uuid_le id; | 37 | uuid_be id; |
38 | }; | 38 | }; |
39 | 39 | ||
40 | /** | 40 | /** |
diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c index 8d2875b4c56d..ab545fb347a0 100644 --- a/drivers/nvme/host/rdma.c +++ b/drivers/nvme/host/rdma.c | |||
@@ -43,10 +43,6 @@ | |||
43 | 43 | ||
44 | #define NVME_RDMA_MAX_INLINE_SEGMENTS 1 | 44 | #define NVME_RDMA_MAX_INLINE_SEGMENTS 1 |
45 | 45 | ||
46 | #define NVME_RDMA_MAX_PAGES_PER_MR 512 | ||
47 | |||
48 | #define NVME_RDMA_DEF_RECONNECT_DELAY 20 | ||
49 | |||
50 | /* | 46 | /* |
51 | * We handle AEN commands ourselves and don't even let the | 47 | * We handle AEN commands ourselves and don't even let the |
52 | * block layer know about them. | 48 | * block layer know about them. |
@@ -77,7 +73,6 @@ struct nvme_rdma_request { | |||
77 | u32 num_sge; | 73 | u32 num_sge; |
78 | int nents; | 74 | int nents; |
79 | bool inline_data; | 75 | bool inline_data; |
80 | bool need_inval; | ||
81 | struct ib_reg_wr reg_wr; | 76 | struct ib_reg_wr reg_wr; |
82 | struct ib_cqe reg_cqe; | 77 | struct ib_cqe reg_cqe; |
83 | struct nvme_rdma_queue *queue; | 78 | struct nvme_rdma_queue *queue; |
@@ -286,7 +281,7 @@ static int nvme_rdma_reinit_request(void *data, struct request *rq) | |||
286 | struct nvme_rdma_request *req = blk_mq_rq_to_pdu(rq); | 281 | struct nvme_rdma_request *req = blk_mq_rq_to_pdu(rq); |
287 | int ret = 0; | 282 | int ret = 0; |
288 | 283 | ||
289 | if (!req->need_inval) | 284 | if (!req->mr->need_inval) |
290 | goto out; | 285 | goto out; |
291 | 286 | ||
292 | ib_dereg_mr(req->mr); | 287 | ib_dereg_mr(req->mr); |
@@ -298,7 +293,7 @@ static int nvme_rdma_reinit_request(void *data, struct request *rq) | |||
298 | req->mr = NULL; | 293 | req->mr = NULL; |
299 | } | 294 | } |
300 | 295 | ||
301 | req->need_inval = false; | 296 | req->mr->need_inval = false; |
302 | 297 | ||
303 | out: | 298 | out: |
304 | return ret; | 299 | return ret; |
@@ -645,7 +640,8 @@ static int nvme_rdma_init_io_queues(struct nvme_rdma_ctrl *ctrl) | |||
645 | int i, ret; | 640 | int i, ret; |
646 | 641 | ||
647 | for (i = 1; i < ctrl->queue_count; i++) { | 642 | for (i = 1; i < ctrl->queue_count; i++) { |
648 | ret = nvme_rdma_init_queue(ctrl, i, ctrl->ctrl.sqsize); | 643 | ret = nvme_rdma_init_queue(ctrl, i, |
644 | ctrl->ctrl.opts->queue_size); | ||
649 | if (ret) { | 645 | if (ret) { |
650 | dev_info(ctrl->ctrl.device, | 646 | dev_info(ctrl->ctrl.device, |
651 | "failed to initialize i/o queue: %d\n", ret); | 647 | "failed to initialize i/o queue: %d\n", ret); |
@@ -849,7 +845,7 @@ static void nvme_rdma_unmap_data(struct nvme_rdma_queue *queue, | |||
849 | if (!blk_rq_bytes(rq)) | 845 | if (!blk_rq_bytes(rq)) |
850 | return; | 846 | return; |
851 | 847 | ||
852 | if (req->need_inval) { | 848 | if (req->mr->need_inval) { |
853 | res = nvme_rdma_inv_rkey(queue, req); | 849 | res = nvme_rdma_inv_rkey(queue, req); |
854 | if (res < 0) { | 850 | if (res < 0) { |
855 | dev_err(ctrl->ctrl.device, | 851 | dev_err(ctrl->ctrl.device, |
@@ -935,7 +931,7 @@ static int nvme_rdma_map_sg_fr(struct nvme_rdma_queue *queue, | |||
935 | IB_ACCESS_REMOTE_READ | | 931 | IB_ACCESS_REMOTE_READ | |
936 | IB_ACCESS_REMOTE_WRITE; | 932 | IB_ACCESS_REMOTE_WRITE; |
937 | 933 | ||
938 | req->need_inval = true; | 934 | req->mr->need_inval = true; |
939 | 935 | ||
940 | sg->addr = cpu_to_le64(req->mr->iova); | 936 | sg->addr = cpu_to_le64(req->mr->iova); |
941 | put_unaligned_le24(req->mr->length, sg->length); | 937 | put_unaligned_le24(req->mr->length, sg->length); |
@@ -958,7 +954,7 @@ static int nvme_rdma_map_data(struct nvme_rdma_queue *queue, | |||
958 | 954 | ||
959 | req->num_sge = 1; | 955 | req->num_sge = 1; |
960 | req->inline_data = false; | 956 | req->inline_data = false; |
961 | req->need_inval = false; | 957 | req->mr->need_inval = false; |
962 | 958 | ||
963 | c->common.flags |= NVME_CMD_SGL_METABUF; | 959 | c->common.flags |= NVME_CMD_SGL_METABUF; |
964 | 960 | ||
@@ -1145,7 +1141,7 @@ static int nvme_rdma_process_nvme_rsp(struct nvme_rdma_queue *queue, | |||
1145 | 1141 | ||
1146 | if ((wc->wc_flags & IB_WC_WITH_INVALIDATE) && | 1142 | if ((wc->wc_flags & IB_WC_WITH_INVALIDATE) && |
1147 | wc->ex.invalidate_rkey == req->mr->rkey) | 1143 | wc->ex.invalidate_rkey == req->mr->rkey) |
1148 | req->need_inval = false; | 1144 | req->mr->need_inval = false; |
1149 | 1145 | ||
1150 | blk_mq_complete_request(rq, status); | 1146 | blk_mq_complete_request(rq, status); |
1151 | 1147 | ||
@@ -1278,8 +1274,22 @@ static int nvme_rdma_route_resolved(struct nvme_rdma_queue *queue) | |||
1278 | 1274 | ||
1279 | priv.recfmt = cpu_to_le16(NVME_RDMA_CM_FMT_1_0); | 1275 | priv.recfmt = cpu_to_le16(NVME_RDMA_CM_FMT_1_0); |
1280 | priv.qid = cpu_to_le16(nvme_rdma_queue_idx(queue)); | 1276 | priv.qid = cpu_to_le16(nvme_rdma_queue_idx(queue)); |
1281 | priv.hrqsize = cpu_to_le16(queue->queue_size); | 1277 | /* |
1282 | priv.hsqsize = cpu_to_le16(queue->queue_size); | 1278 | * set the admin queue depth to the minimum size |
1279 | * specified by the Fabrics standard. | ||
1280 | */ | ||
1281 | if (priv.qid == 0) { | ||
1282 | priv.hrqsize = cpu_to_le16(NVMF_AQ_DEPTH); | ||
1283 | priv.hsqsize = cpu_to_le16(NVMF_AQ_DEPTH - 1); | ||
1284 | } else { | ||
1285 | /* | ||
1286 | * current interpretation of the fabrics spec | ||
1287 | * is at minimum you make hrqsize sqsize+1, or a | ||
1288 | * 1's based representation of sqsize. | ||
1289 | */ | ||
1290 | priv.hrqsize = cpu_to_le16(queue->queue_size); | ||
1291 | priv.hsqsize = cpu_to_le16(queue->ctrl->ctrl.sqsize); | ||
1292 | } | ||
1283 | 1293 | ||
1284 | ret = rdma_connect(queue->cm_id, ¶m); | 1294 | ret = rdma_connect(queue->cm_id, ¶m); |
1285 | if (ret) { | 1295 | if (ret) { |
@@ -1319,7 +1329,7 @@ out_destroy_queue_ib: | |||
1319 | static int nvme_rdma_device_unplug(struct nvme_rdma_queue *queue) | 1329 | static int nvme_rdma_device_unplug(struct nvme_rdma_queue *queue) |
1320 | { | 1330 | { |
1321 | struct nvme_rdma_ctrl *ctrl = queue->ctrl; | 1331 | struct nvme_rdma_ctrl *ctrl = queue->ctrl; |
1322 | int ret; | 1332 | int ret = 0; |
1323 | 1333 | ||
1324 | /* Own the controller deletion */ | 1334 | /* Own the controller deletion */ |
1325 | if (!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_DELETING)) | 1335 | if (!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_DELETING)) |
@@ -1461,7 +1471,7 @@ static int nvme_rdma_queue_rq(struct blk_mq_hw_ctx *hctx, | |||
1461 | if (rq->cmd_type == REQ_TYPE_FS && req_op(rq) == REQ_OP_FLUSH) | 1471 | if (rq->cmd_type == REQ_TYPE_FS && req_op(rq) == REQ_OP_FLUSH) |
1462 | flush = true; | 1472 | flush = true; |
1463 | ret = nvme_rdma_post_send(queue, sqe, req->sge, req->num_sge, | 1473 | ret = nvme_rdma_post_send(queue, sqe, req->sge, req->num_sge, |
1464 | req->need_inval ? &req->reg_wr.wr : NULL, flush); | 1474 | req->mr->need_inval ? &req->reg_wr.wr : NULL, flush); |
1465 | if (ret) { | 1475 | if (ret) { |
1466 | nvme_rdma_unmap_data(queue, rq); | 1476 | nvme_rdma_unmap_data(queue, rq); |
1467 | goto err; | 1477 | goto err; |
@@ -1816,7 +1826,7 @@ static int nvme_rdma_create_io_queues(struct nvme_rdma_ctrl *ctrl) | |||
1816 | 1826 | ||
1817 | memset(&ctrl->tag_set, 0, sizeof(ctrl->tag_set)); | 1827 | memset(&ctrl->tag_set, 0, sizeof(ctrl->tag_set)); |
1818 | ctrl->tag_set.ops = &nvme_rdma_mq_ops; | 1828 | ctrl->tag_set.ops = &nvme_rdma_mq_ops; |
1819 | ctrl->tag_set.queue_depth = ctrl->ctrl.sqsize; | 1829 | ctrl->tag_set.queue_depth = ctrl->ctrl.opts->queue_size; |
1820 | ctrl->tag_set.reserved_tags = 1; /* fabric connect */ | 1830 | ctrl->tag_set.reserved_tags = 1; /* fabric connect */ |
1821 | ctrl->tag_set.numa_node = NUMA_NO_NODE; | 1831 | ctrl->tag_set.numa_node = NUMA_NO_NODE; |
1822 | ctrl->tag_set.flags = BLK_MQ_F_SHOULD_MERGE; | 1832 | ctrl->tag_set.flags = BLK_MQ_F_SHOULD_MERGE; |
@@ -1914,7 +1924,7 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev, | |||
1914 | spin_lock_init(&ctrl->lock); | 1924 | spin_lock_init(&ctrl->lock); |
1915 | 1925 | ||
1916 | ctrl->queue_count = opts->nr_io_queues + 1; /* +1 for admin queue */ | 1926 | ctrl->queue_count = opts->nr_io_queues + 1; /* +1 for admin queue */ |
1917 | ctrl->ctrl.sqsize = opts->queue_size; | 1927 | ctrl->ctrl.sqsize = opts->queue_size - 1; |
1918 | ctrl->ctrl.kato = opts->kato; | 1928 | ctrl->ctrl.kato = opts->kato; |
1919 | 1929 | ||
1920 | ret = -ENOMEM; | 1930 | ret = -ENOMEM; |
diff --git a/drivers/nvme/target/Kconfig b/drivers/nvme/target/Kconfig index a5c31cbeb481..3a5b9d0576cb 100644 --- a/drivers/nvme/target/Kconfig +++ b/drivers/nvme/target/Kconfig | |||
@@ -15,8 +15,8 @@ config NVME_TARGET | |||
15 | 15 | ||
16 | config NVME_TARGET_LOOP | 16 | config NVME_TARGET_LOOP |
17 | tristate "NVMe loopback device support" | 17 | tristate "NVMe loopback device support" |
18 | depends on BLK_DEV_NVME | ||
19 | depends on NVME_TARGET | 18 | depends on NVME_TARGET |
19 | select NVME_CORE | ||
20 | select NVME_FABRICS | 20 | select NVME_FABRICS |
21 | select SG_POOL | 21 | select SG_POOL |
22 | help | 22 | help |
diff --git a/drivers/nvme/target/loop.c b/drivers/nvme/target/loop.c index 7affd40a6b33..395e60dad835 100644 --- a/drivers/nvme/target/loop.c +++ b/drivers/nvme/target/loop.c | |||
@@ -556,7 +556,7 @@ static int nvme_loop_create_io_queues(struct nvme_loop_ctrl *ctrl) | |||
556 | 556 | ||
557 | memset(&ctrl->tag_set, 0, sizeof(ctrl->tag_set)); | 557 | memset(&ctrl->tag_set, 0, sizeof(ctrl->tag_set)); |
558 | ctrl->tag_set.ops = &nvme_loop_mq_ops; | 558 | ctrl->tag_set.ops = &nvme_loop_mq_ops; |
559 | ctrl->tag_set.queue_depth = ctrl->ctrl.sqsize; | 559 | ctrl->tag_set.queue_depth = ctrl->ctrl.opts->queue_size; |
560 | ctrl->tag_set.reserved_tags = 1; /* fabric connect */ | 560 | ctrl->tag_set.reserved_tags = 1; /* fabric connect */ |
561 | ctrl->tag_set.numa_node = NUMA_NO_NODE; | 561 | ctrl->tag_set.numa_node = NUMA_NO_NODE; |
562 | ctrl->tag_set.flags = BLK_MQ_F_SHOULD_MERGE; | 562 | ctrl->tag_set.flags = BLK_MQ_F_SHOULD_MERGE; |
@@ -620,7 +620,7 @@ static struct nvme_ctrl *nvme_loop_create_ctrl(struct device *dev, | |||
620 | 620 | ||
621 | ret = -ENOMEM; | 621 | ret = -ENOMEM; |
622 | 622 | ||
623 | ctrl->ctrl.sqsize = opts->queue_size; | 623 | ctrl->ctrl.sqsize = opts->queue_size - 1; |
624 | ctrl->ctrl.kato = opts->kato; | 624 | ctrl->ctrl.kato = opts->kato; |
625 | 625 | ||
626 | ctrl->queues = kcalloc(opts->nr_io_queues + 1, sizeof(*ctrl->queues), | 626 | ctrl->queues = kcalloc(opts->nr_io_queues + 1, sizeof(*ctrl->queues), |
diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c index b4d648536c3e..1cbe6e053b5b 100644 --- a/drivers/nvme/target/rdma.c +++ b/drivers/nvme/target/rdma.c | |||
@@ -978,10 +978,11 @@ static void nvmet_rdma_release_queue_work(struct work_struct *w) | |||
978 | container_of(w, struct nvmet_rdma_queue, release_work); | 978 | container_of(w, struct nvmet_rdma_queue, release_work); |
979 | struct rdma_cm_id *cm_id = queue->cm_id; | 979 | struct rdma_cm_id *cm_id = queue->cm_id; |
980 | struct nvmet_rdma_device *dev = queue->dev; | 980 | struct nvmet_rdma_device *dev = queue->dev; |
981 | enum nvmet_rdma_queue_state state = queue->state; | ||
981 | 982 | ||
982 | nvmet_rdma_free_queue(queue); | 983 | nvmet_rdma_free_queue(queue); |
983 | 984 | ||
984 | if (queue->state != NVMET_RDMA_IN_DEVICE_REMOVAL) | 985 | if (state != NVMET_RDMA_IN_DEVICE_REMOVAL) |
985 | rdma_destroy_id(cm_id); | 986 | rdma_destroy_id(cm_id); |
986 | 987 | ||
987 | kref_put(&dev->ref, nvmet_rdma_free_dev); | 988 | kref_put(&dev->ref, nvmet_rdma_free_dev); |
@@ -1003,10 +1004,10 @@ nvmet_rdma_parse_cm_connect_req(struct rdma_conn_param *conn, | |||
1003 | queue->host_qid = le16_to_cpu(req->qid); | 1004 | queue->host_qid = le16_to_cpu(req->qid); |
1004 | 1005 | ||
1005 | /* | 1006 | /* |
1006 | * req->hsqsize corresponds to our recv queue size | 1007 | * req->hsqsize corresponds to our recv queue size plus 1 |
1007 | * req->hrqsize corresponds to our send queue size | 1008 | * req->hrqsize corresponds to our send queue size |
1008 | */ | 1009 | */ |
1009 | queue->recv_queue_size = le16_to_cpu(req->hsqsize); | 1010 | queue->recv_queue_size = le16_to_cpu(req->hsqsize) + 1; |
1010 | queue->send_queue_size = le16_to_cpu(req->hrqsize); | 1011 | queue->send_queue_size = le16_to_cpu(req->hrqsize); |
1011 | 1012 | ||
1012 | if (!queue->host_qid && queue->recv_queue_size > NVMF_AQ_DEPTH) | 1013 | if (!queue->host_qid && queue->recv_queue_size > NVMF_AQ_DEPTH) |
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c index 5f4a2e04c8d7..add66236215c 100644 --- a/drivers/pci/host-bridge.c +++ b/drivers/pci/host-bridge.c | |||
@@ -44,6 +44,7 @@ void pci_set_host_bridge_release(struct pci_host_bridge *bridge, | |||
44 | bridge->release_fn = release_fn; | 44 | bridge->release_fn = release_fn; |
45 | bridge->release_data = release_data; | 45 | bridge->release_data = release_data; |
46 | } | 46 | } |
47 | EXPORT_SYMBOL_GPL(pci_set_host_bridge_release); | ||
47 | 48 | ||
48 | void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region, | 49 | void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region, |
49 | struct resource *res) | 50 | struct resource *res) |
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 98f12223c734..9da5ecb41f0b 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -549,15 +549,23 @@ error_attrs: | |||
549 | return ret; | 549 | return ret; |
550 | } | 550 | } |
551 | 551 | ||
552 | static struct msi_desc *msi_setup_entry(struct pci_dev *dev, int nvec) | 552 | static struct msi_desc * |
553 | msi_setup_entry(struct pci_dev *dev, int nvec, bool affinity) | ||
553 | { | 554 | { |
554 | u16 control; | 555 | struct cpumask *masks = NULL; |
555 | struct msi_desc *entry; | 556 | struct msi_desc *entry; |
557 | u16 control; | ||
558 | |||
559 | if (affinity) { | ||
560 | masks = irq_create_affinity_masks(dev->irq_affinity, nvec); | ||
561 | if (!masks) | ||
562 | pr_err("Unable to allocate affinity masks, ignoring\n"); | ||
563 | } | ||
556 | 564 | ||
557 | /* MSI Entry Initialization */ | 565 | /* MSI Entry Initialization */ |
558 | entry = alloc_msi_entry(&dev->dev); | 566 | entry = alloc_msi_entry(&dev->dev, nvec, masks); |
559 | if (!entry) | 567 | if (!entry) |
560 | return NULL; | 568 | goto out; |
561 | 569 | ||
562 | pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); | 570 | pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); |
563 | 571 | ||
@@ -568,8 +576,6 @@ static struct msi_desc *msi_setup_entry(struct pci_dev *dev, int nvec) | |||
568 | entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */ | 576 | entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */ |
569 | entry->msi_attrib.multi_cap = (control & PCI_MSI_FLAGS_QMASK) >> 1; | 577 | entry->msi_attrib.multi_cap = (control & PCI_MSI_FLAGS_QMASK) >> 1; |
570 | entry->msi_attrib.multiple = ilog2(__roundup_pow_of_two(nvec)); | 578 | entry->msi_attrib.multiple = ilog2(__roundup_pow_of_two(nvec)); |
571 | entry->nvec_used = nvec; | ||
572 | entry->affinity = dev->irq_affinity; | ||
573 | 579 | ||
574 | if (control & PCI_MSI_FLAGS_64BIT) | 580 | if (control & PCI_MSI_FLAGS_64BIT) |
575 | entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_64; | 581 | entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_64; |
@@ -580,6 +586,8 @@ static struct msi_desc *msi_setup_entry(struct pci_dev *dev, int nvec) | |||
580 | if (entry->msi_attrib.maskbit) | 586 | if (entry->msi_attrib.maskbit) |
581 | pci_read_config_dword(dev, entry->mask_pos, &entry->masked); | 587 | pci_read_config_dword(dev, entry->mask_pos, &entry->masked); |
582 | 588 | ||
589 | out: | ||
590 | kfree(masks); | ||
583 | return entry; | 591 | return entry; |
584 | } | 592 | } |
585 | 593 | ||
@@ -608,7 +616,7 @@ static int msi_verify_entries(struct pci_dev *dev) | |||
608 | * an error, and a positive return value indicates the number of interrupts | 616 | * an error, and a positive return value indicates the number of interrupts |
609 | * which could have been allocated. | 617 | * which could have been allocated. |
610 | */ | 618 | */ |
611 | static int msi_capability_init(struct pci_dev *dev, int nvec) | 619 | static int msi_capability_init(struct pci_dev *dev, int nvec, bool affinity) |
612 | { | 620 | { |
613 | struct msi_desc *entry; | 621 | struct msi_desc *entry; |
614 | int ret; | 622 | int ret; |
@@ -616,7 +624,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec) | |||
616 | 624 | ||
617 | pci_msi_set_enable(dev, 0); /* Disable MSI during set up */ | 625 | pci_msi_set_enable(dev, 0); /* Disable MSI during set up */ |
618 | 626 | ||
619 | entry = msi_setup_entry(dev, nvec); | 627 | entry = msi_setup_entry(dev, nvec, affinity); |
620 | if (!entry) | 628 | if (!entry) |
621 | return -ENOMEM; | 629 | return -ENOMEM; |
622 | 630 | ||
@@ -679,28 +687,29 @@ static void __iomem *msix_map_region(struct pci_dev *dev, unsigned nr_entries) | |||
679 | } | 687 | } |
680 | 688 | ||
681 | static int msix_setup_entries(struct pci_dev *dev, void __iomem *base, | 689 | static int msix_setup_entries(struct pci_dev *dev, void __iomem *base, |
682 | struct msix_entry *entries, int nvec) | 690 | struct msix_entry *entries, int nvec, |
691 | bool affinity) | ||
683 | { | 692 | { |
684 | const struct cpumask *mask = NULL; | 693 | struct cpumask *curmsk, *masks = NULL; |
685 | struct msi_desc *entry; | 694 | struct msi_desc *entry; |
686 | int cpu = -1, i; | 695 | int ret, i; |
687 | 696 | ||
688 | for (i = 0; i < nvec; i++) { | 697 | if (affinity) { |
689 | if (dev->irq_affinity) { | 698 | masks = irq_create_affinity_masks(dev->irq_affinity, nvec); |
690 | cpu = cpumask_next(cpu, dev->irq_affinity); | 699 | if (!masks) |
691 | if (cpu >= nr_cpu_ids) | 700 | pr_err("Unable to allocate affinity masks, ignoring\n"); |
692 | cpu = cpumask_first(dev->irq_affinity); | 701 | } |
693 | mask = cpumask_of(cpu); | ||
694 | } | ||
695 | 702 | ||
696 | entry = alloc_msi_entry(&dev->dev); | 703 | for (i = 0, curmsk = masks; i < nvec; i++) { |
704 | entry = alloc_msi_entry(&dev->dev, 1, curmsk); | ||
697 | if (!entry) { | 705 | if (!entry) { |
698 | if (!i) | 706 | if (!i) |
699 | iounmap(base); | 707 | iounmap(base); |
700 | else | 708 | else |
701 | free_msi_irqs(dev); | 709 | free_msi_irqs(dev); |
702 | /* No enough memory. Don't try again */ | 710 | /* No enough memory. Don't try again */ |
703 | return -ENOMEM; | 711 | ret = -ENOMEM; |
712 | goto out; | ||
704 | } | 713 | } |
705 | 714 | ||
706 | entry->msi_attrib.is_msix = 1; | 715 | entry->msi_attrib.is_msix = 1; |
@@ -711,12 +720,14 @@ static int msix_setup_entries(struct pci_dev *dev, void __iomem *base, | |||
711 | entry->msi_attrib.entry_nr = i; | 720 | entry->msi_attrib.entry_nr = i; |
712 | entry->msi_attrib.default_irq = dev->irq; | 721 | entry->msi_attrib.default_irq = dev->irq; |
713 | entry->mask_base = base; | 722 | entry->mask_base = base; |
714 | entry->nvec_used = 1; | ||
715 | entry->affinity = mask; | ||
716 | 723 | ||
717 | list_add_tail(&entry->list, dev_to_msi_list(&dev->dev)); | 724 | list_add_tail(&entry->list, dev_to_msi_list(&dev->dev)); |
725 | if (masks) | ||
726 | curmsk++; | ||
718 | } | 727 | } |
719 | 728 | ret = 0; | |
729 | out: | ||
730 | kfree(masks); | ||
720 | return 0; | 731 | return 0; |
721 | } | 732 | } |
722 | 733 | ||
@@ -745,8 +756,8 @@ static void msix_program_entries(struct pci_dev *dev, | |||
745 | * single MSI-X irq. A return of zero indicates the successful setup of | 756 | * single MSI-X irq. A return of zero indicates the successful setup of |
746 | * requested MSI-X entries with allocated irqs or non-zero for otherwise. | 757 | * requested MSI-X entries with allocated irqs or non-zero for otherwise. |
747 | **/ | 758 | **/ |
748 | static int msix_capability_init(struct pci_dev *dev, | 759 | static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries, |
749 | struct msix_entry *entries, int nvec) | 760 | int nvec, bool affinity) |
750 | { | 761 | { |
751 | int ret; | 762 | int ret; |
752 | u16 control; | 763 | u16 control; |
@@ -761,7 +772,7 @@ static int msix_capability_init(struct pci_dev *dev, | |||
761 | if (!base) | 772 | if (!base) |
762 | return -ENOMEM; | 773 | return -ENOMEM; |
763 | 774 | ||
764 | ret = msix_setup_entries(dev, base, entries, nvec); | 775 | ret = msix_setup_entries(dev, base, entries, nvec, affinity); |
765 | if (ret) | 776 | if (ret) |
766 | return ret; | 777 | return ret; |
767 | 778 | ||
@@ -941,22 +952,8 @@ int pci_msix_vec_count(struct pci_dev *dev) | |||
941 | } | 952 | } |
942 | EXPORT_SYMBOL(pci_msix_vec_count); | 953 | EXPORT_SYMBOL(pci_msix_vec_count); |
943 | 954 | ||
944 | /** | 955 | static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, |
945 | * pci_enable_msix - configure device's MSI-X capability structure | 956 | int nvec, bool affinity) |
946 | * @dev: pointer to the pci_dev data structure of MSI-X device function | ||
947 | * @entries: pointer to an array of MSI-X entries (optional) | ||
948 | * @nvec: number of MSI-X irqs requested for allocation by device driver | ||
949 | * | ||
950 | * Setup the MSI-X capability structure of device function with the number | ||
951 | * of requested irqs upon its software driver call to request for | ||
952 | * MSI-X mode enabled on its hardware device function. A return of zero | ||
953 | * indicates the successful configuration of MSI-X capability structure | ||
954 | * with new allocated MSI-X irqs. A return of < 0 indicates a failure. | ||
955 | * Or a return of > 0 indicates that driver request is exceeding the number | ||
956 | * of irqs or MSI-X vectors available. Driver should use the returned value to | ||
957 | * re-send its request. | ||
958 | **/ | ||
959 | int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec) | ||
960 | { | 957 | { |
961 | int nr_entries; | 958 | int nr_entries; |
962 | int i, j; | 959 | int i, j; |
@@ -988,7 +985,27 @@ int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec) | |||
988 | dev_info(&dev->dev, "can't enable MSI-X (MSI IRQ already assigned)\n"); | 985 | dev_info(&dev->dev, "can't enable MSI-X (MSI IRQ already assigned)\n"); |
989 | return -EINVAL; | 986 | return -EINVAL; |
990 | } | 987 | } |
991 | return msix_capability_init(dev, entries, nvec); | 988 | return msix_capability_init(dev, entries, nvec, affinity); |
989 | } | ||
990 | |||
991 | /** | ||
992 | * pci_enable_msix - configure device's MSI-X capability structure | ||
993 | * @dev: pointer to the pci_dev data structure of MSI-X device function | ||
994 | * @entries: pointer to an array of MSI-X entries (optional) | ||
995 | * @nvec: number of MSI-X irqs requested for allocation by device driver | ||
996 | * | ||
997 | * Setup the MSI-X capability structure of device function with the number | ||
998 | * of requested irqs upon its software driver call to request for | ||
999 | * MSI-X mode enabled on its hardware device function. A return of zero | ||
1000 | * indicates the successful configuration of MSI-X capability structure | ||
1001 | * with new allocated MSI-X irqs. A return of < 0 indicates a failure. | ||
1002 | * Or a return of > 0 indicates that driver request is exceeding the number | ||
1003 | * of irqs or MSI-X vectors available. Driver should use the returned value to | ||
1004 | * re-send its request. | ||
1005 | **/ | ||
1006 | int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec) | ||
1007 | { | ||
1008 | return __pci_enable_msix(dev, entries, nvec, false); | ||
992 | } | 1009 | } |
993 | EXPORT_SYMBOL(pci_enable_msix); | 1010 | EXPORT_SYMBOL(pci_enable_msix); |
994 | 1011 | ||
@@ -1041,6 +1058,7 @@ EXPORT_SYMBOL(pci_msi_enabled); | |||
1041 | static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, | 1058 | static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, |
1042 | unsigned int flags) | 1059 | unsigned int flags) |
1043 | { | 1060 | { |
1061 | bool affinity = flags & PCI_IRQ_AFFINITY; | ||
1044 | int nvec; | 1062 | int nvec; |
1045 | int rc; | 1063 | int rc; |
1046 | 1064 | ||
@@ -1069,19 +1087,17 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, | |||
1069 | nvec = maxvec; | 1087 | nvec = maxvec; |
1070 | 1088 | ||
1071 | for (;;) { | 1089 | for (;;) { |
1072 | if (flags & PCI_IRQ_AFFINITY) { | 1090 | if (affinity) { |
1073 | dev->irq_affinity = irq_create_affinity_mask(&nvec); | 1091 | nvec = irq_calc_affinity_vectors(dev->irq_affinity, |
1092 | nvec); | ||
1074 | if (nvec < minvec) | 1093 | if (nvec < minvec) |
1075 | return -ENOSPC; | 1094 | return -ENOSPC; |
1076 | } | 1095 | } |
1077 | 1096 | ||
1078 | rc = msi_capability_init(dev, nvec); | 1097 | rc = msi_capability_init(dev, nvec, affinity); |
1079 | if (rc == 0) | 1098 | if (rc == 0) |
1080 | return nvec; | 1099 | return nvec; |
1081 | 1100 | ||
1082 | kfree(dev->irq_affinity); | ||
1083 | dev->irq_affinity = NULL; | ||
1084 | |||
1085 | if (rc < 0) | 1101 | if (rc < 0) |
1086 | return rc; | 1102 | return rc; |
1087 | if (rc < minvec) | 1103 | if (rc < minvec) |
@@ -1113,26 +1129,24 @@ static int __pci_enable_msix_range(struct pci_dev *dev, | |||
1113 | struct msix_entry *entries, int minvec, int maxvec, | 1129 | struct msix_entry *entries, int minvec, int maxvec, |
1114 | unsigned int flags) | 1130 | unsigned int flags) |
1115 | { | 1131 | { |
1116 | int nvec = maxvec; | 1132 | bool affinity = flags & PCI_IRQ_AFFINITY; |
1117 | int rc; | 1133 | int rc, nvec = maxvec; |
1118 | 1134 | ||
1119 | if (maxvec < minvec) | 1135 | if (maxvec < minvec) |
1120 | return -ERANGE; | 1136 | return -ERANGE; |
1121 | 1137 | ||
1122 | for (;;) { | 1138 | for (;;) { |
1123 | if (flags & PCI_IRQ_AFFINITY) { | 1139 | if (affinity) { |
1124 | dev->irq_affinity = irq_create_affinity_mask(&nvec); | 1140 | nvec = irq_calc_affinity_vectors(dev->irq_affinity, |
1141 | nvec); | ||
1125 | if (nvec < minvec) | 1142 | if (nvec < minvec) |
1126 | return -ENOSPC; | 1143 | return -ENOSPC; |
1127 | } | 1144 | } |
1128 | 1145 | ||
1129 | rc = pci_enable_msix(dev, entries, nvec); | 1146 | rc = __pci_enable_msix(dev, entries, nvec, affinity); |
1130 | if (rc == 0) | 1147 | if (rc == 0) |
1131 | return nvec; | 1148 | return nvec; |
1132 | 1149 | ||
1133 | kfree(dev->irq_affinity); | ||
1134 | dev->irq_affinity = NULL; | ||
1135 | |||
1136 | if (rc < 0) | 1150 | if (rc < 0) |
1137 | return rc; | 1151 | return rc; |
1138 | if (rc < minvec) | 1152 | if (rc < minvec) |
@@ -1256,6 +1270,37 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr) | |||
1256 | } | 1270 | } |
1257 | EXPORT_SYMBOL(pci_irq_vector); | 1271 | EXPORT_SYMBOL(pci_irq_vector); |
1258 | 1272 | ||
1273 | /** | ||
1274 | * pci_irq_get_affinity - return the affinity of a particular msi vector | ||
1275 | * @dev: PCI device to operate on | ||
1276 | * @nr: device-relative interrupt vector index (0-based). | ||
1277 | */ | ||
1278 | const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr) | ||
1279 | { | ||
1280 | if (dev->msix_enabled) { | ||
1281 | struct msi_desc *entry; | ||
1282 | int i = 0; | ||
1283 | |||
1284 | for_each_pci_msi_entry(entry, dev) { | ||
1285 | if (i == nr) | ||
1286 | return entry->affinity; | ||
1287 | i++; | ||
1288 | } | ||
1289 | WARN_ON_ONCE(1); | ||
1290 | return NULL; | ||
1291 | } else if (dev->msi_enabled) { | ||
1292 | struct msi_desc *entry = first_pci_msi_entry(dev); | ||
1293 | |||
1294 | if (WARN_ON_ONCE(!entry || nr >= entry->nvec_used)) | ||
1295 | return NULL; | ||
1296 | |||
1297 | return &entry->affinity[nr]; | ||
1298 | } else { | ||
1299 | return cpu_possible_mask; | ||
1300 | } | ||
1301 | } | ||
1302 | EXPORT_SYMBOL(pci_irq_get_affinity); | ||
1303 | |||
1259 | struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc) | 1304 | struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc) |
1260 | { | 1305 | { |
1261 | return to_pci_dev(desc->dev); | 1306 | return to_pci_dev(desc->dev); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 37ff0158e45f..44e0ff37480b 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -3327,9 +3327,9 @@ static void quirk_apple_wait_for_thunderbolt(struct pci_dev *dev) | |||
3327 | if (nhi->vendor != PCI_VENDOR_ID_INTEL | 3327 | if (nhi->vendor != PCI_VENDOR_ID_INTEL |
3328 | || (nhi->device != PCI_DEVICE_ID_INTEL_LIGHT_RIDGE && | 3328 | || (nhi->device != PCI_DEVICE_ID_INTEL_LIGHT_RIDGE && |
3329 | nhi->device != PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C && | 3329 | nhi->device != PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C && |
3330 | nhi->device != PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_NHI && | ||
3330 | nhi->device != PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_NHI) | 3331 | nhi->device != PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_NHI) |
3331 | || nhi->subsystem_vendor != 0x2222 | 3332 | || nhi->class != PCI_CLASS_SYSTEM_OTHER << 8) |
3332 | || nhi->subsystem_device != 0x1111) | ||
3333 | goto out; | 3333 | goto out; |
3334 | dev_info(&dev->dev, "quirk: waiting for thunderbolt to reestablish PCI tunnels...\n"); | 3334 | dev_info(&dev->dev, "quirk: waiting for thunderbolt to reestablish PCI tunnels...\n"); |
3335 | device_pm_wait_for_dev(&dev->dev, &nhi->dev); | 3335 | device_pm_wait_for_dev(&dev->dev, &nhi->dev); |
@@ -3344,6 +3344,9 @@ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, | |||
3344 | PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C, | 3344 | PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C, |
3345 | quirk_apple_wait_for_thunderbolt); | 3345 | quirk_apple_wait_for_thunderbolt); |
3346 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, | 3346 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, |
3347 | PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_BRIDGE, | ||
3348 | quirk_apple_wait_for_thunderbolt); | ||
3349 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, | ||
3347 | PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_BRIDGE, | 3350 | PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_BRIDGE, |
3348 | quirk_apple_wait_for_thunderbolt); | 3351 | quirk_apple_wait_for_thunderbolt); |
3349 | #endif | 3352 | #endif |
diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c index c494613c1909..f5e1008a223d 100644 --- a/drivers/perf/arm_pmu.c +++ b/drivers/perf/arm_pmu.c | |||
@@ -925,6 +925,7 @@ static int of_pmu_irq_cfg(struct arm_pmu *pmu) | |||
925 | if (i > 0 && spi != using_spi) { | 925 | if (i > 0 && spi != using_spi) { |
926 | pr_err("PPI/SPI IRQ type mismatch for %s!\n", | 926 | pr_err("PPI/SPI IRQ type mismatch for %s!\n", |
927 | dn->name); | 927 | dn->name); |
928 | of_node_put(dn); | ||
928 | kfree(irqs); | 929 | kfree(irqs); |
929 | return -EINVAL; | 930 | return -EINVAL; |
930 | } | 931 | } |
@@ -969,7 +970,7 @@ static int of_pmu_irq_cfg(struct arm_pmu *pmu) | |||
969 | if (cpumask_weight(&pmu->supported_cpus) == 0) { | 970 | if (cpumask_weight(&pmu->supported_cpus) == 0) { |
970 | int irq = platform_get_irq(pdev, 0); | 971 | int irq = platform_get_irq(pdev, 0); |
971 | 972 | ||
972 | if (irq_is_percpu(irq)) { | 973 | if (irq >= 0 && irq_is_percpu(irq)) { |
973 | /* If using PPIs, check the affinity of the partition */ | 974 | /* If using PPIs, check the affinity of the partition */ |
974 | int ret; | 975 | int ret; |
975 | 976 | ||
diff --git a/drivers/phy/phy-brcm-sata.c b/drivers/phy/phy-brcm-sata.c index 18d662610075..8ffc44afdb75 100644 --- a/drivers/phy/phy-brcm-sata.c +++ b/drivers/phy/phy-brcm-sata.c | |||
@@ -367,7 +367,7 @@ static int brcm_sata_phy_init(struct phy *phy) | |||
367 | rc = -ENODEV; | 367 | rc = -ENODEV; |
368 | }; | 368 | }; |
369 | 369 | ||
370 | return 0; | 370 | return rc; |
371 | } | 371 | } |
372 | 372 | ||
373 | static const struct phy_ops phy_ops = { | 373 | static const struct phy_ops phy_ops = { |
diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c index 0a45bc6088ae..8c7eb335622e 100644 --- a/drivers/phy/phy-sun4i-usb.c +++ b/drivers/phy/phy-sun4i-usb.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <linux/power_supply.h> | 40 | #include <linux/power_supply.h> |
41 | #include <linux/regulator/consumer.h> | 41 | #include <linux/regulator/consumer.h> |
42 | #include <linux/reset.h> | 42 | #include <linux/reset.h> |
43 | #include <linux/usb/of.h> | ||
43 | #include <linux/workqueue.h> | 44 | #include <linux/workqueue.h> |
44 | 45 | ||
45 | #define REG_ISCR 0x00 | 46 | #define REG_ISCR 0x00 |
@@ -110,6 +111,7 @@ struct sun4i_usb_phy_cfg { | |||
110 | struct sun4i_usb_phy_data { | 111 | struct sun4i_usb_phy_data { |
111 | void __iomem *base; | 112 | void __iomem *base; |
112 | const struct sun4i_usb_phy_cfg *cfg; | 113 | const struct sun4i_usb_phy_cfg *cfg; |
114 | enum usb_dr_mode dr_mode; | ||
113 | struct mutex mutex; | 115 | struct mutex mutex; |
114 | struct sun4i_usb_phy { | 116 | struct sun4i_usb_phy { |
115 | struct phy *phy; | 117 | struct phy *phy; |
@@ -120,6 +122,7 @@ struct sun4i_usb_phy_data { | |||
120 | bool regulator_on; | 122 | bool regulator_on; |
121 | int index; | 123 | int index; |
122 | } phys[MAX_PHYS]; | 124 | } phys[MAX_PHYS]; |
125 | int first_phy; | ||
123 | /* phy0 / otg related variables */ | 126 | /* phy0 / otg related variables */ |
124 | struct extcon_dev *extcon; | 127 | struct extcon_dev *extcon; |
125 | bool phy0_init; | 128 | bool phy0_init; |
@@ -285,16 +288,10 @@ static int sun4i_usb_phy_init(struct phy *_phy) | |||
285 | sun4i_usb_phy0_update_iscr(_phy, 0, ISCR_DPDM_PULLUP_EN); | 288 | sun4i_usb_phy0_update_iscr(_phy, 0, ISCR_DPDM_PULLUP_EN); |
286 | sun4i_usb_phy0_update_iscr(_phy, 0, ISCR_ID_PULLUP_EN); | 289 | sun4i_usb_phy0_update_iscr(_phy, 0, ISCR_ID_PULLUP_EN); |
287 | 290 | ||
288 | if (data->id_det_gpio) { | 291 | /* Force ISCR and cable state updates */ |
289 | /* OTG mode, force ISCR and cable state updates */ | 292 | data->id_det = -1; |
290 | data->id_det = -1; | 293 | data->vbus_det = -1; |
291 | data->vbus_det = -1; | 294 | queue_delayed_work(system_wq, &data->detect, 0); |
292 | queue_delayed_work(system_wq, &data->detect, 0); | ||
293 | } else { | ||
294 | /* Host only mode */ | ||
295 | sun4i_usb_phy0_set_id_detect(_phy, 0); | ||
296 | sun4i_usb_phy0_set_vbus_detect(_phy, 1); | ||
297 | } | ||
298 | } | 295 | } |
299 | 296 | ||
300 | return 0; | 297 | return 0; |
@@ -319,6 +316,19 @@ static int sun4i_usb_phy_exit(struct phy *_phy) | |||
319 | return 0; | 316 | return 0; |
320 | } | 317 | } |
321 | 318 | ||
319 | static int sun4i_usb_phy0_get_id_det(struct sun4i_usb_phy_data *data) | ||
320 | { | ||
321 | switch (data->dr_mode) { | ||
322 | case USB_DR_MODE_OTG: | ||
323 | return gpiod_get_value_cansleep(data->id_det_gpio); | ||
324 | case USB_DR_MODE_HOST: | ||
325 | return 0; | ||
326 | case USB_DR_MODE_PERIPHERAL: | ||
327 | default: | ||
328 | return 1; | ||
329 | } | ||
330 | } | ||
331 | |||
322 | static int sun4i_usb_phy0_get_vbus_det(struct sun4i_usb_phy_data *data) | 332 | static int sun4i_usb_phy0_get_vbus_det(struct sun4i_usb_phy_data *data) |
323 | { | 333 | { |
324 | if (data->vbus_det_gpio) | 334 | if (data->vbus_det_gpio) |
@@ -432,7 +442,10 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work) | |||
432 | struct phy *phy0 = data->phys[0].phy; | 442 | struct phy *phy0 = data->phys[0].phy; |
433 | int id_det, vbus_det, id_notify = 0, vbus_notify = 0; | 443 | int id_det, vbus_det, id_notify = 0, vbus_notify = 0; |
434 | 444 | ||
435 | id_det = gpiod_get_value_cansleep(data->id_det_gpio); | 445 | if (phy0 == NULL) |
446 | return; | ||
447 | |||
448 | id_det = sun4i_usb_phy0_get_id_det(data); | ||
436 | vbus_det = sun4i_usb_phy0_get_vbus_det(data); | 449 | vbus_det = sun4i_usb_phy0_get_vbus_det(data); |
437 | 450 | ||
438 | mutex_lock(&phy0->mutex); | 451 | mutex_lock(&phy0->mutex); |
@@ -448,7 +461,8 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work) | |||
448 | * without vbus detection report vbus low for long enough for | 461 | * without vbus detection report vbus low for long enough for |
449 | * the musb-ip to end the current device session. | 462 | * the musb-ip to end the current device session. |
450 | */ | 463 | */ |
451 | if (!sun4i_usb_phy0_have_vbus_det(data) && id_det == 0) { | 464 | if (data->dr_mode == USB_DR_MODE_OTG && |
465 | !sun4i_usb_phy0_have_vbus_det(data) && id_det == 0) { | ||
452 | sun4i_usb_phy0_set_vbus_detect(phy0, 0); | 466 | sun4i_usb_phy0_set_vbus_detect(phy0, 0); |
453 | msleep(200); | 467 | msleep(200); |
454 | sun4i_usb_phy0_set_vbus_detect(phy0, 1); | 468 | sun4i_usb_phy0_set_vbus_detect(phy0, 1); |
@@ -474,7 +488,8 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work) | |||
474 | * without vbus detection report vbus low for long enough to | 488 | * without vbus detection report vbus low for long enough to |
475 | * the musb-ip to end the current host session. | 489 | * the musb-ip to end the current host session. |
476 | */ | 490 | */ |
477 | if (!sun4i_usb_phy0_have_vbus_det(data) && id_det == 1) { | 491 | if (data->dr_mode == USB_DR_MODE_OTG && |
492 | !sun4i_usb_phy0_have_vbus_det(data) && id_det == 1) { | ||
478 | mutex_lock(&phy0->mutex); | 493 | mutex_lock(&phy0->mutex); |
479 | sun4i_usb_phy0_set_vbus_detect(phy0, 0); | 494 | sun4i_usb_phy0_set_vbus_detect(phy0, 0); |
480 | msleep(1000); | 495 | msleep(1000); |
@@ -519,7 +534,8 @@ static struct phy *sun4i_usb_phy_xlate(struct device *dev, | |||
519 | { | 534 | { |
520 | struct sun4i_usb_phy_data *data = dev_get_drvdata(dev); | 535 | struct sun4i_usb_phy_data *data = dev_get_drvdata(dev); |
521 | 536 | ||
522 | if (args->args[0] >= data->cfg->num_phys) | 537 | if (args->args[0] < data->first_phy || |
538 | args->args[0] >= data->cfg->num_phys) | ||
523 | return ERR_PTR(-ENODEV); | 539 | return ERR_PTR(-ENODEV); |
524 | 540 | ||
525 | return data->phys[args->args[0]].phy; | 541 | return data->phys[args->args[0]].phy; |
@@ -593,13 +609,17 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev) | |||
593 | return -EPROBE_DEFER; | 609 | return -EPROBE_DEFER; |
594 | } | 610 | } |
595 | 611 | ||
596 | /* vbus_det without id_det makes no sense, and is not supported */ | 612 | data->dr_mode = of_usb_get_dr_mode_by_phy(np, 0); |
597 | if (sun4i_usb_phy0_have_vbus_det(data) && !data->id_det_gpio) { | 613 | switch (data->dr_mode) { |
598 | dev_err(dev, "usb0_id_det missing or invalid\n"); | 614 | case USB_DR_MODE_OTG: |
599 | return -ENODEV; | 615 | /* otg without id_det makes no sense, and is not supported */ |
600 | } | 616 | if (!data->id_det_gpio) { |
601 | 617 | dev_err(dev, "usb0_id_det missing or invalid\n"); | |
602 | if (data->id_det_gpio) { | 618 | return -ENODEV; |
619 | } | ||
620 | /* fall through */ | ||
621 | case USB_DR_MODE_HOST: | ||
622 | case USB_DR_MODE_PERIPHERAL: | ||
603 | data->extcon = devm_extcon_dev_allocate(dev, | 623 | data->extcon = devm_extcon_dev_allocate(dev, |
604 | sun4i_usb_phy0_cable); | 624 | sun4i_usb_phy0_cable); |
605 | if (IS_ERR(data->extcon)) | 625 | if (IS_ERR(data->extcon)) |
@@ -610,9 +630,13 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev) | |||
610 | dev_err(dev, "failed to register extcon: %d\n", ret); | 630 | dev_err(dev, "failed to register extcon: %d\n", ret); |
611 | return ret; | 631 | return ret; |
612 | } | 632 | } |
633 | break; | ||
634 | default: | ||
635 | dev_info(dev, "dr_mode unknown, not registering usb phy0\n"); | ||
636 | data->first_phy = 1; | ||
613 | } | 637 | } |
614 | 638 | ||
615 | for (i = 0; i < data->cfg->num_phys; i++) { | 639 | for (i = data->first_phy; i < data->cfg->num_phys; i++) { |
616 | struct sun4i_usb_phy *phy = data->phys + i; | 640 | struct sun4i_usb_phy *phy = data->phys + i; |
617 | char name[16]; | 641 | char name[16]; |
618 | 642 | ||
diff --git a/drivers/phy/phy-sun9i-usb.c b/drivers/phy/phy-sun9i-usb.c index ac4f31abefe3..28fce4bce638 100644 --- a/drivers/phy/phy-sun9i-usb.c +++ b/drivers/phy/phy-sun9i-usb.c | |||
@@ -141,9 +141,9 @@ static int sun9i_usb_phy_probe(struct platform_device *pdev) | |||
141 | } | 141 | } |
142 | 142 | ||
143 | phy->hsic_clk = devm_clk_get(dev, "hsic_12M"); | 143 | phy->hsic_clk = devm_clk_get(dev, "hsic_12M"); |
144 | if (IS_ERR(phy->clk)) { | 144 | if (IS_ERR(phy->hsic_clk)) { |
145 | dev_err(dev, "failed to get hsic_12M clock\n"); | 145 | dev_err(dev, "failed to get hsic_12M clock\n"); |
146 | return PTR_ERR(phy->clk); | 146 | return PTR_ERR(phy->hsic_clk); |
147 | } | 147 | } |
148 | 148 | ||
149 | phy->reset = devm_reset_control_get(dev, "hsic"); | 149 | phy->reset = devm_reset_control_get(dev, "hsic"); |
diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c index 5749a4eee746..0fe8fad25e4d 100644 --- a/drivers/pinctrl/intel/pinctrl-cherryview.c +++ b/drivers/pinctrl/intel/pinctrl-cherryview.c | |||
@@ -1539,12 +1539,11 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq) | |||
1539 | offset += range->npins; | 1539 | offset += range->npins; |
1540 | } | 1540 | } |
1541 | 1541 | ||
1542 | /* Mask and clear all interrupts */ | 1542 | /* Clear all interrupts */ |
1543 | chv_writel(0, pctrl->regs + CHV_INTMASK); | ||
1544 | chv_writel(0xffff, pctrl->regs + CHV_INTSTAT); | 1543 | chv_writel(0xffff, pctrl->regs + CHV_INTSTAT); |
1545 | 1544 | ||
1546 | ret = gpiochip_irqchip_add(chip, &chv_gpio_irqchip, 0, | 1545 | ret = gpiochip_irqchip_add(chip, &chv_gpio_irqchip, 0, |
1547 | handle_simple_irq, IRQ_TYPE_NONE); | 1546 | handle_bad_irq, IRQ_TYPE_NONE); |
1548 | if (ret) { | 1547 | if (ret) { |
1549 | dev_err(pctrl->dev, "failed to add IRQ chip\n"); | 1548 | dev_err(pctrl->dev, "failed to add IRQ chip\n"); |
1550 | goto fail; | 1549 | goto fail; |
diff --git a/drivers/pinctrl/pinctrl-pistachio.c b/drivers/pinctrl/pinctrl-pistachio.c index 7bad200bd67c..55375b1b3cc8 100644 --- a/drivers/pinctrl/pinctrl-pistachio.c +++ b/drivers/pinctrl/pinctrl-pistachio.c | |||
@@ -809,17 +809,17 @@ static const struct pistachio_pin_group pistachio_groups[] = { | |||
809 | PADS_FUNCTION_SELECT2, 12, 0x3), | 809 | PADS_FUNCTION_SELECT2, 12, 0x3), |
810 | MFIO_MUX_PIN_GROUP(83, MIPS_PLL_LOCK, MIPS_TRACE_DATA, USB_DEBUG, | 810 | MFIO_MUX_PIN_GROUP(83, MIPS_PLL_LOCK, MIPS_TRACE_DATA, USB_DEBUG, |
811 | PADS_FUNCTION_SELECT2, 14, 0x3), | 811 | PADS_FUNCTION_SELECT2, 14, 0x3), |
812 | MFIO_MUX_PIN_GROUP(84, SYS_PLL_LOCK, MIPS_TRACE_DATA, USB_DEBUG, | 812 | MFIO_MUX_PIN_GROUP(84, AUDIO_PLL_LOCK, MIPS_TRACE_DATA, USB_DEBUG, |
813 | PADS_FUNCTION_SELECT2, 16, 0x3), | 813 | PADS_FUNCTION_SELECT2, 16, 0x3), |
814 | MFIO_MUX_PIN_GROUP(85, WIFI_PLL_LOCK, MIPS_TRACE_DATA, SDHOST_DEBUG, | 814 | MFIO_MUX_PIN_GROUP(85, RPU_V_PLL_LOCK, MIPS_TRACE_DATA, SDHOST_DEBUG, |
815 | PADS_FUNCTION_SELECT2, 18, 0x3), | 815 | PADS_FUNCTION_SELECT2, 18, 0x3), |
816 | MFIO_MUX_PIN_GROUP(86, BT_PLL_LOCK, MIPS_TRACE_DATA, SDHOST_DEBUG, | 816 | MFIO_MUX_PIN_GROUP(86, RPU_L_PLL_LOCK, MIPS_TRACE_DATA, SDHOST_DEBUG, |
817 | PADS_FUNCTION_SELECT2, 20, 0x3), | 817 | PADS_FUNCTION_SELECT2, 20, 0x3), |
818 | MFIO_MUX_PIN_GROUP(87, RPU_V_PLL_LOCK, DREQ2, SOCIF_DEBUG, | 818 | MFIO_MUX_PIN_GROUP(87, SYS_PLL_LOCK, DREQ2, SOCIF_DEBUG, |
819 | PADS_FUNCTION_SELECT2, 22, 0x3), | 819 | PADS_FUNCTION_SELECT2, 22, 0x3), |
820 | MFIO_MUX_PIN_GROUP(88, RPU_L_PLL_LOCK, DREQ3, SOCIF_DEBUG, | 820 | MFIO_MUX_PIN_GROUP(88, WIFI_PLL_LOCK, DREQ3, SOCIF_DEBUG, |
821 | PADS_FUNCTION_SELECT2, 24, 0x3), | 821 | PADS_FUNCTION_SELECT2, 24, 0x3), |
822 | MFIO_MUX_PIN_GROUP(89, AUDIO_PLL_LOCK, DREQ4, DREQ5, | 822 | MFIO_MUX_PIN_GROUP(89, BT_PLL_LOCK, DREQ4, DREQ5, |
823 | PADS_FUNCTION_SELECT2, 26, 0x3), | 823 | PADS_FUNCTION_SELECT2, 26, 0x3), |
824 | PIN_GROUP(TCK, "tck"), | 824 | PIN_GROUP(TCK, "tck"), |
825 | PIN_GROUP(TRSTN, "trstn"), | 825 | PIN_GROUP(TRSTN, "trstn"), |
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c b/drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c index ce483b03a263..f9d661e5c14a 100644 --- a/drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c +++ b/drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c | |||
@@ -485,12 +485,12 @@ static const struct sunxi_desc_pin sun8i_a23_pins[] = { | |||
485 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8), | 485 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8), |
486 | SUNXI_FUNCTION(0x0, "gpio_in"), | 486 | SUNXI_FUNCTION(0x0, "gpio_in"), |
487 | SUNXI_FUNCTION(0x1, "gpio_out"), | 487 | SUNXI_FUNCTION(0x1, "gpio_out"), |
488 | SUNXI_FUNCTION(0x2, "uart2"), /* RTS */ | 488 | SUNXI_FUNCTION(0x2, "uart1"), /* RTS */ |
489 | SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 8)), /* PG_EINT8 */ | 489 | SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 8)), /* PG_EINT8 */ |
490 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9), | 490 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9), |
491 | SUNXI_FUNCTION(0x0, "gpio_in"), | 491 | SUNXI_FUNCTION(0x0, "gpio_in"), |
492 | SUNXI_FUNCTION(0x1, "gpio_out"), | 492 | SUNXI_FUNCTION(0x1, "gpio_out"), |
493 | SUNXI_FUNCTION(0x2, "uart2"), /* CTS */ | 493 | SUNXI_FUNCTION(0x2, "uart1"), /* CTS */ |
494 | SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 9)), /* PG_EINT9 */ | 494 | SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 9)), /* PG_EINT9 */ |
495 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), | 495 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), |
496 | SUNXI_FUNCTION(0x0, "gpio_in"), | 496 | SUNXI_FUNCTION(0x0, "gpio_in"), |
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c b/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c index 3040abe6f73a..3131cac2b76f 100644 --- a/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c +++ b/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c | |||
@@ -407,12 +407,12 @@ static const struct sunxi_desc_pin sun8i_a33_pins[] = { | |||
407 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8), | 407 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8), |
408 | SUNXI_FUNCTION(0x0, "gpio_in"), | 408 | SUNXI_FUNCTION(0x0, "gpio_in"), |
409 | SUNXI_FUNCTION(0x1, "gpio_out"), | 409 | SUNXI_FUNCTION(0x1, "gpio_out"), |
410 | SUNXI_FUNCTION(0x2, "uart2"), /* RTS */ | 410 | SUNXI_FUNCTION(0x2, "uart1"), /* RTS */ |
411 | SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 8)), /* PG_EINT8 */ | 411 | SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 8)), /* PG_EINT8 */ |
412 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9), | 412 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9), |
413 | SUNXI_FUNCTION(0x0, "gpio_in"), | 413 | SUNXI_FUNCTION(0x0, "gpio_in"), |
414 | SUNXI_FUNCTION(0x1, "gpio_out"), | 414 | SUNXI_FUNCTION(0x1, "gpio_out"), |
415 | SUNXI_FUNCTION(0x2, "uart2"), /* CTS */ | 415 | SUNXI_FUNCTION(0x2, "uart1"), /* CTS */ |
416 | SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 9)), /* PG_EINT9 */ | 416 | SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 9)), /* PG_EINT9 */ |
417 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), | 417 | SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), |
418 | SUNXI_FUNCTION(0x0, "gpio_in"), | 418 | SUNXI_FUNCTION(0x0, "gpio_in"), |
diff --git a/drivers/platform/olpc/olpc-ec.c b/drivers/platform/olpc/olpc-ec.c index f99b183d5296..374a8028fec7 100644 --- a/drivers/platform/olpc/olpc-ec.c +++ b/drivers/platform/olpc/olpc-ec.c | |||
@@ -1,6 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * Generic driver for the OLPC Embedded Controller. | 2 | * Generic driver for the OLPC Embedded Controller. |
3 | * | 3 | * |
4 | * Author: Andres Salomon <dilinger@queued.net> | ||
5 | * | ||
4 | * Copyright (C) 2011-2012 One Laptop per Child Foundation. | 6 | * Copyright (C) 2011-2012 One Laptop per Child Foundation. |
5 | * | 7 | * |
6 | * Licensed under the GPL v2 or later. | 8 | * Licensed under the GPL v2 or later. |
@@ -12,7 +14,7 @@ | |||
12 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
13 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
14 | #include <linux/workqueue.h> | 16 | #include <linux/workqueue.h> |
15 | #include <linux/module.h> | 17 | #include <linux/init.h> |
16 | #include <linux/list.h> | 18 | #include <linux/list.h> |
17 | #include <linux/olpc-ec.h> | 19 | #include <linux/olpc-ec.h> |
18 | #include <asm/olpc.h> | 20 | #include <asm/olpc.h> |
@@ -326,8 +328,4 @@ static int __init olpc_ec_init_module(void) | |||
326 | { | 328 | { |
327 | return platform_driver_register(&olpc_ec_plat_driver); | 329 | return platform_driver_register(&olpc_ec_plat_driver); |
328 | } | 330 | } |
329 | |||
330 | arch_initcall(olpc_ec_init_module); | 331 | arch_initcall(olpc_ec_init_module); |
331 | |||
332 | MODULE_AUTHOR("Andres Salomon <dilinger@queued.net>"); | ||
333 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/platform/x86/intel_pmic_gpio.c b/drivers/platform/x86/intel_pmic_gpio.c index 63b371d6ee55..91ae58510d92 100644 --- a/drivers/platform/x86/intel_pmic_gpio.c +++ b/drivers/platform/x86/intel_pmic_gpio.c | |||
@@ -1,6 +1,8 @@ | |||
1 | /* Moorestown PMIC GPIO (access through IPC) driver | 1 | /* Moorestown PMIC GPIO (access through IPC) driver |
2 | * Copyright (c) 2008 - 2009, Intel Corporation. | 2 | * Copyright (c) 2008 - 2009, Intel Corporation. |
3 | * | 3 | * |
4 | * Author: Alek Du <alek.du@intel.com> | ||
5 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
5 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
6 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
@@ -21,7 +23,6 @@ | |||
21 | 23 | ||
22 | #define pr_fmt(fmt) "%s: " fmt, __func__ | 24 | #define pr_fmt(fmt) "%s: " fmt, __func__ |
23 | 25 | ||
24 | #include <linux/module.h> | ||
25 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
26 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
27 | #include <linux/delay.h> | 28 | #include <linux/delay.h> |
@@ -322,9 +323,4 @@ static int __init platform_pmic_gpio_init(void) | |||
322 | { | 323 | { |
323 | return platform_driver_register(&platform_pmic_gpio_driver); | 324 | return platform_driver_register(&platform_pmic_gpio_driver); |
324 | } | 325 | } |
325 | |||
326 | subsys_initcall(platform_pmic_gpio_init); | 326 | subsys_initcall(platform_pmic_gpio_init); |
327 | |||
328 | MODULE_AUTHOR("Alek Du <alek.du@intel.com>"); | ||
329 | MODULE_DESCRIPTION("Intel Moorestown PMIC GPIO driver"); | ||
330 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/rapidio/devices/tsi721.c b/drivers/rapidio/devices/tsi721.c index 32f0f014a067..9d19b9a62011 100644 --- a/drivers/rapidio/devices/tsi721.c +++ b/drivers/rapidio/devices/tsi721.c | |||
@@ -1161,7 +1161,7 @@ static int tsi721_rio_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart, | |||
1161 | } else if (ibw_start < (ib_win->rstart + ib_win->size) && | 1161 | } else if (ibw_start < (ib_win->rstart + ib_win->size) && |
1162 | (ibw_start + ibw_size) > ib_win->rstart) { | 1162 | (ibw_start + ibw_size) > ib_win->rstart) { |
1163 | /* Return error if address translation involved */ | 1163 | /* Return error if address translation involved */ |
1164 | if (direct && ib_win->xlat) { | 1164 | if (!direct || ib_win->xlat) { |
1165 | ret = -EFAULT; | 1165 | ret = -EFAULT; |
1166 | break; | 1166 | break; |
1167 | } | 1167 | } |
diff --git a/drivers/regulator/max14577-regulator.c b/drivers/regulator/max14577-regulator.c index b2daa6641417..c9ff26199711 100644 --- a/drivers/regulator/max14577-regulator.c +++ b/drivers/regulator/max14577-regulator.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * max14577.c - Regulator driver for the Maxim 14577/77836 | 2 | * max14577.c - Regulator driver for the Maxim 14577/77836 |
3 | * | 3 | * |
4 | * Copyright (C) 2013,2014 Samsung Electronics | 4 | * Copyright (C) 2013,2014 Samsung Electronics |
5 | * Krzysztof Kozlowski <k.kozlowski@samsung.com> | 5 | * Krzysztof Kozlowski <krzk@kernel.org> |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 8 | * it under the terms of the GNU General Public License as published by |
@@ -331,7 +331,7 @@ static void __exit max14577_regulator_exit(void) | |||
331 | } | 331 | } |
332 | module_exit(max14577_regulator_exit); | 332 | module_exit(max14577_regulator_exit); |
333 | 333 | ||
334 | MODULE_AUTHOR("Krzysztof Kozlowski <k.kozlowski@samsung.com>"); | 334 | MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>"); |
335 | MODULE_DESCRIPTION("Maxim 14577/77836 regulator driver"); | 335 | MODULE_DESCRIPTION("Maxim 14577/77836 regulator driver"); |
336 | MODULE_LICENSE("GPL"); | 336 | MODULE_LICENSE("GPL"); |
337 | MODULE_ALIAS("platform:max14577-regulator"); | 337 | MODULE_ALIAS("platform:max14577-regulator"); |
diff --git a/drivers/regulator/max77693-regulator.c b/drivers/regulator/max77693-regulator.c index de730fd3f8a5..cfbb9512e486 100644 --- a/drivers/regulator/max77693-regulator.c +++ b/drivers/regulator/max77693-regulator.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2013-2015 Samsung Electronics | 4 | * Copyright (C) 2013-2015 Samsung Electronics |
5 | * Jonghwa Lee <jonghwa3.lee@samsung.com> | 5 | * Jonghwa Lee <jonghwa3.lee@samsung.com> |
6 | * Krzysztof Kozlowski <k.kozlowski.k@gmail.com> | 6 | * Krzysztof Kozlowski <krzk@kernel.org> |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -314,5 +314,5 @@ module_exit(max77693_pmic_cleanup); | |||
314 | 314 | ||
315 | MODULE_DESCRIPTION("MAXIM 77693/77843 regulator driver"); | 315 | MODULE_DESCRIPTION("MAXIM 77693/77843 regulator driver"); |
316 | MODULE_AUTHOR("Jonghwa Lee <jonghwa3.lee@samsung.com>"); | 316 | MODULE_AUTHOR("Jonghwa Lee <jonghwa3.lee@samsung.com>"); |
317 | MODULE_AUTHOR("Krzysztof Kozlowski <k.kozlowski.k@gmail.com>"); | 317 | MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>"); |
318 | MODULE_LICENSE("GPL"); | 318 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/regulator/qcom_smd-regulator.c b/drivers/regulator/qcom_smd-regulator.c index 5022fa8d10c6..8ed46a9a55c8 100644 --- a/drivers/regulator/qcom_smd-regulator.c +++ b/drivers/regulator/qcom_smd-regulator.c | |||
@@ -178,20 +178,21 @@ static const struct regulator_desc pma8084_hfsmps = { | |||
178 | static const struct regulator_desc pma8084_ftsmps = { | 178 | static const struct regulator_desc pma8084_ftsmps = { |
179 | .linear_ranges = (struct regulator_linear_range[]) { | 179 | .linear_ranges = (struct regulator_linear_range[]) { |
180 | REGULATOR_LINEAR_RANGE(350000, 0, 184, 5000), | 180 | REGULATOR_LINEAR_RANGE(350000, 0, 184, 5000), |
181 | REGULATOR_LINEAR_RANGE(700000, 185, 339, 10000), | 181 | REGULATOR_LINEAR_RANGE(1280000, 185, 261, 10000), |
182 | }, | 182 | }, |
183 | .n_linear_ranges = 2, | 183 | .n_linear_ranges = 2, |
184 | .n_voltages = 340, | 184 | .n_voltages = 262, |
185 | .ops = &rpm_smps_ldo_ops, | 185 | .ops = &rpm_smps_ldo_ops, |
186 | }; | 186 | }; |
187 | 187 | ||
188 | static const struct regulator_desc pma8084_pldo = { | 188 | static const struct regulator_desc pma8084_pldo = { |
189 | .linear_ranges = (struct regulator_linear_range[]) { | 189 | .linear_ranges = (struct regulator_linear_range[]) { |
190 | REGULATOR_LINEAR_RANGE(750000, 0, 30, 25000), | 190 | REGULATOR_LINEAR_RANGE( 750000, 0, 63, 12500), |
191 | REGULATOR_LINEAR_RANGE(1500000, 31, 99, 50000), | 191 | REGULATOR_LINEAR_RANGE(1550000, 64, 126, 25000), |
192 | REGULATOR_LINEAR_RANGE(3100000, 127, 163, 50000), | ||
192 | }, | 193 | }, |
193 | .n_linear_ranges = 2, | 194 | .n_linear_ranges = 3, |
194 | .n_voltages = 100, | 195 | .n_voltages = 164, |
195 | .ops = &rpm_smps_ldo_ops, | 196 | .ops = &rpm_smps_ldo_ops, |
196 | }; | 197 | }; |
197 | 198 | ||
@@ -221,29 +222,30 @@ static const struct regulator_desc pm8x41_hfsmps = { | |||
221 | static const struct regulator_desc pm8841_ftsmps = { | 222 | static const struct regulator_desc pm8841_ftsmps = { |
222 | .linear_ranges = (struct regulator_linear_range[]) { | 223 | .linear_ranges = (struct regulator_linear_range[]) { |
223 | REGULATOR_LINEAR_RANGE(350000, 0, 184, 5000), | 224 | REGULATOR_LINEAR_RANGE(350000, 0, 184, 5000), |
224 | REGULATOR_LINEAR_RANGE(700000, 185, 339, 10000), | 225 | REGULATOR_LINEAR_RANGE(1280000, 185, 261, 10000), |
225 | }, | 226 | }, |
226 | .n_linear_ranges = 2, | 227 | .n_linear_ranges = 2, |
227 | .n_voltages = 340, | 228 | .n_voltages = 262, |
228 | .ops = &rpm_smps_ldo_ops, | 229 | .ops = &rpm_smps_ldo_ops, |
229 | }; | 230 | }; |
230 | 231 | ||
231 | static const struct regulator_desc pm8941_boost = { | 232 | static const struct regulator_desc pm8941_boost = { |
232 | .linear_ranges = (struct regulator_linear_range[]) { | 233 | .linear_ranges = (struct regulator_linear_range[]) { |
233 | REGULATOR_LINEAR_RANGE(4000000, 0, 15, 100000), | 234 | REGULATOR_LINEAR_RANGE(4000000, 0, 30, 50000), |
234 | }, | 235 | }, |
235 | .n_linear_ranges = 1, | 236 | .n_linear_ranges = 1, |
236 | .n_voltages = 16, | 237 | .n_voltages = 31, |
237 | .ops = &rpm_smps_ldo_ops, | 238 | .ops = &rpm_smps_ldo_ops, |
238 | }; | 239 | }; |
239 | 240 | ||
240 | static const struct regulator_desc pm8941_pldo = { | 241 | static const struct regulator_desc pm8941_pldo = { |
241 | .linear_ranges = (struct regulator_linear_range[]) { | 242 | .linear_ranges = (struct regulator_linear_range[]) { |
242 | REGULATOR_LINEAR_RANGE( 750000, 0, 30, 25000), | 243 | REGULATOR_LINEAR_RANGE( 750000, 0, 63, 12500), |
243 | REGULATOR_LINEAR_RANGE(1500000, 31, 99, 50000), | 244 | REGULATOR_LINEAR_RANGE(1550000, 64, 126, 25000), |
245 | REGULATOR_LINEAR_RANGE(3100000, 127, 163, 50000), | ||
244 | }, | 246 | }, |
245 | .n_linear_ranges = 2, | 247 | .n_linear_ranges = 3, |
246 | .n_voltages = 100, | 248 | .n_voltages = 164, |
247 | .ops = &rpm_smps_ldo_ops, | 249 | .ops = &rpm_smps_ldo_ops, |
248 | }; | 250 | }; |
249 | 251 | ||
diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c index 83458f7a2824..6dc96c8dfe75 100644 --- a/drivers/scsi/constants.c +++ b/drivers/scsi/constants.c | |||
@@ -361,8 +361,9 @@ static const char * const snstext[] = { | |||
361 | 361 | ||
362 | /* Get sense key string or NULL if not available */ | 362 | /* Get sense key string or NULL if not available */ |
363 | const char * | 363 | const char * |
364 | scsi_sense_key_string(unsigned char key) { | 364 | scsi_sense_key_string(unsigned char key) |
365 | if (key <= 0xE) | 365 | { |
366 | if (key < ARRAY_SIZE(snstext)) | ||
366 | return snstext[key]; | 367 | return snstext[key]; |
367 | return NULL; | 368 | return NULL; |
368 | } | 369 | } |
diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c index eaccd651ccda..246456925335 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c | |||
@@ -246,6 +246,10 @@ static struct { | |||
246 | {"IBM", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, | 246 | {"IBM", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
247 | {"SUN", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, | 247 | {"SUN", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
248 | {"DELL", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, | 248 | {"DELL", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
249 | {"STK", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, | ||
250 | {"NETAPP", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, | ||
251 | {"LSI", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, | ||
252 | {"ENGENIO", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, | ||
249 | {"SMSC", "USB 2 HS-CF", NULL, BLIST_SPARSELUN | BLIST_INQUIRY_36}, | 253 | {"SMSC", "USB 2 HS-CF", NULL, BLIST_SPARSELUN | BLIST_INQUIRY_36}, |
250 | {"SONY", "CD-ROM CDU-8001", NULL, BLIST_BORKEN}, | 254 | {"SONY", "CD-ROM CDU-8001", NULL, BLIST_BORKEN}, |
251 | {"SONY", "TSL", NULL, BLIST_FORCELUN}, /* DDS3 & DDS4 autoloaders */ | 255 | {"SONY", "TSL", NULL, BLIST_FORCELUN}, /* DDS3 & DDS4 autoloaders */ |
diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c index 3f0ff072184b..60b651bfaa01 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c | |||
@@ -341,22 +341,6 @@ static int do_sas_phy_delete(struct device *dev, void *data) | |||
341 | } | 341 | } |
342 | 342 | ||
343 | /** | 343 | /** |
344 | * is_sas_attached - check if device is SAS attached | ||
345 | * @sdev: scsi device to check | ||
346 | * | ||
347 | * returns true if the device is SAS attached | ||
348 | */ | ||
349 | int is_sas_attached(struct scsi_device *sdev) | ||
350 | { | ||
351 | struct Scsi_Host *shost = sdev->host; | ||
352 | |||
353 | return shost->transportt->host_attrs.ac.class == | ||
354 | &sas_host_class.class; | ||
355 | } | ||
356 | EXPORT_SYMBOL(is_sas_attached); | ||
357 | |||
358 | |||
359 | /** | ||
360 | * sas_remove_children - tear down a devices SAS data structures | 344 | * sas_remove_children - tear down a devices SAS data structures |
361 | * @dev: device belonging to the sas object | 345 | * @dev: device belonging to the sas object |
362 | * | 346 | * |
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c index 0e8601aa877a..8c9a35c91705 100644 --- a/drivers/scsi/ses.c +++ b/drivers/scsi/ses.c | |||
@@ -587,7 +587,7 @@ static void ses_match_to_enclosure(struct enclosure_device *edev, | |||
587 | 587 | ||
588 | ses_enclosure_data_process(edev, to_scsi_device(edev->edev.parent), 0); | 588 | ses_enclosure_data_process(edev, to_scsi_device(edev->edev.parent), 0); |
589 | 589 | ||
590 | if (is_sas_attached(sdev)) | 590 | if (scsi_is_sas_rphy(&sdev->sdev_gendev)) |
591 | efd.addr = sas_get_address(sdev); | 591 | efd.addr = sas_get_address(sdev); |
592 | 592 | ||
593 | if (efd.addr) { | 593 | if (efd.addr) { |
diff --git a/drivers/scsi/wd719x.c b/drivers/scsi/wd719x.c index e3da1a2fdb66..2a9da2e0ea6b 100644 --- a/drivers/scsi/wd719x.c +++ b/drivers/scsi/wd719x.c | |||
@@ -962,7 +962,7 @@ static void wd719x_pci_remove(struct pci_dev *pdev) | |||
962 | scsi_host_put(sh); | 962 | scsi_host_put(sh); |
963 | } | 963 | } |
964 | 964 | ||
965 | static DEFINE_PCI_DEVICE_TABLE(wd719x_pci_table) = { | 965 | static const struct pci_device_id wd719x_pci_table[] = { |
966 | { PCI_DEVICE(PCI_VENDOR_ID_WD, 0x3296) }, | 966 | { PCI_DEVICE(PCI_VENDOR_ID_WD, 0x3296) }, |
967 | {} | 967 | {} |
968 | }; | 968 | }; |
diff --git a/drivers/spi/spi-img-spfi.c b/drivers/spi/spi-img-spfi.c index 823cbc92d1e7..7a37090dabbe 100644 --- a/drivers/spi/spi-img-spfi.c +++ b/drivers/spi/spi-img-spfi.c | |||
@@ -720,8 +720,6 @@ static int img_spfi_remove(struct platform_device *pdev) | |||
720 | clk_disable_unprepare(spfi->sys_clk); | 720 | clk_disable_unprepare(spfi->sys_clk); |
721 | } | 721 | } |
722 | 722 | ||
723 | spi_master_put(master); | ||
724 | |||
725 | return 0; | 723 | return 0; |
726 | } | 724 | } |
727 | 725 | ||
diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c index 0be89e052428..899d7a8f0889 100644 --- a/drivers/spi/spi-mt65xx.c +++ b/drivers/spi/spi-mt65xx.c | |||
@@ -685,7 +685,6 @@ static int mtk_spi_remove(struct platform_device *pdev) | |||
685 | pm_runtime_disable(&pdev->dev); | 685 | pm_runtime_disable(&pdev->dev); |
686 | 686 | ||
687 | mtk_spi_reset(mdata); | 687 | mtk_spi_reset(mdata); |
688 | spi_master_put(master); | ||
689 | 688 | ||
690 | return 0; | 689 | return 0; |
691 | } | 690 | } |
diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c index f3df522db93b..58d2d48e16a5 100644 --- a/drivers/spi/spi-pxa2xx-pci.c +++ b/drivers/spi/spi-pxa2xx-pci.c | |||
@@ -214,6 +214,7 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev, | |||
214 | return PTR_ERR(ssp->clk); | 214 | return PTR_ERR(ssp->clk); |
215 | 215 | ||
216 | memset(&pi, 0, sizeof(pi)); | 216 | memset(&pi, 0, sizeof(pi)); |
217 | pi.fwnode = dev->dev.fwnode; | ||
217 | pi.parent = &dev->dev; | 218 | pi.parent = &dev->dev; |
218 | pi.name = "pxa2xx-spi"; | 219 | pi.name = "pxa2xx-spi"; |
219 | pi.id = ssp->port_id; | 220 | pi.id = ssp->port_id; |
diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c index c338ef1136f6..7f1555621f8e 100644 --- a/drivers/spi/spi-qup.c +++ b/drivers/spi/spi-qup.c | |||
@@ -1030,7 +1030,6 @@ static int spi_qup_remove(struct platform_device *pdev) | |||
1030 | 1030 | ||
1031 | pm_runtime_put_noidle(&pdev->dev); | 1031 | pm_runtime_put_noidle(&pdev->dev); |
1032 | pm_runtime_disable(&pdev->dev); | 1032 | pm_runtime_disable(&pdev->dev); |
1033 | spi_master_put(master); | ||
1034 | 1033 | ||
1035 | return 0; | 1034 | return 0; |
1036 | } | 1035 | } |
diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c index 0f83ad1d5a58..1de3a772eb7d 100644 --- a/drivers/spi/spi-sh-msiof.c +++ b/drivers/spi/spi-sh-msiof.c | |||
@@ -262,6 +262,9 @@ static void sh_msiof_spi_set_clk_regs(struct sh_msiof_spi_priv *p, | |||
262 | 262 | ||
263 | for (k = 0; k < ARRAY_SIZE(sh_msiof_spi_div_table); k++) { | 263 | for (k = 0; k < ARRAY_SIZE(sh_msiof_spi_div_table); k++) { |
264 | brps = DIV_ROUND_UP(div, sh_msiof_spi_div_table[k].div); | 264 | brps = DIV_ROUND_UP(div, sh_msiof_spi_div_table[k].div); |
265 | /* SCR_BRDV_DIV_1 is valid only if BRPS is x 1/1 or x 1/2 */ | ||
266 | if (sh_msiof_spi_div_table[k].div == 1 && brps > 2) | ||
267 | continue; | ||
265 | if (brps <= 32) /* max of brdv is 32 */ | 268 | if (brps <= 32) /* max of brdv is 32 */ |
266 | break; | 269 | break; |
267 | } | 270 | } |
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 51ad42fad567..200ca228d885 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -960,7 +960,7 @@ static int spi_transfer_one_message(struct spi_master *master, | |||
960 | struct spi_transfer *xfer; | 960 | struct spi_transfer *xfer; |
961 | bool keep_cs = false; | 961 | bool keep_cs = false; |
962 | int ret = 0; | 962 | int ret = 0; |
963 | unsigned long ms = 1; | 963 | unsigned long long ms = 1; |
964 | struct spi_statistics *statm = &master->statistics; | 964 | struct spi_statistics *statm = &master->statistics; |
965 | struct spi_statistics *stats = &msg->spi->statistics; | 965 | struct spi_statistics *stats = &msg->spi->statistics; |
966 | 966 | ||
@@ -991,9 +991,13 @@ static int spi_transfer_one_message(struct spi_master *master, | |||
991 | 991 | ||
992 | if (ret > 0) { | 992 | if (ret > 0) { |
993 | ret = 0; | 993 | ret = 0; |
994 | ms = xfer->len * 8 * 1000 / xfer->speed_hz; | 994 | ms = 8LL * 1000LL * xfer->len; |
995 | do_div(ms, xfer->speed_hz); | ||
995 | ms += ms + 100; /* some tolerance */ | 996 | ms += ms + 100; /* some tolerance */ |
996 | 997 | ||
998 | if (ms > UINT_MAX) | ||
999 | ms = UINT_MAX; | ||
1000 | |||
997 | ms = wait_for_completion_timeout(&master->xfer_completion, | 1001 | ms = wait_for_completion_timeout(&master->xfer_completion, |
998 | msecs_to_jiffies(ms)); | 1002 | msecs_to_jiffies(ms)); |
999 | } | 1003 | } |
@@ -1159,6 +1163,7 @@ static void __spi_pump_messages(struct spi_master *master, bool in_kthread) | |||
1159 | if (ret < 0) { | 1163 | if (ret < 0) { |
1160 | dev_err(&master->dev, "Failed to power device: %d\n", | 1164 | dev_err(&master->dev, "Failed to power device: %d\n", |
1161 | ret); | 1165 | ret); |
1166 | mutex_unlock(&master->io_mutex); | ||
1162 | return; | 1167 | return; |
1163 | } | 1168 | } |
1164 | } | 1169 | } |
@@ -1174,6 +1179,7 @@ static void __spi_pump_messages(struct spi_master *master, bool in_kthread) | |||
1174 | 1179 | ||
1175 | if (master->auto_runtime_pm) | 1180 | if (master->auto_runtime_pm) |
1176 | pm_runtime_put(master->dev.parent); | 1181 | pm_runtime_put(master->dev.parent); |
1182 | mutex_unlock(&master->io_mutex); | ||
1177 | return; | 1183 | return; |
1178 | } | 1184 | } |
1179 | } | 1185 | } |
diff --git a/drivers/staging/comedi/drivers/adv_pci1760.c b/drivers/staging/comedi/drivers/adv_pci1760.c index d7dd1e55e347..9f525ff7290c 100644 --- a/drivers/staging/comedi/drivers/adv_pci1760.c +++ b/drivers/staging/comedi/drivers/adv_pci1760.c | |||
@@ -196,6 +196,7 @@ static int pci1760_pwm_ns_to_div(unsigned int flags, unsigned int ns) | |||
196 | break; | 196 | break; |
197 | case CMDF_ROUND_DOWN: | 197 | case CMDF_ROUND_DOWN: |
198 | divisor = ns / PCI1760_PWM_TIMEBASE; | 198 | divisor = ns / PCI1760_PWM_TIMEBASE; |
199 | break; | ||
199 | default: | 200 | default: |
200 | return -EINVAL; | 201 | return -EINVAL; |
201 | } | 202 | } |
diff --git a/drivers/staging/comedi/drivers/comedi_test.c b/drivers/staging/comedi/drivers/comedi_test.c index 4ab186669f0c..ec5b9a23494d 100644 --- a/drivers/staging/comedi/drivers/comedi_test.c +++ b/drivers/staging/comedi/drivers/comedi_test.c | |||
@@ -56,11 +56,6 @@ | |||
56 | 56 | ||
57 | #define N_CHANS 8 | 57 | #define N_CHANS 8 |
58 | 58 | ||
59 | enum waveform_state_bits { | ||
60 | WAVEFORM_AI_RUNNING, | ||
61 | WAVEFORM_AO_RUNNING | ||
62 | }; | ||
63 | |||
64 | /* Data unique to this driver */ | 59 | /* Data unique to this driver */ |
65 | struct waveform_private { | 60 | struct waveform_private { |
66 | struct timer_list ai_timer; /* timer for AI commands */ | 61 | struct timer_list ai_timer; /* timer for AI commands */ |
@@ -68,7 +63,6 @@ struct waveform_private { | |||
68 | unsigned int wf_amplitude; /* waveform amplitude in microvolts */ | 63 | unsigned int wf_amplitude; /* waveform amplitude in microvolts */ |
69 | unsigned int wf_period; /* waveform period in microseconds */ | 64 | unsigned int wf_period; /* waveform period in microseconds */ |
70 | unsigned int wf_current; /* current time in waveform period */ | 65 | unsigned int wf_current; /* current time in waveform period */ |
71 | unsigned long state_bits; | ||
72 | unsigned int ai_scan_period; /* AI scan period in usec */ | 66 | unsigned int ai_scan_period; /* AI scan period in usec */ |
73 | unsigned int ai_convert_period; /* AI conversion period in usec */ | 67 | unsigned int ai_convert_period; /* AI conversion period in usec */ |
74 | struct timer_list ao_timer; /* timer for AO commands */ | 68 | struct timer_list ao_timer; /* timer for AO commands */ |
@@ -191,10 +185,6 @@ static void waveform_ai_timer(unsigned long arg) | |||
191 | unsigned int nsamples; | 185 | unsigned int nsamples; |
192 | unsigned int time_increment; | 186 | unsigned int time_increment; |
193 | 187 | ||
194 | /* check command is still active */ | ||
195 | if (!test_bit(WAVEFORM_AI_RUNNING, &devpriv->state_bits)) | ||
196 | return; | ||
197 | |||
198 | now = ktime_to_us(ktime_get()); | 188 | now = ktime_to_us(ktime_get()); |
199 | nsamples = comedi_nsamples_left(s, UINT_MAX); | 189 | nsamples = comedi_nsamples_left(s, UINT_MAX); |
200 | 190 | ||
@@ -386,11 +376,6 @@ static int waveform_ai_cmd(struct comedi_device *dev, | |||
386 | */ | 376 | */ |
387 | devpriv->ai_timer.expires = | 377 | devpriv->ai_timer.expires = |
388 | jiffies + usecs_to_jiffies(devpriv->ai_convert_period) + 1; | 378 | jiffies + usecs_to_jiffies(devpriv->ai_convert_period) + 1; |
389 | |||
390 | /* mark command as active */ | ||
391 | smp_mb__before_atomic(); | ||
392 | set_bit(WAVEFORM_AI_RUNNING, &devpriv->state_bits); | ||
393 | smp_mb__after_atomic(); | ||
394 | add_timer(&devpriv->ai_timer); | 379 | add_timer(&devpriv->ai_timer); |
395 | return 0; | 380 | return 0; |
396 | } | 381 | } |
@@ -400,11 +385,12 @@ static int waveform_ai_cancel(struct comedi_device *dev, | |||
400 | { | 385 | { |
401 | struct waveform_private *devpriv = dev->private; | 386 | struct waveform_private *devpriv = dev->private; |
402 | 387 | ||
403 | /* mark command as no longer active */ | 388 | if (in_softirq()) { |
404 | clear_bit(WAVEFORM_AI_RUNNING, &devpriv->state_bits); | 389 | /* Assume we were called from the timer routine itself. */ |
405 | smp_mb__after_atomic(); | 390 | del_timer(&devpriv->ai_timer); |
406 | /* cannot call del_timer_sync() as may be called from timer routine */ | 391 | } else { |
407 | del_timer(&devpriv->ai_timer); | 392 | del_timer_sync(&devpriv->ai_timer); |
393 | } | ||
408 | return 0; | 394 | return 0; |
409 | } | 395 | } |
410 | 396 | ||
@@ -436,10 +422,6 @@ static void waveform_ao_timer(unsigned long arg) | |||
436 | u64 scans_since; | 422 | u64 scans_since; |
437 | unsigned int scans_avail = 0; | 423 | unsigned int scans_avail = 0; |
438 | 424 | ||
439 | /* check command is still active */ | ||
440 | if (!test_bit(WAVEFORM_AO_RUNNING, &devpriv->state_bits)) | ||
441 | return; | ||
442 | |||
443 | /* determine number of scan periods since last time */ | 425 | /* determine number of scan periods since last time */ |
444 | now = ktime_to_us(ktime_get()); | 426 | now = ktime_to_us(ktime_get()); |
445 | scans_since = now - devpriv->ao_last_scan_time; | 427 | scans_since = now - devpriv->ao_last_scan_time; |
@@ -518,11 +500,6 @@ static int waveform_ao_inttrig_start(struct comedi_device *dev, | |||
518 | devpriv->ao_last_scan_time = ktime_to_us(ktime_get()); | 500 | devpriv->ao_last_scan_time = ktime_to_us(ktime_get()); |
519 | devpriv->ao_timer.expires = | 501 | devpriv->ao_timer.expires = |
520 | jiffies + usecs_to_jiffies(devpriv->ao_scan_period); | 502 | jiffies + usecs_to_jiffies(devpriv->ao_scan_period); |
521 | |||
522 | /* mark command as active */ | ||
523 | smp_mb__before_atomic(); | ||
524 | set_bit(WAVEFORM_AO_RUNNING, &devpriv->state_bits); | ||
525 | smp_mb__after_atomic(); | ||
526 | add_timer(&devpriv->ao_timer); | 503 | add_timer(&devpriv->ao_timer); |
527 | 504 | ||
528 | return 1; | 505 | return 1; |
@@ -608,11 +585,12 @@ static int waveform_ao_cancel(struct comedi_device *dev, | |||
608 | struct waveform_private *devpriv = dev->private; | 585 | struct waveform_private *devpriv = dev->private; |
609 | 586 | ||
610 | s->async->inttrig = NULL; | 587 | s->async->inttrig = NULL; |
611 | /* mark command as no longer active */ | 588 | if (in_softirq()) { |
612 | clear_bit(WAVEFORM_AO_RUNNING, &devpriv->state_bits); | 589 | /* Assume we were called from the timer routine itself. */ |
613 | smp_mb__after_atomic(); | 590 | del_timer(&devpriv->ao_timer); |
614 | /* cannot call del_timer_sync() as may be called from timer routine */ | 591 | } else { |
615 | del_timer(&devpriv->ao_timer); | 592 | del_timer_sync(&devpriv->ao_timer); |
593 | } | ||
616 | return 0; | 594 | return 0; |
617 | } | 595 | } |
618 | 596 | ||
diff --git a/drivers/staging/comedi/drivers/daqboard2000.c b/drivers/staging/comedi/drivers/daqboard2000.c index 65daef0c00d5..0f4eb954aa80 100644 --- a/drivers/staging/comedi/drivers/daqboard2000.c +++ b/drivers/staging/comedi/drivers/daqboard2000.c | |||
@@ -634,7 +634,7 @@ static const void *daqboard2000_find_boardinfo(struct comedi_device *dev, | |||
634 | const struct daq200_boardtype *board; | 634 | const struct daq200_boardtype *board; |
635 | int i; | 635 | int i; |
636 | 636 | ||
637 | if (pcidev->subsystem_device != PCI_VENDOR_ID_IOTECH) | 637 | if (pcidev->subsystem_vendor != PCI_VENDOR_ID_IOTECH) |
638 | return NULL; | 638 | return NULL; |
639 | 639 | ||
640 | for (i = 0; i < ARRAY_SIZE(boardtypes); i++) { | 640 | for (i = 0; i < ARRAY_SIZE(boardtypes); i++) { |
diff --git a/drivers/staging/comedi/drivers/dt2811.c b/drivers/staging/comedi/drivers/dt2811.c index 904f637797b6..8bbd93814340 100644 --- a/drivers/staging/comedi/drivers/dt2811.c +++ b/drivers/staging/comedi/drivers/dt2811.c | |||
@@ -588,8 +588,8 @@ static int dt2811_attach(struct comedi_device *dev, struct comedi_devconfig *it) | |||
588 | s = &dev->subdevices[0]; | 588 | s = &dev->subdevices[0]; |
589 | s->type = COMEDI_SUBD_AI; | 589 | s->type = COMEDI_SUBD_AI; |
590 | s->subdev_flags = SDF_READABLE | | 590 | s->subdev_flags = SDF_READABLE | |
591 | (it->options[2] == 1) ? SDF_DIFF : | 591 | ((it->options[2] == 1) ? SDF_DIFF : |
592 | (it->options[2] == 2) ? SDF_COMMON : SDF_GROUND; | 592 | (it->options[2] == 2) ? SDF_COMMON : SDF_GROUND); |
593 | s->n_chan = (it->options[2] == 1) ? 8 : 16; | 593 | s->n_chan = (it->options[2] == 1) ? 8 : 16; |
594 | s->maxdata = 0x0fff; | 594 | s->maxdata = 0x0fff; |
595 | s->range_table = board->is_pgh ? &dt2811_pgh_ai_ranges | 595 | s->range_table = board->is_pgh ? &dt2811_pgh_ai_ranges |
diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c index 8dabb19519a5..0f97d7b611d7 100644 --- a/drivers/staging/comedi/drivers/ni_mio_common.c +++ b/drivers/staging/comedi/drivers/ni_mio_common.c | |||
@@ -2772,7 +2772,15 @@ static int ni_ao_inttrig(struct comedi_device *dev, | |||
2772 | int i; | 2772 | int i; |
2773 | static const int timeout = 1000; | 2773 | static const int timeout = 1000; |
2774 | 2774 | ||
2775 | if (trig_num != cmd->start_arg) | 2775 | /* |
2776 | * Require trig_num == cmd->start_arg when cmd->start_src == TRIG_INT. | ||
2777 | * For backwards compatibility, also allow trig_num == 0 when | ||
2778 | * cmd->start_src != TRIG_INT (i.e. when cmd->start_src == TRIG_EXT); | ||
2779 | * in that case, the internal trigger is being used as a pre-trigger | ||
2780 | * before the external trigger. | ||
2781 | */ | ||
2782 | if (!(trig_num == cmd->start_arg || | ||
2783 | (trig_num == 0 && cmd->start_src != TRIG_INT))) | ||
2776 | return -EINVAL; | 2784 | return -EINVAL; |
2777 | 2785 | ||
2778 | /* | 2786 | /* |
@@ -5480,7 +5488,7 @@ static int ni_E_init(struct comedi_device *dev, | |||
5480 | s->maxdata = (devpriv->is_m_series) ? 0xffffffff | 5488 | s->maxdata = (devpriv->is_m_series) ? 0xffffffff |
5481 | : 0x00ffffff; | 5489 | : 0x00ffffff; |
5482 | s->insn_read = ni_tio_insn_read; | 5490 | s->insn_read = ni_tio_insn_read; |
5483 | s->insn_write = ni_tio_insn_read; | 5491 | s->insn_write = ni_tio_insn_write; |
5484 | s->insn_config = ni_tio_insn_config; | 5492 | s->insn_config = ni_tio_insn_config; |
5485 | #ifdef PCIDMA | 5493 | #ifdef PCIDMA |
5486 | if (dev->irq && devpriv->mite) { | 5494 | if (dev->irq && devpriv->mite) { |
diff --git a/drivers/staging/fsl-mc/bus/mc-msi.c b/drivers/staging/fsl-mc/bus/mc-msi.c index c7be156ae5e0..4fd8e41ef468 100644 --- a/drivers/staging/fsl-mc/bus/mc-msi.c +++ b/drivers/staging/fsl-mc/bus/mc-msi.c | |||
@@ -213,7 +213,7 @@ static int fsl_mc_msi_alloc_descs(struct device *dev, unsigned int irq_count) | |||
213 | struct msi_desc *msi_desc; | 213 | struct msi_desc *msi_desc; |
214 | 214 | ||
215 | for (i = 0; i < irq_count; i++) { | 215 | for (i = 0; i < irq_count; i++) { |
216 | msi_desc = alloc_msi_entry(dev); | 216 | msi_desc = alloc_msi_entry(dev, 1, NULL); |
217 | if (!msi_desc) { | 217 | if (!msi_desc) { |
218 | dev_err(dev, "Failed to allocate msi entry\n"); | 218 | dev_err(dev, "Failed to allocate msi entry\n"); |
219 | error = -ENOMEM; | 219 | error = -ENOMEM; |
@@ -221,7 +221,6 @@ static int fsl_mc_msi_alloc_descs(struct device *dev, unsigned int irq_count) | |||
221 | } | 221 | } |
222 | 222 | ||
223 | msi_desc->fsl_mc.msi_index = i; | 223 | msi_desc->fsl_mc.msi_index = i; |
224 | msi_desc->nvec_used = 1; | ||
225 | INIT_LIST_HEAD(&msi_desc->list); | 224 | INIT_LIST_HEAD(&msi_desc->list); |
226 | list_add_tail(&msi_desc->list, dev_to_msi_list(dev)); | 225 | list_add_tail(&msi_desc->list, dev_to_msi_list(dev)); |
227 | } | 226 | } |
diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c index 170ac980abcb..24c348d2f5bb 100644 --- a/drivers/staging/iio/impedance-analyzer/ad5933.c +++ b/drivers/staging/iio/impedance-analyzer/ad5933.c | |||
@@ -419,6 +419,7 @@ static ssize_t ad5933_store(struct device *dev, | |||
419 | mutex_lock(&indio_dev->mlock); | 419 | mutex_lock(&indio_dev->mlock); |
420 | switch ((u32)this_attr->address) { | 420 | switch ((u32)this_attr->address) { |
421 | case AD5933_OUT_RANGE: | 421 | case AD5933_OUT_RANGE: |
422 | ret = -EINVAL; | ||
422 | for (i = 0; i < 4; i++) | 423 | for (i = 0; i < 4; i++) |
423 | if (val == st->range_avail[i]) { | 424 | if (val == st->range_avail[i]) { |
424 | st->ctrl_hb &= ~AD5933_CTRL_RANGE(0x3); | 425 | st->ctrl_hb &= ~AD5933_CTRL_RANGE(0x3); |
@@ -426,7 +427,6 @@ static ssize_t ad5933_store(struct device *dev, | |||
426 | ret = ad5933_cmd(st, 0); | 427 | ret = ad5933_cmd(st, 0); |
427 | break; | 428 | break; |
428 | } | 429 | } |
429 | ret = -EINVAL; | ||
430 | break; | 430 | break; |
431 | case AD5933_IN_PGA_GAIN: | 431 | case AD5933_IN_PGA_GAIN: |
432 | if (sysfs_streq(buf, "1")) { | 432 | if (sysfs_streq(buf, "1")) { |
diff --git a/drivers/staging/lustre/lustre/llite/namei.c b/drivers/staging/lustre/lustre/llite/namei.c index 3664bfd0178b..2c4dc69731e8 100644 --- a/drivers/staging/lustre/lustre/llite/namei.c +++ b/drivers/staging/lustre/lustre/llite/namei.c | |||
@@ -388,6 +388,7 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request, | |||
388 | struct inode *inode = NULL; | 388 | struct inode *inode = NULL; |
389 | __u64 bits = 0; | 389 | __u64 bits = 0; |
390 | int rc = 0; | 390 | int rc = 0; |
391 | struct dentry *alias; | ||
391 | 392 | ||
392 | /* NB 1 request reference will be taken away by ll_intent_lock() | 393 | /* NB 1 request reference will be taken away by ll_intent_lock() |
393 | * when I return | 394 | * when I return |
@@ -412,26 +413,12 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request, | |||
412 | */ | 413 | */ |
413 | } | 414 | } |
414 | 415 | ||
415 | /* Only hash *de if it is unhashed (new dentry). | 416 | alias = ll_splice_alias(inode, *de); |
416 | * Atoimc_open may passing hashed dentries for open. | 417 | if (IS_ERR(alias)) { |
417 | */ | 418 | rc = PTR_ERR(alias); |
418 | if (d_unhashed(*de)) { | 419 | goto out; |
419 | struct dentry *alias; | ||
420 | |||
421 | alias = ll_splice_alias(inode, *de); | ||
422 | if (IS_ERR(alias)) { | ||
423 | rc = PTR_ERR(alias); | ||
424 | goto out; | ||
425 | } | ||
426 | *de = alias; | ||
427 | } else if (!it_disposition(it, DISP_LOOKUP_NEG) && | ||
428 | !it_disposition(it, DISP_OPEN_CREATE)) { | ||
429 | /* With DISP_OPEN_CREATE dentry will be | ||
430 | * instantiated in ll_create_it. | ||
431 | */ | ||
432 | LASSERT(!d_inode(*de)); | ||
433 | d_instantiate(*de, inode); | ||
434 | } | 420 | } |
421 | *de = alias; | ||
435 | 422 | ||
436 | if (!it_disposition(it, DISP_LOOKUP_NEG)) { | 423 | if (!it_disposition(it, DISP_LOOKUP_NEG)) { |
437 | /* we have lookup look - unhide dentry */ | 424 | /* we have lookup look - unhide dentry */ |
@@ -587,6 +574,24 @@ static int ll_atomic_open(struct inode *dir, struct dentry *dentry, | |||
587 | dentry, PFID(ll_inode2fid(dir)), dir, file, open_flags, mode, | 574 | dentry, PFID(ll_inode2fid(dir)), dir, file, open_flags, mode, |
588 | *opened); | 575 | *opened); |
589 | 576 | ||
577 | /* Only negative dentries enter here */ | ||
578 | LASSERT(!d_inode(dentry)); | ||
579 | |||
580 | if (!d_in_lookup(dentry)) { | ||
581 | /* A valid negative dentry that just passed revalidation, | ||
582 | * there's little point to try and open it server-side, | ||
583 | * even though there's a minuscle chance it might succeed. | ||
584 | * Either way it's a valid race to just return -ENOENT here. | ||
585 | */ | ||
586 | if (!(open_flags & O_CREAT)) | ||
587 | return -ENOENT; | ||
588 | |||
589 | /* Otherwise we just unhash it to be rehashed afresh via | ||
590 | * lookup if necessary | ||
591 | */ | ||
592 | d_drop(dentry); | ||
593 | } | ||
594 | |||
590 | it = kzalloc(sizeof(*it), GFP_NOFS); | 595 | it = kzalloc(sizeof(*it), GFP_NOFS); |
591 | if (!it) | 596 | if (!it) |
592 | return -ENOMEM; | 597 | return -ENOMEM; |
diff --git a/drivers/staging/wilc1000/host_interface.c b/drivers/staging/wilc1000/host_interface.c index 0b1760cba6e3..78f524fcd214 100644 --- a/drivers/staging/wilc1000/host_interface.c +++ b/drivers/staging/wilc1000/host_interface.c | |||
@@ -3363,7 +3363,7 @@ int wilc_init(struct net_device *dev, struct host_if_drv **hif_drv_handler) | |||
3363 | if (!hif_workqueue) { | 3363 | if (!hif_workqueue) { |
3364 | netdev_err(vif->ndev, "Failed to create workqueue\n"); | 3364 | netdev_err(vif->ndev, "Failed to create workqueue\n"); |
3365 | result = -ENOMEM; | 3365 | result = -ENOMEM; |
3366 | goto _fail_mq_; | 3366 | goto _fail_; |
3367 | } | 3367 | } |
3368 | 3368 | ||
3369 | setup_timer(&periodic_rssi, GetPeriodicRSSI, | 3369 | setup_timer(&periodic_rssi, GetPeriodicRSSI, |
@@ -3391,7 +3391,6 @@ int wilc_init(struct net_device *dev, struct host_if_drv **hif_drv_handler) | |||
3391 | 3391 | ||
3392 | clients_count++; | 3392 | clients_count++; |
3393 | 3393 | ||
3394 | _fail_mq_: | ||
3395 | destroy_workqueue(hif_workqueue); | 3394 | destroy_workqueue(hif_workqueue); |
3396 | _fail_: | 3395 | _fail_: |
3397 | return result; | 3396 | return result; |
diff --git a/drivers/staging/wilc1000/linux_wlan.c b/drivers/staging/wilc1000/linux_wlan.c index 3a66255f14fc..32215110d597 100644 --- a/drivers/staging/wilc1000/linux_wlan.c +++ b/drivers/staging/wilc1000/linux_wlan.c | |||
@@ -648,7 +648,7 @@ void wilc1000_wlan_deinit(struct net_device *dev) | |||
648 | mutex_unlock(&wl->hif_cs); | 648 | mutex_unlock(&wl->hif_cs); |
649 | } | 649 | } |
650 | if (&wl->txq_event) | 650 | if (&wl->txq_event) |
651 | wait_for_completion(&wl->txq_event); | 651 | complete(&wl->txq_event); |
652 | 652 | ||
653 | wlan_deinitialize_threads(dev); | 653 | wlan_deinitialize_threads(dev); |
654 | deinit_irq(dev); | 654 | deinit_irq(dev); |
diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c index 9092600a1794..2c2e8aca8305 100644 --- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c +++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | |||
@@ -1191,7 +1191,7 @@ static int get_station(struct wiphy *wiphy, struct net_device *dev, | |||
1191 | struct wilc_priv *priv; | 1191 | struct wilc_priv *priv; |
1192 | struct wilc_vif *vif; | 1192 | struct wilc_vif *vif; |
1193 | u32 i = 0; | 1193 | u32 i = 0; |
1194 | u32 associatedsta = 0; | 1194 | u32 associatedsta = ~0; |
1195 | u32 inactive_time = 0; | 1195 | u32 inactive_time = 0; |
1196 | priv = wiphy_priv(wiphy); | 1196 | priv = wiphy_priv(wiphy); |
1197 | vif = netdev_priv(dev); | 1197 | vif = netdev_priv(dev); |
@@ -1204,7 +1204,7 @@ static int get_station(struct wiphy *wiphy, struct net_device *dev, | |||
1204 | } | 1204 | } |
1205 | } | 1205 | } |
1206 | 1206 | ||
1207 | if (associatedsta == -1) { | 1207 | if (associatedsta == ~0) { |
1208 | netdev_err(dev, "sta required is not associated\n"); | 1208 | netdev_err(dev, "sta required is not associated\n"); |
1209 | return -ENOENT; | 1209 | return -ENOENT; |
1210 | } | 1210 | } |
diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c index 71a339271fa5..5f817923f374 100644 --- a/drivers/thermal/rcar_thermal.c +++ b/drivers/thermal/rcar_thermal.c | |||
@@ -504,6 +504,7 @@ static int rcar_thermal_probe(struct platform_device *pdev) | |||
504 | if (IS_ERR(priv->zone)) { | 504 | if (IS_ERR(priv->zone)) { |
505 | dev_err(dev, "can't register thermal zone\n"); | 505 | dev_err(dev, "can't register thermal zone\n"); |
506 | ret = PTR_ERR(priv->zone); | 506 | ret = PTR_ERR(priv->zone); |
507 | priv->zone = NULL; | ||
507 | goto error_unregister; | 508 | goto error_unregister; |
508 | } | 509 | } |
509 | 510 | ||
diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c index 9c15344b657a..a8c20413dbda 100644 --- a/drivers/thunderbolt/nhi.c +++ b/drivers/thunderbolt/nhi.c | |||
@@ -651,6 +651,12 @@ static struct pci_device_id nhi_ids[] = { | |||
651 | { | 651 | { |
652 | .class = PCI_CLASS_SYSTEM_OTHER << 8, .class_mask = ~0, | 652 | .class = PCI_CLASS_SYSTEM_OTHER << 8, .class_mask = ~0, |
653 | .vendor = PCI_VENDOR_ID_INTEL, | 653 | .vendor = PCI_VENDOR_ID_INTEL, |
654 | .device = PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_NHI, | ||
655 | .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, | ||
656 | }, | ||
657 | { | ||
658 | .class = PCI_CLASS_SYSTEM_OTHER << 8, .class_mask = ~0, | ||
659 | .vendor = PCI_VENDOR_ID_INTEL, | ||
654 | .device = PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_NHI, | 660 | .device = PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_NHI, |
655 | .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, | 661 | .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, |
656 | }, | 662 | }, |
diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c index 1e116f53d6dd..9840fdecb73b 100644 --- a/drivers/thunderbolt/switch.c +++ b/drivers/thunderbolt/switch.c | |||
@@ -372,7 +372,9 @@ struct tb_switch *tb_switch_alloc(struct tb *tb, u64 route) | |||
372 | 372 | ||
373 | if (sw->config.device_id != PCI_DEVICE_ID_INTEL_LIGHT_RIDGE && | 373 | if (sw->config.device_id != PCI_DEVICE_ID_INTEL_LIGHT_RIDGE && |
374 | sw->config.device_id != PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C && | 374 | sw->config.device_id != PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C && |
375 | sw->config.device_id != PCI_DEVICE_ID_INTEL_PORT_RIDGE) | 375 | sw->config.device_id != PCI_DEVICE_ID_INTEL_PORT_RIDGE && |
376 | sw->config.device_id != PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_BRIDGE && | ||
377 | sw->config.device_id != PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_BRIDGE) | ||
376 | tb_sw_warn(sw, "unsupported switch device id %#x\n", | 378 | tb_sw_warn(sw, "unsupported switch device id %#x\n", |
377 | sw->config.device_id); | 379 | sw->config.device_id); |
378 | 380 | ||
diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h index 122e0e4029fe..1a16feac9a36 100644 --- a/drivers/tty/serial/8250/8250.h +++ b/drivers/tty/serial/8250/8250.h | |||
@@ -15,8 +15,6 @@ | |||
15 | #include <linux/serial_reg.h> | 15 | #include <linux/serial_reg.h> |
16 | #include <linux/dmaengine.h> | 16 | #include <linux/dmaengine.h> |
17 | 17 | ||
18 | #include "../serial_mctrl_gpio.h" | ||
19 | |||
20 | struct uart_8250_dma { | 18 | struct uart_8250_dma { |
21 | int (*tx_dma)(struct uart_8250_port *p); | 19 | int (*tx_dma)(struct uart_8250_port *p); |
22 | int (*rx_dma)(struct uart_8250_port *p); | 20 | int (*rx_dma)(struct uart_8250_port *p); |
@@ -133,43 +131,12 @@ void serial8250_em485_destroy(struct uart_8250_port *p); | |||
133 | 131 | ||
134 | static inline void serial8250_out_MCR(struct uart_8250_port *up, int value) | 132 | static inline void serial8250_out_MCR(struct uart_8250_port *up, int value) |
135 | { | 133 | { |
136 | int mctrl_gpio = 0; | ||
137 | |||
138 | serial_out(up, UART_MCR, value); | 134 | serial_out(up, UART_MCR, value); |
139 | |||
140 | if (value & UART_MCR_RTS) | ||
141 | mctrl_gpio |= TIOCM_RTS; | ||
142 | if (value & UART_MCR_DTR) | ||
143 | mctrl_gpio |= TIOCM_DTR; | ||
144 | |||
145 | mctrl_gpio_set(up->gpios, mctrl_gpio); | ||
146 | } | 135 | } |
147 | 136 | ||
148 | static inline int serial8250_in_MCR(struct uart_8250_port *up) | 137 | static inline int serial8250_in_MCR(struct uart_8250_port *up) |
149 | { | 138 | { |
150 | int mctrl, mctrl_gpio = 0; | 139 | return serial_in(up, UART_MCR); |
151 | |||
152 | mctrl = serial_in(up, UART_MCR); | ||
153 | |||
154 | /* save current MCR values */ | ||
155 | if (mctrl & UART_MCR_RTS) | ||
156 | mctrl_gpio |= TIOCM_RTS; | ||
157 | if (mctrl & UART_MCR_DTR) | ||
158 | mctrl_gpio |= TIOCM_DTR; | ||
159 | |||
160 | mctrl_gpio = mctrl_gpio_get_outputs(up->gpios, &mctrl_gpio); | ||
161 | |||
162 | if (mctrl_gpio & TIOCM_RTS) | ||
163 | mctrl |= UART_MCR_RTS; | ||
164 | else | ||
165 | mctrl &= ~UART_MCR_RTS; | ||
166 | |||
167 | if (mctrl_gpio & TIOCM_DTR) | ||
168 | mctrl |= UART_MCR_DTR; | ||
169 | else | ||
170 | mctrl &= ~UART_MCR_DTR; | ||
171 | |||
172 | return mctrl; | ||
173 | } | 140 | } |
174 | 141 | ||
175 | #if defined(__alpha__) && !defined(CONFIG_PCI) | 142 | #if defined(__alpha__) && !defined(CONFIG_PCI) |
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index 13ad5c3d2e68..dcf43f66404f 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c | |||
@@ -974,8 +974,6 @@ int serial8250_register_8250_port(struct uart_8250_port *up) | |||
974 | 974 | ||
975 | uart = serial8250_find_match_or_unused(&up->port); | 975 | uart = serial8250_find_match_or_unused(&up->port); |
976 | if (uart && uart->port.type != PORT_8250_CIR) { | 976 | if (uart && uart->port.type != PORT_8250_CIR) { |
977 | struct mctrl_gpios *gpios; | ||
978 | |||
979 | if (uart->port.dev) | 977 | if (uart->port.dev) |
980 | uart_remove_one_port(&serial8250_reg, &uart->port); | 978 | uart_remove_one_port(&serial8250_reg, &uart->port); |
981 | 979 | ||
@@ -1013,13 +1011,6 @@ int serial8250_register_8250_port(struct uart_8250_port *up) | |||
1013 | if (up->port.flags & UPF_FIXED_TYPE) | 1011 | if (up->port.flags & UPF_FIXED_TYPE) |
1014 | uart->port.type = up->port.type; | 1012 | uart->port.type = up->port.type; |
1015 | 1013 | ||
1016 | gpios = mctrl_gpio_init(&uart->port, 0); | ||
1017 | if (IS_ERR(gpios)) { | ||
1018 | if (PTR_ERR(gpios) != -ENOSYS) | ||
1019 | return PTR_ERR(gpios); | ||
1020 | } else | ||
1021 | uart->gpios = gpios; | ||
1022 | |||
1023 | serial8250_set_defaults(uart); | 1014 | serial8250_set_defaults(uart); |
1024 | 1015 | ||
1025 | /* Possibly override default I/O functions. */ | 1016 | /* Possibly override default I/O functions. */ |
diff --git a/drivers/tty/serial/8250/8250_fintek.c b/drivers/tty/serial/8250/8250_fintek.c index 737b4b3957b0..0facc789fe7d 100644 --- a/drivers/tty/serial/8250/8250_fintek.c +++ b/drivers/tty/serial/8250/8250_fintek.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #define IO_ADDR2 0x60 | 31 | #define IO_ADDR2 0x60 |
32 | #define LDN 0x7 | 32 | #define LDN 0x7 |
33 | 33 | ||
34 | #define IRQ_MODE 0x70 | 34 | #define FINTEK_IRQ_MODE 0x70 |
35 | #define IRQ_SHARE BIT(4) | 35 | #define IRQ_SHARE BIT(4) |
36 | #define IRQ_MODE_MASK (BIT(6) | BIT(5)) | 36 | #define IRQ_MODE_MASK (BIT(6) | BIT(5)) |
37 | #define IRQ_LEVEL_LOW 0 | 37 | #define IRQ_LEVEL_LOW 0 |
@@ -195,7 +195,7 @@ static int fintek_8250_set_irq_mode(struct fintek_8250 *pdata, bool level_mode) | |||
195 | outb(LDN, pdata->base_port + ADDR_PORT); | 195 | outb(LDN, pdata->base_port + ADDR_PORT); |
196 | outb(pdata->index, pdata->base_port + DATA_PORT); | 196 | outb(pdata->index, pdata->base_port + DATA_PORT); |
197 | 197 | ||
198 | outb(IRQ_MODE, pdata->base_port + ADDR_PORT); | 198 | outb(FINTEK_IRQ_MODE, pdata->base_port + ADDR_PORT); |
199 | tmp = inb(pdata->base_port + DATA_PORT); | 199 | tmp = inb(pdata->base_port + DATA_PORT); |
200 | 200 | ||
201 | tmp &= ~IRQ_MODE_MASK; | 201 | tmp &= ~IRQ_MODE_MASK; |
diff --git a/drivers/tty/serial/8250/8250_mid.c b/drivers/tty/serial/8250/8250_mid.c index 339de9cd0866..20c5db2f4264 100644 --- a/drivers/tty/serial/8250/8250_mid.c +++ b/drivers/tty/serial/8250/8250_mid.c | |||
@@ -168,6 +168,9 @@ static void mid8250_set_termios(struct uart_port *p, | |||
168 | unsigned long w = BIT(24) - 1; | 168 | unsigned long w = BIT(24) - 1; |
169 | unsigned long mul, div; | 169 | unsigned long mul, div; |
170 | 170 | ||
171 | /* Gracefully handle the B0 case: fall back to B9600 */ | ||
172 | fuart = fuart ? fuart : 9600 * 16; | ||
173 | |||
171 | if (mid->board->freq < fuart) { | 174 | if (mid->board->freq < fuart) { |
172 | /* Find prescaler value that satisfies Fuart < Fref */ | 175 | /* Find prescaler value that satisfies Fuart < Fref */ |
173 | if (mid->board->freq > baud) | 176 | if (mid->board->freq > baud) |
diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c index e14982f36a04..61ad6c3b20a0 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c | |||
@@ -134,21 +134,18 @@ static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl) | |||
134 | 134 | ||
135 | serial8250_do_set_mctrl(port, mctrl); | 135 | serial8250_do_set_mctrl(port, mctrl); |
136 | 136 | ||
137 | if (IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(up->gpios, | 137 | /* |
138 | UART_GPIO_RTS))) { | 138 | * Turn off autoRTS if RTS is lowered and restore autoRTS setting |
139 | /* | 139 | * if RTS is raised |
140 | * Turn off autoRTS if RTS is lowered and restore autoRTS | 140 | */ |
141 | * setting if RTS is raised | 141 | lcr = serial_in(up, UART_LCR); |
142 | */ | 142 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); |
143 | lcr = serial_in(up, UART_LCR); | 143 | if ((mctrl & TIOCM_RTS) && (port->status & UPSTAT_AUTORTS)) |
144 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); | 144 | priv->efr |= UART_EFR_RTS; |
145 | if ((mctrl & TIOCM_RTS) && (port->status & UPSTAT_AUTORTS)) | 145 | else |
146 | priv->efr |= UART_EFR_RTS; | 146 | priv->efr &= ~UART_EFR_RTS; |
147 | else | 147 | serial_out(up, UART_EFR, priv->efr); |
148 | priv->efr &= ~UART_EFR_RTS; | 148 | serial_out(up, UART_LCR, lcr); |
149 | serial_out(up, UART_EFR, priv->efr); | ||
150 | serial_out(up, UART_LCR, lcr); | ||
151 | } | ||
152 | } | 149 | } |
153 | 150 | ||
154 | /* | 151 | /* |
@@ -449,9 +446,7 @@ static void omap_8250_set_termios(struct uart_port *port, | |||
449 | priv->efr = 0; | 446 | priv->efr = 0; |
450 | up->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS | UPSTAT_AUTOXOFF); | 447 | up->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS | UPSTAT_AUTOXOFF); |
451 | 448 | ||
452 | if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW | 449 | if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW) { |
453 | && IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(up->gpios, | ||
454 | UART_GPIO_RTS))) { | ||
455 | /* Enable AUTOCTS (autoRTS is enabled when RTS is raised) */ | 450 | /* Enable AUTOCTS (autoRTS is enabled when RTS is raised) */ |
456 | up->port.status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS; | 451 | up->port.status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS; |
457 | priv->efr |= UART_EFR_CTS; | 452 | priv->efr |= UART_EFR_CTS; |
diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c index 20ebaea5c414..bc51b32b2774 100644 --- a/drivers/tty/serial/8250/8250_pci.c +++ b/drivers/tty/serial/8250/8250_pci.c | |||
@@ -1950,6 +1950,43 @@ pci_wch_ch38x_setup(struct serial_private *priv, | |||
1950 | #define PCI_DEVICE_ID_PERICOM_PI7C9X7954 0x7954 | 1950 | #define PCI_DEVICE_ID_PERICOM_PI7C9X7954 0x7954 |
1951 | #define PCI_DEVICE_ID_PERICOM_PI7C9X7958 0x7958 | 1951 | #define PCI_DEVICE_ID_PERICOM_PI7C9X7958 0x7958 |
1952 | 1952 | ||
1953 | #define PCI_VENDOR_ID_ACCESIO 0x494f | ||
1954 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB 0x1051 | ||
1955 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S 0x1053 | ||
1956 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB 0x105C | ||
1957 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S 0x105E | ||
1958 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB 0x1091 | ||
1959 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2 0x1093 | ||
1960 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB 0x1099 | ||
1961 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4 0x109B | ||
1962 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB 0x10D1 | ||
1963 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM 0x10D3 | ||
1964 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB 0x10DA | ||
1965 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM 0x10DC | ||
1966 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1 0x1108 | ||
1967 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2 0x1110 | ||
1968 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2 0x1111 | ||
1969 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4 0x1118 | ||
1970 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4 0x1119 | ||
1971 | #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S 0x1152 | ||
1972 | #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S 0x115A | ||
1973 | #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2 0x1190 | ||
1974 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2 0x1191 | ||
1975 | #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4 0x1198 | ||
1976 | #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4 0x1199 | ||
1977 | #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM 0x11D0 | ||
1978 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4 0x105A | ||
1979 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4 0x105B | ||
1980 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8 0x106A | ||
1981 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM485_8 0x106B | ||
1982 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4 0x1098 | ||
1983 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8 0x10A9 | ||
1984 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM 0x10D9 | ||
1985 | #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM 0x10E9 | ||
1986 | #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM 0x11D8 | ||
1987 | |||
1988 | |||
1989 | |||
1953 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ | 1990 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ |
1954 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 | 1991 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 |
1955 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588 | 1992 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588 |
@@ -5113,6 +5150,108 @@ static struct pci_device_id serial_pci_tbl[] = { | |||
5113 | 0, | 5150 | 0, |
5114 | 0, pbn_pericom_PI7C9X7958 }, | 5151 | 0, pbn_pericom_PI7C9X7958 }, |
5115 | /* | 5152 | /* |
5153 | * ACCES I/O Products quad | ||
5154 | */ | ||
5155 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB, | ||
5156 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5157 | pbn_pericom_PI7C9X7954 }, | ||
5158 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S, | ||
5159 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5160 | pbn_pericom_PI7C9X7954 }, | ||
5161 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB, | ||
5162 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5163 | pbn_pericom_PI7C9X7954 }, | ||
5164 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S, | ||
5165 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5166 | pbn_pericom_PI7C9X7954 }, | ||
5167 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB, | ||
5168 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5169 | pbn_pericom_PI7C9X7954 }, | ||
5170 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2, | ||
5171 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5172 | pbn_pericom_PI7C9X7954 }, | ||
5173 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB, | ||
5174 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5175 | pbn_pericom_PI7C9X7954 }, | ||
5176 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4, | ||
5177 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5178 | pbn_pericom_PI7C9X7954 }, | ||
5179 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB, | ||
5180 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5181 | pbn_pericom_PI7C9X7954 }, | ||
5182 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM, | ||
5183 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5184 | pbn_pericom_PI7C9X7954 }, | ||
5185 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB, | ||
5186 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5187 | pbn_pericom_PI7C9X7954 }, | ||
5188 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM, | ||
5189 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5190 | pbn_pericom_PI7C9X7954 }, | ||
5191 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1, | ||
5192 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5193 | pbn_pericom_PI7C9X7954 }, | ||
5194 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2, | ||
5195 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5196 | pbn_pericom_PI7C9X7954 }, | ||
5197 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2, | ||
5198 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5199 | pbn_pericom_PI7C9X7954 }, | ||
5200 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4, | ||
5201 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5202 | pbn_pericom_PI7C9X7954 }, | ||
5203 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4, | ||
5204 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5205 | pbn_pericom_PI7C9X7954 }, | ||
5206 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S, | ||
5207 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5208 | pbn_pericom_PI7C9X7954 }, | ||
5209 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S, | ||
5210 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5211 | pbn_pericom_PI7C9X7954 }, | ||
5212 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2, | ||
5213 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5214 | pbn_pericom_PI7C9X7954 }, | ||
5215 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2, | ||
5216 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5217 | pbn_pericom_PI7C9X7954 }, | ||
5218 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4, | ||
5219 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5220 | pbn_pericom_PI7C9X7954 }, | ||
5221 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4, | ||
5222 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5223 | pbn_pericom_PI7C9X7954 }, | ||
5224 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM, | ||
5225 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5226 | pbn_pericom_PI7C9X7954 }, | ||
5227 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4, | ||
5228 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5229 | pbn_pericom_PI7C9X7958 }, | ||
5230 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4, | ||
5231 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5232 | pbn_pericom_PI7C9X7958 }, | ||
5233 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8, | ||
5234 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5235 | pbn_pericom_PI7C9X7958 }, | ||
5236 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_8, | ||
5237 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5238 | pbn_pericom_PI7C9X7958 }, | ||
5239 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4, | ||
5240 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5241 | pbn_pericom_PI7C9X7958 }, | ||
5242 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8, | ||
5243 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5244 | pbn_pericom_PI7C9X7958 }, | ||
5245 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM, | ||
5246 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5247 | pbn_pericom_PI7C9X7958 }, | ||
5248 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM, | ||
5249 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5250 | pbn_pericom_PI7C9X7958 }, | ||
5251 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM, | ||
5252 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
5253 | pbn_pericom_PI7C9X7958 }, | ||
5254 | /* | ||
5116 | * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke) | 5255 | * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke) |
5117 | */ | 5256 | */ |
5118 | { PCI_VENDOR_ID_TOPIC, PCI_DEVICE_ID_TOPIC_TP560, | 5257 | { PCI_VENDOR_ID_TOPIC, PCI_DEVICE_ID_TOPIC_TP560, |
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 7481b95c6d84..bdfa659b9606 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c | |||
@@ -1618,8 +1618,6 @@ static void serial8250_disable_ms(struct uart_port *port) | |||
1618 | if (up->bugs & UART_BUG_NOMSR) | 1618 | if (up->bugs & UART_BUG_NOMSR) |
1619 | return; | 1619 | return; |
1620 | 1620 | ||
1621 | mctrl_gpio_disable_ms(up->gpios); | ||
1622 | |||
1623 | up->ier &= ~UART_IER_MSI; | 1621 | up->ier &= ~UART_IER_MSI; |
1624 | serial_port_out(port, UART_IER, up->ier); | 1622 | serial_port_out(port, UART_IER, up->ier); |
1625 | } | 1623 | } |
@@ -1632,8 +1630,6 @@ static void serial8250_enable_ms(struct uart_port *port) | |||
1632 | if (up->bugs & UART_BUG_NOMSR) | 1630 | if (up->bugs & UART_BUG_NOMSR) |
1633 | return; | 1631 | return; |
1634 | 1632 | ||
1635 | mctrl_gpio_enable_ms(up->gpios); | ||
1636 | |||
1637 | up->ier |= UART_IER_MSI; | 1633 | up->ier |= UART_IER_MSI; |
1638 | 1634 | ||
1639 | serial8250_rpm_get(up); | 1635 | serial8250_rpm_get(up); |
@@ -1917,8 +1913,7 @@ unsigned int serial8250_do_get_mctrl(struct uart_port *port) | |||
1917 | ret |= TIOCM_DSR; | 1913 | ret |= TIOCM_DSR; |
1918 | if (status & UART_MSR_CTS) | 1914 | if (status & UART_MSR_CTS) |
1919 | ret |= TIOCM_CTS; | 1915 | ret |= TIOCM_CTS; |
1920 | 1916 | return ret; | |
1921 | return mctrl_gpio_get(up->gpios, &ret); | ||
1922 | } | 1917 | } |
1923 | EXPORT_SYMBOL_GPL(serial8250_do_get_mctrl); | 1918 | EXPORT_SYMBOL_GPL(serial8250_do_get_mctrl); |
1924 | 1919 | ||
diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kconfig index c9ec839a5ddf..7c6f7afca5dd 100644 --- a/drivers/tty/serial/8250/Kconfig +++ b/drivers/tty/serial/8250/Kconfig | |||
@@ -6,7 +6,6 @@ | |||
6 | config SERIAL_8250 | 6 | config SERIAL_8250 |
7 | tristate "8250/16550 and compatible serial support" | 7 | tristate "8250/16550 and compatible serial support" |
8 | select SERIAL_CORE | 8 | select SERIAL_CORE |
9 | select SERIAL_MCTRL_GPIO if GPIOLIB | ||
10 | ---help--- | 9 | ---help--- |
11 | This selects whether you want to include the driver for the standard | 10 | This selects whether you want to include the driver for the standard |
12 | serial ports. The standard answer is Y. People who might say N | 11 | serial ports. The standard answer is Y. People who might say N |
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 065f5d97aa67..b93356834bb5 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
@@ -949,6 +949,15 @@ static int isr_setup_status_phase(struct ci_hdrc *ci) | |||
949 | int retval; | 949 | int retval; |
950 | struct ci_hw_ep *hwep; | 950 | struct ci_hw_ep *hwep; |
951 | 951 | ||
952 | /* | ||
953 | * Unexpected USB controller behavior, caused by bad signal integrity | ||
954 | * or ground reference problems, can lead to isr_setup_status_phase | ||
955 | * being called with ci->status equal to NULL. | ||
956 | * If this situation occurs, you should review your USB hardware design. | ||
957 | */ | ||
958 | if (WARN_ON_ONCE(!ci->status)) | ||
959 | return -EPIPE; | ||
960 | |||
952 | hwep = (ci->ep0_dir == TX) ? ci->ep0out : ci->ep0in; | 961 | hwep = (ci->ep0_dir == TX) ? ci->ep0out : ci->ep0in; |
953 | ci->status->context = ci; | 962 | ci->status->context = ci; |
954 | ci->status->complete = isr_setup_status_complete; | 963 | ci->status->complete = isr_setup_status_complete; |
@@ -1596,8 +1605,11 @@ static int ci_udc_pullup(struct usb_gadget *_gadget, int is_on) | |||
1596 | { | 1605 | { |
1597 | struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget); | 1606 | struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget); |
1598 | 1607 | ||
1599 | /* Data+ pullup controlled by OTG state machine in OTG fsm mode */ | 1608 | /* |
1600 | if (ci_otg_is_fsm_mode(ci)) | 1609 | * Data+ pullup controlled by OTG state machine in OTG fsm mode; |
1610 | * and don't touch Data+ in host mode for dual role config. | ||
1611 | */ | ||
1612 | if (ci_otg_is_fsm_mode(ci) || ci->role == CI_ROLE_HOST) | ||
1601 | return 0; | 1613 | return 0; |
1602 | 1614 | ||
1603 | pm_runtime_get_sync(&ci->gadget.dev); | 1615 | pm_runtime_get_sync(&ci->gadget.dev); |
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index 051163189810..15ce4ab11688 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c | |||
@@ -187,7 +187,7 @@ static const unsigned short high_speed_maxpacket_maxes[4] = { | |||
187 | [USB_ENDPOINT_XFER_CONTROL] = 64, | 187 | [USB_ENDPOINT_XFER_CONTROL] = 64, |
188 | [USB_ENDPOINT_XFER_ISOC] = 1024, | 188 | [USB_ENDPOINT_XFER_ISOC] = 1024, |
189 | [USB_ENDPOINT_XFER_BULK] = 512, | 189 | [USB_ENDPOINT_XFER_BULK] = 512, |
190 | [USB_ENDPOINT_XFER_INT] = 1023, | 190 | [USB_ENDPOINT_XFER_INT] = 1024, |
191 | }; | 191 | }; |
192 | static const unsigned short super_speed_maxpacket_maxes[4] = { | 192 | static const unsigned short super_speed_maxpacket_maxes[4] = { |
193 | [USB_ENDPOINT_XFER_CONTROL] = 512, | 193 | [USB_ENDPOINT_XFER_CONTROL] = 512, |
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index e6a6d67c8705..09c8d9ca61ae 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -1709,11 +1709,17 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb | |||
1709 | as->urb->start_frame = uurb->start_frame; | 1709 | as->urb->start_frame = uurb->start_frame; |
1710 | as->urb->number_of_packets = number_of_packets; | 1710 | as->urb->number_of_packets = number_of_packets; |
1711 | as->urb->stream_id = stream_id; | 1711 | as->urb->stream_id = stream_id; |
1712 | if (uurb->type == USBDEVFS_URB_TYPE_ISO || | 1712 | |
1713 | ps->dev->speed == USB_SPEED_HIGH) | 1713 | if (ep->desc.bInterval) { |
1714 | as->urb->interval = 1 << min(15, ep->desc.bInterval - 1); | 1714 | if (uurb->type == USBDEVFS_URB_TYPE_ISO || |
1715 | else | 1715 | ps->dev->speed == USB_SPEED_HIGH || |
1716 | as->urb->interval = ep->desc.bInterval; | 1716 | ps->dev->speed >= USB_SPEED_SUPER) |
1717 | as->urb->interval = 1 << | ||
1718 | min(15, ep->desc.bInterval - 1); | ||
1719 | else | ||
1720 | as->urb->interval = ep->desc.bInterval; | ||
1721 | } | ||
1722 | |||
1717 | as->urb->context = as; | 1723 | as->urb->context = as; |
1718 | as->urb->complete = async_completed; | 1724 | as->urb->complete = async_completed; |
1719 | for (totlen = u = 0; u < number_of_packets; u++) { | 1725 | for (totlen = u = 0; u < number_of_packets; u++) { |
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h index 9fae0291cd69..d64551243789 100644 --- a/drivers/usb/dwc2/core.h +++ b/drivers/usb/dwc2/core.h | |||
@@ -868,6 +868,7 @@ struct dwc2_hsotg { | |||
868 | void *priv; | 868 | void *priv; |
869 | int irq; | 869 | int irq; |
870 | struct clk *clk; | 870 | struct clk *clk; |
871 | struct reset_control *reset; | ||
871 | 872 | ||
872 | unsigned int queuing_high_bandwidth:1; | 873 | unsigned int queuing_high_bandwidth:1; |
873 | unsigned int srp_success:1; | 874 | unsigned int srp_success:1; |
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index fc6f5251de5d..530959a8a6d1 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <linux/platform_device.h> | 45 | #include <linux/platform_device.h> |
46 | #include <linux/phy/phy.h> | 46 | #include <linux/phy/phy.h> |
47 | #include <linux/platform_data/s3c-hsotg.h> | 47 | #include <linux/platform_data/s3c-hsotg.h> |
48 | #include <linux/reset.h> | ||
48 | 49 | ||
49 | #include <linux/usb/of.h> | 50 | #include <linux/usb/of.h> |
50 | 51 | ||
@@ -337,6 +338,24 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) | |||
337 | { | 338 | { |
338 | int i, ret; | 339 | int i, ret; |
339 | 340 | ||
341 | hsotg->reset = devm_reset_control_get_optional(hsotg->dev, "dwc2"); | ||
342 | if (IS_ERR(hsotg->reset)) { | ||
343 | ret = PTR_ERR(hsotg->reset); | ||
344 | switch (ret) { | ||
345 | case -ENOENT: | ||
346 | case -ENOTSUPP: | ||
347 | hsotg->reset = NULL; | ||
348 | break; | ||
349 | default: | ||
350 | dev_err(hsotg->dev, "error getting reset control %d\n", | ||
351 | ret); | ||
352 | return ret; | ||
353 | } | ||
354 | } | ||
355 | |||
356 | if (hsotg->reset) | ||
357 | reset_control_deassert(hsotg->reset); | ||
358 | |||
340 | /* Set default UTMI width */ | 359 | /* Set default UTMI width */ |
341 | hsotg->phyif = GUSBCFG_PHYIF16; | 360 | hsotg->phyif = GUSBCFG_PHYIF16; |
342 | 361 | ||
@@ -434,6 +453,9 @@ static int dwc2_driver_remove(struct platform_device *dev) | |||
434 | if (hsotg->ll_hw_enabled) | 453 | if (hsotg->ll_hw_enabled) |
435 | dwc2_lowlevel_hw_disable(hsotg); | 454 | dwc2_lowlevel_hw_disable(hsotg); |
436 | 455 | ||
456 | if (hsotg->reset) | ||
457 | reset_control_assert(hsotg->reset); | ||
458 | |||
437 | return 0; | 459 | return 0; |
438 | } | 460 | } |
439 | 461 | ||
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 946643157b78..35d092456bec 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
@@ -1192,6 +1192,7 @@ static int dwc3_runtime_resume(struct device *dev) | |||
1192 | } | 1192 | } |
1193 | 1193 | ||
1194 | pm_runtime_mark_last_busy(dev); | 1194 | pm_runtime_mark_last_busy(dev); |
1195 | pm_runtime_put(dev); | ||
1195 | 1196 | ||
1196 | return 0; | 1197 | return 0; |
1197 | } | 1198 | } |
diff --git a/drivers/usb/dwc3/debug.h b/drivers/usb/dwc3/debug.h index 22dfc3dd6a13..33ab2a203c1b 100644 --- a/drivers/usb/dwc3/debug.h +++ b/drivers/usb/dwc3/debug.h | |||
@@ -192,7 +192,7 @@ dwc3_ep_event_string(const struct dwc3_event_depevt *event) | |||
192 | int ret; | 192 | int ret; |
193 | 193 | ||
194 | ret = sprintf(str, "ep%d%s: ", epnum >> 1, | 194 | ret = sprintf(str, "ep%d%s: ", epnum >> 1, |
195 | (epnum & 1) ? "in" : "in"); | 195 | (epnum & 1) ? "in" : "out"); |
196 | if (ret < 0) | 196 | if (ret < 0) |
197 | return "UNKNOWN"; | 197 | return "UNKNOWN"; |
198 | 198 | ||
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 2eb84d6c24a6..6df0f5dad9a4 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c | |||
@@ -243,6 +243,15 @@ static int dwc3_pci_runtime_suspend(struct device *dev) | |||
243 | return -EBUSY; | 243 | return -EBUSY; |
244 | } | 244 | } |
245 | 245 | ||
246 | static int dwc3_pci_runtime_resume(struct device *dev) | ||
247 | { | ||
248 | struct platform_device *dwc3 = dev_get_drvdata(dev); | ||
249 | |||
250 | return pm_runtime_get(&dwc3->dev); | ||
251 | } | ||
252 | #endif /* CONFIG_PM */ | ||
253 | |||
254 | #ifdef CONFIG_PM_SLEEP | ||
246 | static int dwc3_pci_pm_dummy(struct device *dev) | 255 | static int dwc3_pci_pm_dummy(struct device *dev) |
247 | { | 256 | { |
248 | /* | 257 | /* |
@@ -255,11 +264,11 @@ static int dwc3_pci_pm_dummy(struct device *dev) | |||
255 | */ | 264 | */ |
256 | return 0; | 265 | return 0; |
257 | } | 266 | } |
258 | #endif /* CONFIG_PM */ | 267 | #endif /* CONFIG_PM_SLEEP */ |
259 | 268 | ||
260 | static struct dev_pm_ops dwc3_pci_dev_pm_ops = { | 269 | static struct dev_pm_ops dwc3_pci_dev_pm_ops = { |
261 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_pci_pm_dummy, dwc3_pci_pm_dummy) | 270 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_pci_pm_dummy, dwc3_pci_pm_dummy) |
262 | SET_RUNTIME_PM_OPS(dwc3_pci_runtime_suspend, dwc3_pci_pm_dummy, | 271 | SET_RUNTIME_PM_OPS(dwc3_pci_runtime_suspend, dwc3_pci_runtime_resume, |
263 | NULL) | 272 | NULL) |
264 | }; | 273 | }; |
265 | 274 | ||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 1f5597ef945d..122e64df2f4d 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -1433,7 +1433,7 @@ static int dwc3_gadget_get_frame(struct usb_gadget *g) | |||
1433 | 1433 | ||
1434 | static int __dwc3_gadget_wakeup(struct dwc3 *dwc) | 1434 | static int __dwc3_gadget_wakeup(struct dwc3 *dwc) |
1435 | { | 1435 | { |
1436 | unsigned long timeout; | 1436 | int retries; |
1437 | 1437 | ||
1438 | int ret; | 1438 | int ret; |
1439 | u32 reg; | 1439 | u32 reg; |
@@ -1484,9 +1484,9 @@ static int __dwc3_gadget_wakeup(struct dwc3 *dwc) | |||
1484 | } | 1484 | } |
1485 | 1485 | ||
1486 | /* poll until Link State changes to ON */ | 1486 | /* poll until Link State changes to ON */ |
1487 | timeout = jiffies + msecs_to_jiffies(100); | 1487 | retries = 20000; |
1488 | 1488 | ||
1489 | while (!time_after(jiffies, timeout)) { | 1489 | while (retries--) { |
1490 | reg = dwc3_readl(dwc->regs, DWC3_DSTS); | 1490 | reg = dwc3_readl(dwc->regs, DWC3_DSTS); |
1491 | 1491 | ||
1492 | /* in HS, means ON */ | 1492 | /* in HS, means ON */ |
diff --git a/drivers/usb/gadget/function/f_eem.c b/drivers/usb/gadget/function/f_eem.c index d58bfc32be9e..007ec6e4a5d4 100644 --- a/drivers/usb/gadget/function/f_eem.c +++ b/drivers/usb/gadget/function/f_eem.c | |||
@@ -341,11 +341,15 @@ static struct sk_buff *eem_wrap(struct gether *port, struct sk_buff *skb) | |||
341 | { | 341 | { |
342 | struct sk_buff *skb2 = NULL; | 342 | struct sk_buff *skb2 = NULL; |
343 | struct usb_ep *in = port->in_ep; | 343 | struct usb_ep *in = port->in_ep; |
344 | int padlen = 0; | 344 | int headroom, tailroom, padlen = 0; |
345 | u16 len = skb->len; | 345 | u16 len; |
346 | 346 | ||
347 | int headroom = skb_headroom(skb); | 347 | if (!skb) |
348 | int tailroom = skb_tailroom(skb); | 348 | return NULL; |
349 | |||
350 | len = skb->len; | ||
351 | headroom = skb_headroom(skb); | ||
352 | tailroom = skb_tailroom(skb); | ||
349 | 353 | ||
350 | /* When (len + EEM_HLEN + ETH_FCS_LEN) % in->maxpacket) is 0, | 354 | /* When (len + EEM_HLEN + ETH_FCS_LEN) % in->maxpacket) is 0, |
351 | * stick two bytes of zero-length EEM packet on the end. | 355 | * stick two bytes of zero-length EEM packet on the end. |
diff --git a/drivers/usb/gadget/function/f_rndis.c b/drivers/usb/gadget/function/f_rndis.c index c8005823b190..16562e461121 100644 --- a/drivers/usb/gadget/function/f_rndis.c +++ b/drivers/usb/gadget/function/f_rndis.c | |||
@@ -374,6 +374,9 @@ static struct sk_buff *rndis_add_header(struct gether *port, | |||
374 | { | 374 | { |
375 | struct sk_buff *skb2; | 375 | struct sk_buff *skb2; |
376 | 376 | ||
377 | if (!skb) | ||
378 | return NULL; | ||
379 | |||
377 | skb2 = skb_realloc_headroom(skb, sizeof(struct rndis_packet_msg_type)); | 380 | skb2 = skb_realloc_headroom(skb, sizeof(struct rndis_packet_msg_type)); |
378 | rndis_add_hdr(skb2); | 381 | rndis_add_hdr(skb2); |
379 | 382 | ||
diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c index 6ded6345cd09..e0cd1e4c8892 100644 --- a/drivers/usb/gadget/function/u_serial.c +++ b/drivers/usb/gadget/function/u_serial.c | |||
@@ -375,10 +375,15 @@ __acquires(&port->port_lock) | |||
375 | */ | 375 | */ |
376 | { | 376 | { |
377 | struct list_head *pool = &port->write_pool; | 377 | struct list_head *pool = &port->write_pool; |
378 | struct usb_ep *in = port->port_usb->in; | 378 | struct usb_ep *in; |
379 | int status = 0; | 379 | int status = 0; |
380 | bool do_tty_wake = false; | 380 | bool do_tty_wake = false; |
381 | 381 | ||
382 | if (!port->port_usb) | ||
383 | return status; | ||
384 | |||
385 | in = port->port_usb->in; | ||
386 | |||
382 | while (!port->write_busy && !list_empty(pool)) { | 387 | while (!port->write_busy && !list_empty(pool)) { |
383 | struct usb_request *req; | 388 | struct usb_request *req; |
384 | int len; | 389 | int len; |
diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 934f83881c30..40c04bb25f2f 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c | |||
@@ -827,7 +827,7 @@ void usb_gadget_unmap_request_by_dev(struct device *dev, | |||
827 | return; | 827 | return; |
828 | 828 | ||
829 | if (req->num_mapped_sgs) { | 829 | if (req->num_mapped_sgs) { |
830 | dma_unmap_sg(dev, req->sg, req->num_mapped_sgs, | 830 | dma_unmap_sg(dev, req->sg, req->num_sgs, |
831 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 831 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
832 | 832 | ||
833 | req->num_mapped_sgs = 0; | 833 | req->num_mapped_sgs = 0; |
diff --git a/drivers/usb/gadget/udc/fsl_qe_udc.c b/drivers/usb/gadget/udc/fsl_qe_udc.c index cf8819a5c5b2..8bb011ea78f7 100644 --- a/drivers/usb/gadget/udc/fsl_qe_udc.c +++ b/drivers/usb/gadget/udc/fsl_qe_udc.c | |||
@@ -1878,11 +1878,8 @@ static int qe_get_frame(struct usb_gadget *gadget) | |||
1878 | 1878 | ||
1879 | tmp = in_be16(&udc->usb_param->frame_n); | 1879 | tmp = in_be16(&udc->usb_param->frame_n); |
1880 | if (tmp & 0x8000) | 1880 | if (tmp & 0x8000) |
1881 | tmp = tmp & 0x07ff; | 1881 | return tmp & 0x07ff; |
1882 | else | 1882 | return -EINVAL; |
1883 | tmp = -EINVAL; | ||
1884 | |||
1885 | return (int)tmp; | ||
1886 | } | 1883 | } |
1887 | 1884 | ||
1888 | static int fsl_qe_start(struct usb_gadget *gadget, | 1885 | static int fsl_qe_start(struct usb_gadget *gadget, |
diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c index 93a3bec81df7..fb8fc34827ab 100644 --- a/drivers/usb/gadget/udc/renesas_usb3.c +++ b/drivers/usb/gadget/udc/renesas_usb3.c | |||
@@ -106,6 +106,7 @@ | |||
106 | 106 | ||
107 | /* DRD_CON */ | 107 | /* DRD_CON */ |
108 | #define DRD_CON_PERI_CON BIT(24) | 108 | #define DRD_CON_PERI_CON BIT(24) |
109 | #define DRD_CON_VBOUT BIT(0) | ||
109 | 110 | ||
110 | /* USB_INT_ENA_1 and USB_INT_STA_1 */ | 111 | /* USB_INT_ENA_1 and USB_INT_STA_1 */ |
111 | #define USB_INT_1_B3_PLLWKUP BIT(31) | 112 | #define USB_INT_1_B3_PLLWKUP BIT(31) |
@@ -363,6 +364,7 @@ static void usb3_init_epc_registers(struct renesas_usb3 *usb3) | |||
363 | { | 364 | { |
364 | /* FIXME: How to change host / peripheral mode as well? */ | 365 | /* FIXME: How to change host / peripheral mode as well? */ |
365 | usb3_set_bit(usb3, DRD_CON_PERI_CON, USB3_DRD_CON); | 366 | usb3_set_bit(usb3, DRD_CON_PERI_CON, USB3_DRD_CON); |
367 | usb3_clear_bit(usb3, DRD_CON_VBOUT, USB3_DRD_CON); | ||
366 | 368 | ||
367 | usb3_write(usb3, ~0, USB3_USB_INT_STA_1); | 369 | usb3_write(usb3, ~0, USB3_USB_INT_STA_1); |
368 | usb3_enable_irq_1(usb3, USB_INT_1_VBUS_CNG); | 370 | usb3_enable_irq_1(usb3, USB_INT_1_VBUS_CNG); |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index fd9fd12e4861..797137e26549 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -850,6 +850,10 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg) | |||
850 | spin_lock_irqsave(&xhci->lock, flags); | 850 | spin_lock_irqsave(&xhci->lock, flags); |
851 | 851 | ||
852 | ep->stop_cmds_pending--; | 852 | ep->stop_cmds_pending--; |
853 | if (xhci->xhc_state & XHCI_STATE_REMOVING) { | ||
854 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
855 | return; | ||
856 | } | ||
853 | if (xhci->xhc_state & XHCI_STATE_DYING) { | 857 | if (xhci->xhc_state & XHCI_STATE_DYING) { |
854 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 858 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
855 | "Stop EP timer ran, but another timer marked " | 859 | "Stop EP timer ran, but another timer marked " |
@@ -903,7 +907,7 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg) | |||
903 | spin_unlock_irqrestore(&xhci->lock, flags); | 907 | spin_unlock_irqrestore(&xhci->lock, flags); |
904 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 908 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
905 | "Calling usb_hc_died()"); | 909 | "Calling usb_hc_died()"); |
906 | usb_hc_died(xhci_to_hcd(xhci)->primary_hcd); | 910 | usb_hc_died(xhci_to_hcd(xhci)); |
907 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 911 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
908 | "xHCI host controller is dead."); | 912 | "xHCI host controller is dead."); |
909 | } | 913 | } |
diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c index 192248f974ec..fe08e776fec3 100644 --- a/drivers/usb/musb/musb_virthub.c +++ b/drivers/usb/musb/musb_virthub.c | |||
@@ -290,6 +290,7 @@ int musb_hub_control( | |||
290 | u32 temp; | 290 | u32 temp; |
291 | int retval = 0; | 291 | int retval = 0; |
292 | unsigned long flags; | 292 | unsigned long flags; |
293 | bool start_musb = false; | ||
293 | 294 | ||
294 | spin_lock_irqsave(&musb->lock, flags); | 295 | spin_lock_irqsave(&musb->lock, flags); |
295 | 296 | ||
@@ -390,7 +391,7 @@ int musb_hub_control( | |||
390 | * logic relating to VBUS power-up. | 391 | * logic relating to VBUS power-up. |
391 | */ | 392 | */ |
392 | if (!hcd->self.is_b_host && musb_has_gadget(musb)) | 393 | if (!hcd->self.is_b_host && musb_has_gadget(musb)) |
393 | musb_start(musb); | 394 | start_musb = true; |
394 | break; | 395 | break; |
395 | case USB_PORT_FEAT_RESET: | 396 | case USB_PORT_FEAT_RESET: |
396 | musb_port_reset(musb, true); | 397 | musb_port_reset(musb, true); |
@@ -451,5 +452,9 @@ error: | |||
451 | retval = -EPIPE; | 452 | retval = -EPIPE; |
452 | } | 453 | } |
453 | spin_unlock_irqrestore(&musb->lock, flags); | 454 | spin_unlock_irqrestore(&musb->lock, flags); |
455 | |||
456 | if (start_musb) | ||
457 | musb_start(musb); | ||
458 | |||
454 | return retval; | 459 | return retval; |
455 | } | 460 | } |
diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c index 980c9dee09eb..427efb5eebae 100644 --- a/drivers/usb/phy/phy-generic.c +++ b/drivers/usb/phy/phy-generic.c | |||
@@ -144,14 +144,18 @@ static irqreturn_t nop_gpio_vbus_thread(int irq, void *data) | |||
144 | int usb_gen_phy_init(struct usb_phy *phy) | 144 | int usb_gen_phy_init(struct usb_phy *phy) |
145 | { | 145 | { |
146 | struct usb_phy_generic *nop = dev_get_drvdata(phy->dev); | 146 | struct usb_phy_generic *nop = dev_get_drvdata(phy->dev); |
147 | int ret; | ||
147 | 148 | ||
148 | if (!IS_ERR(nop->vcc)) { | 149 | if (!IS_ERR(nop->vcc)) { |
149 | if (regulator_enable(nop->vcc)) | 150 | if (regulator_enable(nop->vcc)) |
150 | dev_err(phy->dev, "Failed to enable power\n"); | 151 | dev_err(phy->dev, "Failed to enable power\n"); |
151 | } | 152 | } |
152 | 153 | ||
153 | if (!IS_ERR(nop->clk)) | 154 | if (!IS_ERR(nop->clk)) { |
154 | clk_prepare_enable(nop->clk); | 155 | ret = clk_prepare_enable(nop->clk); |
156 | if (ret) | ||
157 | return ret; | ||
158 | } | ||
155 | 159 | ||
156 | nop_reset(nop); | 160 | nop_reset(nop); |
157 | 161 | ||
diff --git a/drivers/usb/renesas_usbhs/mod.c b/drivers/usb/renesas_usbhs/mod.c index d4be5d594896..28965ef4f824 100644 --- a/drivers/usb/renesas_usbhs/mod.c +++ b/drivers/usb/renesas_usbhs/mod.c | |||
@@ -282,9 +282,16 @@ static irqreturn_t usbhs_interrupt(int irq, void *data) | |||
282 | if (usbhs_mod_is_host(priv)) | 282 | if (usbhs_mod_is_host(priv)) |
283 | usbhs_write(priv, INTSTS1, ~irq_state.intsts1 & INTSTS1_MAGIC); | 283 | usbhs_write(priv, INTSTS1, ~irq_state.intsts1 & INTSTS1_MAGIC); |
284 | 284 | ||
285 | usbhs_write(priv, BRDYSTS, ~irq_state.brdysts); | 285 | /* |
286 | * The driver should not clear the xxxSTS after the line of | ||
287 | * "call irq callback functions" because each "if" statement is | ||
288 | * possible to call the callback function for avoiding any side effects. | ||
289 | */ | ||
290 | if (irq_state.intsts0 & BRDY) | ||
291 | usbhs_write(priv, BRDYSTS, ~irq_state.brdysts); | ||
286 | usbhs_write(priv, NRDYSTS, ~irq_state.nrdysts); | 292 | usbhs_write(priv, NRDYSTS, ~irq_state.nrdysts); |
287 | usbhs_write(priv, BEMPSTS, ~irq_state.bempsts); | 293 | if (irq_state.intsts0 & BEMP) |
294 | usbhs_write(priv, BEMPSTS, ~irq_state.bempsts); | ||
288 | 295 | ||
289 | /* | 296 | /* |
290 | * call irq callback functions | 297 | * call irq callback functions |
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index 92bc83b92d10..c4c64740a3e7 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
@@ -1076,7 +1076,7 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv) | |||
1076 | 1076 | ||
1077 | gpriv->transceiver = usb_get_phy(USB_PHY_TYPE_UNDEFINED); | 1077 | gpriv->transceiver = usb_get_phy(USB_PHY_TYPE_UNDEFINED); |
1078 | dev_info(dev, "%stransceiver found\n", | 1078 | dev_info(dev, "%stransceiver found\n", |
1079 | gpriv->transceiver ? "" : "no "); | 1079 | !IS_ERR(gpriv->transceiver) ? "" : "no "); |
1080 | 1080 | ||
1081 | /* | 1081 | /* |
1082 | * CAUTION | 1082 | * CAUTION |
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index 5608af4a369d..de9992b492b0 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c | |||
@@ -1252,7 +1252,7 @@ static int mos7720_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
1252 | 1252 | ||
1253 | if (urb->transfer_buffer == NULL) { | 1253 | if (urb->transfer_buffer == NULL) { |
1254 | urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, | 1254 | urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, |
1255 | GFP_KERNEL); | 1255 | GFP_ATOMIC); |
1256 | if (!urb->transfer_buffer) | 1256 | if (!urb->transfer_buffer) |
1257 | goto exit; | 1257 | goto exit; |
1258 | } | 1258 | } |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index ed378fb232e7..57426d703a09 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -1340,8 +1340,8 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
1340 | } | 1340 | } |
1341 | 1341 | ||
1342 | if (urb->transfer_buffer == NULL) { | 1342 | if (urb->transfer_buffer == NULL) { |
1343 | urb->transfer_buffer = | 1343 | urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, |
1344 | kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); | 1344 | GFP_ATOMIC); |
1345 | if (!urb->transfer_buffer) | 1345 | if (!urb->transfer_buffer) |
1346 | goto exit; | 1346 | goto exit; |
1347 | } | 1347 | } |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index bc472584a229..9894e341c6ac 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -525,6 +525,12 @@ static void option_instat_callback(struct urb *urb); | |||
525 | #define VIATELECOM_VENDOR_ID 0x15eb | 525 | #define VIATELECOM_VENDOR_ID 0x15eb |
526 | #define VIATELECOM_PRODUCT_CDS7 0x0001 | 526 | #define VIATELECOM_PRODUCT_CDS7 0x0001 |
527 | 527 | ||
528 | /* WeTelecom products */ | ||
529 | #define WETELECOM_VENDOR_ID 0x22de | ||
530 | #define WETELECOM_PRODUCT_WMD200 0x6801 | ||
531 | #define WETELECOM_PRODUCT_6802 0x6802 | ||
532 | #define WETELECOM_PRODUCT_WMD300 0x6803 | ||
533 | |||
528 | struct option_blacklist_info { | 534 | struct option_blacklist_info { |
529 | /* bitmask of interface numbers blacklisted for send_setup */ | 535 | /* bitmask of interface numbers blacklisted for send_setup */ |
530 | const unsigned long sendsetup; | 536 | const unsigned long sendsetup; |
@@ -1991,6 +1997,9 @@ static const struct usb_device_id option_ids[] = { | |||
1991 | { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x4000, 0xff) }, /* OLICARD300 - MT6225 */ | 1997 | { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x4000, 0xff) }, /* OLICARD300 - MT6225 */ |
1992 | { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, | 1998 | { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, |
1993 | { USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) }, | 1999 | { USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) }, |
2000 | { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD200, 0xff, 0xff, 0xff) }, | ||
2001 | { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_6802, 0xff, 0xff, 0xff) }, | ||
2002 | { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD300, 0xff, 0xff, 0xff) }, | ||
1994 | { } /* Terminating entry */ | 2003 | { } /* Terminating entry */ |
1995 | }; | 2004 | }; |
1996 | MODULE_DEVICE_TABLE(usb, option_ids); | 2005 | MODULE_DEVICE_TABLE(usb, option_ids); |
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index e383ecdaca59..ed9c9eeedfe5 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c | |||
@@ -167,7 +167,7 @@ static bool vring_use_dma_api(struct virtio_device *vdev) | |||
167 | * making all of the arch DMA ops work on the vring device itself | 167 | * making all of the arch DMA ops work on the vring device itself |
168 | * is a mess. For now, we use the parent device for DMA ops. | 168 | * is a mess. For now, we use the parent device for DMA ops. |
169 | */ | 169 | */ |
170 | struct device *vring_dma_dev(const struct vring_virtqueue *vq) | 170 | static struct device *vring_dma_dev(const struct vring_virtqueue *vq) |
171 | { | 171 | { |
172 | return vq->vq.vdev->dev.parent; | 172 | return vq->vq.vdev->dev.parent; |
173 | } | 173 | } |
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 7f6aff3f72eb..e5495f37c6ed 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -853,6 +853,7 @@ static int load_elf_binary(struct linux_binprm *bprm) | |||
853 | current->flags |= PF_RANDOMIZE; | 853 | current->flags |= PF_RANDOMIZE; |
854 | 854 | ||
855 | setup_new_exec(bprm); | 855 | setup_new_exec(bprm); |
856 | install_exec_creds(bprm); | ||
856 | 857 | ||
857 | /* Do this so that we can load the interpreter, if need be. We will | 858 | /* Do this so that we can load the interpreter, if need be. We will |
858 | change some of these later */ | 859 | change some of these later */ |
@@ -1044,7 +1045,6 @@ static int load_elf_binary(struct linux_binprm *bprm) | |||
1044 | goto out; | 1045 | goto out; |
1045 | #endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */ | 1046 | #endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */ |
1046 | 1047 | ||
1047 | install_exec_creds(bprm); | ||
1048 | retval = create_elf_tables(bprm, &loc->elf_ex, | 1048 | retval = create_elf_tables(bprm, &loc->elf_ex, |
1049 | load_addr, interp_load_addr); | 1049 | load_addr, interp_load_addr); |
1050 | if (retval < 0) | 1050 | if (retval < 0) |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index eff3993c77b3..33fe03551105 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -427,6 +427,7 @@ struct btrfs_space_info { | |||
427 | struct list_head ro_bgs; | 427 | struct list_head ro_bgs; |
428 | struct list_head priority_tickets; | 428 | struct list_head priority_tickets; |
429 | struct list_head tickets; | 429 | struct list_head tickets; |
430 | u64 tickets_id; | ||
430 | 431 | ||
431 | struct rw_semaphore groups_sem; | 432 | struct rw_semaphore groups_sem; |
432 | /* for block groups in our same type */ | 433 | /* for block groups in our same type */ |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 0450dc410533..38c2df84cabd 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -4901,11 +4901,6 @@ btrfs_calc_reclaim_metadata_size(struct btrfs_root *root, | |||
4901 | u64 expected; | 4901 | u64 expected; |
4902 | u64 to_reclaim = 0; | 4902 | u64 to_reclaim = 0; |
4903 | 4903 | ||
4904 | to_reclaim = min_t(u64, num_online_cpus() * SZ_1M, SZ_16M); | ||
4905 | if (can_overcommit(root, space_info, to_reclaim, | ||
4906 | BTRFS_RESERVE_FLUSH_ALL)) | ||
4907 | return 0; | ||
4908 | |||
4909 | list_for_each_entry(ticket, &space_info->tickets, list) | 4904 | list_for_each_entry(ticket, &space_info->tickets, list) |
4910 | to_reclaim += ticket->bytes; | 4905 | to_reclaim += ticket->bytes; |
4911 | list_for_each_entry(ticket, &space_info->priority_tickets, list) | 4906 | list_for_each_entry(ticket, &space_info->priority_tickets, list) |
@@ -4913,6 +4908,11 @@ btrfs_calc_reclaim_metadata_size(struct btrfs_root *root, | |||
4913 | if (to_reclaim) | 4908 | if (to_reclaim) |
4914 | return to_reclaim; | 4909 | return to_reclaim; |
4915 | 4910 | ||
4911 | to_reclaim = min_t(u64, num_online_cpus() * SZ_1M, SZ_16M); | ||
4912 | if (can_overcommit(root, space_info, to_reclaim, | ||
4913 | BTRFS_RESERVE_FLUSH_ALL)) | ||
4914 | return 0; | ||
4915 | |||
4916 | used = space_info->bytes_used + space_info->bytes_reserved + | 4916 | used = space_info->bytes_used + space_info->bytes_reserved + |
4917 | space_info->bytes_pinned + space_info->bytes_readonly + | 4917 | space_info->bytes_pinned + space_info->bytes_readonly + |
4918 | space_info->bytes_may_use; | 4918 | space_info->bytes_may_use; |
@@ -4966,12 +4966,12 @@ static void wake_all_tickets(struct list_head *head) | |||
4966 | */ | 4966 | */ |
4967 | static void btrfs_async_reclaim_metadata_space(struct work_struct *work) | 4967 | static void btrfs_async_reclaim_metadata_space(struct work_struct *work) |
4968 | { | 4968 | { |
4969 | struct reserve_ticket *last_ticket = NULL; | ||
4970 | struct btrfs_fs_info *fs_info; | 4969 | struct btrfs_fs_info *fs_info; |
4971 | struct btrfs_space_info *space_info; | 4970 | struct btrfs_space_info *space_info; |
4972 | u64 to_reclaim; | 4971 | u64 to_reclaim; |
4973 | int flush_state; | 4972 | int flush_state; |
4974 | int commit_cycles = 0; | 4973 | int commit_cycles = 0; |
4974 | u64 last_tickets_id; | ||
4975 | 4975 | ||
4976 | fs_info = container_of(work, struct btrfs_fs_info, async_reclaim_work); | 4976 | fs_info = container_of(work, struct btrfs_fs_info, async_reclaim_work); |
4977 | space_info = __find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA); | 4977 | space_info = __find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA); |
@@ -4984,8 +4984,7 @@ static void btrfs_async_reclaim_metadata_space(struct work_struct *work) | |||
4984 | spin_unlock(&space_info->lock); | 4984 | spin_unlock(&space_info->lock); |
4985 | return; | 4985 | return; |
4986 | } | 4986 | } |
4987 | last_ticket = list_first_entry(&space_info->tickets, | 4987 | last_tickets_id = space_info->tickets_id; |
4988 | struct reserve_ticket, list); | ||
4989 | spin_unlock(&space_info->lock); | 4988 | spin_unlock(&space_info->lock); |
4990 | 4989 | ||
4991 | flush_state = FLUSH_DELAYED_ITEMS_NR; | 4990 | flush_state = FLUSH_DELAYED_ITEMS_NR; |
@@ -5005,10 +5004,10 @@ static void btrfs_async_reclaim_metadata_space(struct work_struct *work) | |||
5005 | space_info); | 5004 | space_info); |
5006 | ticket = list_first_entry(&space_info->tickets, | 5005 | ticket = list_first_entry(&space_info->tickets, |
5007 | struct reserve_ticket, list); | 5006 | struct reserve_ticket, list); |
5008 | if (last_ticket == ticket) { | 5007 | if (last_tickets_id == space_info->tickets_id) { |
5009 | flush_state++; | 5008 | flush_state++; |
5010 | } else { | 5009 | } else { |
5011 | last_ticket = ticket; | 5010 | last_tickets_id = space_info->tickets_id; |
5012 | flush_state = FLUSH_DELAYED_ITEMS_NR; | 5011 | flush_state = FLUSH_DELAYED_ITEMS_NR; |
5013 | if (commit_cycles) | 5012 | if (commit_cycles) |
5014 | commit_cycles--; | 5013 | commit_cycles--; |
@@ -5384,6 +5383,7 @@ again: | |||
5384 | list_del_init(&ticket->list); | 5383 | list_del_init(&ticket->list); |
5385 | num_bytes -= ticket->bytes; | 5384 | num_bytes -= ticket->bytes; |
5386 | ticket->bytes = 0; | 5385 | ticket->bytes = 0; |
5386 | space_info->tickets_id++; | ||
5387 | wake_up(&ticket->wait); | 5387 | wake_up(&ticket->wait); |
5388 | } else { | 5388 | } else { |
5389 | ticket->bytes -= num_bytes; | 5389 | ticket->bytes -= num_bytes; |
@@ -5426,6 +5426,7 @@ again: | |||
5426 | num_bytes -= ticket->bytes; | 5426 | num_bytes -= ticket->bytes; |
5427 | space_info->bytes_may_use += ticket->bytes; | 5427 | space_info->bytes_may_use += ticket->bytes; |
5428 | ticket->bytes = 0; | 5428 | ticket->bytes = 0; |
5429 | space_info->tickets_id++; | ||
5429 | wake_up(&ticket->wait); | 5430 | wake_up(&ticket->wait); |
5430 | } else { | 5431 | } else { |
5431 | trace_btrfs_space_reservation(fs_info, "space_info", | 5432 | trace_btrfs_space_reservation(fs_info, "space_info", |
@@ -8216,6 +8217,7 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans, | |||
8216 | { | 8217 | { |
8217 | int ret; | 8218 | int ret; |
8218 | struct btrfs_block_group_cache *block_group; | 8219 | struct btrfs_block_group_cache *block_group; |
8220 | struct btrfs_space_info *space_info; | ||
8219 | 8221 | ||
8220 | /* | 8222 | /* |
8221 | * Mixed block groups will exclude before processing the log so we only | 8223 | * Mixed block groups will exclude before processing the log so we only |
@@ -8231,9 +8233,14 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans, | |||
8231 | if (!block_group) | 8233 | if (!block_group) |
8232 | return -EINVAL; | 8234 | return -EINVAL; |
8233 | 8235 | ||
8234 | ret = btrfs_add_reserved_bytes(block_group, ins->offset, | 8236 | space_info = block_group->space_info; |
8235 | ins->offset, 0); | 8237 | spin_lock(&space_info->lock); |
8236 | BUG_ON(ret); /* logic error */ | 8238 | spin_lock(&block_group->lock); |
8239 | space_info->bytes_reserved += ins->offset; | ||
8240 | block_group->reserved += ins->offset; | ||
8241 | spin_unlock(&block_group->lock); | ||
8242 | spin_unlock(&space_info->lock); | ||
8243 | |||
8237 | ret = alloc_reserved_file_extent(trans, root, 0, root_objectid, | 8244 | ret = alloc_reserved_file_extent(trans, root, 0, root_objectid, |
8238 | 0, owner, offset, ins, 1); | 8245 | 0, owner, offset, ins, 1); |
8239 | btrfs_put_block_group(block_group); | 8246 | btrfs_put_block_group(block_group); |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 8a2c2a07987b..c0c13dc6fe12 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
@@ -4200,9 +4200,11 @@ restart: | |||
4200 | err = PTR_ERR(trans); | 4200 | err = PTR_ERR(trans); |
4201 | goto out_free; | 4201 | goto out_free; |
4202 | } | 4202 | } |
4203 | err = qgroup_fix_relocated_data_extents(trans, rc); | 4203 | ret = qgroup_fix_relocated_data_extents(trans, rc); |
4204 | if (err < 0) { | 4204 | if (ret < 0) { |
4205 | btrfs_abort_transaction(trans, err); | 4205 | btrfs_abort_transaction(trans, ret); |
4206 | if (!err) | ||
4207 | err = ret; | ||
4206 | goto out_free; | 4208 | goto out_free; |
4207 | } | 4209 | } |
4208 | btrfs_commit_transaction(trans, rc->extent_root); | 4210 | btrfs_commit_transaction(trans, rc->extent_root); |
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index efe129fe2678..a87675ffd02b 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c | |||
@@ -4268,10 +4268,12 @@ static int process_all_refs(struct send_ctx *sctx, | |||
4268 | } | 4268 | } |
4269 | btrfs_release_path(path); | 4269 | btrfs_release_path(path); |
4270 | 4270 | ||
4271 | /* | ||
4272 | * We don't actually care about pending_move as we are simply | ||
4273 | * re-creating this inode and will be rename'ing it into place once we | ||
4274 | * rename the parent directory. | ||
4275 | */ | ||
4271 | ret = process_recorded_refs(sctx, &pending_move); | 4276 | ret = process_recorded_refs(sctx, &pending_move); |
4272 | /* Only applicable to an incremental send. */ | ||
4273 | ASSERT(pending_move == 0); | ||
4274 | |||
4275 | out: | 4277 | out: |
4276 | btrfs_free_path(path); | 4278 | btrfs_free_path(path); |
4277 | return ret; | 4279 | return ret; |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index e935035ac034..ef9c55bc7907 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -2867,6 +2867,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, | |||
2867 | 2867 | ||
2868 | if (log_root_tree->log_transid_committed >= root_log_ctx.log_transid) { | 2868 | if (log_root_tree->log_transid_committed >= root_log_ctx.log_transid) { |
2869 | blk_finish_plug(&plug); | 2869 | blk_finish_plug(&plug); |
2870 | list_del_init(&root_log_ctx.list); | ||
2870 | mutex_unlock(&log_root_tree->log_mutex); | 2871 | mutex_unlock(&log_root_tree->log_mutex); |
2871 | ret = root_log_ctx.log_ret; | 2872 | ret = root_log_ctx.log_ret; |
2872 | goto out; | 2873 | goto out; |
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index c64a0b794d49..df4b3e6fa563 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
@@ -597,7 +597,7 @@ static bool need_reset_readdir(struct ceph_file_info *fi, loff_t new_pos) | |||
597 | if (is_hash_order(new_pos)) { | 597 | if (is_hash_order(new_pos)) { |
598 | /* no need to reset last_name for a forward seek when | 598 | /* no need to reset last_name for a forward seek when |
599 | * dentries are sotred in hash order */ | 599 | * dentries are sotred in hash order */ |
600 | } else if (fi->frag |= fpos_frag(new_pos)) { | 600 | } else if (fi->frag != fpos_frag(new_pos)) { |
601 | return true; | 601 | return true; |
602 | } | 602 | } |
603 | rinfo = fi->last_readdir ? &fi->last_readdir->r_reply_info : NULL; | 603 | rinfo = fi->last_readdir ? &fi->last_readdir->r_reply_info : NULL; |
diff --git a/fs/crypto/policy.c b/fs/crypto/policy.c index 0f9961eede1e..ed115acb5dee 100644 --- a/fs/crypto/policy.c +++ b/fs/crypto/policy.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/random.h> | 11 | #include <linux/random.h> |
12 | #include <linux/string.h> | 12 | #include <linux/string.h> |
13 | #include <linux/fscrypto.h> | 13 | #include <linux/fscrypto.h> |
14 | #include <linux/mount.h> | ||
14 | 15 | ||
15 | static int inode_has_encryption_context(struct inode *inode) | 16 | static int inode_has_encryption_context(struct inode *inode) |
16 | { | 17 | { |
@@ -92,26 +93,42 @@ static int create_encryption_context_from_policy(struct inode *inode, | |||
92 | return inode->i_sb->s_cop->set_context(inode, &ctx, sizeof(ctx), NULL); | 93 | return inode->i_sb->s_cop->set_context(inode, &ctx, sizeof(ctx), NULL); |
93 | } | 94 | } |
94 | 95 | ||
95 | int fscrypt_process_policy(struct inode *inode, | 96 | int fscrypt_process_policy(struct file *filp, |
96 | const struct fscrypt_policy *policy) | 97 | const struct fscrypt_policy *policy) |
97 | { | 98 | { |
99 | struct inode *inode = file_inode(filp); | ||
100 | int ret; | ||
101 | |||
102 | if (!inode_owner_or_capable(inode)) | ||
103 | return -EACCES; | ||
104 | |||
98 | if (policy->version != 0) | 105 | if (policy->version != 0) |
99 | return -EINVAL; | 106 | return -EINVAL; |
100 | 107 | ||
108 | ret = mnt_want_write_file(filp); | ||
109 | if (ret) | ||
110 | return ret; | ||
111 | |||
101 | if (!inode_has_encryption_context(inode)) { | 112 | if (!inode_has_encryption_context(inode)) { |
102 | if (!inode->i_sb->s_cop->empty_dir) | 113 | if (!S_ISDIR(inode->i_mode)) |
103 | return -EOPNOTSUPP; | 114 | ret = -EINVAL; |
104 | if (!inode->i_sb->s_cop->empty_dir(inode)) | 115 | else if (!inode->i_sb->s_cop->empty_dir) |
105 | return -ENOTEMPTY; | 116 | ret = -EOPNOTSUPP; |
106 | return create_encryption_context_from_policy(inode, policy); | 117 | else if (!inode->i_sb->s_cop->empty_dir(inode)) |
118 | ret = -ENOTEMPTY; | ||
119 | else | ||
120 | ret = create_encryption_context_from_policy(inode, | ||
121 | policy); | ||
122 | } else if (!is_encryption_context_consistent_with_policy(inode, | ||
123 | policy)) { | ||
124 | printk(KERN_WARNING | ||
125 | "%s: Policy inconsistent with encryption context\n", | ||
126 | __func__); | ||
127 | ret = -EINVAL; | ||
107 | } | 128 | } |
108 | 129 | ||
109 | if (is_encryption_context_consistent_with_policy(inode, policy)) | 130 | mnt_drop_write_file(filp); |
110 | return 0; | 131 | return ret; |
111 | |||
112 | printk(KERN_WARNING "%s: Policy inconsistent with encryption context\n", | ||
113 | __func__); | ||
114 | return -EINVAL; | ||
115 | } | 132 | } |
116 | EXPORT_SYMBOL(fscrypt_process_policy); | 133 | EXPORT_SYMBOL(fscrypt_process_policy); |
117 | 134 | ||
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index d116453b0276..79a5941c2474 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c | |||
@@ -585,7 +585,8 @@ struct dentry *devpts_pty_new(struct pts_fs_info *fsi, int index, void *priv) | |||
585 | */ | 585 | */ |
586 | void *devpts_get_priv(struct dentry *dentry) | 586 | void *devpts_get_priv(struct dentry *dentry) |
587 | { | 587 | { |
588 | WARN_ON_ONCE(dentry->d_sb->s_magic != DEVPTS_SUPER_MAGIC); | 588 | if (dentry->d_sb->s_magic != DEVPTS_SUPER_MAGIC) |
589 | return NULL; | ||
589 | return dentry->d_fsdata; | 590 | return dentry->d_fsdata; |
590 | } | 591 | } |
591 | 592 | ||
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3131747199e1..c6ea25a190f8 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -5466,8 +5466,6 @@ int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode) | |||
5466 | sbi->s_want_extra_isize, | 5466 | sbi->s_want_extra_isize, |
5467 | iloc, handle); | 5467 | iloc, handle); |
5468 | if (ret) { | 5468 | if (ret) { |
5469 | ext4_set_inode_state(inode, | ||
5470 | EXT4_STATE_NO_EXPAND); | ||
5471 | if (mnt_count != | 5469 | if (mnt_count != |
5472 | le16_to_cpu(sbi->s_es->s_mnt_count)) { | 5470 | le16_to_cpu(sbi->s_es->s_mnt_count)) { |
5473 | ext4_warning(inode->i_sb, | 5471 | ext4_warning(inode->i_sb, |
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index 10686fd67fb4..1bb7df5e4536 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c | |||
@@ -776,7 +776,7 @@ resizefs_out: | |||
776 | (struct fscrypt_policy __user *)arg, | 776 | (struct fscrypt_policy __user *)arg, |
777 | sizeof(policy))) | 777 | sizeof(policy))) |
778 | return -EFAULT; | 778 | return -EFAULT; |
779 | return fscrypt_process_policy(inode, &policy); | 779 | return fscrypt_process_policy(filp, &policy); |
780 | #else | 780 | #else |
781 | return -EOPNOTSUPP; | 781 | return -EOPNOTSUPP; |
782 | #endif | 782 | #endif |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 1c593aa0218e..3ec8708989ca 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -2211,6 +2211,7 @@ void ext4_group_desc_csum_set(struct super_block *sb, __u32 block_group, | |||
2211 | 2211 | ||
2212 | /* Called at mount-time, super-block is locked */ | 2212 | /* Called at mount-time, super-block is locked */ |
2213 | static int ext4_check_descriptors(struct super_block *sb, | 2213 | static int ext4_check_descriptors(struct super_block *sb, |
2214 | ext4_fsblk_t sb_block, | ||
2214 | ext4_group_t *first_not_zeroed) | 2215 | ext4_group_t *first_not_zeroed) |
2215 | { | 2216 | { |
2216 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 2217 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
@@ -2241,6 +2242,11 @@ static int ext4_check_descriptors(struct super_block *sb, | |||
2241 | grp = i; | 2242 | grp = i; |
2242 | 2243 | ||
2243 | block_bitmap = ext4_block_bitmap(sb, gdp); | 2244 | block_bitmap = ext4_block_bitmap(sb, gdp); |
2245 | if (block_bitmap == sb_block) { | ||
2246 | ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " | ||
2247 | "Block bitmap for group %u overlaps " | ||
2248 | "superblock", i); | ||
2249 | } | ||
2244 | if (block_bitmap < first_block || block_bitmap > last_block) { | 2250 | if (block_bitmap < first_block || block_bitmap > last_block) { |
2245 | ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " | 2251 | ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " |
2246 | "Block bitmap for group %u not in group " | 2252 | "Block bitmap for group %u not in group " |
@@ -2248,6 +2254,11 @@ static int ext4_check_descriptors(struct super_block *sb, | |||
2248 | return 0; | 2254 | return 0; |
2249 | } | 2255 | } |
2250 | inode_bitmap = ext4_inode_bitmap(sb, gdp); | 2256 | inode_bitmap = ext4_inode_bitmap(sb, gdp); |
2257 | if (inode_bitmap == sb_block) { | ||
2258 | ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " | ||
2259 | "Inode bitmap for group %u overlaps " | ||
2260 | "superblock", i); | ||
2261 | } | ||
2251 | if (inode_bitmap < first_block || inode_bitmap > last_block) { | 2262 | if (inode_bitmap < first_block || inode_bitmap > last_block) { |
2252 | ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " | 2263 | ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " |
2253 | "Inode bitmap for group %u not in group " | 2264 | "Inode bitmap for group %u not in group " |
@@ -2255,6 +2266,11 @@ static int ext4_check_descriptors(struct super_block *sb, | |||
2255 | return 0; | 2266 | return 0; |
2256 | } | 2267 | } |
2257 | inode_table = ext4_inode_table(sb, gdp); | 2268 | inode_table = ext4_inode_table(sb, gdp); |
2269 | if (inode_table == sb_block) { | ||
2270 | ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " | ||
2271 | "Inode table for group %u overlaps " | ||
2272 | "superblock", i); | ||
2273 | } | ||
2258 | if (inode_table < first_block || | 2274 | if (inode_table < first_block || |
2259 | inode_table + sbi->s_itb_per_group - 1 > last_block) { | 2275 | inode_table + sbi->s_itb_per_group - 1 > last_block) { |
2260 | ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " | 2276 | ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " |
@@ -3757,7 +3773,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3757 | goto failed_mount2; | 3773 | goto failed_mount2; |
3758 | } | 3774 | } |
3759 | } | 3775 | } |
3760 | if (!ext4_check_descriptors(sb, &first_not_zeroed)) { | 3776 | if (!ext4_check_descriptors(sb, logical_sb_block, &first_not_zeroed)) { |
3761 | ext4_msg(sb, KERN_ERR, "group descriptors corrupted!"); | 3777 | ext4_msg(sb, KERN_ERR, "group descriptors corrupted!"); |
3762 | ret = -EFSCORRUPTED; | 3778 | ret = -EFSCORRUPTED; |
3763 | goto failed_mount2; | 3779 | goto failed_mount2; |
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index 39e9cfb1b371..2eb935ca5d9e 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c | |||
@@ -1353,15 +1353,19 @@ int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize, | |||
1353 | size_t min_offs, free; | 1353 | size_t min_offs, free; |
1354 | int total_ino; | 1354 | int total_ino; |
1355 | void *base, *start, *end; | 1355 | void *base, *start, *end; |
1356 | int extra_isize = 0, error = 0, tried_min_extra_isize = 0; | 1356 | int error = 0, tried_min_extra_isize = 0; |
1357 | int s_min_extra_isize = le16_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_min_extra_isize); | 1357 | int s_min_extra_isize = le16_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_min_extra_isize); |
1358 | int isize_diff; /* How much do we need to grow i_extra_isize */ | ||
1358 | 1359 | ||
1359 | down_write(&EXT4_I(inode)->xattr_sem); | 1360 | down_write(&EXT4_I(inode)->xattr_sem); |
1361 | /* | ||
1362 | * Set EXT4_STATE_NO_EXPAND to avoid recursion when marking inode dirty | ||
1363 | */ | ||
1364 | ext4_set_inode_state(inode, EXT4_STATE_NO_EXPAND); | ||
1360 | retry: | 1365 | retry: |
1361 | if (EXT4_I(inode)->i_extra_isize >= new_extra_isize) { | 1366 | isize_diff = new_extra_isize - EXT4_I(inode)->i_extra_isize; |
1362 | up_write(&EXT4_I(inode)->xattr_sem); | 1367 | if (EXT4_I(inode)->i_extra_isize >= new_extra_isize) |
1363 | return 0; | 1368 | goto out; |
1364 | } | ||
1365 | 1369 | ||
1366 | header = IHDR(inode, raw_inode); | 1370 | header = IHDR(inode, raw_inode); |
1367 | entry = IFIRST(header); | 1371 | entry = IFIRST(header); |
@@ -1382,7 +1386,7 @@ retry: | |||
1382 | goto cleanup; | 1386 | goto cleanup; |
1383 | 1387 | ||
1384 | free = ext4_xattr_free_space(last, &min_offs, base, &total_ino); | 1388 | free = ext4_xattr_free_space(last, &min_offs, base, &total_ino); |
1385 | if (free >= new_extra_isize) { | 1389 | if (free >= isize_diff) { |
1386 | entry = IFIRST(header); | 1390 | entry = IFIRST(header); |
1387 | ext4_xattr_shift_entries(entry, EXT4_I(inode)->i_extra_isize | 1391 | ext4_xattr_shift_entries(entry, EXT4_I(inode)->i_extra_isize |
1388 | - new_extra_isize, (void *)raw_inode + | 1392 | - new_extra_isize, (void *)raw_inode + |
@@ -1390,8 +1394,7 @@ retry: | |||
1390 | (void *)header, total_ino, | 1394 | (void *)header, total_ino, |
1391 | inode->i_sb->s_blocksize); | 1395 | inode->i_sb->s_blocksize); |
1392 | EXT4_I(inode)->i_extra_isize = new_extra_isize; | 1396 | EXT4_I(inode)->i_extra_isize = new_extra_isize; |
1393 | error = 0; | 1397 | goto out; |
1394 | goto cleanup; | ||
1395 | } | 1398 | } |
1396 | 1399 | ||
1397 | /* | 1400 | /* |
@@ -1414,7 +1417,7 @@ retry: | |||
1414 | end = bh->b_data + bh->b_size; | 1417 | end = bh->b_data + bh->b_size; |
1415 | min_offs = end - base; | 1418 | min_offs = end - base; |
1416 | free = ext4_xattr_free_space(first, &min_offs, base, NULL); | 1419 | free = ext4_xattr_free_space(first, &min_offs, base, NULL); |
1417 | if (free < new_extra_isize) { | 1420 | if (free < isize_diff) { |
1418 | if (!tried_min_extra_isize && s_min_extra_isize) { | 1421 | if (!tried_min_extra_isize && s_min_extra_isize) { |
1419 | tried_min_extra_isize++; | 1422 | tried_min_extra_isize++; |
1420 | new_extra_isize = s_min_extra_isize; | 1423 | new_extra_isize = s_min_extra_isize; |
@@ -1428,7 +1431,7 @@ retry: | |||
1428 | free = inode->i_sb->s_blocksize; | 1431 | free = inode->i_sb->s_blocksize; |
1429 | } | 1432 | } |
1430 | 1433 | ||
1431 | while (new_extra_isize > 0) { | 1434 | while (isize_diff > 0) { |
1432 | size_t offs, size, entry_size; | 1435 | size_t offs, size, entry_size; |
1433 | struct ext4_xattr_entry *small_entry = NULL; | 1436 | struct ext4_xattr_entry *small_entry = NULL; |
1434 | struct ext4_xattr_info i = { | 1437 | struct ext4_xattr_info i = { |
@@ -1459,7 +1462,7 @@ retry: | |||
1459 | EXT4_XATTR_SIZE(le32_to_cpu(last->e_value_size)) + | 1462 | EXT4_XATTR_SIZE(le32_to_cpu(last->e_value_size)) + |
1460 | EXT4_XATTR_LEN(last->e_name_len); | 1463 | EXT4_XATTR_LEN(last->e_name_len); |
1461 | if (total_size <= free && total_size < min_total_size) { | 1464 | if (total_size <= free && total_size < min_total_size) { |
1462 | if (total_size < new_extra_isize) { | 1465 | if (total_size < isize_diff) { |
1463 | small_entry = last; | 1466 | small_entry = last; |
1464 | } else { | 1467 | } else { |
1465 | entry = last; | 1468 | entry = last; |
@@ -1514,22 +1517,22 @@ retry: | |||
1514 | error = ext4_xattr_ibody_set(handle, inode, &i, is); | 1517 | error = ext4_xattr_ibody_set(handle, inode, &i, is); |
1515 | if (error) | 1518 | if (error) |
1516 | goto cleanup; | 1519 | goto cleanup; |
1520 | total_ino -= entry_size; | ||
1517 | 1521 | ||
1518 | entry = IFIRST(header); | 1522 | entry = IFIRST(header); |
1519 | if (entry_size + EXT4_XATTR_SIZE(size) >= new_extra_isize) | 1523 | if (entry_size + EXT4_XATTR_SIZE(size) >= isize_diff) |
1520 | shift_bytes = new_extra_isize; | 1524 | shift_bytes = isize_diff; |
1521 | else | 1525 | else |
1522 | shift_bytes = entry_size + size; | 1526 | shift_bytes = entry_size + EXT4_XATTR_SIZE(size); |
1523 | /* Adjust the offsets and shift the remaining entries ahead */ | 1527 | /* Adjust the offsets and shift the remaining entries ahead */ |
1524 | ext4_xattr_shift_entries(entry, EXT4_I(inode)->i_extra_isize - | 1528 | ext4_xattr_shift_entries(entry, -shift_bytes, |
1525 | shift_bytes, (void *)raw_inode + | 1529 | (void *)raw_inode + EXT4_GOOD_OLD_INODE_SIZE + |
1526 | EXT4_GOOD_OLD_INODE_SIZE + extra_isize + shift_bytes, | 1530 | EXT4_I(inode)->i_extra_isize + shift_bytes, |
1527 | (void *)header, total_ino - entry_size, | 1531 | (void *)header, total_ino, inode->i_sb->s_blocksize); |
1528 | inode->i_sb->s_blocksize); | ||
1529 | 1532 | ||
1530 | extra_isize += shift_bytes; | 1533 | isize_diff -= shift_bytes; |
1531 | new_extra_isize -= shift_bytes; | 1534 | EXT4_I(inode)->i_extra_isize += shift_bytes; |
1532 | EXT4_I(inode)->i_extra_isize = extra_isize; | 1535 | header = IHDR(inode, raw_inode); |
1533 | 1536 | ||
1534 | i.name = b_entry_name; | 1537 | i.name = b_entry_name; |
1535 | i.value = buffer; | 1538 | i.value = buffer; |
@@ -1551,6 +1554,8 @@ retry: | |||
1551 | kfree(bs); | 1554 | kfree(bs); |
1552 | } | 1555 | } |
1553 | brelse(bh); | 1556 | brelse(bh); |
1557 | out: | ||
1558 | ext4_clear_inode_state(inode, EXT4_STATE_NO_EXPAND); | ||
1554 | up_write(&EXT4_I(inode)->xattr_sem); | 1559 | up_write(&EXT4_I(inode)->xattr_sem); |
1555 | return 0; | 1560 | return 0; |
1556 | 1561 | ||
@@ -1562,6 +1567,10 @@ cleanup: | |||
1562 | kfree(is); | 1567 | kfree(is); |
1563 | kfree(bs); | 1568 | kfree(bs); |
1564 | brelse(bh); | 1569 | brelse(bh); |
1570 | /* | ||
1571 | * We deliberately leave EXT4_STATE_NO_EXPAND set here since inode | ||
1572 | * size expansion failed. | ||
1573 | */ | ||
1565 | up_write(&EXT4_I(inode)->xattr_sem); | 1574 | up_write(&EXT4_I(inode)->xattr_sem); |
1566 | return error; | 1575 | return error; |
1567 | } | 1576 | } |
diff --git a/fs/ext4/xattr.h b/fs/ext4/xattr.h index 69dd3e6566e0..a92e783fa057 100644 --- a/fs/ext4/xattr.h +++ b/fs/ext4/xattr.h | |||
@@ -24,6 +24,7 @@ | |||
24 | #define EXT4_XATTR_INDEX_SYSTEM 7 | 24 | #define EXT4_XATTR_INDEX_SYSTEM 7 |
25 | #define EXT4_XATTR_INDEX_RICHACL 8 | 25 | #define EXT4_XATTR_INDEX_RICHACL 8 |
26 | #define EXT4_XATTR_INDEX_ENCRYPTION 9 | 26 | #define EXT4_XATTR_INDEX_ENCRYPTION 9 |
27 | #define EXT4_XATTR_INDEX_HURD 10 /* Reserved for Hurd */ | ||
27 | 28 | ||
28 | struct ext4_xattr_header { | 29 | struct ext4_xattr_header { |
29 | __le32 h_magic; /* magic number for identification */ | 30 | __le32 h_magic; /* magic number for identification */ |
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 47abb96098e4..28f4f4cbb8d8 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -1757,21 +1757,14 @@ static int f2fs_ioc_set_encryption_policy(struct file *filp, unsigned long arg) | |||
1757 | { | 1757 | { |
1758 | struct fscrypt_policy policy; | 1758 | struct fscrypt_policy policy; |
1759 | struct inode *inode = file_inode(filp); | 1759 | struct inode *inode = file_inode(filp); |
1760 | int ret; | ||
1761 | 1760 | ||
1762 | if (copy_from_user(&policy, (struct fscrypt_policy __user *)arg, | 1761 | if (copy_from_user(&policy, (struct fscrypt_policy __user *)arg, |
1763 | sizeof(policy))) | 1762 | sizeof(policy))) |
1764 | return -EFAULT; | 1763 | return -EFAULT; |
1765 | 1764 | ||
1766 | ret = mnt_want_write_file(filp); | ||
1767 | if (ret) | ||
1768 | return ret; | ||
1769 | |||
1770 | f2fs_update_time(F2FS_I_SB(inode), REQ_TIME); | 1765 | f2fs_update_time(F2FS_I_SB(inode), REQ_TIME); |
1771 | ret = fscrypt_process_policy(inode, &policy); | ||
1772 | 1766 | ||
1773 | mnt_drop_write_file(filp); | 1767 | return fscrypt_process_policy(filp, &policy); |
1774 | return ret; | ||
1775 | } | 1768 | } |
1776 | 1769 | ||
1777 | static int f2fs_ioc_get_encryption_policy(struct file *filp, unsigned long arg) | 1770 | static int f2fs_ioc_get_encryption_policy(struct file *filp, unsigned long arg) |
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index f394aff59c36..3988b43c2f5a 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -530,13 +530,13 @@ void fuse_read_fill(struct fuse_req *req, struct file *file, loff_t pos, | |||
530 | req->out.args[0].size = count; | 530 | req->out.args[0].size = count; |
531 | } | 531 | } |
532 | 532 | ||
533 | static void fuse_release_user_pages(struct fuse_req *req, int write) | 533 | static void fuse_release_user_pages(struct fuse_req *req, bool should_dirty) |
534 | { | 534 | { |
535 | unsigned i; | 535 | unsigned i; |
536 | 536 | ||
537 | for (i = 0; i < req->num_pages; i++) { | 537 | for (i = 0; i < req->num_pages; i++) { |
538 | struct page *page = req->pages[i]; | 538 | struct page *page = req->pages[i]; |
539 | if (write) | 539 | if (should_dirty) |
540 | set_page_dirty_lock(page); | 540 | set_page_dirty_lock(page); |
541 | put_page(page); | 541 | put_page(page); |
542 | } | 542 | } |
@@ -1320,6 +1320,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, | |||
1320 | loff_t *ppos, int flags) | 1320 | loff_t *ppos, int flags) |
1321 | { | 1321 | { |
1322 | int write = flags & FUSE_DIO_WRITE; | 1322 | int write = flags & FUSE_DIO_WRITE; |
1323 | bool should_dirty = !write && iter_is_iovec(iter); | ||
1323 | int cuse = flags & FUSE_DIO_CUSE; | 1324 | int cuse = flags & FUSE_DIO_CUSE; |
1324 | struct file *file = io->file; | 1325 | struct file *file = io->file; |
1325 | struct inode *inode = file->f_mapping->host; | 1326 | struct inode *inode = file->f_mapping->host; |
@@ -1363,7 +1364,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, | |||
1363 | nres = fuse_send_read(req, io, pos, nbytes, owner); | 1364 | nres = fuse_send_read(req, io, pos, nbytes, owner); |
1364 | 1365 | ||
1365 | if (!io->async) | 1366 | if (!io->async) |
1366 | fuse_release_user_pages(req, !write); | 1367 | fuse_release_user_pages(req, should_dirty); |
1367 | if (req->out.h.error) { | 1368 | if (req->out.h.error) { |
1368 | err = req->out.h.error; | 1369 | err = req->out.h.error; |
1369 | break; | 1370 | break; |
diff --git a/fs/iomap.c b/fs/iomap.c index 0342254646e3..706270f21b35 100644 --- a/fs/iomap.c +++ b/fs/iomap.c | |||
@@ -428,9 +428,12 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi, | |||
428 | break; | 428 | break; |
429 | } | 429 | } |
430 | 430 | ||
431 | if (iomap->flags & IOMAP_F_MERGED) | ||
432 | flags |= FIEMAP_EXTENT_MERGED; | ||
433 | |||
431 | return fiemap_fill_next_extent(fi, iomap->offset, | 434 | return fiemap_fill_next_extent(fi, iomap->offset, |
432 | iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0, | 435 | iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0, |
433 | iomap->length, flags | FIEMAP_EXTENT_MERGED); | 436 | iomap->length, flags); |
434 | 437 | ||
435 | } | 438 | } |
436 | 439 | ||
diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c index e1574008adc9..2bcb86e6e6ca 100644 --- a/fs/kernfs/file.c +++ b/fs/kernfs/file.c | |||
@@ -840,21 +840,35 @@ repeat: | |||
840 | mutex_lock(&kernfs_mutex); | 840 | mutex_lock(&kernfs_mutex); |
841 | 841 | ||
842 | list_for_each_entry(info, &kernfs_root(kn)->supers, node) { | 842 | list_for_each_entry(info, &kernfs_root(kn)->supers, node) { |
843 | struct kernfs_node *parent; | ||
843 | struct inode *inode; | 844 | struct inode *inode; |
844 | struct dentry *dentry; | ||
845 | 845 | ||
846 | /* | ||
847 | * We want fsnotify_modify() on @kn but as the | ||
848 | * modifications aren't originating from userland don't | ||
849 | * have the matching @file available. Look up the inodes | ||
850 | * and generate the events manually. | ||
851 | */ | ||
846 | inode = ilookup(info->sb, kn->ino); | 852 | inode = ilookup(info->sb, kn->ino); |
847 | if (!inode) | 853 | if (!inode) |
848 | continue; | 854 | continue; |
849 | 855 | ||
850 | dentry = d_find_any_alias(inode); | 856 | parent = kernfs_get_parent(kn); |
851 | if (dentry) { | 857 | if (parent) { |
852 | fsnotify_parent(NULL, dentry, FS_MODIFY); | 858 | struct inode *p_inode; |
853 | fsnotify(inode, FS_MODIFY, inode, FSNOTIFY_EVENT_INODE, | 859 | |
854 | NULL, 0); | 860 | p_inode = ilookup(info->sb, parent->ino); |
855 | dput(dentry); | 861 | if (p_inode) { |
862 | fsnotify(p_inode, FS_MODIFY | FS_EVENT_ON_CHILD, | ||
863 | inode, FSNOTIFY_EVENT_INODE, kn->name, 0); | ||
864 | iput(p_inode); | ||
865 | } | ||
866 | |||
867 | kernfs_put(parent); | ||
856 | } | 868 | } |
857 | 869 | ||
870 | fsnotify(inode, FS_MODIFY, inode, FSNOTIFY_EVENT_INODE, | ||
871 | kn->name, 0); | ||
858 | iput(inode); | 872 | iput(inode); |
859 | } | 873 | } |
860 | 874 | ||
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index f55a4e756047..217847679f0e 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c | |||
@@ -346,7 +346,7 @@ static void bl_write_cleanup(struct work_struct *work) | |||
346 | PAGE_SIZE - 1) & (loff_t)PAGE_MASK; | 346 | PAGE_SIZE - 1) & (loff_t)PAGE_MASK; |
347 | 347 | ||
348 | ext_tree_mark_written(bl, start >> SECTOR_SHIFT, | 348 | ext_tree_mark_written(bl, start >> SECTOR_SHIFT, |
349 | (end - start) >> SECTOR_SHIFT); | 349 | (end - start) >> SECTOR_SHIFT, end); |
350 | } | 350 | } |
351 | 351 | ||
352 | pnfs_ld_write_done(hdr); | 352 | pnfs_ld_write_done(hdr); |
diff --git a/fs/nfs/blocklayout/blocklayout.h b/fs/nfs/blocklayout/blocklayout.h index 18e6fd0b9506..efc007f00742 100644 --- a/fs/nfs/blocklayout/blocklayout.h +++ b/fs/nfs/blocklayout/blocklayout.h | |||
@@ -141,6 +141,7 @@ struct pnfs_block_layout { | |||
141 | struct rb_root bl_ext_ro; | 141 | struct rb_root bl_ext_ro; |
142 | spinlock_t bl_ext_lock; /* Protects list manipulation */ | 142 | spinlock_t bl_ext_lock; /* Protects list manipulation */ |
143 | bool bl_scsi_layout; | 143 | bool bl_scsi_layout; |
144 | u64 bl_lwb; | ||
144 | }; | 145 | }; |
145 | 146 | ||
146 | static inline struct pnfs_block_layout * | 147 | static inline struct pnfs_block_layout * |
@@ -182,7 +183,7 @@ int ext_tree_insert(struct pnfs_block_layout *bl, | |||
182 | int ext_tree_remove(struct pnfs_block_layout *bl, bool rw, sector_t start, | 183 | int ext_tree_remove(struct pnfs_block_layout *bl, bool rw, sector_t start, |
183 | sector_t end); | 184 | sector_t end); |
184 | int ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start, | 185 | int ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start, |
185 | sector_t len); | 186 | sector_t len, u64 lwb); |
186 | bool ext_tree_lookup(struct pnfs_block_layout *bl, sector_t isect, | 187 | bool ext_tree_lookup(struct pnfs_block_layout *bl, sector_t isect, |
187 | struct pnfs_block_extent *ret, bool rw); | 188 | struct pnfs_block_extent *ret, bool rw); |
188 | int ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg); | 189 | int ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg); |
diff --git a/fs/nfs/blocklayout/extent_tree.c b/fs/nfs/blocklayout/extent_tree.c index 992bcb19c11e..c85fbfd2d0d9 100644 --- a/fs/nfs/blocklayout/extent_tree.c +++ b/fs/nfs/blocklayout/extent_tree.c | |||
@@ -402,7 +402,7 @@ ext_tree_split(struct rb_root *root, struct pnfs_block_extent *be, | |||
402 | 402 | ||
403 | int | 403 | int |
404 | ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start, | 404 | ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start, |
405 | sector_t len) | 405 | sector_t len, u64 lwb) |
406 | { | 406 | { |
407 | struct rb_root *root = &bl->bl_ext_rw; | 407 | struct rb_root *root = &bl->bl_ext_rw; |
408 | sector_t end = start + len; | 408 | sector_t end = start + len; |
@@ -471,6 +471,8 @@ ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start, | |||
471 | } | 471 | } |
472 | } | 472 | } |
473 | out: | 473 | out: |
474 | if (bl->bl_lwb < lwb) | ||
475 | bl->bl_lwb = lwb; | ||
474 | spin_unlock(&bl->bl_ext_lock); | 476 | spin_unlock(&bl->bl_ext_lock); |
475 | 477 | ||
476 | __ext_put_deviceids(&tmp); | 478 | __ext_put_deviceids(&tmp); |
@@ -518,7 +520,7 @@ static __be32 *encode_scsi_range(struct pnfs_block_extent *be, __be32 *p) | |||
518 | } | 520 | } |
519 | 521 | ||
520 | static int ext_tree_encode_commit(struct pnfs_block_layout *bl, __be32 *p, | 522 | static int ext_tree_encode_commit(struct pnfs_block_layout *bl, __be32 *p, |
521 | size_t buffer_size, size_t *count) | 523 | size_t buffer_size, size_t *count, __u64 *lastbyte) |
522 | { | 524 | { |
523 | struct pnfs_block_extent *be; | 525 | struct pnfs_block_extent *be; |
524 | int ret = 0; | 526 | int ret = 0; |
@@ -542,6 +544,8 @@ static int ext_tree_encode_commit(struct pnfs_block_layout *bl, __be32 *p, | |||
542 | p = encode_block_extent(be, p); | 544 | p = encode_block_extent(be, p); |
543 | be->be_tag = EXTENT_COMMITTING; | 545 | be->be_tag = EXTENT_COMMITTING; |
544 | } | 546 | } |
547 | *lastbyte = bl->bl_lwb - 1; | ||
548 | bl->bl_lwb = 0; | ||
545 | spin_unlock(&bl->bl_ext_lock); | 549 | spin_unlock(&bl->bl_ext_lock); |
546 | 550 | ||
547 | return ret; | 551 | return ret; |
@@ -564,7 +568,7 @@ ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg) | |||
564 | arg->layoutupdate_pages = &arg->layoutupdate_page; | 568 | arg->layoutupdate_pages = &arg->layoutupdate_page; |
565 | 569 | ||
566 | retry: | 570 | retry: |
567 | ret = ext_tree_encode_commit(bl, start_p + 1, buffer_size, &count); | 571 | ret = ext_tree_encode_commit(bl, start_p + 1, buffer_size, &count, &arg->lastbytewritten); |
568 | if (unlikely(ret)) { | 572 | if (unlikely(ret)) { |
569 | ext_tree_free_commitdata(arg, buffer_size); | 573 | ext_tree_free_commitdata(arg, buffer_size); |
570 | 574 | ||
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index a7f2e6e33305..52a28311e2a4 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c | |||
@@ -275,6 +275,7 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, | |||
275 | err_socks: | 275 | err_socks: |
276 | svc_rpcb_cleanup(serv, net); | 276 | svc_rpcb_cleanup(serv, net); |
277 | err_bind: | 277 | err_bind: |
278 | nn->cb_users[minorversion]--; | ||
278 | dprintk("NFS: Couldn't create callback socket: err = %d; " | 279 | dprintk("NFS: Couldn't create callback socket: err = %d; " |
279 | "net = %p\n", ret, net); | 280 | "net = %p\n", ret, net); |
280 | return ret; | 281 | return ret; |
diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c index c92a75e066a6..f953ef6b2f2e 100644 --- a/fs/nfs/callback_proc.c +++ b/fs/nfs/callback_proc.c | |||
@@ -454,11 +454,8 @@ static bool referring_call_exists(struct nfs_client *clp, | |||
454 | ((u32 *)&rclist->rcl_sessionid.data)[3], | 454 | ((u32 *)&rclist->rcl_sessionid.data)[3], |
455 | ref->rc_sequenceid, ref->rc_slotid); | 455 | ref->rc_sequenceid, ref->rc_slotid); |
456 | 456 | ||
457 | spin_lock(&tbl->slot_tbl_lock); | 457 | status = nfs4_slot_wait_on_seqid(tbl, ref->rc_slotid, |
458 | status = (test_bit(ref->rc_slotid, tbl->used_slots) && | 458 | ref->rc_sequenceid, HZ >> 1) < 0; |
459 | tbl->slots[ref->rc_slotid].seq_nr == | ||
460 | ref->rc_sequenceid); | ||
461 | spin_unlock(&tbl->slot_tbl_lock); | ||
462 | if (status) | 459 | if (status) |
463 | goto out; | 460 | goto out; |
464 | } | 461 | } |
@@ -487,7 +484,6 @@ __be32 nfs4_callback_sequence(struct cb_sequenceargs *args, | |||
487 | goto out; | 484 | goto out; |
488 | 485 | ||
489 | tbl = &clp->cl_session->bc_slot_table; | 486 | tbl = &clp->cl_session->bc_slot_table; |
490 | slot = tbl->slots + args->csa_slotid; | ||
491 | 487 | ||
492 | /* Set up res before grabbing the spinlock */ | 488 | /* Set up res before grabbing the spinlock */ |
493 | memcpy(&res->csr_sessionid, &args->csa_sessionid, | 489 | memcpy(&res->csr_sessionid, &args->csa_sessionid, |
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 003ebce4bbc4..1e106780a237 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -426,7 +426,7 @@ EXPORT_SYMBOL_GPL(nfs_mark_client_ready); | |||
426 | * Initialise the timeout values for a connection | 426 | * Initialise the timeout values for a connection |
427 | */ | 427 | */ |
428 | void nfs_init_timeout_values(struct rpc_timeout *to, int proto, | 428 | void nfs_init_timeout_values(struct rpc_timeout *to, int proto, |
429 | unsigned int timeo, unsigned int retrans) | 429 | int timeo, int retrans) |
430 | { | 430 | { |
431 | to->to_initval = timeo * HZ / 10; | 431 | to->to_initval = timeo * HZ / 10; |
432 | to->to_retries = retrans; | 432 | to->to_retries = retrans; |
@@ -434,9 +434,9 @@ void nfs_init_timeout_values(struct rpc_timeout *to, int proto, | |||
434 | switch (proto) { | 434 | switch (proto) { |
435 | case XPRT_TRANSPORT_TCP: | 435 | case XPRT_TRANSPORT_TCP: |
436 | case XPRT_TRANSPORT_RDMA: | 436 | case XPRT_TRANSPORT_RDMA: |
437 | if (to->to_retries == 0) | 437 | if (retrans == NFS_UNSPEC_RETRANS) |
438 | to->to_retries = NFS_DEF_TCP_RETRANS; | 438 | to->to_retries = NFS_DEF_TCP_RETRANS; |
439 | if (to->to_initval == 0) | 439 | if (timeo == NFS_UNSPEC_TIMEO || to->to_retries == 0) |
440 | to->to_initval = NFS_DEF_TCP_TIMEO * HZ / 10; | 440 | to->to_initval = NFS_DEF_TCP_TIMEO * HZ / 10; |
441 | if (to->to_initval > NFS_MAX_TCP_TIMEOUT) | 441 | if (to->to_initval > NFS_MAX_TCP_TIMEOUT) |
442 | to->to_initval = NFS_MAX_TCP_TIMEOUT; | 442 | to->to_initval = NFS_MAX_TCP_TIMEOUT; |
@@ -449,9 +449,9 @@ void nfs_init_timeout_values(struct rpc_timeout *to, int proto, | |||
449 | to->to_exponential = 0; | 449 | to->to_exponential = 0; |
450 | break; | 450 | break; |
451 | case XPRT_TRANSPORT_UDP: | 451 | case XPRT_TRANSPORT_UDP: |
452 | if (to->to_retries == 0) | 452 | if (retrans == NFS_UNSPEC_RETRANS) |
453 | to->to_retries = NFS_DEF_UDP_RETRANS; | 453 | to->to_retries = NFS_DEF_UDP_RETRANS; |
454 | if (!to->to_initval) | 454 | if (timeo == NFS_UNSPEC_TIMEO || to->to_initval == 0) |
455 | to->to_initval = NFS_DEF_UDP_TIMEO * HZ / 10; | 455 | to->to_initval = NFS_DEF_UDP_TIMEO * HZ / 10; |
456 | if (to->to_initval > NFS_MAX_UDP_TIMEOUT) | 456 | if (to->to_initval > NFS_MAX_UDP_TIMEOUT) |
457 | to->to_initval = NFS_MAX_UDP_TIMEOUT; | 457 | to->to_initval = NFS_MAX_UDP_TIMEOUT; |
diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index e6206eaf2bdf..51b51369704c 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c | |||
@@ -37,6 +37,7 @@ ff_layout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags) | |||
37 | if (ffl) { | 37 | if (ffl) { |
38 | INIT_LIST_HEAD(&ffl->error_list); | 38 | INIT_LIST_HEAD(&ffl->error_list); |
39 | INIT_LIST_HEAD(&ffl->mirrors); | 39 | INIT_LIST_HEAD(&ffl->mirrors); |
40 | ffl->last_report_time = ktime_get(); | ||
40 | return &ffl->generic_hdr; | 41 | return &ffl->generic_hdr; |
41 | } else | 42 | } else |
42 | return NULL; | 43 | return NULL; |
@@ -640,19 +641,18 @@ nfs4_ff_layoutstat_start_io(struct nfs4_ff_layout_mirror *mirror, | |||
640 | { | 641 | { |
641 | static const ktime_t notime = {0}; | 642 | static const ktime_t notime = {0}; |
642 | s64 report_interval = FF_LAYOUTSTATS_REPORT_INTERVAL; | 643 | s64 report_interval = FF_LAYOUTSTATS_REPORT_INTERVAL; |
644 | struct nfs4_flexfile_layout *ffl = FF_LAYOUT_FROM_HDR(mirror->layout); | ||
643 | 645 | ||
644 | nfs4_ff_start_busy_timer(&layoutstat->busy_timer, now); | 646 | nfs4_ff_start_busy_timer(&layoutstat->busy_timer, now); |
645 | if (ktime_equal(mirror->start_time, notime)) | 647 | if (ktime_equal(mirror->start_time, notime)) |
646 | mirror->start_time = now; | 648 | mirror->start_time = now; |
647 | if (ktime_equal(mirror->last_report_time, notime)) | ||
648 | mirror->last_report_time = now; | ||
649 | if (mirror->report_interval != 0) | 649 | if (mirror->report_interval != 0) |
650 | report_interval = (s64)mirror->report_interval * 1000LL; | 650 | report_interval = (s64)mirror->report_interval * 1000LL; |
651 | else if (layoutstats_timer != 0) | 651 | else if (layoutstats_timer != 0) |
652 | report_interval = (s64)layoutstats_timer * 1000LL; | 652 | report_interval = (s64)layoutstats_timer * 1000LL; |
653 | if (ktime_to_ms(ktime_sub(now, mirror->last_report_time)) >= | 653 | if (ktime_to_ms(ktime_sub(now, ffl->last_report_time)) >= |
654 | report_interval) { | 654 | report_interval) { |
655 | mirror->last_report_time = now; | 655 | ffl->last_report_time = now; |
656 | return true; | 656 | return true; |
657 | } | 657 | } |
658 | 658 | ||
@@ -806,11 +806,14 @@ ff_layout_choose_best_ds_for_read(struct pnfs_layout_segment *lseg, | |||
806 | { | 806 | { |
807 | struct nfs4_ff_layout_segment *fls = FF_LAYOUT_LSEG(lseg); | 807 | struct nfs4_ff_layout_segment *fls = FF_LAYOUT_LSEG(lseg); |
808 | struct nfs4_pnfs_ds *ds; | 808 | struct nfs4_pnfs_ds *ds; |
809 | bool fail_return = false; | ||
809 | int idx; | 810 | int idx; |
810 | 811 | ||
811 | /* mirrors are sorted by efficiency */ | 812 | /* mirrors are sorted by efficiency */ |
812 | for (idx = start_idx; idx < fls->mirror_array_cnt; idx++) { | 813 | for (idx = start_idx; idx < fls->mirror_array_cnt; idx++) { |
813 | ds = nfs4_ff_layout_prepare_ds(lseg, idx, false); | 814 | if (idx+1 == fls->mirror_array_cnt) |
815 | fail_return = true; | ||
816 | ds = nfs4_ff_layout_prepare_ds(lseg, idx, fail_return); | ||
814 | if (ds) { | 817 | if (ds) { |
815 | *best_idx = idx; | 818 | *best_idx = idx; |
816 | return ds; | 819 | return ds; |
@@ -859,6 +862,7 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio, | |||
859 | struct nfs4_pnfs_ds *ds; | 862 | struct nfs4_pnfs_ds *ds; |
860 | int ds_idx; | 863 | int ds_idx; |
861 | 864 | ||
865 | retry: | ||
862 | /* Use full layout for now */ | 866 | /* Use full layout for now */ |
863 | if (!pgio->pg_lseg) | 867 | if (!pgio->pg_lseg) |
864 | ff_layout_pg_get_read(pgio, req, false); | 868 | ff_layout_pg_get_read(pgio, req, false); |
@@ -871,10 +875,13 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio, | |||
871 | 875 | ||
872 | ds = ff_layout_choose_best_ds_for_read(pgio->pg_lseg, 0, &ds_idx); | 876 | ds = ff_layout_choose_best_ds_for_read(pgio->pg_lseg, 0, &ds_idx); |
873 | if (!ds) { | 877 | if (!ds) { |
874 | if (ff_layout_no_fallback_to_mds(pgio->pg_lseg)) | 878 | if (!ff_layout_no_fallback_to_mds(pgio->pg_lseg)) |
875 | goto out_pnfs; | ||
876 | else | ||
877 | goto out_mds; | 879 | goto out_mds; |
880 | pnfs_put_lseg(pgio->pg_lseg); | ||
881 | pgio->pg_lseg = NULL; | ||
882 | /* Sleep for 1 second before retrying */ | ||
883 | ssleep(1); | ||
884 | goto retry; | ||
878 | } | 885 | } |
879 | 886 | ||
880 | mirror = FF_LAYOUT_COMP(pgio->pg_lseg, ds_idx); | 887 | mirror = FF_LAYOUT_COMP(pgio->pg_lseg, ds_idx); |
@@ -890,12 +897,6 @@ out_mds: | |||
890 | pnfs_put_lseg(pgio->pg_lseg); | 897 | pnfs_put_lseg(pgio->pg_lseg); |
891 | pgio->pg_lseg = NULL; | 898 | pgio->pg_lseg = NULL; |
892 | nfs_pageio_reset_read_mds(pgio); | 899 | nfs_pageio_reset_read_mds(pgio); |
893 | return; | ||
894 | |||
895 | out_pnfs: | ||
896 | pnfs_set_lo_fail(pgio->pg_lseg); | ||
897 | pnfs_put_lseg(pgio->pg_lseg); | ||
898 | pgio->pg_lseg = NULL; | ||
899 | } | 900 | } |
900 | 901 | ||
901 | static void | 902 | static void |
@@ -909,6 +910,7 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio, | |||
909 | int i; | 910 | int i; |
910 | int status; | 911 | int status; |
911 | 912 | ||
913 | retry: | ||
912 | if (!pgio->pg_lseg) { | 914 | if (!pgio->pg_lseg) { |
913 | pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, | 915 | pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, |
914 | req->wb_context, | 916 | req->wb_context, |
@@ -940,10 +942,13 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio, | |||
940 | for (i = 0; i < pgio->pg_mirror_count; i++) { | 942 | for (i = 0; i < pgio->pg_mirror_count; i++) { |
941 | ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, i, true); | 943 | ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, i, true); |
942 | if (!ds) { | 944 | if (!ds) { |
943 | if (ff_layout_no_fallback_to_mds(pgio->pg_lseg)) | 945 | if (!ff_layout_no_fallback_to_mds(pgio->pg_lseg)) |
944 | goto out_pnfs; | ||
945 | else | ||
946 | goto out_mds; | 946 | goto out_mds; |
947 | pnfs_put_lseg(pgio->pg_lseg); | ||
948 | pgio->pg_lseg = NULL; | ||
949 | /* Sleep for 1 second before retrying */ | ||
950 | ssleep(1); | ||
951 | goto retry; | ||
947 | } | 952 | } |
948 | pgm = &pgio->pg_mirrors[i]; | 953 | pgm = &pgio->pg_mirrors[i]; |
949 | mirror = FF_LAYOUT_COMP(pgio->pg_lseg, i); | 954 | mirror = FF_LAYOUT_COMP(pgio->pg_lseg, i); |
@@ -956,12 +961,6 @@ out_mds: | |||
956 | pnfs_put_lseg(pgio->pg_lseg); | 961 | pnfs_put_lseg(pgio->pg_lseg); |
957 | pgio->pg_lseg = NULL; | 962 | pgio->pg_lseg = NULL; |
958 | nfs_pageio_reset_write_mds(pgio); | 963 | nfs_pageio_reset_write_mds(pgio); |
959 | return; | ||
960 | |||
961 | out_pnfs: | ||
962 | pnfs_set_lo_fail(pgio->pg_lseg); | ||
963 | pnfs_put_lseg(pgio->pg_lseg); | ||
964 | pgio->pg_lseg = NULL; | ||
965 | } | 964 | } |
966 | 965 | ||
967 | static unsigned int | 966 | static unsigned int |
diff --git a/fs/nfs/flexfilelayout/flexfilelayout.h b/fs/nfs/flexfilelayout/flexfilelayout.h index 1bcdb15d0c41..3ee0c9fcea76 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.h +++ b/fs/nfs/flexfilelayout/flexfilelayout.h | |||
@@ -84,7 +84,6 @@ struct nfs4_ff_layout_mirror { | |||
84 | struct nfs4_ff_layoutstat read_stat; | 84 | struct nfs4_ff_layoutstat read_stat; |
85 | struct nfs4_ff_layoutstat write_stat; | 85 | struct nfs4_ff_layoutstat write_stat; |
86 | ktime_t start_time; | 86 | ktime_t start_time; |
87 | ktime_t last_report_time; | ||
88 | u32 report_interval; | 87 | u32 report_interval; |
89 | }; | 88 | }; |
90 | 89 | ||
@@ -101,6 +100,7 @@ struct nfs4_flexfile_layout { | |||
101 | struct pnfs_ds_commit_info commit_info; | 100 | struct pnfs_ds_commit_info commit_info; |
102 | struct list_head mirrors; | 101 | struct list_head mirrors; |
103 | struct list_head error_list; /* nfs4_ff_layout_ds_err */ | 102 | struct list_head error_list; /* nfs4_ff_layout_ds_err */ |
103 | ktime_t last_report_time; /* Layoutstat report times */ | ||
104 | }; | 104 | }; |
105 | 105 | ||
106 | static inline struct nfs4_flexfile_layout * | 106 | static inline struct nfs4_flexfile_layout * |
diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c index 0aa36be71fce..f7a3f6b05369 100644 --- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c +++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c | |||
@@ -17,8 +17,8 @@ | |||
17 | 17 | ||
18 | #define NFSDBG_FACILITY NFSDBG_PNFS_LD | 18 | #define NFSDBG_FACILITY NFSDBG_PNFS_LD |
19 | 19 | ||
20 | static unsigned int dataserver_timeo = NFS4_DEF_DS_TIMEO; | 20 | static unsigned int dataserver_timeo = NFS_DEF_TCP_RETRANS; |
21 | static unsigned int dataserver_retrans = NFS4_DEF_DS_RETRANS; | 21 | static unsigned int dataserver_retrans; |
22 | 22 | ||
23 | void nfs4_ff_layout_put_deviceid(struct nfs4_ff_layout_ds *mirror_ds) | 23 | void nfs4_ff_layout_put_deviceid(struct nfs4_ff_layout_ds *mirror_ds) |
24 | { | 24 | { |
@@ -379,7 +379,7 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx, | |||
379 | 379 | ||
380 | devid = &mirror->mirror_ds->id_node; | 380 | devid = &mirror->mirror_ds->id_node; |
381 | if (ff_layout_test_devid_unavailable(devid)) | 381 | if (ff_layout_test_devid_unavailable(devid)) |
382 | goto out; | 382 | goto out_fail; |
383 | 383 | ||
384 | ds = mirror->mirror_ds->ds; | 384 | ds = mirror->mirror_ds->ds; |
385 | /* matching smp_wmb() in _nfs4_pnfs_v3/4_ds_connect */ | 385 | /* matching smp_wmb() in _nfs4_pnfs_v3/4_ds_connect */ |
@@ -405,15 +405,16 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx, | |||
405 | mirror->mirror_ds->ds_versions[0].rsize = max_payload; | 405 | mirror->mirror_ds->ds_versions[0].rsize = max_payload; |
406 | if (mirror->mirror_ds->ds_versions[0].wsize > max_payload) | 406 | if (mirror->mirror_ds->ds_versions[0].wsize > max_payload) |
407 | mirror->mirror_ds->ds_versions[0].wsize = max_payload; | 407 | mirror->mirror_ds->ds_versions[0].wsize = max_payload; |
408 | } else { | 408 | goto out; |
409 | ff_layout_track_ds_error(FF_LAYOUT_FROM_HDR(lseg->pls_layout), | ||
410 | mirror, lseg->pls_range.offset, | ||
411 | lseg->pls_range.length, NFS4ERR_NXIO, | ||
412 | OP_ILLEGAL, GFP_NOIO); | ||
413 | if (fail_return || !ff_layout_has_available_ds(lseg)) | ||
414 | pnfs_error_mark_layout_for_return(ino, lseg); | ||
415 | ds = NULL; | ||
416 | } | 409 | } |
410 | ff_layout_track_ds_error(FF_LAYOUT_FROM_HDR(lseg->pls_layout), | ||
411 | mirror, lseg->pls_range.offset, | ||
412 | lseg->pls_range.length, NFS4ERR_NXIO, | ||
413 | OP_ILLEGAL, GFP_NOIO); | ||
414 | out_fail: | ||
415 | if (fail_return || !ff_layout_has_available_ds(lseg)) | ||
416 | pnfs_error_mark_layout_for_return(ino, lseg); | ||
417 | ds = NULL; | ||
417 | out: | 418 | out: |
418 | return ds; | 419 | return ds; |
419 | } | 420 | } |
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 7ce5e023c3c3..74935a19e4bf 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
@@ -58,6 +58,9 @@ struct nfs_clone_mount { | |||
58 | */ | 58 | */ |
59 | #define NFS_UNSPEC_PORT (-1) | 59 | #define NFS_UNSPEC_PORT (-1) |
60 | 60 | ||
61 | #define NFS_UNSPEC_RETRANS (UINT_MAX) | ||
62 | #define NFS_UNSPEC_TIMEO (UINT_MAX) | ||
63 | |||
61 | /* | 64 | /* |
62 | * Maximum number of pages that readdir can use for creating | 65 | * Maximum number of pages that readdir can use for creating |
63 | * a vmapped array of pages. | 66 | * a vmapped array of pages. |
@@ -156,7 +159,7 @@ struct nfs_client *nfs_get_client(const struct nfs_client_initdata *, | |||
156 | int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *, struct nfs_fattr *); | 159 | int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *, struct nfs_fattr *); |
157 | void nfs_server_insert_lists(struct nfs_server *); | 160 | void nfs_server_insert_lists(struct nfs_server *); |
158 | void nfs_server_remove_lists(struct nfs_server *); | 161 | void nfs_server_remove_lists(struct nfs_server *); |
159 | void nfs_init_timeout_values(struct rpc_timeout *, int, unsigned int, unsigned int); | 162 | void nfs_init_timeout_values(struct rpc_timeout *to, int proto, int timeo, int retrans); |
160 | int nfs_init_server_rpcclient(struct nfs_server *, const struct rpc_timeout *t, | 163 | int nfs_init_server_rpcclient(struct nfs_server *, const struct rpc_timeout *t, |
161 | rpc_authflavor_t); | 164 | rpc_authflavor_t); |
162 | struct nfs_server *nfs_alloc_server(void); | 165 | struct nfs_server *nfs_alloc_server(void); |
diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index 6f4752734804..64b43b4ad9dd 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c | |||
@@ -318,10 +318,22 @@ static void | |||
318 | nfs42_layoutstat_prepare(struct rpc_task *task, void *calldata) | 318 | nfs42_layoutstat_prepare(struct rpc_task *task, void *calldata) |
319 | { | 319 | { |
320 | struct nfs42_layoutstat_data *data = calldata; | 320 | struct nfs42_layoutstat_data *data = calldata; |
321 | struct nfs_server *server = NFS_SERVER(data->args.inode); | 321 | struct inode *inode = data->inode; |
322 | struct nfs_server *server = NFS_SERVER(inode); | ||
323 | struct pnfs_layout_hdr *lo; | ||
322 | 324 | ||
325 | spin_lock(&inode->i_lock); | ||
326 | lo = NFS_I(inode)->layout; | ||
327 | if (!pnfs_layout_is_valid(lo)) { | ||
328 | spin_unlock(&inode->i_lock); | ||
329 | rpc_exit(task, 0); | ||
330 | return; | ||
331 | } | ||
332 | nfs4_stateid_copy(&data->args.stateid, &lo->plh_stateid); | ||
333 | spin_unlock(&inode->i_lock); | ||
323 | nfs41_setup_sequence(nfs4_get_session(server), &data->args.seq_args, | 334 | nfs41_setup_sequence(nfs4_get_session(server), &data->args.seq_args, |
324 | &data->res.seq_res, task); | 335 | &data->res.seq_res, task); |
336 | |||
325 | } | 337 | } |
326 | 338 | ||
327 | static void | 339 | static void |
@@ -341,11 +353,11 @@ nfs42_layoutstat_done(struct rpc_task *task, void *calldata) | |||
341 | case -NFS4ERR_ADMIN_REVOKED: | 353 | case -NFS4ERR_ADMIN_REVOKED: |
342 | case -NFS4ERR_DELEG_REVOKED: | 354 | case -NFS4ERR_DELEG_REVOKED: |
343 | case -NFS4ERR_STALE_STATEID: | 355 | case -NFS4ERR_STALE_STATEID: |
344 | case -NFS4ERR_OLD_STATEID: | ||
345 | case -NFS4ERR_BAD_STATEID: | 356 | case -NFS4ERR_BAD_STATEID: |
346 | spin_lock(&inode->i_lock); | 357 | spin_lock(&inode->i_lock); |
347 | lo = NFS_I(inode)->layout; | 358 | lo = NFS_I(inode)->layout; |
348 | if (lo && nfs4_stateid_match(&data->args.stateid, | 359 | if (pnfs_layout_is_valid(lo) && |
360 | nfs4_stateid_match(&data->args.stateid, | ||
349 | &lo->plh_stateid)) { | 361 | &lo->plh_stateid)) { |
350 | LIST_HEAD(head); | 362 | LIST_HEAD(head); |
351 | 363 | ||
@@ -359,11 +371,23 @@ nfs42_layoutstat_done(struct rpc_task *task, void *calldata) | |||
359 | } else | 371 | } else |
360 | spin_unlock(&inode->i_lock); | 372 | spin_unlock(&inode->i_lock); |
361 | break; | 373 | break; |
374 | case -NFS4ERR_OLD_STATEID: | ||
375 | spin_lock(&inode->i_lock); | ||
376 | lo = NFS_I(inode)->layout; | ||
377 | if (pnfs_layout_is_valid(lo) && | ||
378 | nfs4_stateid_match_other(&data->args.stateid, | ||
379 | &lo->plh_stateid)) { | ||
380 | /* Do we need to delay before resending? */ | ||
381 | if (!nfs4_stateid_is_newer(&lo->plh_stateid, | ||
382 | &data->args.stateid)) | ||
383 | rpc_delay(task, HZ); | ||
384 | rpc_restart_call_prepare(task); | ||
385 | } | ||
386 | spin_unlock(&inode->i_lock); | ||
387 | break; | ||
362 | case -ENOTSUPP: | 388 | case -ENOTSUPP: |
363 | case -EOPNOTSUPP: | 389 | case -EOPNOTSUPP: |
364 | NFS_SERVER(inode)->caps &= ~NFS_CAP_LAYOUTSTATS; | 390 | NFS_SERVER(inode)->caps &= ~NFS_CAP_LAYOUTSTATS; |
365 | default: | ||
366 | break; | ||
367 | } | 391 | } |
368 | 392 | ||
369 | dprintk("%s server returns %d\n", __func__, task->tk_status); | 393 | dprintk("%s server returns %d\n", __func__, task->tk_status); |
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 8d7d08d4f95f..cd3b7cfdde16 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c | |||
@@ -817,6 +817,11 @@ static int nfs4_set_client(struct nfs_server *server, | |||
817 | goto error; | 817 | goto error; |
818 | } | 818 | } |
819 | 819 | ||
820 | if (server->nfs_client == clp) { | ||
821 | error = -ELOOP; | ||
822 | goto error; | ||
823 | } | ||
824 | |||
820 | /* | 825 | /* |
821 | * Query for the lease time on clientid setup or renewal | 826 | * Query for the lease time on clientid setup or renewal |
822 | * | 827 | * |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 1949bbd806eb..f5aecaabcb7c 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -634,15 +634,11 @@ out_sleep: | |||
634 | } | 634 | } |
635 | EXPORT_SYMBOL_GPL(nfs40_setup_sequence); | 635 | EXPORT_SYMBOL_GPL(nfs40_setup_sequence); |
636 | 636 | ||
637 | static int nfs40_sequence_done(struct rpc_task *task, | 637 | static void nfs40_sequence_free_slot(struct nfs4_sequence_res *res) |
638 | struct nfs4_sequence_res *res) | ||
639 | { | 638 | { |
640 | struct nfs4_slot *slot = res->sr_slot; | 639 | struct nfs4_slot *slot = res->sr_slot; |
641 | struct nfs4_slot_table *tbl; | 640 | struct nfs4_slot_table *tbl; |
642 | 641 | ||
643 | if (slot == NULL) | ||
644 | goto out; | ||
645 | |||
646 | tbl = slot->table; | 642 | tbl = slot->table; |
647 | spin_lock(&tbl->slot_tbl_lock); | 643 | spin_lock(&tbl->slot_tbl_lock); |
648 | if (!nfs41_wake_and_assign_slot(tbl, slot)) | 644 | if (!nfs41_wake_and_assign_slot(tbl, slot)) |
@@ -650,7 +646,13 @@ static int nfs40_sequence_done(struct rpc_task *task, | |||
650 | spin_unlock(&tbl->slot_tbl_lock); | 646 | spin_unlock(&tbl->slot_tbl_lock); |
651 | 647 | ||
652 | res->sr_slot = NULL; | 648 | res->sr_slot = NULL; |
653 | out: | 649 | } |
650 | |||
651 | static int nfs40_sequence_done(struct rpc_task *task, | ||
652 | struct nfs4_sequence_res *res) | ||
653 | { | ||
654 | if (res->sr_slot != NULL) | ||
655 | nfs40_sequence_free_slot(res); | ||
654 | return 1; | 656 | return 1; |
655 | } | 657 | } |
656 | 658 | ||
@@ -666,6 +668,11 @@ static void nfs41_sequence_free_slot(struct nfs4_sequence_res *res) | |||
666 | tbl = slot->table; | 668 | tbl = slot->table; |
667 | session = tbl->session; | 669 | session = tbl->session; |
668 | 670 | ||
671 | /* Bump the slot sequence number */ | ||
672 | if (slot->seq_done) | ||
673 | slot->seq_nr++; | ||
674 | slot->seq_done = 0; | ||
675 | |||
669 | spin_lock(&tbl->slot_tbl_lock); | 676 | spin_lock(&tbl->slot_tbl_lock); |
670 | /* Be nice to the server: try to ensure that the last transmitted | 677 | /* Be nice to the server: try to ensure that the last transmitted |
671 | * value for highest_user_slotid <= target_highest_slotid | 678 | * value for highest_user_slotid <= target_highest_slotid |
@@ -686,9 +693,12 @@ out_unlock: | |||
686 | res->sr_slot = NULL; | 693 | res->sr_slot = NULL; |
687 | if (send_new_highest_used_slotid) | 694 | if (send_new_highest_used_slotid) |
688 | nfs41_notify_server(session->clp); | 695 | nfs41_notify_server(session->clp); |
696 | if (waitqueue_active(&tbl->slot_waitq)) | ||
697 | wake_up_all(&tbl->slot_waitq); | ||
689 | } | 698 | } |
690 | 699 | ||
691 | int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res) | 700 | static int nfs41_sequence_process(struct rpc_task *task, |
701 | struct nfs4_sequence_res *res) | ||
692 | { | 702 | { |
693 | struct nfs4_session *session; | 703 | struct nfs4_session *session; |
694 | struct nfs4_slot *slot = res->sr_slot; | 704 | struct nfs4_slot *slot = res->sr_slot; |
@@ -714,7 +724,7 @@ int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res) | |||
714 | switch (res->sr_status) { | 724 | switch (res->sr_status) { |
715 | case 0: | 725 | case 0: |
716 | /* Update the slot's sequence and clientid lease timer */ | 726 | /* Update the slot's sequence and clientid lease timer */ |
717 | ++slot->seq_nr; | 727 | slot->seq_done = 1; |
718 | clp = session->clp; | 728 | clp = session->clp; |
719 | do_renew_lease(clp, res->sr_timestamp); | 729 | do_renew_lease(clp, res->sr_timestamp); |
720 | /* Check sequence flags */ | 730 | /* Check sequence flags */ |
@@ -769,16 +779,16 @@ int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res) | |||
769 | goto retry_nowait; | 779 | goto retry_nowait; |
770 | default: | 780 | default: |
771 | /* Just update the slot sequence no. */ | 781 | /* Just update the slot sequence no. */ |
772 | ++slot->seq_nr; | 782 | slot->seq_done = 1; |
773 | } | 783 | } |
774 | out: | 784 | out: |
775 | /* The session may be reset by one of the error handlers. */ | 785 | /* The session may be reset by one of the error handlers. */ |
776 | dprintk("%s: Error %d free the slot \n", __func__, res->sr_status); | 786 | dprintk("%s: Error %d free the slot \n", __func__, res->sr_status); |
777 | nfs41_sequence_free_slot(res); | ||
778 | out_noaction: | 787 | out_noaction: |
779 | return ret; | 788 | return ret; |
780 | retry_nowait: | 789 | retry_nowait: |
781 | if (rpc_restart_call_prepare(task)) { | 790 | if (rpc_restart_call_prepare(task)) { |
791 | nfs41_sequence_free_slot(res); | ||
782 | task->tk_status = 0; | 792 | task->tk_status = 0; |
783 | ret = 0; | 793 | ret = 0; |
784 | } | 794 | } |
@@ -789,8 +799,37 @@ out_retry: | |||
789 | rpc_delay(task, NFS4_POLL_RETRY_MAX); | 799 | rpc_delay(task, NFS4_POLL_RETRY_MAX); |
790 | return 0; | 800 | return 0; |
791 | } | 801 | } |
802 | |||
803 | int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res) | ||
804 | { | ||
805 | if (!nfs41_sequence_process(task, res)) | ||
806 | return 0; | ||
807 | if (res->sr_slot != NULL) | ||
808 | nfs41_sequence_free_slot(res); | ||
809 | return 1; | ||
810 | |||
811 | } | ||
792 | EXPORT_SYMBOL_GPL(nfs41_sequence_done); | 812 | EXPORT_SYMBOL_GPL(nfs41_sequence_done); |
793 | 813 | ||
814 | static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res) | ||
815 | { | ||
816 | if (res->sr_slot == NULL) | ||
817 | return 1; | ||
818 | if (res->sr_slot->table->session != NULL) | ||
819 | return nfs41_sequence_process(task, res); | ||
820 | return nfs40_sequence_done(task, res); | ||
821 | } | ||
822 | |||
823 | static void nfs4_sequence_free_slot(struct nfs4_sequence_res *res) | ||
824 | { | ||
825 | if (res->sr_slot != NULL) { | ||
826 | if (res->sr_slot->table->session != NULL) | ||
827 | nfs41_sequence_free_slot(res); | ||
828 | else | ||
829 | nfs40_sequence_free_slot(res); | ||
830 | } | ||
831 | } | ||
832 | |||
794 | int nfs4_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res) | 833 | int nfs4_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res) |
795 | { | 834 | { |
796 | if (res->sr_slot == NULL) | 835 | if (res->sr_slot == NULL) |
@@ -920,6 +959,17 @@ static int nfs4_setup_sequence(const struct nfs_server *server, | |||
920 | args, res, task); | 959 | args, res, task); |
921 | } | 960 | } |
922 | 961 | ||
962 | static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res) | ||
963 | { | ||
964 | return nfs40_sequence_done(task, res); | ||
965 | } | ||
966 | |||
967 | static void nfs4_sequence_free_slot(struct nfs4_sequence_res *res) | ||
968 | { | ||
969 | if (res->sr_slot != NULL) | ||
970 | nfs40_sequence_free_slot(res); | ||
971 | } | ||
972 | |||
923 | int nfs4_sequence_done(struct rpc_task *task, | 973 | int nfs4_sequence_done(struct rpc_task *task, |
924 | struct nfs4_sequence_res *res) | 974 | struct nfs4_sequence_res *res) |
925 | { | 975 | { |
@@ -1197,6 +1247,7 @@ static void nfs4_opendata_free(struct kref *kref) | |||
1197 | struct super_block *sb = p->dentry->d_sb; | 1247 | struct super_block *sb = p->dentry->d_sb; |
1198 | 1248 | ||
1199 | nfs_free_seqid(p->o_arg.seqid); | 1249 | nfs_free_seqid(p->o_arg.seqid); |
1250 | nfs4_sequence_free_slot(&p->o_res.seq_res); | ||
1200 | if (p->state != NULL) | 1251 | if (p->state != NULL) |
1201 | nfs4_put_open_state(p->state); | 1252 | nfs4_put_open_state(p->state); |
1202 | nfs4_put_state_owner(p->owner); | 1253 | nfs4_put_state_owner(p->owner); |
@@ -1656,9 +1707,14 @@ err: | |||
1656 | static struct nfs4_state * | 1707 | static struct nfs4_state * |
1657 | nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data) | 1708 | nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data) |
1658 | { | 1709 | { |
1710 | struct nfs4_state *ret; | ||
1711 | |||
1659 | if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) | 1712 | if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) |
1660 | return _nfs4_opendata_reclaim_to_nfs4_state(data); | 1713 | ret =_nfs4_opendata_reclaim_to_nfs4_state(data); |
1661 | return _nfs4_opendata_to_nfs4_state(data); | 1714 | else |
1715 | ret = _nfs4_opendata_to_nfs4_state(data); | ||
1716 | nfs4_sequence_free_slot(&data->o_res.seq_res); | ||
1717 | return ret; | ||
1662 | } | 1718 | } |
1663 | 1719 | ||
1664 | static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state) | 1720 | static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state) |
@@ -2056,7 +2112,7 @@ static void nfs4_open_done(struct rpc_task *task, void *calldata) | |||
2056 | 2112 | ||
2057 | data->rpc_status = task->tk_status; | 2113 | data->rpc_status = task->tk_status; |
2058 | 2114 | ||
2059 | if (!nfs4_sequence_done(task, &data->o_res.seq_res)) | 2115 | if (!nfs4_sequence_process(task, &data->o_res.seq_res)) |
2060 | return; | 2116 | return; |
2061 | 2117 | ||
2062 | if (task->tk_status == 0) { | 2118 | if (task->tk_status == 0) { |
@@ -7864,7 +7920,7 @@ static void nfs4_layoutget_done(struct rpc_task *task, void *calldata) | |||
7864 | struct nfs4_layoutget *lgp = calldata; | 7920 | struct nfs4_layoutget *lgp = calldata; |
7865 | 7921 | ||
7866 | dprintk("--> %s\n", __func__); | 7922 | dprintk("--> %s\n", __func__); |
7867 | nfs41_sequence_done(task, &lgp->res.seq_res); | 7923 | nfs41_sequence_process(task, &lgp->res.seq_res); |
7868 | dprintk("<-- %s\n", __func__); | 7924 | dprintk("<-- %s\n", __func__); |
7869 | } | 7925 | } |
7870 | 7926 | ||
@@ -8080,6 +8136,7 @@ nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout, gfp_t gfp_flags) | |||
8080 | /* if layoutp->len is 0, nfs4_layoutget_prepare called rpc_exit */ | 8136 | /* if layoutp->len is 0, nfs4_layoutget_prepare called rpc_exit */ |
8081 | if (status == 0 && lgp->res.layoutp->len) | 8137 | if (status == 0 && lgp->res.layoutp->len) |
8082 | lseg = pnfs_layout_process(lgp); | 8138 | lseg = pnfs_layout_process(lgp); |
8139 | nfs4_sequence_free_slot(&lgp->res.seq_res); | ||
8083 | rpc_put_task(task); | 8140 | rpc_put_task(task); |
8084 | dprintk("<-- %s status=%d\n", __func__, status); | 8141 | dprintk("<-- %s status=%d\n", __func__, status); |
8085 | if (status) | 8142 | if (status) |
@@ -8106,7 +8163,7 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata) | |||
8106 | 8163 | ||
8107 | dprintk("--> %s\n", __func__); | 8164 | dprintk("--> %s\n", __func__); |
8108 | 8165 | ||
8109 | if (!nfs41_sequence_done(task, &lrp->res.seq_res)) | 8166 | if (!nfs41_sequence_process(task, &lrp->res.seq_res)) |
8110 | return; | 8167 | return; |
8111 | 8168 | ||
8112 | server = NFS_SERVER(lrp->args.inode); | 8169 | server = NFS_SERVER(lrp->args.inode); |
@@ -8118,6 +8175,7 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata) | |||
8118 | case -NFS4ERR_DELAY: | 8175 | case -NFS4ERR_DELAY: |
8119 | if (nfs4_async_handle_error(task, server, NULL, NULL) != -EAGAIN) | 8176 | if (nfs4_async_handle_error(task, server, NULL, NULL) != -EAGAIN) |
8120 | break; | 8177 | break; |
8178 | nfs4_sequence_free_slot(&lrp->res.seq_res); | ||
8121 | rpc_restart_call_prepare(task); | 8179 | rpc_restart_call_prepare(task); |
8122 | return; | 8180 | return; |
8123 | } | 8181 | } |
@@ -8138,6 +8196,7 @@ static void nfs4_layoutreturn_release(void *calldata) | |||
8138 | pnfs_set_layout_stateid(lo, &lrp->res.stateid, true); | 8196 | pnfs_set_layout_stateid(lo, &lrp->res.stateid, true); |
8139 | pnfs_clear_layoutreturn_waitbit(lo); | 8197 | pnfs_clear_layoutreturn_waitbit(lo); |
8140 | spin_unlock(&lo->plh_inode->i_lock); | 8198 | spin_unlock(&lo->plh_inode->i_lock); |
8199 | nfs4_sequence_free_slot(&lrp->res.seq_res); | ||
8141 | pnfs_free_lseg_list(&freeme); | 8200 | pnfs_free_lseg_list(&freeme); |
8142 | pnfs_put_layout_hdr(lrp->args.layout); | 8201 | pnfs_put_layout_hdr(lrp->args.layout); |
8143 | nfs_iput_and_deactive(lrp->inode); | 8202 | nfs_iput_and_deactive(lrp->inode); |
diff --git a/fs/nfs/nfs4session.c b/fs/nfs/nfs4session.c index 332d06e64fa9..b62973045a3e 100644 --- a/fs/nfs/nfs4session.c +++ b/fs/nfs/nfs4session.c | |||
@@ -28,6 +28,7 @@ static void nfs4_init_slot_table(struct nfs4_slot_table *tbl, const char *queue) | |||
28 | tbl->highest_used_slotid = NFS4_NO_SLOT; | 28 | tbl->highest_used_slotid = NFS4_NO_SLOT; |
29 | spin_lock_init(&tbl->slot_tbl_lock); | 29 | spin_lock_init(&tbl->slot_tbl_lock); |
30 | rpc_init_priority_wait_queue(&tbl->slot_tbl_waitq, queue); | 30 | rpc_init_priority_wait_queue(&tbl->slot_tbl_waitq, queue); |
31 | init_waitqueue_head(&tbl->slot_waitq); | ||
31 | init_completion(&tbl->complete); | 32 | init_completion(&tbl->complete); |
32 | } | 33 | } |
33 | 34 | ||
@@ -172,6 +173,58 @@ struct nfs4_slot *nfs4_lookup_slot(struct nfs4_slot_table *tbl, u32 slotid) | |||
172 | return ERR_PTR(-E2BIG); | 173 | return ERR_PTR(-E2BIG); |
173 | } | 174 | } |
174 | 175 | ||
176 | static int nfs4_slot_get_seqid(struct nfs4_slot_table *tbl, u32 slotid, | ||
177 | u32 *seq_nr) | ||
178 | __must_hold(&tbl->slot_tbl_lock) | ||
179 | { | ||
180 | struct nfs4_slot *slot; | ||
181 | |||
182 | slot = nfs4_lookup_slot(tbl, slotid); | ||
183 | if (IS_ERR(slot)) | ||
184 | return PTR_ERR(slot); | ||
185 | *seq_nr = slot->seq_nr; | ||
186 | return 0; | ||
187 | } | ||
188 | |||
189 | /* | ||
190 | * nfs4_slot_seqid_in_use - test if a slot sequence id is still in use | ||
191 | * | ||
192 | * Given a slot table, slot id and sequence number, determine if the | ||
193 | * RPC call in question is still in flight. This function is mainly | ||
194 | * intended for use by the callback channel. | ||
195 | */ | ||
196 | static bool nfs4_slot_seqid_in_use(struct nfs4_slot_table *tbl, | ||
197 | u32 slotid, u32 seq_nr) | ||
198 | { | ||
199 | u32 cur_seq; | ||
200 | bool ret = false; | ||
201 | |||
202 | spin_lock(&tbl->slot_tbl_lock); | ||
203 | if (nfs4_slot_get_seqid(tbl, slotid, &cur_seq) == 0 && | ||
204 | cur_seq == seq_nr && test_bit(slotid, tbl->used_slots)) | ||
205 | ret = true; | ||
206 | spin_unlock(&tbl->slot_tbl_lock); | ||
207 | return ret; | ||
208 | } | ||
209 | |||
210 | /* | ||
211 | * nfs4_slot_wait_on_seqid - wait until a slot sequence id is complete | ||
212 | * | ||
213 | * Given a slot table, slot id and sequence number, wait until the | ||
214 | * corresponding RPC call completes. This function is mainly | ||
215 | * intended for use by the callback channel. | ||
216 | */ | ||
217 | int nfs4_slot_wait_on_seqid(struct nfs4_slot_table *tbl, | ||
218 | u32 slotid, u32 seq_nr, | ||
219 | unsigned long timeout) | ||
220 | { | ||
221 | if (wait_event_timeout(tbl->slot_waitq, | ||
222 | !nfs4_slot_seqid_in_use(tbl, slotid, seq_nr), | ||
223 | timeout) == 0) | ||
224 | return -ETIMEDOUT; | ||
225 | return 0; | ||
226 | } | ||
227 | |||
175 | /* | 228 | /* |
176 | * nfs4_alloc_slot - efficiently look for a free slot | 229 | * nfs4_alloc_slot - efficiently look for a free slot |
177 | * | 230 | * |
diff --git a/fs/nfs/nfs4session.h b/fs/nfs/nfs4session.h index 5b51298d1d03..f703b755351b 100644 --- a/fs/nfs/nfs4session.h +++ b/fs/nfs/nfs4session.h | |||
@@ -21,7 +21,8 @@ struct nfs4_slot { | |||
21 | unsigned long generation; | 21 | unsigned long generation; |
22 | u32 slot_nr; | 22 | u32 slot_nr; |
23 | u32 seq_nr; | 23 | u32 seq_nr; |
24 | unsigned int interrupted : 1; | 24 | unsigned int interrupted : 1, |
25 | seq_done : 1; | ||
25 | }; | 26 | }; |
26 | 27 | ||
27 | /* Sessions */ | 28 | /* Sessions */ |
@@ -36,6 +37,7 @@ struct nfs4_slot_table { | |||
36 | unsigned long used_slots[SLOT_TABLE_SZ]; /* used/unused bitmap */ | 37 | unsigned long used_slots[SLOT_TABLE_SZ]; /* used/unused bitmap */ |
37 | spinlock_t slot_tbl_lock; | 38 | spinlock_t slot_tbl_lock; |
38 | struct rpc_wait_queue slot_tbl_waitq; /* allocators may wait here */ | 39 | struct rpc_wait_queue slot_tbl_waitq; /* allocators may wait here */ |
40 | wait_queue_head_t slot_waitq; /* Completion wait on slot */ | ||
39 | u32 max_slots; /* # slots in table */ | 41 | u32 max_slots; /* # slots in table */ |
40 | u32 max_slotid; /* Max allowed slotid value */ | 42 | u32 max_slotid; /* Max allowed slotid value */ |
41 | u32 highest_used_slotid; /* sent to server on each SEQ. | 43 | u32 highest_used_slotid; /* sent to server on each SEQ. |
@@ -78,6 +80,9 @@ extern int nfs4_setup_slot_table(struct nfs4_slot_table *tbl, | |||
78 | extern void nfs4_shutdown_slot_table(struct nfs4_slot_table *tbl); | 80 | extern void nfs4_shutdown_slot_table(struct nfs4_slot_table *tbl); |
79 | extern struct nfs4_slot *nfs4_alloc_slot(struct nfs4_slot_table *tbl); | 81 | extern struct nfs4_slot *nfs4_alloc_slot(struct nfs4_slot_table *tbl); |
80 | extern struct nfs4_slot *nfs4_lookup_slot(struct nfs4_slot_table *tbl, u32 slotid); | 82 | extern struct nfs4_slot *nfs4_lookup_slot(struct nfs4_slot_table *tbl, u32 slotid); |
83 | extern int nfs4_slot_wait_on_seqid(struct nfs4_slot_table *tbl, | ||
84 | u32 slotid, u32 seq_nr, | ||
85 | unsigned long timeout); | ||
81 | extern bool nfs4_try_to_lock_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot); | 86 | extern bool nfs4_try_to_lock_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot); |
82 | extern void nfs4_free_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot); | 87 | extern void nfs4_free_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot); |
83 | extern void nfs4_slot_tbl_drain_complete(struct nfs4_slot_table *tbl); | 88 | extern void nfs4_slot_tbl_drain_complete(struct nfs4_slot_table *tbl); |
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 70806cae0d36..6daf034645c8 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c | |||
@@ -1555,6 +1555,7 @@ pnfs_update_layout(struct inode *ino, | |||
1555 | } | 1555 | } |
1556 | 1556 | ||
1557 | lookup_again: | 1557 | lookup_again: |
1558 | nfs4_client_recover_expired_lease(clp); | ||
1558 | first = false; | 1559 | first = false; |
1559 | spin_lock(&ino->i_lock); | 1560 | spin_lock(&ino->i_lock); |
1560 | lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags); | 1561 | lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags); |
@@ -2510,7 +2511,6 @@ pnfs_report_layoutstat(struct inode *inode, gfp_t gfp_flags) | |||
2510 | 2511 | ||
2511 | data->args.fh = NFS_FH(inode); | 2512 | data->args.fh = NFS_FH(inode); |
2512 | data->args.inode = inode; | 2513 | data->args.inode = inode; |
2513 | nfs4_stateid_copy(&data->args.stateid, &hdr->plh_stateid); | ||
2514 | status = ld->prepare_layoutstats(&data->args); | 2514 | status = ld->prepare_layoutstats(&data->args); |
2515 | if (status) | 2515 | if (status) |
2516 | goto out_free; | 2516 | goto out_free; |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 18d446e1a82b..d39601381adf 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -923,6 +923,8 @@ static struct nfs_parsed_mount_data *nfs_alloc_parsed_mount_data(void) | |||
923 | 923 | ||
924 | data = kzalloc(sizeof(*data), GFP_KERNEL); | 924 | data = kzalloc(sizeof(*data), GFP_KERNEL); |
925 | if (data) { | 925 | if (data) { |
926 | data->timeo = NFS_UNSPEC_TIMEO; | ||
927 | data->retrans = NFS_UNSPEC_RETRANS; | ||
926 | data->acregmin = NFS_DEF_ACREGMIN; | 928 | data->acregmin = NFS_DEF_ACREGMIN; |
927 | data->acregmax = NFS_DEF_ACREGMAX; | 929 | data->acregmax = NFS_DEF_ACREGMAX; |
928 | data->acdirmin = NFS_DEF_ACDIRMIN; | 930 | data->acdirmin = NFS_DEF_ACDIRMIN; |
@@ -1189,6 +1191,19 @@ static int nfs_get_option_ul(substring_t args[], unsigned long *option) | |||
1189 | return rc; | 1191 | return rc; |
1190 | } | 1192 | } |
1191 | 1193 | ||
1194 | static int nfs_get_option_ul_bound(substring_t args[], unsigned long *option, | ||
1195 | unsigned long l_bound, unsigned long u_bound) | ||
1196 | { | ||
1197 | int ret; | ||
1198 | |||
1199 | ret = nfs_get_option_ul(args, option); | ||
1200 | if (ret != 0) | ||
1201 | return ret; | ||
1202 | if (*option < l_bound || *option > u_bound) | ||
1203 | return -ERANGE; | ||
1204 | return 0; | ||
1205 | } | ||
1206 | |||
1192 | /* | 1207 | /* |
1193 | * Error-check and convert a string of mount options from user space into | 1208 | * Error-check and convert a string of mount options from user space into |
1194 | * a data structure. The whole mount string is processed; bad options are | 1209 | * a data structure. The whole mount string is processed; bad options are |
@@ -1352,12 +1367,12 @@ static int nfs_parse_mount_options(char *raw, | |||
1352 | mnt->bsize = option; | 1367 | mnt->bsize = option; |
1353 | break; | 1368 | break; |
1354 | case Opt_timeo: | 1369 | case Opt_timeo: |
1355 | if (nfs_get_option_ul(args, &option) || option == 0) | 1370 | if (nfs_get_option_ul_bound(args, &option, 1, INT_MAX)) |
1356 | goto out_invalid_value; | 1371 | goto out_invalid_value; |
1357 | mnt->timeo = option; | 1372 | mnt->timeo = option; |
1358 | break; | 1373 | break; |
1359 | case Opt_retrans: | 1374 | case Opt_retrans: |
1360 | if (nfs_get_option_ul(args, &option) || option == 0) | 1375 | if (nfs_get_option_ul_bound(args, &option, 0, INT_MAX)) |
1361 | goto out_invalid_value; | 1376 | goto out_invalid_value; |
1362 | mnt->retrans = option; | 1377 | mnt->retrans = option; |
1363 | break; | 1378 | break; |
diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index 54e5d6681786..43fdc2765aea 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c | |||
@@ -80,6 +80,8 @@ int ovl_copy_xattr(struct dentry *old, struct dentry *new) | |||
80 | } | 80 | } |
81 | 81 | ||
82 | for (name = buf; name < (buf + list_size); name += strlen(name) + 1) { | 82 | for (name = buf; name < (buf + list_size); name += strlen(name) + 1) { |
83 | if (ovl_is_private_xattr(name)) | ||
84 | continue; | ||
83 | retry: | 85 | retry: |
84 | size = vfs_getxattr(old, name, value, value_size); | 86 | size = vfs_getxattr(old, name, value, value_size); |
85 | if (size == -ERANGE) | 87 | if (size == -ERANGE) |
diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 12bcd07b9e32..1560fdc09a5f 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c | |||
@@ -12,6 +12,8 @@ | |||
12 | #include <linux/xattr.h> | 12 | #include <linux/xattr.h> |
13 | #include <linux/security.h> | 13 | #include <linux/security.h> |
14 | #include <linux/cred.h> | 14 | #include <linux/cred.h> |
15 | #include <linux/posix_acl.h> | ||
16 | #include <linux/posix_acl_xattr.h> | ||
15 | #include "overlayfs.h" | 17 | #include "overlayfs.h" |
16 | 18 | ||
17 | void ovl_cleanup(struct inode *wdir, struct dentry *wdentry) | 19 | void ovl_cleanup(struct inode *wdir, struct dentry *wdentry) |
@@ -186,6 +188,9 @@ static int ovl_create_upper(struct dentry *dentry, struct inode *inode, | |||
186 | struct dentry *newdentry; | 188 | struct dentry *newdentry; |
187 | int err; | 189 | int err; |
188 | 190 | ||
191 | if (!hardlink && !IS_POSIXACL(udir)) | ||
192 | stat->mode &= ~current_umask(); | ||
193 | |||
189 | inode_lock_nested(udir, I_MUTEX_PARENT); | 194 | inode_lock_nested(udir, I_MUTEX_PARENT); |
190 | newdentry = lookup_one_len(dentry->d_name.name, upperdir, | 195 | newdentry = lookup_one_len(dentry->d_name.name, upperdir, |
191 | dentry->d_name.len); | 196 | dentry->d_name.len); |
@@ -335,6 +340,32 @@ out_free: | |||
335 | return ret; | 340 | return ret; |
336 | } | 341 | } |
337 | 342 | ||
343 | static int ovl_set_upper_acl(struct dentry *upperdentry, const char *name, | ||
344 | const struct posix_acl *acl) | ||
345 | { | ||
346 | void *buffer; | ||
347 | size_t size; | ||
348 | int err; | ||
349 | |||
350 | if (!IS_ENABLED(CONFIG_FS_POSIX_ACL) || !acl) | ||
351 | return 0; | ||
352 | |||
353 | size = posix_acl_to_xattr(NULL, acl, NULL, 0); | ||
354 | buffer = kmalloc(size, GFP_KERNEL); | ||
355 | if (!buffer) | ||
356 | return -ENOMEM; | ||
357 | |||
358 | size = posix_acl_to_xattr(&init_user_ns, acl, buffer, size); | ||
359 | err = size; | ||
360 | if (err < 0) | ||
361 | goto out_free; | ||
362 | |||
363 | err = vfs_setxattr(upperdentry, name, buffer, size, XATTR_CREATE); | ||
364 | out_free: | ||
365 | kfree(buffer); | ||
366 | return err; | ||
367 | } | ||
368 | |||
338 | static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, | 369 | static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, |
339 | struct kstat *stat, const char *link, | 370 | struct kstat *stat, const char *link, |
340 | struct dentry *hardlink) | 371 | struct dentry *hardlink) |
@@ -346,10 +377,18 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, | |||
346 | struct dentry *upper; | 377 | struct dentry *upper; |
347 | struct dentry *newdentry; | 378 | struct dentry *newdentry; |
348 | int err; | 379 | int err; |
380 | struct posix_acl *acl, *default_acl; | ||
349 | 381 | ||
350 | if (WARN_ON(!workdir)) | 382 | if (WARN_ON(!workdir)) |
351 | return -EROFS; | 383 | return -EROFS; |
352 | 384 | ||
385 | if (!hardlink) { | ||
386 | err = posix_acl_create(dentry->d_parent->d_inode, | ||
387 | &stat->mode, &default_acl, &acl); | ||
388 | if (err) | ||
389 | return err; | ||
390 | } | ||
391 | |||
353 | err = ovl_lock_rename_workdir(workdir, upperdir); | 392 | err = ovl_lock_rename_workdir(workdir, upperdir); |
354 | if (err) | 393 | if (err) |
355 | goto out; | 394 | goto out; |
@@ -384,6 +423,17 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, | |||
384 | if (err) | 423 | if (err) |
385 | goto out_cleanup; | 424 | goto out_cleanup; |
386 | } | 425 | } |
426 | if (!hardlink) { | ||
427 | err = ovl_set_upper_acl(newdentry, XATTR_NAME_POSIX_ACL_ACCESS, | ||
428 | acl); | ||
429 | if (err) | ||
430 | goto out_cleanup; | ||
431 | |||
432 | err = ovl_set_upper_acl(newdentry, XATTR_NAME_POSIX_ACL_DEFAULT, | ||
433 | default_acl); | ||
434 | if (err) | ||
435 | goto out_cleanup; | ||
436 | } | ||
387 | 437 | ||
388 | if (!hardlink && S_ISDIR(stat->mode)) { | 438 | if (!hardlink && S_ISDIR(stat->mode)) { |
389 | err = ovl_set_opaque(newdentry); | 439 | err = ovl_set_opaque(newdentry); |
@@ -410,6 +460,10 @@ out_dput: | |||
410 | out_unlock: | 460 | out_unlock: |
411 | unlock_rename(workdir, upperdir); | 461 | unlock_rename(workdir, upperdir); |
412 | out: | 462 | out: |
463 | if (!hardlink) { | ||
464 | posix_acl_release(acl); | ||
465 | posix_acl_release(default_acl); | ||
466 | } | ||
413 | return err; | 467 | return err; |
414 | 468 | ||
415 | out_cleanup: | 469 | out_cleanup: |
@@ -950,9 +1004,9 @@ const struct inode_operations ovl_dir_inode_operations = { | |||
950 | .permission = ovl_permission, | 1004 | .permission = ovl_permission, |
951 | .getattr = ovl_dir_getattr, | 1005 | .getattr = ovl_dir_getattr, |
952 | .setxattr = generic_setxattr, | 1006 | .setxattr = generic_setxattr, |
953 | .getxattr = ovl_getxattr, | 1007 | .getxattr = generic_getxattr, |
954 | .listxattr = ovl_listxattr, | 1008 | .listxattr = ovl_listxattr, |
955 | .removexattr = ovl_removexattr, | 1009 | .removexattr = generic_removexattr, |
956 | .get_acl = ovl_get_acl, | 1010 | .get_acl = ovl_get_acl, |
957 | .update_time = ovl_update_time, | 1011 | .update_time = ovl_update_time, |
958 | }; | 1012 | }; |
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 1b885c156028..c75625c1efa3 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/fs.h> | 10 | #include <linux/fs.h> |
11 | #include <linux/slab.h> | 11 | #include <linux/slab.h> |
12 | #include <linux/xattr.h> | 12 | #include <linux/xattr.h> |
13 | #include <linux/posix_acl.h> | ||
13 | #include "overlayfs.h" | 14 | #include "overlayfs.h" |
14 | 15 | ||
15 | static int ovl_copy_up_truncate(struct dentry *dentry) | 16 | static int ovl_copy_up_truncate(struct dentry *dentry) |
@@ -191,32 +192,44 @@ static int ovl_readlink(struct dentry *dentry, char __user *buf, int bufsiz) | |||
191 | return err; | 192 | return err; |
192 | } | 193 | } |
193 | 194 | ||
194 | static bool ovl_is_private_xattr(const char *name) | 195 | bool ovl_is_private_xattr(const char *name) |
195 | { | 196 | { |
196 | #define OVL_XATTR_PRE_NAME OVL_XATTR_PREFIX "." | 197 | return strncmp(name, OVL_XATTR_PREFIX, |
197 | return strncmp(name, OVL_XATTR_PRE_NAME, | 198 | sizeof(OVL_XATTR_PREFIX) - 1) == 0; |
198 | sizeof(OVL_XATTR_PRE_NAME) - 1) == 0; | ||
199 | } | 199 | } |
200 | 200 | ||
201 | int ovl_setxattr(struct dentry *dentry, struct inode *inode, | 201 | int ovl_xattr_set(struct dentry *dentry, const char *name, const void *value, |
202 | const char *name, const void *value, | 202 | size_t size, int flags) |
203 | size_t size, int flags) | ||
204 | { | 203 | { |
205 | int err; | 204 | int err; |
206 | struct dentry *upperdentry; | 205 | struct path realpath; |
206 | enum ovl_path_type type = ovl_path_real(dentry, &realpath); | ||
207 | const struct cred *old_cred; | 207 | const struct cred *old_cred; |
208 | 208 | ||
209 | err = ovl_want_write(dentry); | 209 | err = ovl_want_write(dentry); |
210 | if (err) | 210 | if (err) |
211 | goto out; | 211 | goto out; |
212 | 212 | ||
213 | if (!value && !OVL_TYPE_UPPER(type)) { | ||
214 | err = vfs_getxattr(realpath.dentry, name, NULL, 0); | ||
215 | if (err < 0) | ||
216 | goto out_drop_write; | ||
217 | } | ||
218 | |||
213 | err = ovl_copy_up(dentry); | 219 | err = ovl_copy_up(dentry); |
214 | if (err) | 220 | if (err) |
215 | goto out_drop_write; | 221 | goto out_drop_write; |
216 | 222 | ||
217 | upperdentry = ovl_dentry_upper(dentry); | 223 | if (!OVL_TYPE_UPPER(type)) |
224 | ovl_path_upper(dentry, &realpath); | ||
225 | |||
218 | old_cred = ovl_override_creds(dentry->d_sb); | 226 | old_cred = ovl_override_creds(dentry->d_sb); |
219 | err = vfs_setxattr(upperdentry, name, value, size, flags); | 227 | if (value) |
228 | err = vfs_setxattr(realpath.dentry, name, value, size, flags); | ||
229 | else { | ||
230 | WARN_ON(flags != XATTR_REPLACE); | ||
231 | err = vfs_removexattr(realpath.dentry, name); | ||
232 | } | ||
220 | revert_creds(old_cred); | 233 | revert_creds(old_cred); |
221 | 234 | ||
222 | out_drop_write: | 235 | out_drop_write: |
@@ -225,16 +238,13 @@ out: | |||
225 | return err; | 238 | return err; |
226 | } | 239 | } |
227 | 240 | ||
228 | ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode, | 241 | int ovl_xattr_get(struct dentry *dentry, const char *name, |
229 | const char *name, void *value, size_t size) | 242 | void *value, size_t size) |
230 | { | 243 | { |
231 | struct dentry *realdentry = ovl_dentry_real(dentry); | 244 | struct dentry *realdentry = ovl_dentry_real(dentry); |
232 | ssize_t res; | 245 | ssize_t res; |
233 | const struct cred *old_cred; | 246 | const struct cred *old_cred; |
234 | 247 | ||
235 | if (ovl_is_private_xattr(name)) | ||
236 | return -ENODATA; | ||
237 | |||
238 | old_cred = ovl_override_creds(dentry->d_sb); | 248 | old_cred = ovl_override_creds(dentry->d_sb); |
239 | res = vfs_getxattr(realdentry, name, value, size); | 249 | res = vfs_getxattr(realdentry, name, value, size); |
240 | revert_creds(old_cred); | 250 | revert_creds(old_cred); |
@@ -245,7 +255,8 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) | |||
245 | { | 255 | { |
246 | struct dentry *realdentry = ovl_dentry_real(dentry); | 256 | struct dentry *realdentry = ovl_dentry_real(dentry); |
247 | ssize_t res; | 257 | ssize_t res; |
248 | int off; | 258 | size_t len; |
259 | char *s; | ||
249 | const struct cred *old_cred; | 260 | const struct cred *old_cred; |
250 | 261 | ||
251 | old_cred = ovl_override_creds(dentry->d_sb); | 262 | old_cred = ovl_override_creds(dentry->d_sb); |
@@ -255,73 +266,39 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) | |||
255 | return res; | 266 | return res; |
256 | 267 | ||
257 | /* filter out private xattrs */ | 268 | /* filter out private xattrs */ |
258 | for (off = 0; off < res;) { | 269 | for (s = list, len = res; len;) { |
259 | char *s = list + off; | 270 | size_t slen = strnlen(s, len) + 1; |
260 | size_t slen = strlen(s) + 1; | ||
261 | 271 | ||
262 | BUG_ON(off + slen > res); | 272 | /* underlying fs providing us with an broken xattr list? */ |
273 | if (WARN_ON(slen > len)) | ||
274 | return -EIO; | ||
263 | 275 | ||
276 | len -= slen; | ||
264 | if (ovl_is_private_xattr(s)) { | 277 | if (ovl_is_private_xattr(s)) { |
265 | res -= slen; | 278 | res -= slen; |
266 | memmove(s, s + slen, res - off); | 279 | memmove(s, s + slen, len); |
267 | } else { | 280 | } else { |
268 | off += slen; | 281 | s += slen; |
269 | } | 282 | } |
270 | } | 283 | } |
271 | 284 | ||
272 | return res; | 285 | return res; |
273 | } | 286 | } |
274 | 287 | ||
275 | int ovl_removexattr(struct dentry *dentry, const char *name) | ||
276 | { | ||
277 | int err; | ||
278 | struct path realpath; | ||
279 | enum ovl_path_type type = ovl_path_real(dentry, &realpath); | ||
280 | const struct cred *old_cred; | ||
281 | |||
282 | err = ovl_want_write(dentry); | ||
283 | if (err) | ||
284 | goto out; | ||
285 | |||
286 | err = -ENODATA; | ||
287 | if (ovl_is_private_xattr(name)) | ||
288 | goto out_drop_write; | ||
289 | |||
290 | if (!OVL_TYPE_UPPER(type)) { | ||
291 | err = vfs_getxattr(realpath.dentry, name, NULL, 0); | ||
292 | if (err < 0) | ||
293 | goto out_drop_write; | ||
294 | |||
295 | err = ovl_copy_up(dentry); | ||
296 | if (err) | ||
297 | goto out_drop_write; | ||
298 | |||
299 | ovl_path_upper(dentry, &realpath); | ||
300 | } | ||
301 | |||
302 | old_cred = ovl_override_creds(dentry->d_sb); | ||
303 | err = vfs_removexattr(realpath.dentry, name); | ||
304 | revert_creds(old_cred); | ||
305 | out_drop_write: | ||
306 | ovl_drop_write(dentry); | ||
307 | out: | ||
308 | return err; | ||
309 | } | ||
310 | |||
311 | struct posix_acl *ovl_get_acl(struct inode *inode, int type) | 288 | struct posix_acl *ovl_get_acl(struct inode *inode, int type) |
312 | { | 289 | { |
313 | struct inode *realinode = ovl_inode_real(inode, NULL); | 290 | struct inode *realinode = ovl_inode_real(inode, NULL); |
314 | const struct cred *old_cred; | 291 | const struct cred *old_cred; |
315 | struct posix_acl *acl; | 292 | struct posix_acl *acl; |
316 | 293 | ||
317 | if (!IS_POSIXACL(realinode)) | 294 | if (!IS_ENABLED(CONFIG_FS_POSIX_ACL) || !IS_POSIXACL(realinode)) |
318 | return NULL; | 295 | return NULL; |
319 | 296 | ||
320 | if (!realinode->i_op->get_acl) | 297 | if (!realinode->i_op->get_acl) |
321 | return NULL; | 298 | return NULL; |
322 | 299 | ||
323 | old_cred = ovl_override_creds(inode->i_sb); | 300 | old_cred = ovl_override_creds(inode->i_sb); |
324 | acl = realinode->i_op->get_acl(realinode, type); | 301 | acl = get_acl(realinode, type); |
325 | revert_creds(old_cred); | 302 | revert_creds(old_cred); |
326 | 303 | ||
327 | return acl; | 304 | return acl; |
@@ -391,9 +368,9 @@ static const struct inode_operations ovl_file_inode_operations = { | |||
391 | .permission = ovl_permission, | 368 | .permission = ovl_permission, |
392 | .getattr = ovl_getattr, | 369 | .getattr = ovl_getattr, |
393 | .setxattr = generic_setxattr, | 370 | .setxattr = generic_setxattr, |
394 | .getxattr = ovl_getxattr, | 371 | .getxattr = generic_getxattr, |
395 | .listxattr = ovl_listxattr, | 372 | .listxattr = ovl_listxattr, |
396 | .removexattr = ovl_removexattr, | 373 | .removexattr = generic_removexattr, |
397 | .get_acl = ovl_get_acl, | 374 | .get_acl = ovl_get_acl, |
398 | .update_time = ovl_update_time, | 375 | .update_time = ovl_update_time, |
399 | }; | 376 | }; |
@@ -404,9 +381,9 @@ static const struct inode_operations ovl_symlink_inode_operations = { | |||
404 | .readlink = ovl_readlink, | 381 | .readlink = ovl_readlink, |
405 | .getattr = ovl_getattr, | 382 | .getattr = ovl_getattr, |
406 | .setxattr = generic_setxattr, | 383 | .setxattr = generic_setxattr, |
407 | .getxattr = ovl_getxattr, | 384 | .getxattr = generic_getxattr, |
408 | .listxattr = ovl_listxattr, | 385 | .listxattr = ovl_listxattr, |
409 | .removexattr = ovl_removexattr, | 386 | .removexattr = generic_removexattr, |
410 | .update_time = ovl_update_time, | 387 | .update_time = ovl_update_time, |
411 | }; | 388 | }; |
412 | 389 | ||
@@ -415,6 +392,9 @@ static void ovl_fill_inode(struct inode *inode, umode_t mode) | |||
415 | inode->i_ino = get_next_ino(); | 392 | inode->i_ino = get_next_ino(); |
416 | inode->i_mode = mode; | 393 | inode->i_mode = mode; |
417 | inode->i_flags |= S_NOCMTIME; | 394 | inode->i_flags |= S_NOCMTIME; |
395 | #ifdef CONFIG_FS_POSIX_ACL | ||
396 | inode->i_acl = inode->i_default_acl = ACL_DONT_CACHE; | ||
397 | #endif | ||
418 | 398 | ||
419 | mode &= S_IFMT; | 399 | mode &= S_IFMT; |
420 | switch (mode) { | 400 | switch (mode) { |
diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index e4f5c9536bfe..5813ccff8cd9 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h | |||
@@ -24,8 +24,8 @@ enum ovl_path_type { | |||
24 | (OVL_TYPE_MERGE(type) || !OVL_TYPE_UPPER(type)) | 24 | (OVL_TYPE_MERGE(type) || !OVL_TYPE_UPPER(type)) |
25 | 25 | ||
26 | 26 | ||
27 | #define OVL_XATTR_PREFIX XATTR_TRUSTED_PREFIX "overlay" | 27 | #define OVL_XATTR_PREFIX XATTR_TRUSTED_PREFIX "overlay." |
28 | #define OVL_XATTR_OPAQUE OVL_XATTR_PREFIX ".opaque" | 28 | #define OVL_XATTR_OPAQUE OVL_XATTR_PREFIX "opaque" |
29 | 29 | ||
30 | #define OVL_ISUPPER_MASK 1UL | 30 | #define OVL_ISUPPER_MASK 1UL |
31 | 31 | ||
@@ -179,20 +179,21 @@ int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list); | |||
179 | void ovl_cleanup_whiteouts(struct dentry *upper, struct list_head *list); | 179 | void ovl_cleanup_whiteouts(struct dentry *upper, struct list_head *list); |
180 | void ovl_cache_free(struct list_head *list); | 180 | void ovl_cache_free(struct list_head *list); |
181 | int ovl_check_d_type_supported(struct path *realpath); | 181 | int ovl_check_d_type_supported(struct path *realpath); |
182 | void ovl_workdir_cleanup(struct inode *dir, struct vfsmount *mnt, | ||
183 | struct dentry *dentry, int level); | ||
182 | 184 | ||
183 | /* inode.c */ | 185 | /* inode.c */ |
184 | int ovl_setattr(struct dentry *dentry, struct iattr *attr); | 186 | int ovl_setattr(struct dentry *dentry, struct iattr *attr); |
185 | int ovl_permission(struct inode *inode, int mask); | 187 | int ovl_permission(struct inode *inode, int mask); |
186 | int ovl_setxattr(struct dentry *dentry, struct inode *inode, | 188 | int ovl_xattr_set(struct dentry *dentry, const char *name, const void *value, |
187 | const char *name, const void *value, | 189 | size_t size, int flags); |
188 | size_t size, int flags); | 190 | int ovl_xattr_get(struct dentry *dentry, const char *name, |
189 | ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode, | 191 | void *value, size_t size); |
190 | const char *name, void *value, size_t size); | ||
191 | ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); | 192 | ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); |
192 | int ovl_removexattr(struct dentry *dentry, const char *name); | ||
193 | struct posix_acl *ovl_get_acl(struct inode *inode, int type); | 193 | struct posix_acl *ovl_get_acl(struct inode *inode, int type); |
194 | int ovl_open_maybe_copy_up(struct dentry *dentry, unsigned int file_flags); | 194 | int ovl_open_maybe_copy_up(struct dentry *dentry, unsigned int file_flags); |
195 | int ovl_update_time(struct inode *inode, struct timespec *ts, int flags); | 195 | int ovl_update_time(struct inode *inode, struct timespec *ts, int flags); |
196 | bool ovl_is_private_xattr(const char *name); | ||
196 | 197 | ||
197 | struct inode *ovl_new_inode(struct super_block *sb, umode_t mode); | 198 | struct inode *ovl_new_inode(struct super_block *sb, umode_t mode); |
198 | struct inode *ovl_get_inode(struct super_block *sb, struct inode *realinode); | 199 | struct inode *ovl_get_inode(struct super_block *sb, struct inode *realinode); |
diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c index cf37fc76fc9f..f241b4ee3d8a 100644 --- a/fs/overlayfs/readdir.c +++ b/fs/overlayfs/readdir.c | |||
@@ -248,7 +248,7 @@ static inline int ovl_dir_read(struct path *realpath, | |||
248 | err = rdd->err; | 248 | err = rdd->err; |
249 | } while (!err && rdd->count); | 249 | } while (!err && rdd->count); |
250 | 250 | ||
251 | if (!err && rdd->first_maybe_whiteout) | 251 | if (!err && rdd->first_maybe_whiteout && rdd->dentry) |
252 | err = ovl_check_whiteouts(realpath->dentry, rdd); | 252 | err = ovl_check_whiteouts(realpath->dentry, rdd); |
253 | 253 | ||
254 | fput(realfile); | 254 | fput(realfile); |
@@ -606,3 +606,64 @@ int ovl_check_d_type_supported(struct path *realpath) | |||
606 | 606 | ||
607 | return rdd.d_type_supported; | 607 | return rdd.d_type_supported; |
608 | } | 608 | } |
609 | |||
610 | static void ovl_workdir_cleanup_recurse(struct path *path, int level) | ||
611 | { | ||
612 | int err; | ||
613 | struct inode *dir = path->dentry->d_inode; | ||
614 | LIST_HEAD(list); | ||
615 | struct ovl_cache_entry *p; | ||
616 | struct ovl_readdir_data rdd = { | ||
617 | .ctx.actor = ovl_fill_merge, | ||
618 | .dentry = NULL, | ||
619 | .list = &list, | ||
620 | .root = RB_ROOT, | ||
621 | .is_lowest = false, | ||
622 | }; | ||
623 | |||
624 | err = ovl_dir_read(path, &rdd); | ||
625 | if (err) | ||
626 | goto out; | ||
627 | |||
628 | inode_lock_nested(dir, I_MUTEX_PARENT); | ||
629 | list_for_each_entry(p, &list, l_node) { | ||
630 | struct dentry *dentry; | ||
631 | |||
632 | if (p->name[0] == '.') { | ||
633 | if (p->len == 1) | ||
634 | continue; | ||
635 | if (p->len == 2 && p->name[1] == '.') | ||
636 | continue; | ||
637 | } | ||
638 | dentry = lookup_one_len(p->name, path->dentry, p->len); | ||
639 | if (IS_ERR(dentry)) | ||
640 | continue; | ||
641 | if (dentry->d_inode) | ||
642 | ovl_workdir_cleanup(dir, path->mnt, dentry, level); | ||
643 | dput(dentry); | ||
644 | } | ||
645 | inode_unlock(dir); | ||
646 | out: | ||
647 | ovl_cache_free(&list); | ||
648 | } | ||
649 | |||
650 | void ovl_workdir_cleanup(struct inode *dir, struct vfsmount *mnt, | ||
651 | struct dentry *dentry, int level) | ||
652 | { | ||
653 | int err; | ||
654 | |||
655 | if (!d_is_dir(dentry) || level > 1) { | ||
656 | ovl_cleanup(dir, dentry); | ||
657 | return; | ||
658 | } | ||
659 | |||
660 | err = ovl_do_rmdir(dir, dentry); | ||
661 | if (err) { | ||
662 | struct path path = { .mnt = mnt, .dentry = dentry }; | ||
663 | |||
664 | inode_unlock(dir); | ||
665 | ovl_workdir_cleanup_recurse(&path, level + 1); | ||
666 | inode_lock_nested(dir, I_MUTEX_PARENT); | ||
667 | ovl_cleanup(dir, dentry); | ||
668 | } | ||
669 | } | ||
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index 4036132842b5..e2a94a26767b 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c | |||
@@ -814,6 +814,10 @@ retry: | |||
814 | struct kstat stat = { | 814 | struct kstat stat = { |
815 | .mode = S_IFDIR | 0, | 815 | .mode = S_IFDIR | 0, |
816 | }; | 816 | }; |
817 | struct iattr attr = { | ||
818 | .ia_valid = ATTR_MODE, | ||
819 | .ia_mode = stat.mode, | ||
820 | }; | ||
817 | 821 | ||
818 | if (work->d_inode) { | 822 | if (work->d_inode) { |
819 | err = -EEXIST; | 823 | err = -EEXIST; |
@@ -821,7 +825,7 @@ retry: | |||
821 | goto out_dput; | 825 | goto out_dput; |
822 | 826 | ||
823 | retried = true; | 827 | retried = true; |
824 | ovl_cleanup(dir, work); | 828 | ovl_workdir_cleanup(dir, mnt, work, 0); |
825 | dput(work); | 829 | dput(work); |
826 | goto retry; | 830 | goto retry; |
827 | } | 831 | } |
@@ -829,6 +833,21 @@ retry: | |||
829 | err = ovl_create_real(dir, work, &stat, NULL, NULL, true); | 833 | err = ovl_create_real(dir, work, &stat, NULL, NULL, true); |
830 | if (err) | 834 | if (err) |
831 | goto out_dput; | 835 | goto out_dput; |
836 | |||
837 | err = vfs_removexattr(work, XATTR_NAME_POSIX_ACL_DEFAULT); | ||
838 | if (err && err != -ENODATA && err != -EOPNOTSUPP) | ||
839 | goto out_dput; | ||
840 | |||
841 | err = vfs_removexattr(work, XATTR_NAME_POSIX_ACL_ACCESS); | ||
842 | if (err && err != -ENODATA && err != -EOPNOTSUPP) | ||
843 | goto out_dput; | ||
844 | |||
845 | /* Clear any inherited mode bits */ | ||
846 | inode_lock(work->d_inode); | ||
847 | err = notify_change(work, &attr, NULL); | ||
848 | inode_unlock(work->d_inode); | ||
849 | if (err) | ||
850 | goto out_dput; | ||
832 | } | 851 | } |
833 | out_unlock: | 852 | out_unlock: |
834 | inode_unlock(dir); | 853 | inode_unlock(dir); |
@@ -967,10 +986,19 @@ static unsigned int ovl_split_lowerdirs(char *str) | |||
967 | return ctr; | 986 | return ctr; |
968 | } | 987 | } |
969 | 988 | ||
970 | static int ovl_posix_acl_xattr_set(const struct xattr_handler *handler, | 989 | static int __maybe_unused |
971 | struct dentry *dentry, struct inode *inode, | 990 | ovl_posix_acl_xattr_get(const struct xattr_handler *handler, |
972 | const char *name, const void *value, | 991 | struct dentry *dentry, struct inode *inode, |
973 | size_t size, int flags) | 992 | const char *name, void *buffer, size_t size) |
993 | { | ||
994 | return ovl_xattr_get(dentry, handler->name, buffer, size); | ||
995 | } | ||
996 | |||
997 | static int __maybe_unused | ||
998 | ovl_posix_acl_xattr_set(const struct xattr_handler *handler, | ||
999 | struct dentry *dentry, struct inode *inode, | ||
1000 | const char *name, const void *value, | ||
1001 | size_t size, int flags) | ||
974 | { | 1002 | { |
975 | struct dentry *workdir = ovl_workdir(dentry); | 1003 | struct dentry *workdir = ovl_workdir(dentry); |
976 | struct inode *realinode = ovl_inode_real(inode, NULL); | 1004 | struct inode *realinode = ovl_inode_real(inode, NULL); |
@@ -998,19 +1026,22 @@ static int ovl_posix_acl_xattr_set(const struct xattr_handler *handler, | |||
998 | 1026 | ||
999 | posix_acl_release(acl); | 1027 | posix_acl_release(acl); |
1000 | 1028 | ||
1001 | return ovl_setxattr(dentry, inode, handler->name, value, size, flags); | 1029 | err = ovl_xattr_set(dentry, handler->name, value, size, flags); |
1030 | if (!err) | ||
1031 | ovl_copyattr(ovl_inode_real(inode, NULL), inode); | ||
1032 | |||
1033 | return err; | ||
1002 | 1034 | ||
1003 | out_acl_release: | 1035 | out_acl_release: |
1004 | posix_acl_release(acl); | 1036 | posix_acl_release(acl); |
1005 | return err; | 1037 | return err; |
1006 | } | 1038 | } |
1007 | 1039 | ||
1008 | static int ovl_other_xattr_set(const struct xattr_handler *handler, | 1040 | static int ovl_own_xattr_get(const struct xattr_handler *handler, |
1009 | struct dentry *dentry, struct inode *inode, | 1041 | struct dentry *dentry, struct inode *inode, |
1010 | const char *name, const void *value, | 1042 | const char *name, void *buffer, size_t size) |
1011 | size_t size, int flags) | ||
1012 | { | 1043 | { |
1013 | return ovl_setxattr(dentry, inode, name, value, size, flags); | 1044 | return -EPERM; |
1014 | } | 1045 | } |
1015 | 1046 | ||
1016 | static int ovl_own_xattr_set(const struct xattr_handler *handler, | 1047 | static int ovl_own_xattr_set(const struct xattr_handler *handler, |
@@ -1021,42 +1052,59 @@ static int ovl_own_xattr_set(const struct xattr_handler *handler, | |||
1021 | return -EPERM; | 1052 | return -EPERM; |
1022 | } | 1053 | } |
1023 | 1054 | ||
1024 | static const struct xattr_handler ovl_posix_acl_access_xattr_handler = { | 1055 | static int ovl_other_xattr_get(const struct xattr_handler *handler, |
1056 | struct dentry *dentry, struct inode *inode, | ||
1057 | const char *name, void *buffer, size_t size) | ||
1058 | { | ||
1059 | return ovl_xattr_get(dentry, name, buffer, size); | ||
1060 | } | ||
1061 | |||
1062 | static int ovl_other_xattr_set(const struct xattr_handler *handler, | ||
1063 | struct dentry *dentry, struct inode *inode, | ||
1064 | const char *name, const void *value, | ||
1065 | size_t size, int flags) | ||
1066 | { | ||
1067 | return ovl_xattr_set(dentry, name, value, size, flags); | ||
1068 | } | ||
1069 | |||
1070 | static const struct xattr_handler __maybe_unused | ||
1071 | ovl_posix_acl_access_xattr_handler = { | ||
1025 | .name = XATTR_NAME_POSIX_ACL_ACCESS, | 1072 | .name = XATTR_NAME_POSIX_ACL_ACCESS, |
1026 | .flags = ACL_TYPE_ACCESS, | 1073 | .flags = ACL_TYPE_ACCESS, |
1074 | .get = ovl_posix_acl_xattr_get, | ||
1027 | .set = ovl_posix_acl_xattr_set, | 1075 | .set = ovl_posix_acl_xattr_set, |
1028 | }; | 1076 | }; |
1029 | 1077 | ||
1030 | static const struct xattr_handler ovl_posix_acl_default_xattr_handler = { | 1078 | static const struct xattr_handler __maybe_unused |
1079 | ovl_posix_acl_default_xattr_handler = { | ||
1031 | .name = XATTR_NAME_POSIX_ACL_DEFAULT, | 1080 | .name = XATTR_NAME_POSIX_ACL_DEFAULT, |
1032 | .flags = ACL_TYPE_DEFAULT, | 1081 | .flags = ACL_TYPE_DEFAULT, |
1082 | .get = ovl_posix_acl_xattr_get, | ||
1033 | .set = ovl_posix_acl_xattr_set, | 1083 | .set = ovl_posix_acl_xattr_set, |
1034 | }; | 1084 | }; |
1035 | 1085 | ||
1036 | static const struct xattr_handler ovl_own_xattr_handler = { | 1086 | static const struct xattr_handler ovl_own_xattr_handler = { |
1037 | .prefix = OVL_XATTR_PREFIX, | 1087 | .prefix = OVL_XATTR_PREFIX, |
1088 | .get = ovl_own_xattr_get, | ||
1038 | .set = ovl_own_xattr_set, | 1089 | .set = ovl_own_xattr_set, |
1039 | }; | 1090 | }; |
1040 | 1091 | ||
1041 | static const struct xattr_handler ovl_other_xattr_handler = { | 1092 | static const struct xattr_handler ovl_other_xattr_handler = { |
1042 | .prefix = "", /* catch all */ | 1093 | .prefix = "", /* catch all */ |
1094 | .get = ovl_other_xattr_get, | ||
1043 | .set = ovl_other_xattr_set, | 1095 | .set = ovl_other_xattr_set, |
1044 | }; | 1096 | }; |
1045 | 1097 | ||
1046 | static const struct xattr_handler *ovl_xattr_handlers[] = { | 1098 | static const struct xattr_handler *ovl_xattr_handlers[] = { |
1099 | #ifdef CONFIG_FS_POSIX_ACL | ||
1047 | &ovl_posix_acl_access_xattr_handler, | 1100 | &ovl_posix_acl_access_xattr_handler, |
1048 | &ovl_posix_acl_default_xattr_handler, | 1101 | &ovl_posix_acl_default_xattr_handler, |
1102 | #endif | ||
1049 | &ovl_own_xattr_handler, | 1103 | &ovl_own_xattr_handler, |
1050 | &ovl_other_xattr_handler, | 1104 | &ovl_other_xattr_handler, |
1051 | NULL | 1105 | NULL |
1052 | }; | 1106 | }; |
1053 | 1107 | ||
1054 | static const struct xattr_handler *ovl_xattr_noacl_handlers[] = { | ||
1055 | &ovl_own_xattr_handler, | ||
1056 | &ovl_other_xattr_handler, | ||
1057 | NULL, | ||
1058 | }; | ||
1059 | |||
1060 | static int ovl_fill_super(struct super_block *sb, void *data, int silent) | 1108 | static int ovl_fill_super(struct super_block *sb, void *data, int silent) |
1061 | { | 1109 | { |
1062 | struct path upperpath = { NULL, NULL }; | 1110 | struct path upperpath = { NULL, NULL }; |
@@ -1132,7 +1180,7 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) | |||
1132 | err = -EINVAL; | 1180 | err = -EINVAL; |
1133 | stacklen = ovl_split_lowerdirs(lowertmp); | 1181 | stacklen = ovl_split_lowerdirs(lowertmp); |
1134 | if (stacklen > OVL_MAX_STACK) { | 1182 | if (stacklen > OVL_MAX_STACK) { |
1135 | pr_err("overlayfs: too many lower directries, limit is %d\n", | 1183 | pr_err("overlayfs: too many lower directories, limit is %d\n", |
1136 | OVL_MAX_STACK); | 1184 | OVL_MAX_STACK); |
1137 | goto out_free_lowertmp; | 1185 | goto out_free_lowertmp; |
1138 | } else if (!ufs->config.upperdir && stacklen == 1) { | 1186 | } else if (!ufs->config.upperdir && stacklen == 1) { |
@@ -1269,10 +1317,7 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) | |||
1269 | 1317 | ||
1270 | sb->s_magic = OVERLAYFS_SUPER_MAGIC; | 1318 | sb->s_magic = OVERLAYFS_SUPER_MAGIC; |
1271 | sb->s_op = &ovl_super_operations; | 1319 | sb->s_op = &ovl_super_operations; |
1272 | if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) | 1320 | sb->s_xattr = ovl_xattr_handlers; |
1273 | sb->s_xattr = ovl_xattr_handlers; | ||
1274 | else | ||
1275 | sb->s_xattr = ovl_xattr_noacl_handlers; | ||
1276 | sb->s_root = root_dentry; | 1321 | sb->s_root = root_dentry; |
1277 | sb->s_fs_info = ufs; | 1322 | sb->s_fs_info = ufs; |
1278 | sb->s_flags |= MS_POSIXACL; | 1323 | sb->s_flags |= MS_POSIXACL; |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 54e270262979..ac0df4dde823 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -1556,18 +1556,13 @@ static const struct file_operations proc_pid_set_comm_operations = { | |||
1556 | static int proc_exe_link(struct dentry *dentry, struct path *exe_path) | 1556 | static int proc_exe_link(struct dentry *dentry, struct path *exe_path) |
1557 | { | 1557 | { |
1558 | struct task_struct *task; | 1558 | struct task_struct *task; |
1559 | struct mm_struct *mm; | ||
1560 | struct file *exe_file; | 1559 | struct file *exe_file; |
1561 | 1560 | ||
1562 | task = get_proc_task(d_inode(dentry)); | 1561 | task = get_proc_task(d_inode(dentry)); |
1563 | if (!task) | 1562 | if (!task) |
1564 | return -ENOENT; | 1563 | return -ENOENT; |
1565 | mm = get_task_mm(task); | 1564 | exe_file = get_task_exe_file(task); |
1566 | put_task_struct(task); | 1565 | put_task_struct(task); |
1567 | if (!mm) | ||
1568 | return -ENOENT; | ||
1569 | exe_file = get_mm_exe_file(mm); | ||
1570 | mmput(mm); | ||
1571 | if (exe_file) { | 1566 | if (exe_file) { |
1572 | *exe_path = exe_file->f_path; | 1567 | *exe_path = exe_file->f_path; |
1573 | path_get(&exe_file->f_path); | 1568 | path_get(&exe_file->f_path); |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 187d84ef9de9..f6fa99eca515 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -581,6 +581,8 @@ static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr, | |||
581 | mss->anonymous_thp += HPAGE_PMD_SIZE; | 581 | mss->anonymous_thp += HPAGE_PMD_SIZE; |
582 | else if (PageSwapBacked(page)) | 582 | else if (PageSwapBacked(page)) |
583 | mss->shmem_thp += HPAGE_PMD_SIZE; | 583 | mss->shmem_thp += HPAGE_PMD_SIZE; |
584 | else if (is_zone_device_page(page)) | ||
585 | /* pass */; | ||
584 | else | 586 | else |
585 | VM_BUG_ON_PAGE(1, page); | 587 | VM_BUG_ON_PAGE(1, page); |
586 | smaps_account(mss, page, true, pmd_young(*pmd), pmd_dirty(*pmd)); | 588 | smaps_account(mss, page, true, pmd_young(*pmd), pmd_dirty(*pmd)); |
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index f35523d4fa3a..b803213d1307 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c | |||
@@ -114,9 +114,15 @@ static ssize_t sysfs_kf_read(struct kernfs_open_file *of, char *buf, | |||
114 | * If buf != of->prealloc_buf, we don't know how | 114 | * If buf != of->prealloc_buf, we don't know how |
115 | * large it is, so cannot safely pass it to ->show | 115 | * large it is, so cannot safely pass it to ->show |
116 | */ | 116 | */ |
117 | if (pos || WARN_ON_ONCE(buf != of->prealloc_buf)) | 117 | if (WARN_ON_ONCE(buf != of->prealloc_buf)) |
118 | return 0; | 118 | return 0; |
119 | len = ops->show(kobj, of->kn->priv, buf); | 119 | len = ops->show(kobj, of->kn->priv, buf); |
120 | if (pos) { | ||
121 | if (len <= pos) | ||
122 | return 0; | ||
123 | len -= pos; | ||
124 | memmove(buf, buf + pos, len); | ||
125 | } | ||
120 | return min(count, len); | 126 | return min(count, len); |
121 | } | 127 | } |
122 | 128 | ||
diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 3dd8f1d54498..05b5243d89f6 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c | |||
@@ -2278,6 +2278,8 @@ xfs_alloc_log_agf( | |||
2278 | offsetof(xfs_agf_t, agf_btreeblks), | 2278 | offsetof(xfs_agf_t, agf_btreeblks), |
2279 | offsetof(xfs_agf_t, agf_uuid), | 2279 | offsetof(xfs_agf_t, agf_uuid), |
2280 | offsetof(xfs_agf_t, agf_rmap_blocks), | 2280 | offsetof(xfs_agf_t, agf_rmap_blocks), |
2281 | /* needed so that we don't log the whole rest of the structure: */ | ||
2282 | offsetof(xfs_agf_t, agf_spare64), | ||
2281 | sizeof(xfs_agf_t) | 2283 | sizeof(xfs_agf_t) |
2282 | }; | 2284 | }; |
2283 | 2285 | ||
diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index b5c213a051cd..08569792fe20 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c | |||
@@ -1814,6 +1814,10 @@ xfs_btree_lookup( | |||
1814 | 1814 | ||
1815 | XFS_BTREE_STATS_INC(cur, lookup); | 1815 | XFS_BTREE_STATS_INC(cur, lookup); |
1816 | 1816 | ||
1817 | /* No such thing as a zero-level tree. */ | ||
1818 | if (cur->bc_nlevels == 0) | ||
1819 | return -EFSCORRUPTED; | ||
1820 | |||
1817 | block = NULL; | 1821 | block = NULL; |
1818 | keyno = 0; | 1822 | keyno = 0; |
1819 | 1823 | ||
@@ -4554,15 +4558,22 @@ xfs_btree_simple_query_range( | |||
4554 | if (error) | 4558 | if (error) |
4555 | goto out; | 4559 | goto out; |
4556 | 4560 | ||
4561 | /* Nothing? See if there's anything to the right. */ | ||
4562 | if (!stat) { | ||
4563 | error = xfs_btree_increment(cur, 0, &stat); | ||
4564 | if (error) | ||
4565 | goto out; | ||
4566 | } | ||
4567 | |||
4557 | while (stat) { | 4568 | while (stat) { |
4558 | /* Find the record. */ | 4569 | /* Find the record. */ |
4559 | error = xfs_btree_get_rec(cur, &recp, &stat); | 4570 | error = xfs_btree_get_rec(cur, &recp, &stat); |
4560 | if (error || !stat) | 4571 | if (error || !stat) |
4561 | break; | 4572 | break; |
4562 | cur->bc_ops->init_high_key_from_rec(&rec_key, recp); | ||
4563 | 4573 | ||
4564 | /* Skip if high_key(rec) < low_key. */ | 4574 | /* Skip if high_key(rec) < low_key. */ |
4565 | if (firstrec) { | 4575 | if (firstrec) { |
4576 | cur->bc_ops->init_high_key_from_rec(&rec_key, recp); | ||
4566 | firstrec = false; | 4577 | firstrec = false; |
4567 | diff = cur->bc_ops->diff_two_keys(cur, low_key, | 4578 | diff = cur->bc_ops->diff_two_keys(cur, low_key, |
4568 | &rec_key); | 4579 | &rec_key); |
@@ -4571,6 +4582,7 @@ xfs_btree_simple_query_range( | |||
4571 | } | 4582 | } |
4572 | 4583 | ||
4573 | /* Stop if high_key < low_key(rec). */ | 4584 | /* Stop if high_key < low_key(rec). */ |
4585 | cur->bc_ops->init_key_from_rec(&rec_key, recp); | ||
4574 | diff = cur->bc_ops->diff_two_keys(cur, &rec_key, high_key); | 4586 | diff = cur->bc_ops->diff_two_keys(cur, &rec_key, high_key); |
4575 | if (diff > 0) | 4587 | if (diff > 0) |
4576 | break; | 4588 | break; |
diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c index 054a2032fdb3..c221d0ecd52e 100644 --- a/fs/xfs/libxfs/xfs_defer.c +++ b/fs/xfs/libxfs/xfs_defer.c | |||
@@ -194,7 +194,7 @@ xfs_defer_trans_abort( | |||
194 | /* Abort intent items. */ | 194 | /* Abort intent items. */ |
195 | list_for_each_entry(dfp, &dop->dop_pending, dfp_list) { | 195 | list_for_each_entry(dfp, &dop->dop_pending, dfp_list) { |
196 | trace_xfs_defer_pending_abort(tp->t_mountp, dfp); | 196 | trace_xfs_defer_pending_abort(tp->t_mountp, dfp); |
197 | if (dfp->dfp_committed) | 197 | if (!dfp->dfp_done) |
198 | dfp->dfp_type->abort_intent(dfp->dfp_intent); | 198 | dfp->dfp_type->abort_intent(dfp->dfp_intent); |
199 | } | 199 | } |
200 | 200 | ||
@@ -290,7 +290,6 @@ xfs_defer_finish( | |||
290 | struct xfs_defer_pending *dfp; | 290 | struct xfs_defer_pending *dfp; |
291 | struct list_head *li; | 291 | struct list_head *li; |
292 | struct list_head *n; | 292 | struct list_head *n; |
293 | void *done_item = NULL; | ||
294 | void *state; | 293 | void *state; |
295 | int error = 0; | 294 | int error = 0; |
296 | void (*cleanup_fn)(struct xfs_trans *, void *, int); | 295 | void (*cleanup_fn)(struct xfs_trans *, void *, int); |
@@ -309,19 +308,11 @@ xfs_defer_finish( | |||
309 | if (error) | 308 | if (error) |
310 | goto out; | 309 | goto out; |
311 | 310 | ||
312 | /* Mark all pending intents as committed. */ | ||
313 | list_for_each_entry_reverse(dfp, &dop->dop_pending, dfp_list) { | ||
314 | if (dfp->dfp_committed) | ||
315 | break; | ||
316 | trace_xfs_defer_pending_commit((*tp)->t_mountp, dfp); | ||
317 | dfp->dfp_committed = true; | ||
318 | } | ||
319 | |||
320 | /* Log an intent-done item for the first pending item. */ | 311 | /* Log an intent-done item for the first pending item. */ |
321 | dfp = list_first_entry(&dop->dop_pending, | 312 | dfp = list_first_entry(&dop->dop_pending, |
322 | struct xfs_defer_pending, dfp_list); | 313 | struct xfs_defer_pending, dfp_list); |
323 | trace_xfs_defer_pending_finish((*tp)->t_mountp, dfp); | 314 | trace_xfs_defer_pending_finish((*tp)->t_mountp, dfp); |
324 | done_item = dfp->dfp_type->create_done(*tp, dfp->dfp_intent, | 315 | dfp->dfp_done = dfp->dfp_type->create_done(*tp, dfp->dfp_intent, |
325 | dfp->dfp_count); | 316 | dfp->dfp_count); |
326 | cleanup_fn = dfp->dfp_type->finish_cleanup; | 317 | cleanup_fn = dfp->dfp_type->finish_cleanup; |
327 | 318 | ||
@@ -331,7 +322,7 @@ xfs_defer_finish( | |||
331 | list_del(li); | 322 | list_del(li); |
332 | dfp->dfp_count--; | 323 | dfp->dfp_count--; |
333 | error = dfp->dfp_type->finish_item(*tp, dop, li, | 324 | error = dfp->dfp_type->finish_item(*tp, dop, li, |
334 | done_item, &state); | 325 | dfp->dfp_done, &state); |
335 | if (error) { | 326 | if (error) { |
336 | /* | 327 | /* |
337 | * Clean up after ourselves and jump out. | 328 | * Clean up after ourselves and jump out. |
@@ -428,8 +419,8 @@ xfs_defer_add( | |||
428 | dfp = kmem_alloc(sizeof(struct xfs_defer_pending), | 419 | dfp = kmem_alloc(sizeof(struct xfs_defer_pending), |
429 | KM_SLEEP | KM_NOFS); | 420 | KM_SLEEP | KM_NOFS); |
430 | dfp->dfp_type = defer_op_types[type]; | 421 | dfp->dfp_type = defer_op_types[type]; |
431 | dfp->dfp_committed = false; | ||
432 | dfp->dfp_intent = NULL; | 422 | dfp->dfp_intent = NULL; |
423 | dfp->dfp_done = NULL; | ||
433 | dfp->dfp_count = 0; | 424 | dfp->dfp_count = 0; |
434 | INIT_LIST_HEAD(&dfp->dfp_work); | 425 | INIT_LIST_HEAD(&dfp->dfp_work); |
435 | list_add_tail(&dfp->dfp_list, &dop->dop_intake); | 426 | list_add_tail(&dfp->dfp_list, &dop->dop_intake); |
diff --git a/fs/xfs/libxfs/xfs_defer.h b/fs/xfs/libxfs/xfs_defer.h index cc3981c48296..e96533d178cf 100644 --- a/fs/xfs/libxfs/xfs_defer.h +++ b/fs/xfs/libxfs/xfs_defer.h | |||
@@ -30,8 +30,8 @@ struct xfs_defer_op_type; | |||
30 | struct xfs_defer_pending { | 30 | struct xfs_defer_pending { |
31 | const struct xfs_defer_op_type *dfp_type; /* function pointers */ | 31 | const struct xfs_defer_op_type *dfp_type; /* function pointers */ |
32 | struct list_head dfp_list; /* pending items */ | 32 | struct list_head dfp_list; /* pending items */ |
33 | bool dfp_committed; /* committed trans? */ | ||
34 | void *dfp_intent; /* log intent item */ | 33 | void *dfp_intent; /* log intent item */ |
34 | void *dfp_done; /* log done item */ | ||
35 | struct list_head dfp_work; /* work items */ | 35 | struct list_head dfp_work; /* work items */ |
36 | unsigned int dfp_count; /* # extent items */ | 36 | unsigned int dfp_count; /* # extent items */ |
37 | }; | 37 | }; |
diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index e6a8bea0f7ba..270fb5cf4fa1 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h | |||
@@ -674,7 +674,8 @@ typedef struct xfs_agf { | |||
674 | #define XFS_AGF_BTREEBLKS 0x00000800 | 674 | #define XFS_AGF_BTREEBLKS 0x00000800 |
675 | #define XFS_AGF_UUID 0x00001000 | 675 | #define XFS_AGF_UUID 0x00001000 |
676 | #define XFS_AGF_RMAP_BLOCKS 0x00002000 | 676 | #define XFS_AGF_RMAP_BLOCKS 0x00002000 |
677 | #define XFS_AGF_NUM_BITS 14 | 677 | #define XFS_AGF_SPARE64 0x00004000 |
678 | #define XFS_AGF_NUM_BITS 15 | ||
678 | #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) | 679 | #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) |
679 | 680 | ||
680 | #define XFS_AGF_FLAGS \ | 681 | #define XFS_AGF_FLAGS \ |
@@ -691,7 +692,8 @@ typedef struct xfs_agf { | |||
691 | { XFS_AGF_LONGEST, "LONGEST" }, \ | 692 | { XFS_AGF_LONGEST, "LONGEST" }, \ |
692 | { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ | 693 | { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ |
693 | { XFS_AGF_UUID, "UUID" }, \ | 694 | { XFS_AGF_UUID, "UUID" }, \ |
694 | { XFS_AGF_RMAP_BLOCKS, "RMAP_BLOCKS" } | 695 | { XFS_AGF_RMAP_BLOCKS, "RMAP_BLOCKS" }, \ |
696 | { XFS_AGF_SPARE64, "SPARE64" } | ||
695 | 697 | ||
696 | /* disk block (xfs_daddr_t) in the AG */ | 698 | /* disk block (xfs_daddr_t) in the AG */ |
697 | #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) | 699 | #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) |
diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 0e3d4f5ec33c..4aecc5fefe96 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c | |||
@@ -583,7 +583,8 @@ xfs_sb_verify( | |||
583 | * Only check the in progress field for the primary superblock as | 583 | * Only check the in progress field for the primary superblock as |
584 | * mkfs.xfs doesn't clear it from secondary superblocks. | 584 | * mkfs.xfs doesn't clear it from secondary superblocks. |
585 | */ | 585 | */ |
586 | return xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR, | 586 | return xfs_mount_validate_sb(mp, &sb, |
587 | bp->b_maps[0].bm_bn == XFS_SB_DADDR, | ||
587 | check_version); | 588 | check_version); |
588 | } | 589 | } |
589 | 590 | ||
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 607cc29bba21..b5b9bffe3520 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c | |||
@@ -1611,7 +1611,7 @@ xfs_wait_buftarg( | |||
1611 | */ | 1611 | */ |
1612 | while (percpu_counter_sum(&btp->bt_io_count)) | 1612 | while (percpu_counter_sum(&btp->bt_io_count)) |
1613 | delay(100); | 1613 | delay(100); |
1614 | drain_workqueue(btp->bt_mount->m_buf_workqueue); | 1614 | flush_workqueue(btp->bt_mount->m_buf_workqueue); |
1615 | 1615 | ||
1616 | /* loop until there is nothing left on the lru list. */ | 1616 | /* loop until there is nothing left on the lru list. */ |
1617 | while (list_lru_count(&btp->bt_lru)) { | 1617 | while (list_lru_count(&btp->bt_lru)) { |
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 24ef83ef04de..fd6be45b3a1e 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c | |||
@@ -1574,9 +1574,16 @@ xfs_fs_fill_super( | |||
1574 | } | 1574 | } |
1575 | } | 1575 | } |
1576 | 1576 | ||
1577 | if (xfs_sb_version_hasrmapbt(&mp->m_sb)) | 1577 | if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { |
1578 | if (mp->m_sb.sb_rblocks) { | ||
1579 | xfs_alert(mp, | ||
1580 | "EXPERIMENTAL reverse mapping btree not compatible with realtime device!"); | ||
1581 | error = -EINVAL; | ||
1582 | goto out_filestream_unmount; | ||
1583 | } | ||
1578 | xfs_alert(mp, | 1584 | xfs_alert(mp, |
1579 | "EXPERIMENTAL reverse mapping btree feature enabled. Use at your own risk!"); | 1585 | "EXPERIMENTAL reverse mapping btree feature enabled. Use at your own risk!"); |
1586 | } | ||
1580 | 1587 | ||
1581 | error = xfs_mountfs(mp); | 1588 | error = xfs_mountfs(mp); |
1582 | if (error) | 1589 | if (error) |
diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 7e88bec3f359..d303a665dba9 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h | |||
@@ -2295,7 +2295,7 @@ DECLARE_EVENT_CLASS(xfs_defer_pending_class, | |||
2295 | __entry->dev = mp ? mp->m_super->s_dev : 0; | 2295 | __entry->dev = mp ? mp->m_super->s_dev : 0; |
2296 | __entry->type = dfp->dfp_type->type; | 2296 | __entry->type = dfp->dfp_type->type; |
2297 | __entry->intent = dfp->dfp_intent; | 2297 | __entry->intent = dfp->dfp_intent; |
2298 | __entry->committed = dfp->dfp_committed; | 2298 | __entry->committed = dfp->dfp_done != NULL; |
2299 | __entry->nr = dfp->dfp_count; | 2299 | __entry->nr = dfp->dfp_count; |
2300 | ), | 2300 | ), |
2301 | TP_printk("dev %d:%d optype %d intent %p committed %d nr %d\n", | 2301 | TP_printk("dev %d:%d optype %d intent %p committed %d nr %d\n", |
diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h index 1bfa602958f2..5dea1fb6979c 100644 --- a/include/asm-generic/uaccess.h +++ b/include/asm-generic/uaccess.h | |||
@@ -72,6 +72,7 @@ struct exception_table_entry | |||
72 | /* Returns 0 if exception not found and fixup otherwise. */ | 72 | /* Returns 0 if exception not found and fixup otherwise. */ |
73 | extern unsigned long search_exception_table(unsigned long); | 73 | extern unsigned long search_exception_table(unsigned long); |
74 | 74 | ||
75 | |||
75 | /* | 76 | /* |
76 | * architectures with an MMU should override these two | 77 | * architectures with an MMU should override these two |
77 | */ | 78 | */ |
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 4d8452c2384b..c5eaf2f80a4c 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
@@ -1056,7 +1056,7 @@ static inline struct fwnode_handle *acpi_get_next_subnode(struct device *dev, | |||
1056 | return NULL; | 1056 | return NULL; |
1057 | } | 1057 | } |
1058 | 1058 | ||
1059 | #define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable, validate, data, fn) \ | 1059 | #define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable, valid, data, fn) \ |
1060 | static const void * __acpi_table_##name[] \ | 1060 | static const void * __acpi_table_##name[] \ |
1061 | __attribute__((unused)) \ | 1061 | __attribute__((unused)) \ |
1062 | = { (void *) table_id, \ | 1062 | = { (void *) table_id, \ |
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 8dbc8929a6a0..573c5a18908f 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h | |||
@@ -158,7 +158,7 @@ | |||
158 | #define __compiler_offsetof(a, b) \ | 158 | #define __compiler_offsetof(a, b) \ |
159 | __builtin_offsetof(a, b) | 159 | __builtin_offsetof(a, b) |
160 | 160 | ||
161 | #if GCC_VERSION >= 40100 && GCC_VERSION < 40600 | 161 | #if GCC_VERSION >= 40100 |
162 | # define __compiletime_object_size(obj) __builtin_object_size(obj, 0) | 162 | # define __compiletime_object_size(obj) __builtin_object_size(obj, 0) |
163 | #endif | 163 | #endif |
164 | 164 | ||
diff --git a/include/linux/fence.h b/include/linux/fence.h index 8cc719a63728..2ac6fa5f4712 100644 --- a/include/linux/fence.h +++ b/include/linux/fence.h | |||
@@ -49,8 +49,6 @@ struct fence_cb; | |||
49 | * @timestamp: Timestamp when the fence was signaled. | 49 | * @timestamp: Timestamp when the fence was signaled. |
50 | * @status: Optional, only valid if < 0, must be set before calling | 50 | * @status: Optional, only valid if < 0, must be set before calling |
51 | * fence_signal, indicates that the fence has completed with an error. | 51 | * fence_signal, indicates that the fence has completed with an error. |
52 | * @child_list: list of children fences | ||
53 | * @active_list: list of active fences | ||
54 | * | 52 | * |
55 | * the flags member must be manipulated and read using the appropriate | 53 | * the flags member must be manipulated and read using the appropriate |
56 | * atomic ops (bit_*), so taking the spinlock will not be needed most | 54 | * atomic ops (bit_*), so taking the spinlock will not be needed most |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 3523bf62f328..901e25d495cc 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -574,6 +574,7 @@ static inline void mapping_allow_writable(struct address_space *mapping) | |||
574 | 574 | ||
575 | struct posix_acl; | 575 | struct posix_acl; |
576 | #define ACL_NOT_CACHED ((void *)(-1)) | 576 | #define ACL_NOT_CACHED ((void *)(-1)) |
577 | #define ACL_DONT_CACHE ((void *)(-3)) | ||
577 | 578 | ||
578 | static inline struct posix_acl * | 579 | static inline struct posix_acl * |
579 | uncached_acl_sentinel(struct task_struct *task) | 580 | uncached_acl_sentinel(struct task_struct *task) |
diff --git a/include/linux/fscrypto.h b/include/linux/fscrypto.h index cfa6cde25f8e..76cff18bb032 100644 --- a/include/linux/fscrypto.h +++ b/include/linux/fscrypto.h | |||
@@ -274,8 +274,7 @@ extern void fscrypt_restore_control_page(struct page *); | |||
274 | extern int fscrypt_zeroout_range(struct inode *, pgoff_t, sector_t, | 274 | extern int fscrypt_zeroout_range(struct inode *, pgoff_t, sector_t, |
275 | unsigned int); | 275 | unsigned int); |
276 | /* policy.c */ | 276 | /* policy.c */ |
277 | extern int fscrypt_process_policy(struct inode *, | 277 | extern int fscrypt_process_policy(struct file *, const struct fscrypt_policy *); |
278 | const struct fscrypt_policy *); | ||
279 | extern int fscrypt_get_policy(struct inode *, struct fscrypt_policy *); | 278 | extern int fscrypt_get_policy(struct inode *, struct fscrypt_policy *); |
280 | extern int fscrypt_has_permitted_context(struct inode *, struct inode *); | 279 | extern int fscrypt_has_permitted_context(struct inode *, struct inode *); |
281 | extern int fscrypt_inherit_context(struct inode *, struct inode *, | 280 | extern int fscrypt_inherit_context(struct inode *, struct inode *, |
@@ -345,7 +344,7 @@ static inline int fscrypt_notsupp_zeroout_range(struct inode *i, pgoff_t p, | |||
345 | } | 344 | } |
346 | 345 | ||
347 | /* policy.c */ | 346 | /* policy.c */ |
348 | static inline int fscrypt_notsupp_process_policy(struct inode *i, | 347 | static inline int fscrypt_notsupp_process_policy(struct file *f, |
349 | const struct fscrypt_policy *p) | 348 | const struct fscrypt_policy *p) |
350 | { | 349 | { |
351 | return -EOPNOTSUPP; | 350 | return -EOPNOTSUPP; |
diff --git a/include/linux/iio/sw_trigger.h b/include/linux/iio/sw_trigger.h index 5198f8ed08a4..c97eab67558f 100644 --- a/include/linux/iio/sw_trigger.h +++ b/include/linux/iio/sw_trigger.h | |||
@@ -62,7 +62,7 @@ void iio_swt_group_init_type_name(struct iio_sw_trigger *t, | |||
62 | const char *name, | 62 | const char *name, |
63 | struct config_item_type *type) | 63 | struct config_item_type *type) |
64 | { | 64 | { |
65 | #ifdef CONFIG_CONFIGFS_FS | 65 | #if IS_ENABLED(CONFIG_CONFIGFS_FS) |
66 | config_group_init_type_name(&t->group, name, type); | 66 | config_group_init_type_name(&t->group, name, type); |
67 | #endif | 67 | #endif |
68 | } | 68 | } |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index b6683f0ffc9f..72f0721f75e7 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
@@ -278,7 +278,8 @@ extern int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m); | |||
278 | extern int | 278 | extern int |
279 | irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify); | 279 | irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify); |
280 | 280 | ||
281 | struct cpumask *irq_create_affinity_mask(unsigned int *nr_vecs); | 281 | struct cpumask *irq_create_affinity_masks(const struct cpumask *affinity, int nvec); |
282 | int irq_calc_affinity_vectors(const struct cpumask *affinity, int maxvec); | ||
282 | 283 | ||
283 | #else /* CONFIG_SMP */ | 284 | #else /* CONFIG_SMP */ |
284 | 285 | ||
@@ -311,11 +312,18 @@ irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify) | |||
311 | return 0; | 312 | return 0; |
312 | } | 313 | } |
313 | 314 | ||
314 | static inline struct cpumask *irq_create_affinity_mask(unsigned int *nr_vecs) | 315 | static inline struct cpumask * |
316 | irq_create_affinity_masks(const struct cpumask *affinity, int nvec) | ||
315 | { | 317 | { |
316 | *nr_vecs = 1; | ||
317 | return NULL; | 318 | return NULL; |
318 | } | 319 | } |
320 | |||
321 | static inline int | ||
322 | irq_calc_affinity_vectors(const struct cpumask *affinity, int maxvec) | ||
323 | { | ||
324 | return maxvec; | ||
325 | } | ||
326 | |||
319 | #endif /* CONFIG_SMP */ | 327 | #endif /* CONFIG_SMP */ |
320 | 328 | ||
321 | /* | 329 | /* |
diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 3267df461012..3d70ece10313 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h | |||
@@ -19,6 +19,11 @@ struct vm_fault; | |||
19 | #define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ | 19 | #define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ |
20 | 20 | ||
21 | /* | 21 | /* |
22 | * Flags for iomap mappings: | ||
23 | */ | ||
24 | #define IOMAP_F_MERGED 0x01 /* contains multiple blocks/extents */ | ||
25 | |||
26 | /* | ||
22 | * Magic value for blkno: | 27 | * Magic value for blkno: |
23 | */ | 28 | */ |
24 | #define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ | 29 | #define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ |
@@ -27,7 +32,8 @@ struct iomap { | |||
27 | sector_t blkno; /* 1st sector of mapping, 512b units */ | 32 | sector_t blkno; /* 1st sector of mapping, 512b units */ |
28 | loff_t offset; /* file offset of mapping, bytes */ | 33 | loff_t offset; /* file offset of mapping, bytes */ |
29 | u64 length; /* length of mapping, bytes */ | 34 | u64 length; /* length of mapping, bytes */ |
30 | int type; /* type of mapping */ | 35 | u16 type; /* type of mapping */ |
36 | u16 flags; /* flags for mapping */ | ||
31 | struct block_device *bdev; /* block device for I/O */ | 37 | struct block_device *bdev; /* block device for I/O */ |
32 | }; | 38 | }; |
33 | 39 | ||
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index 4429d255c8ab..5e5b2969d931 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h | |||
@@ -195,6 +195,7 @@ static inline bool vma_migratable(struct vm_area_struct *vma) | |||
195 | } | 195 | } |
196 | 196 | ||
197 | extern int mpol_misplaced(struct page *, struct vm_area_struct *, unsigned long); | 197 | extern int mpol_misplaced(struct page *, struct vm_area_struct *, unsigned long); |
198 | extern void mpol_put_task_policy(struct task_struct *); | ||
198 | 199 | ||
199 | #else | 200 | #else |
200 | 201 | ||
@@ -297,5 +298,8 @@ static inline int mpol_misplaced(struct page *page, struct vm_area_struct *vma, | |||
297 | return -1; /* no node preference */ | 298 | return -1; /* no node preference */ |
298 | } | 299 | } |
299 | 300 | ||
301 | static inline void mpol_put_task_policy(struct task_struct *task) | ||
302 | { | ||
303 | } | ||
300 | #endif /* CONFIG_NUMA */ | 304 | #endif /* CONFIG_NUMA */ |
301 | #endif | 305 | #endif |
diff --git a/include/linux/mfd/da8xx-cfgchip.h b/include/linux/mfd/da8xx-cfgchip.h new file mode 100644 index 000000000000..304985e288d2 --- /dev/null +++ b/include/linux/mfd/da8xx-cfgchip.h | |||
@@ -0,0 +1,153 @@ | |||
1 | /* | ||
2 | * TI DaVinci DA8xx CHIPCFGx registers for syscon consumers. | ||
3 | * | ||
4 | * Copyright (C) 2016 David Lechner <david@lechnology.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | */ | ||
16 | |||
17 | #ifndef __LINUX_MFD_DA8XX_CFGCHIP_H | ||
18 | #define __LINUX_MFD_DA8XX_CFGCHIP_H | ||
19 | |||
20 | #include <linux/bitops.h> | ||
21 | |||
22 | /* register offset (32-bit registers) */ | ||
23 | #define CFGCHIP(n) ((n) * 4) | ||
24 | |||
25 | /* CFGCHIP0 (PLL0/EDMA3_0) register bits */ | ||
26 | #define CFGCHIP0_PLL_MASTER_LOCK BIT(4) | ||
27 | #define CFGCHIP0_EDMA30TC1DBS(n) ((n) << 2) | ||
28 | #define CFGCHIP0_EDMA30TC1DBS_MASK CFGCHIP0_EDMA30TC1DBS(0x3) | ||
29 | #define CFGCHIP0_EDMA30TC1DBS_16 CFGCHIP0_EDMA30TC1DBS(0x0) | ||
30 | #define CFGCHIP0_EDMA30TC1DBS_32 CFGCHIP0_EDMA30TC1DBS(0x1) | ||
31 | #define CFGCHIP0_EDMA30TC1DBS_64 CFGCHIP0_EDMA30TC1DBS(0x2) | ||
32 | #define CFGCHIP0_EDMA30TC0DBS(n) ((n) << 0) | ||
33 | #define CFGCHIP0_EDMA30TC0DBS_MASK CFGCHIP0_EDMA30TC0DBS(0x3) | ||
34 | #define CFGCHIP0_EDMA30TC0DBS_16 CFGCHIP0_EDMA30TC0DBS(0x0) | ||
35 | #define CFGCHIP0_EDMA30TC0DBS_32 CFGCHIP0_EDMA30TC0DBS(0x1) | ||
36 | #define CFGCHIP0_EDMA30TC0DBS_64 CFGCHIP0_EDMA30TC0DBS(0x2) | ||
37 | |||
38 | /* CFGCHIP1 (eCAP/HPI/EDMA3_1/eHRPWM TBCLK/McASP0 AMUTEIN) register bits */ | ||
39 | #define CFGCHIP1_CAP2SRC(n) ((n) << 27) | ||
40 | #define CFGCHIP1_CAP2SRC_MASK CFGCHIP1_CAP2SRC(0x1f) | ||
41 | #define CFGCHIP1_CAP2SRC_ECAP_PIN CFGCHIP1_CAP2SRC(0x0) | ||
42 | #define CFGCHIP1_CAP2SRC_MCASP0_TX CFGCHIP1_CAP2SRC(0x1) | ||
43 | #define CFGCHIP1_CAP2SRC_MCASP0_RX CFGCHIP1_CAP2SRC(0x2) | ||
44 | #define CFGCHIP1_CAP2SRC_EMAC_C0_RX_THRESHOLD CFGCHIP1_CAP2SRC(0x7) | ||
45 | #define CFGCHIP1_CAP2SRC_EMAC_C0_RX CFGCHIP1_CAP2SRC(0x8) | ||
46 | #define CFGCHIP1_CAP2SRC_EMAC_C0_TX CFGCHIP1_CAP2SRC(0x9) | ||
47 | #define CFGCHIP1_CAP2SRC_EMAC_C0_MISC CFGCHIP1_CAP2SRC(0xa) | ||
48 | #define CFGCHIP1_CAP2SRC_EMAC_C1_RX_THRESHOLD CFGCHIP1_CAP2SRC(0xb) | ||
49 | #define CFGCHIP1_CAP2SRC_EMAC_C1_RX CFGCHIP1_CAP2SRC(0xc) | ||
50 | #define CFGCHIP1_CAP2SRC_EMAC_C1_TX CFGCHIP1_CAP2SRC(0xd) | ||
51 | #define CFGCHIP1_CAP2SRC_EMAC_C1_MISC CFGCHIP1_CAP2SRC(0xe) | ||
52 | #define CFGCHIP1_CAP2SRC_EMAC_C2_RX_THRESHOLD CFGCHIP1_CAP2SRC(0xf) | ||
53 | #define CFGCHIP1_CAP2SRC_EMAC_C2_RX CFGCHIP1_CAP2SRC(0x10) | ||
54 | #define CFGCHIP1_CAP2SRC_EMAC_C2_TX CFGCHIP1_CAP2SRC(0x11) | ||
55 | #define CFGCHIP1_CAP2SRC_EMAC_C2_MISC CFGCHIP1_CAP2SRC(0x12) | ||
56 | #define CFGCHIP1_CAP1SRC(n) ((n) << 22) | ||
57 | #define CFGCHIP1_CAP1SRC_MASK CFGCHIP1_CAP1SRC(0x1f) | ||
58 | #define CFGCHIP1_CAP1SRC_ECAP_PIN CFGCHIP1_CAP1SRC(0x0) | ||
59 | #define CFGCHIP1_CAP1SRC_MCASP0_TX CFGCHIP1_CAP1SRC(0x1) | ||
60 | #define CFGCHIP1_CAP1SRC_MCASP0_RX CFGCHIP1_CAP1SRC(0x2) | ||
61 | #define CFGCHIP1_CAP1SRC_EMAC_C0_RX_THRESHOLD CFGCHIP1_CAP1SRC(0x7) | ||
62 | #define CFGCHIP1_CAP1SRC_EMAC_C0_RX CFGCHIP1_CAP1SRC(0x8) | ||
63 | #define CFGCHIP1_CAP1SRC_EMAC_C0_TX CFGCHIP1_CAP1SRC(0x9) | ||
64 | #define CFGCHIP1_CAP1SRC_EMAC_C0_MISC CFGCHIP1_CAP1SRC(0xa) | ||
65 | #define CFGCHIP1_CAP1SRC_EMAC_C1_RX_THRESHOLD CFGCHIP1_CAP1SRC(0xb) | ||
66 | #define CFGCHIP1_CAP1SRC_EMAC_C1_RX CFGCHIP1_CAP1SRC(0xc) | ||
67 | #define CFGCHIP1_CAP1SRC_EMAC_C1_TX CFGCHIP1_CAP1SRC(0xd) | ||
68 | #define CFGCHIP1_CAP1SRC_EMAC_C1_MISC CFGCHIP1_CAP1SRC(0xe) | ||
69 | #define CFGCHIP1_CAP1SRC_EMAC_C2_RX_THRESHOLD CFGCHIP1_CAP1SRC(0xf) | ||
70 | #define CFGCHIP1_CAP1SRC_EMAC_C2_RX CFGCHIP1_CAP1SRC(0x10) | ||
71 | #define CFGCHIP1_CAP1SRC_EMAC_C2_TX CFGCHIP1_CAP1SRC(0x11) | ||
72 | #define CFGCHIP1_CAP1SRC_EMAC_C2_MISC CFGCHIP1_CAP1SRC(0x12) | ||
73 | #define CFGCHIP1_CAP0SRC(n) ((n) << 17) | ||
74 | #define CFGCHIP1_CAP0SRC_MASK CFGCHIP1_CAP0SRC(0x1f) | ||
75 | #define CFGCHIP1_CAP0SRC_ECAP_PIN CFGCHIP1_CAP0SRC(0x0) | ||
76 | #define CFGCHIP1_CAP0SRC_MCASP0_TX CFGCHIP1_CAP0SRC(0x1) | ||
77 | #define CFGCHIP1_CAP0SRC_MCASP0_RX CFGCHIP1_CAP0SRC(0x2) | ||
78 | #define CFGCHIP1_CAP0SRC_EMAC_C0_RX_THRESHOLD CFGCHIP1_CAP0SRC(0x7) | ||
79 | #define CFGCHIP1_CAP0SRC_EMAC_C0_RX CFGCHIP1_CAP0SRC(0x8) | ||
80 | #define CFGCHIP1_CAP0SRC_EMAC_C0_TX CFGCHIP1_CAP0SRC(0x9) | ||
81 | #define CFGCHIP1_CAP0SRC_EMAC_C0_MISC CFGCHIP1_CAP0SRC(0xa) | ||
82 | #define CFGCHIP1_CAP0SRC_EMAC_C1_RX_THRESHOLD CFGCHIP1_CAP0SRC(0xb) | ||
83 | #define CFGCHIP1_CAP0SRC_EMAC_C1_RX CFGCHIP1_CAP0SRC(0xc) | ||
84 | #define CFGCHIP1_CAP0SRC_EMAC_C1_TX CFGCHIP1_CAP0SRC(0xd) | ||
85 | #define CFGCHIP1_CAP0SRC_EMAC_C1_MISC CFGCHIP1_CAP0SRC(0xe) | ||
86 | #define CFGCHIP1_CAP0SRC_EMAC_C2_RX_THRESHOLD CFGCHIP1_CAP0SRC(0xf) | ||
87 | #define CFGCHIP1_CAP0SRC_EMAC_C2_RX CFGCHIP1_CAP0SRC(0x10) | ||
88 | #define CFGCHIP1_CAP0SRC_EMAC_C2_TX CFGCHIP1_CAP0SRC(0x11) | ||
89 | #define CFGCHIP1_CAP0SRC_EMAC_C2_MISC CFGCHIP1_CAP0SRC(0x12) | ||
90 | #define CFGCHIP1_HPIBYTEAD BIT(16) | ||
91 | #define CFGCHIP1_HPIENA BIT(15) | ||
92 | #define CFGCHIP0_EDMA31TC0DBS(n) ((n) << 13) | ||
93 | #define CFGCHIP0_EDMA31TC0DBS_MASK CFGCHIP0_EDMA31TC0DBS(0x3) | ||
94 | #define CFGCHIP0_EDMA31TC0DBS_16 CFGCHIP0_EDMA31TC0DBS(0x0) | ||
95 | #define CFGCHIP0_EDMA31TC0DBS_32 CFGCHIP0_EDMA31TC0DBS(0x1) | ||
96 | #define CFGCHIP0_EDMA31TC0DBS_64 CFGCHIP0_EDMA31TC0DBS(0x2) | ||
97 | #define CFGCHIP1_TBCLKSYNC BIT(12) | ||
98 | #define CFGCHIP1_AMUTESEL0(n) ((n) << 0) | ||
99 | #define CFGCHIP1_AMUTESEL0_MASK CFGCHIP1_AMUTESEL0(0xf) | ||
100 | #define CFGCHIP1_AMUTESEL0_LOW CFGCHIP1_AMUTESEL0(0x0) | ||
101 | #define CFGCHIP1_AMUTESEL0_BANK_0 CFGCHIP1_AMUTESEL0(0x1) | ||
102 | #define CFGCHIP1_AMUTESEL0_BANK_1 CFGCHIP1_AMUTESEL0(0x2) | ||
103 | #define CFGCHIP1_AMUTESEL0_BANK_2 CFGCHIP1_AMUTESEL0(0x3) | ||
104 | #define CFGCHIP1_AMUTESEL0_BANK_3 CFGCHIP1_AMUTESEL0(0x4) | ||
105 | #define CFGCHIP1_AMUTESEL0_BANK_4 CFGCHIP1_AMUTESEL0(0x5) | ||
106 | #define CFGCHIP1_AMUTESEL0_BANK_5 CFGCHIP1_AMUTESEL0(0x6) | ||
107 | #define CFGCHIP1_AMUTESEL0_BANK_6 CFGCHIP1_AMUTESEL0(0x7) | ||
108 | #define CFGCHIP1_AMUTESEL0_BANK_7 CFGCHIP1_AMUTESEL0(0x8) | ||
109 | |||
110 | /* CFGCHIP2 (USB PHY) register bits */ | ||
111 | #define CFGCHIP2_PHYCLKGD BIT(17) | ||
112 | #define CFGCHIP2_VBUSSENSE BIT(16) | ||
113 | #define CFGCHIP2_RESET BIT(15) | ||
114 | #define CFGCHIP2_OTGMODE(n) ((n) << 13) | ||
115 | #define CFGCHIP2_OTGMODE_MASK CFGCHIP2_OTGMODE(0x3) | ||
116 | #define CFGCHIP2_OTGMODE_NO_OVERRIDE CFGCHIP2_OTGMODE(0x0) | ||
117 | #define CFGCHIP2_OTGMODE_FORCE_HOST CFGCHIP2_OTGMODE(0x1) | ||
118 | #define CFGCHIP2_OTGMODE_FORCE_DEVICE CFGCHIP2_OTGMODE(0x2) | ||
119 | #define CFGCHIP2_OTGMODE_FORCE_HOST_VBUS_LOW CFGCHIP2_OTGMODE(0x3) | ||
120 | #define CFGCHIP2_USB1PHYCLKMUX BIT(12) | ||
121 | #define CFGCHIP2_USB2PHYCLKMUX BIT(11) | ||
122 | #define CFGCHIP2_PHYPWRDN BIT(10) | ||
123 | #define CFGCHIP2_OTGPWRDN BIT(9) | ||
124 | #define CFGCHIP2_DATPOL BIT(8) | ||
125 | #define CFGCHIP2_USB1SUSPENDM BIT(7) | ||
126 | #define CFGCHIP2_PHY_PLLON BIT(6) | ||
127 | #define CFGCHIP2_SESENDEN BIT(5) | ||
128 | #define CFGCHIP2_VBDTCTEN BIT(4) | ||
129 | #define CFGCHIP2_REFFREQ(n) ((n) << 0) | ||
130 | #define CFGCHIP2_REFFREQ_MASK CFGCHIP2_REFFREQ(0xf) | ||
131 | #define CFGCHIP2_REFFREQ_12MHZ CFGCHIP2_REFFREQ(0x1) | ||
132 | #define CFGCHIP2_REFFREQ_24MHZ CFGCHIP2_REFFREQ(0x2) | ||
133 | #define CFGCHIP2_REFFREQ_48MHZ CFGCHIP2_REFFREQ(0x3) | ||
134 | #define CFGCHIP2_REFFREQ_19_2MHZ CFGCHIP2_REFFREQ(0x4) | ||
135 | #define CFGCHIP2_REFFREQ_38_4MHZ CFGCHIP2_REFFREQ(0x5) | ||
136 | #define CFGCHIP2_REFFREQ_13MHZ CFGCHIP2_REFFREQ(0x6) | ||
137 | #define CFGCHIP2_REFFREQ_26MHZ CFGCHIP2_REFFREQ(0x7) | ||
138 | #define CFGCHIP2_REFFREQ_20MHZ CFGCHIP2_REFFREQ(0x8) | ||
139 | #define CFGCHIP2_REFFREQ_40MHZ CFGCHIP2_REFFREQ(0x9) | ||
140 | |||
141 | /* CFGCHIP3 (EMAC/uPP/PLL1/ASYNC3/PRU/DIV4.5/EMIFA) register bits */ | ||
142 | #define CFGCHIP3_RMII_SEL BIT(8) | ||
143 | #define CFGCHIP3_UPP_TX_CLKSRC BIT(6) | ||
144 | #define CFGCHIP3_PLL1_MASTER_LOCK BIT(5) | ||
145 | #define CFGCHIP3_ASYNC3_CLKSRC BIT(4) | ||
146 | #define CFGCHIP3_PRUEVTSEL BIT(3) | ||
147 | #define CFGCHIP3_DIV45PENA BIT(2) | ||
148 | #define CFGCHIP3_EMA_CLKSRC BIT(1) | ||
149 | |||
150 | /* CFGCHIP4 (McASP0 AMUNTEIN) register bits */ | ||
151 | #define CFGCHIP4_AMUTECLR0 BIT(0) | ||
152 | |||
153 | #endif /* __LINUX_MFD_DA8XX_CFGCHIP_H */ | ||
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h index 2567a87872b0..7f55b8b41032 100644 --- a/include/linux/mfd/ti_am335x_tscadc.h +++ b/include/linux/mfd/ti_am335x_tscadc.h | |||
@@ -138,16 +138,16 @@ | |||
138 | /* | 138 | /* |
139 | * time in us for processing a single channel, calculated as follows: | 139 | * time in us for processing a single channel, calculated as follows: |
140 | * | 140 | * |
141 | * num cycles = open delay + (sample delay + conv time) * averaging | 141 | * max num cycles = open delay + (sample delay + conv time) * averaging |
142 | * | 142 | * |
143 | * num cycles: 152 + (1 + 13) * 16 = 376 | 143 | * max num cycles: 262143 + (255 + 13) * 16 = 266431 |
144 | * | 144 | * |
145 | * clock frequency: 26MHz / 8 = 3.25MHz | 145 | * clock frequency: 26MHz / 8 = 3.25MHz |
146 | * clock period: 1 / 3.25MHz = 308ns | 146 | * clock period: 1 / 3.25MHz = 308ns |
147 | * | 147 | * |
148 | * processing time: 376 * 308ns = 116us | 148 | * max processing time: 266431 * 308ns = 83ms(approx) |
149 | */ | 149 | */ |
150 | #define IDLE_TIMEOUT 116 /* microsec */ | 150 | #define IDLE_TIMEOUT 83 /* milliseconds */ |
151 | 151 | ||
152 | #define TSCADC_CELLS 2 | 152 | #define TSCADC_CELLS 2 |
153 | 153 | ||
diff --git a/include/linux/mm.h b/include/linux/mm.h index 08ed53eeedd5..ef815b9cd426 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -2014,6 +2014,7 @@ extern void mm_drop_all_locks(struct mm_struct *mm); | |||
2014 | 2014 | ||
2015 | extern void set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file); | 2015 | extern void set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file); |
2016 | extern struct file *get_mm_exe_file(struct mm_struct *mm); | 2016 | extern struct file *get_mm_exe_file(struct mm_struct *mm); |
2017 | extern struct file *get_task_exe_file(struct task_struct *task); | ||
2017 | 2018 | ||
2018 | extern bool may_expand_vm(struct mm_struct *, vm_flags_t, unsigned long npages); | 2019 | extern bool may_expand_vm(struct mm_struct *, vm_flags_t, unsigned long npages); |
2019 | extern void vm_stat_account(struct mm_struct *, vm_flags_t, long npages); | 2020 | extern void vm_stat_account(struct mm_struct *, vm_flags_t, long npages); |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index d572b78b65e1..7f2ae99e5daf 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
@@ -828,9 +828,21 @@ unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long); | |||
828 | */ | 828 | */ |
829 | #define zone_idx(zone) ((zone) - (zone)->zone_pgdat->node_zones) | 829 | #define zone_idx(zone) ((zone) - (zone)->zone_pgdat->node_zones) |
830 | 830 | ||
831 | static inline int populated_zone(struct zone *zone) | 831 | /* |
832 | * Returns true if a zone has pages managed by the buddy allocator. | ||
833 | * All the reclaim decisions have to use this function rather than | ||
834 | * populated_zone(). If the whole zone is reserved then we can easily | ||
835 | * end up with populated_zone() && !managed_zone(). | ||
836 | */ | ||
837 | static inline bool managed_zone(struct zone *zone) | ||
838 | { | ||
839 | return zone->managed_pages; | ||
840 | } | ||
841 | |||
842 | /* Returns true if a zone has memory */ | ||
843 | static inline bool populated_zone(struct zone *zone) | ||
832 | { | 844 | { |
833 | return (!!zone->present_pages); | 845 | return zone->present_pages; |
834 | } | 846 | } |
835 | 847 | ||
836 | extern int movable_zone; | 848 | extern int movable_zone; |
diff --git a/include/linux/msi.h b/include/linux/msi.h index e8c81fbd5f9c..0db320b7bb15 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h | |||
@@ -68,7 +68,7 @@ struct msi_desc { | |||
68 | unsigned int nvec_used; | 68 | unsigned int nvec_used; |
69 | struct device *dev; | 69 | struct device *dev; |
70 | struct msi_msg msg; | 70 | struct msi_msg msg; |
71 | const struct cpumask *affinity; | 71 | struct cpumask *affinity; |
72 | 72 | ||
73 | union { | 73 | union { |
74 | /* PCI MSI/X specific data */ | 74 | /* PCI MSI/X specific data */ |
@@ -123,7 +123,8 @@ static inline void *msi_desc_to_pci_sysdata(struct msi_desc *desc) | |||
123 | } | 123 | } |
124 | #endif /* CONFIG_PCI_MSI */ | 124 | #endif /* CONFIG_PCI_MSI */ |
125 | 125 | ||
126 | struct msi_desc *alloc_msi_entry(struct device *dev); | 126 | struct msi_desc *alloc_msi_entry(struct device *dev, int nvec, |
127 | const struct cpumask *affinity); | ||
127 | void free_msi_entry(struct msi_desc *entry); | 128 | void free_msi_entry(struct msi_desc *entry); |
128 | void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg); | 129 | void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg); |
129 | void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); | 130 | void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); |
diff --git a/include/linux/netfilter/nfnetlink_acct.h b/include/linux/netfilter/nfnetlink_acct.h index 80ca889b164e..664da0048625 100644 --- a/include/linux/netfilter/nfnetlink_acct.h +++ b/include/linux/netfilter/nfnetlink_acct.h | |||
@@ -15,6 +15,6 @@ struct nf_acct; | |||
15 | struct nf_acct *nfnl_acct_find_get(struct net *net, const char *filter_name); | 15 | struct nf_acct *nfnl_acct_find_get(struct net *net, const char *filter_name); |
16 | void nfnl_acct_put(struct nf_acct *acct); | 16 | void nfnl_acct_put(struct nf_acct *acct); |
17 | void nfnl_acct_update(const struct sk_buff *skb, struct nf_acct *nfacct); | 17 | void nfnl_acct_update(const struct sk_buff *skb, struct nf_acct *nfacct); |
18 | extern int nfnl_acct_overquota(const struct sk_buff *skb, | 18 | int nfnl_acct_overquota(struct net *net, const struct sk_buff *skb, |
19 | struct nf_acct *nfacct); | 19 | struct nf_acct *nfacct); |
20 | #endif /* _NFNL_ACCT_H */ | 20 | #endif /* _NFNL_ACCT_H */ |
diff --git a/include/linux/nvme.h b/include/linux/nvme.h index d8b37bab2887..7676557ce357 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h | |||
@@ -794,7 +794,7 @@ struct nvmf_connect_command { | |||
794 | }; | 794 | }; |
795 | 795 | ||
796 | struct nvmf_connect_data { | 796 | struct nvmf_connect_data { |
797 | uuid_le hostid; | 797 | uuid_be hostid; |
798 | __le16 cntlid; | 798 | __le16 cntlid; |
799 | char resv4[238]; | 799 | char resv4[238]; |
800 | char subsysnqn[NVMF_NQN_FIELD_LEN]; | 800 | char subsysnqn[NVMF_NQN_FIELD_LEN]; |
diff --git a/include/linux/pci.h b/include/linux/pci.h index fbc1fa625c3e..3b0a8004f313 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -683,15 +683,6 @@ struct pci_driver { | |||
683 | #define to_pci_driver(drv) container_of(drv, struct pci_driver, driver) | 683 | #define to_pci_driver(drv) container_of(drv, struct pci_driver, driver) |
684 | 684 | ||
685 | /** | 685 | /** |
686 | * DEFINE_PCI_DEVICE_TABLE - macro used to describe a pci device table | ||
687 | * @_table: device table name | ||
688 | * | ||
689 | * This macro is deprecated and should not be used in new code. | ||
690 | */ | ||
691 | #define DEFINE_PCI_DEVICE_TABLE(_table) \ | ||
692 | const struct pci_device_id _table[] | ||
693 | |||
694 | /** | ||
695 | * PCI_DEVICE - macro used to describe a specific pci device | 686 | * PCI_DEVICE - macro used to describe a specific pci device |
696 | * @vend: the 16 bit PCI Vendor ID | 687 | * @vend: the 16 bit PCI Vendor ID |
697 | * @dev: the 16 bit PCI Device ID | 688 | * @dev: the 16 bit PCI Device ID |
@@ -1309,6 +1300,7 @@ int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs, | |||
1309 | unsigned int max_vecs, unsigned int flags); | 1300 | unsigned int max_vecs, unsigned int flags); |
1310 | void pci_free_irq_vectors(struct pci_dev *dev); | 1301 | void pci_free_irq_vectors(struct pci_dev *dev); |
1311 | int pci_irq_vector(struct pci_dev *dev, unsigned int nr); | 1302 | int pci_irq_vector(struct pci_dev *dev, unsigned int nr); |
1303 | const struct cpumask *pci_irq_get_affinity(struct pci_dev *pdev, int vec); | ||
1312 | 1304 | ||
1313 | #else | 1305 | #else |
1314 | static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; } | 1306 | static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; } |
@@ -1351,6 +1343,11 @@ static inline int pci_irq_vector(struct pci_dev *dev, unsigned int nr) | |||
1351 | return -EINVAL; | 1343 | return -EINVAL; |
1352 | return dev->irq; | 1344 | return dev->irq; |
1353 | } | 1345 | } |
1346 | static inline const struct cpumask *pci_irq_get_affinity(struct pci_dev *pdev, | ||
1347 | int vec) | ||
1348 | { | ||
1349 | return cpu_possible_mask; | ||
1350 | } | ||
1354 | #endif | 1351 | #endif |
1355 | 1352 | ||
1356 | #ifdef CONFIG_PCIEPORTBUS | 1353 | #ifdef CONFIG_PCIEPORTBUS |
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index 923266cd294a..48ec7651989b 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h | |||
@@ -111,7 +111,6 @@ struct uart_8250_port { | |||
111 | * if no_console_suspend | 111 | * if no_console_suspend |
112 | */ | 112 | */ |
113 | unsigned char probe; | 113 | unsigned char probe; |
114 | struct mctrl_gpios *gpios; | ||
115 | #define UART_PROBE_RSA (1 << 0) | 114 | #define UART_PROBE_RSA (1 << 0) |
116 | 115 | ||
117 | /* | 116 | /* |
diff --git a/include/linux/smc91x.h b/include/linux/smc91x.h index 76199b75d584..e302c447e057 100644 --- a/include/linux/smc91x.h +++ b/include/linux/smc91x.h | |||
@@ -1,6 +1,16 @@ | |||
1 | #ifndef __SMC91X_H__ | 1 | #ifndef __SMC91X_H__ |
2 | #define __SMC91X_H__ | 2 | #define __SMC91X_H__ |
3 | 3 | ||
4 | /* | ||
5 | * These bits define which access sizes a platform can support, rather | ||
6 | * than the maximal access size. So, if your platform can do 16-bit | ||
7 | * and 32-bit accesses to the SMC91x device, but not 8-bit, set both | ||
8 | * SMC91X_USE_16BIT and SMC91X_USE_32BIT. | ||
9 | * | ||
10 | * The SMC91x driver requires at least one of SMC91X_USE_8BIT or | ||
11 | * SMC91X_USE_16BIT to be supported - just setting SMC91X_USE_32BIT is | ||
12 | * an invalid configuration. | ||
13 | */ | ||
4 | #define SMC91X_USE_8BIT (1 << 0) | 14 | #define SMC91X_USE_8BIT (1 << 0) |
5 | #define SMC91X_USE_16BIT (1 << 1) | 15 | #define SMC91X_USE_16BIT (1 << 1) |
6 | #define SMC91X_USE_32BIT (1 << 2) | 16 | #define SMC91X_USE_32BIT (1 << 2) |
diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h index cbd8990e2e77..2b5b10eed74f 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h | |||
@@ -118,10 +118,11 @@ static inline int arch_within_stack_frames(const void * const stack, | |||
118 | extern void __check_object_size(const void *ptr, unsigned long n, | 118 | extern void __check_object_size(const void *ptr, unsigned long n, |
119 | bool to_user); | 119 | bool to_user); |
120 | 120 | ||
121 | static inline void check_object_size(const void *ptr, unsigned long n, | 121 | static __always_inline void check_object_size(const void *ptr, unsigned long n, |
122 | bool to_user) | 122 | bool to_user) |
123 | { | 123 | { |
124 | __check_object_size(ptr, n, to_user); | 124 | if (!__builtin_constant_p(n)) |
125 | __check_object_size(ptr, n, to_user); | ||
125 | } | 126 | } |
126 | #else | 127 | #else |
127 | static inline void check_object_size(const void *ptr, unsigned long n, | 128 | static inline void check_object_size(const void *ptr, unsigned long n, |
diff --git a/include/net/tcp.h b/include/net/tcp.h index c00e7d51bb18..7717302cab91 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -1523,6 +1523,8 @@ static inline void tcp_check_send_head(struct sock *sk, struct sk_buff *skb_unli | |||
1523 | { | 1523 | { |
1524 | if (sk->sk_send_head == skb_unlinked) | 1524 | if (sk->sk_send_head == skb_unlinked) |
1525 | sk->sk_send_head = NULL; | 1525 | sk->sk_send_head = NULL; |
1526 | if (tcp_sk(sk)->highest_sack == skb_unlinked) | ||
1527 | tcp_sk(sk)->highest_sack = NULL; | ||
1526 | } | 1528 | } |
1527 | 1529 | ||
1528 | static inline void tcp_init_send_head(struct sock *sk) | 1530 | static inline void tcp_init_send_head(struct sock *sk) |
diff --git a/include/scsi/scsi_transport_sas.h b/include/scsi/scsi_transport_sas.h index 13c0b2ba1b6c..73d870918939 100644 --- a/include/scsi/scsi_transport_sas.h +++ b/include/scsi/scsi_transport_sas.h | |||
@@ -11,12 +11,12 @@ struct sas_rphy; | |||
11 | struct request; | 11 | struct request; |
12 | 12 | ||
13 | #if !IS_ENABLED(CONFIG_SCSI_SAS_ATTRS) | 13 | #if !IS_ENABLED(CONFIG_SCSI_SAS_ATTRS) |
14 | static inline int is_sas_attached(struct scsi_device *sdev) | 14 | static inline int scsi_is_sas_rphy(const struct device *sdev) |
15 | { | 15 | { |
16 | return 0; | 16 | return 0; |
17 | } | 17 | } |
18 | #else | 18 | #else |
19 | extern int is_sas_attached(struct scsi_device *sdev); | 19 | extern int scsi_is_sas_rphy(const struct device *); |
20 | #endif | 20 | #endif |
21 | 21 | ||
22 | static inline int sas_protocol_ata(enum sas_protocol proto) | 22 | static inline int sas_protocol_ata(enum sas_protocol proto) |
@@ -202,7 +202,6 @@ extern int sas_rphy_add(struct sas_rphy *); | |||
202 | extern void sas_rphy_remove(struct sas_rphy *); | 202 | extern void sas_rphy_remove(struct sas_rphy *); |
203 | extern void sas_rphy_delete(struct sas_rphy *); | 203 | extern void sas_rphy_delete(struct sas_rphy *); |
204 | extern void sas_rphy_unlink(struct sas_rphy *); | 204 | extern void sas_rphy_unlink(struct sas_rphy *); |
205 | extern int scsi_is_sas_rphy(const struct device *); | ||
206 | 205 | ||
207 | struct sas_port *sas_port_alloc(struct device *, int); | 206 | struct sas_port *sas_port_alloc(struct device *, int); |
208 | struct sas_port *sas_port_alloc_num(struct device *); | 207 | struct sas_port *sas_port_alloc_num(struct device *); |
diff --git a/include/uapi/linux/atm_zatm.h b/include/uapi/linux/atm_zatm.h index 9c9c6ad55f14..5cd4d4d2dd1d 100644 --- a/include/uapi/linux/atm_zatm.h +++ b/include/uapi/linux/atm_zatm.h | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #include <linux/atmapi.h> | 15 | #include <linux/atmapi.h> |
16 | #include <linux/atmioc.h> | 16 | #include <linux/atmioc.h> |
17 | #include <linux/time.h> | ||
17 | 18 | ||
18 | #define ZATM_GETPOOL _IOW('a',ATMIOC_SARPRV+1,struct atmif_sioc) | 19 | #define ZATM_GETPOOL _IOW('a',ATMIOC_SARPRV+1,struct atmif_sioc) |
19 | /* get pool statistics */ | 20 | /* get pool statistics */ |
diff --git a/include/uapi/linux/if_pppol2tp.h b/include/uapi/linux/if_pppol2tp.h index 163e8adac2d6..4bd1f55d6377 100644 --- a/include/uapi/linux/if_pppol2tp.h +++ b/include/uapi/linux/if_pppol2tp.h | |||
@@ -16,7 +16,8 @@ | |||
16 | #define _UAPI__LINUX_IF_PPPOL2TP_H | 16 | #define _UAPI__LINUX_IF_PPPOL2TP_H |
17 | 17 | ||
18 | #include <linux/types.h> | 18 | #include <linux/types.h> |
19 | 19 | #include <linux/in.h> | |
20 | #include <linux/in6.h> | ||
20 | 21 | ||
21 | /* Structure used to connect() the socket to a particular tunnel UDP | 22 | /* Structure used to connect() the socket to a particular tunnel UDP |
22 | * socket over IPv4. | 23 | * socket over IPv4. |
diff --git a/include/uapi/linux/if_pppox.h b/include/uapi/linux/if_pppox.h index e128769331b5..d37bbb17a007 100644 --- a/include/uapi/linux/if_pppox.h +++ b/include/uapi/linux/if_pppox.h | |||
@@ -21,8 +21,11 @@ | |||
21 | #include <asm/byteorder.h> | 21 | #include <asm/byteorder.h> |
22 | 22 | ||
23 | #include <linux/socket.h> | 23 | #include <linux/socket.h> |
24 | #include <linux/if.h> | ||
24 | #include <linux/if_ether.h> | 25 | #include <linux/if_ether.h> |
25 | #include <linux/if_pppol2tp.h> | 26 | #include <linux/if_pppol2tp.h> |
27 | #include <linux/in.h> | ||
28 | #include <linux/in6.h> | ||
26 | 29 | ||
27 | /* For user-space programs to pick up these definitions | 30 | /* For user-space programs to pick up these definitions |
28 | * which they wouldn't get otherwise without defining __KERNEL__ | 31 | * which they wouldn't get otherwise without defining __KERNEL__ |
diff --git a/include/uapi/linux/if_tunnel.h b/include/uapi/linux/if_tunnel.h index 1046f5515174..777b6cdb1b7b 100644 --- a/include/uapi/linux/if_tunnel.h +++ b/include/uapi/linux/if_tunnel.h | |||
@@ -2,6 +2,9 @@ | |||
2 | #define _UAPI_IF_TUNNEL_H_ | 2 | #define _UAPI_IF_TUNNEL_H_ |
3 | 3 | ||
4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
5 | #include <linux/if.h> | ||
6 | #include <linux/ip.h> | ||
7 | #include <linux/in6.h> | ||
5 | #include <asm/byteorder.h> | 8 | #include <asm/byteorder.h> |
6 | 9 | ||
7 | 10 | ||
diff --git a/include/uapi/linux/ipx.h b/include/uapi/linux/ipx.h index 3d48014cdd71..30f031db12f6 100644 --- a/include/uapi/linux/ipx.h +++ b/include/uapi/linux/ipx.h | |||
@@ -1,11 +1,13 @@ | |||
1 | #ifndef _IPX_H_ | 1 | #ifndef _IPX_H_ |
2 | #define _IPX_H_ | 2 | #define _IPX_H_ |
3 | #include <linux/libc-compat.h> /* for compatibility with glibc netipx/ipx.h */ | ||
3 | #include <linux/types.h> | 4 | #include <linux/types.h> |
4 | #include <linux/sockios.h> | 5 | #include <linux/sockios.h> |
5 | #include <linux/socket.h> | 6 | #include <linux/socket.h> |
6 | #define IPX_NODE_LEN 6 | 7 | #define IPX_NODE_LEN 6 |
7 | #define IPX_MTU 576 | 8 | #define IPX_MTU 576 |
8 | 9 | ||
10 | #if __UAPI_DEF_SOCKADDR_IPX | ||
9 | struct sockaddr_ipx { | 11 | struct sockaddr_ipx { |
10 | __kernel_sa_family_t sipx_family; | 12 | __kernel_sa_family_t sipx_family; |
11 | __be16 sipx_port; | 13 | __be16 sipx_port; |
@@ -14,6 +16,7 @@ struct sockaddr_ipx { | |||
14 | __u8 sipx_type; | 16 | __u8 sipx_type; |
15 | unsigned char sipx_zero; /* 16 byte fill */ | 17 | unsigned char sipx_zero; /* 16 byte fill */ |
16 | }; | 18 | }; |
19 | #endif /* __UAPI_DEF_SOCKADDR_IPX */ | ||
17 | 20 | ||
18 | /* | 21 | /* |
19 | * So we can fit the extra info for SIOCSIFADDR into the address nicely | 22 | * So we can fit the extra info for SIOCSIFADDR into the address nicely |
@@ -23,12 +26,15 @@ struct sockaddr_ipx { | |||
23 | #define IPX_DLTITF 0 | 26 | #define IPX_DLTITF 0 |
24 | #define IPX_CRTITF 1 | 27 | #define IPX_CRTITF 1 |
25 | 28 | ||
29 | #if __UAPI_DEF_IPX_ROUTE_DEFINITION | ||
26 | struct ipx_route_definition { | 30 | struct ipx_route_definition { |
27 | __be32 ipx_network; | 31 | __be32 ipx_network; |
28 | __be32 ipx_router_network; | 32 | __be32 ipx_router_network; |
29 | unsigned char ipx_router_node[IPX_NODE_LEN]; | 33 | unsigned char ipx_router_node[IPX_NODE_LEN]; |
30 | }; | 34 | }; |
35 | #endif /* __UAPI_DEF_IPX_ROUTE_DEFINITION */ | ||
31 | 36 | ||
37 | #if __UAPI_DEF_IPX_INTERFACE_DEFINITION | ||
32 | struct ipx_interface_definition { | 38 | struct ipx_interface_definition { |
33 | __be32 ipx_network; | 39 | __be32 ipx_network; |
34 | unsigned char ipx_device[16]; | 40 | unsigned char ipx_device[16]; |
@@ -45,16 +51,20 @@ struct ipx_interface_definition { | |||
45 | #define IPX_INTERNAL 2 | 51 | #define IPX_INTERNAL 2 |
46 | unsigned char ipx_node[IPX_NODE_LEN]; | 52 | unsigned char ipx_node[IPX_NODE_LEN]; |
47 | }; | 53 | }; |
48 | 54 | #endif /* __UAPI_DEF_IPX_INTERFACE_DEFINITION */ | |
55 | |||
56 | #if __UAPI_DEF_IPX_CONFIG_DATA | ||
49 | struct ipx_config_data { | 57 | struct ipx_config_data { |
50 | unsigned char ipxcfg_auto_select_primary; | 58 | unsigned char ipxcfg_auto_select_primary; |
51 | unsigned char ipxcfg_auto_create_interfaces; | 59 | unsigned char ipxcfg_auto_create_interfaces; |
52 | }; | 60 | }; |
61 | #endif /* __UAPI_DEF_IPX_CONFIG_DATA */ | ||
53 | 62 | ||
54 | /* | 63 | /* |
55 | * OLD Route Definition for backward compatibility. | 64 | * OLD Route Definition for backward compatibility. |
56 | */ | 65 | */ |
57 | 66 | ||
67 | #if __UAPI_DEF_IPX_ROUTE_DEF | ||
58 | struct ipx_route_def { | 68 | struct ipx_route_def { |
59 | __be32 ipx_network; | 69 | __be32 ipx_network; |
60 | __be32 ipx_router_network; | 70 | __be32 ipx_router_network; |
@@ -67,6 +77,7 @@ struct ipx_route_def { | |||
67 | #define IPX_RT_BLUEBOOK 2 | 77 | #define IPX_RT_BLUEBOOK 2 |
68 | #define IPX_RT_ROUTED 1 | 78 | #define IPX_RT_ROUTED 1 |
69 | }; | 79 | }; |
80 | #endif /* __UAPI_DEF_IPX_ROUTE_DEF */ | ||
70 | 81 | ||
71 | #define SIOCAIPXITFCRT (SIOCPROTOPRIVATE) | 82 | #define SIOCAIPXITFCRT (SIOCPROTOPRIVATE) |
72 | #define SIOCAIPXPRISLT (SIOCPROTOPRIVATE + 1) | 83 | #define SIOCAIPXPRISLT (SIOCPROTOPRIVATE + 1) |
diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h index e4f048ee7043..44b8a6bd5fe1 100644 --- a/include/uapi/linux/libc-compat.h +++ b/include/uapi/linux/libc-compat.h | |||
@@ -139,6 +139,25 @@ | |||
139 | 139 | ||
140 | #endif /* _NETINET_IN_H */ | 140 | #endif /* _NETINET_IN_H */ |
141 | 141 | ||
142 | /* Coordinate with glibc netipx/ipx.h header. */ | ||
143 | #if defined(__NETIPX_IPX_H) | ||
144 | |||
145 | #define __UAPI_DEF_SOCKADDR_IPX 0 | ||
146 | #define __UAPI_DEF_IPX_ROUTE_DEFINITION 0 | ||
147 | #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 0 | ||
148 | #define __UAPI_DEF_IPX_CONFIG_DATA 0 | ||
149 | #define __UAPI_DEF_IPX_ROUTE_DEF 0 | ||
150 | |||
151 | #else /* defined(__NETIPX_IPX_H) */ | ||
152 | |||
153 | #define __UAPI_DEF_SOCKADDR_IPX 1 | ||
154 | #define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 | ||
155 | #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 | ||
156 | #define __UAPI_DEF_IPX_CONFIG_DATA 1 | ||
157 | #define __UAPI_DEF_IPX_ROUTE_DEF 1 | ||
158 | |||
159 | #endif /* defined(__NETIPX_IPX_H) */ | ||
160 | |||
142 | /* Definitions for xattr.h */ | 161 | /* Definitions for xattr.h */ |
143 | #if defined(_SYS_XATTR_H) | 162 | #if defined(_SYS_XATTR_H) |
144 | #define __UAPI_DEF_XATTR 0 | 163 | #define __UAPI_DEF_XATTR 0 |
@@ -179,6 +198,13 @@ | |||
179 | #define __UAPI_DEF_IN6_PKTINFO 1 | 198 | #define __UAPI_DEF_IN6_PKTINFO 1 |
180 | #define __UAPI_DEF_IP6_MTUINFO 1 | 199 | #define __UAPI_DEF_IP6_MTUINFO 1 |
181 | 200 | ||
201 | /* Definitions for ipx.h */ | ||
202 | #define __UAPI_DEF_SOCKADDR_IPX 1 | ||
203 | #define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 | ||
204 | #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 | ||
205 | #define __UAPI_DEF_IPX_CONFIG_DATA 1 | ||
206 | #define __UAPI_DEF_IPX_ROUTE_DEF 1 | ||
207 | |||
182 | /* Definitions for xattr.h */ | 208 | /* Definitions for xattr.h */ |
183 | #define __UAPI_DEF_XATTR 1 | 209 | #define __UAPI_DEF_XATTR 1 |
184 | 210 | ||
diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h index d95a3018f6a1..54c3b4f4aceb 100644 --- a/include/uapi/linux/openvswitch.h +++ b/include/uapi/linux/openvswitch.h | |||
@@ -583,7 +583,7 @@ enum ovs_userspace_attr { | |||
583 | #define OVS_USERSPACE_ATTR_MAX (__OVS_USERSPACE_ATTR_MAX - 1) | 583 | #define OVS_USERSPACE_ATTR_MAX (__OVS_USERSPACE_ATTR_MAX - 1) |
584 | 584 | ||
585 | struct ovs_action_trunc { | 585 | struct ovs_action_trunc { |
586 | uint32_t max_len; /* Max packet size in bytes. */ | 586 | __u32 max_len; /* Max packet size in bytes. */ |
587 | }; | 587 | }; |
588 | 588 | ||
589 | /** | 589 | /** |
@@ -632,8 +632,8 @@ enum ovs_hash_alg { | |||
632 | * @hash_basis: basis used for computing hash. | 632 | * @hash_basis: basis used for computing hash. |
633 | */ | 633 | */ |
634 | struct ovs_action_hash { | 634 | struct ovs_action_hash { |
635 | uint32_t hash_alg; /* One of ovs_hash_alg. */ | 635 | __u32 hash_alg; /* One of ovs_hash_alg. */ |
636 | uint32_t hash_basis; | 636 | __u32 hash_basis; |
637 | }; | 637 | }; |
638 | 638 | ||
639 | /** | 639 | /** |
diff --git a/kernel/audit_watch.c b/kernel/audit_watch.c index d6709eb70970..0d302a87f21b 100644 --- a/kernel/audit_watch.c +++ b/kernel/audit_watch.c | |||
@@ -19,6 +19,7 @@ | |||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/file.h> | ||
22 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
23 | #include <linux/audit.h> | 24 | #include <linux/audit.h> |
24 | #include <linux/kthread.h> | 25 | #include <linux/kthread.h> |
@@ -544,10 +545,11 @@ int audit_exe_compare(struct task_struct *tsk, struct audit_fsnotify_mark *mark) | |||
544 | unsigned long ino; | 545 | unsigned long ino; |
545 | dev_t dev; | 546 | dev_t dev; |
546 | 547 | ||
547 | rcu_read_lock(); | 548 | exe_file = get_task_exe_file(tsk); |
548 | exe_file = rcu_dereference(tsk->mm->exe_file); | 549 | if (!exe_file) |
550 | return 0; | ||
549 | ino = exe_file->f_inode->i_ino; | 551 | ino = exe_file->f_inode->i_ino; |
550 | dev = exe_file->f_inode->i_sb->s_dev; | 552 | dev = exe_file->f_inode->i_sb->s_dev; |
551 | rcu_read_unlock(); | 553 | fput(exe_file); |
552 | return audit_mark_compare(mark, ino, dev); | 554 | return audit_mark_compare(mark, ino, dev); |
553 | } | 555 | } |
diff --git a/kernel/configs/tiny.config b/kernel/configs/tiny.config index c2de56ab0fce..7fa0c4ae6394 100644 --- a/kernel/configs/tiny.config +++ b/kernel/configs/tiny.config | |||
@@ -1,4 +1,12 @@ | |||
1 | # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set | ||
1 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 2 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
3 | # CONFIG_KERNEL_GZIP is not set | ||
4 | # CONFIG_KERNEL_BZIP2 is not set | ||
5 | # CONFIG_KERNEL_LZMA is not set | ||
2 | CONFIG_KERNEL_XZ=y | 6 | CONFIG_KERNEL_XZ=y |
7 | # CONFIG_KERNEL_LZO is not set | ||
8 | # CONFIG_KERNEL_LZ4 is not set | ||
3 | CONFIG_OPTIMIZE_INLINING=y | 9 | CONFIG_OPTIMIZE_INLINING=y |
10 | # CONFIG_SLAB is not set | ||
11 | # CONFIG_SLUB is not set | ||
4 | CONFIG_SLOB=y | 12 | CONFIG_SLOB=y |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index c7fd2778ed50..c27e53326bef 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -2069,6 +2069,20 @@ static void cpuset_bind(struct cgroup_subsys_state *root_css) | |||
2069 | mutex_unlock(&cpuset_mutex); | 2069 | mutex_unlock(&cpuset_mutex); |
2070 | } | 2070 | } |
2071 | 2071 | ||
2072 | /* | ||
2073 | * Make sure the new task conform to the current state of its parent, | ||
2074 | * which could have been changed by cpuset just after it inherits the | ||
2075 | * state from the parent and before it sits on the cgroup's task list. | ||
2076 | */ | ||
2077 | void cpuset_fork(struct task_struct *task) | ||
2078 | { | ||
2079 | if (task_css_is_root(task, cpuset_cgrp_id)) | ||
2080 | return; | ||
2081 | |||
2082 | set_cpus_allowed_ptr(task, ¤t->cpus_allowed); | ||
2083 | task->mems_allowed = current->mems_allowed; | ||
2084 | } | ||
2085 | |||
2072 | struct cgroup_subsys cpuset_cgrp_subsys = { | 2086 | struct cgroup_subsys cpuset_cgrp_subsys = { |
2073 | .css_alloc = cpuset_css_alloc, | 2087 | .css_alloc = cpuset_css_alloc, |
2074 | .css_online = cpuset_css_online, | 2088 | .css_online = cpuset_css_online, |
@@ -2079,6 +2093,7 @@ struct cgroup_subsys cpuset_cgrp_subsys = { | |||
2079 | .attach = cpuset_attach, | 2093 | .attach = cpuset_attach, |
2080 | .post_attach = cpuset_post_attach, | 2094 | .post_attach = cpuset_post_attach, |
2081 | .bind = cpuset_bind, | 2095 | .bind = cpuset_bind, |
2096 | .fork = cpuset_fork, | ||
2082 | .legacy_cftypes = files, | 2097 | .legacy_cftypes = files, |
2083 | .early_init = true, | 2098 | .early_init = true, |
2084 | }; | 2099 | }; |
diff --git a/kernel/exit.c b/kernel/exit.c index 2f974ae042a6..091a78be3b09 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -848,12 +848,7 @@ void do_exit(long code) | |||
848 | TASKS_RCU(preempt_enable()); | 848 | TASKS_RCU(preempt_enable()); |
849 | exit_notify(tsk, group_dead); | 849 | exit_notify(tsk, group_dead); |
850 | proc_exit_connector(tsk); | 850 | proc_exit_connector(tsk); |
851 | #ifdef CONFIG_NUMA | 851 | mpol_put_task_policy(tsk); |
852 | task_lock(tsk); | ||
853 | mpol_put(tsk->mempolicy); | ||
854 | tsk->mempolicy = NULL; | ||
855 | task_unlock(tsk); | ||
856 | #endif | ||
857 | #ifdef CONFIG_FUTEX | 852 | #ifdef CONFIG_FUTEX |
858 | if (unlikely(current->pi_state_cache)) | 853 | if (unlikely(current->pi_state_cache)) |
859 | kfree(current->pi_state_cache); | 854 | kfree(current->pi_state_cache); |
diff --git a/kernel/fork.c b/kernel/fork.c index 52e725d4a866..beb31725f7e2 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -799,6 +799,29 @@ struct file *get_mm_exe_file(struct mm_struct *mm) | |||
799 | EXPORT_SYMBOL(get_mm_exe_file); | 799 | EXPORT_SYMBOL(get_mm_exe_file); |
800 | 800 | ||
801 | /** | 801 | /** |
802 | * get_task_exe_file - acquire a reference to the task's executable file | ||
803 | * | ||
804 | * Returns %NULL if task's mm (if any) has no associated executable file or | ||
805 | * this is a kernel thread with borrowed mm (see the comment above get_task_mm). | ||
806 | * User must release file via fput(). | ||
807 | */ | ||
808 | struct file *get_task_exe_file(struct task_struct *task) | ||
809 | { | ||
810 | struct file *exe_file = NULL; | ||
811 | struct mm_struct *mm; | ||
812 | |||
813 | task_lock(task); | ||
814 | mm = task->mm; | ||
815 | if (mm) { | ||
816 | if (!(task->flags & PF_KTHREAD)) | ||
817 | exe_file = get_mm_exe_file(mm); | ||
818 | } | ||
819 | task_unlock(task); | ||
820 | return exe_file; | ||
821 | } | ||
822 | EXPORT_SYMBOL(get_task_exe_file); | ||
823 | |||
824 | /** | ||
802 | * get_task_mm - acquire a reference to the task's mm | 825 | * get_task_mm - acquire a reference to the task's mm |
803 | * | 826 | * |
804 | * Returns %NULL if the task has no mm. Checks PF_KTHREAD (meaning | 827 | * Returns %NULL if the task has no mm. Checks PF_KTHREAD (meaning |
@@ -913,14 +936,12 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
913 | deactivate_mm(tsk, mm); | 936 | deactivate_mm(tsk, mm); |
914 | 937 | ||
915 | /* | 938 | /* |
916 | * If we're exiting normally, clear a user-space tid field if | 939 | * Signal userspace if we're not exiting with a core dump |
917 | * requested. We leave this alone when dying by signal, to leave | 940 | * because we want to leave the value intact for debugging |
918 | * the value intact in a core dump, and to save the unnecessary | 941 | * purposes. |
919 | * trouble, say, a killed vfork parent shouldn't touch this mm. | ||
920 | * Userland only wants this done for a sys_exit. | ||
921 | */ | 942 | */ |
922 | if (tsk->clear_child_tid) { | 943 | if (tsk->clear_child_tid) { |
923 | if (!(tsk->flags & PF_SIGNALED) && | 944 | if (!(tsk->signal->flags & SIGNAL_GROUP_COREDUMP) && |
924 | atomic_read(&mm->mm_users) > 1) { | 945 | atomic_read(&mm->mm_users) > 1) { |
925 | /* | 946 | /* |
926 | * We don't check the error code - if userspace has | 947 | * We don't check the error code - if userspace has |
@@ -1404,7 +1425,6 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1404 | p->real_start_time = ktime_get_boot_ns(); | 1425 | p->real_start_time = ktime_get_boot_ns(); |
1405 | p->io_context = NULL; | 1426 | p->io_context = NULL; |
1406 | p->audit_context = NULL; | 1427 | p->audit_context = NULL; |
1407 | threadgroup_change_begin(current); | ||
1408 | cgroup_fork(p); | 1428 | cgroup_fork(p); |
1409 | #ifdef CONFIG_NUMA | 1429 | #ifdef CONFIG_NUMA |
1410 | p->mempolicy = mpol_dup(p->mempolicy); | 1430 | p->mempolicy = mpol_dup(p->mempolicy); |
@@ -1556,6 +1576,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1556 | INIT_LIST_HEAD(&p->thread_group); | 1576 | INIT_LIST_HEAD(&p->thread_group); |
1557 | p->task_works = NULL; | 1577 | p->task_works = NULL; |
1558 | 1578 | ||
1579 | threadgroup_change_begin(current); | ||
1559 | /* | 1580 | /* |
1560 | * Ensure that the cgroup subsystem policies allow the new process to be | 1581 | * Ensure that the cgroup subsystem policies allow the new process to be |
1561 | * forked. It should be noted the the new process's css_set can be changed | 1582 | * forked. It should be noted the the new process's css_set can be changed |
@@ -1656,6 +1677,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1656 | bad_fork_cancel_cgroup: | 1677 | bad_fork_cancel_cgroup: |
1657 | cgroup_cancel_fork(p); | 1678 | cgroup_cancel_fork(p); |
1658 | bad_fork_free_pid: | 1679 | bad_fork_free_pid: |
1680 | threadgroup_change_end(current); | ||
1659 | if (pid != &init_struct_pid) | 1681 | if (pid != &init_struct_pid) |
1660 | free_pid(pid); | 1682 | free_pid(pid); |
1661 | bad_fork_cleanup_thread: | 1683 | bad_fork_cleanup_thread: |
@@ -1688,7 +1710,6 @@ bad_fork_cleanup_policy: | |||
1688 | mpol_put(p->mempolicy); | 1710 | mpol_put(p->mempolicy); |
1689 | bad_fork_cleanup_threadgroup_lock: | 1711 | bad_fork_cleanup_threadgroup_lock: |
1690 | #endif | 1712 | #endif |
1691 | threadgroup_change_end(current); | ||
1692 | delayacct_tsk_free(p); | 1713 | delayacct_tsk_free(p); |
1693 | bad_fork_cleanup_count: | 1714 | bad_fork_cleanup_count: |
1694 | atomic_dec(&p->cred->user->processes); | 1715 | atomic_dec(&p->cred->user->processes); |
diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c index 32f6cfcff212..17f51d63da56 100644 --- a/kernel/irq/affinity.c +++ b/kernel/irq/affinity.c | |||
@@ -4,60 +4,151 @@ | |||
4 | #include <linux/slab.h> | 4 | #include <linux/slab.h> |
5 | #include <linux/cpu.h> | 5 | #include <linux/cpu.h> |
6 | 6 | ||
7 | static int get_first_sibling(unsigned int cpu) | 7 | static void irq_spread_init_one(struct cpumask *irqmsk, struct cpumask *nmsk, |
8 | int cpus_per_vec) | ||
8 | { | 9 | { |
9 | unsigned int ret; | 10 | const struct cpumask *siblmsk; |
11 | int cpu, sibl; | ||
10 | 12 | ||
11 | ret = cpumask_first(topology_sibling_cpumask(cpu)); | 13 | for ( ; cpus_per_vec > 0; ) { |
12 | if (ret < nr_cpu_ids) | 14 | cpu = cpumask_first(nmsk); |
13 | return ret; | 15 | |
14 | return cpu; | 16 | /* Should not happen, but I'm too lazy to think about it */ |
17 | if (cpu >= nr_cpu_ids) | ||
18 | return; | ||
19 | |||
20 | cpumask_clear_cpu(cpu, nmsk); | ||
21 | cpumask_set_cpu(cpu, irqmsk); | ||
22 | cpus_per_vec--; | ||
23 | |||
24 | /* If the cpu has siblings, use them first */ | ||
25 | siblmsk = topology_sibling_cpumask(cpu); | ||
26 | for (sibl = -1; cpus_per_vec > 0; ) { | ||
27 | sibl = cpumask_next(sibl, siblmsk); | ||
28 | if (sibl >= nr_cpu_ids) | ||
29 | break; | ||
30 | if (!cpumask_test_and_clear_cpu(sibl, nmsk)) | ||
31 | continue; | ||
32 | cpumask_set_cpu(sibl, irqmsk); | ||
33 | cpus_per_vec--; | ||
34 | } | ||
35 | } | ||
36 | } | ||
37 | |||
38 | static int get_nodes_in_cpumask(const struct cpumask *mask, nodemask_t *nodemsk) | ||
39 | { | ||
40 | int n, nodes; | ||
41 | |||
42 | /* Calculate the number of nodes in the supplied affinity mask */ | ||
43 | for (n = 0, nodes = 0; n < num_online_nodes(); n++) { | ||
44 | if (cpumask_intersects(mask, cpumask_of_node(n))) { | ||
45 | node_set(n, *nodemsk); | ||
46 | nodes++; | ||
47 | } | ||
48 | } | ||
49 | return nodes; | ||
15 | } | 50 | } |
16 | 51 | ||
17 | /* | 52 | /** |
18 | * Take a map of online CPUs and the number of available interrupt vectors | 53 | * irq_create_affinity_masks - Create affinity masks for multiqueue spreading |
19 | * and generate an output cpumask suitable for spreading MSI/MSI-X vectors | 54 | * @affinity: The affinity mask to spread. If NULL cpu_online_mask |
20 | * so that they are distributed as good as possible around the CPUs. If | 55 | * is used |
21 | * more vectors than CPUs are available we'll map one to each CPU, | 56 | * @nvecs: The number of vectors |
22 | * otherwise we map one to the first sibling of each socket. | ||
23 | * | 57 | * |
24 | * If there are more vectors than CPUs we will still only have one bit | 58 | * Returns the masks pointer or NULL if allocation failed. |
25 | * set per CPU, but interrupt code will keep on assigning the vectors from | ||
26 | * the start of the bitmap until we run out of vectors. | ||
27 | */ | 59 | */ |
28 | struct cpumask *irq_create_affinity_mask(unsigned int *nr_vecs) | 60 | struct cpumask *irq_create_affinity_masks(const struct cpumask *affinity, |
61 | int nvec) | ||
29 | { | 62 | { |
30 | struct cpumask *affinity_mask; | 63 | int n, nodes, vecs_per_node, cpus_per_vec, extra_vecs, curvec = 0; |
31 | unsigned int max_vecs = *nr_vecs; | 64 | nodemask_t nodemsk = NODE_MASK_NONE; |
65 | struct cpumask *masks; | ||
66 | cpumask_var_t nmsk; | ||
32 | 67 | ||
33 | if (max_vecs == 1) | 68 | if (!zalloc_cpumask_var(&nmsk, GFP_KERNEL)) |
34 | return NULL; | 69 | return NULL; |
35 | 70 | ||
36 | affinity_mask = kzalloc(cpumask_size(), GFP_KERNEL); | 71 | masks = kzalloc(nvec * sizeof(*masks), GFP_KERNEL); |
37 | if (!affinity_mask) { | 72 | if (!masks) |
38 | *nr_vecs = 1; | 73 | goto out; |
39 | return NULL; | ||
40 | } | ||
41 | 74 | ||
75 | /* Stabilize the cpumasks */ | ||
42 | get_online_cpus(); | 76 | get_online_cpus(); |
43 | if (max_vecs >= num_online_cpus()) { | 77 | /* If the supplied affinity mask is NULL, use cpu online mask */ |
44 | cpumask_copy(affinity_mask, cpu_online_mask); | 78 | if (!affinity) |
45 | *nr_vecs = num_online_cpus(); | 79 | affinity = cpu_online_mask; |
46 | } else { | 80 | |
47 | unsigned int vecs = 0, cpu; | 81 | nodes = get_nodes_in_cpumask(affinity, &nodemsk); |
48 | |||
49 | for_each_online_cpu(cpu) { | ||
50 | if (cpu == get_first_sibling(cpu)) { | ||
51 | cpumask_set_cpu(cpu, affinity_mask); | ||
52 | vecs++; | ||
53 | } | ||
54 | 82 | ||
55 | if (--max_vecs == 0) | 83 | /* |
84 | * If the number of nodes in the mask is less than or equal the | ||
85 | * number of vectors we just spread the vectors across the nodes. | ||
86 | */ | ||
87 | if (nvec <= nodes) { | ||
88 | for_each_node_mask(n, nodemsk) { | ||
89 | cpumask_copy(masks + curvec, cpumask_of_node(n)); | ||
90 | if (++curvec == nvec) | ||
56 | break; | 91 | break; |
57 | } | 92 | } |
58 | *nr_vecs = vecs; | 93 | goto outonl; |
59 | } | 94 | } |
95 | |||
96 | /* Spread the vectors per node */ | ||
97 | vecs_per_node = nvec / nodes; | ||
98 | /* Account for rounding errors */ | ||
99 | extra_vecs = nvec - (nodes * vecs_per_node); | ||
100 | |||
101 | for_each_node_mask(n, nodemsk) { | ||
102 | int ncpus, v, vecs_to_assign = vecs_per_node; | ||
103 | |||
104 | /* Get the cpus on this node which are in the mask */ | ||
105 | cpumask_and(nmsk, affinity, cpumask_of_node(n)); | ||
106 | |||
107 | /* Calculate the number of cpus per vector */ | ||
108 | ncpus = cpumask_weight(nmsk); | ||
109 | |||
110 | for (v = 0; curvec < nvec && v < vecs_to_assign; curvec++, v++) { | ||
111 | cpus_per_vec = ncpus / vecs_to_assign; | ||
112 | |||
113 | /* Account for extra vectors to compensate rounding errors */ | ||
114 | if (extra_vecs) { | ||
115 | cpus_per_vec++; | ||
116 | if (!--extra_vecs) | ||
117 | vecs_per_node++; | ||
118 | } | ||
119 | irq_spread_init_one(masks + curvec, nmsk, cpus_per_vec); | ||
120 | } | ||
121 | |||
122 | if (curvec >= nvec) | ||
123 | break; | ||
124 | } | ||
125 | |||
126 | outonl: | ||
60 | put_online_cpus(); | 127 | put_online_cpus(); |
128 | out: | ||
129 | free_cpumask_var(nmsk); | ||
130 | return masks; | ||
131 | } | ||
132 | |||
133 | /** | ||
134 | * irq_calc_affinity_vectors - Calculate to optimal number of vectors for a given affinity mask | ||
135 | * @affinity: The affinity mask to spread. If NULL cpu_online_mask | ||
136 | * is used | ||
137 | * @maxvec: The maximum number of vectors available | ||
138 | */ | ||
139 | int irq_calc_affinity_vectors(const struct cpumask *affinity, int maxvec) | ||
140 | { | ||
141 | int cpus, ret; | ||
61 | 142 | ||
62 | return affinity_mask; | 143 | /* Stabilize the cpumasks */ |
144 | get_online_cpus(); | ||
145 | /* If the supplied affinity mask is NULL, use cpu online mask */ | ||
146 | if (!affinity) | ||
147 | affinity = cpu_online_mask; | ||
148 | |||
149 | cpus = cpumask_weight(affinity); | ||
150 | ret = (cpus < maxvec) ? cpus : maxvec; | ||
151 | |||
152 | put_online_cpus(); | ||
153 | return ret; | ||
63 | } | 154 | } |
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index a623b44f2d4b..5a5a685aba33 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c | |||
@@ -236,25 +236,24 @@ static int alloc_descs(unsigned int start, unsigned int cnt, int node, | |||
236 | const struct cpumask *mask = NULL; | 236 | const struct cpumask *mask = NULL; |
237 | struct irq_desc *desc; | 237 | struct irq_desc *desc; |
238 | unsigned int flags; | 238 | unsigned int flags; |
239 | int i, cpu = -1; | 239 | int i; |
240 | 240 | ||
241 | if (affinity && cpumask_empty(affinity)) | 241 | /* Validate affinity mask(s) */ |
242 | return -EINVAL; | 242 | if (affinity) { |
243 | for (i = 0, mask = affinity; i < cnt; i++, mask++) { | ||
244 | if (cpumask_empty(mask)) | ||
245 | return -EINVAL; | ||
246 | } | ||
247 | } | ||
243 | 248 | ||
244 | flags = affinity ? IRQD_AFFINITY_MANAGED : 0; | 249 | flags = affinity ? IRQD_AFFINITY_MANAGED : 0; |
250 | mask = NULL; | ||
245 | 251 | ||
246 | for (i = 0; i < cnt; i++) { | 252 | for (i = 0; i < cnt; i++) { |
247 | if (affinity) { | 253 | if (affinity) { |
248 | cpu = cpumask_next(cpu, affinity); | 254 | node = cpu_to_node(cpumask_first(affinity)); |
249 | if (cpu >= nr_cpu_ids) | 255 | mask = affinity; |
250 | cpu = cpumask_first(affinity); | 256 | affinity++; |
251 | node = cpu_to_node(cpu); | ||
252 | |||
253 | /* | ||
254 | * For single allocations we use the caller provided | ||
255 | * mask otherwise we use the mask of the target cpu | ||
256 | */ | ||
257 | mask = cnt == 1 ? affinity : cpumask_of(cpu); | ||
258 | } | 257 | } |
259 | desc = alloc_desc(start + i, node, flags, mask, owner); | 258 | desc = alloc_desc(start + i, node, flags, mask, owner); |
260 | if (!desc) | 259 | if (!desc) |
@@ -481,9 +480,9 @@ EXPORT_SYMBOL_GPL(irq_free_descs); | |||
481 | * @cnt: Number of consecutive irqs to allocate. | 480 | * @cnt: Number of consecutive irqs to allocate. |
482 | * @node: Preferred node on which the irq descriptor should be allocated | 481 | * @node: Preferred node on which the irq descriptor should be allocated |
483 | * @owner: Owning module (can be NULL) | 482 | * @owner: Owning module (can be NULL) |
484 | * @affinity: Optional pointer to an affinity mask which hints where the | 483 | * @affinity: Optional pointer to an affinity mask array of size @cnt which |
485 | * irq descriptors should be allocated and which default | 484 | * hints where the irq descriptors should be allocated and which |
486 | * affinities to use | 485 | * default affinities to use |
487 | * | 486 | * |
488 | * Returns the first irq number or error code | 487 | * Returns the first irq number or error code |
489 | */ | 488 | */ |
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c index 19e9dfbe97fa..8a3e872798f3 100644 --- a/kernel/irq/msi.c +++ b/kernel/irq/msi.c | |||
@@ -18,20 +18,42 @@ | |||
18 | /* Temparory solution for building, will be removed later */ | 18 | /* Temparory solution for building, will be removed later */ |
19 | #include <linux/pci.h> | 19 | #include <linux/pci.h> |
20 | 20 | ||
21 | struct msi_desc *alloc_msi_entry(struct device *dev) | 21 | /** |
22 | * alloc_msi_entry - Allocate an initialize msi_entry | ||
23 | * @dev: Pointer to the device for which this is allocated | ||
24 | * @nvec: The number of vectors used in this entry | ||
25 | * @affinity: Optional pointer to an affinity mask array size of @nvec | ||
26 | * | ||
27 | * If @affinity is not NULL then a an affinity array[@nvec] is allocated | ||
28 | * and the affinity masks from @affinity are copied. | ||
29 | */ | ||
30 | struct msi_desc * | ||
31 | alloc_msi_entry(struct device *dev, int nvec, const struct cpumask *affinity) | ||
22 | { | 32 | { |
23 | struct msi_desc *desc = kzalloc(sizeof(*desc), GFP_KERNEL); | 33 | struct msi_desc *desc; |
34 | |||
35 | desc = kzalloc(sizeof(*desc), GFP_KERNEL); | ||
24 | if (!desc) | 36 | if (!desc) |
25 | return NULL; | 37 | return NULL; |
26 | 38 | ||
27 | INIT_LIST_HEAD(&desc->list); | 39 | INIT_LIST_HEAD(&desc->list); |
28 | desc->dev = dev; | 40 | desc->dev = dev; |
41 | desc->nvec_used = nvec; | ||
42 | if (affinity) { | ||
43 | desc->affinity = kmemdup(affinity, | ||
44 | nvec * sizeof(*desc->affinity), GFP_KERNEL); | ||
45 | if (!desc->affinity) { | ||
46 | kfree(desc); | ||
47 | return NULL; | ||
48 | } | ||
49 | } | ||
29 | 50 | ||
30 | return desc; | 51 | return desc; |
31 | } | 52 | } |
32 | 53 | ||
33 | void free_msi_entry(struct msi_desc *entry) | 54 | void free_msi_entry(struct msi_desc *entry) |
34 | { | 55 | { |
56 | kfree(entry->affinity); | ||
35 | kfree(entry); | 57 | kfree(entry); |
36 | } | 58 | } |
37 | 59 | ||
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 503bc2d348e5..037c321c5618 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c | |||
@@ -887,7 +887,10 @@ int kexec_load_purgatory(struct kimage *image, unsigned long min, | |||
887 | return 0; | 887 | return 0; |
888 | out: | 888 | out: |
889 | vfree(pi->sechdrs); | 889 | vfree(pi->sechdrs); |
890 | pi->sechdrs = NULL; | ||
891 | |||
890 | vfree(pi->purgatory_buf); | 892 | vfree(pi->purgatory_buf); |
893 | pi->purgatory_buf = NULL; | ||
891 | return ret; | 894 | return ret; |
892 | } | 895 | } |
893 | 896 | ||
diff --git a/kernel/memremap.c b/kernel/memremap.c index 251d16b4cb41..b501e390bb34 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c | |||
@@ -247,6 +247,7 @@ static void devm_memremap_pages_release(struct device *dev, void *data) | |||
247 | align_start = res->start & ~(SECTION_SIZE - 1); | 247 | align_start = res->start & ~(SECTION_SIZE - 1); |
248 | align_size = ALIGN(resource_size(res), SECTION_SIZE); | 248 | align_size = ALIGN(resource_size(res), SECTION_SIZE); |
249 | arch_remove_memory(align_start, align_size); | 249 | arch_remove_memory(align_start, align_size); |
250 | untrack_pfn(NULL, PHYS_PFN(align_start), align_size); | ||
250 | pgmap_radix_release(res); | 251 | pgmap_radix_release(res); |
251 | dev_WARN_ONCE(dev, pgmap->altmap && pgmap->altmap->alloc, | 252 | dev_WARN_ONCE(dev, pgmap->altmap && pgmap->altmap->alloc, |
252 | "%s: failed to free all reserved pages\n", __func__); | 253 | "%s: failed to free all reserved pages\n", __func__); |
@@ -282,6 +283,7 @@ void *devm_memremap_pages(struct device *dev, struct resource *res, | |||
282 | struct percpu_ref *ref, struct vmem_altmap *altmap) | 283 | struct percpu_ref *ref, struct vmem_altmap *altmap) |
283 | { | 284 | { |
284 | resource_size_t key, align_start, align_size, align_end; | 285 | resource_size_t key, align_start, align_size, align_end; |
286 | pgprot_t pgprot = PAGE_KERNEL; | ||
285 | struct dev_pagemap *pgmap; | 287 | struct dev_pagemap *pgmap; |
286 | struct page_map *page_map; | 288 | struct page_map *page_map; |
287 | int error, nid, is_ram; | 289 | int error, nid, is_ram; |
@@ -351,6 +353,11 @@ void *devm_memremap_pages(struct device *dev, struct resource *res, | |||
351 | if (nid < 0) | 353 | if (nid < 0) |
352 | nid = numa_mem_id(); | 354 | nid = numa_mem_id(); |
353 | 355 | ||
356 | error = track_pfn_remap(NULL, &pgprot, PHYS_PFN(align_start), 0, | ||
357 | align_size); | ||
358 | if (error) | ||
359 | goto err_pfn_remap; | ||
360 | |||
354 | error = arch_add_memory(nid, align_start, align_size, true); | 361 | error = arch_add_memory(nid, align_start, align_size, true); |
355 | if (error) | 362 | if (error) |
356 | goto err_add_memory; | 363 | goto err_add_memory; |
@@ -371,6 +378,8 @@ void *devm_memremap_pages(struct device *dev, struct resource *res, | |||
371 | return __va(res->start); | 378 | return __va(res->start); |
372 | 379 | ||
373 | err_add_memory: | 380 | err_add_memory: |
381 | untrack_pfn(NULL, PHYS_PFN(align_start), align_size); | ||
382 | err_pfn_remap: | ||
374 | err_radix: | 383 | err_radix: |
375 | pgmap_radix_release(res); | 384 | pgmap_radix_release(res); |
376 | devres_free(page_map); | 385 | devres_free(page_map); |
diff --git a/kernel/power/qos.c b/kernel/power/qos.c index 97b0df71303e..168ff442ebde 100644 --- a/kernel/power/qos.c +++ b/kernel/power/qos.c | |||
@@ -482,7 +482,16 @@ void pm_qos_update_request(struct pm_qos_request *req, | |||
482 | return; | 482 | return; |
483 | } | 483 | } |
484 | 484 | ||
485 | cancel_delayed_work_sync(&req->work); | 485 | /* |
486 | * This function may be called very early during boot, for example, | ||
487 | * from of_clk_init(), where irq needs to stay disabled. | ||
488 | * cancel_delayed_work_sync() assumes that irq is enabled on | ||
489 | * invocation and re-enables it on return. Avoid calling it until | ||
490 | * workqueue is initialized. | ||
491 | */ | ||
492 | if (keventd_up()) | ||
493 | cancel_delayed_work_sync(&req->work); | ||
494 | |||
486 | __pm_qos_update_request(req, new_value); | 495 | __pm_qos_update_request(req, new_value); |
487 | } | 496 | } |
488 | EXPORT_SYMBOL_GPL(pm_qos_update_request); | 497 | EXPORT_SYMBOL_GPL(pm_qos_update_request); |
diff --git a/kernel/printk/nmi.c b/kernel/printk/nmi.c index b69eb8a2876f..16bab471c7e2 100644 --- a/kernel/printk/nmi.c +++ b/kernel/printk/nmi.c | |||
@@ -99,27 +99,33 @@ again: | |||
99 | return add; | 99 | return add; |
100 | } | 100 | } |
101 | 101 | ||
102 | /* | 102 | static void printk_nmi_flush_line(const char *text, int len) |
103 | * printk one line from the temporary buffer from @start index until | ||
104 | * and including the @end index. | ||
105 | */ | ||
106 | static void print_nmi_seq_line(struct nmi_seq_buf *s, int start, int end) | ||
107 | { | 103 | { |
108 | const char *buf = s->buffer + start; | ||
109 | |||
110 | /* | 104 | /* |
111 | * The buffers are flushed in NMI only on panic. The messages must | 105 | * The buffers are flushed in NMI only on panic. The messages must |
112 | * go only into the ring buffer at this stage. Consoles will get | 106 | * go only into the ring buffer at this stage. Consoles will get |
113 | * explicitly called later when a crashdump is not generated. | 107 | * explicitly called later when a crashdump is not generated. |
114 | */ | 108 | */ |
115 | if (in_nmi()) | 109 | if (in_nmi()) |
116 | printk_deferred("%.*s", (end - start) + 1, buf); | 110 | printk_deferred("%.*s", len, text); |
117 | else | 111 | else |
118 | printk("%.*s", (end - start) + 1, buf); | 112 | printk("%.*s", len, text); |
119 | 113 | ||
120 | } | 114 | } |
121 | 115 | ||
122 | /* | 116 | /* |
117 | * printk one line from the temporary buffer from @start index until | ||
118 | * and including the @end index. | ||
119 | */ | ||
120 | static void printk_nmi_flush_seq_line(struct nmi_seq_buf *s, | ||
121 | int start, int end) | ||
122 | { | ||
123 | const char *buf = s->buffer + start; | ||
124 | |||
125 | printk_nmi_flush_line(buf, (end - start) + 1); | ||
126 | } | ||
127 | |||
128 | /* | ||
123 | * Flush data from the associated per_CPU buffer. The function | 129 | * Flush data from the associated per_CPU buffer. The function |
124 | * can be called either via IRQ work or independently. | 130 | * can be called either via IRQ work or independently. |
125 | */ | 131 | */ |
@@ -150,9 +156,11 @@ more: | |||
150 | * the buffer an unexpected way. If we printed something then | 156 | * the buffer an unexpected way. If we printed something then |
151 | * @len must only increase. | 157 | * @len must only increase. |
152 | */ | 158 | */ |
153 | if (i && i >= len) | 159 | if (i && i >= len) { |
154 | pr_err("printk_nmi_flush: internal error: i=%d >= len=%zu\n", | 160 | const char *msg = "printk_nmi_flush: internal error\n"; |
155 | i, len); | 161 | |
162 | printk_nmi_flush_line(msg, strlen(msg)); | ||
163 | } | ||
156 | 164 | ||
157 | if (!len) | 165 | if (!len) |
158 | goto out; /* Someone else has already flushed the buffer. */ | 166 | goto out; /* Someone else has already flushed the buffer. */ |
@@ -166,14 +174,14 @@ more: | |||
166 | /* Print line by line. */ | 174 | /* Print line by line. */ |
167 | for (; i < size; i++) { | 175 | for (; i < size; i++) { |
168 | if (s->buffer[i] == '\n') { | 176 | if (s->buffer[i] == '\n') { |
169 | print_nmi_seq_line(s, last_i, i); | 177 | printk_nmi_flush_seq_line(s, last_i, i); |
170 | last_i = i + 1; | 178 | last_i = i + 1; |
171 | } | 179 | } |
172 | } | 180 | } |
173 | /* Check if there was a partial line. */ | 181 | /* Check if there was a partial line. */ |
174 | if (last_i < size) { | 182 | if (last_i < size) { |
175 | print_nmi_seq_line(s, last_i, size - 1); | 183 | printk_nmi_flush_seq_line(s, last_i, size - 1); |
176 | pr_cont("\n"); | 184 | printk_nmi_flush_line("\n", strlen("\n")); |
177 | } | 185 | } |
178 | 186 | ||
179 | /* | 187 | /* |
diff --git a/kernel/seccomp.c b/kernel/seccomp.c index ef6c6c3f9d8a..0db7c8a2afe2 100644 --- a/kernel/seccomp.c +++ b/kernel/seccomp.c | |||
@@ -605,12 +605,16 @@ static int __seccomp_filter(int this_syscall, const struct seccomp_data *sd, | |||
605 | ptrace_event(PTRACE_EVENT_SECCOMP, data); | 605 | ptrace_event(PTRACE_EVENT_SECCOMP, data); |
606 | /* | 606 | /* |
607 | * The delivery of a fatal signal during event | 607 | * The delivery of a fatal signal during event |
608 | * notification may silently skip tracer notification. | 608 | * notification may silently skip tracer notification, |
609 | * Terminating the task now avoids executing a system | 609 | * which could leave us with a potentially unmodified |
610 | * call that may not be intended. | 610 | * syscall that the tracer would have liked to have |
611 | * changed. Since the process is about to die, we just | ||
612 | * force the syscall to be skipped and let the signal | ||
613 | * kill the process and correctly handle any tracer exit | ||
614 | * notifications. | ||
611 | */ | 615 | */ |
612 | if (fatal_signal_pending(current)) | 616 | if (fatal_signal_pending(current)) |
613 | do_exit(SIGSYS); | 617 | goto skip; |
614 | /* Check if the tracer forced the syscall to be skipped. */ | 618 | /* Check if the tracer forced the syscall to be skipped. */ |
615 | this_syscall = syscall_get_nr(current, task_pt_regs(current)); | 619 | this_syscall = syscall_get_nr(current, task_pt_regs(current)); |
616 | if (this_syscall < 0) | 620 | if (this_syscall < 0) |
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 204fdc86863d..2ec7c00228f3 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -908,10 +908,11 @@ static void __tick_nohz_idle_enter(struct tick_sched *ts) | |||
908 | ktime_t now, expires; | 908 | ktime_t now, expires; |
909 | int cpu = smp_processor_id(); | 909 | int cpu = smp_processor_id(); |
910 | 910 | ||
911 | now = tick_nohz_start_idle(ts); | ||
912 | |||
911 | if (can_stop_idle_tick(cpu, ts)) { | 913 | if (can_stop_idle_tick(cpu, ts)) { |
912 | int was_stopped = ts->tick_stopped; | 914 | int was_stopped = ts->tick_stopped; |
913 | 915 | ||
914 | now = tick_nohz_start_idle(ts); | ||
915 | ts->idle_calls++; | 916 | ts->idle_calls++; |
916 | 917 | ||
917 | expires = tick_nohz_stop_sched_tick(ts, now, cpu); | 918 | expires = tick_nohz_stop_sched_tick(ts, now, cpu); |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 2307d7c89dac..2e2cca509231 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -1686,24 +1686,6 @@ config LATENCYTOP | |||
1686 | Enable this option if you want to use the LatencyTOP tool | 1686 | Enable this option if you want to use the LatencyTOP tool |
1687 | to find out which userspace is blocking on what kernel operations. | 1687 | to find out which userspace is blocking on what kernel operations. |
1688 | 1688 | ||
1689 | config ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS | ||
1690 | bool | ||
1691 | |||
1692 | config DEBUG_STRICT_USER_COPY_CHECKS | ||
1693 | bool "Strict user copy size checks" | ||
1694 | depends on ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS | ||
1695 | depends on DEBUG_KERNEL && !TRACE_BRANCH_PROFILING | ||
1696 | help | ||
1697 | Enabling this option turns a certain set of sanity checks for user | ||
1698 | copy operations into compile time failures. | ||
1699 | |||
1700 | The copy_from_user() etc checks are there to help test if there | ||
1701 | are sufficient security checks on the length argument of | ||
1702 | the copy operation, by having gcc prove that the argument is | ||
1703 | within bounds. | ||
1704 | |||
1705 | If unsure, say N. | ||
1706 | |||
1707 | source kernel/trace/Kconfig | 1689 | source kernel/trace/Kconfig |
1708 | 1690 | ||
1709 | menu "Runtime Testing" | 1691 | menu "Runtime Testing" |
diff --git a/lib/Makefile b/lib/Makefile index cfa68eb269e4..5dc77a8ec297 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -24,7 +24,6 @@ lib-y := ctype.o string.o vsprintf.o cmdline.o \ | |||
24 | is_single_threaded.o plist.o decompress.o kobject_uevent.o \ | 24 | is_single_threaded.o plist.o decompress.o kobject_uevent.o \ |
25 | earlycpio.o seq_buf.o nmi_backtrace.o nodemask.o | 25 | earlycpio.o seq_buf.o nmi_backtrace.o nodemask.o |
26 | 26 | ||
27 | obj-$(CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS) += usercopy.o | ||
28 | lib-$(CONFIG_MMU) += ioremap.o | 27 | lib-$(CONFIG_MMU) += ioremap.o |
29 | lib-$(CONFIG_SMP) += cpumask.o | 28 | lib-$(CONFIG_SMP) += cpumask.o |
30 | lib-$(CONFIG_HAS_DMA) += dma-noop.o | 29 | lib-$(CONFIG_HAS_DMA) += dma-noop.o |
diff --git a/lib/rhashtable.c b/lib/rhashtable.c index 5ba520b544d7..56054e541a0f 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c | |||
@@ -77,17 +77,18 @@ static int alloc_bucket_locks(struct rhashtable *ht, struct bucket_table *tbl, | |||
77 | size = min_t(unsigned int, size, tbl->size >> 1); | 77 | size = min_t(unsigned int, size, tbl->size >> 1); |
78 | 78 | ||
79 | if (sizeof(spinlock_t) != 0) { | 79 | if (sizeof(spinlock_t) != 0) { |
80 | tbl->locks = NULL; | ||
80 | #ifdef CONFIG_NUMA | 81 | #ifdef CONFIG_NUMA |
81 | if (size * sizeof(spinlock_t) > PAGE_SIZE && | 82 | if (size * sizeof(spinlock_t) > PAGE_SIZE && |
82 | gfp == GFP_KERNEL) | 83 | gfp == GFP_KERNEL) |
83 | tbl->locks = vmalloc(size * sizeof(spinlock_t)); | 84 | tbl->locks = vmalloc(size * sizeof(spinlock_t)); |
84 | else | ||
85 | #endif | 85 | #endif |
86 | if (gfp != GFP_KERNEL) | 86 | if (gfp != GFP_KERNEL) |
87 | gfp |= __GFP_NOWARN | __GFP_NORETRY; | 87 | gfp |= __GFP_NOWARN | __GFP_NORETRY; |
88 | 88 | ||
89 | tbl->locks = kmalloc_array(size, sizeof(spinlock_t), | 89 | if (!tbl->locks) |
90 | gfp); | 90 | tbl->locks = kmalloc_array(size, sizeof(spinlock_t), |
91 | gfp); | ||
91 | if (!tbl->locks) | 92 | if (!tbl->locks) |
92 | return -ENOMEM; | 93 | return -ENOMEM; |
93 | for (i = 0; i < size; i++) | 94 | for (i = 0; i < size; i++) |
diff --git a/lib/test_hash.c b/lib/test_hash.c index 66c5fc8351e8..cac20c5fb304 100644 --- a/lib/test_hash.c +++ b/lib/test_hash.c | |||
@@ -143,7 +143,7 @@ static int __init | |||
143 | test_hash_init(void) | 143 | test_hash_init(void) |
144 | { | 144 | { |
145 | char buf[SIZE+1]; | 145 | char buf[SIZE+1]; |
146 | u32 string_or = 0, hash_or[2][33] = { 0 }; | 146 | u32 string_or = 0, hash_or[2][33] = { { 0, } }; |
147 | unsigned tests = 0; | 147 | unsigned tests = 0; |
148 | unsigned long long h64 = 0; | 148 | unsigned long long h64 = 0; |
149 | int i, j; | 149 | int i, j; |
@@ -219,21 +219,27 @@ test_hash_init(void) | |||
219 | } | 219 | } |
220 | 220 | ||
221 | /* Issue notices about skipped tests. */ | 221 | /* Issue notices about skipped tests. */ |
222 | #ifndef HAVE_ARCH__HASH_32 | 222 | #ifdef HAVE_ARCH__HASH_32 |
223 | pr_info("__hash_32() has no arch implementation to test."); | 223 | #if HAVE_ARCH__HASH_32 != 1 |
224 | #elif HAVE_ARCH__HASH_32 != 1 | ||
225 | pr_info("__hash_32() is arch-specific; not compared to generic."); | 224 | pr_info("__hash_32() is arch-specific; not compared to generic."); |
226 | #endif | 225 | #endif |
227 | #ifndef HAVE_ARCH_HASH_32 | 226 | #else |
228 | pr_info("hash_32() has no arch implementation to test."); | 227 | pr_info("__hash_32() has no arch implementation to test."); |
229 | #elif HAVE_ARCH_HASH_32 != 1 | 228 | #endif |
229 | #ifdef HAVE_ARCH_HASH_32 | ||
230 | #if HAVE_ARCH_HASH_32 != 1 | ||
230 | pr_info("hash_32() is arch-specific; not compared to generic."); | 231 | pr_info("hash_32() is arch-specific; not compared to generic."); |
231 | #endif | 232 | #endif |
232 | #ifndef HAVE_ARCH_HASH_64 | 233 | #else |
233 | pr_info("hash_64() has no arch implementation to test."); | 234 | pr_info("hash_32() has no arch implementation to test."); |
234 | #elif HAVE_ARCH_HASH_64 != 1 | 235 | #endif |
236 | #ifdef HAVE_ARCH_HASH_64 | ||
237 | #if HAVE_ARCH_HASH_64 != 1 | ||
235 | pr_info("hash_64() is arch-specific; not compared to generic."); | 238 | pr_info("hash_64() is arch-specific; not compared to generic."); |
236 | #endif | 239 | #endif |
240 | #else | ||
241 | pr_info("hash_64() has no arch implementation to test."); | ||
242 | #endif | ||
237 | 243 | ||
238 | pr_notice("%u tests passed.", tests); | 244 | pr_notice("%u tests passed.", tests); |
239 | 245 | ||
diff --git a/lib/usercopy.c b/lib/usercopy.c deleted file mode 100644 index 4f5b1ddbcd25..000000000000 --- a/lib/usercopy.c +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | #include <linux/export.h> | ||
2 | #include <linux/bug.h> | ||
3 | #include <linux/uaccess.h> | ||
4 | |||
5 | void copy_from_user_overflow(void) | ||
6 | { | ||
7 | WARN(1, "Buffer overflow detected!\n"); | ||
8 | } | ||
9 | EXPORT_SYMBOL(copy_from_user_overflow); | ||
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 2db2112aa31e..a6abd76baa72 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -1078,7 +1078,7 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, | |||
1078 | goto out; | 1078 | goto out; |
1079 | 1079 | ||
1080 | page = pmd_page(*pmd); | 1080 | page = pmd_page(*pmd); |
1081 | VM_BUG_ON_PAGE(!PageHead(page), page); | 1081 | VM_BUG_ON_PAGE(!PageHead(page) && !is_zone_device_page(page), page); |
1082 | if (flags & FOLL_TOUCH) | 1082 | if (flags & FOLL_TOUCH) |
1083 | touch_pmd(vma, addr, pmd); | 1083 | touch_pmd(vma, addr, pmd); |
1084 | if ((flags & FOLL_MLOCK) && (vma->vm_flags & VM_LOCKED)) { | 1084 | if ((flags & FOLL_MLOCK) && (vma->vm_flags & VM_LOCKED)) { |
@@ -1116,7 +1116,7 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, | |||
1116 | } | 1116 | } |
1117 | skip_mlock: | 1117 | skip_mlock: |
1118 | page += (addr & ~HPAGE_PMD_MASK) >> PAGE_SHIFT; | 1118 | page += (addr & ~HPAGE_PMD_MASK) >> PAGE_SHIFT; |
1119 | VM_BUG_ON_PAGE(!PageCompound(page), page); | 1119 | VM_BUG_ON_PAGE(!PageCompound(page) && !is_zone_device_page(page), page); |
1120 | if (flags & FOLL_GET) | 1120 | if (flags & FOLL_GET) |
1121 | get_page(page); | 1121 | get_page(page); |
1122 | 1122 | ||
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index d8c4e38fb5f4..2da72a5b6ecc 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -2336,6 +2336,23 @@ out: | |||
2336 | return ret; | 2336 | return ret; |
2337 | } | 2337 | } |
2338 | 2338 | ||
2339 | /* | ||
2340 | * Drop the (possibly final) reference to task->mempolicy. It needs to be | ||
2341 | * dropped after task->mempolicy is set to NULL so that any allocation done as | ||
2342 | * part of its kmem_cache_free(), such as by KASAN, doesn't reference a freed | ||
2343 | * policy. | ||
2344 | */ | ||
2345 | void mpol_put_task_policy(struct task_struct *task) | ||
2346 | { | ||
2347 | struct mempolicy *pol; | ||
2348 | |||
2349 | task_lock(task); | ||
2350 | pol = task->mempolicy; | ||
2351 | task->mempolicy = NULL; | ||
2352 | task_unlock(task); | ||
2353 | mpol_put(pol); | ||
2354 | } | ||
2355 | |||
2339 | static void sp_delete(struct shared_policy *sp, struct sp_node *n) | 2356 | static void sp_delete(struct shared_policy *sp, struct sp_node *n) |
2340 | { | 2357 | { |
2341 | pr_debug("deleting %lx-l%lx\n", n->start, n->end); | 2358 | pr_debug("deleting %lx-l%lx\n", n->start, n->end); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 3fbe73a6fe4b..a2214c64ed3c 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -3137,54 +3137,6 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, | |||
3137 | return NULL; | 3137 | return NULL; |
3138 | } | 3138 | } |
3139 | 3139 | ||
3140 | static inline bool | ||
3141 | should_compact_retry(struct alloc_context *ac, int order, int alloc_flags, | ||
3142 | enum compact_result compact_result, | ||
3143 | enum compact_priority *compact_priority, | ||
3144 | int compaction_retries) | ||
3145 | { | ||
3146 | int max_retries = MAX_COMPACT_RETRIES; | ||
3147 | |||
3148 | if (!order) | ||
3149 | return false; | ||
3150 | |||
3151 | /* | ||
3152 | * compaction considers all the zone as desperately out of memory | ||
3153 | * so it doesn't really make much sense to retry except when the | ||
3154 | * failure could be caused by insufficient priority | ||
3155 | */ | ||
3156 | if (compaction_failed(compact_result)) { | ||
3157 | if (*compact_priority > MIN_COMPACT_PRIORITY) { | ||
3158 | (*compact_priority)--; | ||
3159 | return true; | ||
3160 | } | ||
3161 | return false; | ||
3162 | } | ||
3163 | |||
3164 | /* | ||
3165 | * make sure the compaction wasn't deferred or didn't bail out early | ||
3166 | * due to locks contention before we declare that we should give up. | ||
3167 | * But do not retry if the given zonelist is not suitable for | ||
3168 | * compaction. | ||
3169 | */ | ||
3170 | if (compaction_withdrawn(compact_result)) | ||
3171 | return compaction_zonelist_suitable(ac, order, alloc_flags); | ||
3172 | |||
3173 | /* | ||
3174 | * !costly requests are much more important than __GFP_REPEAT | ||
3175 | * costly ones because they are de facto nofail and invoke OOM | ||
3176 | * killer to move on while costly can fail and users are ready | ||
3177 | * to cope with that. 1/4 retries is rather arbitrary but we | ||
3178 | * would need much more detailed feedback from compaction to | ||
3179 | * make a better decision. | ||
3180 | */ | ||
3181 | if (order > PAGE_ALLOC_COSTLY_ORDER) | ||
3182 | max_retries /= 4; | ||
3183 | if (compaction_retries <= max_retries) | ||
3184 | return true; | ||
3185 | |||
3186 | return false; | ||
3187 | } | ||
3188 | #else | 3140 | #else |
3189 | static inline struct page * | 3141 | static inline struct page * |
3190 | __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, | 3142 | __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, |
@@ -3195,6 +3147,8 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, | |||
3195 | return NULL; | 3147 | return NULL; |
3196 | } | 3148 | } |
3197 | 3149 | ||
3150 | #endif /* CONFIG_COMPACTION */ | ||
3151 | |||
3198 | static inline bool | 3152 | static inline bool |
3199 | should_compact_retry(struct alloc_context *ac, unsigned int order, int alloc_flags, | 3153 | should_compact_retry(struct alloc_context *ac, unsigned int order, int alloc_flags, |
3200 | enum compact_result compact_result, | 3154 | enum compact_result compact_result, |
@@ -3221,7 +3175,6 @@ should_compact_retry(struct alloc_context *ac, unsigned int order, int alloc_fla | |||
3221 | } | 3175 | } |
3222 | return false; | 3176 | return false; |
3223 | } | 3177 | } |
3224 | #endif /* CONFIG_COMPACTION */ | ||
3225 | 3178 | ||
3226 | /* Perform direct synchronous page reclaim */ | 3179 | /* Perform direct synchronous page reclaim */ |
3227 | static int | 3180 | static int |
@@ -4407,7 +4360,7 @@ static int build_zonelists_node(pg_data_t *pgdat, struct zonelist *zonelist, | |||
4407 | do { | 4360 | do { |
4408 | zone_type--; | 4361 | zone_type--; |
4409 | zone = pgdat->node_zones + zone_type; | 4362 | zone = pgdat->node_zones + zone_type; |
4410 | if (populated_zone(zone)) { | 4363 | if (managed_zone(zone)) { |
4411 | zoneref_set_zone(zone, | 4364 | zoneref_set_zone(zone, |
4412 | &zonelist->_zonerefs[nr_zones++]); | 4365 | &zonelist->_zonerefs[nr_zones++]); |
4413 | check_highest_zone(zone_type); | 4366 | check_highest_zone(zone_type); |
@@ -4645,7 +4598,7 @@ static void build_zonelists_in_zone_order(pg_data_t *pgdat, int nr_nodes) | |||
4645 | for (j = 0; j < nr_nodes; j++) { | 4598 | for (j = 0; j < nr_nodes; j++) { |
4646 | node = node_order[j]; | 4599 | node = node_order[j]; |
4647 | z = &NODE_DATA(node)->node_zones[zone_type]; | 4600 | z = &NODE_DATA(node)->node_zones[zone_type]; |
4648 | if (populated_zone(z)) { | 4601 | if (managed_zone(z)) { |
4649 | zoneref_set_zone(z, | 4602 | zoneref_set_zone(z, |
4650 | &zonelist->_zonerefs[pos++]); | 4603 | &zonelist->_zonerefs[pos++]); |
4651 | check_highest_zone(zone_type); | 4604 | check_highest_zone(zone_type); |
diff --git a/mm/usercopy.c b/mm/usercopy.c index a3cc3052f830..089328f2b920 100644 --- a/mm/usercopy.c +++ b/mm/usercopy.c | |||
@@ -134,31 +134,16 @@ static inline const char *check_bogus_address(const void *ptr, unsigned long n) | |||
134 | return NULL; | 134 | return NULL; |
135 | } | 135 | } |
136 | 136 | ||
137 | static inline const char *check_heap_object(const void *ptr, unsigned long n, | 137 | /* Checks for allocs that are marked in some way as spanning multiple pages. */ |
138 | bool to_user) | 138 | static inline const char *check_page_span(const void *ptr, unsigned long n, |
139 | struct page *page, bool to_user) | ||
139 | { | 140 | { |
140 | struct page *page, *endpage; | 141 | #ifdef CONFIG_HARDENED_USERCOPY_PAGESPAN |
141 | const void *end = ptr + n - 1; | 142 | const void *end = ptr + n - 1; |
143 | struct page *endpage; | ||
142 | bool is_reserved, is_cma; | 144 | bool is_reserved, is_cma; |
143 | 145 | ||
144 | /* | 146 | /* |
145 | * Some architectures (arm64) return true for virt_addr_valid() on | ||
146 | * vmalloced addresses. Work around this by checking for vmalloc | ||
147 | * first. | ||
148 | */ | ||
149 | if (is_vmalloc_addr(ptr)) | ||
150 | return NULL; | ||
151 | |||
152 | if (!virt_addr_valid(ptr)) | ||
153 | return NULL; | ||
154 | |||
155 | page = virt_to_head_page(ptr); | ||
156 | |||
157 | /* Check slab allocator for flags and size. */ | ||
158 | if (PageSlab(page)) | ||
159 | return __check_heap_object(ptr, n, page); | ||
160 | |||
161 | /* | ||
162 | * Sometimes the kernel data regions are not marked Reserved (see | 147 | * Sometimes the kernel data regions are not marked Reserved (see |
163 | * check below). And sometimes [_sdata,_edata) does not cover | 148 | * check below). And sometimes [_sdata,_edata) does not cover |
164 | * rodata and/or bss, so check each range explicitly. | 149 | * rodata and/or bss, so check each range explicitly. |
@@ -186,7 +171,7 @@ static inline const char *check_heap_object(const void *ptr, unsigned long n, | |||
186 | ((unsigned long)end & (unsigned long)PAGE_MASK))) | 171 | ((unsigned long)end & (unsigned long)PAGE_MASK))) |
187 | return NULL; | 172 | return NULL; |
188 | 173 | ||
189 | /* Allow if start and end are inside the same compound page. */ | 174 | /* Allow if fully inside the same compound (__GFP_COMP) page. */ |
190 | endpage = virt_to_head_page(end); | 175 | endpage = virt_to_head_page(end); |
191 | if (likely(endpage == page)) | 176 | if (likely(endpage == page)) |
192 | return NULL; | 177 | return NULL; |
@@ -199,20 +184,44 @@ static inline const char *check_heap_object(const void *ptr, unsigned long n, | |||
199 | is_reserved = PageReserved(page); | 184 | is_reserved = PageReserved(page); |
200 | is_cma = is_migrate_cma_page(page); | 185 | is_cma = is_migrate_cma_page(page); |
201 | if (!is_reserved && !is_cma) | 186 | if (!is_reserved && !is_cma) |
202 | goto reject; | 187 | return "<spans multiple pages>"; |
203 | 188 | ||
204 | for (ptr += PAGE_SIZE; ptr <= end; ptr += PAGE_SIZE) { | 189 | for (ptr += PAGE_SIZE; ptr <= end; ptr += PAGE_SIZE) { |
205 | page = virt_to_head_page(ptr); | 190 | page = virt_to_head_page(ptr); |
206 | if (is_reserved && !PageReserved(page)) | 191 | if (is_reserved && !PageReserved(page)) |
207 | goto reject; | 192 | return "<spans Reserved and non-Reserved pages>"; |
208 | if (is_cma && !is_migrate_cma_page(page)) | 193 | if (is_cma && !is_migrate_cma_page(page)) |
209 | goto reject; | 194 | return "<spans CMA and non-CMA pages>"; |
210 | } | 195 | } |
196 | #endif | ||
211 | 197 | ||
212 | return NULL; | 198 | return NULL; |
199 | } | ||
200 | |||
201 | static inline const char *check_heap_object(const void *ptr, unsigned long n, | ||
202 | bool to_user) | ||
203 | { | ||
204 | struct page *page; | ||
205 | |||
206 | /* | ||
207 | * Some architectures (arm64) return true for virt_addr_valid() on | ||
208 | * vmalloced addresses. Work around this by checking for vmalloc | ||
209 | * first. | ||
210 | */ | ||
211 | if (is_vmalloc_addr(ptr)) | ||
212 | return NULL; | ||
213 | |||
214 | if (!virt_addr_valid(ptr)) | ||
215 | return NULL; | ||
216 | |||
217 | page = virt_to_head_page(ptr); | ||
218 | |||
219 | /* Check slab allocator for flags and size. */ | ||
220 | if (PageSlab(page)) | ||
221 | return __check_heap_object(ptr, n, page); | ||
213 | 222 | ||
214 | reject: | 223 | /* Verify object does not incorrectly span multiple pages. */ |
215 | return "<spans multiple pages>"; | 224 | return check_page_span(ptr, n, page, to_user); |
216 | } | 225 | } |
217 | 226 | ||
218 | /* | 227 | /* |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 374d95d04178..b1e12a1ea9cf 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1665,7 +1665,7 @@ static bool inactive_reclaimable_pages(struct lruvec *lruvec, | |||
1665 | 1665 | ||
1666 | for (zid = sc->reclaim_idx; zid >= 0; zid--) { | 1666 | for (zid = sc->reclaim_idx; zid >= 0; zid--) { |
1667 | zone = &pgdat->node_zones[zid]; | 1667 | zone = &pgdat->node_zones[zid]; |
1668 | if (!populated_zone(zone)) | 1668 | if (!managed_zone(zone)) |
1669 | continue; | 1669 | continue; |
1670 | 1670 | ||
1671 | if (zone_page_state_snapshot(zone, NR_ZONE_LRU_BASE + | 1671 | if (zone_page_state_snapshot(zone, NR_ZONE_LRU_BASE + |
@@ -2036,7 +2036,7 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file, | |||
2036 | struct zone *zone = &pgdat->node_zones[zid]; | 2036 | struct zone *zone = &pgdat->node_zones[zid]; |
2037 | unsigned long inactive_zone, active_zone; | 2037 | unsigned long inactive_zone, active_zone; |
2038 | 2038 | ||
2039 | if (!populated_zone(zone)) | 2039 | if (!managed_zone(zone)) |
2040 | continue; | 2040 | continue; |
2041 | 2041 | ||
2042 | inactive_zone = zone_page_state(zone, | 2042 | inactive_zone = zone_page_state(zone, |
@@ -2171,7 +2171,7 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg, | |||
2171 | 2171 | ||
2172 | for (z = 0; z < MAX_NR_ZONES; z++) { | 2172 | for (z = 0; z < MAX_NR_ZONES; z++) { |
2173 | struct zone *zone = &pgdat->node_zones[z]; | 2173 | struct zone *zone = &pgdat->node_zones[z]; |
2174 | if (!populated_zone(zone)) | 2174 | if (!managed_zone(zone)) |
2175 | continue; | 2175 | continue; |
2176 | 2176 | ||
2177 | total_high_wmark += high_wmark_pages(zone); | 2177 | total_high_wmark += high_wmark_pages(zone); |
@@ -2510,7 +2510,7 @@ static inline bool should_continue_reclaim(struct pglist_data *pgdat, | |||
2510 | /* If compaction would go ahead or the allocation would succeed, stop */ | 2510 | /* If compaction would go ahead or the allocation would succeed, stop */ |
2511 | for (z = 0; z <= sc->reclaim_idx; z++) { | 2511 | for (z = 0; z <= sc->reclaim_idx; z++) { |
2512 | struct zone *zone = &pgdat->node_zones[z]; | 2512 | struct zone *zone = &pgdat->node_zones[z]; |
2513 | if (!populated_zone(zone)) | 2513 | if (!managed_zone(zone)) |
2514 | continue; | 2514 | continue; |
2515 | 2515 | ||
2516 | switch (compaction_suitable(zone, sc->order, 0, sc->reclaim_idx)) { | 2516 | switch (compaction_suitable(zone, sc->order, 0, sc->reclaim_idx)) { |
@@ -2840,7 +2840,7 @@ static bool pfmemalloc_watermark_ok(pg_data_t *pgdat) | |||
2840 | 2840 | ||
2841 | for (i = 0; i <= ZONE_NORMAL; i++) { | 2841 | for (i = 0; i <= ZONE_NORMAL; i++) { |
2842 | zone = &pgdat->node_zones[i]; | 2842 | zone = &pgdat->node_zones[i]; |
2843 | if (!populated_zone(zone) || | 2843 | if (!managed_zone(zone) || |
2844 | pgdat_reclaimable_pages(pgdat) == 0) | 2844 | pgdat_reclaimable_pages(pgdat) == 0) |
2845 | continue; | 2845 | continue; |
2846 | 2846 | ||
@@ -3141,7 +3141,7 @@ static bool prepare_kswapd_sleep(pg_data_t *pgdat, int order, int classzone_idx) | |||
3141 | for (i = 0; i <= classzone_idx; i++) { | 3141 | for (i = 0; i <= classzone_idx; i++) { |
3142 | struct zone *zone = pgdat->node_zones + i; | 3142 | struct zone *zone = pgdat->node_zones + i; |
3143 | 3143 | ||
3144 | if (!populated_zone(zone)) | 3144 | if (!managed_zone(zone)) |
3145 | continue; | 3145 | continue; |
3146 | 3146 | ||
3147 | if (!zone_balanced(zone, order, classzone_idx)) | 3147 | if (!zone_balanced(zone, order, classzone_idx)) |
@@ -3169,7 +3169,7 @@ static bool kswapd_shrink_node(pg_data_t *pgdat, | |||
3169 | sc->nr_to_reclaim = 0; | 3169 | sc->nr_to_reclaim = 0; |
3170 | for (z = 0; z <= sc->reclaim_idx; z++) { | 3170 | for (z = 0; z <= sc->reclaim_idx; z++) { |
3171 | zone = pgdat->node_zones + z; | 3171 | zone = pgdat->node_zones + z; |
3172 | if (!populated_zone(zone)) | 3172 | if (!managed_zone(zone)) |
3173 | continue; | 3173 | continue; |
3174 | 3174 | ||
3175 | sc->nr_to_reclaim += max(high_wmark_pages(zone), SWAP_CLUSTER_MAX); | 3175 | sc->nr_to_reclaim += max(high_wmark_pages(zone), SWAP_CLUSTER_MAX); |
@@ -3242,7 +3242,7 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int classzone_idx) | |||
3242 | if (buffer_heads_over_limit) { | 3242 | if (buffer_heads_over_limit) { |
3243 | for (i = MAX_NR_ZONES - 1; i >= 0; i--) { | 3243 | for (i = MAX_NR_ZONES - 1; i >= 0; i--) { |
3244 | zone = pgdat->node_zones + i; | 3244 | zone = pgdat->node_zones + i; |
3245 | if (!populated_zone(zone)) | 3245 | if (!managed_zone(zone)) |
3246 | continue; | 3246 | continue; |
3247 | 3247 | ||
3248 | sc.reclaim_idx = i; | 3248 | sc.reclaim_idx = i; |
@@ -3262,7 +3262,7 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int classzone_idx) | |||
3262 | */ | 3262 | */ |
3263 | for (i = classzone_idx; i >= 0; i--) { | 3263 | for (i = classzone_idx; i >= 0; i--) { |
3264 | zone = pgdat->node_zones + i; | 3264 | zone = pgdat->node_zones + i; |
3265 | if (!populated_zone(zone)) | 3265 | if (!managed_zone(zone)) |
3266 | continue; | 3266 | continue; |
3267 | 3267 | ||
3268 | if (zone_balanced(zone, sc.order, classzone_idx)) | 3268 | if (zone_balanced(zone, sc.order, classzone_idx)) |
@@ -3508,7 +3508,7 @@ void wakeup_kswapd(struct zone *zone, int order, enum zone_type classzone_idx) | |||
3508 | pg_data_t *pgdat; | 3508 | pg_data_t *pgdat; |
3509 | int z; | 3509 | int z; |
3510 | 3510 | ||
3511 | if (!populated_zone(zone)) | 3511 | if (!managed_zone(zone)) |
3512 | return; | 3512 | return; |
3513 | 3513 | ||
3514 | if (!cpuset_zone_allowed(zone, GFP_KERNEL | __GFP_HARDWALL)) | 3514 | if (!cpuset_zone_allowed(zone, GFP_KERNEL | __GFP_HARDWALL)) |
@@ -3522,7 +3522,7 @@ void wakeup_kswapd(struct zone *zone, int order, enum zone_type classzone_idx) | |||
3522 | /* Only wake kswapd if all zones are unbalanced */ | 3522 | /* Only wake kswapd if all zones are unbalanced */ |
3523 | for (z = 0; z <= classzone_idx; z++) { | 3523 | for (z = 0; z <= classzone_idx; z++) { |
3524 | zone = pgdat->node_zones + z; | 3524 | zone = pgdat->node_zones + z; |
3525 | if (!populated_zone(zone)) | 3525 | if (!managed_zone(zone)) |
3526 | continue; | 3526 | continue; |
3527 | 3527 | ||
3528 | if (zone_balanced(zone, order, classzone_idx)) | 3528 | if (zone_balanced(zone, order, classzone_idx)) |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index ece45e0683fd..0b5f729d08d2 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -250,7 +250,7 @@ int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, | |||
250 | 250 | ||
251 | skb_free_datagram(sk, skb); | 251 | skb_free_datagram(sk, skb); |
252 | 252 | ||
253 | if (msg->msg_flags & MSG_TRUNC) | 253 | if (flags & MSG_TRUNC) |
254 | copied = skblen; | 254 | copied = skblen; |
255 | 255 | ||
256 | return err ? : copied; | 256 | return err ? : copied; |
diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c index c045b3c54768..b0e23dfc5c34 100644 --- a/net/bluetooth/hci_request.c +++ b/net/bluetooth/hci_request.c | |||
@@ -262,6 +262,8 @@ int __hci_req_sync(struct hci_dev *hdev, int (*func)(struct hci_request *req, | |||
262 | break; | 262 | break; |
263 | } | 263 | } |
264 | 264 | ||
265 | kfree_skb(hdev->req_skb); | ||
266 | hdev->req_skb = NULL; | ||
265 | hdev->req_status = hdev->req_result = 0; | 267 | hdev->req_status = hdev->req_result = 0; |
266 | 268 | ||
267 | BT_DBG("%s end: err %d", hdev->name, err); | 269 | BT_DBG("%s end: err %d", hdev->name, err); |
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 6ef8a01a9ad4..96f04b7b9556 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -1091,7 +1091,7 @@ static int hci_sock_recvmsg(struct socket *sock, struct msghdr *msg, | |||
1091 | 1091 | ||
1092 | skb_free_datagram(sk, skb); | 1092 | skb_free_datagram(sk, skb); |
1093 | 1093 | ||
1094 | if (msg->msg_flags & MSG_TRUNC) | 1094 | if (flags & MSG_TRUNC) |
1095 | copied = skblen; | 1095 | copied = skblen; |
1096 | 1096 | ||
1097 | return err ? : copied; | 1097 | return err ? : copied; |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 54ceb1f2cc9a..d4cad29b033f 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -32,6 +32,7 @@ | |||
32 | 32 | ||
33 | #include <linux/debugfs.h> | 33 | #include <linux/debugfs.h> |
34 | #include <linux/crc16.h> | 34 | #include <linux/crc16.h> |
35 | #include <linux/filter.h> | ||
35 | 36 | ||
36 | #include <net/bluetooth/bluetooth.h> | 37 | #include <net/bluetooth/bluetooth.h> |
37 | #include <net/bluetooth/hci_core.h> | 38 | #include <net/bluetooth/hci_core.h> |
@@ -5835,6 +5836,9 @@ static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb, | |||
5835 | if (chan->sdu) | 5836 | if (chan->sdu) |
5836 | break; | 5837 | break; |
5837 | 5838 | ||
5839 | if (!pskb_may_pull(skb, L2CAP_SDULEN_SIZE)) | ||
5840 | break; | ||
5841 | |||
5838 | chan->sdu_len = get_unaligned_le16(skb->data); | 5842 | chan->sdu_len = get_unaligned_le16(skb->data); |
5839 | skb_pull(skb, L2CAP_SDULEN_SIZE); | 5843 | skb_pull(skb, L2CAP_SDULEN_SIZE); |
5840 | 5844 | ||
@@ -6610,6 +6614,10 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) | |||
6610 | goto drop; | 6614 | goto drop; |
6611 | } | 6615 | } |
6612 | 6616 | ||
6617 | if ((chan->mode == L2CAP_MODE_ERTM || | ||
6618 | chan->mode == L2CAP_MODE_STREAMING) && sk_filter(chan->data, skb)) | ||
6619 | goto drop; | ||
6620 | |||
6613 | if (!control->sframe) { | 6621 | if (!control->sframe) { |
6614 | int err; | 6622 | int err; |
6615 | 6623 | ||
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 1842141baedb..a8ba752732c9 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -1019,7 +1019,7 @@ static int l2cap_sock_recvmsg(struct socket *sock, struct msghdr *msg, | |||
1019 | goto done; | 1019 | goto done; |
1020 | 1020 | ||
1021 | if (pi->rx_busy_skb) { | 1021 | if (pi->rx_busy_skb) { |
1022 | if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb)) | 1022 | if (!__sock_queue_rcv_skb(sk, pi->rx_busy_skb)) |
1023 | pi->rx_busy_skb = NULL; | 1023 | pi->rx_busy_skb = NULL; |
1024 | else | 1024 | else |
1025 | goto done; | 1025 | goto done; |
@@ -1270,7 +1270,17 @@ static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb) | |||
1270 | goto done; | 1270 | goto done; |
1271 | } | 1271 | } |
1272 | 1272 | ||
1273 | err = sock_queue_rcv_skb(sk, skb); | 1273 | if (chan->mode != L2CAP_MODE_ERTM && |
1274 | chan->mode != L2CAP_MODE_STREAMING) { | ||
1275 | /* Even if no filter is attached, we could potentially | ||
1276 | * get errors from security modules, etc. | ||
1277 | */ | ||
1278 | err = sk_filter(sk, skb); | ||
1279 | if (err) | ||
1280 | goto done; | ||
1281 | } | ||
1282 | |||
1283 | err = __sock_queue_rcv_skb(sk, skb); | ||
1274 | 1284 | ||
1275 | /* For ERTM, handle one skb that doesn't fit into the recv | 1285 | /* For ERTM, handle one skb that doesn't fit into the recv |
1276 | * buffer. This is important to do because the data frames | 1286 | * buffer. This is important to do because the data frames |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index febca0f1008c..e2ffc2a5c7db 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -249,7 +249,7 @@ static inline unsigned long get_index(t_key key, struct key_vector *kv) | |||
249 | * index into the parent's child array. That is, they will be used to find | 249 | * index into the parent's child array. That is, they will be used to find |
250 | * 'n' among tp's children. | 250 | * 'n' among tp's children. |
251 | * | 251 | * |
252 | * The bits from (n->pos + n->bits) to (tn->pos - 1) - "S" - are skipped bits | 252 | * The bits from (n->pos + n->bits) to (tp->pos - 1) - "S" - are skipped bits |
253 | * for the node n. | 253 | * for the node n. |
254 | * | 254 | * |
255 | * All the bits we have seen so far are significant to the node n. The rest | 255 | * All the bits we have seen so far are significant to the node n. The rest |
@@ -258,7 +258,7 @@ static inline unsigned long get_index(t_key key, struct key_vector *kv) | |||
258 | * The bits from (n->pos) to (n->pos + n->bits - 1) - "C" - are the index into | 258 | * The bits from (n->pos) to (n->pos + n->bits - 1) - "C" - are the index into |
259 | * n's child array, and will of course be different for each child. | 259 | * n's child array, and will of course be different for each child. |
260 | * | 260 | * |
261 | * The rest of the bits, from 0 to (n->pos + n->bits), are completely unknown | 261 | * The rest of the bits, from 0 to (n->pos -1) - "u" - are completely unknown |
262 | * at this point. | 262 | * at this point. |
263 | */ | 263 | */ |
264 | 264 | ||
diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c index 9d847c302551..0f227db0e9ac 100644 --- a/net/ipv4/ip_tunnel_core.c +++ b/net/ipv4/ip_tunnel_core.c | |||
@@ -73,9 +73,11 @@ void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, | |||
73 | skb_dst_set(skb, &rt->dst); | 73 | skb_dst_set(skb, &rt->dst); |
74 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); | 74 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); |
75 | 75 | ||
76 | if (skb_iif && proto == IPPROTO_UDP) { | 76 | if (skb_iif && !(df & htons(IP_DF))) { |
77 | /* Arrived from an ingress interface and got udp encapuslated. | 77 | /* Arrived from an ingress interface, got encapsulated, with |
78 | * The encapsulated network segment length may exceed dst mtu. | 78 | * fragmentation of encapulating frames allowed. |
79 | * If skb is gso, the resulting encapsulated network segments | ||
80 | * may exceed dst mtu. | ||
79 | * Allow IP Fragmentation of segments. | 81 | * Allow IP Fragmentation of segments. |
80 | */ | 82 | */ |
81 | IPCB(skb)->flags |= IPSKB_FRAG_SEGS; | 83 | IPCB(skb)->flags |= IPSKB_FRAG_SEGS; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 032a96d78c99..ffbb218de520 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -3193,7 +3193,6 @@ int tcp_abort(struct sock *sk, int err) | |||
3193 | local_bh_enable(); | 3193 | local_bh_enable(); |
3194 | return 0; | 3194 | return 0; |
3195 | } | 3195 | } |
3196 | sock_gen_put(sk); | ||
3197 | return -EOPNOTSUPP; | 3196 | return -EOPNOTSUPP; |
3198 | } | 3197 | } |
3199 | 3198 | ||
@@ -3222,7 +3221,6 @@ int tcp_abort(struct sock *sk, int err) | |||
3222 | bh_unlock_sock(sk); | 3221 | bh_unlock_sock(sk); |
3223 | local_bh_enable(); | 3222 | local_bh_enable(); |
3224 | release_sock(sk); | 3223 | release_sock(sk); |
3225 | sock_put(sk); | ||
3226 | return 0; | 3224 | return 0; |
3227 | } | 3225 | } |
3228 | EXPORT_SYMBOL_GPL(tcp_abort); | 3226 | EXPORT_SYMBOL_GPL(tcp_abort); |
diff --git a/net/ipv4/tcp_diag.c b/net/ipv4/tcp_diag.c index 4d610934fb39..a748c74aa8b7 100644 --- a/net/ipv4/tcp_diag.c +++ b/net/ipv4/tcp_diag.c | |||
@@ -54,11 +54,16 @@ static int tcp_diag_destroy(struct sk_buff *in_skb, | |||
54 | { | 54 | { |
55 | struct net *net = sock_net(in_skb->sk); | 55 | struct net *net = sock_net(in_skb->sk); |
56 | struct sock *sk = inet_diag_find_one_icsk(net, &tcp_hashinfo, req); | 56 | struct sock *sk = inet_diag_find_one_icsk(net, &tcp_hashinfo, req); |
57 | int err; | ||
57 | 58 | ||
58 | if (IS_ERR(sk)) | 59 | if (IS_ERR(sk)) |
59 | return PTR_ERR(sk); | 60 | return PTR_ERR(sk); |
60 | 61 | ||
61 | return sock_diag_destroy(sk, ECONNABORTED); | 62 | err = sock_diag_destroy(sk, ECONNABORTED); |
63 | |||
64 | sock_gen_put(sk); | ||
65 | |||
66 | return err; | ||
62 | } | 67 | } |
63 | #endif | 68 | #endif |
64 | 69 | ||
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 32b048e524d6..7158d4f8dae4 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -814,8 +814,14 @@ static void tcp_v4_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb, | |||
814 | u32 seq = (sk->sk_state == TCP_LISTEN) ? tcp_rsk(req)->snt_isn + 1 : | 814 | u32 seq = (sk->sk_state == TCP_LISTEN) ? tcp_rsk(req)->snt_isn + 1 : |
815 | tcp_sk(sk)->snd_nxt; | 815 | tcp_sk(sk)->snd_nxt; |
816 | 816 | ||
817 | /* RFC 7323 2.3 | ||
818 | * The window field (SEG.WND) of every outgoing segment, with the | ||
819 | * exception of <SYN> segments, MUST be right-shifted by | ||
820 | * Rcv.Wind.Shift bits: | ||
821 | */ | ||
817 | tcp_v4_send_ack(sock_net(sk), skb, seq, | 822 | tcp_v4_send_ack(sock_net(sk), skb, seq, |
818 | tcp_rsk(req)->rcv_nxt, req->rsk_rcv_wnd, | 823 | tcp_rsk(req)->rcv_nxt, |
824 | req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale, | ||
819 | tcp_time_stamp, | 825 | tcp_time_stamp, |
820 | req->ts_recent, | 826 | req->ts_recent, |
821 | 0, | 827 | 0, |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index e61f7cd65d08..5fdcb8d108d4 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -1182,13 +1182,13 @@ out: | |||
1182 | * @sk: socket | 1182 | * @sk: socket |
1183 | * | 1183 | * |
1184 | * Drops all bad checksum frames, until a valid one is found. | 1184 | * Drops all bad checksum frames, until a valid one is found. |
1185 | * Returns the length of found skb, or 0 if none is found. | 1185 | * Returns the length of found skb, or -1 if none is found. |
1186 | */ | 1186 | */ |
1187 | static unsigned int first_packet_length(struct sock *sk) | 1187 | static int first_packet_length(struct sock *sk) |
1188 | { | 1188 | { |
1189 | struct sk_buff_head list_kill, *rcvq = &sk->sk_receive_queue; | 1189 | struct sk_buff_head list_kill, *rcvq = &sk->sk_receive_queue; |
1190 | struct sk_buff *skb; | 1190 | struct sk_buff *skb; |
1191 | unsigned int res; | 1191 | int res; |
1192 | 1192 | ||
1193 | __skb_queue_head_init(&list_kill); | 1193 | __skb_queue_head_init(&list_kill); |
1194 | 1194 | ||
@@ -1203,7 +1203,7 @@ static unsigned int first_packet_length(struct sock *sk) | |||
1203 | __skb_unlink(skb, rcvq); | 1203 | __skb_unlink(skb, rcvq); |
1204 | __skb_queue_tail(&list_kill, skb); | 1204 | __skb_queue_tail(&list_kill, skb); |
1205 | } | 1205 | } |
1206 | res = skb ? skb->len : 0; | 1206 | res = skb ? skb->len : -1; |
1207 | spin_unlock_bh(&rcvq->lock); | 1207 | spin_unlock_bh(&rcvq->lock); |
1208 | 1208 | ||
1209 | if (!skb_queue_empty(&list_kill)) { | 1209 | if (!skb_queue_empty(&list_kill)) { |
@@ -1232,7 +1232,7 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg) | |||
1232 | 1232 | ||
1233 | case SIOCINQ: | 1233 | case SIOCINQ: |
1234 | { | 1234 | { |
1235 | unsigned int amount = first_packet_length(sk); | 1235 | int amount = max_t(int, 0, first_packet_length(sk)); |
1236 | 1236 | ||
1237 | return put_user(amount, (int __user *)arg); | 1237 | return put_user(amount, (int __user *)arg); |
1238 | } | 1238 | } |
@@ -2184,7 +2184,7 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) | |||
2184 | 2184 | ||
2185 | /* Check for false positives due to checksum errors */ | 2185 | /* Check for false positives due to checksum errors */ |
2186 | if ((mask & POLLRDNORM) && !(file->f_flags & O_NONBLOCK) && | 2186 | if ((mask & POLLRDNORM) && !(file->f_flags & O_NONBLOCK) && |
2187 | !(sk->sk_shutdown & RCV_SHUTDOWN) && !first_packet_length(sk)) | 2187 | !(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1) |
2188 | mask &= ~(POLLIN | POLLRDNORM); | 2188 | mask &= ~(POLLIN | POLLRDNORM); |
2189 | 2189 | ||
2190 | return mask; | 2190 | return mask; |
@@ -2216,7 +2216,6 @@ struct proto udp_prot = { | |||
2216 | .sysctl_wmem = &sysctl_udp_wmem_min, | 2216 | .sysctl_wmem = &sysctl_udp_wmem_min, |
2217 | .sysctl_rmem = &sysctl_udp_rmem_min, | 2217 | .sysctl_rmem = &sysctl_udp_rmem_min, |
2218 | .obj_size = sizeof(struct udp_sock), | 2218 | .obj_size = sizeof(struct udp_sock), |
2219 | .slab_flags = SLAB_DESTROY_BY_RCU, | ||
2220 | .h.udp_table = &udp_table, | 2219 | .h.udp_table = &udp_table, |
2221 | #ifdef CONFIG_COMPAT | 2220 | #ifdef CONFIG_COMPAT |
2222 | .compat_setsockopt = compat_udp_setsockopt, | 2221 | .compat_setsockopt = compat_udp_setsockopt, |
diff --git a/net/ipv4/udplite.c b/net/ipv4/udplite.c index 3b3efbda48e1..2eea073e27ef 100644 --- a/net/ipv4/udplite.c +++ b/net/ipv4/udplite.c | |||
@@ -55,7 +55,6 @@ struct proto udplite_prot = { | |||
55 | .unhash = udp_lib_unhash, | 55 | .unhash = udp_lib_unhash, |
56 | .get_port = udp_v4_get_port, | 56 | .get_port = udp_v4_get_port, |
57 | .obj_size = sizeof(struct udp_sock), | 57 | .obj_size = sizeof(struct udp_sock), |
58 | .slab_flags = SLAB_DESTROY_BY_RCU, | ||
59 | .h.udp_table = &udplite_table, | 58 | .h.udp_table = &udplite_table, |
60 | #ifdef CONFIG_COMPAT | 59 | #ifdef CONFIG_COMPAT |
61 | .compat_setsockopt = compat_udp_setsockopt, | 60 | .compat_setsockopt = compat_udp_setsockopt, |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index df8425fcbc2c..f418d2eaeddd 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -1872,7 +1872,6 @@ static int addrconf_dad_end(struct inet6_ifaddr *ifp) | |||
1872 | 1872 | ||
1873 | void addrconf_dad_failure(struct inet6_ifaddr *ifp) | 1873 | void addrconf_dad_failure(struct inet6_ifaddr *ifp) |
1874 | { | 1874 | { |
1875 | struct in6_addr addr; | ||
1876 | struct inet6_dev *idev = ifp->idev; | 1875 | struct inet6_dev *idev = ifp->idev; |
1877 | struct net *net = dev_net(ifp->idev->dev); | 1876 | struct net *net = dev_net(ifp->idev->dev); |
1878 | 1877 | ||
@@ -1934,18 +1933,6 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp) | |||
1934 | in6_ifa_put(ifp2); | 1933 | in6_ifa_put(ifp2); |
1935 | lock_errdad: | 1934 | lock_errdad: |
1936 | spin_lock_bh(&ifp->lock); | 1935 | spin_lock_bh(&ifp->lock); |
1937 | } else if (idev->cnf.accept_dad > 1 && !idev->cnf.disable_ipv6) { | ||
1938 | addr.s6_addr32[0] = htonl(0xfe800000); | ||
1939 | addr.s6_addr32[1] = 0; | ||
1940 | |||
1941 | if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) && | ||
1942 | ipv6_addr_equal(&ifp->addr, &addr)) { | ||
1943 | /* DAD failed for link-local based on MAC address */ | ||
1944 | idev->cnf.disable_ipv6 = 1; | ||
1945 | |||
1946 | pr_info("%s: IPv6 being disabled!\n", | ||
1947 | ifp->idev->dev->name); | ||
1948 | } | ||
1949 | } | 1936 | } |
1950 | 1937 | ||
1951 | errdad: | 1938 | errdad: |
@@ -3821,6 +3808,7 @@ static void addrconf_dad_work(struct work_struct *w) | |||
3821 | dad_work); | 3808 | dad_work); |
3822 | struct inet6_dev *idev = ifp->idev; | 3809 | struct inet6_dev *idev = ifp->idev; |
3823 | struct in6_addr mcaddr; | 3810 | struct in6_addr mcaddr; |
3811 | bool disable_ipv6 = false; | ||
3824 | 3812 | ||
3825 | enum { | 3813 | enum { |
3826 | DAD_PROCESS, | 3814 | DAD_PROCESS, |
@@ -3837,6 +3825,24 @@ static void addrconf_dad_work(struct work_struct *w) | |||
3837 | } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) { | 3825 | } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) { |
3838 | action = DAD_ABORT; | 3826 | action = DAD_ABORT; |
3839 | ifp->state = INET6_IFADDR_STATE_POSTDAD; | 3827 | ifp->state = INET6_IFADDR_STATE_POSTDAD; |
3828 | |||
3829 | if (idev->cnf.accept_dad > 1 && !idev->cnf.disable_ipv6 && | ||
3830 | !(ifp->flags & IFA_F_STABLE_PRIVACY)) { | ||
3831 | struct in6_addr addr; | ||
3832 | |||
3833 | addr.s6_addr32[0] = htonl(0xfe800000); | ||
3834 | addr.s6_addr32[1] = 0; | ||
3835 | |||
3836 | if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) && | ||
3837 | ipv6_addr_equal(&ifp->addr, &addr)) { | ||
3838 | /* DAD failed for link-local based on MAC */ | ||
3839 | idev->cnf.disable_ipv6 = 1; | ||
3840 | |||
3841 | pr_info("%s: IPv6 being disabled!\n", | ||
3842 | ifp->idev->dev->name); | ||
3843 | disable_ipv6 = true; | ||
3844 | } | ||
3845 | } | ||
3840 | } | 3846 | } |
3841 | spin_unlock_bh(&ifp->lock); | 3847 | spin_unlock_bh(&ifp->lock); |
3842 | 3848 | ||
@@ -3845,6 +3851,8 @@ static void addrconf_dad_work(struct work_struct *w) | |||
3845 | goto out; | 3851 | goto out; |
3846 | } else if (action == DAD_ABORT) { | 3852 | } else if (action == DAD_ABORT) { |
3847 | addrconf_dad_stop(ifp, 1); | 3853 | addrconf_dad_stop(ifp, 1); |
3854 | if (disable_ipv6) | ||
3855 | addrconf_ifdown(idev->dev, 0); | ||
3848 | goto out; | 3856 | goto out; |
3849 | } | 3857 | } |
3850 | 3858 | ||
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 33df8b8575cc..94f4f89d73e7 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -944,9 +944,15 @@ static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb, | |||
944 | /* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV | 944 | /* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV |
945 | * sk->sk_state == TCP_SYN_RECV -> for Fast Open. | 945 | * sk->sk_state == TCP_SYN_RECV -> for Fast Open. |
946 | */ | 946 | */ |
947 | /* RFC 7323 2.3 | ||
948 | * The window field (SEG.WND) of every outgoing segment, with the | ||
949 | * exception of <SYN> segments, MUST be right-shifted by | ||
950 | * Rcv.Wind.Shift bits: | ||
951 | */ | ||
947 | tcp_v6_send_ack(sk, skb, (sk->sk_state == TCP_LISTEN) ? | 952 | tcp_v6_send_ack(sk, skb, (sk->sk_state == TCP_LISTEN) ? |
948 | tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt, | 953 | tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt, |
949 | tcp_rsk(req)->rcv_nxt, req->rsk_rcv_wnd, | 954 | tcp_rsk(req)->rcv_nxt, |
955 | req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale, | ||
950 | tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if, | 956 | tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if, |
951 | tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr), | 957 | tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr), |
952 | 0, 0); | 958 | 0, 0); |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 81e2f98b958d..19ac3a1c308d 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -1460,7 +1460,6 @@ struct proto udpv6_prot = { | |||
1460 | .sysctl_wmem = &sysctl_udp_wmem_min, | 1460 | .sysctl_wmem = &sysctl_udp_wmem_min, |
1461 | .sysctl_rmem = &sysctl_udp_rmem_min, | 1461 | .sysctl_rmem = &sysctl_udp_rmem_min, |
1462 | .obj_size = sizeof(struct udp6_sock), | 1462 | .obj_size = sizeof(struct udp6_sock), |
1463 | .slab_flags = SLAB_DESTROY_BY_RCU, | ||
1464 | .h.udp_table = &udp_table, | 1463 | .h.udp_table = &udp_table, |
1465 | #ifdef CONFIG_COMPAT | 1464 | #ifdef CONFIG_COMPAT |
1466 | .compat_setsockopt = compat_udpv6_setsockopt, | 1465 | .compat_setsockopt = compat_udpv6_setsockopt, |
diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c index 9cf097e206e9..fd6ef414899b 100644 --- a/net/ipv6/udplite.c +++ b/net/ipv6/udplite.c | |||
@@ -50,7 +50,6 @@ struct proto udplitev6_prot = { | |||
50 | .unhash = udp_lib_unhash, | 50 | .unhash = udp_lib_unhash, |
51 | .get_port = udp_v6_get_port, | 51 | .get_port = udp_v6_get_port, |
52 | .obj_size = sizeof(struct udp6_sock), | 52 | .obj_size = sizeof(struct udp6_sock), |
53 | .slab_flags = SLAB_DESTROY_BY_RCU, | ||
54 | .h.udp_table = &udplite_table, | 53 | .h.udp_table = &udplite_table, |
55 | #ifdef CONFIG_COMPAT | 54 | #ifdef CONFIG_COMPAT |
56 | .compat_setsockopt = compat_udpv6_setsockopt, | 55 | .compat_setsockopt = compat_udpv6_setsockopt, |
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c index d9560aa2dba3..232cb92033e8 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c | |||
@@ -856,7 +856,7 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr, | |||
856 | error = -ENOTCONN; | 856 | error = -ENOTCONN; |
857 | if (sk == NULL) | 857 | if (sk == NULL) |
858 | goto end; | 858 | goto end; |
859 | if (sk->sk_state != PPPOX_CONNECTED) | 859 | if (!(sk->sk_state & PPPOX_CONNECTED)) |
860 | goto end; | 860 | goto end; |
861 | 861 | ||
862 | error = -EBADF; | 862 | error = -EBADF; |
diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index 958a1455ca7f..9f267c3ffb39 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c | |||
@@ -205,6 +205,7 @@ static int ct_seq_show(struct seq_file *s, void *v) | |||
205 | struct nf_conn *ct = nf_ct_tuplehash_to_ctrack(hash); | 205 | struct nf_conn *ct = nf_ct_tuplehash_to_ctrack(hash); |
206 | const struct nf_conntrack_l3proto *l3proto; | 206 | const struct nf_conntrack_l3proto *l3proto; |
207 | const struct nf_conntrack_l4proto *l4proto; | 207 | const struct nf_conntrack_l4proto *l4proto; |
208 | struct net *net = seq_file_net(s); | ||
208 | int ret = 0; | 209 | int ret = 0; |
209 | 210 | ||
210 | NF_CT_ASSERT(ct); | 211 | NF_CT_ASSERT(ct); |
@@ -215,6 +216,9 @@ static int ct_seq_show(struct seq_file *s, void *v) | |||
215 | if (NF_CT_DIRECTION(hash)) | 216 | if (NF_CT_DIRECTION(hash)) |
216 | goto release; | 217 | goto release; |
217 | 218 | ||
219 | if (!net_eq(nf_ct_net(ct), net)) | ||
220 | goto release; | ||
221 | |||
218 | l3proto = __nf_ct_l3proto_find(nf_ct_l3num(ct)); | 222 | l3proto = __nf_ct_l3proto_find(nf_ct_l3num(ct)); |
219 | NF_CT_ASSERT(l3proto); | 223 | NF_CT_ASSERT(l3proto); |
220 | l4proto = __nf_ct_l4proto_find(nf_ct_l3num(ct), nf_ct_protonum(ct)); | 224 | l4proto = __nf_ct_l4proto_find(nf_ct_l3num(ct), nf_ct_protonum(ct)); |
diff --git a/net/netfilter/nfnetlink_acct.c b/net/netfilter/nfnetlink_acct.c index 1b4de4bd6958..70eb2f6a3b01 100644 --- a/net/netfilter/nfnetlink_acct.c +++ b/net/netfilter/nfnetlink_acct.c | |||
@@ -326,14 +326,14 @@ static int nfnl_acct_try_del(struct nf_acct *cur) | |||
326 | { | 326 | { |
327 | int ret = 0; | 327 | int ret = 0; |
328 | 328 | ||
329 | /* we want to avoid races with nfnl_acct_find_get. */ | 329 | /* We want to avoid races with nfnl_acct_put. So only when the current |
330 | if (atomic_dec_and_test(&cur->refcnt)) { | 330 | * refcnt is 1, we decrease it to 0. |
331 | */ | ||
332 | if (atomic_cmpxchg(&cur->refcnt, 1, 0) == 1) { | ||
331 | /* We are protected by nfnl mutex. */ | 333 | /* We are protected by nfnl mutex. */ |
332 | list_del_rcu(&cur->head); | 334 | list_del_rcu(&cur->head); |
333 | kfree_rcu(cur, rcu_head); | 335 | kfree_rcu(cur, rcu_head); |
334 | } else { | 336 | } else { |
335 | /* still in use, restore reference counter. */ | ||
336 | atomic_inc(&cur->refcnt); | ||
337 | ret = -EBUSY; | 337 | ret = -EBUSY; |
338 | } | 338 | } |
339 | return ret; | 339 | return ret; |
@@ -443,7 +443,7 @@ void nfnl_acct_update(const struct sk_buff *skb, struct nf_acct *nfacct) | |||
443 | } | 443 | } |
444 | EXPORT_SYMBOL_GPL(nfnl_acct_update); | 444 | EXPORT_SYMBOL_GPL(nfnl_acct_update); |
445 | 445 | ||
446 | static void nfnl_overquota_report(struct nf_acct *nfacct) | 446 | static void nfnl_overquota_report(struct net *net, struct nf_acct *nfacct) |
447 | { | 447 | { |
448 | int ret; | 448 | int ret; |
449 | struct sk_buff *skb; | 449 | struct sk_buff *skb; |
@@ -458,11 +458,12 @@ static void nfnl_overquota_report(struct nf_acct *nfacct) | |||
458 | kfree_skb(skb); | 458 | kfree_skb(skb); |
459 | return; | 459 | return; |
460 | } | 460 | } |
461 | netlink_broadcast(init_net.nfnl, skb, 0, NFNLGRP_ACCT_QUOTA, | 461 | netlink_broadcast(net->nfnl, skb, 0, NFNLGRP_ACCT_QUOTA, |
462 | GFP_ATOMIC); | 462 | GFP_ATOMIC); |
463 | } | 463 | } |
464 | 464 | ||
465 | int nfnl_acct_overquota(const struct sk_buff *skb, struct nf_acct *nfacct) | 465 | int nfnl_acct_overquota(struct net *net, const struct sk_buff *skb, |
466 | struct nf_acct *nfacct) | ||
466 | { | 467 | { |
467 | u64 now; | 468 | u64 now; |
468 | u64 *quota; | 469 | u64 *quota; |
@@ -480,7 +481,7 @@ int nfnl_acct_overquota(const struct sk_buff *skb, struct nf_acct *nfacct) | |||
480 | 481 | ||
481 | if (now >= *quota && | 482 | if (now >= *quota && |
482 | !test_and_set_bit(NFACCT_OVERQUOTA_BIT, &nfacct->flags)) { | 483 | !test_and_set_bit(NFACCT_OVERQUOTA_BIT, &nfacct->flags)) { |
483 | nfnl_overquota_report(nfacct); | 484 | nfnl_overquota_report(net, nfacct); |
484 | } | 485 | } |
485 | 486 | ||
486 | return ret; | 487 | return ret; |
diff --git a/net/netfilter/nfnetlink_cttimeout.c b/net/netfilter/nfnetlink_cttimeout.c index 4cdcd969b64c..68216cdc7083 100644 --- a/net/netfilter/nfnetlink_cttimeout.c +++ b/net/netfilter/nfnetlink_cttimeout.c | |||
@@ -330,16 +330,16 @@ static int ctnl_timeout_try_del(struct net *net, struct ctnl_timeout *timeout) | |||
330 | { | 330 | { |
331 | int ret = 0; | 331 | int ret = 0; |
332 | 332 | ||
333 | /* we want to avoid races with nf_ct_timeout_find_get. */ | 333 | /* We want to avoid races with ctnl_timeout_put. So only when the |
334 | if (atomic_dec_and_test(&timeout->refcnt)) { | 334 | * current refcnt is 1, we decrease it to 0. |
335 | */ | ||
336 | if (atomic_cmpxchg(&timeout->refcnt, 1, 0) == 1) { | ||
335 | /* We are protected by nfnl mutex. */ | 337 | /* We are protected by nfnl mutex. */ |
336 | list_del_rcu(&timeout->head); | 338 | list_del_rcu(&timeout->head); |
337 | nf_ct_l4proto_put(timeout->l4proto); | 339 | nf_ct_l4proto_put(timeout->l4proto); |
338 | ctnl_untimeout(net, timeout); | 340 | ctnl_untimeout(net, timeout); |
339 | kfree_rcu(timeout, rcu_head); | 341 | kfree_rcu(timeout, rcu_head); |
340 | } else { | 342 | } else { |
341 | /* still in use, restore reference counter. */ | ||
342 | atomic_inc(&timeout->refcnt); | ||
343 | ret = -EBUSY; | 343 | ret = -EBUSY; |
344 | } | 344 | } |
345 | return ret; | 345 | return ret; |
@@ -543,7 +543,9 @@ err: | |||
543 | 543 | ||
544 | static void ctnl_timeout_put(struct ctnl_timeout *timeout) | 544 | static void ctnl_timeout_put(struct ctnl_timeout *timeout) |
545 | { | 545 | { |
546 | atomic_dec(&timeout->refcnt); | 546 | if (atomic_dec_and_test(&timeout->refcnt)) |
547 | kfree_rcu(timeout, rcu_head); | ||
548 | |||
547 | module_put(THIS_MODULE); | 549 | module_put(THIS_MODULE); |
548 | } | 550 | } |
549 | #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */ | 551 | #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */ |
@@ -591,7 +593,9 @@ static void __net_exit cttimeout_net_exit(struct net *net) | |||
591 | list_for_each_entry_safe(cur, tmp, &net->nfct_timeout_list, head) { | 593 | list_for_each_entry_safe(cur, tmp, &net->nfct_timeout_list, head) { |
592 | list_del_rcu(&cur->head); | 594 | list_del_rcu(&cur->head); |
593 | nf_ct_l4proto_put(cur->l4proto); | 595 | nf_ct_l4proto_put(cur->l4proto); |
594 | kfree_rcu(cur, rcu_head); | 596 | |
597 | if (atomic_dec_and_test(&cur->refcnt)) | ||
598 | kfree_rcu(cur, rcu_head); | ||
595 | } | 599 | } |
596 | } | 600 | } |
597 | 601 | ||
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index cbcfdfb586a6..6577db524ef6 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
@@ -1147,6 +1147,7 @@ MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_ULOG); | |||
1147 | MODULE_ALIAS_NF_LOGGER(AF_INET, 1); | 1147 | MODULE_ALIAS_NF_LOGGER(AF_INET, 1); |
1148 | MODULE_ALIAS_NF_LOGGER(AF_INET6, 1); | 1148 | MODULE_ALIAS_NF_LOGGER(AF_INET6, 1); |
1149 | MODULE_ALIAS_NF_LOGGER(AF_BRIDGE, 1); | 1149 | MODULE_ALIAS_NF_LOGGER(AF_BRIDGE, 1); |
1150 | MODULE_ALIAS_NF_LOGGER(3, 1); /* NFPROTO_ARP */ | ||
1150 | 1151 | ||
1151 | module_init(nfnetlink_log_init); | 1152 | module_init(nfnetlink_log_init); |
1152 | module_exit(nfnetlink_log_fini); | 1153 | module_exit(nfnetlink_log_fini); |
diff --git a/net/netfilter/xt_TPROXY.c b/net/netfilter/xt_TPROXY.c index 7f4414d26a66..663c4c3c9072 100644 --- a/net/netfilter/xt_TPROXY.c +++ b/net/netfilter/xt_TPROXY.c | |||
@@ -127,6 +127,8 @@ nf_tproxy_get_sock_v4(struct net *net, struct sk_buff *skb, void *hp, | |||
127 | daddr, dport, | 127 | daddr, dport, |
128 | in->ifindex); | 128 | in->ifindex); |
129 | 129 | ||
130 | if (sk && !atomic_inc_not_zero(&sk->sk_refcnt)) | ||
131 | sk = NULL; | ||
130 | /* NOTE: we return listeners even if bound to | 132 | /* NOTE: we return listeners even if bound to |
131 | * 0.0.0.0, those are filtered out in | 133 | * 0.0.0.0, those are filtered out in |
132 | * xt_socket, since xt_TPROXY needs 0 bound | 134 | * xt_socket, since xt_TPROXY needs 0 bound |
@@ -195,6 +197,8 @@ nf_tproxy_get_sock_v6(struct net *net, struct sk_buff *skb, int thoff, void *hp, | |||
195 | daddr, ntohs(dport), | 197 | daddr, ntohs(dport), |
196 | in->ifindex); | 198 | in->ifindex); |
197 | 199 | ||
200 | if (sk && !atomic_inc_not_zero(&sk->sk_refcnt)) | ||
201 | sk = NULL; | ||
198 | /* NOTE: we return listeners even if bound to | 202 | /* NOTE: we return listeners even if bound to |
199 | * 0.0.0.0, those are filtered out in | 203 | * 0.0.0.0, those are filtered out in |
200 | * xt_socket, since xt_TPROXY needs 0 bound | 204 | * xt_socket, since xt_TPROXY needs 0 bound |
diff --git a/net/netfilter/xt_nfacct.c b/net/netfilter/xt_nfacct.c index 3048a7e3a90a..cf327593852a 100644 --- a/net/netfilter/xt_nfacct.c +++ b/net/netfilter/xt_nfacct.c | |||
@@ -26,7 +26,7 @@ static bool nfacct_mt(const struct sk_buff *skb, struct xt_action_param *par) | |||
26 | 26 | ||
27 | nfnl_acct_update(skb, info->nfacct); | 27 | nfnl_acct_update(skb, info->nfacct); |
28 | 28 | ||
29 | overquota = nfnl_acct_overquota(skb, info->nfacct); | 29 | overquota = nfnl_acct_overquota(par->net, skb, info->nfacct); |
30 | 30 | ||
31 | return overquota == NFACCT_UNDERQUOTA ? false : true; | 31 | return overquota == NFACCT_UNDERQUOTA ? false : true; |
32 | } | 32 | } |
diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c index 141a06eeb1e5..e87cd81315e1 100644 --- a/net/sched/act_ife.c +++ b/net/sched/act_ife.c | |||
@@ -53,7 +53,7 @@ int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, const void *dval) | |||
53 | u32 *tlv = (u32 *)(skbdata); | 53 | u32 *tlv = (u32 *)(skbdata); |
54 | u16 totlen = nla_total_size(dlen); /*alignment + hdr */ | 54 | u16 totlen = nla_total_size(dlen); /*alignment + hdr */ |
55 | char *dptr = (char *)tlv + NLA_HDRLEN; | 55 | char *dptr = (char *)tlv + NLA_HDRLEN; |
56 | u32 htlv = attrtype << 16 | totlen; | 56 | u32 htlv = attrtype << 16 | dlen; |
57 | 57 | ||
58 | *tlv = htonl(htlv); | 58 | *tlv = htonl(htlv); |
59 | memset(dptr, 0, totlen - NLA_HDRLEN); | 59 | memset(dptr, 0, totlen - NLA_HDRLEN); |
@@ -135,7 +135,7 @@ EXPORT_SYMBOL_GPL(ife_release_meta_gen); | |||
135 | 135 | ||
136 | int ife_validate_meta_u32(void *val, int len) | 136 | int ife_validate_meta_u32(void *val, int len) |
137 | { | 137 | { |
138 | if (len == 4) | 138 | if (len == sizeof(u32)) |
139 | return 0; | 139 | return 0; |
140 | 140 | ||
141 | return -EINVAL; | 141 | return -EINVAL; |
@@ -144,8 +144,8 @@ EXPORT_SYMBOL_GPL(ife_validate_meta_u32); | |||
144 | 144 | ||
145 | int ife_validate_meta_u16(void *val, int len) | 145 | int ife_validate_meta_u16(void *val, int len) |
146 | { | 146 | { |
147 | /* length will include padding */ | 147 | /* length will not include padding */ |
148 | if (len == NLA_ALIGN(2)) | 148 | if (len == sizeof(u16)) |
149 | return 0; | 149 | return 0; |
150 | 150 | ||
151 | return -EINVAL; | 151 | return -EINVAL; |
@@ -652,12 +652,14 @@ static int tcf_ife_decode(struct sk_buff *skb, const struct tc_action *a, | |||
652 | u8 *tlvdata = (u8 *)tlv; | 652 | u8 *tlvdata = (u8 *)tlv; |
653 | u16 mtype = tlv->type; | 653 | u16 mtype = tlv->type; |
654 | u16 mlen = tlv->len; | 654 | u16 mlen = tlv->len; |
655 | u16 alen; | ||
655 | 656 | ||
656 | mtype = ntohs(mtype); | 657 | mtype = ntohs(mtype); |
657 | mlen = ntohs(mlen); | 658 | mlen = ntohs(mlen); |
659 | alen = NLA_ALIGN(mlen); | ||
658 | 660 | ||
659 | if (find_decode_metaid(skb, ife, mtype, (mlen - 4), | 661 | if (find_decode_metaid(skb, ife, mtype, (mlen - NLA_HDRLEN), |
660 | (void *)(tlvdata + 4))) { | 662 | (void *)(tlvdata + NLA_HDRLEN))) { |
661 | /* abuse overlimits to count when we receive metadata | 663 | /* abuse overlimits to count when we receive metadata |
662 | * but dont have an ops for it | 664 | * but dont have an ops for it |
663 | */ | 665 | */ |
@@ -666,8 +668,8 @@ static int tcf_ife_decode(struct sk_buff *skb, const struct tc_action *a, | |||
666 | ife->tcf_qstats.overlimits++; | 668 | ife->tcf_qstats.overlimits++; |
667 | } | 669 | } |
668 | 670 | ||
669 | tlvdata += mlen; | 671 | tlvdata += alen; |
670 | ifehdrln -= mlen; | 672 | ifehdrln -= alen; |
671 | tlv = (struct meta_tlvhdr *)tlvdata; | 673 | tlv = (struct meta_tlvhdr *)tlvdata; |
672 | } | 674 | } |
673 | 675 | ||
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index e95b67cd5718..657c13362b19 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -643,18 +643,19 @@ struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, | |||
643 | struct Qdisc *sch; | 643 | struct Qdisc *sch; |
644 | 644 | ||
645 | if (!try_module_get(ops->owner)) | 645 | if (!try_module_get(ops->owner)) |
646 | goto errout; | 646 | return NULL; |
647 | 647 | ||
648 | sch = qdisc_alloc(dev_queue, ops); | 648 | sch = qdisc_alloc(dev_queue, ops); |
649 | if (IS_ERR(sch)) | 649 | if (IS_ERR(sch)) { |
650 | goto errout; | 650 | module_put(ops->owner); |
651 | return NULL; | ||
652 | } | ||
651 | sch->parent = parentid; | 653 | sch->parent = parentid; |
652 | 654 | ||
653 | if (!ops->init || ops->init(sch, NULL) == 0) | 655 | if (!ops->init || ops->init(sch, NULL) == 0) |
654 | return sch; | 656 | return sch; |
655 | 657 | ||
656 | qdisc_destroy(sch); | 658 | qdisc_destroy(sch); |
657 | errout: | ||
658 | return NULL; | 659 | return NULL; |
659 | } | 660 | } |
660 | EXPORT_SYMBOL(qdisc_create_dflt); | 661 | EXPORT_SYMBOL(qdisc_create_dflt); |
diff --git a/net/sctp/input.c b/net/sctp/input.c index c182db7d691f..69444d32ecda 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c | |||
@@ -119,7 +119,13 @@ int sctp_rcv(struct sk_buff *skb) | |||
119 | skb_transport_offset(skb)) | 119 | skb_transport_offset(skb)) |
120 | goto discard_it; | 120 | goto discard_it; |
121 | 121 | ||
122 | if (!pskb_may_pull(skb, sizeof(struct sctphdr))) | 122 | /* If the packet is fragmented and we need to do crc checking, |
123 | * it's better to just linearize it otherwise crc computing | ||
124 | * takes longer. | ||
125 | */ | ||
126 | if ((!(skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) && | ||
127 | skb_linearize(skb)) || | ||
128 | !pskb_may_pull(skb, sizeof(struct sctphdr))) | ||
123 | goto discard_it; | 129 | goto discard_it; |
124 | 130 | ||
125 | /* Pull up the IP header. */ | 131 | /* Pull up the IP header. */ |
@@ -1177,9 +1183,6 @@ static struct sctp_association *__sctp_rcv_lookup_harder(struct net *net, | |||
1177 | if ((skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) == SKB_GSO_SCTP) | 1183 | if ((skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) == SKB_GSO_SCTP) |
1178 | return NULL; | 1184 | return NULL; |
1179 | 1185 | ||
1180 | if (skb_linearize(skb)) | ||
1181 | return NULL; | ||
1182 | |||
1183 | ch = (sctp_chunkhdr_t *) skb->data; | 1186 | ch = (sctp_chunkhdr_t *) skb->data; |
1184 | 1187 | ||
1185 | /* The code below will attempt to walk the chunk and extract | 1188 | /* The code below will attempt to walk the chunk and extract |
diff --git a/net/sctp/inqueue.c b/net/sctp/inqueue.c index c30ddb0f3190..6437aa97cfd7 100644 --- a/net/sctp/inqueue.c +++ b/net/sctp/inqueue.c | |||
@@ -170,19 +170,6 @@ next_chunk: | |||
170 | 170 | ||
171 | chunk = list_entry(entry, struct sctp_chunk, list); | 171 | chunk = list_entry(entry, struct sctp_chunk, list); |
172 | 172 | ||
173 | /* Linearize if it's not GSO */ | ||
174 | if ((skb_shinfo(chunk->skb)->gso_type & SKB_GSO_SCTP) != SKB_GSO_SCTP && | ||
175 | skb_is_nonlinear(chunk->skb)) { | ||
176 | if (skb_linearize(chunk->skb)) { | ||
177 | __SCTP_INC_STATS(dev_net(chunk->skb->dev), SCTP_MIB_IN_PKT_DISCARDS); | ||
178 | sctp_chunk_free(chunk); | ||
179 | goto next_chunk; | ||
180 | } | ||
181 | |||
182 | /* Update sctp_hdr as it probably changed */ | ||
183 | chunk->sctp_hdr = sctp_hdr(chunk->skb); | ||
184 | } | ||
185 | |||
186 | if ((skb_shinfo(chunk->skb)->gso_type & SKB_GSO_SCTP) == SKB_GSO_SCTP) { | 173 | if ((skb_shinfo(chunk->skb)->gso_type & SKB_GSO_SCTP) == SKB_GSO_SCTP) { |
187 | /* GSO-marked skbs but without frags, handle | 174 | /* GSO-marked skbs but without frags, handle |
188 | * them normally | 175 | * them normally |
diff --git a/net/sctp/sctp_diag.c b/net/sctp/sctp_diag.c index bb691538adc8..f3508aa75815 100644 --- a/net/sctp/sctp_diag.c +++ b/net/sctp/sctp_diag.c | |||
@@ -424,11 +424,13 @@ static int sctp_diag_dump_one(struct sk_buff *in_skb, | |||
424 | paddr.v4.sin_family = AF_INET; | 424 | paddr.v4.sin_family = AF_INET; |
425 | } else { | 425 | } else { |
426 | laddr.v6.sin6_port = req->id.idiag_sport; | 426 | laddr.v6.sin6_port = req->id.idiag_sport; |
427 | memcpy(&laddr.v6.sin6_addr, req->id.idiag_src, 64); | 427 | memcpy(&laddr.v6.sin6_addr, req->id.idiag_src, |
428 | sizeof(laddr.v6.sin6_addr)); | ||
428 | laddr.v6.sin6_family = AF_INET6; | 429 | laddr.v6.sin6_family = AF_INET6; |
429 | 430 | ||
430 | paddr.v6.sin6_port = req->id.idiag_dport; | 431 | paddr.v6.sin6_port = req->id.idiag_dport; |
431 | memcpy(&paddr.v6.sin6_addr, req->id.idiag_dst, 64); | 432 | memcpy(&paddr.v6.sin6_addr, req->id.idiag_dst, |
433 | sizeof(paddr.v6.sin6_addr)); | ||
432 | paddr.v6.sin6_family = AF_INET6; | 434 | paddr.v6.sin6_family = AF_INET6; |
433 | } | 435 | } |
434 | 436 | ||
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 7f79fb7dc6a0..66f23b376fa0 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -453,7 +453,7 @@ static struct rpc_clnt *rpc_create_xprt(struct rpc_create_args *args, | |||
453 | struct rpc_xprt_switch *xps; | 453 | struct rpc_xprt_switch *xps; |
454 | 454 | ||
455 | if (args->bc_xprt && args->bc_xprt->xpt_bc_xps) { | 455 | if (args->bc_xprt && args->bc_xprt->xpt_bc_xps) { |
456 | WARN_ON(args->protocol != XPRT_TRANSPORT_BC_TCP); | 456 | WARN_ON_ONCE(!(args->protocol & XPRT_TRANSPORT_BC)); |
457 | xps = args->bc_xprt->xpt_bc_xps; | 457 | xps = args->bc_xprt->xpt_bc_xps; |
458 | xprt_switch_get(xps); | 458 | xprt_switch_get(xps); |
459 | } else { | 459 | } else { |
@@ -520,7 +520,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args) | |||
520 | char servername[48]; | 520 | char servername[48]; |
521 | 521 | ||
522 | if (args->bc_xprt) { | 522 | if (args->bc_xprt) { |
523 | WARN_ON(args->protocol != XPRT_TRANSPORT_BC_TCP); | 523 | WARN_ON_ONCE(!(args->protocol & XPRT_TRANSPORT_BC)); |
524 | xprt = args->bc_xprt->xpt_bc_xprt; | 524 | xprt = args->bc_xprt->xpt_bc_xprt; |
525 | if (xprt) { | 525 | if (xprt) { |
526 | xprt_get(xprt); | 526 | xprt_get(xprt); |
diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c index b016c011970b..ae7e14cae085 100644 --- a/net/tipc/udp_media.c +++ b/net/tipc/udp_media.c | |||
@@ -396,10 +396,13 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b, | |||
396 | tuncfg.encap_destroy = NULL; | 396 | tuncfg.encap_destroy = NULL; |
397 | setup_udp_tunnel_sock(net, ub->ubsock, &tuncfg); | 397 | setup_udp_tunnel_sock(net, ub->ubsock, &tuncfg); |
398 | 398 | ||
399 | if (enable_mcast(ub, remote)) | 399 | err = enable_mcast(ub, remote); |
400 | if (err) | ||
400 | goto err; | 401 | goto err; |
401 | return 0; | 402 | return 0; |
402 | err: | 403 | err: |
404 | if (ub->ubsock) | ||
405 | udp_tunnel_sock_release(ub->ubsock); | ||
403 | kfree(ub); | 406 | kfree(ub); |
404 | return err; | 407 | return err; |
405 | } | 408 | } |
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 4de3cc42fc50..206a6b346a8d 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
@@ -3570,15 +3570,6 @@ sub process { | |||
3570 | } | 3570 | } |
3571 | } | 3571 | } |
3572 | 3572 | ||
3573 | # check for uses of DEFINE_PCI_DEVICE_TABLE | ||
3574 | if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) { | ||
3575 | if (WARN("DEFINE_PCI_DEVICE_TABLE", | ||
3576 | "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) && | ||
3577 | $fix) { | ||
3578 | $fixed[$fixlinenr] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /; | ||
3579 | } | ||
3580 | } | ||
3581 | |||
3582 | # check for new typedefs, only function parameters and sparse annotations | 3573 | # check for new typedefs, only function parameters and sparse annotations |
3583 | # make sense. | 3574 | # make sense. |
3584 | if ($line =~ /\btypedef\s/ && | 3575 | if ($line =~ /\btypedef\s/ && |
diff --git a/scripts/package/builddeb b/scripts/package/builddeb index e1c09e2f9be7..8ea9fd2b6573 100755 --- a/scripts/package/builddeb +++ b/scripts/package/builddeb | |||
@@ -332,7 +332,9 @@ if grep -q '^CONFIG_STACK_VALIDATION=y' $KCONFIG_CONFIG ; then | |||
332 | (cd $objtree; find tools/objtool -type f -executable) >> "$objtree/debian/hdrobjfiles" | 332 | (cd $objtree; find tools/objtool -type f -executable) >> "$objtree/debian/hdrobjfiles" |
333 | fi | 333 | fi |
334 | (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" | 334 | (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" |
335 | (cd $objtree; find scripts/gcc-plugins -name \*.so -o -name gcc-common.h) >> "$objtree/debian/hdrobjfiles" | 335 | if grep -q '^CONFIG_GCC_PLUGINS=y' $KCONFIG_CONFIG ; then |
336 | (cd $objtree; find scripts/gcc-plugins -name \*.so -o -name gcc-common.h) >> "$objtree/debian/hdrobjfiles" | ||
337 | fi | ||
336 | destdir=$kernel_headers_dir/usr/src/linux-headers-$version | 338 | destdir=$kernel_headers_dir/usr/src/linux-headers-$version |
337 | mkdir -p "$destdir" | 339 | mkdir -p "$destdir" |
338 | (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) | 340 | (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) |
diff --git a/scripts/tags.sh b/scripts/tags.sh index ed7eef24ef89..b3775a9604ea 100755 --- a/scripts/tags.sh +++ b/scripts/tags.sh | |||
@@ -206,7 +206,6 @@ regex_c=( | |||
206 | '/\<DEFINE_PER_CPU_SHARED_ALIGNED([^,]*, *\([[:alnum:]_]*\)/\1/v/' | 206 | '/\<DEFINE_PER_CPU_SHARED_ALIGNED([^,]*, *\([[:alnum:]_]*\)/\1/v/' |
207 | '/\<DECLARE_WAIT_QUEUE_HEAD(\([[:alnum:]_]*\)/\1/v/' | 207 | '/\<DECLARE_WAIT_QUEUE_HEAD(\([[:alnum:]_]*\)/\1/v/' |
208 | '/\<DECLARE_\(TASKLET\|WORK\|DELAYED_WORK\)(\([[:alnum:]_]*\)/\2/v/' | 208 | '/\<DECLARE_\(TASKLET\|WORK\|DELAYED_WORK\)(\([[:alnum:]_]*\)/\2/v/' |
209 | '/\<DEFINE_PCI_DEVICE_TABLE(\([[:alnum:]_]*\)/\1/v/' | ||
210 | '/\(^\s\)OFFSET(\([[:alnum:]_]*\)/\2/v/' | 209 | '/\(^\s\)OFFSET(\([[:alnum:]_]*\)/\2/v/' |
211 | '/\(^\s\)DEFINE(\([[:alnum:]_]*\)/\2/v/' | 210 | '/\(^\s\)DEFINE(\([[:alnum:]_]*\)/\2/v/' |
212 | '/\<DEFINE_HASHTABLE(\([[:alnum:]_]*\)/\1/v/' | 211 | '/\<DEFINE_HASHTABLE(\([[:alnum:]_]*\)/\1/v/' |
diff --git a/security/Kconfig b/security/Kconfig index da10d9b573a4..118f4549404e 100644 --- a/security/Kconfig +++ b/security/Kconfig | |||
@@ -147,6 +147,17 @@ config HARDENED_USERCOPY | |||
147 | or are part of the kernel text. This kills entire classes | 147 | or are part of the kernel text. This kills entire classes |
148 | of heap overflow exploits and similar kernel memory exposures. | 148 | of heap overflow exploits and similar kernel memory exposures. |
149 | 149 | ||
150 | config HARDENED_USERCOPY_PAGESPAN | ||
151 | bool "Refuse to copy allocations that span multiple pages" | ||
152 | depends on HARDENED_USERCOPY | ||
153 | depends on EXPERT | ||
154 | help | ||
155 | When a multi-page allocation is done without __GFP_COMP, | ||
156 | hardened usercopy will reject attempts to copy it. There are, | ||
157 | however, several cases of this in the kernel that have not all | ||
158 | been removed. This config is intended to be used only while | ||
159 | trying to find such users. | ||
160 | |||
150 | source security/selinux/Kconfig | 161 | source security/selinux/Kconfig |
151 | source security/smack/Kconfig | 162 | source security/smack/Kconfig |
152 | source security/tomoyo/Kconfig | 163 | source security/tomoyo/Kconfig |
diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c index 795437b10082..b450a27588c8 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c | |||
@@ -1633,11 +1633,13 @@ static int snd_rawmidi_dev_register(struct snd_device *device) | |||
1633 | return -EBUSY; | 1633 | return -EBUSY; |
1634 | } | 1634 | } |
1635 | list_add_tail(&rmidi->list, &snd_rawmidi_devices); | 1635 | list_add_tail(&rmidi->list, &snd_rawmidi_devices); |
1636 | mutex_unlock(®ister_mutex); | ||
1636 | err = snd_register_device(SNDRV_DEVICE_TYPE_RAWMIDI, | 1637 | err = snd_register_device(SNDRV_DEVICE_TYPE_RAWMIDI, |
1637 | rmidi->card, rmidi->device, | 1638 | rmidi->card, rmidi->device, |
1638 | &snd_rawmidi_f_ops, rmidi, &rmidi->dev); | 1639 | &snd_rawmidi_f_ops, rmidi, &rmidi->dev); |
1639 | if (err < 0) { | 1640 | if (err < 0) { |
1640 | rmidi_err(rmidi, "unable to register\n"); | 1641 | rmidi_err(rmidi, "unable to register\n"); |
1642 | mutex_lock(®ister_mutex); | ||
1641 | list_del(&rmidi->list); | 1643 | list_del(&rmidi->list); |
1642 | mutex_unlock(®ister_mutex); | 1644 | mutex_unlock(®ister_mutex); |
1643 | return err; | 1645 | return err; |
@@ -1645,6 +1647,7 @@ static int snd_rawmidi_dev_register(struct snd_device *device) | |||
1645 | if (rmidi->ops && rmidi->ops->dev_register && | 1647 | if (rmidi->ops && rmidi->ops->dev_register && |
1646 | (err = rmidi->ops->dev_register(rmidi)) < 0) { | 1648 | (err = rmidi->ops->dev_register(rmidi)) < 0) { |
1647 | snd_unregister_device(&rmidi->dev); | 1649 | snd_unregister_device(&rmidi->dev); |
1650 | mutex_lock(®ister_mutex); | ||
1648 | list_del(&rmidi->list); | 1651 | list_del(&rmidi->list); |
1649 | mutex_unlock(®ister_mutex); | 1652 | mutex_unlock(®ister_mutex); |
1650 | return err; | 1653 | return err; |
@@ -1677,7 +1680,6 @@ static int snd_rawmidi_dev_register(struct snd_device *device) | |||
1677 | } | 1680 | } |
1678 | } | 1681 | } |
1679 | #endif /* CONFIG_SND_OSSEMUL */ | 1682 | #endif /* CONFIG_SND_OSSEMUL */ |
1680 | mutex_unlock(®ister_mutex); | ||
1681 | sprintf(name, "midi%d", rmidi->device); | 1683 | sprintf(name, "midi%d", rmidi->device); |
1682 | entry = snd_info_create_card_entry(rmidi->card, name, rmidi->card->proc_root); | 1684 | entry = snd_info_create_card_entry(rmidi->card, name, rmidi->card->proc_root); |
1683 | if (entry) { | 1685 | if (entry) { |
diff --git a/sound/core/timer.c b/sound/core/timer.c index 9a6157ea6881..fc144f43faa6 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c | |||
@@ -35,6 +35,9 @@ | |||
35 | #include <sound/initval.h> | 35 | #include <sound/initval.h> |
36 | #include <linux/kmod.h> | 36 | #include <linux/kmod.h> |
37 | 37 | ||
38 | /* internal flags */ | ||
39 | #define SNDRV_TIMER_IFLG_PAUSED 0x00010000 | ||
40 | |||
38 | #if IS_ENABLED(CONFIG_SND_HRTIMER) | 41 | #if IS_ENABLED(CONFIG_SND_HRTIMER) |
39 | #define DEFAULT_TIMER_LIMIT 4 | 42 | #define DEFAULT_TIMER_LIMIT 4 |
40 | #else | 43 | #else |
@@ -294,8 +297,21 @@ int snd_timer_open(struct snd_timer_instance **ti, | |||
294 | get_device(&timer->card->card_dev); | 297 | get_device(&timer->card->card_dev); |
295 | timeri->slave_class = tid->dev_sclass; | 298 | timeri->slave_class = tid->dev_sclass; |
296 | timeri->slave_id = slave_id; | 299 | timeri->slave_id = slave_id; |
297 | if (list_empty(&timer->open_list_head) && timer->hw.open) | 300 | |
298 | timer->hw.open(timer); | 301 | if (list_empty(&timer->open_list_head) && timer->hw.open) { |
302 | int err = timer->hw.open(timer); | ||
303 | if (err) { | ||
304 | kfree(timeri->owner); | ||
305 | kfree(timeri); | ||
306 | |||
307 | if (timer->card) | ||
308 | put_device(&timer->card->card_dev); | ||
309 | module_put(timer->module); | ||
310 | mutex_unlock(®ister_mutex); | ||
311 | return err; | ||
312 | } | ||
313 | } | ||
314 | |||
299 | list_add_tail(&timeri->open_list, &timer->open_list_head); | 315 | list_add_tail(&timeri->open_list, &timer->open_list_head); |
300 | snd_timer_check_master(timeri); | 316 | snd_timer_check_master(timeri); |
301 | mutex_unlock(®ister_mutex); | 317 | mutex_unlock(®ister_mutex); |
@@ -526,6 +542,10 @@ static int snd_timer_stop1(struct snd_timer_instance *timeri, bool stop) | |||
526 | } | 542 | } |
527 | } | 543 | } |
528 | timeri->flags &= ~(SNDRV_TIMER_IFLG_RUNNING | SNDRV_TIMER_IFLG_START); | 544 | timeri->flags &= ~(SNDRV_TIMER_IFLG_RUNNING | SNDRV_TIMER_IFLG_START); |
545 | if (stop) | ||
546 | timeri->flags &= ~SNDRV_TIMER_IFLG_PAUSED; | ||
547 | else | ||
548 | timeri->flags |= SNDRV_TIMER_IFLG_PAUSED; | ||
529 | snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP : | 549 | snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP : |
530 | SNDRV_TIMER_EVENT_CONTINUE); | 550 | SNDRV_TIMER_EVENT_CONTINUE); |
531 | unlock: | 551 | unlock: |
@@ -587,6 +607,10 @@ int snd_timer_stop(struct snd_timer_instance *timeri) | |||
587 | */ | 607 | */ |
588 | int snd_timer_continue(struct snd_timer_instance *timeri) | 608 | int snd_timer_continue(struct snd_timer_instance *timeri) |
589 | { | 609 | { |
610 | /* timer can continue only after pause */ | ||
611 | if (!(timeri->flags & SNDRV_TIMER_IFLG_PAUSED)) | ||
612 | return -EINVAL; | ||
613 | |||
590 | if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) | 614 | if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) |
591 | return snd_timer_start_slave(timeri, false); | 615 | return snd_timer_start_slave(timeri, false); |
592 | else | 616 | else |
@@ -813,6 +837,7 @@ int snd_timer_new(struct snd_card *card, char *id, struct snd_timer_id *tid, | |||
813 | timer->tmr_subdevice = tid->subdevice; | 837 | timer->tmr_subdevice = tid->subdevice; |
814 | if (id) | 838 | if (id) |
815 | strlcpy(timer->id, id, sizeof(timer->id)); | 839 | strlcpy(timer->id, id, sizeof(timer->id)); |
840 | timer->sticks = 1; | ||
816 | INIT_LIST_HEAD(&timer->device_list); | 841 | INIT_LIST_HEAD(&timer->device_list); |
817 | INIT_LIST_HEAD(&timer->open_list_head); | 842 | INIT_LIST_HEAD(&timer->open_list_head); |
818 | INIT_LIST_HEAD(&timer->active_list_head); | 843 | INIT_LIST_HEAD(&timer->active_list_head); |
@@ -1817,6 +1842,9 @@ static int snd_timer_user_continue(struct file *file) | |||
1817 | tu = file->private_data; | 1842 | tu = file->private_data; |
1818 | if (!tu->timeri) | 1843 | if (!tu->timeri) |
1819 | return -EBADFD; | 1844 | return -EBADFD; |
1845 | /* start timer instead of continue if it's not used before */ | ||
1846 | if (!(tu->timeri->flags & SNDRV_TIMER_IFLG_PAUSED)) | ||
1847 | return snd_timer_user_start(file); | ||
1820 | tu->timeri->lost = 0; | 1848 | tu->timeri->lost = 0; |
1821 | return (err = snd_timer_continue(tu->timeri)) < 0 ? err : 0; | 1849 | return (err = snd_timer_continue(tu->timeri)) < 0 ? err : 0; |
1822 | } | 1850 | } |
@@ -1958,6 +1986,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, | |||
1958 | tu->qused--; | 1986 | tu->qused--; |
1959 | spin_unlock_irq(&tu->qlock); | 1987 | spin_unlock_irq(&tu->qlock); |
1960 | 1988 | ||
1989 | mutex_lock(&tu->ioctl_lock); | ||
1961 | if (tu->tread) { | 1990 | if (tu->tread) { |
1962 | if (copy_to_user(buffer, &tu->tqueue[qhead], | 1991 | if (copy_to_user(buffer, &tu->tqueue[qhead], |
1963 | sizeof(struct snd_timer_tread))) | 1992 | sizeof(struct snd_timer_tread))) |
@@ -1967,6 +1996,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, | |||
1967 | sizeof(struct snd_timer_read))) | 1996 | sizeof(struct snd_timer_read))) |
1968 | err = -EFAULT; | 1997 | err = -EFAULT; |
1969 | } | 1998 | } |
1999 | mutex_unlock(&tu->ioctl_lock); | ||
1970 | 2000 | ||
1971 | spin_lock_irq(&tu->qlock); | 2001 | spin_lock_irq(&tu->qlock); |
1972 | if (err < 0) | 2002 | if (err < 0) |
diff --git a/sound/firewire/fireworks/fireworks.h b/sound/firewire/fireworks/fireworks.h index 03ed35237e2b..d73c12b8753d 100644 --- a/sound/firewire/fireworks/fireworks.h +++ b/sound/firewire/fireworks/fireworks.h | |||
@@ -108,7 +108,6 @@ struct snd_efw { | |||
108 | u8 *resp_buf; | 108 | u8 *resp_buf; |
109 | u8 *pull_ptr; | 109 | u8 *pull_ptr; |
110 | u8 *push_ptr; | 110 | u8 *push_ptr; |
111 | unsigned int resp_queues; | ||
112 | }; | 111 | }; |
113 | 112 | ||
114 | int snd_efw_transaction_cmd(struct fw_unit *unit, | 113 | int snd_efw_transaction_cmd(struct fw_unit *unit, |
diff --git a/sound/firewire/fireworks/fireworks_hwdep.c b/sound/firewire/fireworks/fireworks_hwdep.c index 33df8655fe81..2e1d9a23920c 100644 --- a/sound/firewire/fireworks/fireworks_hwdep.c +++ b/sound/firewire/fireworks/fireworks_hwdep.c | |||
@@ -25,6 +25,7 @@ hwdep_read_resp_buf(struct snd_efw *efw, char __user *buf, long remained, | |||
25 | { | 25 | { |
26 | unsigned int length, till_end, type; | 26 | unsigned int length, till_end, type; |
27 | struct snd_efw_transaction *t; | 27 | struct snd_efw_transaction *t; |
28 | u8 *pull_ptr; | ||
28 | long count = 0; | 29 | long count = 0; |
29 | 30 | ||
30 | if (remained < sizeof(type) + sizeof(struct snd_efw_transaction)) | 31 | if (remained < sizeof(type) + sizeof(struct snd_efw_transaction)) |
@@ -38,8 +39,17 @@ hwdep_read_resp_buf(struct snd_efw *efw, char __user *buf, long remained, | |||
38 | buf += sizeof(type); | 39 | buf += sizeof(type); |
39 | 40 | ||
40 | /* write into buffer as many responses as possible */ | 41 | /* write into buffer as many responses as possible */ |
41 | while (efw->resp_queues > 0) { | 42 | spin_lock_irq(&efw->lock); |
42 | t = (struct snd_efw_transaction *)(efw->pull_ptr); | 43 | |
44 | /* | ||
45 | * When another task reaches here during this task's access to user | ||
46 | * space, it picks up current position in buffer and can read the same | ||
47 | * series of responses. | ||
48 | */ | ||
49 | pull_ptr = efw->pull_ptr; | ||
50 | |||
51 | while (efw->push_ptr != pull_ptr) { | ||
52 | t = (struct snd_efw_transaction *)(pull_ptr); | ||
43 | length = be32_to_cpu(t->length) * sizeof(__be32); | 53 | length = be32_to_cpu(t->length) * sizeof(__be32); |
44 | 54 | ||
45 | /* confirm enough space for this response */ | 55 | /* confirm enough space for this response */ |
@@ -49,26 +59,39 @@ hwdep_read_resp_buf(struct snd_efw *efw, char __user *buf, long remained, | |||
49 | /* copy from ring buffer to user buffer */ | 59 | /* copy from ring buffer to user buffer */ |
50 | while (length > 0) { | 60 | while (length > 0) { |
51 | till_end = snd_efw_resp_buf_size - | 61 | till_end = snd_efw_resp_buf_size - |
52 | (unsigned int)(efw->pull_ptr - efw->resp_buf); | 62 | (unsigned int)(pull_ptr - efw->resp_buf); |
53 | till_end = min_t(unsigned int, length, till_end); | 63 | till_end = min_t(unsigned int, length, till_end); |
54 | 64 | ||
55 | if (copy_to_user(buf, efw->pull_ptr, till_end)) | 65 | spin_unlock_irq(&efw->lock); |
66 | |||
67 | if (copy_to_user(buf, pull_ptr, till_end)) | ||
56 | return -EFAULT; | 68 | return -EFAULT; |
57 | 69 | ||
58 | efw->pull_ptr += till_end; | 70 | spin_lock_irq(&efw->lock); |
59 | if (efw->pull_ptr >= efw->resp_buf + | 71 | |
60 | snd_efw_resp_buf_size) | 72 | pull_ptr += till_end; |
61 | efw->pull_ptr -= snd_efw_resp_buf_size; | 73 | if (pull_ptr >= efw->resp_buf + snd_efw_resp_buf_size) |
74 | pull_ptr -= snd_efw_resp_buf_size; | ||
62 | 75 | ||
63 | length -= till_end; | 76 | length -= till_end; |
64 | buf += till_end; | 77 | buf += till_end; |
65 | count += till_end; | 78 | count += till_end; |
66 | remained -= till_end; | 79 | remained -= till_end; |
67 | } | 80 | } |
68 | |||
69 | efw->resp_queues--; | ||
70 | } | 81 | } |
71 | 82 | ||
83 | /* | ||
84 | * All of tasks can read from the buffer nearly simultaneously, but the | ||
85 | * last position for each task is different depending on the length of | ||
86 | * given buffer. Here, for simplicity, a position of buffer is set by | ||
87 | * the latest task. It's better for a listening application to allow one | ||
88 | * thread to read from the buffer. Unless, each task can read different | ||
89 | * sequence of responses depending on variation of buffer length. | ||
90 | */ | ||
91 | efw->pull_ptr = pull_ptr; | ||
92 | |||
93 | spin_unlock_irq(&efw->lock); | ||
94 | |||
72 | return count; | 95 | return count; |
73 | } | 96 | } |
74 | 97 | ||
@@ -76,14 +99,17 @@ static long | |||
76 | hwdep_read_locked(struct snd_efw *efw, char __user *buf, long count, | 99 | hwdep_read_locked(struct snd_efw *efw, char __user *buf, long count, |
77 | loff_t *offset) | 100 | loff_t *offset) |
78 | { | 101 | { |
79 | union snd_firewire_event event; | 102 | union snd_firewire_event event = { |
103 | .lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS, | ||
104 | }; | ||
80 | 105 | ||
81 | memset(&event, 0, sizeof(event)); | 106 | spin_lock_irq(&efw->lock); |
82 | 107 | ||
83 | event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS; | ||
84 | event.lock_status.status = (efw->dev_lock_count > 0); | 108 | event.lock_status.status = (efw->dev_lock_count > 0); |
85 | efw->dev_lock_changed = false; | 109 | efw->dev_lock_changed = false; |
86 | 110 | ||
111 | spin_unlock_irq(&efw->lock); | ||
112 | |||
87 | count = min_t(long, count, sizeof(event.lock_status)); | 113 | count = min_t(long, count, sizeof(event.lock_status)); |
88 | 114 | ||
89 | if (copy_to_user(buf, &event, count)) | 115 | if (copy_to_user(buf, &event, count)) |
@@ -98,10 +124,15 @@ hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count, | |||
98 | { | 124 | { |
99 | struct snd_efw *efw = hwdep->private_data; | 125 | struct snd_efw *efw = hwdep->private_data; |
100 | DEFINE_WAIT(wait); | 126 | DEFINE_WAIT(wait); |
127 | bool dev_lock_changed; | ||
128 | bool queued; | ||
101 | 129 | ||
102 | spin_lock_irq(&efw->lock); | 130 | spin_lock_irq(&efw->lock); |
103 | 131 | ||
104 | while ((!efw->dev_lock_changed) && (efw->resp_queues == 0)) { | 132 | dev_lock_changed = efw->dev_lock_changed; |
133 | queued = efw->push_ptr != efw->pull_ptr; | ||
134 | |||
135 | while (!dev_lock_changed && !queued) { | ||
105 | prepare_to_wait(&efw->hwdep_wait, &wait, TASK_INTERRUPTIBLE); | 136 | prepare_to_wait(&efw->hwdep_wait, &wait, TASK_INTERRUPTIBLE); |
106 | spin_unlock_irq(&efw->lock); | 137 | spin_unlock_irq(&efw->lock); |
107 | schedule(); | 138 | schedule(); |
@@ -109,15 +140,17 @@ hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count, | |||
109 | if (signal_pending(current)) | 140 | if (signal_pending(current)) |
110 | return -ERESTARTSYS; | 141 | return -ERESTARTSYS; |
111 | spin_lock_irq(&efw->lock); | 142 | spin_lock_irq(&efw->lock); |
143 | dev_lock_changed = efw->dev_lock_changed; | ||
144 | queued = efw->push_ptr != efw->pull_ptr; | ||
112 | } | 145 | } |
113 | 146 | ||
114 | if (efw->dev_lock_changed) | 147 | spin_unlock_irq(&efw->lock); |
148 | |||
149 | if (dev_lock_changed) | ||
115 | count = hwdep_read_locked(efw, buf, count, offset); | 150 | count = hwdep_read_locked(efw, buf, count, offset); |
116 | else if (efw->resp_queues > 0) | 151 | else if (queued) |
117 | count = hwdep_read_resp_buf(efw, buf, count, offset); | 152 | count = hwdep_read_resp_buf(efw, buf, count, offset); |
118 | 153 | ||
119 | spin_unlock_irq(&efw->lock); | ||
120 | |||
121 | return count; | 154 | return count; |
122 | } | 155 | } |
123 | 156 | ||
@@ -160,7 +193,7 @@ hwdep_poll(struct snd_hwdep *hwdep, struct file *file, poll_table *wait) | |||
160 | poll_wait(file, &efw->hwdep_wait, wait); | 193 | poll_wait(file, &efw->hwdep_wait, wait); |
161 | 194 | ||
162 | spin_lock_irq(&efw->lock); | 195 | spin_lock_irq(&efw->lock); |
163 | if (efw->dev_lock_changed || (efw->resp_queues > 0)) | 196 | if (efw->dev_lock_changed || efw->pull_ptr != efw->push_ptr) |
164 | events = POLLIN | POLLRDNORM; | 197 | events = POLLIN | POLLRDNORM; |
165 | else | 198 | else |
166 | events = 0; | 199 | events = 0; |
diff --git a/sound/firewire/fireworks/fireworks_proc.c b/sound/firewire/fireworks/fireworks_proc.c index 0639dcb13f7d..beb0a0ffee57 100644 --- a/sound/firewire/fireworks/fireworks_proc.c +++ b/sound/firewire/fireworks/fireworks_proc.c | |||
@@ -188,8 +188,8 @@ proc_read_queues_state(struct snd_info_entry *entry, | |||
188 | else | 188 | else |
189 | consumed = (unsigned int)(efw->push_ptr - efw->pull_ptr); | 189 | consumed = (unsigned int)(efw->push_ptr - efw->pull_ptr); |
190 | 190 | ||
191 | snd_iprintf(buffer, "%d %d/%d\n", | 191 | snd_iprintf(buffer, "%d/%d\n", |
192 | efw->resp_queues, consumed, snd_efw_resp_buf_size); | 192 | consumed, snd_efw_resp_buf_size); |
193 | } | 193 | } |
194 | 194 | ||
195 | static void | 195 | static void |
diff --git a/sound/firewire/fireworks/fireworks_transaction.c b/sound/firewire/fireworks/fireworks_transaction.c index f550808d1784..36a08ba51ec7 100644 --- a/sound/firewire/fireworks/fireworks_transaction.c +++ b/sound/firewire/fireworks/fireworks_transaction.c | |||
@@ -121,11 +121,11 @@ copy_resp_to_buf(struct snd_efw *efw, void *data, size_t length, int *rcode) | |||
121 | size_t capacity, till_end; | 121 | size_t capacity, till_end; |
122 | struct snd_efw_transaction *t; | 122 | struct snd_efw_transaction *t; |
123 | 123 | ||
124 | spin_lock_irq(&efw->lock); | ||
125 | |||
126 | t = (struct snd_efw_transaction *)data; | 124 | t = (struct snd_efw_transaction *)data; |
127 | length = min_t(size_t, be32_to_cpu(t->length) * sizeof(u32), length); | 125 | length = min_t(size_t, be32_to_cpu(t->length) * sizeof(u32), length); |
128 | 126 | ||
127 | spin_lock_irq(&efw->lock); | ||
128 | |||
129 | if (efw->push_ptr < efw->pull_ptr) | 129 | if (efw->push_ptr < efw->pull_ptr) |
130 | capacity = (unsigned int)(efw->pull_ptr - efw->push_ptr); | 130 | capacity = (unsigned int)(efw->pull_ptr - efw->push_ptr); |
131 | else | 131 | else |
@@ -155,7 +155,6 @@ copy_resp_to_buf(struct snd_efw *efw, void *data, size_t length, int *rcode) | |||
155 | } | 155 | } |
156 | 156 | ||
157 | /* for hwdep */ | 157 | /* for hwdep */ |
158 | efw->resp_queues++; | ||
159 | wake_up(&efw->hwdep_wait); | 158 | wake_up(&efw->hwdep_wait); |
160 | 159 | ||
161 | *rcode = RCODE_COMPLETE; | 160 | *rcode = RCODE_COMPLETE; |
diff --git a/sound/firewire/tascam/tascam-hwdep.c b/sound/firewire/tascam/tascam-hwdep.c index 131267c3a042..106406cbfaa3 100644 --- a/sound/firewire/tascam/tascam-hwdep.c +++ b/sound/firewire/tascam/tascam-hwdep.c | |||
@@ -16,31 +16,14 @@ | |||
16 | 16 | ||
17 | #include "tascam.h" | 17 | #include "tascam.h" |
18 | 18 | ||
19 | static long hwdep_read_locked(struct snd_tscm *tscm, char __user *buf, | ||
20 | long count) | ||
21 | { | ||
22 | union snd_firewire_event event; | ||
23 | |||
24 | memset(&event, 0, sizeof(event)); | ||
25 | |||
26 | event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS; | ||
27 | event.lock_status.status = (tscm->dev_lock_count > 0); | ||
28 | tscm->dev_lock_changed = false; | ||
29 | |||
30 | count = min_t(long, count, sizeof(event.lock_status)); | ||
31 | |||
32 | if (copy_to_user(buf, &event, count)) | ||
33 | return -EFAULT; | ||
34 | |||
35 | return count; | ||
36 | } | ||
37 | |||
38 | static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count, | 19 | static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count, |
39 | loff_t *offset) | 20 | loff_t *offset) |
40 | { | 21 | { |
41 | struct snd_tscm *tscm = hwdep->private_data; | 22 | struct snd_tscm *tscm = hwdep->private_data; |
42 | DEFINE_WAIT(wait); | 23 | DEFINE_WAIT(wait); |
43 | union snd_firewire_event event; | 24 | union snd_firewire_event event = { |
25 | .lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS, | ||
26 | }; | ||
44 | 27 | ||
45 | spin_lock_irq(&tscm->lock); | 28 | spin_lock_irq(&tscm->lock); |
46 | 29 | ||
@@ -54,10 +37,16 @@ static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count, | |||
54 | spin_lock_irq(&tscm->lock); | 37 | spin_lock_irq(&tscm->lock); |
55 | } | 38 | } |
56 | 39 | ||
57 | memset(&event, 0, sizeof(event)); | 40 | event.lock_status.status = (tscm->dev_lock_count > 0); |
58 | count = hwdep_read_locked(tscm, buf, count); | 41 | tscm->dev_lock_changed = false; |
42 | |||
59 | spin_unlock_irq(&tscm->lock); | 43 | spin_unlock_irq(&tscm->lock); |
60 | 44 | ||
45 | count = min_t(long, count, sizeof(event.lock_status)); | ||
46 | |||
47 | if (copy_to_user(buf, &event, count)) | ||
48 | return -EFAULT; | ||
49 | |||
61 | return count; | 50 | return count; |
62 | } | 51 | } |
63 | 52 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 7100f05e651a..575cefd8cc4a 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -4855,6 +4855,7 @@ enum { | |||
4855 | ALC221_FIXUP_HP_FRONT_MIC, | 4855 | ALC221_FIXUP_HP_FRONT_MIC, |
4856 | ALC292_FIXUP_TPT460, | 4856 | ALC292_FIXUP_TPT460, |
4857 | ALC298_FIXUP_SPK_VOLUME, | 4857 | ALC298_FIXUP_SPK_VOLUME, |
4858 | ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, | ||
4858 | }; | 4859 | }; |
4859 | 4860 | ||
4860 | static const struct hda_fixup alc269_fixups[] = { | 4861 | static const struct hda_fixup alc269_fixups[] = { |
@@ -5516,6 +5517,15 @@ static const struct hda_fixup alc269_fixups[] = { | |||
5516 | .chained = true, | 5517 | .chained = true, |
5517 | .chain_id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, | 5518 | .chain_id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, |
5518 | }, | 5519 | }, |
5520 | [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = { | ||
5521 | .type = HDA_FIXUP_PINS, | ||
5522 | .v.pins = (const struct hda_pintbl[]) { | ||
5523 | { 0x1b, 0x90170151 }, | ||
5524 | { } | ||
5525 | }, | ||
5526 | .chained = true, | ||
5527 | .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE | ||
5528 | }, | ||
5519 | }; | 5529 | }; |
5520 | 5530 | ||
5521 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | 5531 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
@@ -5560,6 +5570,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
5560 | SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), | 5570 | SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), |
5561 | SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), | 5571 | SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), |
5562 | SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13 9350", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), | 5572 | SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13 9350", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), |
5573 | SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER), | ||
5563 | SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), | 5574 | SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), |
5564 | SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), | 5575 | SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), |
5565 | SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), | 5576 | SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), |
@@ -5895,6 +5906,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | |||
5895 | {0x12, 0x90a60170}, | 5906 | {0x12, 0x90a60170}, |
5896 | {0x14, 0x90170120}, | 5907 | {0x14, 0x90170120}, |
5897 | {0x21, 0x02211030}), | 5908 | {0x21, 0x02211030}), |
5909 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell Inspiron 5468", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
5910 | {0x12, 0x90a60180}, | ||
5911 | {0x14, 0x90170120}, | ||
5912 | {0x21, 0x02211030}), | ||
5898 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | 5913 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
5899 | ALC256_STANDARD_PINS), | 5914 | ALC256_STANDARD_PINS), |
5900 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, | 5915 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, |
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 6cf1f3597455..152292e5ee2b 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c | |||
@@ -1141,6 +1141,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) | |||
1141 | case USB_ID(0x0556, 0x0014): /* Phoenix Audio TMX320VC */ | 1141 | case USB_ID(0x0556, 0x0014): /* Phoenix Audio TMX320VC */ |
1142 | case USB_ID(0x05A3, 0x9420): /* ELP HD USB Camera */ | 1142 | case USB_ID(0x05A3, 0x9420): /* ELP HD USB Camera */ |
1143 | case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */ | 1143 | case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */ |
1144 | case USB_ID(0x1901, 0x0191): /* GE B850V3 CP2114 audio interface */ | ||
1144 | case USB_ID(0x1de7, 0x0013): /* Phoenix Audio MT202exe */ | 1145 | case USB_ID(0x1de7, 0x0013): /* Phoenix Audio MT202exe */ |
1145 | case USB_ID(0x1de7, 0x0014): /* Phoenix Audio TMX320 */ | 1146 | case USB_ID(0x1de7, 0x0014): /* Phoenix Audio TMX320 */ |
1146 | case USB_ID(0x1de7, 0x0114): /* Phoenix Audio MT202pcs */ | 1147 | case USB_ID(0x1de7, 0x0114): /* Phoenix Audio MT202pcs */ |
diff --git a/tools/iio/iio_generic_buffer.c b/tools/iio/iio_generic_buffer.c index 0e8a1f7a292d..f39c0e9c0d5c 100644 --- a/tools/iio/iio_generic_buffer.c +++ b/tools/iio/iio_generic_buffer.c | |||
@@ -348,7 +348,7 @@ int main(int argc, char **argv) | |||
348 | int notrigger = 0; | 348 | int notrigger = 0; |
349 | char *dummy; | 349 | char *dummy; |
350 | 350 | ||
351 | struct iio_channel_info *channels; | 351 | struct iio_channel_info *channels = NULL; |
352 | 352 | ||
353 | register_cleanup(); | 353 | register_cleanup(); |
354 | 354 | ||
@@ -456,7 +456,7 @@ int main(int argc, char **argv) | |||
456 | 456 | ||
457 | if (notrigger) { | 457 | if (notrigger) { |
458 | printf("trigger-less mode selected\n"); | 458 | printf("trigger-less mode selected\n"); |
459 | } if (trig_num >= 0) { | 459 | } else if (trig_num >= 0) { |
460 | char *trig_dev_name; | 460 | char *trig_dev_name; |
461 | ret = asprintf(&trig_dev_name, "%strigger%d", iio_dir, trig_num); | 461 | ret = asprintf(&trig_dev_name, "%strigger%d", iio_dir, trig_num); |
462 | if (ret < 0) { | 462 | if (ret < 0) { |