Annotation of /trunk/kernel-alx/patches-5.4/0129-5.4.30-all-fixes.patch
Parent Directory | Revision Log
Revision 3510 -
(hide annotations)
(download)
Mon May 11 14:36:33 2020 UTC (4 years ago) by niro
File size: 30487 byte(s)
Mon May 11 14:36:33 2020 UTC (4 years ago) by niro
File size: 30487 byte(s)
-linux-5.4.30
1 | niro | 3510 | diff --git a/Makefile b/Makefile |
2 | index 8cb72071a842..e1f41756f475 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,7 +1,7 @@ | ||
6 | # SPDX-License-Identifier: GPL-2.0 | ||
7 | VERSION = 5 | ||
8 | PATCHLEVEL = 4 | ||
9 | -SUBLEVEL = 29 | ||
10 | +SUBLEVEL = 30 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Kleptomaniac Octopus | ||
13 | |||
14 | diff --git a/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts b/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts | ||
15 | index b75af21069f9..4c3f606e5b8d 100644 | ||
16 | --- a/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts | ||
17 | +++ b/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts | ||
18 | @@ -112,6 +112,7 @@ | ||
19 | &sdhci { | ||
20 | #address-cells = <1>; | ||
21 | #size-cells = <0>; | ||
22 | + pinctrl-names = "default"; | ||
23 | pinctrl-0 = <&emmc_gpio34 &gpclk2_gpio43>; | ||
24 | bus-width = <4>; | ||
25 | mmc-pwrseq = <&wifi_pwrseq>; | ||
26 | diff --git a/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi b/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi | ||
27 | index 881cea0b61ba..31fa37d2fe47 100644 | ||
28 | --- a/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi | ||
29 | +++ b/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi | ||
30 | @@ -107,14 +107,14 @@ | ||
31 | regulators { | ||
32 | vdd_arm: buck1 { | ||
33 | regulator-name = "vdd_arm"; | ||
34 | - regulator-min-microvolt = <730000>; | ||
35 | + regulator-min-microvolt = <925000>; | ||
36 | regulator-max-microvolt = <1380000>; | ||
37 | regulator-always-on; | ||
38 | }; | ||
39 | |||
40 | vdd_soc: buck2 { | ||
41 | regulator-name = "vdd_soc"; | ||
42 | - regulator-min-microvolt = <730000>; | ||
43 | + regulator-min-microvolt = <1150000>; | ||
44 | regulator-max-microvolt = <1380000>; | ||
45 | regulator-always-on; | ||
46 | }; | ||
47 | diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts | ||
48 | index 63659880eeb3..7f2ddb78da5f 100644 | ||
49 | --- a/arch/arm/boot/dts/omap3-n900.dts | ||
50 | +++ b/arch/arm/boot/dts/omap3-n900.dts | ||
51 | @@ -849,34 +849,46 @@ | ||
52 | compatible = "ti,omap2-onenand"; | ||
53 | reg = <0 0 0x20000>; /* CS0, offset 0, IO size 128K */ | ||
54 | |||
55 | + /* | ||
56 | + * These timings are based on CONFIG_OMAP_GPMC_DEBUG=y reported | ||
57 | + * bootloader set values when booted with v5.1 | ||
58 | + * (OneNAND Manufacturer: Samsung): | ||
59 | + * | ||
60 | + * cs0 GPMC_CS_CONFIG1: 0xfb001202 | ||
61 | + * cs0 GPMC_CS_CONFIG2: 0x00111100 | ||
62 | + * cs0 GPMC_CS_CONFIG3: 0x00020200 | ||
63 | + * cs0 GPMC_CS_CONFIG4: 0x11001102 | ||
64 | + * cs0 GPMC_CS_CONFIG5: 0x03101616 | ||
65 | + * cs0 GPMC_CS_CONFIG6: 0x90060000 | ||
66 | + */ | ||
67 | gpmc,sync-read; | ||
68 | gpmc,sync-write; | ||
69 | gpmc,burst-length = <16>; | ||
70 | gpmc,burst-read; | ||
71 | gpmc,burst-wrap; | ||
72 | gpmc,burst-write; | ||
73 | - gpmc,device-width = <2>; /* GPMC_DEVWIDTH_16BIT */ | ||
74 | - gpmc,mux-add-data = <2>; /* GPMC_MUX_AD */ | ||
75 | + gpmc,device-width = <2>; | ||
76 | + gpmc,mux-add-data = <2>; | ||
77 | gpmc,cs-on-ns = <0>; | ||
78 | - gpmc,cs-rd-off-ns = <87>; | ||
79 | - gpmc,cs-wr-off-ns = <87>; | ||
80 | + gpmc,cs-rd-off-ns = <102>; | ||
81 | + gpmc,cs-wr-off-ns = <102>; | ||
82 | gpmc,adv-on-ns = <0>; | ||
83 | - gpmc,adv-rd-off-ns = <10>; | ||
84 | - gpmc,adv-wr-off-ns = <10>; | ||
85 | - gpmc,oe-on-ns = <15>; | ||
86 | - gpmc,oe-off-ns = <87>; | ||
87 | + gpmc,adv-rd-off-ns = <12>; | ||
88 | + gpmc,adv-wr-off-ns = <12>; | ||
89 | + gpmc,oe-on-ns = <12>; | ||
90 | + gpmc,oe-off-ns = <102>; | ||
91 | gpmc,we-on-ns = <0>; | ||
92 | - gpmc,we-off-ns = <87>; | ||
93 | - gpmc,rd-cycle-ns = <112>; | ||
94 | - gpmc,wr-cycle-ns = <112>; | ||
95 | - gpmc,access-ns = <81>; | ||
96 | - gpmc,page-burst-access-ns = <15>; | ||
97 | + gpmc,we-off-ns = <102>; | ||
98 | + gpmc,rd-cycle-ns = <132>; | ||
99 | + gpmc,wr-cycle-ns = <132>; | ||
100 | + gpmc,access-ns = <96>; | ||
101 | + gpmc,page-burst-access-ns = <18>; | ||
102 | gpmc,bus-turnaround-ns = <0>; | ||
103 | gpmc,cycle2cycle-delay-ns = <0>; | ||
104 | gpmc,wait-monitoring-ns = <0>; | ||
105 | - gpmc,clk-activation-ns = <5>; | ||
106 | - gpmc,wr-data-mux-bus-ns = <30>; | ||
107 | - gpmc,wr-access-ns = <81>; | ||
108 | + gpmc,clk-activation-ns = <6>; | ||
109 | + gpmc,wr-data-mux-bus-ns = <36>; | ||
110 | + gpmc,wr-access-ns = <96>; | ||
111 | gpmc,sync-clk-ps = <15000>; | ||
112 | |||
113 | /* | ||
114 | diff --git a/arch/arm/boot/dts/ox810se.dtsi b/arch/arm/boot/dts/ox810se.dtsi | ||
115 | index 9f6c2b660ed3..0755e5864c4a 100644 | ||
116 | --- a/arch/arm/boot/dts/ox810se.dtsi | ||
117 | +++ b/arch/arm/boot/dts/ox810se.dtsi | ||
118 | @@ -323,8 +323,8 @@ | ||
119 | interrupt-controller; | ||
120 | reg = <0 0x200>; | ||
121 | #interrupt-cells = <1>; | ||
122 | - valid-mask = <0xFFFFFFFF>; | ||
123 | - clear-mask = <0>; | ||
124 | + valid-mask = <0xffffffff>; | ||
125 | + clear-mask = <0xffffffff>; | ||
126 | }; | ||
127 | |||
128 | timer0: timer@200 { | ||
129 | diff --git a/arch/arm/boot/dts/ox820.dtsi b/arch/arm/boot/dts/ox820.dtsi | ||
130 | index c9b327732063..90846a7655b4 100644 | ||
131 | --- a/arch/arm/boot/dts/ox820.dtsi | ||
132 | +++ b/arch/arm/boot/dts/ox820.dtsi | ||
133 | @@ -240,8 +240,8 @@ | ||
134 | reg = <0 0x200>; | ||
135 | interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>; | ||
136 | #interrupt-cells = <1>; | ||
137 | - valid-mask = <0xFFFFFFFF>; | ||
138 | - clear-mask = <0>; | ||
139 | + valid-mask = <0xffffffff>; | ||
140 | + clear-mask = <0xffffffff>; | ||
141 | }; | ||
142 | |||
143 | timer0: timer@200 { | ||
144 | diff --git a/arch/arm/boot/dts/sun8i-r40.dtsi b/arch/arm/boot/dts/sun8i-r40.dtsi | ||
145 | index c9c2688db66d..80f4dc34df34 100644 | ||
146 | --- a/arch/arm/boot/dts/sun8i-r40.dtsi | ||
147 | +++ b/arch/arm/boot/dts/sun8i-r40.dtsi | ||
148 | @@ -266,6 +266,16 @@ | ||
149 | #phy-cells = <1>; | ||
150 | }; | ||
151 | |||
152 | + ahci: sata@1c18000 { | ||
153 | + compatible = "allwinner,sun8i-r40-ahci"; | ||
154 | + reg = <0x01c18000 0x1000>; | ||
155 | + interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>; | ||
156 | + clocks = <&ccu CLK_BUS_SATA>, <&ccu CLK_SATA>; | ||
157 | + resets = <&ccu RST_BUS_SATA>; | ||
158 | + reset-names = "ahci"; | ||
159 | + status = "disabled"; | ||
160 | + }; | ||
161 | + | ||
162 | ehci1: usb@1c19000 { | ||
163 | compatible = "allwinner,sun8i-r40-ehci", "generic-ehci"; | ||
164 | reg = <0x01c19000 0x100>; | ||
165 | @@ -557,17 +567,6 @@ | ||
166 | #size-cells = <0>; | ||
167 | }; | ||
168 | |||
169 | - ahci: sata@1c18000 { | ||
170 | - compatible = "allwinner,sun8i-r40-ahci"; | ||
171 | - reg = <0x01c18000 0x1000>; | ||
172 | - interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>; | ||
173 | - clocks = <&ccu CLK_BUS_SATA>, <&ccu CLK_SATA>; | ||
174 | - resets = <&ccu RST_BUS_SATA>; | ||
175 | - reset-names = "ahci"; | ||
176 | - status = "disabled"; | ||
177 | - | ||
178 | - }; | ||
179 | - | ||
180 | gmac: ethernet@1c50000 { | ||
181 | compatible = "allwinner,sun8i-r40-gmac"; | ||
182 | syscon = <&ccu>; | ||
183 | diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts b/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts | ||
184 | index 4223a2352d45..dde50c88f5e3 100644 | ||
185 | --- a/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts | ||
186 | +++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts | ||
187 | @@ -119,12 +119,12 @@ | ||
188 | |||
189 | ethernet@e4000 { | ||
190 | phy-handle = <&rgmii_phy1>; | ||
191 | - phy-connection-type = "rgmii-txid"; | ||
192 | + phy-connection-type = "rgmii-id"; | ||
193 | }; | ||
194 | |||
195 | ethernet@e6000 { | ||
196 | phy-handle = <&rgmii_phy2>; | ||
197 | - phy-connection-type = "rgmii-txid"; | ||
198 | + phy-connection-type = "rgmii-id"; | ||
199 | }; | ||
200 | |||
201 | ethernet@e8000 { | ||
202 | diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts b/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts | ||
203 | index 6a6514d0e5a9..274339759114 100644 | ||
204 | --- a/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts | ||
205 | +++ b/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts | ||
206 | @@ -127,12 +127,12 @@ | ||
207 | &fman0 { | ||
208 | ethernet@e4000 { | ||
209 | phy-handle = <&rgmii_phy1>; | ||
210 | - phy-connection-type = "rgmii"; | ||
211 | + phy-connection-type = "rgmii-id"; | ||
212 | }; | ||
213 | |||
214 | ethernet@e6000 { | ||
215 | phy-handle = <&rgmii_phy2>; | ||
216 | - phy-connection-type = "rgmii"; | ||
217 | + phy-connection-type = "rgmii-id"; | ||
218 | }; | ||
219 | |||
220 | ethernet@e8000 { | ||
221 | diff --git a/arch/arm64/include/asm/alternative.h b/arch/arm64/include/asm/alternative.h | ||
222 | index 324e7d5ab37e..5e5dc05d63a0 100644 | ||
223 | --- a/arch/arm64/include/asm/alternative.h | ||
224 | +++ b/arch/arm64/include/asm/alternative.h | ||
225 | @@ -221,7 +221,7 @@ alternative_endif | ||
226 | |||
227 | .macro user_alt, label, oldinstr, newinstr, cond | ||
228 | 9999: alternative_insn "\oldinstr", "\newinstr", \cond | ||
229 | - _ASM_EXTABLE 9999b, \label | ||
230 | + _asm_extable 9999b, \label | ||
231 | .endm | ||
232 | |||
233 | /* | ||
234 | diff --git a/drivers/clk/imx/clk-scu.c b/drivers/clk/imx/clk-scu.c | ||
235 | index fbef740704d0..b8b2072742a5 100644 | ||
236 | --- a/drivers/clk/imx/clk-scu.c | ||
237 | +++ b/drivers/clk/imx/clk-scu.c | ||
238 | @@ -43,12 +43,12 @@ struct imx_sc_msg_req_set_clock_rate { | ||
239 | __le32 rate; | ||
240 | __le16 resource; | ||
241 | u8 clk; | ||
242 | -} __packed; | ||
243 | +} __packed __aligned(4); | ||
244 | |||
245 | struct req_get_clock_rate { | ||
246 | __le16 resource; | ||
247 | u8 clk; | ||
248 | -} __packed; | ||
249 | +} __packed __aligned(4); | ||
250 | |||
251 | struct resp_get_clock_rate { | ||
252 | __le32 rate; | ||
253 | @@ -84,7 +84,7 @@ struct imx_sc_msg_get_clock_parent { | ||
254 | struct req_get_clock_parent { | ||
255 | __le16 resource; | ||
256 | u8 clk; | ||
257 | - } __packed req; | ||
258 | + } __packed __aligned(4) req; | ||
259 | struct resp_get_clock_parent { | ||
260 | u8 parent; | ||
261 | } resp; | ||
262 | @@ -121,7 +121,7 @@ struct imx_sc_msg_req_clock_enable { | ||
263 | u8 clk; | ||
264 | u8 enable; | ||
265 | u8 autog; | ||
266 | -} __packed; | ||
267 | +} __packed __aligned(4); | ||
268 | |||
269 | static inline struct clk_scu *to_clk_scu(struct clk_hw *hw) | ||
270 | { | ||
271 | diff --git a/drivers/clk/ti/clk-43xx.c b/drivers/clk/ti/clk-43xx.c | ||
272 | index 2782d91838ac..2cca1ced913d 100644 | ||
273 | --- a/drivers/clk/ti/clk-43xx.c | ||
274 | +++ b/drivers/clk/ti/clk-43xx.c | ||
275 | @@ -78,7 +78,7 @@ static const struct omap_clkctrl_reg_data am4_gfx_l3_clkctrl_regs[] __initconst | ||
276 | }; | ||
277 | |||
278 | static const struct omap_clkctrl_reg_data am4_l4_rtc_clkctrl_regs[] __initconst = { | ||
279 | - { AM4_L4_RTC_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clk_32768_ck" }, | ||
280 | + { AM4_L4_RTC_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clkdiv32k_ick" }, | ||
281 | { 0 }, | ||
282 | }; | ||
283 | |||
284 | diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c | ||
285 | index a3fb450a9ca8..b2e186047014 100644 | ||
286 | --- a/drivers/gpio/gpiolib-acpi.c | ||
287 | +++ b/drivers/gpio/gpiolib-acpi.c | ||
288 | @@ -1430,6 +1430,21 @@ static const struct dmi_system_id gpiolib_acpi_quirks[] = { | ||
289 | .ignore_wake = "INT33FC:02@28", | ||
290 | }, | ||
291 | }, | ||
292 | + { | ||
293 | + /* | ||
294 | + * HP X2 10 models with Cherry Trail SoC + AXP288 PMIC use an | ||
295 | + * external embedded-controller connected via I2C + an ACPI GPIO | ||
296 | + * event handler on INT33FF:01 pin 0, causing spurious wakeups. | ||
297 | + */ | ||
298 | + .matches = { | ||
299 | + DMI_MATCH(DMI_SYS_VENDOR, "HP"), | ||
300 | + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"), | ||
301 | + DMI_MATCH(DMI_BOARD_NAME, "813E"), | ||
302 | + }, | ||
303 | + .driver_data = &(struct acpi_gpiolib_dmi_quirk) { | ||
304 | + .ignore_wake = "INT33FF:01@0", | ||
305 | + }, | ||
306 | + }, | ||
307 | {} /* Terminating entry */ | ||
308 | }; | ||
309 | |||
310 | diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c | ||
311 | index 58579baf3f7a..45cc840d8e2e 100644 | ||
312 | --- a/drivers/net/ethernet/micrel/ks8851_mll.c | ||
313 | +++ b/drivers/net/ethernet/micrel/ks8851_mll.c | ||
314 | @@ -156,6 +156,50 @@ static int msg_enable; | ||
315 | * chip is busy transferring packet data (RX/TX FIFO accesses). | ||
316 | */ | ||
317 | |||
318 | +/** | ||
319 | + * ks_check_endian - Check whether endianness of the bus is correct | ||
320 | + * @ks : The chip information | ||
321 | + * | ||
322 | + * The KS8851-16MLL EESK pin allows selecting the endianness of the 16bit | ||
323 | + * bus. To maintain optimum performance, the bus endianness should be set | ||
324 | + * such that it matches the endianness of the CPU. | ||
325 | + */ | ||
326 | + | ||
327 | +static int ks_check_endian(struct ks_net *ks) | ||
328 | +{ | ||
329 | + u16 cider; | ||
330 | + | ||
331 | + /* | ||
332 | + * Read CIDER register first, however read it the "wrong" way around. | ||
333 | + * If the endian strap on the KS8851-16MLL in incorrect and the chip | ||
334 | + * is operating in different endianness than the CPU, then the meaning | ||
335 | + * of BE[3:0] byte-enable bits is also swapped such that: | ||
336 | + * BE[3,2,1,0] becomes BE[1,0,3,2] | ||
337 | + * | ||
338 | + * Luckily for us, the byte-enable bits are the top four MSbits of | ||
339 | + * the address register and the CIDER register is at offset 0xc0. | ||
340 | + * Hence, by reading address 0xc0c0, which is not impacted by endian | ||
341 | + * swapping, we assert either BE[3:2] or BE[1:0] while reading the | ||
342 | + * CIDER register. | ||
343 | + * | ||
344 | + * If the bus configuration is correct, reading 0xc0c0 asserts | ||
345 | + * BE[3:2] and this read returns 0x0000, because to read register | ||
346 | + * with bottom two LSbits of address set to 0, BE[1:0] must be | ||
347 | + * asserted. | ||
348 | + * | ||
349 | + * If the bus configuration is NOT correct, reading 0xc0c0 asserts | ||
350 | + * BE[1:0] and this read returns non-zero 0x8872 value. | ||
351 | + */ | ||
352 | + iowrite16(BE3 | BE2 | KS_CIDER, ks->hw_addr_cmd); | ||
353 | + cider = ioread16(ks->hw_addr); | ||
354 | + if (!cider) | ||
355 | + return 0; | ||
356 | + | ||
357 | + netdev_err(ks->netdev, "incorrect EESK endian strap setting\n"); | ||
358 | + | ||
359 | + return -EINVAL; | ||
360 | +} | ||
361 | + | ||
362 | /** | ||
363 | * ks_rdreg16 - read 16 bit register from device | ||
364 | * @ks : The chip information | ||
365 | @@ -166,7 +210,7 @@ static int msg_enable; | ||
366 | |||
367 | static u16 ks_rdreg16(struct ks_net *ks, int offset) | ||
368 | { | ||
369 | - ks->cmd_reg_cache = (u16)offset | ((BE3 | BE2) >> (offset & 0x02)); | ||
370 | + ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02)); | ||
371 | iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); | ||
372 | return ioread16(ks->hw_addr); | ||
373 | } | ||
374 | @@ -181,7 +225,7 @@ static u16 ks_rdreg16(struct ks_net *ks, int offset) | ||
375 | |||
376 | static void ks_wrreg16(struct ks_net *ks, int offset, u16 value) | ||
377 | { | ||
378 | - ks->cmd_reg_cache = (u16)offset | ((BE3 | BE2) >> (offset & 0x02)); | ||
379 | + ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02)); | ||
380 | iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); | ||
381 | iowrite16(value, ks->hw_addr); | ||
382 | } | ||
383 | @@ -197,7 +241,7 @@ static inline void ks_inblk(struct ks_net *ks, u16 *wptr, u32 len) | ||
384 | { | ||
385 | len >>= 1; | ||
386 | while (len--) | ||
387 | - *wptr++ = be16_to_cpu(ioread16(ks->hw_addr)); | ||
388 | + *wptr++ = (u16)ioread16(ks->hw_addr); | ||
389 | } | ||
390 | |||
391 | /** | ||
392 | @@ -211,7 +255,7 @@ static inline void ks_outblk(struct ks_net *ks, u16 *wptr, u32 len) | ||
393 | { | ||
394 | len >>= 1; | ||
395 | while (len--) | ||
396 | - iowrite16(cpu_to_be16(*wptr++), ks->hw_addr); | ||
397 | + iowrite16(*wptr++, ks->hw_addr); | ||
398 | } | ||
399 | |||
400 | static void ks_disable_int(struct ks_net *ks) | ||
401 | @@ -1218,6 +1262,10 @@ static int ks8851_probe(struct platform_device *pdev) | ||
402 | goto err_free; | ||
403 | } | ||
404 | |||
405 | + err = ks_check_endian(ks); | ||
406 | + if (err) | ||
407 | + goto err_free; | ||
408 | + | ||
409 | netdev->irq = platform_get_irq(pdev, 0); | ||
410 | |||
411 | if ((int)netdev->irq < 0) { | ||
412 | diff --git a/drivers/platform/x86/pmc_atom.c b/drivers/platform/x86/pmc_atom.c | ||
413 | index 52ef1419b671..2b1a3a6ee8db 100644 | ||
414 | --- a/drivers/platform/x86/pmc_atom.c | ||
415 | +++ b/drivers/platform/x86/pmc_atom.c | ||
416 | @@ -383,6 +383,14 @@ static const struct dmi_system_id critclk_systems[] = { | ||
417 | DMI_MATCH(DMI_PRODUCT_NAME, "3I380D"), | ||
418 | }, | ||
419 | }, | ||
420 | + { | ||
421 | + /* pmc_plt_clk* - are used for ethernet controllers */ | ||
422 | + .ident = "Lex 2I385SW", | ||
423 | + .matches = { | ||
424 | + DMI_MATCH(DMI_SYS_VENDOR, "Lex BayTrail"), | ||
425 | + DMI_MATCH(DMI_PRODUCT_NAME, "2I385SW"), | ||
426 | + }, | ||
427 | + }, | ||
428 | { | ||
429 | /* pmc_plt_clk* - are used for ethernet controllers */ | ||
430 | .ident = "Beckhoff CB3163", | ||
431 | diff --git a/drivers/tty/serial/sprd_serial.c b/drivers/tty/serial/sprd_serial.c | ||
432 | index 494e2672ebd7..07573de70445 100644 | ||
433 | --- a/drivers/tty/serial/sprd_serial.c | ||
434 | +++ b/drivers/tty/serial/sprd_serial.c | ||
435 | @@ -1103,14 +1103,13 @@ static int sprd_remove(struct platform_device *dev) | ||
436 | if (sup) { | ||
437 | uart_remove_one_port(&sprd_uart_driver, &sup->port); | ||
438 | sprd_port[sup->port.line] = NULL; | ||
439 | + sprd_rx_free_buf(sup); | ||
440 | sprd_ports_num--; | ||
441 | } | ||
442 | |||
443 | if (!sprd_ports_num) | ||
444 | uart_unregister_driver(&sprd_uart_driver); | ||
445 | |||
446 | - sprd_rx_free_buf(sup); | ||
447 | - | ||
448 | return 0; | ||
449 | } | ||
450 | |||
451 | diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c | ||
452 | index d7d2e4b844bc..7556139cd0da 100644 | ||
453 | --- a/drivers/tty/vt/selection.c | ||
454 | +++ b/drivers/tty/vt/selection.c | ||
455 | @@ -88,6 +88,11 @@ void clear_selection(void) | ||
456 | } | ||
457 | EXPORT_SYMBOL_GPL(clear_selection); | ||
458 | |||
459 | +bool vc_is_sel(struct vc_data *vc) | ||
460 | +{ | ||
461 | + return vc == sel_cons; | ||
462 | +} | ||
463 | + | ||
464 | /* | ||
465 | * User settable table: what characters are to be considered alphabetic? | ||
466 | * 128 bits. Locked by the console lock. | ||
467 | diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c | ||
468 | index e9e27ba69d5d..fa9433e6cdc7 100644 | ||
469 | --- a/drivers/tty/vt/vt.c | ||
470 | +++ b/drivers/tty/vt/vt.c | ||
471 | @@ -890,8 +890,9 @@ static void hide_softcursor(struct vc_data *vc) | ||
472 | |||
473 | static void hide_cursor(struct vc_data *vc) | ||
474 | { | ||
475 | - if (vc == sel_cons) | ||
476 | + if (vc_is_sel(vc)) | ||
477 | clear_selection(); | ||
478 | + | ||
479 | vc->vc_sw->con_cursor(vc, CM_ERASE); | ||
480 | hide_softcursor(vc); | ||
481 | } | ||
482 | @@ -901,7 +902,7 @@ static void set_cursor(struct vc_data *vc) | ||
483 | if (!con_is_fg(vc) || console_blanked || vc->vc_mode == KD_GRAPHICS) | ||
484 | return; | ||
485 | if (vc->vc_deccm) { | ||
486 | - if (vc == sel_cons) | ||
487 | + if (vc_is_sel(vc)) | ||
488 | clear_selection(); | ||
489 | add_softcursor(vc); | ||
490 | if ((vc->vc_cursor_type & 0x0f) != 1) | ||
491 | @@ -1074,6 +1075,17 @@ static void visual_deinit(struct vc_data *vc) | ||
492 | module_put(vc->vc_sw->owner); | ||
493 | } | ||
494 | |||
495 | +static void vc_port_destruct(struct tty_port *port) | ||
496 | +{ | ||
497 | + struct vc_data *vc = container_of(port, struct vc_data, port); | ||
498 | + | ||
499 | + kfree(vc); | ||
500 | +} | ||
501 | + | ||
502 | +static const struct tty_port_operations vc_port_ops = { | ||
503 | + .destruct = vc_port_destruct, | ||
504 | +}; | ||
505 | + | ||
506 | int vc_allocate(unsigned int currcons) /* return 0 on success */ | ||
507 | { | ||
508 | struct vt_notifier_param param; | ||
509 | @@ -1099,6 +1111,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ | ||
510 | |||
511 | vc_cons[currcons].d = vc; | ||
512 | tty_port_init(&vc->port); | ||
513 | + vc->port.ops = &vc_port_ops; | ||
514 | INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK); | ||
515 | |||
516 | visual_init(vc, currcons, 1); | ||
517 | @@ -1207,7 +1220,7 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc, | ||
518 | } | ||
519 | } | ||
520 | |||
521 | - if (vc == sel_cons) | ||
522 | + if (vc_is_sel(vc)) | ||
523 | clear_selection(); | ||
524 | |||
525 | old_rows = vc->vc_rows; | ||
526 | @@ -3253,6 +3266,7 @@ static int con_install(struct tty_driver *driver, struct tty_struct *tty) | ||
527 | |||
528 | tty->driver_data = vc; | ||
529 | vc->port.tty = tty; | ||
530 | + tty_port_get(&vc->port); | ||
531 | |||
532 | if (!tty->winsize.ws_row && !tty->winsize.ws_col) { | ||
533 | tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; | ||
534 | @@ -3288,6 +3302,13 @@ static void con_shutdown(struct tty_struct *tty) | ||
535 | console_unlock(); | ||
536 | } | ||
537 | |||
538 | +static void con_cleanup(struct tty_struct *tty) | ||
539 | +{ | ||
540 | + struct vc_data *vc = tty->driver_data; | ||
541 | + | ||
542 | + tty_port_put(&vc->port); | ||
543 | +} | ||
544 | + | ||
545 | static int default_color = 7; /* white */ | ||
546 | static int default_italic_color = 2; // green (ASCII) | ||
547 | static int default_underline_color = 3; // cyan (ASCII) | ||
548 | @@ -3412,7 +3433,8 @@ static const struct tty_operations con_ops = { | ||
549 | .throttle = con_throttle, | ||
550 | .unthrottle = con_unthrottle, | ||
551 | .resize = vt_resize, | ||
552 | - .shutdown = con_shutdown | ||
553 | + .shutdown = con_shutdown, | ||
554 | + .cleanup = con_cleanup, | ||
555 | }; | ||
556 | |||
557 | static struct cdev vc0_cdev; | ||
558 | diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c | ||
559 | index ee6c91ef1f6c..daf61c28ba76 100644 | ||
560 | --- a/drivers/tty/vt/vt_ioctl.c | ||
561 | +++ b/drivers/tty/vt/vt_ioctl.c | ||
562 | @@ -39,11 +39,32 @@ | ||
563 | #include <linux/kbd_diacr.h> | ||
564 | #include <linux/selection.h> | ||
565 | |||
566 | -char vt_dont_switch; | ||
567 | -extern struct tty_driver *console_driver; | ||
568 | +bool vt_dont_switch; | ||
569 | |||
570 | -#define VT_IS_IN_USE(i) (console_driver->ttys[i] && console_driver->ttys[i]->count) | ||
571 | -#define VT_BUSY(i) (VT_IS_IN_USE(i) || i == fg_console || vc_cons[i].d == sel_cons) | ||
572 | +static inline bool vt_in_use(unsigned int i) | ||
573 | +{ | ||
574 | + const struct vc_data *vc = vc_cons[i].d; | ||
575 | + | ||
576 | + /* | ||
577 | + * console_lock must be held to prevent the vc from being deallocated | ||
578 | + * while we're checking whether it's in-use. | ||
579 | + */ | ||
580 | + WARN_CONSOLE_UNLOCKED(); | ||
581 | + | ||
582 | + return vc && kref_read(&vc->port.kref) > 1; | ||
583 | +} | ||
584 | + | ||
585 | +static inline bool vt_busy(int i) | ||
586 | +{ | ||
587 | + if (vt_in_use(i)) | ||
588 | + return true; | ||
589 | + if (i == fg_console) | ||
590 | + return true; | ||
591 | + if (vc_is_sel(vc_cons[i].d)) | ||
592 | + return true; | ||
593 | + | ||
594 | + return false; | ||
595 | +} | ||
596 | |||
597 | /* | ||
598 | * Console (vt and kd) routines, as defined by USL SVR4 manual, and by | ||
599 | @@ -289,16 +310,14 @@ static int vt_disallocate(unsigned int vc_num) | ||
600 | int ret = 0; | ||
601 | |||
602 | console_lock(); | ||
603 | - if (VT_BUSY(vc_num)) | ||
604 | + if (vt_busy(vc_num)) | ||
605 | ret = -EBUSY; | ||
606 | else if (vc_num) | ||
607 | vc = vc_deallocate(vc_num); | ||
608 | console_unlock(); | ||
609 | |||
610 | - if (vc && vc_num >= MIN_NR_CONSOLES) { | ||
611 | - tty_port_destroy(&vc->port); | ||
612 | - kfree(vc); | ||
613 | - } | ||
614 | + if (vc && vc_num >= MIN_NR_CONSOLES) | ||
615 | + tty_port_put(&vc->port); | ||
616 | |||
617 | return ret; | ||
618 | } | ||
619 | @@ -311,17 +330,15 @@ static void vt_disallocate_all(void) | ||
620 | |||
621 | console_lock(); | ||
622 | for (i = 1; i < MAX_NR_CONSOLES; i++) | ||
623 | - if (!VT_BUSY(i)) | ||
624 | + if (!vt_busy(i)) | ||
625 | vc[i] = vc_deallocate(i); | ||
626 | else | ||
627 | vc[i] = NULL; | ||
628 | console_unlock(); | ||
629 | |||
630 | for (i = 1; i < MAX_NR_CONSOLES; i++) { | ||
631 | - if (vc[i] && i >= MIN_NR_CONSOLES) { | ||
632 | - tty_port_destroy(&vc[i]->port); | ||
633 | - kfree(vc[i]); | ||
634 | - } | ||
635 | + if (vc[i] && i >= MIN_NR_CONSOLES) | ||
636 | + tty_port_put(&vc[i]->port); | ||
637 | } | ||
638 | } | ||
639 | |||
640 | @@ -335,22 +352,13 @@ int vt_ioctl(struct tty_struct *tty, | ||
641 | { | ||
642 | struct vc_data *vc = tty->driver_data; | ||
643 | struct console_font_op op; /* used in multiple places here */ | ||
644 | - unsigned int console; | ||
645 | + unsigned int console = vc->vc_num; | ||
646 | unsigned char ucval; | ||
647 | unsigned int uival; | ||
648 | void __user *up = (void __user *)arg; | ||
649 | int i, perm; | ||
650 | int ret = 0; | ||
651 | |||
652 | - console = vc->vc_num; | ||
653 | - | ||
654 | - | ||
655 | - if (!vc_cons_allocated(console)) { /* impossible? */ | ||
656 | - ret = -ENOIOCTLCMD; | ||
657 | - goto out; | ||
658 | - } | ||
659 | - | ||
660 | - | ||
661 | /* | ||
662 | * To have permissions to do most of the vt ioctls, we either have | ||
663 | * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG. | ||
664 | @@ -641,15 +649,16 @@ int vt_ioctl(struct tty_struct *tty, | ||
665 | struct vt_stat __user *vtstat = up; | ||
666 | unsigned short state, mask; | ||
667 | |||
668 | - /* Review: FIXME: Console lock ? */ | ||
669 | if (put_user(fg_console + 1, &vtstat->v_active)) | ||
670 | ret = -EFAULT; | ||
671 | else { | ||
672 | state = 1; /* /dev/tty0 is always open */ | ||
673 | + console_lock(); /* required by vt_in_use() */ | ||
674 | for (i = 0, mask = 2; i < MAX_NR_CONSOLES && mask; | ||
675 | ++i, mask <<= 1) | ||
676 | - if (VT_IS_IN_USE(i)) | ||
677 | + if (vt_in_use(i)) | ||
678 | state |= mask; | ||
679 | + console_unlock(); | ||
680 | ret = put_user(state, &vtstat->v_state); | ||
681 | } | ||
682 | break; | ||
683 | @@ -659,10 +668,11 @@ int vt_ioctl(struct tty_struct *tty, | ||
684 | * Returns the first available (non-opened) console. | ||
685 | */ | ||
686 | case VT_OPENQRY: | ||
687 | - /* FIXME: locking ? - but then this is a stupid API */ | ||
688 | + console_lock(); /* required by vt_in_use() */ | ||
689 | for (i = 0; i < MAX_NR_CONSOLES; ++i) | ||
690 | - if (! VT_IS_IN_USE(i)) | ||
691 | + if (!vt_in_use(i)) | ||
692 | break; | ||
693 | + console_unlock(); | ||
694 | uival = i < MAX_NR_CONSOLES ? (i+1) : -1; | ||
695 | goto setint; | ||
696 | |||
697 | @@ -1011,12 +1021,12 @@ int vt_ioctl(struct tty_struct *tty, | ||
698 | case VT_LOCKSWITCH: | ||
699 | if (!capable(CAP_SYS_TTY_CONFIG)) | ||
700 | return -EPERM; | ||
701 | - vt_dont_switch = 1; | ||
702 | + vt_dont_switch = true; | ||
703 | break; | ||
704 | case VT_UNLOCKSWITCH: | ||
705 | if (!capable(CAP_SYS_TTY_CONFIG)) | ||
706 | return -EPERM; | ||
707 | - vt_dont_switch = 0; | ||
708 | + vt_dont_switch = false; | ||
709 | break; | ||
710 | case VT_GETHIFONTMASK: | ||
711 | ret = put_user(vc->vc_hi_font_mask, | ||
712 | @@ -1180,14 +1190,9 @@ long vt_compat_ioctl(struct tty_struct *tty, | ||
713 | { | ||
714 | struct vc_data *vc = tty->driver_data; | ||
715 | struct console_font_op op; /* used in multiple places here */ | ||
716 | - unsigned int console = vc->vc_num; | ||
717 | void __user *up = compat_ptr(arg); | ||
718 | int perm; | ||
719 | |||
720 | - | ||
721 | - if (!vc_cons_allocated(console)) /* impossible? */ | ||
722 | - return -ENOIOCTLCMD; | ||
723 | - | ||
724 | /* | ||
725 | * To have permissions to do most of the vt ioctls, we either have | ||
726 | * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG. | ||
727 | diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h | ||
728 | index c4458dc6a757..76371aaae2d1 100644 | ||
729 | --- a/include/linux/ceph/messenger.h | ||
730 | +++ b/include/linux/ceph/messenger.h | ||
731 | @@ -175,9 +175,10 @@ struct ceph_msg_data { | ||
732 | #endif /* CONFIG_BLOCK */ | ||
733 | struct ceph_bvec_iter bvec_pos; | ||
734 | struct { | ||
735 | - struct page **pages; /* NOT OWNER. */ | ||
736 | + struct page **pages; | ||
737 | size_t length; /* total # bytes */ | ||
738 | unsigned int alignment; /* first page */ | ||
739 | + bool own_pages; | ||
740 | }; | ||
741 | struct ceph_pagelist *pagelist; | ||
742 | }; | ||
743 | @@ -356,8 +357,8 @@ extern void ceph_con_keepalive(struct ceph_connection *con); | ||
744 | extern bool ceph_con_keepalive_expired(struct ceph_connection *con, | ||
745 | unsigned long interval); | ||
746 | |||
747 | -extern void ceph_msg_data_add_pages(struct ceph_msg *msg, struct page **pages, | ||
748 | - size_t length, size_t alignment); | ||
749 | +void ceph_msg_data_add_pages(struct ceph_msg *msg, struct page **pages, | ||
750 | + size_t length, size_t alignment, bool own_pages); | ||
751 | extern void ceph_msg_data_add_pagelist(struct ceph_msg *msg, | ||
752 | struct ceph_pagelist *pagelist); | ||
753 | #ifdef CONFIG_BLOCK | ||
754 | diff --git a/include/linux/selection.h b/include/linux/selection.h | ||
755 | index e2c1f96bf059..5b890ef5b59f 100644 | ||
756 | --- a/include/linux/selection.h | ||
757 | +++ b/include/linux/selection.h | ||
758 | @@ -11,8 +11,8 @@ | ||
759 | #include <linux/tiocl.h> | ||
760 | #include <linux/vt_buffer.h> | ||
761 | |||
762 | -extern struct vc_data *sel_cons; | ||
763 | struct tty_struct; | ||
764 | +struct vc_data; | ||
765 | |||
766 | extern void clear_selection(void); | ||
767 | extern int set_selection_user(const struct tiocl_selection __user *sel, | ||
768 | @@ -24,6 +24,8 @@ extern int sel_loadlut(char __user *p); | ||
769 | extern int mouse_reporting(void); | ||
770 | extern void mouse_report(struct tty_struct * tty, int butt, int mrx, int mry); | ||
771 | |||
772 | +bool vc_is_sel(struct vc_data *vc); | ||
773 | + | ||
774 | extern int console_blanked; | ||
775 | |||
776 | extern const unsigned char color_table[]; | ||
777 | diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h | ||
778 | index 8dc77e40bc03..ded5c48598f3 100644 | ||
779 | --- a/include/linux/vt_kern.h | ||
780 | +++ b/include/linux/vt_kern.h | ||
781 | @@ -135,7 +135,7 @@ extern int do_unbind_con_driver(const struct consw *csw, int first, int last, | ||
782 | int deflt); | ||
783 | int vty_init(const struct file_operations *console_fops); | ||
784 | |||
785 | -extern char vt_dont_switch; | ||
786 | +extern bool vt_dont_switch; | ||
787 | extern int default_utf8; | ||
788 | extern int global_cursor_default; | ||
789 | |||
790 | diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c | ||
791 | index b774e2210f7d..b03087f110eb 100644 | ||
792 | --- a/kernel/bpf/btf.c | ||
793 | +++ b/kernel/bpf/btf.c | ||
794 | @@ -3460,7 +3460,7 @@ int btf_get_info_by_fd(const struct btf *btf, | ||
795 | union bpf_attr __user *uattr) | ||
796 | { | ||
797 | struct bpf_btf_info __user *uinfo; | ||
798 | - struct bpf_btf_info info = {}; | ||
799 | + struct bpf_btf_info info; | ||
800 | u32 info_copy, btf_copy; | ||
801 | void __user *ubtf; | ||
802 | u32 uinfo_len; | ||
803 | @@ -3469,6 +3469,7 @@ int btf_get_info_by_fd(const struct btf *btf, | ||
804 | uinfo_len = attr->info.info_len; | ||
805 | |||
806 | info_copy = min_t(u32, uinfo_len, sizeof(info)); | ||
807 | + memset(&info, 0, sizeof(info)); | ||
808 | if (copy_from_user(&info, uinfo, info_copy)) | ||
809 | return -EFAULT; | ||
810 | |||
811 | diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c | ||
812 | index ace1cfaa24b6..14f4a76b44d5 100644 | ||
813 | --- a/kernel/bpf/syscall.c | ||
814 | +++ b/kernel/bpf/syscall.c | ||
815 | @@ -2325,7 +2325,7 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog, | ||
816 | union bpf_attr __user *uattr) | ||
817 | { | ||
818 | struct bpf_prog_info __user *uinfo = u64_to_user_ptr(attr->info.info); | ||
819 | - struct bpf_prog_info info = {}; | ||
820 | + struct bpf_prog_info info; | ||
821 | u32 info_len = attr->info.info_len; | ||
822 | struct bpf_prog_stats stats; | ||
823 | char __user *uinsns; | ||
824 | @@ -2337,6 +2337,7 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog, | ||
825 | return err; | ||
826 | info_len = min_t(u32, sizeof(info), info_len); | ||
827 | |||
828 | + memset(&info, 0, sizeof(info)); | ||
829 | if (copy_from_user(&info, uinfo, info_len)) | ||
830 | return -EFAULT; | ||
831 | |||
832 | @@ -2600,7 +2601,7 @@ static int bpf_map_get_info_by_fd(struct bpf_map *map, | ||
833 | union bpf_attr __user *uattr) | ||
834 | { | ||
835 | struct bpf_map_info __user *uinfo = u64_to_user_ptr(attr->info.info); | ||
836 | - struct bpf_map_info info = {}; | ||
837 | + struct bpf_map_info info; | ||
838 | u32 info_len = attr->info.info_len; | ||
839 | int err; | ||
840 | |||
841 | @@ -2609,6 +2610,7 @@ static int bpf_map_get_info_by_fd(struct bpf_map *map, | ||
842 | return err; | ||
843 | info_len = min_t(u32, sizeof(info), info_len); | ||
844 | |||
845 | + memset(&info, 0, sizeof(info)); | ||
846 | info.type = map->map_type; | ||
847 | info.id = map->id; | ||
848 | info.key_size = map->key_size; | ||
849 | @@ -2836,7 +2838,7 @@ out: | ||
850 | |||
851 | SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, size) | ||
852 | { | ||
853 | - union bpf_attr attr = {}; | ||
854 | + union bpf_attr attr; | ||
855 | int err; | ||
856 | |||
857 | if (sysctl_unprivileged_bpf_disabled && !capable(CAP_SYS_ADMIN)) | ||
858 | @@ -2848,6 +2850,7 @@ SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, siz | ||
859 | size = min_t(u32, size, sizeof(attr)); | ||
860 | |||
861 | /* copy attributes from user space, may be less than sizeof(bpf_attr) */ | ||
862 | + memset(&attr, 0, sizeof(attr)); | ||
863 | if (copy_from_user(&attr, uattr, size) != 0) | ||
864 | return -EFAULT; | ||
865 | |||
866 | diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c | ||
867 | index e4cb3db2ee77..3d2e9f944e0f 100644 | ||
868 | --- a/net/ceph/messenger.c | ||
869 | +++ b/net/ceph/messenger.c | ||
870 | @@ -3250,12 +3250,16 @@ static struct ceph_msg_data *ceph_msg_data_add(struct ceph_msg *msg) | ||
871 | |||
872 | static void ceph_msg_data_destroy(struct ceph_msg_data *data) | ||
873 | { | ||
874 | - if (data->type == CEPH_MSG_DATA_PAGELIST) | ||
875 | + if (data->type == CEPH_MSG_DATA_PAGES && data->own_pages) { | ||
876 | + int num_pages = calc_pages_for(data->alignment, data->length); | ||
877 | + ceph_release_page_vector(data->pages, num_pages); | ||
878 | + } else if (data->type == CEPH_MSG_DATA_PAGELIST) { | ||
879 | ceph_pagelist_release(data->pagelist); | ||
880 | + } | ||
881 | } | ||
882 | |||
883 | void ceph_msg_data_add_pages(struct ceph_msg *msg, struct page **pages, | ||
884 | - size_t length, size_t alignment) | ||
885 | + size_t length, size_t alignment, bool own_pages) | ||
886 | { | ||
887 | struct ceph_msg_data *data; | ||
888 | |||
889 | @@ -3267,6 +3271,7 @@ void ceph_msg_data_add_pages(struct ceph_msg *msg, struct page **pages, | ||
890 | data->pages = pages; | ||
891 | data->length = length; | ||
892 | data->alignment = alignment & ~PAGE_MASK; | ||
893 | + data->own_pages = own_pages; | ||
894 | |||
895 | msg->data_length += length; | ||
896 | } | ||
897 | diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c | ||
898 | index ba45b074a362..2352afa62d1f 100644 | ||
899 | --- a/net/ceph/osd_client.c | ||
900 | +++ b/net/ceph/osd_client.c | ||
901 | @@ -962,7 +962,7 @@ static void ceph_osdc_msg_data_add(struct ceph_msg *msg, | ||
902 | BUG_ON(length > (u64) SIZE_MAX); | ||
903 | if (length) | ||
904 | ceph_msg_data_add_pages(msg, osd_data->pages, | ||
905 | - length, osd_data->alignment); | ||
906 | + length, osd_data->alignment, false); | ||
907 | } else if (osd_data->type == CEPH_OSD_DATA_TYPE_PAGELIST) { | ||
908 | BUG_ON(!length); | ||
909 | ceph_msg_data_add_pagelist(msg, osd_data->pagelist); | ||
910 | @@ -4436,9 +4436,7 @@ static void handle_watch_notify(struct ceph_osd_client *osdc, | ||
911 | CEPH_MSG_DATA_PAGES); | ||
912 | *lreq->preply_pages = data->pages; | ||
913 | *lreq->preply_len = data->length; | ||
914 | - } else { | ||
915 | - ceph_release_page_vector(data->pages, | ||
916 | - calc_pages_for(0, data->length)); | ||
917 | + data->own_pages = false; | ||
918 | } | ||
919 | } | ||
920 | lreq->notify_finish_error = return_code; | ||
921 | @@ -5500,9 +5498,6 @@ out_unlock_osdc: | ||
922 | return m; | ||
923 | } | ||
924 | |||
925 | -/* | ||
926 | - * TODO: switch to a msg-owned pagelist | ||
927 | - */ | ||
928 | static struct ceph_msg *alloc_msg_with_page_vector(struct ceph_msg_header *hdr) | ||
929 | { | ||
930 | struct ceph_msg *m; | ||
931 | @@ -5516,7 +5511,6 @@ static struct ceph_msg *alloc_msg_with_page_vector(struct ceph_msg_header *hdr) | ||
932 | |||
933 | if (data_len) { | ||
934 | struct page **pages; | ||
935 | - struct ceph_osd_data osd_data; | ||
936 | |||
937 | pages = ceph_alloc_page_vector(calc_pages_for(0, data_len), | ||
938 | GFP_NOIO); | ||
939 | @@ -5525,9 +5519,7 @@ static struct ceph_msg *alloc_msg_with_page_vector(struct ceph_msg_header *hdr) | ||
940 | return NULL; | ||
941 | } | ||
942 | |||
943 | - ceph_osd_data_pages_init(&osd_data, pages, data_len, 0, false, | ||
944 | - false); | ||
945 | - ceph_osdc_msg_data_add(m, &osd_data); | ||
946 | + ceph_msg_data_add_pages(m, pages, data_len, 0, true); | ||
947 | } | ||
948 | |||
949 | return m; | ||
950 | diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c | ||
951 | index c8fc29f0efcf..41da41cb5c40 100644 | ||
952 | --- a/net/mac80211/tx.c | ||
953 | +++ b/net/mac80211/tx.c | ||
954 | @@ -3596,8 +3596,26 @@ begin: | ||
955 | tx.skb = skb; | ||
956 | tx.sdata = vif_to_sdata(info->control.vif); | ||
957 | |||
958 | - if (txq->sta) | ||
959 | + if (txq->sta) { | ||
960 | tx.sta = container_of(txq->sta, struct sta_info, sta); | ||
961 | + /* | ||
962 | + * Drop unicast frames to unauthorised stations unless they are | ||
963 | + * EAPOL frames from the local station. | ||
964 | + */ | ||
965 | + if (unlikely(ieee80211_is_data(hdr->frame_control) && | ||
966 | + !ieee80211_vif_is_mesh(&tx.sdata->vif) && | ||
967 | + tx.sdata->vif.type != NL80211_IFTYPE_OCB && | ||
968 | + !is_multicast_ether_addr(hdr->addr1) && | ||
969 | + !test_sta_flag(tx.sta, WLAN_STA_AUTHORIZED) && | ||
970 | + (!(info->control.flags & | ||
971 | + IEEE80211_TX_CTRL_PORT_CTRL_PROTO) || | ||
972 | + !ether_addr_equal(tx.sdata->vif.addr, | ||
973 | + hdr->addr2)))) { | ||
974 | + I802_DEBUG_INC(local->tx_handlers_drop_unauth_port); | ||
975 | + ieee80211_free_txskb(&local->hw, skb); | ||
976 | + goto begin; | ||
977 | + } | ||
978 | + } | ||
979 | |||
980 | /* | ||
981 | * The key can be removed while the packet was queued, so need to call | ||
982 | diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c | ||
983 | index eec9b282c047..4b07b1cc22dc 100644 | ||
984 | --- a/tools/perf/util/map.c | ||
985 | +++ b/tools/perf/util/map.c | ||
986 | @@ -90,7 +90,7 @@ static inline bool replace_android_lib(const char *filename, char *newfilename) | ||
987 | return true; | ||
988 | } | ||
989 | |||
990 | - if (!strncmp(filename, "/system/lib/", 11)) { | ||
991 | + if (!strncmp(filename, "/system/lib/", 12)) { | ||
992 | char *ndk, *app; | ||
993 | const char *arch; | ||
994 | size_t ndk_length; |