Gentoo Archives: gentoo-commits

From: Mike Pagano <mpagano@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/linux-patches:4.14 commit in: /
Date: Wed, 23 Feb 2022 12:40:12
Message-Id: 1645619993.95263d7678490baa4dee89a82442393210eac8d5.mpagano@gentoo
1 commit: 95263d7678490baa4dee89a82442393210eac8d5
2 Author: Mike Pagano <mpagano <AT> gentoo <DOT> org>
3 AuthorDate: Wed Feb 23 12:39:53 2022 +0000
4 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org>
5 CommitDate: Wed Feb 23 12:39:53 2022 +0000
6 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=95263d76
7
8 Linux patch 4.14.268
9
10 Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>
11
12 0000_README | 4 +
13 1267_linux-4.14.268.patch | 1575 +++++++++++++++++++++++++++++++++++++++++++++
14 2 files changed, 1579 insertions(+)
15
16 diff --git a/0000_README b/0000_README
17 index 1ea11882..d97a880d 100644
18 --- a/0000_README
19 +++ b/0000_README
20 @@ -1115,6 +1115,10 @@ Patch: 1266_linux-4.14.267.patch
21 From: https://www.kernel.org
22 Desc: Linux 4.14.267
23
24 +Patch: 1267_linux-4.14.268.patch
25 +From: https://www.kernel.org
26 +Desc: Linux 4.14.268
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/1267_linux-4.14.268.patch b/1267_linux-4.14.268.patch
33 new file mode 100644
34 index 00000000..f128e939
35 --- /dev/null
36 +++ b/1267_linux-4.14.268.patch
37 @@ -0,0 +1,1575 @@
38 +diff --git a/Makefile b/Makefile
39 +index d953c6f478aaa..e3be05e00d9d2 100644
40 +--- a/Makefile
41 ++++ b/Makefile
42 +@@ -1,7 +1,7 @@
43 + # SPDX-License-Identifier: GPL-2.0
44 + VERSION = 4
45 + PATCHLEVEL = 14
46 +-SUBLEVEL = 267
47 ++SUBLEVEL = 268
48 + EXTRAVERSION =
49 + NAME = Petit Gorille
50 +
51 +diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
52 +index 9274a484c6a39..f6afd866e4cf9 100644
53 +--- a/arch/arm/mach-omap2/omap_hwmod.c
54 ++++ b/arch/arm/mach-omap2/omap_hwmod.c
55 +@@ -768,8 +768,10 @@ static int _init_clkctrl_providers(void)
56 +
57 + for_each_matching_node(np, ti_clkctrl_match_table) {
58 + ret = _setup_clkctrl_provider(np);
59 +- if (ret)
60 ++ if (ret) {
61 ++ of_node_put(np);
62 + break;
63 ++ }
64 + }
65 +
66 + return ret;
67 +diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
68 +index f208f560aecd0..eb3f7237d09a4 100644
69 +--- a/arch/powerpc/lib/sstep.c
70 ++++ b/arch/powerpc/lib/sstep.c
71 +@@ -2652,12 +2652,14 @@ void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op)
72 + case BARRIER_EIEIO:
73 + eieio();
74 + break;
75 ++#ifdef CONFIG_PPC64
76 + case BARRIER_LWSYNC:
77 + asm volatile("lwsync" : : : "memory");
78 + break;
79 + case BARRIER_PTESYNC:
80 + asm volatile("ptesync" : : : "memory");
81 + break;
82 ++#endif
83 + }
84 + break;
85 +
86 +diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c
87 +index 1bca8016ee8ae..b1fde6a548403 100644
88 +--- a/arch/x86/kvm/pmu.c
89 ++++ b/arch/x86/kvm/pmu.c
90 +@@ -171,7 +171,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel)
91 + }
92 +
93 + if (type == PERF_TYPE_RAW)
94 +- config = eventsel & X86_RAW_EVENT_MASK;
95 ++ config = eventsel & AMD64_RAW_EVENT_MASK;
96 +
97 + pmc_reprogram_counter(pmc, type, config,
98 + !(eventsel & ARCH_PERFMON_EVENTSEL_USR),
99 +diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
100 +index 8ec71243cdcca..791374199e227 100644
101 +--- a/drivers/ata/libata-core.c
102 ++++ b/drivers/ata/libata-core.c
103 +@@ -4603,6 +4603,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
104 +
105 + /* devices that don't properly handle TRIM commands */
106 + { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, },
107 ++ { "M88V29*", NULL, ATA_HORKAGE_NOTRIM, },
108 +
109 + /*
110 + * As defined, the DRAT (Deterministic Read After Trim) and RZAT
111 +diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c
112 +index f7ca57125ac7c..e31fb3f91d074 100644
113 +--- a/drivers/dma/sh/rcar-dmac.c
114 ++++ b/drivers/dma/sh/rcar-dmac.c
115 +@@ -1767,7 +1767,9 @@ static int rcar_dmac_probe(struct platform_device *pdev)
116 + platform_set_drvdata(pdev, dmac);
117 + dmac->dev->dma_parms = &dmac->parms;
118 + dma_set_max_seg_size(dmac->dev, RCAR_DMATCR_MASK);
119 +- dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40));
120 ++ ret = dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40));
121 ++ if (ret)
122 ++ return ret;
123 +
124 + ret = rcar_dmac_parse_of(&pdev->dev, dmac);
125 + if (ret < 0)
126 +diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
127 +index 329021189c38b..60b7b9b7fde99 100644
128 +--- a/drivers/edac/edac_mc.c
129 ++++ b/drivers/edac/edac_mc.c
130 +@@ -264,7 +264,7 @@ void *edac_align_ptr(void **p, unsigned size, int n_elems)
131 + else
132 + return (char *)ptr;
133 +
134 +- r = (unsigned long)p % align;
135 ++ r = (unsigned long)ptr % align;
136 +
137 + if (r == 0)
138 + return (char *)ptr;
139 +diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
140 +index e67ed383e11b1..79aef5c063fae 100644
141 +--- a/drivers/gpu/drm/radeon/atombios_encoders.c
142 ++++ b/drivers/gpu/drm/radeon/atombios_encoders.c
143 +@@ -193,7 +193,8 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder,
144 + * so don't register a backlight device
145 + */
146 + if ((rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) &&
147 +- (rdev->pdev->device == 0x6741))
148 ++ (rdev->pdev->device == 0x6741) &&
149 ++ !dmi_match(DMI_PRODUCT_NAME, "iMac12,1"))
150 + return;
151 +
152 + if (!radeon_encoder->enc_priv)
153 +diff --git a/drivers/i2c/busses/i2c-brcmstb.c b/drivers/i2c/busses/i2c-brcmstb.c
154 +index a658f975605a7..fe51d3fb5c6b1 100644
155 +--- a/drivers/i2c/busses/i2c-brcmstb.c
156 ++++ b/drivers/i2c/busses/i2c-brcmstb.c
157 +@@ -645,7 +645,7 @@ static int brcmstb_i2c_probe(struct platform_device *pdev)
158 +
159 + /* set the data in/out register size for compatible SoCs */
160 + if (of_device_is_compatible(dev->device->of_node,
161 +- "brcmstb,brcmper-i2c"))
162 ++ "brcm,brcmper-i2c"))
163 + dev->data_regsz = sizeof(u8);
164 + else
165 + dev->data_regsz = sizeof(u32);
166 +diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c
167 +index c65724d0c725d..2741147481c0a 100644
168 +--- a/drivers/mtd/nand/brcmnand/brcmnand.c
169 ++++ b/drivers/mtd/nand/brcmnand/brcmnand.c
170 +@@ -589,6 +589,54 @@ static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl,
171 + __raw_writel(val, ctrl->nand_fc + word * 4);
172 + }
173 +
174 ++static void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl)
175 ++{
176 ++
177 ++ /* Clear error addresses */
178 ++ brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
179 ++ brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
180 ++ brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
181 ++ brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
182 ++}
183 ++
184 ++static u64 brcmnand_get_uncorrecc_addr(struct brcmnand_controller *ctrl)
185 ++{
186 ++ u64 err_addr;
187 ++
188 ++ err_addr = brcmnand_read_reg(ctrl, BRCMNAND_UNCORR_ADDR);
189 ++ err_addr |= ((u64)(brcmnand_read_reg(ctrl,
190 ++ BRCMNAND_UNCORR_EXT_ADDR)
191 ++ & 0xffff) << 32);
192 ++
193 ++ return err_addr;
194 ++}
195 ++
196 ++static u64 brcmnand_get_correcc_addr(struct brcmnand_controller *ctrl)
197 ++{
198 ++ u64 err_addr;
199 ++
200 ++ err_addr = brcmnand_read_reg(ctrl, BRCMNAND_CORR_ADDR);
201 ++ err_addr |= ((u64)(brcmnand_read_reg(ctrl,
202 ++ BRCMNAND_CORR_EXT_ADDR)
203 ++ & 0xffff) << 32);
204 ++
205 ++ return err_addr;
206 ++}
207 ++
208 ++static void brcmnand_set_cmd_addr(struct mtd_info *mtd, u64 addr)
209 ++{
210 ++ struct nand_chip *chip = mtd_to_nand(mtd);
211 ++ struct brcmnand_host *host = nand_get_controller_data(chip);
212 ++ struct brcmnand_controller *ctrl = host->ctrl;
213 ++
214 ++ brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
215 ++ (host->cs << 16) | ((addr >> 32) & 0xffff));
216 ++ (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
217 ++ brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
218 ++ lower_32_bits(addr));
219 ++ (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
220 ++}
221 ++
222 + static inline u16 brcmnand_cs_offset(struct brcmnand_controller *ctrl, int cs,
223 + enum brcmnand_cs_reg reg)
224 + {
225 +@@ -1217,9 +1265,12 @@ static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd)
226 + {
227 + struct brcmnand_controller *ctrl = host->ctrl;
228 + int ret;
229 ++ u64 cmd_addr;
230 ++
231 ++ cmd_addr = brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
232 ++
233 ++ dev_dbg(ctrl->dev, "send native cmd %d addr 0x%llx\n", cmd, cmd_addr);
234 +
235 +- dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd,
236 +- brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS));
237 + BUG_ON(ctrl->cmd_pending != 0);
238 + ctrl->cmd_pending = cmd;
239 +
240 +@@ -1380,12 +1431,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,
241 + if (!native_cmd)
242 + return;
243 +
244 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
245 +- (host->cs << 16) | ((addr >> 32) & 0xffff));
246 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
247 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, lower_32_bits(addr));
248 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
249 +-
250 ++ brcmnand_set_cmd_addr(mtd, addr);
251 + brcmnand_send_cmd(host, native_cmd);
252 + brcmnand_waitfunc(mtd, chip);
253 +
254 +@@ -1605,20 +1651,10 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,
255 + struct brcmnand_controller *ctrl = host->ctrl;
256 + int i, j, ret = 0;
257 +
258 +- /* Clear error addresses */
259 +- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
260 +- brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
261 +- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
262 +- brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
263 +-
264 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
265 +- (host->cs << 16) | ((addr >> 32) & 0xffff));
266 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
267 ++ brcmnand_clear_ecc_addr(ctrl);
268 +
269 + for (i = 0; i < trans; i++, addr += FC_BYTES) {
270 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
271 +- lower_32_bits(addr));
272 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
273 ++ brcmnand_set_cmd_addr(mtd, addr);
274 + /* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */
275 + brcmnand_send_cmd(host, CMD_PAGE_READ);
276 + brcmnand_waitfunc(mtd, chip);
277 +@@ -1637,22 +1673,16 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,
278 + mtd->oobsize / trans,
279 + host->hwcfg.sector_size_1k);
280 +
281 +- if (!ret) {
282 +- *err_addr = brcmnand_read_reg(ctrl,
283 +- BRCMNAND_UNCORR_ADDR) |
284 +- ((u64)(brcmnand_read_reg(ctrl,
285 +- BRCMNAND_UNCORR_EXT_ADDR)
286 +- & 0xffff) << 32);
287 ++ if (ret != -EBADMSG) {
288 ++ *err_addr = brcmnand_get_uncorrecc_addr(ctrl);
289 ++
290 + if (*err_addr)
291 + ret = -EBADMSG;
292 + }
293 +
294 + if (!ret) {
295 +- *err_addr = brcmnand_read_reg(ctrl,
296 +- BRCMNAND_CORR_ADDR) |
297 +- ((u64)(brcmnand_read_reg(ctrl,
298 +- BRCMNAND_CORR_EXT_ADDR)
299 +- & 0xffff) << 32);
300 ++ *err_addr = brcmnand_get_correcc_addr(ctrl);
301 ++
302 + if (*err_addr)
303 + ret = -EUCLEAN;
304 + }
305 +@@ -1723,7 +1753,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip,
306 + dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf);
307 +
308 + try_dmaread:
309 +- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_COUNT, 0);
310 ++ brcmnand_clear_ecc_addr(ctrl);
311 +
312 + if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) {
313 + err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES,
314 +@@ -1863,15 +1893,9 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip,
315 + goto out;
316 + }
317 +
318 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
319 +- (host->cs << 16) | ((addr >> 32) & 0xffff));
320 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
321 +-
322 + for (i = 0; i < trans; i++, addr += FC_BYTES) {
323 + /* full address MUST be set before populating FC */
324 +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
325 +- lower_32_bits(addr));
326 +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
327 ++ brcmnand_set_cmd_addr(mtd, addr);
328 +
329 + if (buf) {
330 + brcmnand_soc_data_bus_prepare(ctrl->soc, false);
331 +diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
332 +index 035923876c617..e3f814e83d9c8 100644
333 +--- a/drivers/net/bonding/bond_3ad.c
334 ++++ b/drivers/net/bonding/bond_3ad.c
335 +@@ -249,7 +249,7 @@ static inline int __check_agg_selection_timer(struct port *port)
336 + if (bond == NULL)
337 + return 0;
338 +
339 +- return BOND_AD_INFO(bond).agg_select_timer ? 1 : 0;
340 ++ return atomic_read(&BOND_AD_INFO(bond).agg_select_timer) ? 1 : 0;
341 + }
342 +
343 + /**
344 +@@ -1965,7 +1965,7 @@ static void ad_marker_response_received(struct bond_marker *marker,
345 + */
346 + void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout)
347 + {
348 +- BOND_AD_INFO(bond).agg_select_timer = timeout;
349 ++ atomic_set(&BOND_AD_INFO(bond).agg_select_timer, timeout);
350 + }
351 +
352 + /**
353 +@@ -2249,6 +2249,28 @@ void bond_3ad_update_ad_actor_settings(struct bonding *bond)
354 + spin_unlock_bh(&bond->mode_lock);
355 + }
356 +
357 ++/**
358 ++ * bond_agg_timer_advance - advance agg_select_timer
359 ++ * @bond: bonding structure
360 ++ *
361 ++ * Return true when agg_select_timer reaches 0.
362 ++ */
363 ++static bool bond_agg_timer_advance(struct bonding *bond)
364 ++{
365 ++ int val, nval;
366 ++
367 ++ while (1) {
368 ++ val = atomic_read(&BOND_AD_INFO(bond).agg_select_timer);
369 ++ if (!val)
370 ++ return false;
371 ++ nval = val - 1;
372 ++ if (atomic_cmpxchg(&BOND_AD_INFO(bond).agg_select_timer,
373 ++ val, nval) == val)
374 ++ break;
375 ++ }
376 ++ return nval == 0;
377 ++}
378 ++
379 + /**
380 + * bond_3ad_state_machine_handler - handle state machines timeout
381 + * @bond: bonding struct to work on
382 +@@ -2284,9 +2306,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
383 + if (!bond_has_slaves(bond))
384 + goto re_arm;
385 +
386 +- /* check if agg_select_timer timer after initialize is timed out */
387 +- if (BOND_AD_INFO(bond).agg_select_timer &&
388 +- !(--BOND_AD_INFO(bond).agg_select_timer)) {
389 ++ if (bond_agg_timer_advance(bond)) {
390 + slave = bond_first_slave_rcu(bond);
391 + port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL;
392 +
393 +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
394 +index b07ea8a26c20a..045ab0ec5ca25 100644
395 +--- a/drivers/net/ethernet/cadence/macb_main.c
396 ++++ b/drivers/net/ethernet/cadence/macb_main.c
397 +@@ -3528,7 +3528,7 @@ static int macb_probe(struct platform_device *pdev)
398 +
399 + #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
400 + if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) {
401 +- dma_set_mask(&pdev->dev, DMA_BIT_MASK(44));
402 ++ dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44));
403 + bp->hw_dma_cap |= HW_DMA_CAP_64B;
404 + }
405 + #endif
406 +diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c
407 +index 5c48bdb6f6787..c2667c71a0cd1 100644
408 +--- a/drivers/net/ieee802154/at86rf230.c
409 ++++ b/drivers/net/ieee802154/at86rf230.c
410 +@@ -108,6 +108,7 @@ struct at86rf230_local {
411 + unsigned long cal_timeout;
412 + bool is_tx;
413 + bool is_tx_from_off;
414 ++ bool was_tx;
415 + u8 tx_retry;
416 + struct sk_buff *tx_skb;
417 + struct at86rf230_state_change tx;
418 +@@ -351,7 +352,11 @@ at86rf230_async_error_recover_complete(void *context)
419 + if (ctx->free)
420 + kfree(ctx);
421 +
422 +- ieee802154_wake_queue(lp->hw);
423 ++ if (lp->was_tx) {
424 ++ lp->was_tx = 0;
425 ++ dev_kfree_skb_any(lp->tx_skb);
426 ++ ieee802154_wake_queue(lp->hw);
427 ++ }
428 + }
429 +
430 + static void
431 +@@ -360,7 +365,11 @@ at86rf230_async_error_recover(void *context)
432 + struct at86rf230_state_change *ctx = context;
433 + struct at86rf230_local *lp = ctx->lp;
434 +
435 +- lp->is_tx = 0;
436 ++ if (lp->is_tx) {
437 ++ lp->was_tx = 1;
438 ++ lp->is_tx = 0;
439 ++ }
440 ++
441 + at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON,
442 + at86rf230_async_error_recover_complete);
443 + }
444 +diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c
445 +index 893a5787d81d7..9a1352f3fa4cc 100644
446 +--- a/drivers/net/ieee802154/ca8210.c
447 ++++ b/drivers/net/ieee802154/ca8210.c
448 +@@ -2976,8 +2976,8 @@ static void ca8210_hw_setup(struct ieee802154_hw *ca8210_hw)
449 + ca8210_hw->phy->cca.opt = NL802154_CCA_OPT_ENERGY_CARRIER_AND;
450 + ca8210_hw->phy->cca_ed_level = -9800;
451 + ca8210_hw->phy->symbol_duration = 16;
452 +- ca8210_hw->phy->lifs_period = 40;
453 +- ca8210_hw->phy->sifs_period = 12;
454 ++ ca8210_hw->phy->lifs_period = 40 * ca8210_hw->phy->symbol_duration;
455 ++ ca8210_hw->phy->sifs_period = 12 * ca8210_hw->phy->symbol_duration;
456 + ca8210_hw->flags =
457 + IEEE802154_HW_AFILT |
458 + IEEE802154_HW_OMIT_CKSUM |
459 +diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
460 +index 8a7f2fdc69391..03153c30a8210 100644
461 +--- a/drivers/net/usb/ax88179_178a.c
462 ++++ b/drivers/net/usb/ax88179_178a.c
463 +@@ -1373,59 +1373,69 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
464 + u16 hdr_off;
465 + u32 *pkt_hdr;
466 +
467 +- /* This check is no longer done by usbnet */
468 +- if (skb->len < dev->net->hard_header_len)
469 ++ /* At the end of the SKB, there's a header telling us how many packets
470 ++ * are bundled into this buffer and where we can find an array of
471 ++ * per-packet metadata (which contains elements encoded into u16).
472 ++ */
473 ++ if (skb->len < 4)
474 + return 0;
475 +-
476 + skb_trim(skb, skb->len - 4);
477 + memcpy(&rx_hdr, skb_tail_pointer(skb), 4);
478 + le32_to_cpus(&rx_hdr);
479 +-
480 + pkt_cnt = (u16)rx_hdr;
481 + hdr_off = (u16)(rx_hdr >> 16);
482 ++
483 ++ if (pkt_cnt == 0)
484 ++ return 0;
485 ++
486 ++ /* Make sure that the bounds of the metadata array are inside the SKB
487 ++ * (and in front of the counter at the end).
488 ++ */
489 ++ if (pkt_cnt * 2 + hdr_off > skb->len)
490 ++ return 0;
491 + pkt_hdr = (u32 *)(skb->data + hdr_off);
492 +
493 +- while (pkt_cnt--) {
494 ++ /* Packets must not overlap the metadata array */
495 ++ skb_trim(skb, hdr_off);
496 ++
497 ++ for (; ; pkt_cnt--, pkt_hdr++) {
498 + u16 pkt_len;
499 +
500 + le32_to_cpus(pkt_hdr);
501 + pkt_len = (*pkt_hdr >> 16) & 0x1fff;
502 +
503 +- /* Check CRC or runt packet */
504 +- if ((*pkt_hdr & AX_RXHDR_CRC_ERR) ||
505 +- (*pkt_hdr & AX_RXHDR_DROP_ERR)) {
506 +- skb_pull(skb, (pkt_len + 7) & 0xFFF8);
507 +- pkt_hdr++;
508 +- continue;
509 +- }
510 +-
511 +- if (pkt_cnt == 0) {
512 +- skb->len = pkt_len;
513 +- /* Skip IP alignment pseudo header */
514 +- skb_pull(skb, 2);
515 +- skb_set_tail_pointer(skb, skb->len);
516 +- skb->truesize = pkt_len + sizeof(struct sk_buff);
517 +- ax88179_rx_checksum(skb, pkt_hdr);
518 +- return 1;
519 +- }
520 ++ if (pkt_len > skb->len)
521 ++ return 0;
522 +
523 +- ax_skb = skb_clone(skb, GFP_ATOMIC);
524 +- if (ax_skb) {
525 ++ /* Check CRC or runt packet */
526 ++ if (((*pkt_hdr & (AX_RXHDR_CRC_ERR | AX_RXHDR_DROP_ERR)) == 0) &&
527 ++ pkt_len >= 2 + ETH_HLEN) {
528 ++ bool last = (pkt_cnt == 0);
529 ++
530 ++ if (last) {
531 ++ ax_skb = skb;
532 ++ } else {
533 ++ ax_skb = skb_clone(skb, GFP_ATOMIC);
534 ++ if (!ax_skb)
535 ++ return 0;
536 ++ }
537 + ax_skb->len = pkt_len;
538 + /* Skip IP alignment pseudo header */
539 + skb_pull(ax_skb, 2);
540 + skb_set_tail_pointer(ax_skb, ax_skb->len);
541 + ax_skb->truesize = pkt_len + sizeof(struct sk_buff);
542 + ax88179_rx_checksum(ax_skb, pkt_hdr);
543 ++
544 ++ if (last)
545 ++ return 1;
546 ++
547 + usbnet_skb_return(dev, ax_skb);
548 +- } else {
549 +- return 0;
550 + }
551 +
552 +- skb_pull(skb, (pkt_len + 7) & 0xFFF8);
553 +- pkt_hdr++;
554 ++ /* Trim this packet away from the SKB */
555 ++ if (!skb_pull(skb, (pkt_len + 7) & 0xFFF8))
556 ++ return 0;
557 + }
558 +- return 1;
559 + }
560 +
561 + static struct sk_buff *
562 +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
563 +index 928219ab09128..e8d57954596d2 100644
564 +--- a/drivers/net/usb/qmi_wwan.c
565 ++++ b/drivers/net/usb/qmi_wwan.c
566 +@@ -1347,6 +1347,8 @@ static const struct usb_device_id products[] = {
567 + {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */
568 + {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */
569 + {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/
570 ++ {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/
571 ++ {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */
572 + {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */
573 + {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */
574 + {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
575 +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
576 +index ade3c27050471..9cadfedf8c776 100644
577 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
578 ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
579 +@@ -1511,6 +1511,8 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
580 + out_unbind:
581 + complete(&drv->request_firmware_complete);
582 + device_release_driver(drv->trans->dev);
583 ++ /* drv has just been freed by the release */
584 ++ failure = false;
585 + free:
586 + if (failure)
587 + iwl_dealloc_ucode(drv);
588 +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
589 +index ac05fd1e74c4c..1c3635be6a2d4 100644
590 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
591 ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
592 +@@ -292,8 +292,7 @@ int iwl_trans_pcie_gen2_start_fw(struct iwl_trans *trans,
593 + /* This may fail if AMT took ownership of the device */
594 + if (iwl_pcie_prepare_card_hw(trans)) {
595 + IWL_WARN(trans, "Exit HW not ready\n");
596 +- ret = -EIO;
597 +- goto out;
598 ++ return -EIO;
599 + }
600 +
601 + iwl_enable_rfkill_int(trans);
602 +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
603 +index 7bfddce582ad6..4d3cbe554f5bf 100644
604 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
605 ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
606 +@@ -1240,8 +1240,7 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
607 + /* This may fail if AMT took ownership of the device */
608 + if (iwl_pcie_prepare_card_hw(trans)) {
609 + IWL_WARN(trans, "Exit HW not ready\n");
610 +- ret = -EIO;
611 +- goto out;
612 ++ return -EIO;
613 + }
614 +
615 + iwl_enable_rfkill_int(trans);
616 +diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c
617 +index d7649a70a0c45..224a364097672 100644
618 +--- a/drivers/parisc/ccio-dma.c
619 ++++ b/drivers/parisc/ccio-dma.c
620 +@@ -1010,7 +1010,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
621 + ioc->usg_calls++;
622 + #endif
623 +
624 +- while(sg_dma_len(sglist) && nents--) {
625 ++ while (nents && sg_dma_len(sglist)) {
626 +
627 + #ifdef CCIO_COLLECT_STATS
628 + ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT;
629 +@@ -1018,6 +1018,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
630 + ccio_unmap_page(dev, sg_dma_address(sglist),
631 + sg_dma_len(sglist), direction, 0);
632 + ++sglist;
633 ++ nents--;
634 + }
635 +
636 + DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents);
637 +diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c
638 +index 55b3274328eb8..0ad2f32b91dc2 100644
639 +--- a/drivers/parisc/sba_iommu.c
640 ++++ b/drivers/parisc/sba_iommu.c
641 +@@ -1063,7 +1063,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
642 + spin_unlock_irqrestore(&ioc->res_lock, flags);
643 + #endif
644 +
645 +- while (sg_dma_len(sglist) && nents--) {
646 ++ while (nents && sg_dma_len(sglist)) {
647 +
648 + sba_unmap_page(dev, sg_dma_address(sglist), sg_dma_len(sglist),
649 + direction, 0);
650 +@@ -1072,6 +1072,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
651 + ioc->usingle_calls--; /* kluge since call is unmap_sg() */
652 + #endif
653 + ++sglist;
654 ++ nents--;
655 + }
656 +
657 + DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents);
658 +diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c
659 +index df2931e1e0868..68ee0c543971f 100644
660 +--- a/drivers/tty/serial/8250/8250_gsc.c
661 ++++ b/drivers/tty/serial/8250/8250_gsc.c
662 +@@ -30,7 +30,7 @@ static int __init serial_init_chip(struct parisc_device *dev)
663 + unsigned long address;
664 + int err;
665 +
666 +-#ifdef CONFIG_64BIT
667 ++#if defined(CONFIG_64BIT) && defined(CONFIG_IOSAPIC)
668 + if (!dev->irq && (dev->id.sversion == 0xad))
669 + dev->irq = iosapic_serial_irq(dev);
670 + #endif
671 +diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
672 +index ad570c3b6a0bb..efab9446eac87 100644
673 +--- a/fs/btrfs/send.c
674 ++++ b/fs/btrfs/send.c
675 +@@ -4944,6 +4944,10 @@ static ssize_t fill_read_buf(struct send_ctx *sctx, u64 offset, u32 len)
676 + lock_page(page);
677 + if (!PageUptodate(page)) {
678 + unlock_page(page);
679 ++ btrfs_err(fs_info,
680 ++ "send: IO error at offset %llu for inode %llu root %llu",
681 ++ page_offset(page), sctx->cur_ino,
682 ++ sctx->send_root->root_key.objectid);
683 + put_page(page);
684 + ret = -EIO;
685 + break;
686 +diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
687 +index c3ae37036b9d1..c702bcad59e39 100644
688 +--- a/fs/nfs/dir.c
689 ++++ b/fs/nfs/dir.c
690 +@@ -1610,14 +1610,14 @@ no_open:
691 + if (!res) {
692 + inode = d_inode(dentry);
693 + if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
694 +- !S_ISDIR(inode->i_mode))
695 ++ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
696 + res = ERR_PTR(-ENOTDIR);
697 + else if (inode && S_ISREG(inode->i_mode))
698 + res = ERR_PTR(-EOPENSTALE);
699 + } else if (!IS_ERR(res)) {
700 + inode = d_inode(res);
701 + if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
702 +- !S_ISDIR(inode->i_mode)) {
703 ++ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) {
704 + dput(res);
705 + res = ERR_PTR(-ENOTDIR);
706 + } else if (inode && S_ISREG(inode->i_mode)) {
707 +diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
708 +index ad01d4fb795ee..ac836e202ff78 100644
709 +--- a/fs/nfs/inode.c
710 ++++ b/fs/nfs/inode.c
711 +@@ -740,11 +740,8 @@ int nfs_getattr(const struct path *path, struct kstat *stat,
712 +
713 + trace_nfs_getattr_enter(inode);
714 + /* Flush out writes to the server in order to update c/mtime. */
715 +- if (S_ISREG(inode->i_mode)) {
716 +- err = filemap_write_and_wait(inode->i_mapping);
717 +- if (err)
718 +- goto out;
719 +- }
720 ++ if (S_ISREG(inode->i_mode))
721 ++ filemap_write_and_wait(inode->i_mapping);
722 +
723 + /*
724 + * We may force a getattr if the user cares about atime.
725 +@@ -775,7 +772,7 @@ int nfs_getattr(const struct path *path, struct kstat *stat,
726 + if (S_ISDIR(inode->i_mode))
727 + stat->blksize = NFS_SERVER(inode)->dtsize;
728 + }
729 +-out:
730 ++
731 + trace_nfs_getattr_exit(inode, err);
732 + return err;
733 + }
734 +diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
735 +index 30f5da8f4affa..7c364cda8daac 100644
736 +--- a/fs/quota/dquot.c
737 ++++ b/fs/quota/dquot.c
738 +@@ -680,9 +680,14 @@ int dquot_quota_sync(struct super_block *sb, int type)
739 + /* This is not very clever (and fast) but currently I don't know about
740 + * any other simple way of getting quota data to disk and we must get
741 + * them there for userspace to be visible... */
742 +- if (sb->s_op->sync_fs)
743 +- sb->s_op->sync_fs(sb, 1);
744 +- sync_blockdev(sb->s_bdev);
745 ++ if (sb->s_op->sync_fs) {
746 ++ ret = sb->s_op->sync_fs(sb, 1);
747 ++ if (ret)
748 ++ return ret;
749 ++ }
750 ++ ret = sync_blockdev(sb->s_bdev);
751 ++ if (ret)
752 ++ return ret;
753 +
754 + /*
755 + * Now when everything is written we can discard the pagecache so
756 +diff --git a/fs/super.c b/fs/super.c
757 +index 1d7461bca1600..819a33e79a011 100644
758 +--- a/fs/super.c
759 ++++ b/fs/super.c
760 +@@ -1380,11 +1380,9 @@ static void lockdep_sb_freeze_acquire(struct super_block *sb)
761 + percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_);
762 + }
763 +
764 +-static void sb_freeze_unlock(struct super_block *sb)
765 ++static void sb_freeze_unlock(struct super_block *sb, int level)
766 + {
767 +- int level;
768 +-
769 +- for (level = SB_FREEZE_LEVELS - 1; level >= 0; level--)
770 ++ for (level--; level >= 0; level--)
771 + percpu_up_write(sb->s_writers.rw_sem + level);
772 + }
773 +
774 +@@ -1455,7 +1453,14 @@ int freeze_super(struct super_block *sb)
775 + sb_wait_write(sb, SB_FREEZE_PAGEFAULT);
776 +
777 + /* All writers are done so after syncing there won't be dirty data */
778 +- sync_filesystem(sb);
779 ++ ret = sync_filesystem(sb);
780 ++ if (ret) {
781 ++ sb->s_writers.frozen = SB_UNFROZEN;
782 ++ sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT);
783 ++ wake_up(&sb->s_writers.wait_unfrozen);
784 ++ deactivate_locked_super(sb);
785 ++ return ret;
786 ++ }
787 +
788 + /* Now wait for internal filesystem counter */
789 + sb->s_writers.frozen = SB_FREEZE_FS;
790 +@@ -1467,7 +1472,7 @@ int freeze_super(struct super_block *sb)
791 + printk(KERN_ERR
792 + "VFS:Filesystem freeze failed\n");
793 + sb->s_writers.frozen = SB_UNFROZEN;
794 +- sb_freeze_unlock(sb);
795 ++ sb_freeze_unlock(sb, SB_FREEZE_FS);
796 + wake_up(&sb->s_writers.wait_unfrozen);
797 + deactivate_locked_super(sb);
798 + return ret;
799 +@@ -1519,7 +1524,7 @@ int thaw_super(struct super_block *sb)
800 + }
801 +
802 + sb->s_writers.frozen = SB_UNFROZEN;
803 +- sb_freeze_unlock(sb);
804 ++ sb_freeze_unlock(sb, SB_FREEZE_FS);
805 + out:
806 + wake_up(&sb->s_writers.wait_unfrozen);
807 + deactivate_locked_super(sb);
808 +diff --git a/include/linux/sched.h b/include/linux/sched.h
809 +index 914cc8b180eda..63522a384f5aa 100644
810 +--- a/include/linux/sched.h
811 ++++ b/include/linux/sched.h
812 +@@ -1346,7 +1346,6 @@ extern struct pid *cad_pid;
813 + #define PF_MEMALLOC 0x00000800 /* Allocating memory */
814 + #define PF_NPROC_EXCEEDED 0x00001000 /* set_user() noticed that RLIMIT_NPROC was exceeded */
815 + #define PF_USED_MATH 0x00002000 /* If unset the fpu must be initialized before use */
816 +-#define PF_USED_ASYNC 0x00004000 /* Used async_schedule*(), used by module init */
817 + #define PF_NOFREEZE 0x00008000 /* This thread should not be frozen */
818 + #define PF_FROZEN 0x00010000 /* Frozen for system suspend */
819 + #define PF_KSWAPD 0x00020000 /* I am kswapd */
820 +diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h
821 +index f358ad5e42145..a353814dee901 100644
822 +--- a/include/net/bond_3ad.h
823 ++++ b/include/net/bond_3ad.h
824 +@@ -265,7 +265,7 @@ struct ad_system {
825 +
826 + struct ad_bond_info {
827 + struct ad_system system; /* 802.3ad system structure */
828 +- u32 agg_select_timer; /* Timer to select aggregator after all adapter's hand shakes */
829 ++ atomic_t agg_select_timer; /* Timer to select aggregator after all adapter's hand shakes */
830 + u16 aggregator_identifier;
831 + };
832 +
833 +diff --git a/kernel/async.c b/kernel/async.c
834 +index a893d6170944f..4bf1b00a28d86 100644
835 +--- a/kernel/async.c
836 ++++ b/kernel/async.c
837 +@@ -191,9 +191,6 @@ static async_cookie_t __async_schedule(async_func_t func, void *data, struct asy
838 + atomic_inc(&entry_count);
839 + spin_unlock_irqrestore(&async_lock, flags);
840 +
841 +- /* mark that this task has queued an async job, used by module init */
842 +- current->flags |= PF_USED_ASYNC;
843 +-
844 + /* schedule for execution */
845 + queue_work(system_unbound_wq, &entry->work);
846 +
847 +diff --git a/kernel/module.c b/kernel/module.c
848 +index e962096672636..8404b41be7c6f 100644
849 +--- a/kernel/module.c
850 ++++ b/kernel/module.c
851 +@@ -3499,12 +3499,6 @@ static noinline int do_init_module(struct module *mod)
852 + }
853 + freeinit->module_init = mod->init_layout.base;
854 +
855 +- /*
856 +- * We want to find out whether @mod uses async during init. Clear
857 +- * PF_USED_ASYNC. async_schedule*() will set it.
858 +- */
859 +- current->flags &= ~PF_USED_ASYNC;
860 +-
861 + do_mod_ctors(mod);
862 + /* Start the module */
863 + if (mod->init != NULL)
864 +@@ -3530,22 +3524,13 @@ static noinline int do_init_module(struct module *mod)
865 +
866 + /*
867 + * We need to finish all async code before the module init sequence
868 +- * is done. This has potential to deadlock. For example, a newly
869 +- * detected block device can trigger request_module() of the
870 +- * default iosched from async probing task. Once userland helper
871 +- * reaches here, async_synchronize_full() will wait on the async
872 +- * task waiting on request_module() and deadlock.
873 +- *
874 +- * This deadlock is avoided by perfomring async_synchronize_full()
875 +- * iff module init queued any async jobs. This isn't a full
876 +- * solution as it will deadlock the same if module loading from
877 +- * async jobs nests more than once; however, due to the various
878 +- * constraints, this hack seems to be the best option for now.
879 +- * Please refer to the following thread for details.
880 ++ * is done. This has potential to deadlock if synchronous module
881 ++ * loading is requested from async (which is not allowed!).
882 + *
883 +- * http://thread.gmane.org/gmane.linux.kernel/1420814
884 ++ * See commit 0fdff3ec6d87 ("async, kmod: warn on synchronous
885 ++ * request_module() from async workers") for more details.
886 + */
887 +- if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC))
888 ++ if (!mod->async_probe_requested)
889 + async_synchronize_full();
890 +
891 + mutex_lock(&module_mutex);
892 +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
893 +index fd8e1ec39c270..c1da2a4a629a1 100644
894 +--- a/kernel/trace/trace.c
895 ++++ b/kernel/trace/trace.c
896 +@@ -230,6 +230,10 @@ __setup("trace_clock=", set_trace_boot_clock);
897 +
898 + static int __init set_tracepoint_printk(char *str)
899 + {
900 ++ /* Ignore the "tp_printk_stop_on_boot" param */
901 ++ if (*str == '_')
902 ++ return 0;
903 ++
904 + if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0))
905 + tracepoint_printk = 1;
906 + return 1;
907 +diff --git a/kernel/tsacct.c b/kernel/tsacct.c
908 +index 370724b453918..8d7c6d3f1daa7 100644
909 +--- a/kernel/tsacct.c
910 ++++ b/kernel/tsacct.c
911 +@@ -46,11 +46,10 @@ void bacct_add_tsk(struct user_namespace *user_ns,
912 + /* Convert to seconds for btime */
913 + do_div(delta, USEC_PER_SEC);
914 + stats->ac_btime = get_seconds() - delta;
915 +- if (thread_group_leader(tsk)) {
916 ++ if (tsk->flags & PF_EXITING)
917 + stats->ac_exitcode = tsk->exit_code;
918 +- if (tsk->flags & PF_FORKNOEXEC)
919 +- stats->ac_flag |= AFORK;
920 +- }
921 ++ if (thread_group_leader(tsk) && (tsk->flags & PF_FORKNOEXEC))
922 ++ stats->ac_flag |= AFORK;
923 + if (tsk->flags & PF_SUPERPRIV)
924 + stats->ac_flag |= ASU;
925 + if (tsk->flags & PF_DUMPCORE)
926 +diff --git a/lib/iov_iter.c b/lib/iov_iter.c
927 +index 9bdc797ef2571..ffa90d4c098e5 100644
928 +--- a/lib/iov_iter.c
929 ++++ b/lib/iov_iter.c
930 +@@ -393,6 +393,7 @@ static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t by
931 + return 0;
932 + pipe->nrbufs++;
933 + buf->ops = &page_cache_pipe_buf_ops;
934 ++ buf->flags = 0;
935 + get_page(buf->page = page);
936 + buf->offset = offset;
937 + buf->len = bytes;
938 +@@ -517,6 +518,7 @@ static size_t push_pipe(struct iov_iter *i, size_t size,
939 + break;
940 + pipe->nrbufs++;
941 + pipe->bufs[idx].ops = &default_pipe_buf_ops;
942 ++ pipe->bufs[idx].flags = 0;
943 + pipe->bufs[idx].page = page;
944 + pipe->bufs[idx].offset = 0;
945 + if (left <= PAGE_SIZE) {
946 +diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
947 +index 0232afd9d9c3c..36d2e1dfa1e6b 100644
948 +--- a/net/ax25/af_ax25.c
949 ++++ b/net/ax25/af_ax25.c
950 +@@ -80,6 +80,7 @@ static void ax25_kill_by_device(struct net_device *dev)
951 + {
952 + ax25_dev *ax25_dev;
953 + ax25_cb *s;
954 ++ struct sock *sk;
955 +
956 + if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
957 + return;
958 +@@ -88,13 +89,15 @@ static void ax25_kill_by_device(struct net_device *dev)
959 + again:
960 + ax25_for_each(s, &ax25_list) {
961 + if (s->ax25_dev == ax25_dev) {
962 ++ sk = s->sk;
963 ++ sock_hold(sk);
964 + spin_unlock_bh(&ax25_list_lock);
965 +- lock_sock(s->sk);
966 ++ lock_sock(sk);
967 + s->ax25_dev = NULL;
968 +- release_sock(s->sk);
969 ++ release_sock(sk);
970 + ax25_disconnect(s, ENETUNREACH);
971 + spin_lock_bh(&ax25_list_lock);
972 +-
973 ++ sock_put(sk);
974 + /* The entry could have been deleted from the
975 + * list meanwhile and thus the next pointer is
976 + * no longer valid. Play it safe and restart
977 +diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
978 +index ef9fe5f95093b..006b7d72aea7b 100644
979 +--- a/net/core/drop_monitor.c
980 ++++ b/net/core/drop_monitor.c
981 +@@ -219,13 +219,17 @@ static void trace_napi_poll_hit(void *ignore, struct napi_struct *napi,
982 +
983 + rcu_read_lock();
984 + list_for_each_entry_rcu(new_stat, &hw_stats_list, list) {
985 ++ struct net_device *dev;
986 ++
987 + /*
988 + * only add a note to our monitor buffer if:
989 + * 1) this is the dev we received on
990 + * 2) its after the last_rx delta
991 + * 3) our rx_dropped count has gone up
992 + */
993 +- if ((new_stat->dev == napi->dev) &&
994 ++ /* Paired with WRITE_ONCE() in dropmon_net_event() */
995 ++ dev = READ_ONCE(new_stat->dev);
996 ++ if ((dev == napi->dev) &&
997 + (time_after(jiffies, new_stat->last_rx + dm_hw_check_delta)) &&
998 + (napi->dev->stats.rx_dropped != new_stat->last_drop_val)) {
999 + trace_drop_common(NULL, NULL);
1000 +@@ -340,7 +344,10 @@ static int dropmon_net_event(struct notifier_block *ev_block,
1001 + mutex_lock(&trace_state_mutex);
1002 + list_for_each_entry_safe(new_stat, tmp, &hw_stats_list, list) {
1003 + if (new_stat->dev == dev) {
1004 +- new_stat->dev = NULL;
1005 ++
1006 ++ /* Paired with READ_ONCE() in trace_napi_poll_hit() */
1007 ++ WRITE_ONCE(new_stat->dev, NULL);
1008 ++
1009 + if (trace_state == TRACE_OFF) {
1010 + list_del_rcu(&new_stat->list);
1011 + kfree_rcu(new_stat, rcu);
1012 +diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
1013 +index bfd0ab9d3b578..1ee488a539363 100644
1014 +--- a/net/ipv4/ping.c
1015 ++++ b/net/ipv4/ping.c
1016 +@@ -177,16 +177,23 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident)
1017 + struct sock *sk = NULL;
1018 + struct inet_sock *isk;
1019 + struct hlist_nulls_node *hnode;
1020 +- int dif = skb->dev->ifindex;
1021 ++ int dif, sdif;
1022 +
1023 + if (skb->protocol == htons(ETH_P_IP)) {
1024 ++ dif = inet_iif(skb);
1025 ++ sdif = inet_sdif(skb);
1026 + pr_debug("try to find: num = %d, daddr = %pI4, dif = %d\n",
1027 + (int)ident, &ip_hdr(skb)->daddr, dif);
1028 + #if IS_ENABLED(CONFIG_IPV6)
1029 + } else if (skb->protocol == htons(ETH_P_IPV6)) {
1030 ++ dif = inet6_iif(skb);
1031 ++ sdif = inet6_sdif(skb);
1032 + pr_debug("try to find: num = %d, daddr = %pI6c, dif = %d\n",
1033 + (int)ident, &ipv6_hdr(skb)->daddr, dif);
1034 + #endif
1035 ++ } else {
1036 ++ pr_err("ping: protocol(%x) is not supported\n", ntohs(skb->protocol));
1037 ++ return NULL;
1038 + }
1039 +
1040 + read_lock_bh(&ping_table.lock);
1041 +@@ -226,7 +233,7 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident)
1042 + }
1043 +
1044 + if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif &&
1045 +- sk->sk_bound_dev_if != inet_sdif(skb))
1046 ++ sk->sk_bound_dev_if != sdif)
1047 + continue;
1048 +
1049 + sock_hold(sk);
1050 +diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
1051 +index 08f00225ed1b9..368e5a33d073a 100644
1052 +--- a/net/ipv4/xfrm4_policy.c
1053 ++++ b/net/ipv4/xfrm4_policy.c
1054 +@@ -17,6 +17,7 @@
1055 + #include <net/xfrm.h>
1056 + #include <net/ip.h>
1057 + #include <net/l3mdev.h>
1058 ++#include <net/inet_ecn.h>
1059 +
1060 + static struct dst_entry *__xfrm4_dst_lookup(struct net *net, struct flowi4 *fl4,
1061 + int tos, int oif,
1062 +@@ -126,7 +127,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
1063 + fl4->flowi4_proto = iph->protocol;
1064 + fl4->daddr = reverse ? iph->saddr : iph->daddr;
1065 + fl4->saddr = reverse ? iph->daddr : iph->saddr;
1066 +- fl4->flowi4_tos = iph->tos;
1067 ++ fl4->flowi4_tos = iph->tos & ~INET_ECN_MASK;
1068 +
1069 + if (!ip_is_fragment(iph)) {
1070 + switch (iph->protocol) {
1071 +diff --git a/net/sched/act_api.c b/net/sched/act_api.c
1072 +index 8ae0addb76576..a6a9306048602 100644
1073 +--- a/net/sched/act_api.c
1074 ++++ b/net/sched/act_api.c
1075 +@@ -482,15 +482,24 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions,
1076 + restart_act_graph:
1077 + for (i = 0; i < nr_actions; i++) {
1078 + const struct tc_action *a = actions[i];
1079 ++ int repeat_ttl;
1080 +
1081 + if (jmp_prgcnt > 0) {
1082 + jmp_prgcnt -= 1;
1083 + continue;
1084 + }
1085 ++
1086 ++ repeat_ttl = 32;
1087 + repeat:
1088 + ret = a->ops->act(skb, a, res);
1089 +- if (ret == TC_ACT_REPEAT)
1090 +- goto repeat; /* we need a ttl - JHS */
1091 ++
1092 ++ if (unlikely(ret == TC_ACT_REPEAT)) {
1093 ++ if (--repeat_ttl != 0)
1094 ++ goto repeat;
1095 ++ /* suspicious opcode, stop pipeline */
1096 ++ net_warn_ratelimited("TC_ACT_REPEAT abuse ?\n");
1097 ++ return TC_ACT_OK;
1098 ++ }
1099 +
1100 + if (TC_ACT_EXT_CMP(ret, TC_ACT_JUMP)) {
1101 + jmp_prgcnt = ret & TCA_ACT_MAX_PRIO_MASK;
1102 +diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
1103 +index 8b211d164beea..b14e96b6831dc 100644
1104 +--- a/net/vmw_vsock/af_vsock.c
1105 ++++ b/net/vmw_vsock/af_vsock.c
1106 +@@ -1237,6 +1237,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
1107 + sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE;
1108 + sock->state = SS_UNCONNECTED;
1109 + vsock_transport_cancel_pkt(vsk);
1110 ++ vsock_remove_connected(vsk);
1111 + goto out_wait;
1112 + } else if (timeout == 0) {
1113 + err = -ETIMEDOUT;
1114 +diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
1115 +index 486e135d3e30a..65df6141397fe 100644
1116 +--- a/scripts/Makefile.extrawarn
1117 ++++ b/scripts/Makefile.extrawarn
1118 +@@ -73,5 +73,6 @@ KBUILD_CFLAGS += $(call cc-disable-warning, sign-compare)
1119 + KBUILD_CFLAGS += $(call cc-disable-warning, format-zero-length)
1120 + KBUILD_CFLAGS += $(call cc-disable-warning, uninitialized)
1121 + KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast)
1122 ++KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access)
1123 + endif
1124 + endif
1125 +diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
1126 +index de090a3d2b384..2a3090ab80cfe 100644
1127 +--- a/sound/pci/hda/hda_intel.c
1128 ++++ b/sound/pci/hda/hda_intel.c
1129 +@@ -1636,6 +1636,7 @@ static struct snd_pci_quirk probe_mask_list[] = {
1130 + /* forced codec slots */
1131 + SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
1132 + SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
1133 ++ SND_PCI_QUIRK(0x1558, 0x0351, "Schenker Dock 15", 0x105),
1134 + /* WinFast VP200 H (Teradici) user reported broken communication */
1135 + SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
1136 + {}
1137 +@@ -1821,8 +1822,6 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci,
1138 +
1139 + assign_position_fix(chip, check_position_fix(chip, position_fix[dev]));
1140 +
1141 +- check_probe_mask(chip, dev);
1142 +-
1143 + if (single_cmd < 0) /* allow fallback to single_cmd at errors */
1144 + chip->fallback_to_single_cmd = 1;
1145 + else /* explicitly set to single_cmd or not */
1146 +@@ -1851,6 +1850,8 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci,
1147 + chip->bus.needs_damn_long_delay = 1;
1148 + }
1149 +
1150 ++ check_probe_mask(chip, dev);
1151 ++
1152 + err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
1153 + if (err < 0) {
1154 + dev_err(card->dev, "Error creating device [card]!\n");
1155 +diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c
1156 +index e1c897ad0fe5f..76bd264ee88dd 100644
1157 +--- a/sound/soc/soc-ops.c
1158 ++++ b/sound/soc/soc-ops.c
1159 +@@ -319,7 +319,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
1160 + unsigned int sign_bit = mc->sign_bit;
1161 + unsigned int mask = (1 << fls(max)) - 1;
1162 + unsigned int invert = mc->invert;
1163 +- int err;
1164 ++ int err, ret;
1165 + bool type_2r = false;
1166 + unsigned int val2 = 0;
1167 + unsigned int val, val_mask;
1168 +@@ -361,12 +361,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
1169 + err = snd_soc_component_update_bits(component, reg, val_mask, val);
1170 + if (err < 0)
1171 + return err;
1172 ++ ret = err;
1173 +
1174 +- if (type_2r)
1175 ++ if (type_2r) {
1176 + err = snd_soc_component_update_bits(component, reg2, val_mask,
1177 +- val2);
1178 ++ val2);
1179 ++ /* Don't discard any error code or drop change flag */
1180 ++ if (ret == 0 || err < 0) {
1181 ++ ret = err;
1182 ++ }
1183 ++ }
1184 +
1185 +- return err;
1186 ++ return ret;
1187 + }
1188 + EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
1189 +
1190 +@@ -522,7 +528,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
1191 + unsigned int mask = (1 << fls(max)) - 1;
1192 + unsigned int invert = mc->invert;
1193 + unsigned int val, val_mask;
1194 +- int ret;
1195 ++ int err, ret;
1196 +
1197 + if (invert)
1198 + val = (max - ucontrol->value.integer.value[0]) & mask;
1199 +@@ -531,9 +537,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
1200 + val_mask = mask << shift;
1201 + val = val << shift;
1202 +
1203 +- ret = snd_soc_component_update_bits(component, reg, val_mask, val);
1204 +- if (ret < 0)
1205 +- return ret;
1206 ++ err = snd_soc_component_update_bits(component, reg, val_mask, val);
1207 ++ if (err < 0)
1208 ++ return err;
1209 ++ ret = err;
1210 +
1211 + if (snd_soc_volsw_is_stereo(mc)) {
1212 + if (invert)
1213 +@@ -543,8 +550,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
1214 + val_mask = mask << shift;
1215 + val = val << shift;
1216 +
1217 +- ret = snd_soc_component_update_bits(component, rreg, val_mask,
1218 ++ err = snd_soc_component_update_bits(component, rreg, val_mask,
1219 + val);
1220 ++ /* Don't discard any error code or drop change flag */
1221 ++ if (ret == 0 || err < 0) {
1222 ++ ret = err;
1223 ++ }
1224 + }
1225 +
1226 + return ret;
1227 +diff --git a/tools/lib/subcmd/subcmd-util.h b/tools/lib/subcmd/subcmd-util.h
1228 +index 794a375dad360..b2aec04fce8f6 100644
1229 +--- a/tools/lib/subcmd/subcmd-util.h
1230 ++++ b/tools/lib/subcmd/subcmd-util.h
1231 +@@ -50,15 +50,8 @@ static NORETURN inline void die(const char *err, ...)
1232 + static inline void *xrealloc(void *ptr, size_t size)
1233 + {
1234 + void *ret = realloc(ptr, size);
1235 +- if (!ret && !size)
1236 +- ret = realloc(ptr, 1);
1237 +- if (!ret) {
1238 +- ret = realloc(ptr, size);
1239 +- if (!ret && !size)
1240 +- ret = realloc(ptr, 1);
1241 +- if (!ret)
1242 +- die("Out of memory, realloc failed");
1243 +- }
1244 ++ if (!ret)
1245 ++ die("Out of memory, realloc failed");
1246 + return ret;
1247 + }
1248 +
1249 +diff --git a/tools/testing/selftests/zram/zram.sh b/tools/testing/selftests/zram/zram.sh
1250 +index 232e958ec4547..b0b91d9b0dc21 100755
1251 +--- a/tools/testing/selftests/zram/zram.sh
1252 ++++ b/tools/testing/selftests/zram/zram.sh
1253 +@@ -2,9 +2,6 @@
1254 + # SPDX-License-Identifier: GPL-2.0
1255 + TCID="zram.sh"
1256 +
1257 +-# Kselftest framework requirement - SKIP code is 4.
1258 +-ksft_skip=4
1259 +-
1260 + . ./zram_lib.sh
1261 +
1262 + run_zram () {
1263 +@@ -18,14 +15,4 @@ echo ""
1264 +
1265 + check_prereqs
1266 +
1267 +-# check zram module exists
1268 +-MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko
1269 +-if [ -f $MODULE_PATH ]; then
1270 +- run_zram
1271 +-elif [ -b /dev/zram0 ]; then
1272 +- run_zram
1273 +-else
1274 +- echo "$TCID : No zram.ko module or /dev/zram0 device file not found"
1275 +- echo "$TCID : CONFIG_ZRAM is not set"
1276 +- exit $ksft_skip
1277 +-fi
1278 ++run_zram
1279 +diff --git a/tools/testing/selftests/zram/zram01.sh b/tools/testing/selftests/zram/zram01.sh
1280 +index b9566a6478a9c..8abc9965089d1 100755
1281 +--- a/tools/testing/selftests/zram/zram01.sh
1282 ++++ b/tools/testing/selftests/zram/zram01.sh
1283 +@@ -42,9 +42,7 @@ zram_algs="lzo"
1284 +
1285 + zram_fill_fs()
1286 + {
1287 +- local mem_free0=$(free -m | awk 'NR==2 {print $4}')
1288 +-
1289 +- for i in $(seq 0 $(($dev_num - 1))); do
1290 ++ for i in $(seq $dev_start $dev_end); do
1291 + echo "fill zram$i..."
1292 + local b=0
1293 + while [ true ]; do
1294 +@@ -54,29 +52,17 @@ zram_fill_fs()
1295 + b=$(($b + 1))
1296 + done
1297 + echo "zram$i can be filled with '$b' KB"
1298 +- done
1299 +
1300 +- local mem_free1=$(free -m | awk 'NR==2 {print $4}')
1301 +- local used_mem=$(($mem_free0 - $mem_free1))
1302 ++ local mem_used_total=`awk '{print $3}' "/sys/block/zram$i/mm_stat"`
1303 ++ local v=$((100 * 1024 * $b / $mem_used_total))
1304 ++ if [ "$v" -lt 100 ]; then
1305 ++ echo "FAIL compression ratio: 0.$v:1"
1306 ++ ERR_CODE=-1
1307 ++ return
1308 ++ fi
1309 +
1310 +- local total_size=0
1311 +- for sm in $zram_sizes; do
1312 +- local s=$(echo $sm | sed 's/M//')
1313 +- total_size=$(($total_size + $s))
1314 ++ echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK"
1315 + done
1316 +-
1317 +- echo "zram used ${used_mem}M, zram disk sizes ${total_size}M"
1318 +-
1319 +- local v=$((100 * $total_size / $used_mem))
1320 +-
1321 +- if [ "$v" -lt 100 ]; then
1322 +- echo "FAIL compression ratio: 0.$v:1"
1323 +- ERR_CODE=-1
1324 +- zram_cleanup
1325 +- return
1326 +- fi
1327 +-
1328 +- echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK"
1329 + }
1330 +
1331 + check_prereqs
1332 +@@ -90,7 +76,6 @@ zram_mount
1333 +
1334 + zram_fill_fs
1335 + zram_cleanup
1336 +-zram_unload
1337 +
1338 + if [ $ERR_CODE -ne 0 ]; then
1339 + echo "$TCID : [FAIL]"
1340 +diff --git a/tools/testing/selftests/zram/zram02.sh b/tools/testing/selftests/zram/zram02.sh
1341 +index 74569b883737f..3768cfd2e5f83 100755
1342 +--- a/tools/testing/selftests/zram/zram02.sh
1343 ++++ b/tools/testing/selftests/zram/zram02.sh
1344 +@@ -45,7 +45,6 @@ zram_set_memlimit
1345 + zram_makeswap
1346 + zram_swapoff
1347 + zram_cleanup
1348 +-zram_unload
1349 +
1350 + if [ $ERR_CODE -ne 0 ]; then
1351 + echo "$TCID : [FAIL]"
1352 +diff --git a/tools/testing/selftests/zram/zram_lib.sh b/tools/testing/selftests/zram/zram_lib.sh
1353 +index 9e73a4fb9b0aa..130d193cbd727 100755
1354 +--- a/tools/testing/selftests/zram/zram_lib.sh
1355 ++++ b/tools/testing/selftests/zram/zram_lib.sh
1356 +@@ -14,12 +14,17 @@
1357 + # Author: Alexey Kodanev <alexey.kodanev@××××××.com>
1358 + # Modified: Naresh Kamboju <naresh.kamboju@××××××.org>
1359 +
1360 +-MODULE=0
1361 + dev_makeswap=-1
1362 + dev_mounted=-1
1363 +-
1364 ++dev_start=0
1365 ++dev_end=-1
1366 ++module_load=-1
1367 ++sys_control=-1
1368 + # Kselftest framework requirement - SKIP code is 4.
1369 + ksft_skip=4
1370 ++kernel_version=`uname -r | cut -d'.' -f1,2`
1371 ++kernel_major=${kernel_version%.*}
1372 ++kernel_minor=${kernel_version#*.}
1373 +
1374 + trap INT
1375 +
1376 +@@ -34,68 +39,104 @@ check_prereqs()
1377 + fi
1378 + }
1379 +
1380 ++kernel_gte()
1381 ++{
1382 ++ major=${1%.*}
1383 ++ minor=${1#*.}
1384 ++
1385 ++ if [ $kernel_major -gt $major ]; then
1386 ++ return 0
1387 ++ elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then
1388 ++ return 0
1389 ++ fi
1390 ++
1391 ++ return 1
1392 ++}
1393 ++
1394 + zram_cleanup()
1395 + {
1396 + echo "zram cleanup"
1397 + local i=
1398 +- for i in $(seq 0 $dev_makeswap); do
1399 ++ for i in $(seq $dev_start $dev_makeswap); do
1400 + swapoff /dev/zram$i
1401 + done
1402 +
1403 +- for i in $(seq 0 $dev_mounted); do
1404 ++ for i in $(seq $dev_start $dev_mounted); do
1405 + umount /dev/zram$i
1406 + done
1407 +
1408 +- for i in $(seq 0 $(($dev_num - 1))); do
1409 ++ for i in $(seq $dev_start $dev_end); do
1410 + echo 1 > /sys/block/zram${i}/reset
1411 + rm -rf zram$i
1412 + done
1413 +
1414 +-}
1415 ++ if [ $sys_control -eq 1 ]; then
1416 ++ for i in $(seq $dev_start $dev_end); do
1417 ++ echo $i > /sys/class/zram-control/hot_remove
1418 ++ done
1419 ++ fi
1420 +
1421 +-zram_unload()
1422 +-{
1423 +- if [ $MODULE -ne 0 ] ; then
1424 +- echo "zram rmmod zram"
1425 ++ if [ $module_load -eq 1 ]; then
1426 + rmmod zram > /dev/null 2>&1
1427 + fi
1428 + }
1429 +
1430 + zram_load()
1431 + {
1432 +- # check zram module exists
1433 +- MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko
1434 +- if [ -f $MODULE_PATH ]; then
1435 +- MODULE=1
1436 +- echo "create '$dev_num' zram device(s)"
1437 +- modprobe zram num_devices=$dev_num
1438 +- if [ $? -ne 0 ]; then
1439 +- echo "failed to insert zram module"
1440 +- exit 1
1441 +- fi
1442 +-
1443 +- dev_num_created=$(ls /dev/zram* | wc -w)
1444 ++ echo "create '$dev_num' zram device(s)"
1445 ++
1446 ++ # zram module loaded, new kernel
1447 ++ if [ -d "/sys/class/zram-control" ]; then
1448 ++ echo "zram modules already loaded, kernel supports" \
1449 ++ "zram-control interface"
1450 ++ dev_start=$(ls /dev/zram* | wc -w)
1451 ++ dev_end=$(($dev_start + $dev_num - 1))
1452 ++ sys_control=1
1453 ++
1454 ++ for i in $(seq $dev_start $dev_end); do
1455 ++ cat /sys/class/zram-control/hot_add > /dev/null
1456 ++ done
1457 ++
1458 ++ echo "all zram devices (/dev/zram$dev_start~$dev_end" \
1459 ++ "successfully created"
1460 ++ return 0
1461 ++ fi
1462 +
1463 +- if [ "$dev_num_created" -ne "$dev_num" ]; then
1464 +- echo "unexpected num of devices: $dev_num_created"
1465 +- ERR_CODE=-1
1466 ++ # detect old kernel or built-in
1467 ++ modprobe zram num_devices=$dev_num
1468 ++ if [ ! -d "/sys/class/zram-control" ]; then
1469 ++ if grep -q '^zram' /proc/modules; then
1470 ++ rmmod zram > /dev/null 2>&1
1471 ++ if [ $? -ne 0 ]; then
1472 ++ echo "zram module is being used on old kernel" \
1473 ++ "without zram-control interface"
1474 ++ exit $ksft_skip
1475 ++ fi
1476 + else
1477 +- echo "zram load module successful"
1478 ++ echo "test needs CONFIG_ZRAM=m on old kernel without" \
1479 ++ "zram-control interface"
1480 ++ exit $ksft_skip
1481 + fi
1482 +- elif [ -b /dev/zram0 ]; then
1483 +- echo "/dev/zram0 device file found: OK"
1484 +- else
1485 +- echo "ERROR: No zram.ko module or no /dev/zram0 device found"
1486 +- echo "$TCID : CONFIG_ZRAM is not set"
1487 +- exit 1
1488 ++ modprobe zram num_devices=$dev_num
1489 + fi
1490 ++
1491 ++ module_load=1
1492 ++ dev_end=$(($dev_num - 1))
1493 ++ echo "all zram devices (/dev/zram0~$dev_end) successfully created"
1494 + }
1495 +
1496 + zram_max_streams()
1497 + {
1498 + echo "set max_comp_streams to zram device(s)"
1499 +
1500 +- local i=0
1501 ++ kernel_gte 4.7
1502 ++ if [ $? -eq 0 ]; then
1503 ++ echo "The device attribute max_comp_streams was"\
1504 ++ "deprecated in 4.7"
1505 ++ return 0
1506 ++ fi
1507 ++
1508 ++ local i=$dev_start
1509 + for max_s in $zram_max_streams; do
1510 + local sys_path="/sys/block/zram${i}/max_comp_streams"
1511 + echo $max_s > $sys_path || \
1512 +@@ -107,7 +148,7 @@ zram_max_streams()
1513 + echo "FAIL can't set max_streams '$max_s', get $max_stream"
1514 +
1515 + i=$(($i + 1))
1516 +- echo "$sys_path = '$max_streams' ($i/$dev_num)"
1517 ++ echo "$sys_path = '$max_streams'"
1518 + done
1519 +
1520 + echo "zram max streams: OK"
1521 +@@ -117,15 +158,16 @@ zram_compress_alg()
1522 + {
1523 + echo "test that we can set compression algorithm"
1524 +
1525 +- local algs=$(cat /sys/block/zram0/comp_algorithm)
1526 ++ local i=$dev_start
1527 ++ local algs=$(cat /sys/block/zram${i}/comp_algorithm)
1528 + echo "supported algs: $algs"
1529 +- local i=0
1530 ++
1531 + for alg in $zram_algs; do
1532 + local sys_path="/sys/block/zram${i}/comp_algorithm"
1533 + echo "$alg" > $sys_path || \
1534 + echo "FAIL can't set '$alg' to $sys_path"
1535 + i=$(($i + 1))
1536 +- echo "$sys_path = '$alg' ($i/$dev_num)"
1537 ++ echo "$sys_path = '$alg'"
1538 + done
1539 +
1540 + echo "zram set compression algorithm: OK"
1541 +@@ -134,14 +176,14 @@ zram_compress_alg()
1542 + zram_set_disksizes()
1543 + {
1544 + echo "set disk size to zram device(s)"
1545 +- local i=0
1546 ++ local i=$dev_start
1547 + for ds in $zram_sizes; do
1548 + local sys_path="/sys/block/zram${i}/disksize"
1549 + echo "$ds" > $sys_path || \
1550 + echo "FAIL can't set '$ds' to $sys_path"
1551 +
1552 + i=$(($i + 1))
1553 +- echo "$sys_path = '$ds' ($i/$dev_num)"
1554 ++ echo "$sys_path = '$ds'"
1555 + done
1556 +
1557 + echo "zram set disksizes: OK"
1558 +@@ -151,14 +193,14 @@ zram_set_memlimit()
1559 + {
1560 + echo "set memory limit to zram device(s)"
1561 +
1562 +- local i=0
1563 ++ local i=$dev_start
1564 + for ds in $zram_mem_limits; do
1565 + local sys_path="/sys/block/zram${i}/mem_limit"
1566 + echo "$ds" > $sys_path || \
1567 + echo "FAIL can't set '$ds' to $sys_path"
1568 +
1569 + i=$(($i + 1))
1570 +- echo "$sys_path = '$ds' ($i/$dev_num)"
1571 ++ echo "$sys_path = '$ds'"
1572 + done
1573 +
1574 + echo "zram set memory limit: OK"
1575 +@@ -167,8 +209,8 @@ zram_set_memlimit()
1576 + zram_makeswap()
1577 + {
1578 + echo "make swap with zram device(s)"
1579 +- local i=0
1580 +- for i in $(seq 0 $(($dev_num - 1))); do
1581 ++ local i=$dev_start
1582 ++ for i in $(seq $dev_start $dev_end); do
1583 + mkswap /dev/zram$i > err.log 2>&1
1584 + if [ $? -ne 0 ]; then
1585 + cat err.log
1586 +@@ -191,7 +233,7 @@ zram_makeswap()
1587 + zram_swapoff()
1588 + {
1589 + local i=
1590 +- for i in $(seq 0 $dev_makeswap); do
1591 ++ for i in $(seq $dev_start $dev_end); do
1592 + swapoff /dev/zram$i > err.log 2>&1
1593 + if [ $? -ne 0 ]; then
1594 + cat err.log
1595 +@@ -205,7 +247,7 @@ zram_swapoff()
1596 +
1597 + zram_makefs()
1598 + {
1599 +- local i=0
1600 ++ local i=$dev_start
1601 + for fs in $zram_filesystems; do
1602 + # if requested fs not supported default it to ext2
1603 + which mkfs.$fs > /dev/null 2>&1 || fs=ext2
1604 +@@ -224,7 +266,7 @@ zram_makefs()
1605 + zram_mount()
1606 + {
1607 + local i=0
1608 +- for i in $(seq 0 $(($dev_num - 1))); do
1609 ++ for i in $(seq $dev_start $dev_end); do
1610 + echo "mount /dev/zram$i"
1611 + mkdir zram$i
1612 + mount /dev/zram$i zram$i > /dev/null || \