Gentoo Archives: gentoo-commits

From: Mike Pagano <mpagano@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/linux-patches:4.19 commit in: /
Date: Wed, 23 Feb 2022 12:39:15
Message-Id: 1645619921.cf18885d021c12b4fccd6e06066a5b3d7e3adeef.mpagano@gentoo
1 commit: cf18885d021c12b4fccd6e06066a5b3d7e3adeef
2 Author: Mike Pagano <mpagano <AT> gentoo <DOT> org>
3 AuthorDate: Wed Feb 23 12:38:41 2022 +0000
4 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org>
5 CommitDate: Wed Feb 23 12:38:41 2022 +0000
6 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=cf18885d
7
8 Linux patch 4.19.231
9
10 Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>
11
12 0000_README | 4 +
13 1230_linux-4.19.231.patch | 2055 +++++++++++++++++++++++++++++++++++++++++++++
14 2 files changed, 2059 insertions(+)
15
16 diff --git a/0000_README b/0000_README
17 index 30a2e032..67a0a028 100644
18 --- a/0000_README
19 +++ b/0000_README
20 @@ -959,6 +959,10 @@ Patch: 1229_linux-4.19.230.patch
21 From: https://www.kernel.org
22 Desc: Linux 4.19.230
23
24 +Patch: 1230_linux-4.19.231.patch
25 +From: https://www.kernel.org
26 +Desc: Linux 4.19.231
27 +
28 Patch: 1500_XATTR_USER_PREFIX.patch
29 From: https://bugs.gentoo.org/show_bug.cgi?id=470644
30 Desc: Support for namespace user.pax.* on tmpfs.
31
32 diff --git a/1230_linux-4.19.231.patch b/1230_linux-4.19.231.patch
33 new file mode 100644
34 index 00000000..4f497003
35 --- /dev/null
36 +++ b/1230_linux-4.19.231.patch
37 @@ -0,0 +1,2055 @@
38 +diff --git a/Documentation/ABI/stable/sysfs-bus-vmbus b/Documentation/ABI/stable/sysfs-bus-vmbus
39 +index 3fed8fdb873d7..c4ffdfc324b41 100644
40 +--- a/Documentation/ABI/stable/sysfs-bus-vmbus
41 ++++ b/Documentation/ABI/stable/sysfs-bus-vmbus
42 +@@ -81,7 +81,9 @@ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/latency
43 + Date: September. 2017
44 + KernelVersion: 4.14
45 + Contact: Stephen Hemminger <sthemmin@×××××××××.com>
46 +-Description: Channel signaling latency
47 ++Description: Channel signaling latency. This file is available only for
48 ++ performance critical channels (storage, network, etc.) that use
49 ++ the monitor page mechanism.
50 + Users: Debugging tools
51 +
52 + What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/out_mask
53 +@@ -95,7 +97,9 @@ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/pending
54 + Date: September. 2017
55 + KernelVersion: 4.14
56 + Contact: Stephen Hemminger <sthemmin@×××××××××.com>
57 +-Description: Channel interrupt pending state
58 ++Description: Channel interrupt pending state. This file is available only for
59 ++ performance critical channels (storage, network, etc.) that use
60 ++ the monitor page mechanism.
61 + Users: Debugging tools
62 +
63 + What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/read_avail
64 +@@ -137,7 +141,9 @@ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/monitor_id
65 + Date: January. 2018
66 + KernelVersion: 4.16
67 + Contact: Stephen Hemminger <sthemmin@×××××××××.com>
68 +-Description: Monitor bit associated with channel
69 ++Description: Monitor bit associated with channel. This file is available only
70 ++ for performance critical channels (storage, network, etc.) that
71 ++ use the monitor page mechanism.
72 + Users: Debugging tools and userspace drivers
73 +
74 + What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/ring
75 +diff --git a/Makefile b/Makefile
76 +index 1a19d5d8840ff..165660cd857e1 100644
77 +--- a/Makefile
78 ++++ b/Makefile
79 +@@ -1,7 +1,7 @@
80 + # SPDX-License-Identifier: GPL-2.0
81 + VERSION = 4
82 + PATCHLEVEL = 19
83 +-SUBLEVEL = 230
84 ++SUBLEVEL = 231
85 + EXTRAVERSION =
86 + NAME = "People's Front"
87 +
88 +diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
89 +index a8269f0a87ced..47c55351df033 100644
90 +--- a/arch/arm/mach-omap2/omap_hwmod.c
91 ++++ b/arch/arm/mach-omap2/omap_hwmod.c
92 +@@ -754,8 +754,10 @@ static int __init _init_clkctrl_providers(void)
93 +
94 + for_each_matching_node(np, ti_clkctrl_match_table) {
95 + ret = _setup_clkctrl_provider(np);
96 +- if (ret)
97 ++ if (ret) {
98 ++ of_node_put(np);
99 + break;
100 ++ }
101 + }
102 +
103 + return ret;
104 +diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
105 +index b8dc4dbb391b6..4252119bfd901 100644
106 +--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
107 ++++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
108 +@@ -41,6 +41,12 @@
109 + no-map;
110 + };
111 +
112 ++ /* 32 MiB reserved for ARM Trusted Firmware (BL32) */
113 ++ secmon_reserved_bl32: secmon@5300000 {
114 ++ reg = <0x0 0x05300000 0x0 0x2000000>;
115 ++ no-map;
116 ++ };
117 ++
118 + linux,cma {
119 + compatible = "shared-dma-pool";
120 + reusable;
121 +diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
122 +index d81568f783e5c..e87ae0dabce12 100644
123 +--- a/arch/powerpc/lib/sstep.c
124 ++++ b/arch/powerpc/lib/sstep.c
125 +@@ -2681,12 +2681,14 @@ void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op)
126 + case BARRIER_EIEIO:
127 + eieio();
128 + break;
129 ++#ifdef CONFIG_PPC64
130 + case BARRIER_LWSYNC:
131 + asm volatile("lwsync" : : : "memory");
132 + break;
133 + case BARRIER_PTESYNC:
134 + asm volatile("ptesync" : : : "memory");
135 + break;
136 ++#endif
137 + }
138 + break;
139 +
140 +diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c
141 +index acc8d217f6565..ad3d39c00d7fc 100644
142 +--- a/arch/x86/kvm/pmu.c
143 ++++ b/arch/x86/kvm/pmu.c
144 +@@ -171,7 +171,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel)
145 + }
146 +
147 + if (type == PERF_TYPE_RAW)
148 +- config = eventsel & X86_RAW_EVENT_MASK;
149 ++ config = eventsel & AMD64_RAW_EVENT_MASK;
150 +
151 + pmc_reprogram_counter(pmc, type, config,
152 + !(eventsel & ARCH_PERFMON_EVENTSEL_USR),
153 +diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
154 +index c2529dfda3e53..11686e7684016 100644
155 +--- a/block/bfq-iosched.c
156 ++++ b/block/bfq-iosched.c
157 +@@ -5417,6 +5417,8 @@ static void bfq_exit_queue(struct elevator_queue *e)
158 + spin_unlock_irq(&bfqd->lock);
159 + #endif
160 +
161 ++ wbt_enable_default(bfqd->queue);
162 ++
163 + kfree(bfqd);
164 + }
165 +
166 +diff --git a/block/elevator.c b/block/elevator.c
167 +index 5b51bc5fad9fe..72ce7a4a2632e 100644
168 +--- a/block/elevator.c
169 ++++ b/block/elevator.c
170 +@@ -877,8 +877,6 @@ void elv_unregister_queue(struct request_queue *q)
171 + kobject_del(&e->kobj);
172 +
173 + e->registered = 0;
174 +- /* Re-enable throttling in case elevator disabled it */
175 +- wbt_enable_default(q);
176 + }
177 + }
178 +
179 +diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
180 +index 46eacba2613b8..33d3728f36222 100644
181 +--- a/drivers/ata/libata-core.c
182 ++++ b/drivers/ata/libata-core.c
183 +@@ -4613,6 +4613,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
184 +
185 + /* devices that don't properly handle TRIM commands */
186 + { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, },
187 ++ { "M88V29*", NULL, ATA_HORKAGE_NOTRIM, },
188 +
189 + /*
190 + * As defined, the DRAT (Deterministic Read After Trim) and RZAT
191 +diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c
192 +index 80ff95f75199f..29c51762336d7 100644
193 +--- a/drivers/dma/sh/rcar-dmac.c
194 ++++ b/drivers/dma/sh/rcar-dmac.c
195 +@@ -1817,7 +1817,9 @@ static int rcar_dmac_probe(struct platform_device *pdev)
196 + platform_set_drvdata(pdev, dmac);
197 + dmac->dev->dma_parms = &dmac->parms;
198 + dma_set_max_seg_size(dmac->dev, RCAR_DMATCR_MASK);
199 +- dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40));
200 ++ ret = dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40));
201 ++ if (ret)
202 ++ return ret;
203 +
204 + ret = rcar_dmac_parse_of(&pdev->dev, dmac);
205 + if (ret < 0)
206 +diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
207 +index fd440b35d76ed..61d72bd967543 100644
208 +--- a/drivers/edac/edac_mc.c
209 ++++ b/drivers/edac/edac_mc.c
210 +@@ -265,7 +265,7 @@ void *edac_align_ptr(void **p, unsigned size, int n_elems)
211 + else
212 + return (char *)ptr;
213 +
214 +- r = (unsigned long)p % align;
215 ++ r = (unsigned long)ptr % align;
216 +
217 + if (r == 0)
218 + return (char *)ptr;
219 +diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
220 +index e67ed383e11b1..79aef5c063fae 100644
221 +--- a/drivers/gpu/drm/radeon/atombios_encoders.c
222 ++++ b/drivers/gpu/drm/radeon/atombios_encoders.c
223 +@@ -193,7 +193,8 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder,
224 + * so don't register a backlight device
225 + */
226 + if ((rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) &&
227 +- (rdev->pdev->device == 0x6741))
228 ++ (rdev->pdev->device == 0x6741) &&
229 ++ !dmi_match(DMI_PRODUCT_NAME, "iMac12,1"))
230 + return;
231 +
232 + if (!radeon_encoder->enc_priv)
233 +diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
234 +index cdd4392c589d3..a3f6933f94e30 100644
235 +--- a/drivers/hv/channel_mgmt.c
236 ++++ b/drivers/hv/channel_mgmt.c
237 +@@ -350,6 +350,7 @@ static struct vmbus_channel *alloc_channel(void)
238 + static void free_channel(struct vmbus_channel *channel)
239 + {
240 + tasklet_kill(&channel->callback_event);
241 ++ vmbus_remove_channel_attr_group(channel);
242 +
243 + kobject_put(&channel->kobj);
244 + }
245 +diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h
246 +index 7e7c8debbd285..c4ad518890243 100644
247 +--- a/drivers/hv/hyperv_vmbus.h
248 ++++ b/drivers/hv/hyperv_vmbus.h
249 +@@ -392,6 +392,8 @@ void vmbus_device_unregister(struct hv_device *device_obj);
250 + int vmbus_add_channel_kobj(struct hv_device *device_obj,
251 + struct vmbus_channel *channel);
252 +
253 ++void vmbus_remove_channel_attr_group(struct vmbus_channel *channel);
254 ++
255 + struct vmbus_channel *relid2channel(u32 relid);
256 +
257 + void vmbus_free_channels(void);
258 +diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
259 +index 0699c60188895..51fe219c91fc3 100644
260 +--- a/drivers/hv/vmbus_drv.c
261 ++++ b/drivers/hv/vmbus_drv.c
262 +@@ -609,7 +609,36 @@ static struct attribute *vmbus_dev_attrs[] = {
263 + &dev_attr_device.attr,
264 + NULL,
265 + };
266 +-ATTRIBUTE_GROUPS(vmbus_dev);
267 ++
268 ++/*
269 ++ * Device-level attribute_group callback function. Returns the permission for
270 ++ * each attribute, and returns 0 if an attribute is not visible.
271 ++ */
272 ++static umode_t vmbus_dev_attr_is_visible(struct kobject *kobj,
273 ++ struct attribute *attr, int idx)
274 ++{
275 ++ struct device *dev = kobj_to_dev(kobj);
276 ++ const struct hv_device *hv_dev = device_to_hv_device(dev);
277 ++
278 ++ /* Hide the monitor attributes if the monitor mechanism is not used. */
279 ++ if (!hv_dev->channel->offermsg.monitor_allocated &&
280 ++ (attr == &dev_attr_monitor_id.attr ||
281 ++ attr == &dev_attr_server_monitor_pending.attr ||
282 ++ attr == &dev_attr_client_monitor_pending.attr ||
283 ++ attr == &dev_attr_server_monitor_latency.attr ||
284 ++ attr == &dev_attr_client_monitor_latency.attr ||
285 ++ attr == &dev_attr_server_monitor_conn_id.attr ||
286 ++ attr == &dev_attr_client_monitor_conn_id.attr))
287 ++ return 0;
288 ++
289 ++ return attr->mode;
290 ++}
291 ++
292 ++static const struct attribute_group vmbus_dev_group = {
293 ++ .attrs = vmbus_dev_attrs,
294 ++ .is_visible = vmbus_dev_attr_is_visible
295 ++};
296 ++__ATTRIBUTE_GROUPS(vmbus_dev);
297 +
298 + /*
299 + * vmbus_uevent - add uevent for our device
300 +@@ -1484,10 +1513,34 @@ static struct attribute *vmbus_chan_attrs[] = {
301 + NULL
302 + };
303 +
304 ++/*
305 ++ * Channel-level attribute_group callback function. Returns the permission for
306 ++ * each attribute, and returns 0 if an attribute is not visible.
307 ++ */
308 ++static umode_t vmbus_chan_attr_is_visible(struct kobject *kobj,
309 ++ struct attribute *attr, int idx)
310 ++{
311 ++ const struct vmbus_channel *channel =
312 ++ container_of(kobj, struct vmbus_channel, kobj);
313 ++
314 ++ /* Hide the monitor attributes if the monitor mechanism is not used. */
315 ++ if (!channel->offermsg.monitor_allocated &&
316 ++ (attr == &chan_attr_pending.attr ||
317 ++ attr == &chan_attr_latency.attr ||
318 ++ attr == &chan_attr_monitor_id.attr))
319 ++ return 0;
320 ++
321 ++ return attr->mode;
322 ++}
323 ++
324 ++static struct attribute_group vmbus_chan_group = {
325 ++ .attrs = vmbus_chan_attrs,
326 ++ .is_visible = vmbus_chan_attr_is_visible
327 ++};
328 ++
329 + static struct kobj_type vmbus_chan_ktype = {
330 + .sysfs_ops = &vmbus_chan_sysfs_ops,
331 + .release = vmbus_chan_release,
332 +- .default_attrs = vmbus_chan_attrs,
333 + };
334 +
335 + /*
336 +@@ -1495,6 +1548,7 @@ static struct kobj_type vmbus_chan_ktype = {
337 + */
338 + int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel)
339 + {
340 ++ const struct device *device = &dev->device;
341 + struct kobject *kobj = &channel->kobj;
342 + u32 relid = channel->offermsg.child_relid;
343 + int ret;
344 +@@ -1502,14 +1556,36 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel)
345 + kobj->kset = dev->channels_kset;
346 + ret = kobject_init_and_add(kobj, &vmbus_chan_ktype, NULL,
347 + "%u", relid);
348 +- if (ret)
349 ++ if (ret) {
350 ++ kobject_put(kobj);
351 ++ return ret;
352 ++ }
353 ++
354 ++ ret = sysfs_create_group(kobj, &vmbus_chan_group);
355 ++
356 ++ if (ret) {
357 ++ /*
358 ++ * The calling functions' error handling paths will cleanup the
359 ++ * empty channel directory.
360 ++ */
361 ++ kobject_put(kobj);
362 ++ dev_err(device, "Unable to set up channel sysfs files\n");
363 + return ret;
364 ++ }
365 +
366 + kobject_uevent(kobj, KOBJ_ADD);
367 +
368 + return 0;
369 + }
370 +
371 ++/*
372 ++ * vmbus_remove_channel_attr_group - remove the channel's attribute group
373 ++ */
374 ++void vmbus_remove_channel_attr_group(struct vmbus_channel *channel)
375 ++{
376 ++ sysfs_remove_group(&channel->kobj, &vmbus_chan_group);
377 ++}
378 ++
379 + /*
380 + * vmbus_device_create - Creates and registers a new child device
381 + * on the vmbus.
382 +diff --git a/drivers/i2c/busses/i2c-brcmstb.c b/drivers/i2c/busses/i2c-brcmstb.c
383 +index 2086a96307bf9..1e8890601ca3b 100644
384 +--- a/drivers/i2c/busses/i2c-brcmstb.c
385 ++++ b/drivers/i2c/busses/i2c-brcmstb.c
386 +@@ -645,7 +645,7 @@ static int brcmstb_i2c_probe(struct platform_device *pdev)
387 +
388 + /* set the data in/out register size for compatible SoCs */
389 + if (of_device_is_compatible(dev->device->of_node,
390 +- "brcmstb,brcmper-i2c"))
391 ++ "brcm,brcmper-i2c"))
392 + dev->data_regsz = sizeof(u8);
393 + else
394 + dev->data_regsz = sizeof(u32);
395 +diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c
396 +index 532e9d68c7042..767cdd3f773bb 100644
397 +--- a/drivers/irqchip/irq-sifive-plic.c
398 ++++ b/drivers/irqchip/irq-sifive-plic.c
399 +@@ -258,3 +258,4 @@ out_iounmap:
400 +
401 + IRQCHIP_DECLARE(sifive_plic, "sifive,plic-1.0.0", plic_init);
402 + IRQCHIP_DECLARE(riscv_plic0, "riscv,plic0", plic_init); /* for legacy systems */
403 ++IRQCHIP_DECLARE(thead_c900_plic, "thead,c900-plic", plic_init); /* for firmware driver */
404 +diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
405 +index d1cc0fdbc51c8..630f3bcba56dd 100644
406 +--- a/drivers/mmc/core/block.c
407 ++++ b/drivers/mmc/core/block.c
408 +@@ -1678,31 +1678,31 @@ static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req)
409 + struct mmc_card *card = mq->card;
410 + struct mmc_host *host = card->host;
411 + blk_status_t error = BLK_STS_OK;
412 +- int retries = 0;
413 +
414 + do {
415 + u32 status;
416 + int err;
417 ++ int retries = 0;
418 +
419 +- mmc_blk_rw_rq_prep(mqrq, card, 1, mq);
420 ++ while (retries++ <= MMC_READ_SINGLE_RETRIES) {
421 ++ mmc_blk_rw_rq_prep(mqrq, card, 1, mq);
422 +
423 +- mmc_wait_for_req(host, mrq);
424 ++ mmc_wait_for_req(host, mrq);
425 +
426 +- err = mmc_send_status(card, &status);
427 +- if (err)
428 +- goto error_exit;
429 +-
430 +- if (!mmc_host_is_spi(host) &&
431 +- !mmc_blk_in_tran_state(status)) {
432 +- err = mmc_blk_fix_state(card, req);
433 ++ err = mmc_send_status(card, &status);
434 + if (err)
435 + goto error_exit;
436 +- }
437 +
438 +- if (mrq->cmd->error && retries++ < MMC_READ_SINGLE_RETRIES)
439 +- continue;
440 ++ if (!mmc_host_is_spi(host) &&
441 ++ !mmc_blk_in_tran_state(status)) {
442 ++ err = mmc_blk_fix_state(card, req);
443 ++ if (err)
444 ++ goto error_exit;
445 ++ }
446 +
447 +- retries = 0;
448 ++ if (!mrq->cmd->error)
449 ++ break;
450 ++ }
451 +
452 + if (mrq->cmd->error ||
453 + mrq->data->error ||
454 +diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
455 +index 774ffa9e23f38..27bafb8fc35af 100644
456 +--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
457 ++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
458 +@@ -589,6 +589,54 @@ static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl,
459 + __raw_writel(val, ctrl->nand_fc + word * 4);
460 + }
461 +
462 ++static void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl)
463 ++{
464 ++
465 ++ /* Clear error addresses */
466 ++ brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
467 ++ brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
468 ++ brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
469 ++ brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
470 ++}
471 ++
472 ++static u64 brcmnand_get_uncorrecc_addr(struct brcmnand_controller *ctrl)
473 ++{
474 ++ u64 err_addr;
475 ++
476 ++ err_addr = brcmnand_read_reg(ctrl, BRCMNAND_UNCORR_ADDR);
477 ++ err_addr |= ((u64)(brcmnand_read_reg(ctrl,
478 ++ BRCMNAND_UNCORR_EXT_ADDR)
479 ++ & 0xffff) << 32);
480 ++
481 ++ return err_addr;
482 ++}
483 ++
484 ++static u64 brcmnand_get_correcc_addr(struct brcmnand_controller *ctrl)
485 ++{
486 ++ u64 err_addr;
487 ++
488 ++ err_addr = brcmnand_read_reg(ctrl, BRCMNAND_CORR_ADDR);
489 ++ err_addr |= ((u64)(brcmnand_read_reg(ctrl,
490 ++ BRCMNAND_CORR_EXT_ADDR)
491 ++ & 0xffff) << 32);
492 ++
493 ++ return err_addr;
494 ++}
495 ++
496 ++static void brcmnand_set_cmd_addr(struct mtd_info *mtd, u64 addr)
497 ++{
498 ++ struct nand_chip *chip = mtd_to_nand(mtd);
499 ++ struct brcmnand_host *host = nand_get_controller_data(chip);
500 ++ struct brcmnand_controller *ctrl = host->ctrl;
501 ++
502 ++ brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
503 ++ (host->cs << 16) | ((addr >> 32) & 0xffff));
504 ++ (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
505 ++ brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
506 ++ lower_32_bits(addr));
507 ++ (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
508 ++}
509 ++
510 + static inline u16 brcmnand_cs_offset(struct brcmnand_controller *ctrl, int cs,
511 + enum brcmnand_cs_reg reg)
512 + {
513 +@@ -1217,9 +1265,12 @@ static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd)
514 + {
515 + struct brcmnand_controller *ctrl = host->ctrl;
516 + int ret;
517 ++ u64 cmd_addr;
518 ++
519 ++ cmd_addr = brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
520 ++
521 ++ dev_dbg(ctrl->dev, "send native cmd %d addr 0x%llx\n", cmd, cmd_addr);
522 +
523 +- dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd,
524 +- brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS));
525 + BUG_ON(ctrl->cmd_pending != 0);
526 + ctrl->cmd_pending = cmd;
527 +
528 +@@ -1380,12 +1431,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,
529 + if (!native_cmd)
530 + return;
531 +
532 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
533 +- (host->cs << 16) | ((addr >> 32) & 0xffff));
534 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
535 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, lower_32_bits(addr));
536 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
537 +-
538 ++ brcmnand_set_cmd_addr(mtd, addr);
539 + brcmnand_send_cmd(host, native_cmd);
540 + brcmnand_waitfunc(mtd, chip);
541 +
542 +@@ -1605,20 +1651,10 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,
543 + struct brcmnand_controller *ctrl = host->ctrl;
544 + int i, j, ret = 0;
545 +
546 +- /* Clear error addresses */
547 +- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
548 +- brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
549 +- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
550 +- brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
551 +-
552 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
553 +- (host->cs << 16) | ((addr >> 32) & 0xffff));
554 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
555 ++ brcmnand_clear_ecc_addr(ctrl);
556 +
557 + for (i = 0; i < trans; i++, addr += FC_BYTES) {
558 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
559 +- lower_32_bits(addr));
560 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
561 ++ brcmnand_set_cmd_addr(mtd, addr);
562 + /* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */
563 + brcmnand_send_cmd(host, CMD_PAGE_READ);
564 + brcmnand_waitfunc(mtd, chip);
565 +@@ -1637,22 +1673,16 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,
566 + mtd->oobsize / trans,
567 + host->hwcfg.sector_size_1k);
568 +
569 +- if (!ret) {
570 +- *err_addr = brcmnand_read_reg(ctrl,
571 +- BRCMNAND_UNCORR_ADDR) |
572 +- ((u64)(brcmnand_read_reg(ctrl,
573 +- BRCMNAND_UNCORR_EXT_ADDR)
574 +- & 0xffff) << 32);
575 ++ if (ret != -EBADMSG) {
576 ++ *err_addr = brcmnand_get_uncorrecc_addr(ctrl);
577 ++
578 + if (*err_addr)
579 + ret = -EBADMSG;
580 + }
581 +
582 + if (!ret) {
583 +- *err_addr = brcmnand_read_reg(ctrl,
584 +- BRCMNAND_CORR_ADDR) |
585 +- ((u64)(brcmnand_read_reg(ctrl,
586 +- BRCMNAND_CORR_EXT_ADDR)
587 +- & 0xffff) << 32);
588 ++ *err_addr = brcmnand_get_correcc_addr(ctrl);
589 ++
590 + if (*err_addr)
591 + ret = -EUCLEAN;
592 + }
593 +@@ -1722,7 +1752,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip,
594 + dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf);
595 +
596 + try_dmaread:
597 +- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_COUNT, 0);
598 ++ brcmnand_clear_ecc_addr(ctrl);
599 +
600 + if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) {
601 + err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES,
602 +@@ -1866,15 +1896,9 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip,
603 + goto out;
604 + }
605 +
606 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
607 +- (host->cs << 16) | ((addr >> 32) & 0xffff));
608 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
609 +-
610 + for (i = 0; i < trans; i++, addr += FC_BYTES) {
611 + /* full address MUST be set before populating FC */
612 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
613 +- lower_32_bits(addr));
614 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
615 ++ brcmnand_set_cmd_addr(mtd, addr);
616 +
617 + if (buf) {
618 + brcmnand_soc_data_bus_prepare(ctrl->soc, false);
619 +diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c
620 +index 148c7a16f3188..c64b408f080a9 100644
621 +--- a/drivers/mtd/nand/raw/qcom_nandc.c
622 ++++ b/drivers/mtd/nand/raw/qcom_nandc.c
623 +@@ -10,7 +10,6 @@
624 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
625 + * GNU General Public License for more details.
626 + */
627 +-
628 + #include <linux/clk.h>
629 + #include <linux/slab.h>
630 + #include <linux/bitops.h>
631 +@@ -2959,10 +2958,6 @@ static int qcom_nandc_probe(struct platform_device *pdev)
632 + if (!nandc->base_dma)
633 + return -ENXIO;
634 +
635 +- ret = qcom_nandc_alloc(nandc);
636 +- if (ret)
637 +- goto err_nandc_alloc;
638 +-
639 + ret = clk_prepare_enable(nandc->core_clk);
640 + if (ret)
641 + goto err_core_clk;
642 +@@ -2971,6 +2966,10 @@ static int qcom_nandc_probe(struct platform_device *pdev)
643 + if (ret)
644 + goto err_aon_clk;
645 +
646 ++ ret = qcom_nandc_alloc(nandc);
647 ++ if (ret)
648 ++ goto err_nandc_alloc;
649 ++
650 + ret = qcom_nandc_setup(nandc);
651 + if (ret)
652 + goto err_setup;
653 +@@ -2982,15 +2981,14 @@ static int qcom_nandc_probe(struct platform_device *pdev)
654 + return 0;
655 +
656 + err_setup:
657 ++ qcom_nandc_unalloc(nandc);
658 ++err_nandc_alloc:
659 + clk_disable_unprepare(nandc->aon_clk);
660 + err_aon_clk:
661 + clk_disable_unprepare(nandc->core_clk);
662 + err_core_clk:
663 +- qcom_nandc_unalloc(nandc);
664 +-err_nandc_alloc:
665 + dma_unmap_resource(dev, res->start, resource_size(res),
666 + DMA_BIDIRECTIONAL, 0);
667 +-
668 + return ret;
669 + }
670 +
671 +diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
672 +index 035923876c617..e3f814e83d9c8 100644
673 +--- a/drivers/net/bonding/bond_3ad.c
674 ++++ b/drivers/net/bonding/bond_3ad.c
675 +@@ -249,7 +249,7 @@ static inline int __check_agg_selection_timer(struct port *port)
676 + if (bond == NULL)
677 + return 0;
678 +
679 +- return BOND_AD_INFO(bond).agg_select_timer ? 1 : 0;
680 ++ return atomic_read(&BOND_AD_INFO(bond).agg_select_timer) ? 1 : 0;
681 + }
682 +
683 + /**
684 +@@ -1965,7 +1965,7 @@ static void ad_marker_response_received(struct bond_marker *marker,
685 + */
686 + void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout)
687 + {
688 +- BOND_AD_INFO(bond).agg_select_timer = timeout;
689 ++ atomic_set(&BOND_AD_INFO(bond).agg_select_timer, timeout);
690 + }
691 +
692 + /**
693 +@@ -2249,6 +2249,28 @@ void bond_3ad_update_ad_actor_settings(struct bonding *bond)
694 + spin_unlock_bh(&bond->mode_lock);
695 + }
696 +
697 ++/**
698 ++ * bond_agg_timer_advance - advance agg_select_timer
699 ++ * @bond: bonding structure
700 ++ *
701 ++ * Return true when agg_select_timer reaches 0.
702 ++ */
703 ++static bool bond_agg_timer_advance(struct bonding *bond)
704 ++{
705 ++ int val, nval;
706 ++
707 ++ while (1) {
708 ++ val = atomic_read(&BOND_AD_INFO(bond).agg_select_timer);
709 ++ if (!val)
710 ++ return false;
711 ++ nval = val - 1;
712 ++ if (atomic_cmpxchg(&BOND_AD_INFO(bond).agg_select_timer,
713 ++ val, nval) == val)
714 ++ break;
715 ++ }
716 ++ return nval == 0;
717 ++}
718 ++
719 + /**
720 + * bond_3ad_state_machine_handler - handle state machines timeout
721 + * @bond: bonding struct to work on
722 +@@ -2284,9 +2306,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
723 + if (!bond_has_slaves(bond))
724 + goto re_arm;
725 +
726 +- /* check if agg_select_timer timer after initialize is timed out */
727 +- if (BOND_AD_INFO(bond).agg_select_timer &&
728 +- !(--BOND_AD_INFO(bond).agg_select_timer)) {
729 ++ if (bond_agg_timer_advance(bond)) {
730 + slave = bond_first_slave_rcu(bond);
731 + port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL;
732 +
733 +diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
734 +index b89c474e6b6bf..70ce37cd94af5 100644
735 +--- a/drivers/net/dsa/lan9303-core.c
736 ++++ b/drivers/net/dsa/lan9303-core.c
737 +@@ -1307,7 +1307,7 @@ static int lan9303_probe_reset_gpio(struct lan9303 *chip,
738 + struct device_node *np)
739 + {
740 + chip->reset_gpio = devm_gpiod_get_optional(chip->dev, "reset",
741 +- GPIOD_OUT_LOW);
742 ++ GPIOD_OUT_HIGH);
743 + if (IS_ERR(chip->reset_gpio))
744 + return PTR_ERR(chip->reset_gpio);
745 +
746 +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
747 +index d110aa616a957..f162ac7d74e59 100644
748 +--- a/drivers/net/ethernet/cadence/macb_main.c
749 ++++ b/drivers/net/ethernet/cadence/macb_main.c
750 +@@ -4073,7 +4073,7 @@ static int macb_probe(struct platform_device *pdev)
751 +
752 + #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
753 + if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) {
754 +- dma_set_mask(&pdev->dev, DMA_BIT_MASK(44));
755 ++ dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44));
756 + bp->hw_dma_cap |= HW_DMA_CAP_64B;
757 + }
758 + #endif
759 +diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c
760 +index 3d9e915798668..1bc09b6c308f8 100644
761 +--- a/drivers/net/ieee802154/at86rf230.c
762 ++++ b/drivers/net/ieee802154/at86rf230.c
763 +@@ -108,6 +108,7 @@ struct at86rf230_local {
764 + unsigned long cal_timeout;
765 + bool is_tx;
766 + bool is_tx_from_off;
767 ++ bool was_tx;
768 + u8 tx_retry;
769 + struct sk_buff *tx_skb;
770 + struct at86rf230_state_change tx;
771 +@@ -351,7 +352,11 @@ at86rf230_async_error_recover_complete(void *context)
772 + if (ctx->free)
773 + kfree(ctx);
774 +
775 +- ieee802154_wake_queue(lp->hw);
776 ++ if (lp->was_tx) {
777 ++ lp->was_tx = 0;
778 ++ dev_kfree_skb_any(lp->tx_skb);
779 ++ ieee802154_wake_queue(lp->hw);
780 ++ }
781 + }
782 +
783 + static void
784 +@@ -360,7 +365,11 @@ at86rf230_async_error_recover(void *context)
785 + struct at86rf230_state_change *ctx = context;
786 + struct at86rf230_local *lp = ctx->lp;
787 +
788 +- lp->is_tx = 0;
789 ++ if (lp->is_tx) {
790 ++ lp->was_tx = 1;
791 ++ lp->is_tx = 0;
792 ++ }
793 ++
794 + at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON,
795 + at86rf230_async_error_recover_complete);
796 + }
797 +diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c
798 +index 3169c174006ab..7c5db4f73cce6 100644
799 +--- a/drivers/net/ieee802154/ca8210.c
800 ++++ b/drivers/net/ieee802154/ca8210.c
801 +@@ -2975,8 +2975,8 @@ static void ca8210_hw_setup(struct ieee802154_hw *ca8210_hw)
802 + ca8210_hw->phy->cca.opt = NL802154_CCA_OPT_ENERGY_CARRIER_AND;
803 + ca8210_hw->phy->cca_ed_level = -9800;
804 + ca8210_hw->phy->symbol_duration = 16;
805 +- ca8210_hw->phy->lifs_period = 40;
806 +- ca8210_hw->phy->sifs_period = 12;
807 ++ ca8210_hw->phy->lifs_period = 40 * ca8210_hw->phy->symbol_duration;
808 ++ ca8210_hw->phy->sifs_period = 12 * ca8210_hw->phy->symbol_duration;
809 + ca8210_hw->flags =
810 + IEEE802154_HW_AFILT |
811 + IEEE802154_HW_OMIT_CKSUM |
812 +diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
813 +index b2434b4798468..684eec0aa0d63 100644
814 +--- a/drivers/net/usb/ax88179_178a.c
815 ++++ b/drivers/net/usb/ax88179_178a.c
816 +@@ -1373,59 +1373,69 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
817 + u16 hdr_off;
818 + u32 *pkt_hdr;
819 +
820 +- /* This check is no longer done by usbnet */
821 +- if (skb->len < dev->net->hard_header_len)
822 ++ /* At the end of the SKB, there's a header telling us how many packets
823 ++ * are bundled into this buffer and where we can find an array of
824 ++ * per-packet metadata (which contains elements encoded into u16).
825 ++ */
826 ++ if (skb->len < 4)
827 + return 0;
828 +-
829 + skb_trim(skb, skb->len - 4);
830 + memcpy(&rx_hdr, skb_tail_pointer(skb), 4);
831 + le32_to_cpus(&rx_hdr);
832 +-
833 + pkt_cnt = (u16)rx_hdr;
834 + hdr_off = (u16)(rx_hdr >> 16);
835 ++
836 ++ if (pkt_cnt == 0)
837 ++ return 0;
838 ++
839 ++ /* Make sure that the bounds of the metadata array are inside the SKB
840 ++ * (and in front of the counter at the end).
841 ++ */
842 ++ if (pkt_cnt * 2 + hdr_off > skb->len)
843 ++ return 0;
844 + pkt_hdr = (u32 *)(skb->data + hdr_off);
845 +
846 +- while (pkt_cnt--) {
847 ++ /* Packets must not overlap the metadata array */
848 ++ skb_trim(skb, hdr_off);
849 ++
850 ++ for (; ; pkt_cnt--, pkt_hdr++) {
851 + u16 pkt_len;
852 +
853 + le32_to_cpus(pkt_hdr);
854 + pkt_len = (*pkt_hdr >> 16) & 0x1fff;
855 +
856 +- /* Check CRC or runt packet */
857 +- if ((*pkt_hdr & AX_RXHDR_CRC_ERR) ||
858 +- (*pkt_hdr & AX_RXHDR_DROP_ERR)) {
859 +- skb_pull(skb, (pkt_len + 7) & 0xFFF8);
860 +- pkt_hdr++;
861 +- continue;
862 +- }
863 +-
864 +- if (pkt_cnt == 0) {
865 +- skb->len = pkt_len;
866 +- /* Skip IP alignment pseudo header */
867 +- skb_pull(skb, 2);
868 +- skb_set_tail_pointer(skb, skb->len);
869 +- skb->truesize = pkt_len + sizeof(struct sk_buff);
870 +- ax88179_rx_checksum(skb, pkt_hdr);
871 +- return 1;
872 +- }
873 ++ if (pkt_len > skb->len)
874 ++ return 0;
875 +
876 +- ax_skb = skb_clone(skb, GFP_ATOMIC);
877 +- if (ax_skb) {
878 ++ /* Check CRC or runt packet */
879 ++ if (((*pkt_hdr & (AX_RXHDR_CRC_ERR | AX_RXHDR_DROP_ERR)) == 0) &&
880 ++ pkt_len >= 2 + ETH_HLEN) {
881 ++ bool last = (pkt_cnt == 0);
882 ++
883 ++ if (last) {
884 ++ ax_skb = skb;
885 ++ } else {
886 ++ ax_skb = skb_clone(skb, GFP_ATOMIC);
887 ++ if (!ax_skb)
888 ++ return 0;
889 ++ }
890 + ax_skb->len = pkt_len;
891 + /* Skip IP alignment pseudo header */
892 + skb_pull(ax_skb, 2);
893 + skb_set_tail_pointer(ax_skb, ax_skb->len);
894 + ax_skb->truesize = pkt_len + sizeof(struct sk_buff);
895 + ax88179_rx_checksum(ax_skb, pkt_hdr);
896 ++
897 ++ if (last)
898 ++ return 1;
899 ++
900 + usbnet_skb_return(dev, ax_skb);
901 +- } else {
902 +- return 0;
903 + }
904 +
905 +- skb_pull(skb, (pkt_len + 7) & 0xFFF8);
906 +- pkt_hdr++;
907 ++ /* Trim this packet away from the SKB */
908 ++ if (!skb_pull(skb, (pkt_len + 7) & 0xFFF8))
909 ++ return 0;
910 + }
911 +- return 1;
912 + }
913 +
914 + static struct sk_buff *
915 +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
916 +index 54b37a30df18b..c2e872f926f1c 100644
917 +--- a/drivers/net/usb/qmi_wwan.c
918 ++++ b/drivers/net/usb/qmi_wwan.c
919 +@@ -1358,6 +1358,8 @@ static const struct usb_device_id products[] = {
920 + {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */
921 + {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */
922 + {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/
923 ++ {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/
924 ++ {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */
925 + {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */
926 + {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */
927 + {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
928 +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
929 +index c44108823f796..a43333512edc9 100644
930 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
931 ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
932 +@@ -1549,6 +1549,8 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
933 + out_unbind:
934 + complete(&drv->request_firmware_complete);
935 + device_release_driver(drv->trans->dev);
936 ++ /* drv has just been freed by the release */
937 ++ failure = false;
938 + free:
939 + if (failure)
940 + iwl_dealloc_ucode(drv);
941 +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
942 +index 31e72e1ff1e26..80ae33bba6a86 100644
943 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
944 ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
945 +@@ -310,8 +310,7 @@ int iwl_trans_pcie_gen2_start_fw(struct iwl_trans *trans,
946 + /* This may fail if AMT took ownership of the device */
947 + if (iwl_pcie_prepare_card_hw(trans)) {
948 + IWL_WARN(trans, "Exit HW not ready\n");
949 +- ret = -EIO;
950 +- goto out;
951 ++ return -EIO;
952 + }
953 +
954 + iwl_enable_rfkill_int(trans);
955 +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
956 +index fcda33482887b..2d2afc1758304 100644
957 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
958 ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
959 +@@ -1363,8 +1363,7 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
960 + /* This may fail if AMT took ownership of the device */
961 + if (iwl_pcie_prepare_card_hw(trans)) {
962 + IWL_WARN(trans, "Exit HW not ready\n");
963 +- ret = -EIO;
964 +- goto out;
965 ++ return -EIO;
966 + }
967 +
968 + iwl_enable_rfkill_int(trans);
969 +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
970 +index e64310f2296f8..a0a805a5ab6b2 100644
971 +--- a/drivers/nvme/host/core.c
972 ++++ b/drivers/nvme/host/core.c
973 +@@ -3463,7 +3463,14 @@ static void nvme_async_event_work(struct work_struct *work)
974 + container_of(work, struct nvme_ctrl, async_event_work);
975 +
976 + nvme_aen_uevent(ctrl);
977 +- ctrl->ops->submit_async_event(ctrl);
978 ++
979 ++ /*
980 ++ * The transport drivers must guarantee AER submission here is safe by
981 ++ * flushing ctrl async_event_work after changing the controller state
982 ++ * from LIVE and before freeing the admin queue.
983 ++ */
984 ++ if (ctrl->state == NVME_CTRL_LIVE)
985 ++ ctrl->ops->submit_async_event(ctrl);
986 + }
987 +
988 + static bool nvme_ctrl_pp_status(struct nvme_ctrl *ctrl)
989 +diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
990 +index 1f41cf80f827c..55f4999525037 100644
991 +--- a/drivers/nvme/host/rdma.c
992 ++++ b/drivers/nvme/host/rdma.c
993 +@@ -1050,6 +1050,7 @@ static void nvme_rdma_error_recovery_work(struct work_struct *work)
994 + struct nvme_rdma_ctrl, err_work);
995 +
996 + nvme_stop_keep_alive(&ctrl->ctrl);
997 ++ flush_work(&ctrl->ctrl.async_event_work);
998 + nvme_rdma_teardown_io_queues(ctrl, false);
999 + nvme_start_queues(&ctrl->ctrl);
1000 + nvme_rdma_teardown_admin_queue(ctrl, false);
1001 +diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c
1002 +index b7b2e811d5471..6efab7a06c5fc 100644
1003 +--- a/drivers/parisc/ccio-dma.c
1004 ++++ b/drivers/parisc/ccio-dma.c
1005 +@@ -1010,7 +1010,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
1006 + ioc->usg_calls++;
1007 + #endif
1008 +
1009 +- while(sg_dma_len(sglist) && nents--) {
1010 ++ while (nents && sg_dma_len(sglist)) {
1011 +
1012 + #ifdef CCIO_COLLECT_STATS
1013 + ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT;
1014 +@@ -1018,6 +1018,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
1015 + ccio_unmap_page(dev, sg_dma_address(sglist),
1016 + sg_dma_len(sglist), direction, 0);
1017 + ++sglist;
1018 ++ nents--;
1019 + }
1020 +
1021 + DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents);
1022 +diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c
1023 +index 0f19cc75cc0cf..f675dfe045118 100644
1024 +--- a/drivers/parisc/sba_iommu.c
1025 ++++ b/drivers/parisc/sba_iommu.c
1026 +@@ -1063,7 +1063,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
1027 + spin_unlock_irqrestore(&ioc->res_lock, flags);
1028 + #endif
1029 +
1030 +- while (sg_dma_len(sglist) && nents--) {
1031 ++ while (nents && sg_dma_len(sglist)) {
1032 +
1033 + sba_unmap_page(dev, sg_dma_address(sglist), sg_dma_len(sglist),
1034 + direction, 0);
1035 +@@ -1072,6 +1072,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
1036 + ioc->usingle_calls--; /* kluge since call is unmap_sg() */
1037 + #endif
1038 + ++sglist;
1039 ++ nents--;
1040 + }
1041 +
1042 + DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents);
1043 +diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c
1044 +index 0809ae2aa9b14..51cc985216ff3 100644
1045 +--- a/drivers/tty/serial/8250/8250_gsc.c
1046 ++++ b/drivers/tty/serial/8250/8250_gsc.c
1047 +@@ -26,7 +26,7 @@ static int __init serial_init_chip(struct parisc_device *dev)
1048 + unsigned long address;
1049 + int err;
1050 +
1051 +-#ifdef CONFIG_64BIT
1052 ++#if defined(CONFIG_64BIT) && defined(CONFIG_IOSAPIC)
1053 + if (!dev->irq && (dev->id.sversion == 0xad))
1054 + dev->irq = iosapic_serial_irq(dev);
1055 + #endif
1056 +diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
1057 +index 1967d5fa681ad..eb2f8e84ffc9e 100644
1058 +--- a/fs/btrfs/send.c
1059 ++++ b/fs/btrfs/send.c
1060 +@@ -4956,6 +4956,10 @@ static ssize_t fill_read_buf(struct send_ctx *sctx, u64 offset, u32 len)
1061 + lock_page(page);
1062 + if (!PageUptodate(page)) {
1063 + unlock_page(page);
1064 ++ btrfs_err(fs_info,
1065 ++ "send: IO error at offset %llu for inode %llu root %llu",
1066 ++ page_offset(page), sctx->cur_ino,
1067 ++ sctx->send_root->root_key.objectid);
1068 + put_page(page);
1069 + ret = -EIO;
1070 + break;
1071 +diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
1072 +index 2a45e0d3e593c..6c492fca60c41 100644
1073 +--- a/fs/ext4/extents.c
1074 ++++ b/fs/ext4/extents.c
1075 +@@ -390,9 +390,12 @@ static int ext4_valid_extent_idx(struct inode *inode,
1076 +
1077 + static int ext4_valid_extent_entries(struct inode *inode,
1078 + struct ext4_extent_header *eh,
1079 +- int depth)
1080 ++ ext4_fsblk_t *pblk, int depth)
1081 + {
1082 + unsigned short entries;
1083 ++ ext4_lblk_t lblock = 0;
1084 ++ ext4_lblk_t prev = 0;
1085 ++
1086 + if (eh->eh_entries == 0)
1087 + return 1;
1088 +
1089 +@@ -403,32 +406,36 @@ static int ext4_valid_extent_entries(struct inode *inode,
1090 + struct ext4_extent *ext = EXT_FIRST_EXTENT(eh);
1091 + struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es;
1092 + ext4_fsblk_t pblock = 0;
1093 +- ext4_lblk_t lblock = 0;
1094 +- ext4_lblk_t prev = 0;
1095 +- int len = 0;
1096 + while (entries) {
1097 + if (!ext4_valid_extent(inode, ext))
1098 + return 0;
1099 +
1100 + /* Check for overlapping extents */
1101 + lblock = le32_to_cpu(ext->ee_block);
1102 +- len = ext4_ext_get_actual_len(ext);
1103 + if ((lblock <= prev) && prev) {
1104 + pblock = ext4_ext_pblock(ext);
1105 + es->s_last_error_block = cpu_to_le64(pblock);
1106 + return 0;
1107 + }
1108 ++ prev = lblock + ext4_ext_get_actual_len(ext) - 1;
1109 + ext++;
1110 + entries--;
1111 +- prev = lblock + len - 1;
1112 + }
1113 + } else {
1114 + struct ext4_extent_idx *ext_idx = EXT_FIRST_INDEX(eh);
1115 + while (entries) {
1116 + if (!ext4_valid_extent_idx(inode, ext_idx))
1117 + return 0;
1118 ++
1119 ++ /* Check for overlapping index extents */
1120 ++ lblock = le32_to_cpu(ext_idx->ei_block);
1121 ++ if ((lblock <= prev) && prev) {
1122 ++ *pblk = ext4_idx_pblock(ext_idx);
1123 ++ return 0;
1124 ++ }
1125 + ext_idx++;
1126 + entries--;
1127 ++ prev = lblock;
1128 + }
1129 + }
1130 + return 1;
1131 +@@ -462,7 +469,7 @@ static int __ext4_ext_check(const char *function, unsigned int line,
1132 + error_msg = "invalid eh_entries";
1133 + goto corrupted;
1134 + }
1135 +- if (!ext4_valid_extent_entries(inode, eh, depth)) {
1136 ++ if (!ext4_valid_extent_entries(inode, eh, &pblk, depth)) {
1137 + error_msg = "invalid extent entries";
1138 + goto corrupted;
1139 + }
1140 +diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
1141 +index a968b8b4b982f..10bc04af28824 100644
1142 +--- a/fs/nfs/dir.c
1143 ++++ b/fs/nfs/dir.c
1144 +@@ -1629,14 +1629,14 @@ no_open:
1145 + if (!res) {
1146 + inode = d_inode(dentry);
1147 + if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
1148 +- !S_ISDIR(inode->i_mode))
1149 ++ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
1150 + res = ERR_PTR(-ENOTDIR);
1151 + else if (inode && S_ISREG(inode->i_mode))
1152 + res = ERR_PTR(-EOPENSTALE);
1153 + } else if (!IS_ERR(res)) {
1154 + inode = d_inode(res);
1155 + if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
1156 +- !S_ISDIR(inode->i_mode)) {
1157 ++ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) {
1158 + dput(res);
1159 + res = ERR_PTR(-ENOTDIR);
1160 + } else if (inode && S_ISREG(inode->i_mode)) {
1161 +diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
1162 +index 2cdd8883b7c5d..592b95ab378bd 100644
1163 +--- a/fs/nfs/inode.c
1164 ++++ b/fs/nfs/inode.c
1165 +@@ -787,12 +787,9 @@ int nfs_getattr(const struct path *path, struct kstat *stat,
1166 + goto out_no_update;
1167 +
1168 + /* Flush out writes to the server in order to update c/mtime. */
1169 +- if ((request_mask & (STATX_CTIME|STATX_MTIME)) &&
1170 +- S_ISREG(inode->i_mode)) {
1171 +- err = filemap_write_and_wait(inode->i_mapping);
1172 +- if (err)
1173 +- goto out;
1174 +- }
1175 ++ if ((request_mask & (STATX_CTIME | STATX_MTIME)) &&
1176 ++ S_ISREG(inode->i_mode))
1177 ++ filemap_write_and_wait(inode->i_mapping);
1178 +
1179 + /*
1180 + * We may force a getattr if the user cares about atime.
1181 +diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
1182 +index 1d1d393f4208d..ddb379abd919d 100644
1183 +--- a/fs/quota/dquot.c
1184 ++++ b/fs/quota/dquot.c
1185 +@@ -687,9 +687,14 @@ int dquot_quota_sync(struct super_block *sb, int type)
1186 + /* This is not very clever (and fast) but currently I don't know about
1187 + * any other simple way of getting quota data to disk and we must get
1188 + * them there for userspace to be visible... */
1189 +- if (sb->s_op->sync_fs)
1190 +- sb->s_op->sync_fs(sb, 1);
1191 +- sync_blockdev(sb->s_bdev);
1192 ++ if (sb->s_op->sync_fs) {
1193 ++ ret = sb->s_op->sync_fs(sb, 1);
1194 ++ if (ret)
1195 ++ return ret;
1196 ++ }
1197 ++ ret = sync_blockdev(sb->s_bdev);
1198 ++ if (ret)
1199 ++ return ret;
1200 +
1201 + /*
1202 + * Now when everything is written we can discard the pagecache so
1203 +diff --git a/fs/super.c b/fs/super.c
1204 +index 9fb4553c46e63..8dc26e23f1a35 100644
1205 +--- a/fs/super.c
1206 ++++ b/fs/super.c
1207 +@@ -1404,11 +1404,9 @@ static void lockdep_sb_freeze_acquire(struct super_block *sb)
1208 + percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_);
1209 + }
1210 +
1211 +-static void sb_freeze_unlock(struct super_block *sb)
1212 ++static void sb_freeze_unlock(struct super_block *sb, int level)
1213 + {
1214 +- int level;
1215 +-
1216 +- for (level = SB_FREEZE_LEVELS - 1; level >= 0; level--)
1217 ++ for (level--; level >= 0; level--)
1218 + percpu_up_write(sb->s_writers.rw_sem + level);
1219 + }
1220 +
1221 +@@ -1479,7 +1477,14 @@ int freeze_super(struct super_block *sb)
1222 + sb_wait_write(sb, SB_FREEZE_PAGEFAULT);
1223 +
1224 + /* All writers are done so after syncing there won't be dirty data */
1225 +- sync_filesystem(sb);
1226 ++ ret = sync_filesystem(sb);
1227 ++ if (ret) {
1228 ++ sb->s_writers.frozen = SB_UNFROZEN;
1229 ++ sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT);
1230 ++ wake_up(&sb->s_writers.wait_unfrozen);
1231 ++ deactivate_locked_super(sb);
1232 ++ return ret;
1233 ++ }
1234 +
1235 + /* Now wait for internal filesystem counter */
1236 + sb->s_writers.frozen = SB_FREEZE_FS;
1237 +@@ -1491,7 +1496,7 @@ int freeze_super(struct super_block *sb)
1238 + printk(KERN_ERR
1239 + "VFS:Filesystem freeze failed\n");
1240 + sb->s_writers.frozen = SB_UNFROZEN;
1241 +- sb_freeze_unlock(sb);
1242 ++ sb_freeze_unlock(sb, SB_FREEZE_FS);
1243 + wake_up(&sb->s_writers.wait_unfrozen);
1244 + deactivate_locked_super(sb);
1245 + return ret;
1246 +@@ -1542,7 +1547,7 @@ static int thaw_super_locked(struct super_block *sb)
1247 + }
1248 +
1249 + sb->s_writers.frozen = SB_UNFROZEN;
1250 +- sb_freeze_unlock(sb);
1251 ++ sb_freeze_unlock(sb, SB_FREEZE_FS);
1252 + out:
1253 + wake_up(&sb->s_writers.wait_unfrozen);
1254 + deactivate_locked_super(sb);
1255 +diff --git a/include/linux/sched.h b/include/linux/sched.h
1256 +index 761d0f85c4a50..f92d5ae6d04e7 100644
1257 +--- a/include/linux/sched.h
1258 ++++ b/include/linux/sched.h
1259 +@@ -1389,7 +1389,6 @@ extern struct pid *cad_pid;
1260 + #define PF_MEMALLOC 0x00000800 /* Allocating memory */
1261 + #define PF_NPROC_EXCEEDED 0x00001000 /* set_user() noticed that RLIMIT_NPROC was exceeded */
1262 + #define PF_USED_MATH 0x00002000 /* If unset the fpu must be initialized before use */
1263 +-#define PF_USED_ASYNC 0x00004000 /* Used async_schedule*(), used by module init */
1264 + #define PF_NOFREEZE 0x00008000 /* This thread should not be frozen */
1265 + #define PF_FROZEN 0x00010000 /* Frozen for system suspend */
1266 + #define PF_KSWAPD 0x00020000 /* I am kswapd */
1267 +diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h
1268 +index fc3111515f5cb..732bc3b4606bf 100644
1269 +--- a/include/net/bond_3ad.h
1270 ++++ b/include/net/bond_3ad.h
1271 +@@ -265,7 +265,7 @@ struct ad_system {
1272 +
1273 + struct ad_bond_info {
1274 + struct ad_system system; /* 802.3ad system structure */
1275 +- u32 agg_select_timer; /* Timer to select aggregator after all adapter's hand shakes */
1276 ++ atomic_t agg_select_timer; /* Timer to select aggregator after all adapter's hand shakes */
1277 + u16 aggregator_identifier;
1278 + };
1279 +
1280 +diff --git a/kernel/async.c b/kernel/async.c
1281 +index a893d6170944f..4bf1b00a28d86 100644
1282 +--- a/kernel/async.c
1283 ++++ b/kernel/async.c
1284 +@@ -191,9 +191,6 @@ static async_cookie_t __async_schedule(async_func_t func, void *data, struct asy
1285 + atomic_inc(&entry_count);
1286 + spin_unlock_irqrestore(&async_lock, flags);
1287 +
1288 +- /* mark that this task has queued an async job, used by module init */
1289 +- current->flags |= PF_USED_ASYNC;
1290 +-
1291 + /* schedule for execution */
1292 + queue_work(system_unbound_wq, &entry->work);
1293 +
1294 +diff --git a/kernel/module.c b/kernel/module.c
1295 +index 68637e661d75c..42a604401c4dd 100644
1296 +--- a/kernel/module.c
1297 ++++ b/kernel/module.c
1298 +@@ -3526,12 +3526,6 @@ static noinline int do_init_module(struct module *mod)
1299 + }
1300 + freeinit->module_init = mod->init_layout.base;
1301 +
1302 +- /*
1303 +- * We want to find out whether @mod uses async during init. Clear
1304 +- * PF_USED_ASYNC. async_schedule*() will set it.
1305 +- */
1306 +- current->flags &= ~PF_USED_ASYNC;
1307 +-
1308 + do_mod_ctors(mod);
1309 + /* Start the module */
1310 + if (mod->init != NULL)
1311 +@@ -3557,22 +3551,13 @@ static noinline int do_init_module(struct module *mod)
1312 +
1313 + /*
1314 + * We need to finish all async code before the module init sequence
1315 +- * is done. This has potential to deadlock. For example, a newly
1316 +- * detected block device can trigger request_module() of the
1317 +- * default iosched from async probing task. Once userland helper
1318 +- * reaches here, async_synchronize_full() will wait on the async
1319 +- * task waiting on request_module() and deadlock.
1320 +- *
1321 +- * This deadlock is avoided by perfomring async_synchronize_full()
1322 +- * iff module init queued any async jobs. This isn't a full
1323 +- * solution as it will deadlock the same if module loading from
1324 +- * async jobs nests more than once; however, due to the various
1325 +- * constraints, this hack seems to be the best option for now.
1326 +- * Please refer to the following thread for details.
1327 ++ * is done. This has potential to deadlock if synchronous module
1328 ++ * loading is requested from async (which is not allowed!).
1329 + *
1330 +- * http://thread.gmane.org/gmane.linux.kernel/1420814
1331 ++ * See commit 0fdff3ec6d87 ("async, kmod: warn on synchronous
1332 ++ * request_module() from async workers") for more details.
1333 + */
1334 +- if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC))
1335 ++ if (!mod->async_probe_requested)
1336 + async_synchronize_full();
1337 +
1338 + ftrace_free_mem(mod, mod->init_layout.base, mod->init_layout.base +
1339 +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
1340 +index 17e337a22c239..19a6b088f1e72 100644
1341 +--- a/kernel/trace/trace.c
1342 ++++ b/kernel/trace/trace.c
1343 +@@ -232,6 +232,10 @@ __setup("trace_clock=", set_trace_boot_clock);
1344 +
1345 + static int __init set_tracepoint_printk(char *str)
1346 + {
1347 ++ /* Ignore the "tp_printk_stop_on_boot" param */
1348 ++ if (*str == '_')
1349 ++ return 0;
1350 ++
1351 + if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0))
1352 + tracepoint_printk = 1;
1353 + return 1;
1354 +diff --git a/kernel/tsacct.c b/kernel/tsacct.c
1355 +index 370724b453918..8d7c6d3f1daa7 100644
1356 +--- a/kernel/tsacct.c
1357 ++++ b/kernel/tsacct.c
1358 +@@ -46,11 +46,10 @@ void bacct_add_tsk(struct user_namespace *user_ns,
1359 + /* Convert to seconds for btime */
1360 + do_div(delta, USEC_PER_SEC);
1361 + stats->ac_btime = get_seconds() - delta;
1362 +- if (thread_group_leader(tsk)) {
1363 ++ if (tsk->flags & PF_EXITING)
1364 + stats->ac_exitcode = tsk->exit_code;
1365 +- if (tsk->flags & PF_FORKNOEXEC)
1366 +- stats->ac_flag |= AFORK;
1367 +- }
1368 ++ if (thread_group_leader(tsk) && (tsk->flags & PF_FORKNOEXEC))
1369 ++ stats->ac_flag |= AFORK;
1370 + if (tsk->flags & PF_SUPERPRIV)
1371 + stats->ac_flag |= ASU;
1372 + if (tsk->flags & PF_DUMPCORE)
1373 +diff --git a/lib/iov_iter.c b/lib/iov_iter.c
1374 +index 39e6e978029c1..4391962230319 100644
1375 +--- a/lib/iov_iter.c
1376 ++++ b/lib/iov_iter.c
1377 +@@ -393,6 +393,7 @@ static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t by
1378 + return 0;
1379 + pipe->nrbufs++;
1380 + buf->ops = &page_cache_pipe_buf_ops;
1381 ++ buf->flags = 0;
1382 + get_page(buf->page = page);
1383 + buf->offset = offset;
1384 + buf->len = bytes;
1385 +@@ -517,6 +518,7 @@ static size_t push_pipe(struct iov_iter *i, size_t size,
1386 + break;
1387 + pipe->nrbufs++;
1388 + pipe->bufs[idx].ops = &default_pipe_buf_ops;
1389 ++ pipe->bufs[idx].flags = 0;
1390 + pipe->bufs[idx].page = page;
1391 + pipe->bufs[idx].offset = 0;
1392 + if (left <= PAGE_SIZE) {
1393 +diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
1394 +index 567fdfd9678d5..a2bf5e4e9fbee 100644
1395 +--- a/net/ax25/af_ax25.c
1396 ++++ b/net/ax25/af_ax25.c
1397 +@@ -80,6 +80,7 @@ static void ax25_kill_by_device(struct net_device *dev)
1398 + {
1399 + ax25_dev *ax25_dev;
1400 + ax25_cb *s;
1401 ++ struct sock *sk;
1402 +
1403 + if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
1404 + return;
1405 +@@ -88,13 +89,15 @@ static void ax25_kill_by_device(struct net_device *dev)
1406 + again:
1407 + ax25_for_each(s, &ax25_list) {
1408 + if (s->ax25_dev == ax25_dev) {
1409 ++ sk = s->sk;
1410 ++ sock_hold(sk);
1411 + spin_unlock_bh(&ax25_list_lock);
1412 +- lock_sock(s->sk);
1413 ++ lock_sock(sk);
1414 + s->ax25_dev = NULL;
1415 +- release_sock(s->sk);
1416 ++ release_sock(sk);
1417 + ax25_disconnect(s, ENETUNREACH);
1418 + spin_lock_bh(&ax25_list_lock);
1419 +-
1420 ++ sock_put(sk);
1421 + /* The entry could have been deleted from the
1422 + * list meanwhile and thus the next pointer is
1423 + * no longer valid. Play it safe and restart
1424 +diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
1425 +index 3978a5e8d261c..2ed6000126408 100644
1426 +--- a/net/core/drop_monitor.c
1427 ++++ b/net/core/drop_monitor.c
1428 +@@ -219,13 +219,17 @@ static void trace_napi_poll_hit(void *ignore, struct napi_struct *napi,
1429 +
1430 + rcu_read_lock();
1431 + list_for_each_entry_rcu(new_stat, &hw_stats_list, list) {
1432 ++ struct net_device *dev;
1433 ++
1434 + /*
1435 + * only add a note to our monitor buffer if:
1436 + * 1) this is the dev we received on
1437 + * 2) its after the last_rx delta
1438 + * 3) our rx_dropped count has gone up
1439 + */
1440 +- if ((new_stat->dev == napi->dev) &&
1441 ++ /* Paired with WRITE_ONCE() in dropmon_net_event() */
1442 ++ dev = READ_ONCE(new_stat->dev);
1443 ++ if ((dev == napi->dev) &&
1444 + (time_after(jiffies, new_stat->last_rx + dm_hw_check_delta)) &&
1445 + (napi->dev->stats.rx_dropped != new_stat->last_drop_val)) {
1446 + trace_drop_common(NULL, NULL);
1447 +@@ -340,7 +344,10 @@ static int dropmon_net_event(struct notifier_block *ev_block,
1448 + mutex_lock(&trace_state_mutex);
1449 + list_for_each_entry_safe(new_stat, tmp, &hw_stats_list, list) {
1450 + if (new_stat->dev == dev) {
1451 +- new_stat->dev = NULL;
1452 ++
1453 ++ /* Paired with READ_ONCE() in trace_napi_poll_hit() */
1454 ++ WRITE_ONCE(new_stat->dev, NULL);
1455 ++
1456 + if (trace_state == TRACE_OFF) {
1457 + list_del_rcu(&new_stat->list);
1458 + kfree_rcu(new_stat, rcu);
1459 +diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
1460 +index 276442443d322..28d171e6e10b9 100644
1461 +--- a/net/ipv4/ping.c
1462 ++++ b/net/ipv4/ping.c
1463 +@@ -177,16 +177,23 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident)
1464 + struct sock *sk = NULL;
1465 + struct inet_sock *isk;
1466 + struct hlist_nulls_node *hnode;
1467 +- int dif = skb->dev->ifindex;
1468 ++ int dif, sdif;
1469 +
1470 + if (skb->protocol == htons(ETH_P_IP)) {
1471 ++ dif = inet_iif(skb);
1472 ++ sdif = inet_sdif(skb);
1473 + pr_debug("try to find: num = %d, daddr = %pI4, dif = %d\n",
1474 + (int)ident, &ip_hdr(skb)->daddr, dif);
1475 + #if IS_ENABLED(CONFIG_IPV6)
1476 + } else if (skb->protocol == htons(ETH_P_IPV6)) {
1477 ++ dif = inet6_iif(skb);
1478 ++ sdif = inet6_sdif(skb);
1479 + pr_debug("try to find: num = %d, daddr = %pI6c, dif = %d\n",
1480 + (int)ident, &ipv6_hdr(skb)->daddr, dif);
1481 + #endif
1482 ++ } else {
1483 ++ pr_err("ping: protocol(%x) is not supported\n", ntohs(skb->protocol));
1484 ++ return NULL;
1485 + }
1486 +
1487 + read_lock_bh(&ping_table.lock);
1488 +@@ -226,7 +233,7 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident)
1489 + }
1490 +
1491 + if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif &&
1492 +- sk->sk_bound_dev_if != inet_sdif(skb))
1493 ++ sk->sk_bound_dev_if != sdif)
1494 + continue;
1495 +
1496 + sock_hold(sk);
1497 +diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
1498 +index 1e5e2e4be0b27..e85b5f57d3e92 100644
1499 +--- a/net/ipv4/xfrm4_policy.c
1500 ++++ b/net/ipv4/xfrm4_policy.c
1501 +@@ -17,6 +17,7 @@
1502 + #include <net/xfrm.h>
1503 + #include <net/ip.h>
1504 + #include <net/l3mdev.h>
1505 ++#include <net/inet_ecn.h>
1506 +
1507 + static struct dst_entry *__xfrm4_dst_lookup(struct net *net, struct flowi4 *fl4,
1508 + int tos, int oif,
1509 +@@ -126,7 +127,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
1510 + fl4->flowi4_proto = iph->protocol;
1511 + fl4->daddr = reverse ? iph->saddr : iph->daddr;
1512 + fl4->saddr = reverse ? iph->daddr : iph->saddr;
1513 +- fl4->flowi4_tos = iph->tos;
1514 ++ fl4->flowi4_tos = iph->tos & ~INET_ECN_MASK;
1515 +
1516 + if (!ip_is_fragment(iph)) {
1517 + switch (iph->protocol) {
1518 +diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c
1519 +index a937d4f75613f..8cb62805fd684 100644
1520 +--- a/net/netfilter/nf_conntrack_proto_sctp.c
1521 ++++ b/net/netfilter/nf_conntrack_proto_sctp.c
1522 +@@ -394,6 +394,15 @@ static int sctp_packet(struct nf_conn *ct,
1523 + pr_debug("Setting vtag %x for dir %d\n",
1524 + ih->init_tag, !dir);
1525 + ct->proto.sctp.vtag[!dir] = ih->init_tag;
1526 ++
1527 ++ /* don't renew timeout on init retransmit so
1528 ++ * port reuse by client or NAT middlebox cannot
1529 ++ * keep entry alive indefinitely (incl. nat info).
1530 ++ */
1531 ++ if (new_state == SCTP_CONNTRACK_CLOSED &&
1532 ++ old_state == SCTP_CONNTRACK_CLOSED &&
1533 ++ nf_ct_is_confirmed(ct))
1534 ++ ignore = true;
1535 + }
1536 +
1537 + ct->proto.sctp.state = new_state;
1538 +diff --git a/net/sched/act_api.c b/net/sched/act_api.c
1539 +index 26710b297dcbb..ad0773b20d831 100644
1540 +--- a/net/sched/act_api.c
1541 ++++ b/net/sched/act_api.c
1542 +@@ -609,15 +609,24 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions,
1543 + restart_act_graph:
1544 + for (i = 0; i < nr_actions; i++) {
1545 + const struct tc_action *a = actions[i];
1546 ++ int repeat_ttl;
1547 +
1548 + if (jmp_prgcnt > 0) {
1549 + jmp_prgcnt -= 1;
1550 + continue;
1551 + }
1552 ++
1553 ++ repeat_ttl = 32;
1554 + repeat:
1555 + ret = a->ops->act(skb, a, res);
1556 +- if (ret == TC_ACT_REPEAT)
1557 +- goto repeat; /* we need a ttl - JHS */
1558 ++
1559 ++ if (unlikely(ret == TC_ACT_REPEAT)) {
1560 ++ if (--repeat_ttl != 0)
1561 ++ goto repeat;
1562 ++ /* suspicious opcode, stop pipeline */
1563 ++ net_warn_ratelimited("TC_ACT_REPEAT abuse ?\n");
1564 ++ return TC_ACT_OK;
1565 ++ }
1566 +
1567 + if (TC_ACT_EXT_CMP(ret, TC_ACT_JUMP)) {
1568 + jmp_prgcnt = ret & TCA_ACT_MAX_PRIO_MASK;
1569 +diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
1570 +index 37329e11dc3cc..22931a5f62bc6 100644
1571 +--- a/net/vmw_vsock/af_vsock.c
1572 ++++ b/net/vmw_vsock/af_vsock.c
1573 +@@ -1230,6 +1230,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
1574 + sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE;
1575 + sock->state = SS_UNCONNECTED;
1576 + vsock_transport_cancel_pkt(vsk);
1577 ++ vsock_remove_connected(vsk);
1578 + goto out_wait;
1579 + } else if (timeout == 0) {
1580 + err = -ETIMEDOUT;
1581 +diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
1582 +index 486e135d3e30a..65df6141397fe 100644
1583 +--- a/scripts/Makefile.extrawarn
1584 ++++ b/scripts/Makefile.extrawarn
1585 +@@ -73,5 +73,6 @@ KBUILD_CFLAGS += $(call cc-disable-warning, sign-compare)
1586 + KBUILD_CFLAGS += $(call cc-disable-warning, format-zero-length)
1587 + KBUILD_CFLAGS += $(call cc-disable-warning, uninitialized)
1588 + KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast)
1589 ++KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access)
1590 + endif
1591 + endif
1592 +diff --git a/scripts/kconfig/preprocess.c b/scripts/kconfig/preprocess.c
1593 +index 389814b02d06b..8c7e51a6273cc 100644
1594 +--- a/scripts/kconfig/preprocess.c
1595 ++++ b/scripts/kconfig/preprocess.c
1596 +@@ -138,7 +138,7 @@ static char *do_lineno(int argc, char *argv[])
1597 + static char *do_shell(int argc, char *argv[])
1598 + {
1599 + FILE *p;
1600 +- char buf[256];
1601 ++ char buf[4096];
1602 + char *cmd;
1603 + size_t nread;
1604 + int i;
1605 +diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
1606 +index 7d4b6c31dfe70..686f0fed6f6e4 100644
1607 +--- a/sound/pci/hda/hda_intel.c
1608 ++++ b/sound/pci/hda/hda_intel.c
1609 +@@ -1674,6 +1674,7 @@ static struct snd_pci_quirk probe_mask_list[] = {
1610 + /* forced codec slots */
1611 + SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
1612 + SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
1613 ++ SND_PCI_QUIRK(0x1558, 0x0351, "Schenker Dock 15", 0x105),
1614 + /* WinFast VP200 H (Teradici) user reported broken communication */
1615 + SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
1616 + {}
1617 +@@ -1859,8 +1860,6 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci,
1618 +
1619 + assign_position_fix(chip, check_position_fix(chip, position_fix[dev]));
1620 +
1621 +- check_probe_mask(chip, dev);
1622 +-
1623 + if (single_cmd < 0) /* allow fallback to single_cmd at errors */
1624 + chip->fallback_to_single_cmd = 1;
1625 + else /* explicitly set to single_cmd or not */
1626 +@@ -1889,6 +1888,8 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci,
1627 + chip->bus.needs_damn_long_delay = 1;
1628 + }
1629 +
1630 ++ check_probe_mask(chip, dev);
1631 ++
1632 + err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
1633 + if (err < 0) {
1634 + dev_err(card->dev, "Error creating device [card]!\n");
1635 +diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c
1636 +index ef8fd331526b0..f5dcd625e4355 100644
1637 +--- a/sound/soc/soc-ops.c
1638 ++++ b/sound/soc/soc-ops.c
1639 +@@ -314,7 +314,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
1640 + unsigned int sign_bit = mc->sign_bit;
1641 + unsigned int mask = (1 << fls(max)) - 1;
1642 + unsigned int invert = mc->invert;
1643 +- int err;
1644 ++ int err, ret;
1645 + bool type_2r = false;
1646 + unsigned int val2 = 0;
1647 + unsigned int val, val_mask;
1648 +@@ -356,12 +356,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
1649 + err = snd_soc_component_update_bits(component, reg, val_mask, val);
1650 + if (err < 0)
1651 + return err;
1652 ++ ret = err;
1653 +
1654 +- if (type_2r)
1655 ++ if (type_2r) {
1656 + err = snd_soc_component_update_bits(component, reg2, val_mask,
1657 +- val2);
1658 ++ val2);
1659 ++ /* Don't discard any error code or drop change flag */
1660 ++ if (ret == 0 || err < 0) {
1661 ++ ret = err;
1662 ++ }
1663 ++ }
1664 +
1665 +- return err;
1666 ++ return ret;
1667 + }
1668 + EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
1669 +
1670 +@@ -517,7 +523,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
1671 + unsigned int mask = (1 << fls(max)) - 1;
1672 + unsigned int invert = mc->invert;
1673 + unsigned int val, val_mask;
1674 +- int ret;
1675 ++ int err, ret;
1676 +
1677 + if (invert)
1678 + val = (max - ucontrol->value.integer.value[0]) & mask;
1679 +@@ -526,9 +532,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
1680 + val_mask = mask << shift;
1681 + val = val << shift;
1682 +
1683 +- ret = snd_soc_component_update_bits(component, reg, val_mask, val);
1684 +- if (ret < 0)
1685 +- return ret;
1686 ++ err = snd_soc_component_update_bits(component, reg, val_mask, val);
1687 ++ if (err < 0)
1688 ++ return err;
1689 ++ ret = err;
1690 +
1691 + if (snd_soc_volsw_is_stereo(mc)) {
1692 + if (invert)
1693 +@@ -538,8 +545,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
1694 + val_mask = mask << shift;
1695 + val = val << shift;
1696 +
1697 +- ret = snd_soc_component_update_bits(component, rreg, val_mask,
1698 ++ err = snd_soc_component_update_bits(component, rreg, val_mask,
1699 + val);
1700 ++ /* Don't discard any error code or drop change flag */
1701 ++ if (ret == 0 || err < 0) {
1702 ++ ret = err;
1703 ++ }
1704 + }
1705 +
1706 + return ret;
1707 +diff --git a/tools/lib/subcmd/subcmd-util.h b/tools/lib/subcmd/subcmd-util.h
1708 +index 794a375dad360..b2aec04fce8f6 100644
1709 +--- a/tools/lib/subcmd/subcmd-util.h
1710 ++++ b/tools/lib/subcmd/subcmd-util.h
1711 +@@ -50,15 +50,8 @@ static NORETURN inline void die(const char *err, ...)
1712 + static inline void *xrealloc(void *ptr, size_t size)
1713 + {
1714 + void *ret = realloc(ptr, size);
1715 +- if (!ret && !size)
1716 +- ret = realloc(ptr, 1);
1717 +- if (!ret) {
1718 +- ret = realloc(ptr, size);
1719 +- if (!ret && !size)
1720 +- ret = realloc(ptr, 1);
1721 +- if (!ret)
1722 +- die("Out of memory, realloc failed");
1723 +- }
1724 ++ if (!ret)
1725 ++ die("Out of memory, realloc failed");
1726 + return ret;
1727 + }
1728 +
1729 +diff --git a/tools/testing/selftests/zram/zram.sh b/tools/testing/selftests/zram/zram.sh
1730 +index 232e958ec4547..b0b91d9b0dc21 100755
1731 +--- a/tools/testing/selftests/zram/zram.sh
1732 ++++ b/tools/testing/selftests/zram/zram.sh
1733 +@@ -2,9 +2,6 @@
1734 + # SPDX-License-Identifier: GPL-2.0
1735 + TCID="zram.sh"
1736 +
1737 +-# Kselftest framework requirement - SKIP code is 4.
1738 +-ksft_skip=4
1739 +-
1740 + . ./zram_lib.sh
1741 +
1742 + run_zram () {
1743 +@@ -18,14 +15,4 @@ echo ""
1744 +
1745 + check_prereqs
1746 +
1747 +-# check zram module exists
1748 +-MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko
1749 +-if [ -f $MODULE_PATH ]; then
1750 +- run_zram
1751 +-elif [ -b /dev/zram0 ]; then
1752 +- run_zram
1753 +-else
1754 +- echo "$TCID : No zram.ko module or /dev/zram0 device file not found"
1755 +- echo "$TCID : CONFIG_ZRAM is not set"
1756 +- exit $ksft_skip
1757 +-fi
1758 ++run_zram
1759 +diff --git a/tools/testing/selftests/zram/zram01.sh b/tools/testing/selftests/zram/zram01.sh
1760 +index b9566a6478a9c..8abc9965089d1 100755
1761 +--- a/tools/testing/selftests/zram/zram01.sh
1762 ++++ b/tools/testing/selftests/zram/zram01.sh
1763 +@@ -42,9 +42,7 @@ zram_algs="lzo"
1764 +
1765 + zram_fill_fs()
1766 + {
1767 +- local mem_free0=$(free -m | awk 'NR==2 {print $4}')
1768 +-
1769 +- for i in $(seq 0 $(($dev_num - 1))); do
1770 ++ for i in $(seq $dev_start $dev_end); do
1771 + echo "fill zram$i..."
1772 + local b=0
1773 + while [ true ]; do
1774 +@@ -54,29 +52,17 @@ zram_fill_fs()
1775 + b=$(($b + 1))
1776 + done
1777 + echo "zram$i can be filled with '$b' KB"
1778 +- done
1779 +
1780 +- local mem_free1=$(free -m | awk 'NR==2 {print $4}')
1781 +- local used_mem=$(($mem_free0 - $mem_free1))
1782 ++ local mem_used_total=`awk '{print $3}' "/sys/block/zram$i/mm_stat"`
1783 ++ local v=$((100 * 1024 * $b / $mem_used_total))
1784 ++ if [ "$v" -lt 100 ]; then
1785 ++ echo "FAIL compression ratio: 0.$v:1"
1786 ++ ERR_CODE=-1
1787 ++ return
1788 ++ fi
1789 +
1790 +- local total_size=0
1791 +- for sm in $zram_sizes; do
1792 +- local s=$(echo $sm | sed 's/M//')
1793 +- total_size=$(($total_size + $s))
1794 ++ echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK"
1795 + done
1796 +-
1797 +- echo "zram used ${used_mem}M, zram disk sizes ${total_size}M"
1798 +-
1799 +- local v=$((100 * $total_size / $used_mem))
1800 +-
1801 +- if [ "$v" -lt 100 ]; then
1802 +- echo "FAIL compression ratio: 0.$v:1"
1803 +- ERR_CODE=-1
1804 +- zram_cleanup
1805 +- return
1806 +- fi
1807 +-
1808 +- echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK"
1809 + }
1810 +
1811 + check_prereqs
1812 +@@ -90,7 +76,6 @@ zram_mount
1813 +
1814 + zram_fill_fs
1815 + zram_cleanup
1816 +-zram_unload
1817 +
1818 + if [ $ERR_CODE -ne 0 ]; then
1819 + echo "$TCID : [FAIL]"
1820 +diff --git a/tools/testing/selftests/zram/zram02.sh b/tools/testing/selftests/zram/zram02.sh
1821 +index 74569b883737f..3768cfd2e5f83 100755
1822 +--- a/tools/testing/selftests/zram/zram02.sh
1823 ++++ b/tools/testing/selftests/zram/zram02.sh
1824 +@@ -45,7 +45,6 @@ zram_set_memlimit
1825 + zram_makeswap
1826 + zram_swapoff
1827 + zram_cleanup
1828 +-zram_unload
1829 +
1830 + if [ $ERR_CODE -ne 0 ]; then
1831 + echo "$TCID : [FAIL]"
1832 +diff --git a/tools/testing/selftests/zram/zram_lib.sh b/tools/testing/selftests/zram/zram_lib.sh
1833 +index 9e73a4fb9b0aa..130d193cbd727 100755
1834 +--- a/tools/testing/selftests/zram/zram_lib.sh
1835 ++++ b/tools/testing/selftests/zram/zram_lib.sh
1836 +@@ -14,12 +14,17 @@
1837 + # Author: Alexey Kodanev <alexey.kodanev@××××××.com>
1838 + # Modified: Naresh Kamboju <naresh.kamboju@××××××.org>
1839 +
1840 +-MODULE=0
1841 + dev_makeswap=-1
1842 + dev_mounted=-1
1843 +-
1844 ++dev_start=0
1845 ++dev_end=-1
1846 ++module_load=-1
1847 ++sys_control=-1
1848 + # Kselftest framework requirement - SKIP code is 4.
1849 + ksft_skip=4
1850 ++kernel_version=`uname -r | cut -d'.' -f1,2`
1851 ++kernel_major=${kernel_version%.*}
1852 ++kernel_minor=${kernel_version#*.}
1853 +
1854 + trap INT
1855 +
1856 +@@ -34,68 +39,104 @@ check_prereqs()
1857 + fi
1858 + }
1859 +
1860 ++kernel_gte()
1861 ++{
1862 ++ major=${1%.*}
1863 ++ minor=${1#*.}
1864 ++
1865 ++ if [ $kernel_major -gt $major ]; then
1866 ++ return 0
1867 ++ elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then
1868 ++ return 0
1869 ++ fi
1870 ++
1871 ++ return 1
1872 ++}
1873 ++
1874 + zram_cleanup()
1875 + {
1876 + echo "zram cleanup"
1877 + local i=
1878 +- for i in $(seq 0 $dev_makeswap); do
1879 ++ for i in $(seq $dev_start $dev_makeswap); do
1880 + swapoff /dev/zram$i
1881 + done
1882 +
1883 +- for i in $(seq 0 $dev_mounted); do
1884 ++ for i in $(seq $dev_start $dev_mounted); do
1885 + umount /dev/zram$i
1886 + done
1887 +
1888 +- for i in $(seq 0 $(($dev_num - 1))); do
1889 ++ for i in $(seq $dev_start $dev_end); do
1890 + echo 1 > /sys/block/zram${i}/reset
1891 + rm -rf zram$i
1892 + done
1893 +
1894 +-}
1895 ++ if [ $sys_control -eq 1 ]; then
1896 ++ for i in $(seq $dev_start $dev_end); do
1897 ++ echo $i > /sys/class/zram-control/hot_remove
1898 ++ done
1899 ++ fi
1900 +
1901 +-zram_unload()
1902 +-{
1903 +- if [ $MODULE -ne 0 ] ; then
1904 +- echo "zram rmmod zram"
1905 ++ if [ $module_load -eq 1 ]; then
1906 + rmmod zram > /dev/null 2>&1
1907 + fi
1908 + }
1909 +
1910 + zram_load()
1911 + {
1912 +- # check zram module exists
1913 +- MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko
1914 +- if [ -f $MODULE_PATH ]; then
1915 +- MODULE=1
1916 +- echo "create '$dev_num' zram device(s)"
1917 +- modprobe zram num_devices=$dev_num
1918 +- if [ $? -ne 0 ]; then
1919 +- echo "failed to insert zram module"
1920 +- exit 1
1921 +- fi
1922 +-
1923 +- dev_num_created=$(ls /dev/zram* | wc -w)
1924 ++ echo "create '$dev_num' zram device(s)"
1925 ++
1926 ++ # zram module loaded, new kernel
1927 ++ if [ -d "/sys/class/zram-control" ]; then
1928 ++ echo "zram modules already loaded, kernel supports" \
1929 ++ "zram-control interface"
1930 ++ dev_start=$(ls /dev/zram* | wc -w)
1931 ++ dev_end=$(($dev_start + $dev_num - 1))
1932 ++ sys_control=1
1933 ++
1934 ++ for i in $(seq $dev_start $dev_end); do
1935 ++ cat /sys/class/zram-control/hot_add > /dev/null
1936 ++ done
1937 ++
1938 ++ echo "all zram devices (/dev/zram$dev_start~$dev_end" \
1939 ++ "successfully created"
1940 ++ return 0
1941 ++ fi
1942 +
1943 +- if [ "$dev_num_created" -ne "$dev_num" ]; then
1944 +- echo "unexpected num of devices: $dev_num_created"
1945 +- ERR_CODE=-1
1946 ++ # detect old kernel or built-in
1947 ++ modprobe zram num_devices=$dev_num
1948 ++ if [ ! -d "/sys/class/zram-control" ]; then
1949 ++ if grep -q '^zram' /proc/modules; then
1950 ++ rmmod zram > /dev/null 2>&1
1951 ++ if [ $? -ne 0 ]; then
1952 ++ echo "zram module is being used on old kernel" \
1953 ++ "without zram-control interface"
1954 ++ exit $ksft_skip
1955 ++ fi
1956 + else
1957 +- echo "zram load module successful"
1958 ++ echo "test needs CONFIG_ZRAM=m on old kernel without" \
1959 ++ "zram-control interface"
1960 ++ exit $ksft_skip
1961 + fi
1962 +- elif [ -b /dev/zram0 ]; then
1963 +- echo "/dev/zram0 device file found: OK"
1964 +- else
1965 +- echo "ERROR: No zram.ko module or no /dev/zram0 device found"
1966 +- echo "$TCID : CONFIG_ZRAM is not set"
1967 +- exit 1
1968 ++ modprobe zram num_devices=$dev_num
1969 + fi
1970 ++
1971 ++ module_load=1
1972 ++ dev_end=$(($dev_num - 1))
1973 ++ echo "all zram devices (/dev/zram0~$dev_end) successfully created"
1974 + }
1975 +
1976 + zram_max_streams()
1977 + {
1978 + echo "set max_comp_streams to zram device(s)"
1979 +
1980 +- local i=0
1981 ++ kernel_gte 4.7
1982 ++ if [ $? -eq 0 ]; then
1983 ++ echo "The device attribute max_comp_streams was"\
1984 ++ "deprecated in 4.7"
1985 ++ return 0
1986 ++ fi
1987 ++
1988 ++ local i=$dev_start
1989 + for max_s in $zram_max_streams; do
1990 + local sys_path="/sys/block/zram${i}/max_comp_streams"
1991 + echo $max_s > $sys_path || \
1992 +@@ -107,7 +148,7 @@ zram_max_streams()
1993 + echo "FAIL can't set max_streams '$max_s', get $max_stream"
1994 +
1995 + i=$(($i + 1))
1996 +- echo "$sys_path = '$max_streams' ($i/$dev_num)"
1997 ++ echo "$sys_path = '$max_streams'"
1998 + done
1999 +
2000 + echo "zram max streams: OK"
2001 +@@ -117,15 +158,16 @@ zram_compress_alg()
2002 + {
2003 + echo "test that we can set compression algorithm"
2004 +
2005 +- local algs=$(cat /sys/block/zram0/comp_algorithm)
2006 ++ local i=$dev_start
2007 ++ local algs=$(cat /sys/block/zram${i}/comp_algorithm)
2008 + echo "supported algs: $algs"
2009 +- local i=0
2010 ++
2011 + for alg in $zram_algs; do
2012 + local sys_path="/sys/block/zram${i}/comp_algorithm"
2013 + echo "$alg" > $sys_path || \
2014 + echo "FAIL can't set '$alg' to $sys_path"
2015 + i=$(($i + 1))
2016 +- echo "$sys_path = '$alg' ($i/$dev_num)"
2017 ++ echo "$sys_path = '$alg'"
2018 + done
2019 +
2020 + echo "zram set compression algorithm: OK"
2021 +@@ -134,14 +176,14 @@ zram_compress_alg()
2022 + zram_set_disksizes()
2023 + {
2024 + echo "set disk size to zram device(s)"
2025 +- local i=0
2026 ++ local i=$dev_start
2027 + for ds in $zram_sizes; do
2028 + local sys_path="/sys/block/zram${i}/disksize"
2029 + echo "$ds" > $sys_path || \
2030 + echo "FAIL can't set '$ds' to $sys_path"
2031 +
2032 + i=$(($i + 1))
2033 +- echo "$sys_path = '$ds' ($i/$dev_num)"
2034 ++ echo "$sys_path = '$ds'"
2035 + done
2036 +
2037 + echo "zram set disksizes: OK"
2038 +@@ -151,14 +193,14 @@ zram_set_memlimit()
2039 + {
2040 + echo "set memory limit to zram device(s)"
2041 +
2042 +- local i=0
2043 ++ local i=$dev_start
2044 + for ds in $zram_mem_limits; do
2045 + local sys_path="/sys/block/zram${i}/mem_limit"
2046 + echo "$ds" > $sys_path || \
2047 + echo "FAIL can't set '$ds' to $sys_path"
2048 +
2049 + i=$(($i + 1))
2050 +- echo "$sys_path = '$ds' ($i/$dev_num)"
2051 ++ echo "$sys_path = '$ds'"
2052 + done
2053 +
2054 + echo "zram set memory limit: OK"
2055 +@@ -167,8 +209,8 @@ zram_set_memlimit()
2056 + zram_makeswap()
2057 + {
2058 + echo "make swap with zram device(s)"
2059 +- local i=0
2060 +- for i in $(seq 0 $(($dev_num - 1))); do
2061 ++ local i=$dev_start
2062 ++ for i in $(seq $dev_start $dev_end); do
2063 + mkswap /dev/zram$i > err.log 2>&1
2064 + if [ $? -ne 0 ]; then
2065 + cat err.log
2066 +@@ -191,7 +233,7 @@ zram_makeswap()
2067 + zram_swapoff()
2068 + {
2069 + local i=
2070 +- for i in $(seq 0 $dev_makeswap); do
2071 ++ for i in $(seq $dev_start $dev_end); do
2072 + swapoff /dev/zram$i > err.log 2>&1
2073 + if [ $? -ne 0 ]; then
2074 + cat err.log
2075 +@@ -205,7 +247,7 @@ zram_swapoff()
2076 +
2077 + zram_makefs()
2078 + {
2079 +- local i=0
2080 ++ local i=$dev_start
2081 + for fs in $zram_filesystems; do
2082 + # if requested fs not supported default it to ext2
2083 + which mkfs.$fs > /dev/null 2>&1 || fs=ext2
2084 +@@ -224,7 +266,7 @@ zram_makefs()
2085 + zram_mount()
2086 + {
2087 + local i=0
2088 +- for i in $(seq 0 $(($dev_num - 1))); do
2089 ++ for i in $(seq $dev_start $dev_end); do
2090 + echo "mount /dev/zram$i"
2091 + mkdir zram$i
2092 + mount /dev/zram$i zram$i > /dev/null || \