Magellan Linux

Contents of /trunk/kernel-alx/patches-4.19/0119-4.19.20-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3398 - (show annotations) (download)
Fri Aug 2 11:47:32 2019 UTC (4 years, 8 months ago) by niro
File size: 105175 byte(s)
-linux-4.19.20
1 diff --git a/Makefile b/Makefile
2 index 39c4e7c3c13c..f1859811dca1 100644
3 --- a/Makefile
4 +++ b/Makefile
5 @@ -1,7 +1,7 @@
6 # SPDX-License-Identifier: GPL-2.0
7 VERSION = 4
8 PATCHLEVEL = 19
9 -SUBLEVEL = 19
10 +SUBLEVEL = 20
11 EXTRAVERSION =
12 NAME = "People's Front"
13
14 diff --git a/arch/arm/mach-cns3xxx/pcie.c b/arch/arm/mach-cns3xxx/pcie.c
15 index 318394ed5c7a..5e11ad3164e0 100644
16 --- a/arch/arm/mach-cns3xxx/pcie.c
17 +++ b/arch/arm/mach-cns3xxx/pcie.c
18 @@ -83,7 +83,7 @@ static void __iomem *cns3xxx_pci_map_bus(struct pci_bus *bus,
19 } else /* remote PCI bus */
20 base = cnspci->cfg1_regs + ((busno & 0xf) << 20);
21
22 - return base + (where & 0xffc) + (devfn << 12);
23 + return base + where + (devfn << 12);
24 }
25
26 static int cns3xxx_pci_read_config(struct pci_bus *bus, unsigned int devfn,
27 diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c
28 index 29cdc99688f3..9859e1178e6b 100644
29 --- a/arch/arm64/kernel/hibernate.c
30 +++ b/arch/arm64/kernel/hibernate.c
31 @@ -299,8 +299,10 @@ int swsusp_arch_suspend(void)
32 dcache_clean_range(__idmap_text_start, __idmap_text_end);
33
34 /* Clean kvm setup code to PoC? */
35 - if (el2_reset_needed())
36 + if (el2_reset_needed()) {
37 dcache_clean_range(__hyp_idmap_text_start, __hyp_idmap_text_end);
38 + dcache_clean_range(__hyp_text_start, __hyp_text_end);
39 + }
40
41 /* make the crash dump kernel image protected again */
42 crash_post_resume();
43 diff --git a/arch/arm64/kernel/hyp-stub.S b/arch/arm64/kernel/hyp-stub.S
44 index e1261fbaa374..17f325ba831e 100644
45 --- a/arch/arm64/kernel/hyp-stub.S
46 +++ b/arch/arm64/kernel/hyp-stub.S
47 @@ -28,6 +28,8 @@
48 #include <asm/virt.h>
49
50 .text
51 + .pushsection .hyp.text, "ax"
52 +
53 .align 11
54
55 ENTRY(__hyp_stub_vectors)
56 diff --git a/arch/arm64/kernel/kaslr.c b/arch/arm64/kernel/kaslr.c
57 index ba6b41790fcd..b09b6f75f759 100644
58 --- a/arch/arm64/kernel/kaslr.c
59 +++ b/arch/arm64/kernel/kaslr.c
60 @@ -88,6 +88,7 @@ u64 __init kaslr_early_init(u64 dt_phys)
61 * we end up running with module randomization disabled.
62 */
63 module_alloc_base = (u64)_etext - MODULES_VSIZE;
64 + __flush_dcache_area(&module_alloc_base, sizeof(module_alloc_base));
65
66 /*
67 * Try to map the FDT early. If this fails, we simply bail,
68 diff --git a/arch/arm64/mm/flush.c b/arch/arm64/mm/flush.c
69 index 30695a868107..5c9073bace83 100644
70 --- a/arch/arm64/mm/flush.c
71 +++ b/arch/arm64/mm/flush.c
72 @@ -33,7 +33,11 @@ void sync_icache_aliases(void *kaddr, unsigned long len)
73 __clean_dcache_area_pou(kaddr, len);
74 __flush_icache_all();
75 } else {
76 - flush_icache_range(addr, addr + len);
77 + /*
78 + * Don't issue kick_all_cpus_sync() after I-cache invalidation
79 + * for user mappings.
80 + */
81 + __flush_icache_range(addr, addr + len);
82 }
83 }
84
85 diff --git a/drivers/gpio/gpio-altera-a10sr.c b/drivers/gpio/gpio-altera-a10sr.c
86 index 6b11f1314248..7f9e0304b510 100644
87 --- a/drivers/gpio/gpio-altera-a10sr.c
88 +++ b/drivers/gpio/gpio-altera-a10sr.c
89 @@ -66,8 +66,10 @@ static int altr_a10sr_gpio_direction_input(struct gpio_chip *gc,
90 static int altr_a10sr_gpio_direction_output(struct gpio_chip *gc,
91 unsigned int nr, int value)
92 {
93 - if (nr <= (ALTR_A10SR_OUT_VALID_RANGE_HI - ALTR_A10SR_LED_VALID_SHIFT))
94 + if (nr <= (ALTR_A10SR_OUT_VALID_RANGE_HI - ALTR_A10SR_LED_VALID_SHIFT)) {
95 + altr_a10sr_gpio_set(gc, nr, value);
96 return 0;
97 + }
98 return -EINVAL;
99 }
100
101 diff --git a/drivers/gpio/gpio-eic-sprd.c b/drivers/gpio/gpio-eic-sprd.c
102 index e0d6a0a7bc69..e41223c05f6e 100644
103 --- a/drivers/gpio/gpio-eic-sprd.c
104 +++ b/drivers/gpio/gpio-eic-sprd.c
105 @@ -180,7 +180,18 @@ static void sprd_eic_free(struct gpio_chip *chip, unsigned int offset)
106
107 static int sprd_eic_get(struct gpio_chip *chip, unsigned int offset)
108 {
109 - return sprd_eic_read(chip, offset, SPRD_EIC_DBNC_DATA);
110 + struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
111 +
112 + switch (sprd_eic->type) {
113 + case SPRD_EIC_DEBOUNCE:
114 + return sprd_eic_read(chip, offset, SPRD_EIC_DBNC_DATA);
115 + case SPRD_EIC_ASYNC:
116 + return sprd_eic_read(chip, offset, SPRD_EIC_ASYNC_DATA);
117 + case SPRD_EIC_SYNC:
118 + return sprd_eic_read(chip, offset, SPRD_EIC_SYNC_DATA);
119 + default:
120 + return -ENOTSUPP;
121 + }
122 }
123
124 static int sprd_eic_direction_input(struct gpio_chip *chip, unsigned int offset)
125 @@ -368,6 +379,7 @@ static int sprd_eic_irq_set_type(struct irq_data *data, unsigned int flow_type)
126 irq_set_handler_locked(data, handle_edge_irq);
127 break;
128 case IRQ_TYPE_EDGE_BOTH:
129 + sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 0);
130 sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 1);
131 irq_set_handler_locked(data, handle_edge_irq);
132 break;
133 diff --git a/drivers/gpio/gpio-pcf857x.c b/drivers/gpio/gpio-pcf857x.c
134 index adf72dda25a2..68a35b65925a 100644
135 --- a/drivers/gpio/gpio-pcf857x.c
136 +++ b/drivers/gpio/gpio-pcf857x.c
137 @@ -84,6 +84,7 @@ MODULE_DEVICE_TABLE(of, pcf857x_of_table);
138 */
139 struct pcf857x {
140 struct gpio_chip chip;
141 + struct irq_chip irqchip;
142 struct i2c_client *client;
143 struct mutex lock; /* protect 'out' */
144 unsigned out; /* software latch */
145 @@ -252,18 +253,6 @@ static void pcf857x_irq_bus_sync_unlock(struct irq_data *data)
146 mutex_unlock(&gpio->lock);
147 }
148
149 -static struct irq_chip pcf857x_irq_chip = {
150 - .name = "pcf857x",
151 - .irq_enable = pcf857x_irq_enable,
152 - .irq_disable = pcf857x_irq_disable,
153 - .irq_ack = noop,
154 - .irq_mask = noop,
155 - .irq_unmask = noop,
156 - .irq_set_wake = pcf857x_irq_set_wake,
157 - .irq_bus_lock = pcf857x_irq_bus_lock,
158 - .irq_bus_sync_unlock = pcf857x_irq_bus_sync_unlock,
159 -};
160 -
161 /*-------------------------------------------------------------------------*/
162
163 static int pcf857x_probe(struct i2c_client *client,
164 @@ -376,8 +365,17 @@ static int pcf857x_probe(struct i2c_client *client,
165
166 /* Enable irqchip if we have an interrupt */
167 if (client->irq) {
168 + gpio->irqchip.name = "pcf857x",
169 + gpio->irqchip.irq_enable = pcf857x_irq_enable,
170 + gpio->irqchip.irq_disable = pcf857x_irq_disable,
171 + gpio->irqchip.irq_ack = noop,
172 + gpio->irqchip.irq_mask = noop,
173 + gpio->irqchip.irq_unmask = noop,
174 + gpio->irqchip.irq_set_wake = pcf857x_irq_set_wake,
175 + gpio->irqchip.irq_bus_lock = pcf857x_irq_bus_lock,
176 + gpio->irqchip.irq_bus_sync_unlock = pcf857x_irq_bus_sync_unlock,
177 status = gpiochip_irqchip_add_nested(&gpio->chip,
178 - &pcf857x_irq_chip,
179 + &gpio->irqchip,
180 0, handle_level_irq,
181 IRQ_TYPE_NONE);
182 if (status) {
183 @@ -392,7 +390,7 @@ static int pcf857x_probe(struct i2c_client *client,
184 if (status)
185 goto fail;
186
187 - gpiochip_set_nested_irqchip(&gpio->chip, &pcf857x_irq_chip,
188 + gpiochip_set_nested_irqchip(&gpio->chip, &gpio->irqchip,
189 client->irq);
190 gpio->irq_parent = client->irq;
191 }
192 diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
193 index a8e01d99919c..b3ab6c428423 100644
194 --- a/drivers/gpio/gpiolib.c
195 +++ b/drivers/gpio/gpiolib.c
196 @@ -817,7 +817,15 @@ static irqreturn_t lineevent_irq_thread(int irq, void *p)
197 /* Do not leak kernel stack to userspace */
198 memset(&ge, 0, sizeof(ge));
199
200 - ge.timestamp = le->timestamp;
201 + /*
202 + * We may be running from a nested threaded interrupt in which case
203 + * we didn't get the timestamp from lineevent_irq_handler().
204 + */
205 + if (!le->timestamp)
206 + ge.timestamp = ktime_get_real_ns();
207 + else
208 + ge.timestamp = le->timestamp;
209 +
210 level = gpiod_get_value_cansleep(le->desc);
211
212 if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE
213 diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h
214 index 9122ee6e55e4..1fe93920fb25 100644
215 --- a/drivers/gpu/drm/msm/msm_gpu.h
216 +++ b/drivers/gpu/drm/msm/msm_gpu.h
217 @@ -63,7 +63,7 @@ struct msm_gpu_funcs {
218 struct msm_ringbuffer *(*active_ring)(struct msm_gpu *gpu);
219 void (*recover)(struct msm_gpu *gpu);
220 void (*destroy)(struct msm_gpu *gpu);
221 -#ifdef CONFIG_DEBUG_FS
222 +#if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP)
223 /* show GPU status in debugfs: */
224 void (*show)(struct msm_gpu *gpu, struct msm_gpu_state *state,
225 struct drm_printer *p);
226 diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c
227 index 1fc75647e47b..34ffca618427 100644
228 --- a/drivers/infiniband/hw/hfi1/file_ops.c
229 +++ b/drivers/infiniband/hw/hfi1/file_ops.c
230 @@ -488,7 +488,7 @@ static int hfi1_file_mmap(struct file *fp, struct vm_area_struct *vma)
231 vmf = 1;
232 break;
233 case STATUS:
234 - if (flags & (unsigned long)(VM_WRITE | VM_EXEC)) {
235 + if (flags & VM_WRITE) {
236 ret = -EPERM;
237 goto done;
238 }
239 diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
240 index 4339177629e3..2b8f5ebae821 100644
241 --- a/drivers/iommu/intel-iommu.c
242 +++ b/drivers/iommu/intel-iommu.c
243 @@ -5230,7 +5230,7 @@ static void intel_iommu_put_resv_regions(struct device *dev,
244 struct iommu_resv_region *entry, *next;
245
246 list_for_each_entry_safe(entry, next, head, list) {
247 - if (entry->type == IOMMU_RESV_RESERVED)
248 + if (entry->type == IOMMU_RESV_MSI)
249 kfree(entry);
250 }
251 }
252 diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c
253 index e6e925add700..6518b012756f 100644
254 --- a/drivers/md/raid5-cache.c
255 +++ b/drivers/md/raid5-cache.c
256 @@ -1935,12 +1935,14 @@ out:
257 }
258
259 static struct stripe_head *
260 -r5c_recovery_alloc_stripe(struct r5conf *conf,
261 - sector_t stripe_sect)
262 +r5c_recovery_alloc_stripe(
263 + struct r5conf *conf,
264 + sector_t stripe_sect,
265 + int noblock)
266 {
267 struct stripe_head *sh;
268
269 - sh = raid5_get_active_stripe(conf, stripe_sect, 0, 1, 0);
270 + sh = raid5_get_active_stripe(conf, stripe_sect, 0, noblock, 0);
271 if (!sh)
272 return NULL; /* no more stripe available */
273
274 @@ -2150,7 +2152,7 @@ r5c_recovery_analyze_meta_block(struct r5l_log *log,
275 stripe_sect);
276
277 if (!sh) {
278 - sh = r5c_recovery_alloc_stripe(conf, stripe_sect);
279 + sh = r5c_recovery_alloc_stripe(conf, stripe_sect, 1);
280 /*
281 * cannot get stripe from raid5_get_active_stripe
282 * try replay some stripes
283 @@ -2159,20 +2161,29 @@ r5c_recovery_analyze_meta_block(struct r5l_log *log,
284 r5c_recovery_replay_stripes(
285 cached_stripe_list, ctx);
286 sh = r5c_recovery_alloc_stripe(
287 - conf, stripe_sect);
288 + conf, stripe_sect, 1);
289 }
290 if (!sh) {
291 + int new_size = conf->min_nr_stripes * 2;
292 pr_debug("md/raid:%s: Increasing stripe cache size to %d to recovery data on journal.\n",
293 mdname(mddev),
294 - conf->min_nr_stripes * 2);
295 - raid5_set_cache_size(mddev,
296 - conf->min_nr_stripes * 2);
297 - sh = r5c_recovery_alloc_stripe(conf,
298 - stripe_sect);
299 + new_size);
300 + ret = raid5_set_cache_size(mddev, new_size);
301 + if (conf->min_nr_stripes <= new_size / 2) {
302 + pr_err("md/raid:%s: Cannot increase cache size, ret=%d, new_size=%d, min_nr_stripes=%d, max_nr_stripes=%d\n",
303 + mdname(mddev),
304 + ret,
305 + new_size,
306 + conf->min_nr_stripes,
307 + conf->max_nr_stripes);
308 + return -ENOMEM;
309 + }
310 + sh = r5c_recovery_alloc_stripe(
311 + conf, stripe_sect, 0);
312 }
313 if (!sh) {
314 pr_err("md/raid:%s: Cannot get enough stripes due to memory pressure. Recovery failed.\n",
315 - mdname(mddev));
316 + mdname(mddev));
317 return -ENOMEM;
318 }
319 list_add_tail(&sh->lru, cached_stripe_list);
320 diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
321 index e4e98f47865d..45a3551d3afd 100644
322 --- a/drivers/md/raid5.c
323 +++ b/drivers/md/raid5.c
324 @@ -6357,6 +6357,7 @@ raid5_show_stripe_cache_size(struct mddev *mddev, char *page)
325 int
326 raid5_set_cache_size(struct mddev *mddev, int size)
327 {
328 + int result = 0;
329 struct r5conf *conf = mddev->private;
330
331 if (size <= 16 || size > 32768)
332 @@ -6373,11 +6374,14 @@ raid5_set_cache_size(struct mddev *mddev, int size)
333
334 mutex_lock(&conf->cache_size_mutex);
335 while (size > conf->max_nr_stripes)
336 - if (!grow_one_stripe(conf, GFP_KERNEL))
337 + if (!grow_one_stripe(conf, GFP_KERNEL)) {
338 + conf->min_nr_stripes = conf->max_nr_stripes;
339 + result = -ENOMEM;
340 break;
341 + }
342 mutex_unlock(&conf->cache_size_mutex);
343
344 - return 0;
345 + return result;
346 }
347 EXPORT_SYMBOL(raid5_set_cache_size);
348
349 diff --git a/drivers/mmc/host/bcm2835.c b/drivers/mmc/host/bcm2835.c
350 index 768972af8b85..0d3b7473bc21 100644
351 --- a/drivers/mmc/host/bcm2835.c
352 +++ b/drivers/mmc/host/bcm2835.c
353 @@ -1427,6 +1427,8 @@ static int bcm2835_probe(struct platform_device *pdev)
354
355 err:
356 dev_dbg(dev, "%s -> err %d\n", __func__, ret);
357 + if (host->dma_chan_rxtx)
358 + dma_release_channel(host->dma_chan_rxtx);
359 mmc_free_host(mmc);
360
361 return ret;
362 diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
363 index 04841386b65d..f171cce5197d 100644
364 --- a/drivers/mmc/host/mtk-sd.c
365 +++ b/drivers/mmc/host/mtk-sd.c
366 @@ -784,7 +784,7 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
367
368 if (timing == MMC_TIMING_MMC_HS400 &&
369 host->dev_comp->hs400_tune)
370 - sdr_set_field(host->base + PAD_CMD_TUNE,
371 + sdr_set_field(host->base + tune_reg,
372 MSDC_PAD_TUNE_CMDRRDLY,
373 host->hs400_cmd_int_delay);
374 dev_dbg(host->dev, "sclk: %d, timing: %d\n", host->sclk, timing);
375 diff --git a/drivers/mmc/host/sdhci-iproc.c b/drivers/mmc/host/sdhci-iproc.c
376 index d0e83db42ae5..94eeed2a1b53 100644
377 --- a/drivers/mmc/host/sdhci-iproc.c
378 +++ b/drivers/mmc/host/sdhci-iproc.c
379 @@ -279,7 +279,10 @@ static int sdhci_iproc_probe(struct platform_device *pdev)
380
381 iproc_host->data = iproc_data;
382
383 - mmc_of_parse(host->mmc);
384 + ret = mmc_of_parse(host->mmc);
385 + if (ret)
386 + goto err;
387 +
388 sdhci_get_of_property(pdev);
389
390 host->mmc->caps |= iproc_host->data->mmc_caps;
391 diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c
392 index 22a817da861e..1e2b53a934fb 100644
393 --- a/drivers/net/ethernet/freescale/ucc_geth.c
394 +++ b/drivers/net/ethernet/freescale/ucc_geth.c
395 @@ -1888,6 +1888,8 @@ static void ucc_geth_free_tx(struct ucc_geth_private *ugeth)
396 u16 i, j;
397 u8 __iomem *bd;
398
399 + netdev_reset_queue(ugeth->ndev);
400 +
401 ug_info = ugeth->ug_info;
402 uf_info = &ug_info->uf_info;
403
404 diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
405 index babcfd9c0571..75213046563c 100644
406 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c
407 +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
408 @@ -2064,9 +2064,11 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev,
409 {
410 struct mlx4_cmd_mailbox *mailbox;
411 __be32 *outbox;
412 + u64 qword_field;
413 u32 dword_field;
414 - int err;
415 + u16 word_field;
416 u8 byte_field;
417 + int err;
418 static const u8 a0_dmfs_query_hw_steering[] = {
419 [0] = MLX4_STEERING_DMFS_A0_DEFAULT,
420 [1] = MLX4_STEERING_DMFS_A0_DYNAMIC,
421 @@ -2094,19 +2096,32 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev,
422
423 /* QPC/EEC/CQC/EQC/RDMARC attributes */
424
425 - MLX4_GET(param->qpc_base, outbox, INIT_HCA_QPC_BASE_OFFSET);
426 - MLX4_GET(param->log_num_qps, outbox, INIT_HCA_LOG_QP_OFFSET);
427 - MLX4_GET(param->srqc_base, outbox, INIT_HCA_SRQC_BASE_OFFSET);
428 - MLX4_GET(param->log_num_srqs, outbox, INIT_HCA_LOG_SRQ_OFFSET);
429 - MLX4_GET(param->cqc_base, outbox, INIT_HCA_CQC_BASE_OFFSET);
430 - MLX4_GET(param->log_num_cqs, outbox, INIT_HCA_LOG_CQ_OFFSET);
431 - MLX4_GET(param->altc_base, outbox, INIT_HCA_ALTC_BASE_OFFSET);
432 - MLX4_GET(param->auxc_base, outbox, INIT_HCA_AUXC_BASE_OFFSET);
433 - MLX4_GET(param->eqc_base, outbox, INIT_HCA_EQC_BASE_OFFSET);
434 - MLX4_GET(param->log_num_eqs, outbox, INIT_HCA_LOG_EQ_OFFSET);
435 - MLX4_GET(param->num_sys_eqs, outbox, INIT_HCA_NUM_SYS_EQS_OFFSET);
436 - MLX4_GET(param->rdmarc_base, outbox, INIT_HCA_RDMARC_BASE_OFFSET);
437 - MLX4_GET(param->log_rd_per_qp, outbox, INIT_HCA_LOG_RD_OFFSET);
438 + MLX4_GET(qword_field, outbox, INIT_HCA_QPC_BASE_OFFSET);
439 + param->qpc_base = qword_field & ~((u64)0x1f);
440 + MLX4_GET(byte_field, outbox, INIT_HCA_LOG_QP_OFFSET);
441 + param->log_num_qps = byte_field & 0x1f;
442 + MLX4_GET(qword_field, outbox, INIT_HCA_SRQC_BASE_OFFSET);
443 + param->srqc_base = qword_field & ~((u64)0x1f);
444 + MLX4_GET(byte_field, outbox, INIT_HCA_LOG_SRQ_OFFSET);
445 + param->log_num_srqs = byte_field & 0x1f;
446 + MLX4_GET(qword_field, outbox, INIT_HCA_CQC_BASE_OFFSET);
447 + param->cqc_base = qword_field & ~((u64)0x1f);
448 + MLX4_GET(byte_field, outbox, INIT_HCA_LOG_CQ_OFFSET);
449 + param->log_num_cqs = byte_field & 0x1f;
450 + MLX4_GET(qword_field, outbox, INIT_HCA_ALTC_BASE_OFFSET);
451 + param->altc_base = qword_field;
452 + MLX4_GET(qword_field, outbox, INIT_HCA_AUXC_BASE_OFFSET);
453 + param->auxc_base = qword_field;
454 + MLX4_GET(qword_field, outbox, INIT_HCA_EQC_BASE_OFFSET);
455 + param->eqc_base = qword_field & ~((u64)0x1f);
456 + MLX4_GET(byte_field, outbox, INIT_HCA_LOG_EQ_OFFSET);
457 + param->log_num_eqs = byte_field & 0x1f;
458 + MLX4_GET(word_field, outbox, INIT_HCA_NUM_SYS_EQS_OFFSET);
459 + param->num_sys_eqs = word_field & 0xfff;
460 + MLX4_GET(qword_field, outbox, INIT_HCA_RDMARC_BASE_OFFSET);
461 + param->rdmarc_base = qword_field & ~((u64)0x1f);
462 + MLX4_GET(byte_field, outbox, INIT_HCA_LOG_RD_OFFSET);
463 + param->log_rd_per_qp = byte_field & 0x7;
464
465 MLX4_GET(dword_field, outbox, INIT_HCA_FLAGS_OFFSET);
466 if (dword_field & (1 << INIT_HCA_DEVICE_MANAGED_FLOW_STEERING_EN)) {
467 @@ -2125,22 +2140,21 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev,
468 /* steering attributes */
469 if (param->steering_mode == MLX4_STEERING_MODE_DEVICE_MANAGED) {
470 MLX4_GET(param->mc_base, outbox, INIT_HCA_FS_BASE_OFFSET);
471 - MLX4_GET(param->log_mc_entry_sz, outbox,
472 - INIT_HCA_FS_LOG_ENTRY_SZ_OFFSET);
473 - MLX4_GET(param->log_mc_table_sz, outbox,
474 - INIT_HCA_FS_LOG_TABLE_SZ_OFFSET);
475 - MLX4_GET(byte_field, outbox,
476 - INIT_HCA_FS_A0_OFFSET);
477 + MLX4_GET(byte_field, outbox, INIT_HCA_FS_LOG_ENTRY_SZ_OFFSET);
478 + param->log_mc_entry_sz = byte_field & 0x1f;
479 + MLX4_GET(byte_field, outbox, INIT_HCA_FS_LOG_TABLE_SZ_OFFSET);
480 + param->log_mc_table_sz = byte_field & 0x1f;
481 + MLX4_GET(byte_field, outbox, INIT_HCA_FS_A0_OFFSET);
482 param->dmfs_high_steer_mode =
483 a0_dmfs_query_hw_steering[(byte_field >> 6) & 3];
484 } else {
485 MLX4_GET(param->mc_base, outbox, INIT_HCA_MC_BASE_OFFSET);
486 - MLX4_GET(param->log_mc_entry_sz, outbox,
487 - INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET);
488 - MLX4_GET(param->log_mc_hash_sz, outbox,
489 - INIT_HCA_LOG_MC_HASH_SZ_OFFSET);
490 - MLX4_GET(param->log_mc_table_sz, outbox,
491 - INIT_HCA_LOG_MC_TABLE_SZ_OFFSET);
492 + MLX4_GET(byte_field, outbox, INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET);
493 + param->log_mc_entry_sz = byte_field & 0x1f;
494 + MLX4_GET(byte_field, outbox, INIT_HCA_LOG_MC_HASH_SZ_OFFSET);
495 + param->log_mc_hash_sz = byte_field & 0x1f;
496 + MLX4_GET(byte_field, outbox, INIT_HCA_LOG_MC_TABLE_SZ_OFFSET);
497 + param->log_mc_table_sz = byte_field & 0x1f;
498 }
499
500 /* CX3 is capable of extending CQEs/EQEs from 32 to 64 bytes */
501 @@ -2164,15 +2178,18 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev,
502 /* TPT attributes */
503
504 MLX4_GET(param->dmpt_base, outbox, INIT_HCA_DMPT_BASE_OFFSET);
505 - MLX4_GET(param->mw_enabled, outbox, INIT_HCA_TPT_MW_OFFSET);
506 - MLX4_GET(param->log_mpt_sz, outbox, INIT_HCA_LOG_MPT_SZ_OFFSET);
507 + MLX4_GET(byte_field, outbox, INIT_HCA_TPT_MW_OFFSET);
508 + param->mw_enabled = byte_field >> 7;
509 + MLX4_GET(byte_field, outbox, INIT_HCA_LOG_MPT_SZ_OFFSET);
510 + param->log_mpt_sz = byte_field & 0x3f;
511 MLX4_GET(param->mtt_base, outbox, INIT_HCA_MTT_BASE_OFFSET);
512 MLX4_GET(param->cmpt_base, outbox, INIT_HCA_CMPT_BASE_OFFSET);
513
514 /* UAR attributes */
515
516 MLX4_GET(param->uar_page_sz, outbox, INIT_HCA_UAR_PAGE_SZ_OFFSET);
517 - MLX4_GET(param->log_uar_sz, outbox, INIT_HCA_LOG_UAR_SZ_OFFSET);
518 + MLX4_GET(byte_field, outbox, INIT_HCA_LOG_UAR_SZ_OFFSET);
519 + param->log_uar_sz = byte_field & 0xf;
520
521 /* phv_check enable */
522 MLX4_GET(byte_field, outbox, INIT_HCA_CACHELINE_SZ_OFFSET);
523 diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
524 index ea7dedc2d5ad..d6706475a3ba 100644
525 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
526 +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
527 @@ -1133,13 +1133,6 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw,
528 int err = 0;
529 u8 *smac_v;
530
531 - if (vport->info.spoofchk && !is_valid_ether_addr(vport->info.mac)) {
532 - mlx5_core_warn(esw->dev,
533 - "vport[%d] configure ingress rules failed, illegal mac with spoofchk\n",
534 - vport->vport);
535 - return -EPERM;
536 - }
537 -
538 esw_vport_cleanup_ingress_rules(esw, vport);
539
540 if (!vport->info.vlan && !vport->info.qos && !vport->info.spoofchk) {
541 @@ -1696,7 +1689,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
542 int vport_num;
543 int err;
544
545 - if (!MLX5_ESWITCH_MANAGER(dev))
546 + if (!MLX5_VPORT_MANAGER(dev))
547 return 0;
548
549 esw_info(dev,
550 @@ -1765,7 +1758,7 @@ abort:
551
552 void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw)
553 {
554 - if (!esw || !MLX5_ESWITCH_MANAGER(esw->dev))
555 + if (!esw || !MLX5_VPORT_MANAGER(esw->dev))
556 return;
557
558 esw_info(esw->dev, "cleanup\n");
559 @@ -1812,13 +1805,10 @@ int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw,
560 mutex_lock(&esw->state_lock);
561 evport = &esw->vports[vport];
562
563 - if (evport->info.spoofchk && !is_valid_ether_addr(mac)) {
564 + if (evport->info.spoofchk && !is_valid_ether_addr(mac))
565 mlx5_core_warn(esw->dev,
566 - "MAC invalidation is not allowed when spoofchk is on, vport(%d)\n",
567 + "Set invalid MAC while spoofchk is on, vport(%d)\n",
568 vport);
569 - err = -EPERM;
570 - goto unlock;
571 - }
572
573 err = mlx5_modify_nic_vport_mac_address(esw->dev, vport, mac);
574 if (err) {
575 @@ -1964,6 +1954,10 @@ int mlx5_eswitch_set_vport_spoofchk(struct mlx5_eswitch *esw,
576 evport = &esw->vports[vport];
577 pschk = evport->info.spoofchk;
578 evport->info.spoofchk = spoofchk;
579 + if (pschk && !is_valid_ether_addr(evport->info.mac))
580 + mlx5_core_warn(esw->dev,
581 + "Spoofchk in set while MAC is invalid, vport(%d)\n",
582 + evport->vport);
583 if (evport->enabled && esw->mode == SRIOV_LEGACY)
584 err = esw_vport_ingress_config(esw, evport);
585 if (err)
586 diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
587 index d6f753925352..8441c86d9f3b 100644
588 --- a/drivers/net/ethernet/renesas/ravb_main.c
589 +++ b/drivers/net/ethernet/renesas/ravb_main.c
590 @@ -344,7 +344,7 @@ static int ravb_ring_init(struct net_device *ndev, int q)
591 int i;
592
593 priv->rx_buf_sz = (ndev->mtu <= 1492 ? PKT_BUF_SZ : ndev->mtu) +
594 - ETH_HLEN + VLAN_HLEN;
595 + ETH_HLEN + VLAN_HLEN + sizeof(__sum16);
596
597 /* Allocate RX and TX skb rings */
598 priv->rx_skb[q] = kcalloc(priv->num_rx_ring[q],
599 @@ -525,13 +525,15 @@ static void ravb_rx_csum(struct sk_buff *skb)
600 {
601 u8 *hw_csum;
602
603 - /* The hardware checksum is 2 bytes appended to packet data */
604 - if (unlikely(skb->len < 2))
605 + /* The hardware checksum is contained in sizeof(__sum16) (2) bytes
606 + * appended to packet data
607 + */
608 + if (unlikely(skb->len < sizeof(__sum16)))
609 return;
610 - hw_csum = skb_tail_pointer(skb) - 2;
611 + hw_csum = skb_tail_pointer(skb) - sizeof(__sum16);
612 skb->csum = csum_unfold((__force __sum16)get_unaligned_le16(hw_csum));
613 skb->ip_summed = CHECKSUM_COMPLETE;
614 - skb_trim(skb, skb->len - 2);
615 + skb_trim(skb, skb->len - sizeof(__sum16));
616 }
617
618 /* Packet receive function for Ethernet AVB */
619 diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c
620 index 4a949569ec4c..5fb541897863 100644
621 --- a/drivers/net/ipvlan/ipvlan_main.c
622 +++ b/drivers/net/ipvlan/ipvlan_main.c
623 @@ -97,12 +97,12 @@ static int ipvlan_set_port_mode(struct ipvl_port *port, u16 nval)
624 err = ipvlan_register_nf_hook(read_pnet(&port->pnet));
625 if (!err) {
626 mdev->l3mdev_ops = &ipvl_l3mdev_ops;
627 - mdev->priv_flags |= IFF_L3MDEV_MASTER;
628 + mdev->priv_flags |= IFF_L3MDEV_RX_HANDLER;
629 } else
630 goto fail;
631 } else if (port->mode == IPVLAN_MODE_L3S) {
632 /* Old mode was L3S */
633 - mdev->priv_flags &= ~IFF_L3MDEV_MASTER;
634 + mdev->priv_flags &= ~IFF_L3MDEV_RX_HANDLER;
635 ipvlan_unregister_nf_hook(read_pnet(&port->pnet));
636 mdev->l3mdev_ops = NULL;
637 }
638 @@ -162,7 +162,7 @@ static void ipvlan_port_destroy(struct net_device *dev)
639 struct sk_buff *skb;
640
641 if (port->mode == IPVLAN_MODE_L3S) {
642 - dev->priv_flags &= ~IFF_L3MDEV_MASTER;
643 + dev->priv_flags &= ~IFF_L3MDEV_RX_HANDLER;
644 ipvlan_unregister_nf_hook(dev_net(dev));
645 dev->l3mdev_ops = NULL;
646 }
647 diff --git a/drivers/net/tun.c b/drivers/net/tun.c
648 index 33978b0cdac8..65844f28db30 100644
649 --- a/drivers/net/tun.c
650 +++ b/drivers/net/tun.c
651 @@ -866,8 +866,6 @@ static int tun_attach(struct tun_struct *tun, struct file *file,
652 tun_napi_init(tun, tfile, napi, napi_frags);
653 }
654
655 - tun_set_real_num_queues(tun);
656 -
657 /* device is allowed to go away first, so no need to hold extra
658 * refcnt.
659 */
660 @@ -879,6 +877,7 @@ static int tun_attach(struct tun_struct *tun, struct file *file,
661 rcu_assign_pointer(tfile->tun, tun);
662 rcu_assign_pointer(tun->tfiles[tun->numqueues], tfile);
663 tun->numqueues++;
664 + tun_set_real_num_queues(tun);
665 out:
666 return err;
667 }
668 diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
669 index ad14fbfa1864..42feaa4d2916 100644
670 --- a/drivers/net/virtio_net.c
671 +++ b/drivers/net/virtio_net.c
672 @@ -57,6 +57,8 @@ module_param(napi_tx, bool, 0644);
673 #define VIRTIO_XDP_TX BIT(0)
674 #define VIRTIO_XDP_REDIR BIT(1)
675
676 +#define VIRTIO_XDP_FLAG BIT(0)
677 +
678 /* RX packet size EWMA. The average packet size is used to determine the packet
679 * buffer size when refilling RX rings. As the entire RX ring may be refilled
680 * at once, the weight is chosen so that the EWMA will be insensitive to short-
681 @@ -251,6 +253,21 @@ struct padded_vnet_hdr {
682 char padding[4];
683 };
684
685 +static bool is_xdp_frame(void *ptr)
686 +{
687 + return (unsigned long)ptr & VIRTIO_XDP_FLAG;
688 +}
689 +
690 +static void *xdp_to_ptr(struct xdp_frame *ptr)
691 +{
692 + return (void *)((unsigned long)ptr | VIRTIO_XDP_FLAG);
693 +}
694 +
695 +static struct xdp_frame *ptr_to_xdp(void *ptr)
696 +{
697 + return (struct xdp_frame *)((unsigned long)ptr & ~VIRTIO_XDP_FLAG);
698 +}
699 +
700 /* Converting between virtqueue no. and kernel tx/rx queue no.
701 * 0:rx0 1:tx0 2:rx1 3:tx1 ... 2N:rxN 2N+1:txN 2N+2:cvq
702 */
703 @@ -461,7 +478,8 @@ static int __virtnet_xdp_xmit_one(struct virtnet_info *vi,
704
705 sg_init_one(sq->sg, xdpf->data, xdpf->len);
706
707 - err = virtqueue_add_outbuf(sq->vq, sq->sg, 1, xdpf, GFP_ATOMIC);
708 + err = virtqueue_add_outbuf(sq->vq, sq->sg, 1, xdp_to_ptr(xdpf),
709 + GFP_ATOMIC);
710 if (unlikely(err))
711 return -ENOSPC; /* Caller handle free/refcnt */
712
713 @@ -481,36 +499,37 @@ static int virtnet_xdp_xmit(struct net_device *dev,
714 {
715 struct virtnet_info *vi = netdev_priv(dev);
716 struct receive_queue *rq = vi->rq;
717 - struct xdp_frame *xdpf_sent;
718 struct bpf_prog *xdp_prog;
719 struct send_queue *sq;
720 unsigned int len;
721 int drops = 0;
722 int kicks = 0;
723 int ret, err;
724 + void *ptr;
725 int i;
726
727 - sq = virtnet_xdp_sq(vi);
728 -
729 - if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) {
730 - ret = -EINVAL;
731 - drops = n;
732 - goto out;
733 - }
734 -
735 /* Only allow ndo_xdp_xmit if XDP is loaded on dev, as this
736 * indicate XDP resources have been successfully allocated.
737 */
738 xdp_prog = rcu_dereference(rq->xdp_prog);
739 - if (!xdp_prog) {
740 - ret = -ENXIO;
741 + if (!xdp_prog)
742 + return -ENXIO;
743 +
744 + sq = virtnet_xdp_sq(vi);
745 +
746 + if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) {
747 + ret = -EINVAL;
748 drops = n;
749 goto out;
750 }
751
752 /* Free up any pending old buffers before queueing new ones. */
753 - while ((xdpf_sent = virtqueue_get_buf(sq->vq, &len)) != NULL)
754 - xdp_return_frame(xdpf_sent);
755 + while ((ptr = virtqueue_get_buf(sq->vq, &len)) != NULL) {
756 + if (likely(is_xdp_frame(ptr)))
757 + xdp_return_frame(ptr_to_xdp(ptr));
758 + else
759 + napi_consume_skb(ptr, false);
760 + }
761
762 for (i = 0; i < n; i++) {
763 struct xdp_frame *xdpf = frames[i];
764 @@ -1329,20 +1348,28 @@ static int virtnet_receive(struct receive_queue *rq, int budget,
765 return stats.packets;
766 }
767
768 -static void free_old_xmit_skbs(struct send_queue *sq)
769 +static void free_old_xmit_skbs(struct send_queue *sq, bool in_napi)
770 {
771 - struct sk_buff *skb;
772 unsigned int len;
773 unsigned int packets = 0;
774 unsigned int bytes = 0;
775 + void *ptr;
776
777 - while ((skb = virtqueue_get_buf(sq->vq, &len)) != NULL) {
778 - pr_debug("Sent skb %p\n", skb);
779 + while ((ptr = virtqueue_get_buf(sq->vq, &len)) != NULL) {
780 + if (likely(!is_xdp_frame(ptr))) {
781 + struct sk_buff *skb = ptr;
782
783 - bytes += skb->len;
784 - packets++;
785 + pr_debug("Sent skb %p\n", skb);
786 +
787 + bytes += skb->len;
788 + napi_consume_skb(skb, in_napi);
789 + } else {
790 + struct xdp_frame *frame = ptr_to_xdp(ptr);
791
792 - dev_consume_skb_any(skb);
793 + bytes += frame->len;
794 + xdp_return_frame(frame);
795 + }
796 + packets++;
797 }
798
799 /* Avoid overhead when no packets have been processed
800 @@ -1357,6 +1384,16 @@ static void free_old_xmit_skbs(struct send_queue *sq)
801 u64_stats_update_end(&sq->stats.syncp);
802 }
803
804 +static bool is_xdp_raw_buffer_queue(struct virtnet_info *vi, int q)
805 +{
806 + if (q < (vi->curr_queue_pairs - vi->xdp_queue_pairs))
807 + return false;
808 + else if (q < vi->curr_queue_pairs)
809 + return true;
810 + else
811 + return false;
812 +}
813 +
814 static void virtnet_poll_cleantx(struct receive_queue *rq)
815 {
816 struct virtnet_info *vi = rq->vq->vdev->priv;
817 @@ -1364,11 +1401,11 @@ static void virtnet_poll_cleantx(struct receive_queue *rq)
818 struct send_queue *sq = &vi->sq[index];
819 struct netdev_queue *txq = netdev_get_tx_queue(vi->dev, index);
820
821 - if (!sq->napi.weight)
822 + if (!sq->napi.weight || is_xdp_raw_buffer_queue(vi, index))
823 return;
824
825 if (__netif_tx_trylock(txq)) {
826 - free_old_xmit_skbs(sq);
827 + free_old_xmit_skbs(sq, true);
828 __netif_tx_unlock(txq);
829 }
830
831 @@ -1441,10 +1478,18 @@ static int virtnet_poll_tx(struct napi_struct *napi, int budget)
832 {
833 struct send_queue *sq = container_of(napi, struct send_queue, napi);
834 struct virtnet_info *vi = sq->vq->vdev->priv;
835 - struct netdev_queue *txq = netdev_get_tx_queue(vi->dev, vq2txq(sq->vq));
836 + unsigned int index = vq2txq(sq->vq);
837 + struct netdev_queue *txq;
838
839 + if (unlikely(is_xdp_raw_buffer_queue(vi, index))) {
840 + /* We don't need to enable cb for XDP */
841 + napi_complete_done(napi, 0);
842 + return 0;
843 + }
844 +
845 + txq = netdev_get_tx_queue(vi->dev, index);
846 __netif_tx_lock(txq, raw_smp_processor_id());
847 - free_old_xmit_skbs(sq);
848 + free_old_xmit_skbs(sq, true);
849 __netif_tx_unlock(txq);
850
851 virtqueue_napi_complete(napi, sq->vq, 0);
852 @@ -1513,7 +1558,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
853 bool use_napi = sq->napi.weight;
854
855 /* Free up any pending old buffers before queueing new ones. */
856 - free_old_xmit_skbs(sq);
857 + free_old_xmit_skbs(sq, false);
858
859 if (use_napi && kick)
860 virtqueue_enable_cb_delayed(sq->vq);
861 @@ -1556,7 +1601,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
862 if (!use_napi &&
863 unlikely(!virtqueue_enable_cb_delayed(sq->vq))) {
864 /* More just got used, free them then recheck. */
865 - free_old_xmit_skbs(sq);
866 + free_old_xmit_skbs(sq, false);
867 if (sq->vq->num_free >= 2+MAX_SKB_FRAGS) {
868 netif_start_subqueue(dev, qnum);
869 virtqueue_disable_cb(sq->vq);
870 @@ -2345,6 +2390,10 @@ static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog,
871 return -ENOMEM;
872 }
873
874 + old_prog = rtnl_dereference(vi->rq[0].xdp_prog);
875 + if (!prog && !old_prog)
876 + return 0;
877 +
878 if (prog) {
879 prog = bpf_prog_add(prog, vi->max_queue_pairs - 1);
880 if (IS_ERR(prog))
881 @@ -2352,36 +2401,62 @@ static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog,
882 }
883
884 /* Make sure NAPI is not using any XDP TX queues for RX. */
885 - if (netif_running(dev))
886 - for (i = 0; i < vi->max_queue_pairs; i++)
887 + if (netif_running(dev)) {
888 + for (i = 0; i < vi->max_queue_pairs; i++) {
889 napi_disable(&vi->rq[i].napi);
890 + virtnet_napi_tx_disable(&vi->sq[i].napi);
891 + }
892 + }
893 +
894 + if (!prog) {
895 + for (i = 0; i < vi->max_queue_pairs; i++) {
896 + rcu_assign_pointer(vi->rq[i].xdp_prog, prog);
897 + if (i == 0)
898 + virtnet_restore_guest_offloads(vi);
899 + }
900 + synchronize_net();
901 + }
902
903 - netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp);
904 err = _virtnet_set_queues(vi, curr_qp + xdp_qp);
905 if (err)
906 goto err;
907 + netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp);
908 vi->xdp_queue_pairs = xdp_qp;
909
910 - for (i = 0; i < vi->max_queue_pairs; i++) {
911 - old_prog = rtnl_dereference(vi->rq[i].xdp_prog);
912 - rcu_assign_pointer(vi->rq[i].xdp_prog, prog);
913 - if (i == 0) {
914 - if (!old_prog)
915 + if (prog) {
916 + for (i = 0; i < vi->max_queue_pairs; i++) {
917 + rcu_assign_pointer(vi->rq[i].xdp_prog, prog);
918 + if (i == 0 && !old_prog)
919 virtnet_clear_guest_offloads(vi);
920 - if (!prog)
921 - virtnet_restore_guest_offloads(vi);
922 }
923 + }
924 +
925 + for (i = 0; i < vi->max_queue_pairs; i++) {
926 if (old_prog)
927 bpf_prog_put(old_prog);
928 - if (netif_running(dev))
929 + if (netif_running(dev)) {
930 virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi);
931 + virtnet_napi_tx_enable(vi, vi->sq[i].vq,
932 + &vi->sq[i].napi);
933 + }
934 }
935
936 return 0;
937
938 err:
939 - for (i = 0; i < vi->max_queue_pairs; i++)
940 - virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi);
941 + if (!prog) {
942 + virtnet_clear_guest_offloads(vi);
943 + for (i = 0; i < vi->max_queue_pairs; i++)
944 + rcu_assign_pointer(vi->rq[i].xdp_prog, old_prog);
945 + }
946 +
947 + if (netif_running(dev)) {
948 + for (i = 0; i < vi->max_queue_pairs; i++) {
949 + virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi);
950 + virtnet_napi_tx_enable(vi, vi->sq[i].vq,
951 + &vi->sq[i].napi);
952 + }
953 + }
954 if (prog)
955 bpf_prog_sub(prog, vi->max_queue_pairs - 1);
956 return err;
957 @@ -2537,16 +2612,6 @@ static void free_receive_page_frags(struct virtnet_info *vi)
958 put_page(vi->rq[i].alloc_frag.page);
959 }
960
961 -static bool is_xdp_raw_buffer_queue(struct virtnet_info *vi, int q)
962 -{
963 - if (q < (vi->curr_queue_pairs - vi->xdp_queue_pairs))
964 - return false;
965 - else if (q < vi->curr_queue_pairs)
966 - return true;
967 - else
968 - return false;
969 -}
970 -
971 static void free_unused_bufs(struct virtnet_info *vi)
972 {
973 void *buf;
974 @@ -2555,10 +2620,10 @@ static void free_unused_bufs(struct virtnet_info *vi)
975 for (i = 0; i < vi->max_queue_pairs; i++) {
976 struct virtqueue *vq = vi->sq[i].vq;
977 while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
978 - if (!is_xdp_raw_buffer_queue(vi, i))
979 + if (!is_xdp_frame(buf))
980 dev_kfree_skb(buf);
981 else
982 - put_page(virt_to_head_page(buf));
983 + xdp_return_frame(ptr_to_xdp(buf));
984 }
985 }
986
987 diff --git a/drivers/of/device.c b/drivers/of/device.c
988 index 40b9051a7fce..258742830e36 100644
989 --- a/drivers/of/device.c
990 +++ b/drivers/of/device.c
991 @@ -221,7 +221,8 @@ static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len
992 return -ENODEV;
993
994 /* Name & Type */
995 - csize = snprintf(str, len, "of:N%sT%s", dev->of_node->name,
996 + /* %p eats all alphanum characters, so %c must be used here */
997 + csize = snprintf(str, len, "of:N%pOFn%c%s", dev->of_node, 'T',
998 dev->of_node->type);
999 tsize = csize;
1000 len -= csize;
1001 @@ -300,7 +301,7 @@ void of_device_uevent(struct device *dev, struct kobj_uevent_env *env)
1002 if ((!dev) || (!dev->of_node))
1003 return;
1004
1005 - add_uevent_var(env, "OF_NAME=%s", dev->of_node->name);
1006 + add_uevent_var(env, "OF_NAME=%pOFn", dev->of_node);
1007 add_uevent_var(env, "OF_FULLNAME=%pOF", dev->of_node);
1008 if (dev->of_node->type && strcmp("<NULL>", dev->of_node->type) != 0)
1009 add_uevent_var(env, "OF_TYPE=%s", dev->of_node->type);
1010 diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
1011 index ecea92f68c87..45c0b1f4cb69 100644
1012 --- a/drivers/of/dynamic.c
1013 +++ b/drivers/of/dynamic.c
1014 @@ -275,9 +275,6 @@ void __of_detach_node(struct device_node *np)
1015
1016 /**
1017 * of_detach_node() - "Unplug" a node from the device tree.
1018 - *
1019 - * The caller must hold a reference to the node. The memory associated with
1020 - * the node is not freed until its refcount goes to zero.
1021 */
1022 int of_detach_node(struct device_node *np)
1023 {
1024 @@ -333,6 +330,25 @@ void of_node_release(struct kobject *kobj)
1025 if (!of_node_check_flag(node, OF_DYNAMIC))
1026 return;
1027
1028 + if (of_node_check_flag(node, OF_OVERLAY)) {
1029 +
1030 + if (!of_node_check_flag(node, OF_OVERLAY_FREE_CSET)) {
1031 + /* premature refcount of zero, do not free memory */
1032 + pr_err("ERROR: memory leak before free overlay changeset, %pOF\n",
1033 + node);
1034 + return;
1035 + }
1036 +
1037 + /*
1038 + * If node->properties non-empty then properties were added
1039 + * to this node either by different overlay that has not
1040 + * yet been removed, or by a non-overlay mechanism.
1041 + */
1042 + if (node->properties)
1043 + pr_err("ERROR: %s(), unexpected properties in %pOF\n",
1044 + __func__, node);
1045 + }
1046 +
1047 property_list_free(node->properties);
1048 property_list_free(node->deadprops);
1049
1050 @@ -437,6 +453,16 @@ struct device_node *__of_node_dup(const struct device_node *np,
1051
1052 static void __of_changeset_entry_destroy(struct of_changeset_entry *ce)
1053 {
1054 + if (ce->action == OF_RECONFIG_ATTACH_NODE &&
1055 + of_node_check_flag(ce->np, OF_OVERLAY)) {
1056 + if (kref_read(&ce->np->kobj.kref) > 1) {
1057 + pr_err("ERROR: memory leak, expected refcount 1 instead of %d, of_node_get()/of_node_put() unbalanced - destroy cset entry: attach overlay node %pOF\n",
1058 + kref_read(&ce->np->kobj.kref), ce->np);
1059 + } else {
1060 + of_node_set_flag(ce->np, OF_OVERLAY_FREE_CSET);
1061 + }
1062 + }
1063 +
1064 of_node_put(ce->np);
1065 list_del(&ce->node);
1066 kfree(ce);
1067 diff --git a/drivers/of/kobj.c b/drivers/of/kobj.c
1068 index 7a0a18980b98..c72eef988041 100644
1069 --- a/drivers/of/kobj.c
1070 +++ b/drivers/of/kobj.c
1071 @@ -133,6 +133,9 @@ int __of_attach_node_sysfs(struct device_node *np)
1072 }
1073 if (!name)
1074 return -ENOMEM;
1075 +
1076 + of_node_get(np);
1077 +
1078 rc = kobject_add(&np->kobj, parent, "%s", name);
1079 kfree(name);
1080 if (rc)
1081 @@ -159,6 +162,5 @@ void __of_detach_node_sysfs(struct device_node *np)
1082 kobject_del(&np->kobj);
1083 }
1084
1085 - /* finally remove the kobj_init ref */
1086 of_node_put(np);
1087 }
1088 diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c
1089 index e92391d6d1bd..5ad1342f5682 100644
1090 --- a/drivers/of/of_mdio.c
1091 +++ b/drivers/of/of_mdio.c
1092 @@ -97,8 +97,8 @@ static int of_mdiobus_register_phy(struct mii_bus *mdio,
1093 return rc;
1094 }
1095
1096 - dev_dbg(&mdio->dev, "registered phy %s at address %i\n",
1097 - child->name, addr);
1098 + dev_dbg(&mdio->dev, "registered phy %pOFn at address %i\n",
1099 + child, addr);
1100 return 0;
1101 }
1102
1103 @@ -127,8 +127,8 @@ static int of_mdiobus_register_device(struct mii_bus *mdio,
1104 return rc;
1105 }
1106
1107 - dev_dbg(&mdio->dev, "registered mdio device %s at address %i\n",
1108 - child->name, addr);
1109 + dev_dbg(&mdio->dev, "registered mdio device %pOFn at address %i\n",
1110 + child, addr);
1111 return 0;
1112 }
1113
1114 @@ -263,8 +263,8 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
1115 continue;
1116
1117 /* be noisy to encourage people to set reg property */
1118 - dev_info(&mdio->dev, "scan phy %s at address %i\n",
1119 - child->name, addr);
1120 + dev_info(&mdio->dev, "scan phy %pOFn at address %i\n",
1121 + child, addr);
1122
1123 if (of_mdiobus_child_is_phy(child)) {
1124 rc = of_mdiobus_register_phy(mdio, child, addr);
1125 diff --git a/drivers/of/of_numa.c b/drivers/of/of_numa.c
1126 index 2411ed3c7303..f5b452218092 100644
1127 --- a/drivers/of/of_numa.c
1128 +++ b/drivers/of/of_numa.c
1129 @@ -168,8 +168,8 @@ int of_node_to_nid(struct device_node *device)
1130 np = of_get_next_parent(np);
1131 }
1132 if (np && r)
1133 - pr_warn("Invalid \"numa-node-id\" property in node %s\n",
1134 - np->name);
1135 + pr_warn("Invalid \"numa-node-id\" property in node %pOFn\n",
1136 + np);
1137 of_node_put(np);
1138
1139 /*
1140 diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
1141 index baa9cee6fa2c..9808aae4621a 100644
1142 --- a/drivers/of/overlay.c
1143 +++ b/drivers/of/overlay.c
1144 @@ -23,6 +23,26 @@
1145
1146 #include "of_private.h"
1147
1148 +/**
1149 + * struct target - info about current target node as recursing through overlay
1150 + * @np: node where current level of overlay will be applied
1151 + * @in_livetree: @np is a node in the live devicetree
1152 + *
1153 + * Used in the algorithm to create the portion of a changeset that describes
1154 + * an overlay fragment, which is a devicetree subtree. Initially @np is a node
1155 + * in the live devicetree where the overlay subtree is targeted to be grafted
1156 + * into. When recursing to the next level of the overlay subtree, the target
1157 + * also recurses to the next level of the live devicetree, as long as overlay
1158 + * subtree node also exists in the live devicetree. When a node in the overlay
1159 + * subtree does not exist at the same level in the live devicetree, target->np
1160 + * points to a newly allocated node, and all subsequent targets in the subtree
1161 + * will be newly allocated nodes.
1162 + */
1163 +struct target {
1164 + struct device_node *np;
1165 + bool in_livetree;
1166 +};
1167 +
1168 /**
1169 * struct fragment - info about fragment nodes in overlay expanded device tree
1170 * @target: target of the overlay operation
1171 @@ -72,8 +92,7 @@ static int devicetree_corrupt(void)
1172 }
1173
1174 static int build_changeset_next_level(struct overlay_changeset *ovcs,
1175 - struct device_node *target_node,
1176 - const struct device_node *overlay_node);
1177 + struct target *target, const struct device_node *overlay_node);
1178
1179 /*
1180 * of_resolve_phandles() finds the largest phandle in the live tree.
1181 @@ -257,14 +276,17 @@ err_free_target_path:
1182 /**
1183 * add_changeset_property() - add @overlay_prop to overlay changeset
1184 * @ovcs: overlay changeset
1185 - * @target_node: where to place @overlay_prop in live tree
1186 + * @target: where @overlay_prop will be placed
1187 * @overlay_prop: property to add or update, from overlay tree
1188 * @is_symbols_prop: 1 if @overlay_prop is from node "/__symbols__"
1189 *
1190 - * If @overlay_prop does not already exist in @target_node, add changeset entry
1191 - * to add @overlay_prop in @target_node, else add changeset entry to update
1192 + * If @overlay_prop does not already exist in live devicetree, add changeset
1193 + * entry to add @overlay_prop in @target, else add changeset entry to update
1194 * value of @overlay_prop.
1195 *
1196 + * @target may be either in the live devicetree or in a new subtree that
1197 + * is contained in the changeset.
1198 + *
1199 * Some special properties are not updated (no error returned).
1200 *
1201 * Update of property in symbols node is not allowed.
1202 @@ -273,20 +295,22 @@ err_free_target_path:
1203 * invalid @overlay.
1204 */
1205 static int add_changeset_property(struct overlay_changeset *ovcs,
1206 - struct device_node *target_node,
1207 - struct property *overlay_prop,
1208 + struct target *target, struct property *overlay_prop,
1209 bool is_symbols_prop)
1210 {
1211 struct property *new_prop = NULL, *prop;
1212 int ret = 0;
1213
1214 - prop = of_find_property(target_node, overlay_prop->name, NULL);
1215 -
1216 if (!of_prop_cmp(overlay_prop->name, "name") ||
1217 !of_prop_cmp(overlay_prop->name, "phandle") ||
1218 !of_prop_cmp(overlay_prop->name, "linux,phandle"))
1219 return 0;
1220
1221 + if (target->in_livetree)
1222 + prop = of_find_property(target->np, overlay_prop->name, NULL);
1223 + else
1224 + prop = NULL;
1225 +
1226 if (is_symbols_prop) {
1227 if (prop)
1228 return -EINVAL;
1229 @@ -299,10 +323,10 @@ static int add_changeset_property(struct overlay_changeset *ovcs,
1230 return -ENOMEM;
1231
1232 if (!prop)
1233 - ret = of_changeset_add_property(&ovcs->cset, target_node,
1234 + ret = of_changeset_add_property(&ovcs->cset, target->np,
1235 new_prop);
1236 else
1237 - ret = of_changeset_update_property(&ovcs->cset, target_node,
1238 + ret = of_changeset_update_property(&ovcs->cset, target->np,
1239 new_prop);
1240
1241 if (ret) {
1242 @@ -315,14 +339,14 @@ static int add_changeset_property(struct overlay_changeset *ovcs,
1243
1244 /**
1245 * add_changeset_node() - add @node (and children) to overlay changeset
1246 - * @ovcs: overlay changeset
1247 - * @target_node: where to place @node in live tree
1248 - * @node: node from within overlay device tree fragment
1249 + * @ovcs: overlay changeset
1250 + * @target: where @node will be placed in live tree or changeset
1251 + * @node: node from within overlay device tree fragment
1252 *
1253 - * If @node does not already exist in @target_node, add changeset entry
1254 - * to add @node in @target_node.
1255 + * If @node does not already exist in @target, add changeset entry
1256 + * to add @node in @target.
1257 *
1258 - * If @node already exists in @target_node, and the existing node has
1259 + * If @node already exists in @target, and the existing node has
1260 * a phandle, the overlay node is not allowed to have a phandle.
1261 *
1262 * If @node has child nodes, add the children recursively via
1263 @@ -355,38 +379,46 @@ static int add_changeset_property(struct overlay_changeset *ovcs,
1264 * invalid @overlay.
1265 */
1266 static int add_changeset_node(struct overlay_changeset *ovcs,
1267 - struct device_node *target_node, struct device_node *node)
1268 + struct target *target, struct device_node *node)
1269 {
1270 const char *node_kbasename;
1271 struct device_node *tchild;
1272 + struct target target_child;
1273 int ret = 0;
1274
1275 node_kbasename = kbasename(node->full_name);
1276
1277 - for_each_child_of_node(target_node, tchild)
1278 + for_each_child_of_node(target->np, tchild)
1279 if (!of_node_cmp(node_kbasename, kbasename(tchild->full_name)))
1280 break;
1281
1282 if (!tchild) {
1283 - tchild = __of_node_dup(node, node_kbasename);
1284 + tchild = __of_node_dup(NULL, node_kbasename);
1285 if (!tchild)
1286 return -ENOMEM;
1287
1288 - tchild->parent = target_node;
1289 + tchild->parent = target->np;
1290 + of_node_set_flag(tchild, OF_OVERLAY);
1291
1292 ret = of_changeset_attach_node(&ovcs->cset, tchild);
1293 if (ret)
1294 return ret;
1295
1296 - ret = build_changeset_next_level(ovcs, tchild, node);
1297 + target_child.np = tchild;
1298 + target_child.in_livetree = false;
1299 +
1300 + ret = build_changeset_next_level(ovcs, &target_child, node);
1301 of_node_put(tchild);
1302 return ret;
1303 }
1304
1305 - if (node->phandle && tchild->phandle)
1306 + if (node->phandle && tchild->phandle) {
1307 ret = -EINVAL;
1308 - else
1309 - ret = build_changeset_next_level(ovcs, tchild, node);
1310 + } else {
1311 + target_child.np = tchild;
1312 + target_child.in_livetree = target->in_livetree;
1313 + ret = build_changeset_next_level(ovcs, &target_child, node);
1314 + }
1315 of_node_put(tchild);
1316
1317 return ret;
1318 @@ -395,7 +427,7 @@ static int add_changeset_node(struct overlay_changeset *ovcs,
1319 /**
1320 * build_changeset_next_level() - add level of overlay changeset
1321 * @ovcs: overlay changeset
1322 - * @target_node: where to place @overlay_node in live tree
1323 + * @target: where to place @overlay_node in live tree
1324 * @overlay_node: node from within an overlay device tree fragment
1325 *
1326 * Add the properties (if any) and nodes (if any) from @overlay_node to the
1327 @@ -408,27 +440,26 @@ static int add_changeset_node(struct overlay_changeset *ovcs,
1328 * invalid @overlay_node.
1329 */
1330 static int build_changeset_next_level(struct overlay_changeset *ovcs,
1331 - struct device_node *target_node,
1332 - const struct device_node *overlay_node)
1333 + struct target *target, const struct device_node *overlay_node)
1334 {
1335 struct device_node *child;
1336 struct property *prop;
1337 int ret;
1338
1339 for_each_property_of_node(overlay_node, prop) {
1340 - ret = add_changeset_property(ovcs, target_node, prop, 0);
1341 + ret = add_changeset_property(ovcs, target, prop, 0);
1342 if (ret) {
1343 pr_debug("Failed to apply prop @%pOF/%s, err=%d\n",
1344 - target_node, prop->name, ret);
1345 + target->np, prop->name, ret);
1346 return ret;
1347 }
1348 }
1349
1350 for_each_child_of_node(overlay_node, child) {
1351 - ret = add_changeset_node(ovcs, target_node, child);
1352 + ret = add_changeset_node(ovcs, target, child);
1353 if (ret) {
1354 - pr_debug("Failed to apply node @%pOF/%s, err=%d\n",
1355 - target_node, child->name, ret);
1356 + pr_debug("Failed to apply node @%pOF/%pOFn, err=%d\n",
1357 + target->np, child, ret);
1358 of_node_put(child);
1359 return ret;
1360 }
1361 @@ -441,17 +472,17 @@ static int build_changeset_next_level(struct overlay_changeset *ovcs,
1362 * Add the properties from __overlay__ node to the @ovcs->cset changeset.
1363 */
1364 static int build_changeset_symbols_node(struct overlay_changeset *ovcs,
1365 - struct device_node *target_node,
1366 + struct target *target,
1367 const struct device_node *overlay_symbols_node)
1368 {
1369 struct property *prop;
1370 int ret;
1371
1372 for_each_property_of_node(overlay_symbols_node, prop) {
1373 - ret = add_changeset_property(ovcs, target_node, prop, 1);
1374 + ret = add_changeset_property(ovcs, target, prop, 1);
1375 if (ret) {
1376 pr_debug("Failed to apply prop @%pOF/%s, err=%d\n",
1377 - target_node, prop->name, ret);
1378 + target->np, prop->name, ret);
1379 return ret;
1380 }
1381 }
1382 @@ -474,6 +505,7 @@ static int build_changeset_symbols_node(struct overlay_changeset *ovcs,
1383 static int build_changeset(struct overlay_changeset *ovcs)
1384 {
1385 struct fragment *fragment;
1386 + struct target target;
1387 int fragments_count, i, ret;
1388
1389 /*
1390 @@ -488,7 +520,9 @@ static int build_changeset(struct overlay_changeset *ovcs)
1391 for (i = 0; i < fragments_count; i++) {
1392 fragment = &ovcs->fragments[i];
1393
1394 - ret = build_changeset_next_level(ovcs, fragment->target,
1395 + target.np = fragment->target;
1396 + target.in_livetree = true;
1397 + ret = build_changeset_next_level(ovcs, &target,
1398 fragment->overlay);
1399 if (ret) {
1400 pr_debug("apply failed '%pOF'\n", fragment->target);
1401 @@ -498,7 +532,10 @@ static int build_changeset(struct overlay_changeset *ovcs)
1402
1403 if (ovcs->symbols_fragment) {
1404 fragment = &ovcs->fragments[ovcs->count - 1];
1405 - ret = build_changeset_symbols_node(ovcs, fragment->target,
1406 +
1407 + target.np = fragment->target;
1408 + target.in_livetree = true;
1409 + ret = build_changeset_symbols_node(ovcs, &target,
1410 fragment->overlay);
1411 if (ret) {
1412 pr_debug("apply failed '%pOF'\n", fragment->target);
1413 @@ -516,7 +553,7 @@ static int build_changeset(struct overlay_changeset *ovcs)
1414 * 1) "target" property containing the phandle of the target
1415 * 2) "target-path" property containing the path of the target
1416 */
1417 -static struct device_node *find_target_node(struct device_node *info_node)
1418 +static struct device_node *find_target(struct device_node *info_node)
1419 {
1420 struct device_node *node;
1421 const char *path;
1422 @@ -622,7 +659,7 @@ static int init_overlay_changeset(struct overlay_changeset *ovcs,
1423
1424 fragment = &fragments[cnt];
1425 fragment->overlay = overlay_node;
1426 - fragment->target = find_target_node(node);
1427 + fragment->target = find_target(node);
1428 if (!fragment->target) {
1429 of_node_put(fragment->overlay);
1430 ret = -EINVAL;
1431 diff --git a/drivers/of/platform.c b/drivers/of/platform.c
1432 index 6c59673933e9..04ad312fd85b 100644
1433 --- a/drivers/of/platform.c
1434 +++ b/drivers/of/platform.c
1435 @@ -91,8 +91,8 @@ static void of_device_make_bus_id(struct device *dev)
1436 */
1437 reg = of_get_property(node, "reg", NULL);
1438 if (reg && (addr = of_translate_address(node, reg)) != OF_BAD_ADDR) {
1439 - dev_set_name(dev, dev_name(dev) ? "%llx.%s:%s" : "%llx.%s",
1440 - (unsigned long long)addr, node->name,
1441 + dev_set_name(dev, dev_name(dev) ? "%llx.%pOFn:%s" : "%llx.%pOFn",
1442 + (unsigned long long)addr, node,
1443 dev_name(dev));
1444 return;
1445 }
1446 @@ -142,8 +142,8 @@ struct platform_device *of_device_alloc(struct device_node *np,
1447 WARN_ON(rc);
1448 }
1449 if (of_irq_to_resource_table(np, res, num_irq) != num_irq)
1450 - pr_debug("not all legacy IRQ resources mapped for %s\n",
1451 - np->name);
1452 + pr_debug("not all legacy IRQ resources mapped for %pOFn\n",
1453 + np);
1454 }
1455
1456 dev->dev.of_node = of_node_get(np);
1457 diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
1458 index 41b49716ac75..7f42314da6ae 100644
1459 --- a/drivers/of/unittest.c
1460 +++ b/drivers/of/unittest.c
1461 @@ -212,8 +212,8 @@ static int __init of_unittest_check_node_linkage(struct device_node *np)
1462
1463 for_each_child_of_node(np, child) {
1464 if (child->parent != np) {
1465 - pr_err("Child node %s links to wrong parent %s\n",
1466 - child->name, np->name);
1467 + pr_err("Child node %pOFn links to wrong parent %pOFn\n",
1468 + child, np);
1469 rc = -EINVAL;
1470 goto put_child;
1471 }
1472 @@ -1046,16 +1046,16 @@ static void __init of_unittest_platform_populate(void)
1473 for_each_child_of_node(np, child) {
1474 for_each_child_of_node(child, grandchild)
1475 unittest(of_find_device_by_node(grandchild),
1476 - "Could not create device for node '%s'\n",
1477 - grandchild->name);
1478 + "Could not create device for node '%pOFn'\n",
1479 + grandchild);
1480 }
1481
1482 of_platform_depopulate(&test_bus->dev);
1483 for_each_child_of_node(np, child) {
1484 for_each_child_of_node(child, grandchild)
1485 unittest(!of_find_device_by_node(grandchild),
1486 - "device didn't get destroyed '%s'\n",
1487 - grandchild->name);
1488 + "device didn't get destroyed '%pOFn'\n",
1489 + grandchild);
1490 }
1491
1492 platform_device_unregister(test_bus);
1493 diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c
1494 index db2af09067db..b6f2ff95c3ed 100644
1495 --- a/drivers/platform/x86/asus-nb-wmi.c
1496 +++ b/drivers/platform/x86/asus-nb-wmi.c
1497 @@ -442,8 +442,7 @@ static const struct key_entry asus_nb_wmi_keymap[] = {
1498 { KE_KEY, 0x30, { KEY_VOLUMEUP } },
1499 { KE_KEY, 0x31, { KEY_VOLUMEDOWN } },
1500 { KE_KEY, 0x32, { KEY_MUTE } },
1501 - { KE_KEY, 0x33, { KEY_DISPLAYTOGGLE } }, /* LCD on */
1502 - { KE_KEY, 0x34, { KEY_DISPLAY_OFF } }, /* LCD off */
1503 + { KE_KEY, 0x35, { KEY_SCREENLOCK } },
1504 { KE_KEY, 0x40, { KEY_PREVIOUSSONG } },
1505 { KE_KEY, 0x41, { KEY_NEXTSONG } },
1506 { KE_KEY, 0x43, { KEY_STOPCD } }, /* Stop/Eject */
1507 diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
1508 index a86aa65ad66d..39155d7cc894 100644
1509 --- a/drivers/vhost/net.c
1510 +++ b/drivers/vhost/net.c
1511 @@ -1114,7 +1114,8 @@ static int vhost_net_open(struct inode *inode, struct file *f)
1512 n->vqs[i].rx_ring = NULL;
1513 vhost_net_buf_init(&n->vqs[i].rxq);
1514 }
1515 - vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX);
1516 + vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX,
1517 + UIO_MAXIOV + VHOST_NET_BATCH);
1518
1519 vhost_poll_init(n->poll + VHOST_NET_VQ_TX, handle_tx_net, EPOLLOUT, dev);
1520 vhost_poll_init(n->poll + VHOST_NET_VQ_RX, handle_rx_net, EPOLLIN, dev);
1521 diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
1522 index e7e3ae13516d..0cfa925be4ec 100644
1523 --- a/drivers/vhost/scsi.c
1524 +++ b/drivers/vhost/scsi.c
1525 @@ -1398,7 +1398,7 @@ static int vhost_scsi_open(struct inode *inode, struct file *f)
1526 vqs[i] = &vs->vqs[i].vq;
1527 vs->vqs[i].vq.handle_kick = vhost_scsi_handle_kick;
1528 }
1529 - vhost_dev_init(&vs->dev, vqs, VHOST_SCSI_MAX_VQ);
1530 + vhost_dev_init(&vs->dev, vqs, VHOST_SCSI_MAX_VQ, UIO_MAXIOV);
1531
1532 vhost_scsi_init_inflight(vs, NULL);
1533
1534 diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
1535 index c66fc8308b5e..cf82e7266397 100644
1536 --- a/drivers/vhost/vhost.c
1537 +++ b/drivers/vhost/vhost.c
1538 @@ -390,9 +390,9 @@ static long vhost_dev_alloc_iovecs(struct vhost_dev *dev)
1539 vq->indirect = kmalloc_array(UIO_MAXIOV,
1540 sizeof(*vq->indirect),
1541 GFP_KERNEL);
1542 - vq->log = kmalloc_array(UIO_MAXIOV, sizeof(*vq->log),
1543 + vq->log = kmalloc_array(dev->iov_limit, sizeof(*vq->log),
1544 GFP_KERNEL);
1545 - vq->heads = kmalloc_array(UIO_MAXIOV, sizeof(*vq->heads),
1546 + vq->heads = kmalloc_array(dev->iov_limit, sizeof(*vq->heads),
1547 GFP_KERNEL);
1548 if (!vq->indirect || !vq->log || !vq->heads)
1549 goto err_nomem;
1550 @@ -414,7 +414,7 @@ static void vhost_dev_free_iovecs(struct vhost_dev *dev)
1551 }
1552
1553 void vhost_dev_init(struct vhost_dev *dev,
1554 - struct vhost_virtqueue **vqs, int nvqs)
1555 + struct vhost_virtqueue **vqs, int nvqs, int iov_limit)
1556 {
1557 struct vhost_virtqueue *vq;
1558 int i;
1559 @@ -427,6 +427,7 @@ void vhost_dev_init(struct vhost_dev *dev,
1560 dev->iotlb = NULL;
1561 dev->mm = NULL;
1562 dev->worker = NULL;
1563 + dev->iov_limit = iov_limit;
1564 init_llist_head(&dev->work_list);
1565 init_waitqueue_head(&dev->wait);
1566 INIT_LIST_HEAD(&dev->read_list);
1567 diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
1568 index 1b675dad5e05..9490e7ddb340 100644
1569 --- a/drivers/vhost/vhost.h
1570 +++ b/drivers/vhost/vhost.h
1571 @@ -170,9 +170,11 @@ struct vhost_dev {
1572 struct list_head read_list;
1573 struct list_head pending_list;
1574 wait_queue_head_t wait;
1575 + int iov_limit;
1576 };
1577
1578 -void vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs, int nvqs);
1579 +void vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs,
1580 + int nvqs, int iov_limit);
1581 long vhost_dev_set_owner(struct vhost_dev *dev);
1582 bool vhost_dev_has_owner(struct vhost_dev *dev);
1583 long vhost_dev_check_owner(struct vhost_dev *);
1584 diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
1585 index 98ed5be132c6..fa93f6711d8d 100644
1586 --- a/drivers/vhost/vsock.c
1587 +++ b/drivers/vhost/vsock.c
1588 @@ -531,7 +531,7 @@ static int vhost_vsock_dev_open(struct inode *inode, struct file *file)
1589 vsock->vqs[VSOCK_VQ_TX].handle_kick = vhost_vsock_handle_tx_kick;
1590 vsock->vqs[VSOCK_VQ_RX].handle_kick = vhost_vsock_handle_rx_kick;
1591
1592 - vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs));
1593 + vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs), UIO_MAXIOV);
1594
1595 file->private_data = vsock;
1596 spin_lock_init(&vsock->send_pkt_list_lock);
1597 diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
1598 index 7ad6f2eec711..48ac8b7c43a5 100644
1599 --- a/fs/btrfs/ctree.c
1600 +++ b/fs/btrfs/ctree.c
1601 @@ -1003,6 +1003,48 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,
1602 return 0;
1603 }
1604
1605 +static struct extent_buffer *alloc_tree_block_no_bg_flush(
1606 + struct btrfs_trans_handle *trans,
1607 + struct btrfs_root *root,
1608 + u64 parent_start,
1609 + const struct btrfs_disk_key *disk_key,
1610 + int level,
1611 + u64 hint,
1612 + u64 empty_size)
1613 +{
1614 + struct btrfs_fs_info *fs_info = root->fs_info;
1615 + struct extent_buffer *ret;
1616 +
1617 + /*
1618 + * If we are COWing a node/leaf from the extent, chunk, device or free
1619 + * space trees, make sure that we do not finish block group creation of
1620 + * pending block groups. We do this to avoid a deadlock.
1621 + * COWing can result in allocation of a new chunk, and flushing pending
1622 + * block groups (btrfs_create_pending_block_groups()) can be triggered
1623 + * when finishing allocation of a new chunk. Creation of a pending block
1624 + * group modifies the extent, chunk, device and free space trees,
1625 + * therefore we could deadlock with ourselves since we are holding a
1626 + * lock on an extent buffer that btrfs_create_pending_block_groups() may
1627 + * try to COW later.
1628 + * For similar reasons, we also need to delay flushing pending block
1629 + * groups when splitting a leaf or node, from one of those trees, since
1630 + * we are holding a write lock on it and its parent or when inserting a
1631 + * new root node for one of those trees.
1632 + */
1633 + if (root == fs_info->extent_root ||
1634 + root == fs_info->chunk_root ||
1635 + root == fs_info->dev_root ||
1636 + root == fs_info->free_space_root)
1637 + trans->can_flush_pending_bgs = false;
1638 +
1639 + ret = btrfs_alloc_tree_block(trans, root, parent_start,
1640 + root->root_key.objectid, disk_key, level,
1641 + hint, empty_size);
1642 + trans->can_flush_pending_bgs = true;
1643 +
1644 + return ret;
1645 +}
1646 +
1647 /*
1648 * does the dirty work in cow of a single block. The parent block (if
1649 * supplied) is updated to point to the new cow copy. The new buffer is marked
1650 @@ -1050,28 +1092,8 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,
1651 if ((root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && parent)
1652 parent_start = parent->start;
1653
1654 - /*
1655 - * If we are COWing a node/leaf from the extent, chunk, device or free
1656 - * space trees, make sure that we do not finish block group creation of
1657 - * pending block groups. We do this to avoid a deadlock.
1658 - * COWing can result in allocation of a new chunk, and flushing pending
1659 - * block groups (btrfs_create_pending_block_groups()) can be triggered
1660 - * when finishing allocation of a new chunk. Creation of a pending block
1661 - * group modifies the extent, chunk, device and free space trees,
1662 - * therefore we could deadlock with ourselves since we are holding a
1663 - * lock on an extent buffer that btrfs_create_pending_block_groups() may
1664 - * try to COW later.
1665 - */
1666 - if (root == fs_info->extent_root ||
1667 - root == fs_info->chunk_root ||
1668 - root == fs_info->dev_root ||
1669 - root == fs_info->free_space_root)
1670 - trans->can_flush_pending_bgs = false;
1671 -
1672 - cow = btrfs_alloc_tree_block(trans, root, parent_start,
1673 - root->root_key.objectid, &disk_key, level,
1674 - search_start, empty_size);
1675 - trans->can_flush_pending_bgs = true;
1676 + cow = alloc_tree_block_no_bg_flush(trans, root, parent_start, &disk_key,
1677 + level, search_start, empty_size);
1678 if (IS_ERR(cow))
1679 return PTR_ERR(cow);
1680
1681 @@ -3383,8 +3405,8 @@ static noinline int insert_new_root(struct btrfs_trans_handle *trans,
1682 else
1683 btrfs_node_key(lower, &lower_key, 0);
1684
1685 - c = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
1686 - &lower_key, level, root->node->start, 0);
1687 + c = alloc_tree_block_no_bg_flush(trans, root, 0, &lower_key, level,
1688 + root->node->start, 0);
1689 if (IS_ERR(c))
1690 return PTR_ERR(c);
1691
1692 @@ -3513,8 +3535,8 @@ static noinline int split_node(struct btrfs_trans_handle *trans,
1693 mid = (c_nritems + 1) / 2;
1694 btrfs_node_key(c, &disk_key, mid);
1695
1696 - split = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
1697 - &disk_key, level, c->start, 0);
1698 + split = alloc_tree_block_no_bg_flush(trans, root, 0, &disk_key, level,
1699 + c->start, 0);
1700 if (IS_ERR(split))
1701 return PTR_ERR(split);
1702
1703 @@ -4298,8 +4320,8 @@ again:
1704 else
1705 btrfs_item_key(l, &disk_key, mid);
1706
1707 - right = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
1708 - &disk_key, 0, l->start, 0);
1709 + right = alloc_tree_block_no_bg_flush(trans, root, 0, &disk_key, 0,
1710 + l->start, 0);
1711 if (IS_ERR(right))
1712 return PTR_ERR(right);
1713
1714 diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
1715 index 8ad145820ea8..8888337a95b6 100644
1716 --- a/fs/btrfs/super.c
1717 +++ b/fs/btrfs/super.c
1718 @@ -1677,6 +1677,7 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
1719 flags | SB_RDONLY, device_name, data);
1720 if (IS_ERR(mnt_root)) {
1721 root = ERR_CAST(mnt_root);
1722 + kfree(subvol_name);
1723 goto out;
1724 }
1725
1726 @@ -1686,12 +1687,14 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
1727 if (error < 0) {
1728 root = ERR_PTR(error);
1729 mntput(mnt_root);
1730 + kfree(subvol_name);
1731 goto out;
1732 }
1733 }
1734 }
1735 if (IS_ERR(mnt_root)) {
1736 root = ERR_CAST(mnt_root);
1737 + kfree(subvol_name);
1738 goto out;
1739 }
1740
1741 diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
1742 index d0bba175117c..a5ea742654aa 100644
1743 --- a/fs/cifs/connect.c
1744 +++ b/fs/cifs/connect.c
1745 @@ -50,6 +50,7 @@
1746 #include "cifs_unicode.h"
1747 #include "cifs_debug.h"
1748 #include "cifs_fs_sb.h"
1749 +#include "dns_resolve.h"
1750 #include "ntlmssp.h"
1751 #include "nterr.h"
1752 #include "rfc1002pdu.h"
1753 @@ -317,6 +318,53 @@ static void cifs_prune_tlinks(struct work_struct *work);
1754 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
1755 const char *devname, bool is_smb3);
1756
1757 +/*
1758 + * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
1759 + * get their ip addresses changed at some point.
1760 + *
1761 + * This should be called with server->srv_mutex held.
1762 + */
1763 +#ifdef CONFIG_CIFS_DFS_UPCALL
1764 +static int reconn_set_ipaddr(struct TCP_Server_Info *server)
1765 +{
1766 + int rc;
1767 + int len;
1768 + char *unc, *ipaddr = NULL;
1769 +
1770 + if (!server->hostname)
1771 + return -EINVAL;
1772 +
1773 + len = strlen(server->hostname) + 3;
1774 +
1775 + unc = kmalloc(len, GFP_KERNEL);
1776 + if (!unc) {
1777 + cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
1778 + return -ENOMEM;
1779 + }
1780 + snprintf(unc, len, "\\\\%s", server->hostname);
1781 +
1782 + rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
1783 + kfree(unc);
1784 +
1785 + if (rc < 0) {
1786 + cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
1787 + __func__, server->hostname, rc);
1788 + return rc;
1789 + }
1790 +
1791 + rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
1792 + strlen(ipaddr));
1793 + kfree(ipaddr);
1794 +
1795 + return !rc ? -1 : 0;
1796 +}
1797 +#else
1798 +static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
1799 +{
1800 + return 0;
1801 +}
1802 +#endif
1803 +
1804 /*
1805 * cifs tcp session reconnection
1806 *
1807 @@ -417,6 +465,11 @@ cifs_reconnect(struct TCP_Server_Info *server)
1808 rc = generic_ip_connect(server);
1809 if (rc) {
1810 cifs_dbg(FYI, "reconnect error %d\n", rc);
1811 + rc = reconn_set_ipaddr(server);
1812 + if (rc) {
1813 + cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
1814 + __func__, rc);
1815 + }
1816 mutex_unlock(&server->srv_mutex);
1817 msleep(3000);
1818 } else {
1819 diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
1820 index dba986524917..8a01e89ff827 100644
1821 --- a/fs/cifs/smb2pdu.c
1822 +++ b/fs/cifs/smb2pdu.c
1823 @@ -3127,8 +3127,17 @@ smb2_readv_callback(struct mid_q_entry *mid)
1824 rdata->mr = NULL;
1825 }
1826 #endif
1827 - if (rdata->result)
1828 + if (rdata->result && rdata->result != -ENODATA) {
1829 cifs_stats_fail_inc(tcon, SMB2_READ_HE);
1830 + trace_smb3_read_err(0 /* xid */,
1831 + rdata->cfile->fid.persistent_fid,
1832 + tcon->tid, tcon->ses->Suid, rdata->offset,
1833 + rdata->bytes, rdata->result);
1834 + } else
1835 + trace_smb3_read_done(0 /* xid */,
1836 + rdata->cfile->fid.persistent_fid,
1837 + tcon->tid, tcon->ses->Suid,
1838 + rdata->offset, rdata->got_bytes);
1839
1840 queue_work(cifsiod_wq, &rdata->work);
1841 DeleteMidQEntry(mid);
1842 @@ -3203,13 +3212,11 @@ smb2_async_readv(struct cifs_readdata *rdata)
1843 if (rc) {
1844 kref_put(&rdata->refcount, cifs_readdata_release);
1845 cifs_stats_fail_inc(io_parms.tcon, SMB2_READ_HE);
1846 - trace_smb3_read_err(rc, 0 /* xid */, io_parms.persistent_fid,
1847 - io_parms.tcon->tid, io_parms.tcon->ses->Suid,
1848 - io_parms.offset, io_parms.length);
1849 - } else
1850 - trace_smb3_read_done(0 /* xid */, io_parms.persistent_fid,
1851 - io_parms.tcon->tid, io_parms.tcon->ses->Suid,
1852 - io_parms.offset, io_parms.length);
1853 + trace_smb3_read_err(0 /* xid */, io_parms.persistent_fid,
1854 + io_parms.tcon->tid,
1855 + io_parms.tcon->ses->Suid,
1856 + io_parms.offset, io_parms.length, rc);
1857 + }
1858
1859 cifs_small_buf_release(buf);
1860 return rc;
1861 @@ -3253,10 +3260,11 @@ SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms,
1862 if (rc != -ENODATA) {
1863 cifs_stats_fail_inc(io_parms->tcon, SMB2_READ_HE);
1864 cifs_dbg(VFS, "Send error in read = %d\n", rc);
1865 + trace_smb3_read_err(xid, req->PersistentFileId,
1866 + io_parms->tcon->tid, ses->Suid,
1867 + io_parms->offset, io_parms->length,
1868 + rc);
1869 }
1870 - trace_smb3_read_err(rc, xid, req->PersistentFileId,
1871 - io_parms->tcon->tid, ses->Suid,
1872 - io_parms->offset, io_parms->length);
1873 free_rsp_buf(resp_buftype, rsp_iov.iov_base);
1874 return rc == -ENODATA ? 0 : rc;
1875 } else
1876 @@ -3342,8 +3350,17 @@ smb2_writev_callback(struct mid_q_entry *mid)
1877 wdata->mr = NULL;
1878 }
1879 #endif
1880 - if (wdata->result)
1881 + if (wdata->result) {
1882 cifs_stats_fail_inc(tcon, SMB2_WRITE_HE);
1883 + trace_smb3_write_err(0 /* no xid */,
1884 + wdata->cfile->fid.persistent_fid,
1885 + tcon->tid, tcon->ses->Suid, wdata->offset,
1886 + wdata->bytes, wdata->result);
1887 + } else
1888 + trace_smb3_write_done(0 /* no xid */,
1889 + wdata->cfile->fid.persistent_fid,
1890 + tcon->tid, tcon->ses->Suid,
1891 + wdata->offset, wdata->bytes);
1892
1893 queue_work(cifsiod_wq, &wdata->work);
1894 DeleteMidQEntry(mid);
1895 @@ -3485,10 +3502,7 @@ smb2_async_writev(struct cifs_writedata *wdata,
1896 wdata->bytes, rc);
1897 kref_put(&wdata->refcount, release);
1898 cifs_stats_fail_inc(tcon, SMB2_WRITE_HE);
1899 - } else
1900 - trace_smb3_write_done(0 /* no xid */, req->PersistentFileId,
1901 - tcon->tid, tcon->ses->Suid, wdata->offset,
1902 - wdata->bytes);
1903 + }
1904
1905 async_writev_out:
1906 cifs_small_buf_release(req);
1907 @@ -3714,8 +3728,8 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon,
1908 rsp->sync_hdr.Status == STATUS_NO_MORE_FILES) {
1909 srch_inf->endOfSearch = true;
1910 rc = 0;
1911 - }
1912 - cifs_stats_fail_inc(tcon, SMB2_QUERY_DIRECTORY_HE);
1913 + } else
1914 + cifs_stats_fail_inc(tcon, SMB2_QUERY_DIRECTORY_HE);
1915 goto qdir_exit;
1916 }
1917
1918 diff --git a/fs/dcache.c b/fs/dcache.c
1919 index 2e7e8d85e9b4..cb515f183482 100644
1920 --- a/fs/dcache.c
1921 +++ b/fs/dcache.c
1922 @@ -1202,15 +1202,11 @@ static enum lru_status dentry_lru_isolate_shrink(struct list_head *item,
1923 */
1924 void shrink_dcache_sb(struct super_block *sb)
1925 {
1926 - long freed;
1927 -
1928 do {
1929 LIST_HEAD(dispose);
1930
1931 - freed = list_lru_walk(&sb->s_dentry_lru,
1932 + list_lru_walk(&sb->s_dentry_lru,
1933 dentry_lru_isolate_shrink, &dispose, 1024);
1934 -
1935 - this_cpu_sub(nr_dentry_unused, freed);
1936 shrink_dentry_list(&dispose);
1937 } while (list_lru_count(&sb->s_dentry_lru) > 0);
1938 }
1939 diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
1940 index e978f6930575..449d0cb45a84 100644
1941 --- a/fs/gfs2/rgrp.c
1942 +++ b/fs/gfs2/rgrp.c
1943 @@ -1747,9 +1747,9 @@ static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext,
1944 goto next_iter;
1945 }
1946 if (ret == -E2BIG) {
1947 - n += rbm->bii - initial_bii;
1948 rbm->bii = 0;
1949 rbm->offset = 0;
1950 + n += (rbm->bii - initial_bii);
1951 goto res_covered_end_of_rgrp;
1952 }
1953 return ret;
1954 diff --git a/fs/nfs/write.c b/fs/nfs/write.c
1955 index 586726a590d8..d790faff8e47 100644
1956 --- a/fs/nfs/write.c
1957 +++ b/fs/nfs/write.c
1958 @@ -621,11 +621,12 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
1959 nfs_set_page_writeback(page);
1960 WARN_ON_ONCE(test_bit(PG_CLEAN, &req->wb_flags));
1961
1962 - ret = 0;
1963 + ret = req->wb_context->error;
1964 /* If there is a fatal error that covers this write, just exit */
1965 - if (nfs_error_is_fatal_on_server(req->wb_context->error))
1966 + if (nfs_error_is_fatal_on_server(ret))
1967 goto out_launder;
1968
1969 + ret = 0;
1970 if (!nfs_pageio_add_request(pgio, req)) {
1971 ret = pgio->pg_error;
1972 /*
1973 @@ -635,9 +636,9 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
1974 nfs_context_set_write_error(req->wb_context, ret);
1975 if (nfs_error_is_fatal_on_server(ret))
1976 goto out_launder;
1977 - }
1978 + } else
1979 + ret = -EAGAIN;
1980 nfs_redirty_request(req);
1981 - ret = -EAGAIN;
1982 } else
1983 nfs_add_stats(page_file_mapping(page)->host,
1984 NFSIOS_WRITEPAGES, 1);
1985 diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
1986 index d837dad24b4c..21fef8c5eca7 100644
1987 --- a/include/linux/netdevice.h
1988 +++ b/include/linux/netdevice.h
1989 @@ -1455,6 +1455,7 @@ struct net_device_ops {
1990 * @IFF_NO_RX_HANDLER: device doesn't support the rx_handler hook
1991 * @IFF_FAILOVER: device is a failover master device
1992 * @IFF_FAILOVER_SLAVE: device is lower dev of a failover master device
1993 + * @IFF_L3MDEV_RX_HANDLER: only invoke the rx handler of L3 master device
1994 */
1995 enum netdev_priv_flags {
1996 IFF_802_1Q_VLAN = 1<<0,
1997 @@ -1486,6 +1487,7 @@ enum netdev_priv_flags {
1998 IFF_NO_RX_HANDLER = 1<<26,
1999 IFF_FAILOVER = 1<<27,
2000 IFF_FAILOVER_SLAVE = 1<<28,
2001 + IFF_L3MDEV_RX_HANDLER = 1<<29,
2002 };
2003
2004 #define IFF_802_1Q_VLAN IFF_802_1Q_VLAN
2005 @@ -1516,6 +1518,7 @@ enum netdev_priv_flags {
2006 #define IFF_NO_RX_HANDLER IFF_NO_RX_HANDLER
2007 #define IFF_FAILOVER IFF_FAILOVER
2008 #define IFF_FAILOVER_SLAVE IFF_FAILOVER_SLAVE
2009 +#define IFF_L3MDEV_RX_HANDLER IFF_L3MDEV_RX_HANDLER
2010
2011 /**
2012 * struct net_device - The DEVICE structure.
2013 @@ -4464,6 +4467,11 @@ static inline bool netif_supports_nofcs(struct net_device *dev)
2014 return dev->priv_flags & IFF_SUPP_NOFCS;
2015 }
2016
2017 +static inline bool netif_has_l3_rx_handler(const struct net_device *dev)
2018 +{
2019 + return dev->priv_flags & IFF_L3MDEV_RX_HANDLER;
2020 +}
2021 +
2022 static inline bool netif_is_l3_master(const struct net_device *dev)
2023 {
2024 return dev->priv_flags & IFF_L3MDEV_MASTER;
2025 diff --git a/include/linux/of.h b/include/linux/of.h
2026 index 99b0ebf49632..40e58b0e9cf4 100644
2027 --- a/include/linux/of.h
2028 +++ b/include/linux/of.h
2029 @@ -138,11 +138,16 @@ extern struct device_node *of_aliases;
2030 extern struct device_node *of_stdout;
2031 extern raw_spinlock_t devtree_lock;
2032
2033 -/* flag descriptions (need to be visible even when !CONFIG_OF) */
2034 -#define OF_DYNAMIC 1 /* node and properties were allocated via kmalloc */
2035 -#define OF_DETACHED 2 /* node has been detached from the device tree */
2036 -#define OF_POPULATED 3 /* device already created for the node */
2037 -#define OF_POPULATED_BUS 4 /* of_platform_populate recursed to children of this node */
2038 +/*
2039 + * struct device_node flag descriptions
2040 + * (need to be visible even when !CONFIG_OF)
2041 + */
2042 +#define OF_DYNAMIC 1 /* (and properties) allocated via kmalloc */
2043 +#define OF_DETACHED 2 /* detached from the device tree */
2044 +#define OF_POPULATED 3 /* device already created */
2045 +#define OF_POPULATED_BUS 4 /* platform bus created for children */
2046 +#define OF_OVERLAY 5 /* allocated for an overlay */
2047 +#define OF_OVERLAY_FREE_CSET 6 /* in overlay cset being freed */
2048
2049 #define OF_BAD_ADDR ((u64)-1)
2050
2051 diff --git a/include/linux/sched/coredump.h b/include/linux/sched/coredump.h
2052 index ec912d01126f..ecdc6542070f 100644
2053 --- a/include/linux/sched/coredump.h
2054 +++ b/include/linux/sched/coredump.h
2055 @@ -71,6 +71,7 @@ static inline int get_dumpable(struct mm_struct *mm)
2056 #define MMF_HUGE_ZERO_PAGE 23 /* mm has ever used the global huge zero page */
2057 #define MMF_DISABLE_THP 24 /* disable THP for all VMAs */
2058 #define MMF_OOM_VICTIM 25 /* mm is the oom victim */
2059 +#define MMF_OOM_REAP_QUEUED 26 /* mm was queued for oom_reaper */
2060 #define MMF_DISABLE_THP_MASK (1 << MMF_DISABLE_THP)
2061
2062 #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\
2063 diff --git a/include/net/l3mdev.h b/include/net/l3mdev.h
2064 index 3832099289c5..128487658ff7 100644
2065 --- a/include/net/l3mdev.h
2066 +++ b/include/net/l3mdev.h
2067 @@ -142,7 +142,8 @@ struct sk_buff *l3mdev_l3_rcv(struct sk_buff *skb, u16 proto)
2068
2069 if (netif_is_l3_slave(skb->dev))
2070 master = netdev_master_upper_dev_get_rcu(skb->dev);
2071 - else if (netif_is_l3_master(skb->dev))
2072 + else if (netif_is_l3_master(skb->dev) ||
2073 + netif_has_l3_rx_handler(skb->dev))
2074 master = skb->dev;
2075
2076 if (master && master->l3mdev_ops->l3mdev_l3_rcv)
2077 diff --git a/kernel/exit.c b/kernel/exit.c
2078 index 0e21e6d21f35..55b4fa6d01eb 100644
2079 --- a/kernel/exit.c
2080 +++ b/kernel/exit.c
2081 @@ -558,12 +558,14 @@ static struct task_struct *find_alive_thread(struct task_struct *p)
2082 return NULL;
2083 }
2084
2085 -static struct task_struct *find_child_reaper(struct task_struct *father)
2086 +static struct task_struct *find_child_reaper(struct task_struct *father,
2087 + struct list_head *dead)
2088 __releases(&tasklist_lock)
2089 __acquires(&tasklist_lock)
2090 {
2091 struct pid_namespace *pid_ns = task_active_pid_ns(father);
2092 struct task_struct *reaper = pid_ns->child_reaper;
2093 + struct task_struct *p, *n;
2094
2095 if (likely(reaper != father))
2096 return reaper;
2097 @@ -579,6 +581,12 @@ static struct task_struct *find_child_reaper(struct task_struct *father)
2098 panic("Attempted to kill init! exitcode=0x%08x\n",
2099 father->signal->group_exit_code ?: father->exit_code);
2100 }
2101 +
2102 + list_for_each_entry_safe(p, n, dead, ptrace_entry) {
2103 + list_del_init(&p->ptrace_entry);
2104 + release_task(p);
2105 + }
2106 +
2107 zap_pid_ns_processes(pid_ns);
2108 write_lock_irq(&tasklist_lock);
2109
2110 @@ -668,7 +676,7 @@ static void forget_original_parent(struct task_struct *father,
2111 exit_ptrace(father, dead);
2112
2113 /* Can drop and reacquire tasklist_lock */
2114 - reaper = find_child_reaper(father);
2115 + reaper = find_child_reaper(father, dead);
2116 if (list_empty(&father->children))
2117 return;
2118
2119 diff --git a/mm/hugetlb.c b/mm/hugetlb.c
2120 index 309fb8c969af..10e83672bfbe 100644
2121 --- a/mm/hugetlb.c
2122 +++ b/mm/hugetlb.c
2123 @@ -4269,7 +4269,8 @@ long follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
2124 break;
2125 }
2126 if (ret & VM_FAULT_RETRY) {
2127 - if (nonblocking)
2128 + if (nonblocking &&
2129 + !(fault_flags & FAULT_FLAG_RETRY_NOWAIT))
2130 *nonblocking = 0;
2131 *nr_pages = 0;
2132 /*
2133 diff --git a/mm/memory-failure.c b/mm/memory-failure.c
2134 index 0cd3de3550f0..d9b8a2490633 100644
2135 --- a/mm/memory-failure.c
2136 +++ b/mm/memory-failure.c
2137 @@ -372,7 +372,8 @@ static void kill_procs(struct list_head *to_kill, int forcekill, bool fail,
2138 if (fail || tk->addr_valid == 0) {
2139 pr_err("Memory failure: %#lx: forcibly killing %s:%d because of failure to unmap corrupted page\n",
2140 pfn, tk->tsk->comm, tk->tsk->pid);
2141 - force_sig(SIGKILL, tk->tsk);
2142 + do_send_sig_info(SIGKILL, SEND_SIG_PRIV,
2143 + tk->tsk, PIDTYPE_PID);
2144 }
2145
2146 /*
2147 diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
2148 index 8a136ffda370..c6119ad3561e 100644
2149 --- a/mm/memory_hotplug.c
2150 +++ b/mm/memory_hotplug.c
2151 @@ -1326,23 +1326,27 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn,
2152 static unsigned long scan_movable_pages(unsigned long start, unsigned long end)
2153 {
2154 unsigned long pfn;
2155 - struct page *page;
2156 +
2157 for (pfn = start; pfn < end; pfn++) {
2158 - if (pfn_valid(pfn)) {
2159 - page = pfn_to_page(pfn);
2160 - if (PageLRU(page))
2161 - return pfn;
2162 - if (__PageMovable(page))
2163 - return pfn;
2164 - if (PageHuge(page)) {
2165 - if (hugepage_migration_supported(page_hstate(page)) &&
2166 - page_huge_active(page))
2167 - return pfn;
2168 - else
2169 - pfn = round_up(pfn + 1,
2170 - 1 << compound_order(page)) - 1;
2171 - }
2172 - }
2173 + struct page *page, *head;
2174 + unsigned long skip;
2175 +
2176 + if (!pfn_valid(pfn))
2177 + continue;
2178 + page = pfn_to_page(pfn);
2179 + if (PageLRU(page))
2180 + return pfn;
2181 + if (__PageMovable(page))
2182 + return pfn;
2183 +
2184 + if (!PageHuge(page))
2185 + continue;
2186 + head = compound_head(page);
2187 + if (hugepage_migration_supported(page_hstate(head)) &&
2188 + page_huge_active(head))
2189 + return pfn;
2190 + skip = (1 << compound_order(head)) - (page - head);
2191 + pfn += skip - 1;
2192 }
2193 return 0;
2194 }
2195 diff --git a/mm/migrate.c b/mm/migrate.c
2196 index 84381b55b2bd..ab260260a626 100644
2197 --- a/mm/migrate.c
2198 +++ b/mm/migrate.c
2199 @@ -1118,10 +1118,13 @@ out:
2200 * If migration is successful, decrease refcount of the newpage
2201 * which will not free the page because new page owner increased
2202 * refcounter. As well, if it is LRU page, add the page to LRU
2203 - * list in here.
2204 + * list in here. Use the old state of the isolated source page to
2205 + * determine if we migrated a LRU page. newpage was already unlocked
2206 + * and possibly modified by its owner - don't rely on the page
2207 + * state.
2208 */
2209 if (rc == MIGRATEPAGE_SUCCESS) {
2210 - if (unlikely(__PageMovable(newpage)))
2211 + if (unlikely(!is_lru))
2212 put_page(newpage);
2213 else
2214 putback_lru_page(newpage);
2215 diff --git a/mm/oom_kill.c b/mm/oom_kill.c
2216 index f10aa5360616..e66ac8a47dd6 100644
2217 --- a/mm/oom_kill.c
2218 +++ b/mm/oom_kill.c
2219 @@ -634,8 +634,8 @@ static int oom_reaper(void *unused)
2220
2221 static void wake_oom_reaper(struct task_struct *tsk)
2222 {
2223 - /* tsk is already queued? */
2224 - if (tsk == oom_reaper_list || tsk->oom_reaper_list)
2225 + /* mm is already queued? */
2226 + if (test_and_set_bit(MMF_OOM_REAP_QUEUED, &tsk->signal->oom_mm->flags))
2227 return;
2228
2229 get_task_struct(tsk);
2230 @@ -962,6 +962,13 @@ static void oom_kill_process(struct oom_control *oc, const char *message)
2231 * still freeing memory.
2232 */
2233 read_lock(&tasklist_lock);
2234 +
2235 + /*
2236 + * The task 'p' might have already exited before reaching here. The
2237 + * put_task_struct() will free task_struct 'p' while the loop still try
2238 + * to access the field of 'p', so, get an extra reference.
2239 + */
2240 + get_task_struct(p);
2241 for_each_thread(p, t) {
2242 list_for_each_entry(child, &t->children, sibling) {
2243 unsigned int child_points;
2244 @@ -981,6 +988,7 @@ static void oom_kill_process(struct oom_control *oc, const char *message)
2245 }
2246 }
2247 }
2248 + put_task_struct(p);
2249 read_unlock(&tasklist_lock);
2250
2251 /*
2252 diff --git a/net/core/dev.c b/net/core/dev.c
2253 index 1f1aae27d41f..af097ca9cb4f 100644
2254 --- a/net/core/dev.c
2255 +++ b/net/core/dev.c
2256 @@ -8599,6 +8599,9 @@ int init_dummy_netdev(struct net_device *dev)
2257 set_bit(__LINK_STATE_PRESENT, &dev->state);
2258 set_bit(__LINK_STATE_START, &dev->state);
2259
2260 + /* napi_busy_loop stats accounting wants this */
2261 + dev_net_set(dev, &init_net);
2262 +
2263 /* Note : We dont allocate pcpu_refcnt for dummy devices,
2264 * because users of this 'device' dont need to change
2265 * its refcount.
2266 diff --git a/net/ipv4/gre_demux.c b/net/ipv4/gre_demux.c
2267 index b798862b6be5..f21ea6125fc2 100644
2268 --- a/net/ipv4/gre_demux.c
2269 +++ b/net/ipv4/gre_demux.c
2270 @@ -25,6 +25,7 @@
2271 #include <linux/spinlock.h>
2272 #include <net/protocol.h>
2273 #include <net/gre.h>
2274 +#include <net/erspan.h>
2275
2276 #include <net/icmp.h>
2277 #include <net/route.h>
2278 @@ -118,6 +119,22 @@ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
2279 hdr_len += 4;
2280 }
2281 tpi->hdr_len = hdr_len;
2282 +
2283 + /* ERSPAN ver 1 and 2 protocol sets GRE key field
2284 + * to 0 and sets the configured key in the
2285 + * inner erspan header field
2286 + */
2287 + if (greh->protocol == htons(ETH_P_ERSPAN) ||
2288 + greh->protocol == htons(ETH_P_ERSPAN2)) {
2289 + struct erspan_base_hdr *ershdr;
2290 +
2291 + if (!pskb_may_pull(skb, nhs + hdr_len + sizeof(*ershdr)))
2292 + return -EINVAL;
2293 +
2294 + ershdr = (struct erspan_base_hdr *)options;
2295 + tpi->key = cpu_to_be32(get_session_id(ershdr));
2296 + }
2297 +
2298 return hdr_len;
2299 }
2300 EXPORT_SYMBOL(gre_parse_header);
2301 diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
2302 index f8bbd693c19c..d95b32af4a0e 100644
2303 --- a/net/ipv4/ip_fragment.c
2304 +++ b/net/ipv4/ip_fragment.c
2305 @@ -425,6 +425,7 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
2306 * fragment.
2307 */
2308
2309 + err = -EINVAL;
2310 /* Find out where to put this fragment. */
2311 prev_tail = qp->q.fragments_tail;
2312 if (!prev_tail)
2313 @@ -501,7 +502,6 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
2314
2315 discard_qp:
2316 inet_frag_kill(&qp->q);
2317 - err = -EINVAL;
2318 __IP_INC_STATS(net, IPSTATS_MIB_REASM_OVERLAPS);
2319 err:
2320 kfree_skb(skb);
2321 diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
2322 index 0bfad3e72509..f199945f6e4a 100644
2323 --- a/net/ipv4/ip_gre.c
2324 +++ b/net/ipv4/ip_gre.c
2325 @@ -269,20 +269,11 @@ static int erspan_rcv(struct sk_buff *skb, struct tnl_ptk_info *tpi,
2326 int len;
2327
2328 itn = net_generic(net, erspan_net_id);
2329 - len = gre_hdr_len + sizeof(*ershdr);
2330 -
2331 - /* Check based hdr len */
2332 - if (unlikely(!pskb_may_pull(skb, len)))
2333 - return PACKET_REJECT;
2334
2335 iph = ip_hdr(skb);
2336 ershdr = (struct erspan_base_hdr *)(skb->data + gre_hdr_len);
2337 ver = ershdr->ver;
2338
2339 - /* The original GRE header does not have key field,
2340 - * Use ERSPAN 10-bit session ID as key.
2341 - */
2342 - tpi->key = cpu_to_be32(get_session_id(ershdr));
2343 tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex,
2344 tpi->flags | TUNNEL_KEY,
2345 iph->saddr, iph->daddr, tpi->key);
2346 @@ -1471,12 +1462,17 @@ static int ipgre_fill_info(struct sk_buff *skb, const struct net_device *dev)
2347 {
2348 struct ip_tunnel *t = netdev_priv(dev);
2349 struct ip_tunnel_parm *p = &t->parms;
2350 + __be16 o_flags = p->o_flags;
2351 +
2352 + if ((t->erspan_ver == 1 || t->erspan_ver == 2) &&
2353 + !t->collect_md)
2354 + o_flags |= TUNNEL_KEY;
2355
2356 if (nla_put_u32(skb, IFLA_GRE_LINK, p->link) ||
2357 nla_put_be16(skb, IFLA_GRE_IFLAGS,
2358 gre_tnl_flags_to_gre_flags(p->i_flags)) ||
2359 nla_put_be16(skb, IFLA_GRE_OFLAGS,
2360 - gre_tnl_flags_to_gre_flags(p->o_flags)) ||
2361 + gre_tnl_flags_to_gre_flags(o_flags)) ||
2362 nla_put_be32(skb, IFLA_GRE_IKEY, p->i_key) ||
2363 nla_put_be32(skb, IFLA_GRE_OKEY, p->o_key) ||
2364 nla_put_in_addr(skb, IFLA_GRE_LOCAL, p->iph.saddr) ||
2365 diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
2366 index 506b2ae07bb3..79fcd9550fd2 100644
2367 --- a/net/ipv6/af_inet6.c
2368 +++ b/net/ipv6/af_inet6.c
2369 @@ -361,6 +361,9 @@ static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
2370 err = -EINVAL;
2371 goto out_unlock;
2372 }
2373 + }
2374 +
2375 + if (sk->sk_bound_dev_if) {
2376 dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if);
2377 if (!dev) {
2378 err = -ENODEV;
2379 diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
2380 index 345e6839f031..be04877b3827 100644
2381 --- a/net/ipv6/ip6_gre.c
2382 +++ b/net/ipv6/ip6_gre.c
2383 @@ -550,13 +550,9 @@ static int ip6erspan_rcv(struct sk_buff *skb, int gre_hdr_len,
2384 struct ip6_tnl *tunnel;
2385 u8 ver;
2386
2387 - if (unlikely(!pskb_may_pull(skb, sizeof(*ershdr))))
2388 - return PACKET_REJECT;
2389 -
2390 ipv6h = ipv6_hdr(skb);
2391 ershdr = (struct erspan_base_hdr *)skb->data;
2392 ver = ershdr->ver;
2393 - tpi->key = cpu_to_be32(get_session_id(ershdr));
2394
2395 tunnel = ip6gre_tunnel_lookup(skb->dev,
2396 &ipv6h->saddr, &ipv6h->daddr, tpi->key,
2397 @@ -2124,12 +2120,17 @@ static int ip6gre_fill_info(struct sk_buff *skb, const struct net_device *dev)
2398 {
2399 struct ip6_tnl *t = netdev_priv(dev);
2400 struct __ip6_tnl_parm *p = &t->parms;
2401 + __be16 o_flags = p->o_flags;
2402 +
2403 + if ((p->erspan_ver == 1 || p->erspan_ver == 2) &&
2404 + !p->collect_md)
2405 + o_flags |= TUNNEL_KEY;
2406
2407 if (nla_put_u32(skb, IFLA_GRE_LINK, p->link) ||
2408 nla_put_be16(skb, IFLA_GRE_IFLAGS,
2409 gre_tnl_flags_to_gre_flags(p->i_flags)) ||
2410 nla_put_be16(skb, IFLA_GRE_OFLAGS,
2411 - gre_tnl_flags_to_gre_flags(p->o_flags)) ||
2412 + gre_tnl_flags_to_gre_flags(o_flags)) ||
2413 nla_put_be32(skb, IFLA_GRE_IKEY, p->i_key) ||
2414 nla_put_be32(skb, IFLA_GRE_OKEY, p->o_key) ||
2415 nla_put_in6_addr(skb, IFLA_GRE_LOCAL, &p->laddr) ||
2416 diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
2417 index 331e6b6dd252..10aafea3af0f 100644
2418 --- a/net/ipv6/ip6mr.c
2419 +++ b/net/ipv6/ip6mr.c
2420 @@ -1506,6 +1506,9 @@ static void mroute_clean_tables(struct mr_table *mrt, bool all)
2421 continue;
2422 rhltable_remove(&mrt->mfc_hash, &c->mnode, ip6mr_rht_params);
2423 list_del_rcu(&c->list);
2424 + call_ip6mr_mfc_entry_notifiers(read_pnet(&mrt->net),
2425 + FIB_EVENT_ENTRY_DEL,
2426 + (struct mfc6_cache *)c, mrt->id);
2427 mr6_netlink_event(mrt, (struct mfc6_cache *)c, RTM_DELROUTE);
2428 mr_cache_put(c);
2429 }
2430 @@ -1514,10 +1517,6 @@ static void mroute_clean_tables(struct mr_table *mrt, bool all)
2431 spin_lock_bh(&mfc_unres_lock);
2432 list_for_each_entry_safe(c, tmp, &mrt->mfc_unres_queue, list) {
2433 list_del(&c->list);
2434 - call_ip6mr_mfc_entry_notifiers(read_pnet(&mrt->net),
2435 - FIB_EVENT_ENTRY_DEL,
2436 - (struct mfc6_cache *)c,
2437 - mrt->id);
2438 mr6_netlink_event(mrt, (struct mfc6_cache *)c,
2439 RTM_DELROUTE);
2440 ip6mr_destroy_unres(mrt, (struct mfc6_cache *)c);
2441 diff --git a/net/ipv6/seg6_iptunnel.c b/net/ipv6/seg6_iptunnel.c
2442 index 8181ee7e1e27..ee5403cbe655 100644
2443 --- a/net/ipv6/seg6_iptunnel.c
2444 +++ b/net/ipv6/seg6_iptunnel.c
2445 @@ -146,6 +146,8 @@ int seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh, int proto)
2446 } else {
2447 ip6_flow_hdr(hdr, 0, flowlabel);
2448 hdr->hop_limit = ip6_dst_hoplimit(skb_dst(skb));
2449 +
2450 + memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));
2451 }
2452
2453 hdr->nexthdr = NEXTHDR_ROUTING;
2454 diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
2455 index 26f1d435696a..fed6becc5daf 100644
2456 --- a/net/l2tp/l2tp_core.c
2457 +++ b/net/l2tp/l2tp_core.c
2458 @@ -83,8 +83,7 @@
2459 #define L2TP_SLFLAG_S 0x40000000
2460 #define L2TP_SL_SEQ_MASK 0x00ffffff
2461
2462 -#define L2TP_HDR_SIZE_SEQ 10
2463 -#define L2TP_HDR_SIZE_NOSEQ 6
2464 +#define L2TP_HDR_SIZE_MAX 14
2465
2466 /* Default trace flags */
2467 #define L2TP_DEFAULT_DEBUG_FLAGS 0
2468 @@ -808,7 +807,7 @@ static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb)
2469 __skb_pull(skb, sizeof(struct udphdr));
2470
2471 /* Short packet? */
2472 - if (!pskb_may_pull(skb, L2TP_HDR_SIZE_SEQ)) {
2473 + if (!pskb_may_pull(skb, L2TP_HDR_SIZE_MAX)) {
2474 l2tp_info(tunnel, L2TP_MSG_DATA,
2475 "%s: recv short packet (len=%d)\n",
2476 tunnel->name, skb->len);
2477 @@ -884,6 +883,10 @@ static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb)
2478 goto error;
2479 }
2480
2481 + if (tunnel->version == L2TP_HDR_VER_3 &&
2482 + l2tp_v3_ensure_opt_in_linear(session, skb, &ptr, &optr))
2483 + goto error;
2484 +
2485 l2tp_recv_common(session, skb, ptr, optr, hdrflags, length);
2486 l2tp_session_dec_refcount(session);
2487
2488 diff --git a/net/l2tp/l2tp_core.h b/net/l2tp/l2tp_core.h
2489 index 9c9afe94d389..b2ce90260c35 100644
2490 --- a/net/l2tp/l2tp_core.h
2491 +++ b/net/l2tp/l2tp_core.h
2492 @@ -301,6 +301,26 @@ static inline bool l2tp_tunnel_uses_xfrm(const struct l2tp_tunnel *tunnel)
2493 }
2494 #endif
2495
2496 +static inline int l2tp_v3_ensure_opt_in_linear(struct l2tp_session *session, struct sk_buff *skb,
2497 + unsigned char **ptr, unsigned char **optr)
2498 +{
2499 + int opt_len = session->peer_cookie_len + l2tp_get_l2specific_len(session);
2500 +
2501 + if (opt_len > 0) {
2502 + int off = *ptr - *optr;
2503 +
2504 + if (!pskb_may_pull(skb, off + opt_len))
2505 + return -1;
2506 +
2507 + if (skb->data != *optr) {
2508 + *optr = skb->data;
2509 + *ptr = skb->data + off;
2510 + }
2511 + }
2512 +
2513 + return 0;
2514 +}
2515 +
2516 #define l2tp_printk(ptr, type, func, fmt, ...) \
2517 do { \
2518 if (((ptr)->debug) & (type)) \
2519 diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c
2520 index 35f6f86d4dcc..d4c60523c549 100644
2521 --- a/net/l2tp/l2tp_ip.c
2522 +++ b/net/l2tp/l2tp_ip.c
2523 @@ -165,6 +165,9 @@ static int l2tp_ip_recv(struct sk_buff *skb)
2524 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, ptr, length);
2525 }
2526
2527 + if (l2tp_v3_ensure_opt_in_linear(session, skb, &ptr, &optr))
2528 + goto discard_sess;
2529 +
2530 l2tp_recv_common(session, skb, ptr, optr, 0, skb->len);
2531 l2tp_session_dec_refcount(session);
2532
2533 diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c
2534 index 237f1a4a0b0c..0ae6899edac0 100644
2535 --- a/net/l2tp/l2tp_ip6.c
2536 +++ b/net/l2tp/l2tp_ip6.c
2537 @@ -178,6 +178,9 @@ static int l2tp_ip6_recv(struct sk_buff *skb)
2538 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, ptr, length);
2539 }
2540
2541 + if (l2tp_v3_ensure_opt_in_linear(session, skb, &ptr, &optr))
2542 + goto discard_sess;
2543 +
2544 l2tp_recv_common(session, skb, ptr, optr, 0, skb->len);
2545 l2tp_session_dec_refcount(session);
2546
2547 diff --git a/net/netrom/nr_timer.c b/net/netrom/nr_timer.c
2548 index cbd51ed5a2d7..908e53ab47a4 100644
2549 --- a/net/netrom/nr_timer.c
2550 +++ b/net/netrom/nr_timer.c
2551 @@ -52,21 +52,21 @@ void nr_start_t1timer(struct sock *sk)
2552 {
2553 struct nr_sock *nr = nr_sk(sk);
2554
2555 - mod_timer(&nr->t1timer, jiffies + nr->t1);
2556 + sk_reset_timer(sk, &nr->t1timer, jiffies + nr->t1);
2557 }
2558
2559 void nr_start_t2timer(struct sock *sk)
2560 {
2561 struct nr_sock *nr = nr_sk(sk);
2562
2563 - mod_timer(&nr->t2timer, jiffies + nr->t2);
2564 + sk_reset_timer(sk, &nr->t2timer, jiffies + nr->t2);
2565 }
2566
2567 void nr_start_t4timer(struct sock *sk)
2568 {
2569 struct nr_sock *nr = nr_sk(sk);
2570
2571 - mod_timer(&nr->t4timer, jiffies + nr->t4);
2572 + sk_reset_timer(sk, &nr->t4timer, jiffies + nr->t4);
2573 }
2574
2575 void nr_start_idletimer(struct sock *sk)
2576 @@ -74,37 +74,37 @@ void nr_start_idletimer(struct sock *sk)
2577 struct nr_sock *nr = nr_sk(sk);
2578
2579 if (nr->idle > 0)
2580 - mod_timer(&nr->idletimer, jiffies + nr->idle);
2581 + sk_reset_timer(sk, &nr->idletimer, jiffies + nr->idle);
2582 }
2583
2584 void nr_start_heartbeat(struct sock *sk)
2585 {
2586 - mod_timer(&sk->sk_timer, jiffies + 5 * HZ);
2587 + sk_reset_timer(sk, &sk->sk_timer, jiffies + 5 * HZ);
2588 }
2589
2590 void nr_stop_t1timer(struct sock *sk)
2591 {
2592 - del_timer(&nr_sk(sk)->t1timer);
2593 + sk_stop_timer(sk, &nr_sk(sk)->t1timer);
2594 }
2595
2596 void nr_stop_t2timer(struct sock *sk)
2597 {
2598 - del_timer(&nr_sk(sk)->t2timer);
2599 + sk_stop_timer(sk, &nr_sk(sk)->t2timer);
2600 }
2601
2602 void nr_stop_t4timer(struct sock *sk)
2603 {
2604 - del_timer(&nr_sk(sk)->t4timer);
2605 + sk_stop_timer(sk, &nr_sk(sk)->t4timer);
2606 }
2607
2608 void nr_stop_idletimer(struct sock *sk)
2609 {
2610 - del_timer(&nr_sk(sk)->idletimer);
2611 + sk_stop_timer(sk, &nr_sk(sk)->idletimer);
2612 }
2613
2614 void nr_stop_heartbeat(struct sock *sk)
2615 {
2616 - del_timer(&sk->sk_timer);
2617 + sk_stop_timer(sk, &sk->sk_timer);
2618 }
2619
2620 int nr_t1timer_running(struct sock *sk)
2621 diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c
2622 index 77e9f85a2c92..f2ff21d7df08 100644
2623 --- a/net/rose/rose_route.c
2624 +++ b/net/rose/rose_route.c
2625 @@ -850,6 +850,7 @@ void rose_link_device_down(struct net_device *dev)
2626
2627 /*
2628 * Route a frame to an appropriate AX.25 connection.
2629 + * A NULL ax25_cb indicates an internally generated frame.
2630 */
2631 int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
2632 {
2633 @@ -867,6 +868,10 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
2634
2635 if (skb->len < ROSE_MIN_LEN)
2636 return res;
2637 +
2638 + if (!ax25)
2639 + return rose_loopback_queue(skb, NULL);
2640 +
2641 frametype = skb->data[2];
2642 lci = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 0x0FF);
2643 if (frametype == ROSE_CALL_REQUEST &&
2644 diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
2645 index 0bae07e9c9e7..4fede55b9010 100644
2646 --- a/net/sctp/ipv6.c
2647 +++ b/net/sctp/ipv6.c
2648 @@ -277,7 +277,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
2649
2650 if (saddr) {
2651 fl6->saddr = saddr->v6.sin6_addr;
2652 - fl6->fl6_sport = saddr->v6.sin6_port;
2653 + if (!fl6->fl6_sport)
2654 + fl6->fl6_sport = saddr->v6.sin6_port;
2655
2656 pr_debug("src=%pI6 - ", &fl6->saddr);
2657 }
2658 diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
2659 index d4352111e69d..1c9f079e8a50 100644
2660 --- a/net/sctp/protocol.c
2661 +++ b/net/sctp/protocol.c
2662 @@ -440,7 +440,8 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
2663 }
2664 if (saddr) {
2665 fl4->saddr = saddr->v4.sin_addr.s_addr;
2666 - fl4->fl4_sport = saddr->v4.sin_port;
2667 + if (!fl4->fl4_sport)
2668 + fl4->fl4_sport = saddr->v4.sin_port;
2669 }
2670
2671 pr_debug("%s: dst:%pI4, src:%pI4 - ", __func__, &fl4->daddr,
2672 diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
2673 index f4ac6c592e13..d05c57664e36 100644
2674 --- a/net/sctp/sm_make_chunk.c
2675 +++ b/net/sctp/sm_make_chunk.c
2676 @@ -495,7 +495,10 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
2677 *
2678 * [INIT ACK back to where the INIT came from.]
2679 */
2680 - retval->transport = chunk->transport;
2681 + if (chunk->transport)
2682 + retval->transport =
2683 + sctp_assoc_lookup_paddr(asoc,
2684 + &chunk->transport->ipaddr);
2685
2686 retval->subh.init_hdr =
2687 sctp_addto_chunk(retval, sizeof(initack), &initack);
2688 @@ -642,8 +645,10 @@ struct sctp_chunk *sctp_make_cookie_ack(const struct sctp_association *asoc,
2689 *
2690 * [COOKIE ACK back to where the COOKIE ECHO came from.]
2691 */
2692 - if (retval && chunk)
2693 - retval->transport = chunk->transport;
2694 + if (retval && chunk && chunk->transport)
2695 + retval->transport =
2696 + sctp_assoc_lookup_paddr(asoc,
2697 + &chunk->transport->ipaddr);
2698
2699 return retval;
2700 }
2701 diff --git a/net/sctp/stream.c b/net/sctp/stream.c
2702 index 3892e7630f3a..80e0ae5534ec 100644
2703 --- a/net/sctp/stream.c
2704 +++ b/net/sctp/stream.c
2705 @@ -585,9 +585,9 @@ struct sctp_chunk *sctp_process_strreset_outreq(
2706 struct sctp_strreset_outreq *outreq = param.v;
2707 struct sctp_stream *stream = &asoc->stream;
2708 __u32 result = SCTP_STRRESET_DENIED;
2709 - __u16 i, nums, flags = 0;
2710 __be16 *str_p = NULL;
2711 __u32 request_seq;
2712 + __u16 i, nums;
2713
2714 request_seq = ntohl(outreq->request_seq);
2715
2716 @@ -615,6 +615,15 @@ struct sctp_chunk *sctp_process_strreset_outreq(
2717 if (!(asoc->strreset_enable & SCTP_ENABLE_RESET_STREAM_REQ))
2718 goto out;
2719
2720 + nums = (ntohs(param.p->length) - sizeof(*outreq)) / sizeof(__u16);
2721 + str_p = outreq->list_of_streams;
2722 + for (i = 0; i < nums; i++) {
2723 + if (ntohs(str_p[i]) >= stream->incnt) {
2724 + result = SCTP_STRRESET_ERR_WRONG_SSN;
2725 + goto out;
2726 + }
2727 + }
2728 +
2729 if (asoc->strreset_chunk) {
2730 if (!sctp_chunk_lookup_strreset_param(
2731 asoc, outreq->response_seq,
2732 @@ -637,32 +646,19 @@ struct sctp_chunk *sctp_process_strreset_outreq(
2733 sctp_chunk_put(asoc->strreset_chunk);
2734 asoc->strreset_chunk = NULL;
2735 }
2736 -
2737 - flags = SCTP_STREAM_RESET_INCOMING_SSN;
2738 }
2739
2740 - nums = (ntohs(param.p->length) - sizeof(*outreq)) / sizeof(__u16);
2741 - if (nums) {
2742 - str_p = outreq->list_of_streams;
2743 - for (i = 0; i < nums; i++) {
2744 - if (ntohs(str_p[i]) >= stream->incnt) {
2745 - result = SCTP_STRRESET_ERR_WRONG_SSN;
2746 - goto out;
2747 - }
2748 - }
2749 -
2750 + if (nums)
2751 for (i = 0; i < nums; i++)
2752 SCTP_SI(stream, ntohs(str_p[i]))->mid = 0;
2753 - } else {
2754 + else
2755 for (i = 0; i < stream->incnt; i++)
2756 SCTP_SI(stream, i)->mid = 0;
2757 - }
2758
2759 result = SCTP_STRRESET_PERFORMED;
2760
2761 *evp = sctp_ulpevent_make_stream_reset_event(asoc,
2762 - flags | SCTP_STREAM_RESET_OUTGOING_SSN, nums, str_p,
2763 - GFP_ATOMIC);
2764 + SCTP_STREAM_RESET_INCOMING_SSN, nums, str_p, GFP_ATOMIC);
2765
2766 out:
2767 sctp_update_strreset_result(asoc, result);
2768 @@ -738,9 +734,6 @@ struct sctp_chunk *sctp_process_strreset_inreq(
2769
2770 result = SCTP_STRRESET_PERFORMED;
2771
2772 - *evp = sctp_ulpevent_make_stream_reset_event(asoc,
2773 - SCTP_STREAM_RESET_INCOMING_SSN, nums, str_p, GFP_ATOMIC);
2774 -
2775 out:
2776 sctp_update_strreset_result(asoc, result);
2777 err:
2778 @@ -873,6 +866,14 @@ struct sctp_chunk *sctp_process_strreset_addstrm_out(
2779 if (!(asoc->strreset_enable & SCTP_ENABLE_CHANGE_ASSOC_REQ))
2780 goto out;
2781
2782 + in = ntohs(addstrm->number_of_streams);
2783 + incnt = stream->incnt + in;
2784 + if (!in || incnt > SCTP_MAX_STREAM)
2785 + goto out;
2786 +
2787 + if (sctp_stream_alloc_in(stream, incnt, GFP_ATOMIC))
2788 + goto out;
2789 +
2790 if (asoc->strreset_chunk) {
2791 if (!sctp_chunk_lookup_strreset_param(
2792 asoc, 0, SCTP_PARAM_RESET_ADD_IN_STREAMS)) {
2793 @@ -896,14 +897,6 @@ struct sctp_chunk *sctp_process_strreset_addstrm_out(
2794 }
2795 }
2796
2797 - in = ntohs(addstrm->number_of_streams);
2798 - incnt = stream->incnt + in;
2799 - if (!in || incnt > SCTP_MAX_STREAM)
2800 - goto out;
2801 -
2802 - if (sctp_stream_alloc_in(stream, incnt, GFP_ATOMIC))
2803 - goto out;
2804 -
2805 stream->incnt = incnt;
2806
2807 result = SCTP_STRRESET_PERFORMED;
2808 @@ -973,9 +966,6 @@ struct sctp_chunk *sctp_process_strreset_addstrm_in(
2809
2810 result = SCTP_STRRESET_PERFORMED;
2811
2812 - *evp = sctp_ulpevent_make_stream_change_event(asoc,
2813 - 0, 0, ntohs(addstrm->number_of_streams), GFP_ATOMIC);
2814 -
2815 out:
2816 sctp_update_strreset_result(asoc, result);
2817 err:
2818 @@ -1036,10 +1026,10 @@ struct sctp_chunk *sctp_process_strreset_resp(
2819 sout->mid_uo = 0;
2820 }
2821 }
2822 -
2823 - flags = SCTP_STREAM_RESET_OUTGOING_SSN;
2824 }
2825
2826 + flags |= SCTP_STREAM_RESET_OUTGOING_SSN;
2827 +
2828 for (i = 0; i < stream->outcnt; i++)
2829 SCTP_SO(stream, i)->state = SCTP_STREAM_OPEN;
2830
2831 @@ -1058,6 +1048,8 @@ struct sctp_chunk *sctp_process_strreset_resp(
2832 nums = (ntohs(inreq->param_hdr.length) - sizeof(*inreq)) /
2833 sizeof(__u16);
2834
2835 + flags |= SCTP_STREAM_RESET_INCOMING_SSN;
2836 +
2837 *evp = sctp_ulpevent_make_stream_reset_event(asoc, flags,
2838 nums, str_p, GFP_ATOMIC);
2839 } else if (req->type == SCTP_PARAM_RESET_TSN_REQUEST) {
2840 diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
2841 index f39f34e12fb6..dbb38fe2da7d 100644
2842 --- a/sound/pci/hda/patch_realtek.c
2843 +++ b/sound/pci/hda/patch_realtek.c
2844 @@ -117,6 +117,7 @@ struct alc_spec {
2845 int codec_variant; /* flag for other variants */
2846 unsigned int has_alc5505_dsp:1;
2847 unsigned int no_depop_delay:1;
2848 + unsigned int done_hp_init:1;
2849
2850 /* for PLL fix */
2851 hda_nid_t pll_nid;
2852 @@ -3372,6 +3373,48 @@ static void alc_default_shutup(struct hda_codec *codec)
2853 snd_hda_shutup_pins(codec);
2854 }
2855
2856 +static void alc294_hp_init(struct hda_codec *codec)
2857 +{
2858 + struct alc_spec *spec = codec->spec;
2859 + hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
2860 + int i, val;
2861 +
2862 + if (!hp_pin)
2863 + return;
2864 +
2865 + snd_hda_codec_write(codec, hp_pin, 0,
2866 + AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
2867 +
2868 + msleep(100);
2869 +
2870 + snd_hda_codec_write(codec, hp_pin, 0,
2871 + AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
2872 +
2873 + alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
2874 + alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
2875 +
2876 + /* Wait for depop procedure finish */
2877 + val = alc_read_coefex_idx(codec, 0x58, 0x01);
2878 + for (i = 0; i < 20 && val & 0x0080; i++) {
2879 + msleep(50);
2880 + val = alc_read_coefex_idx(codec, 0x58, 0x01);
2881 + }
2882 + /* Set HP depop to auto mode */
2883 + alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
2884 + msleep(50);
2885 +}
2886 +
2887 +static void alc294_init(struct hda_codec *codec)
2888 +{
2889 + struct alc_spec *spec = codec->spec;
2890 +
2891 + if (!spec->done_hp_init) {
2892 + alc294_hp_init(codec);
2893 + spec->done_hp_init = true;
2894 + }
2895 + alc_default_init(codec);
2896 +}
2897 +
2898 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
2899 unsigned int val)
2900 {
2901 @@ -7288,37 +7331,6 @@ static void alc269_fill_coef(struct hda_codec *codec)
2902 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
2903 }
2904
2905 -static void alc294_hp_init(struct hda_codec *codec)
2906 -{
2907 - struct alc_spec *spec = codec->spec;
2908 - hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
2909 - int i, val;
2910 -
2911 - if (!hp_pin)
2912 - return;
2913 -
2914 - snd_hda_codec_write(codec, hp_pin, 0,
2915 - AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
2916 -
2917 - msleep(100);
2918 -
2919 - snd_hda_codec_write(codec, hp_pin, 0,
2920 - AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
2921 -
2922 - alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
2923 - alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
2924 -
2925 - /* Wait for depop procedure finish */
2926 - val = alc_read_coefex_idx(codec, 0x58, 0x01);
2927 - for (i = 0; i < 20 && val & 0x0080; i++) {
2928 - msleep(50);
2929 - val = alc_read_coefex_idx(codec, 0x58, 0x01);
2930 - }
2931 - /* Set HP depop to auto mode */
2932 - alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
2933 - msleep(50);
2934 -}
2935 -
2936 /*
2937 */
2938 static int patch_alc269(struct hda_codec *codec)
2939 @@ -7444,7 +7456,7 @@ static int patch_alc269(struct hda_codec *codec)
2940 spec->codec_variant = ALC269_TYPE_ALC294;
2941 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
2942 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
2943 - alc294_hp_init(codec);
2944 + spec->init_hook = alc294_init;
2945 break;
2946 case 0x10ec0300:
2947 spec->codec_variant = ALC269_TYPE_ALC300;
2948 @@ -7456,7 +7468,7 @@ static int patch_alc269(struct hda_codec *codec)
2949 spec->codec_variant = ALC269_TYPE_ALC700;
2950 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
2951 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
2952 - alc294_hp_init(codec);
2953 + spec->init_hook = alc294_init;
2954 break;
2955
2956 }
2957 diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
2958 index 6623cafc94f2..7e93686a430a 100644
2959 --- a/sound/usb/quirks.c
2960 +++ b/sound/usb/quirks.c
2961 @@ -1373,6 +1373,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
2962 return SNDRV_PCM_FMTBIT_DSD_U32_BE;
2963 break;
2964
2965 + case USB_ID(0x10cb, 0x0103): /* The Bit Opus #3; with fp->dsd_raw */
2966 case USB_ID(0x152a, 0x85de): /* SMSL D1 DAC */
2967 case USB_ID(0x16d0, 0x09dd): /* Encore mDSD */
2968 case USB_ID(0x0d8c, 0x0316): /* Hegel HD12 DSD */
2969 diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c
2970 index e1473234968d..83057fa9d391 100644
2971 --- a/tools/testing/selftests/seccomp/seccomp_bpf.c
2972 +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c
2973 @@ -1563,7 +1563,16 @@ TEST_F(TRACE_poke, getpid_runs_normally)
2974 #ifdef SYSCALL_NUM_RET_SHARE_REG
2975 # define EXPECT_SYSCALL_RETURN(val, action) EXPECT_EQ(-1, action)
2976 #else
2977 -# define EXPECT_SYSCALL_RETURN(val, action) EXPECT_EQ(val, action)
2978 +# define EXPECT_SYSCALL_RETURN(val, action) \
2979 + do { \
2980 + errno = 0; \
2981 + if (val < 0) { \
2982 + EXPECT_EQ(-1, action); \
2983 + EXPECT_EQ(-(val), errno); \
2984 + } else { \
2985 + EXPECT_EQ(val, action); \
2986 + } \
2987 + } while (0)
2988 #endif
2989
2990 /* Use PTRACE_GETREGS and PTRACE_SETREGS when available. This is useful for
2991 @@ -1602,7 +1611,7 @@ int get_syscall(struct __test_metadata *_metadata, pid_t tracee)
2992
2993 /* Architecture-specific syscall changing routine. */
2994 void change_syscall(struct __test_metadata *_metadata,
2995 - pid_t tracee, int syscall)
2996 + pid_t tracee, int syscall, int result)
2997 {
2998 int ret;
2999 ARCH_REGS regs;
3000 @@ -1661,7 +1670,7 @@ void change_syscall(struct __test_metadata *_metadata,
3001 #ifdef SYSCALL_NUM_RET_SHARE_REG
3002 TH_LOG("Can't modify syscall return on this architecture");
3003 #else
3004 - regs.SYSCALL_RET = EPERM;
3005 + regs.SYSCALL_RET = result;
3006 #endif
3007
3008 #ifdef HAVE_GETREGS
3009 @@ -1689,14 +1698,19 @@ void tracer_syscall(struct __test_metadata *_metadata, pid_t tracee,
3010 case 0x1002:
3011 /* change getpid to getppid. */
3012 EXPECT_EQ(__NR_getpid, get_syscall(_metadata, tracee));
3013 - change_syscall(_metadata, tracee, __NR_getppid);
3014 + change_syscall(_metadata, tracee, __NR_getppid, 0);
3015 break;
3016 case 0x1003:
3017 - /* skip gettid. */
3018 + /* skip gettid with valid return code. */
3019 EXPECT_EQ(__NR_gettid, get_syscall(_metadata, tracee));
3020 - change_syscall(_metadata, tracee, -1);
3021 + change_syscall(_metadata, tracee, -1, 45000);
3022 break;
3023 case 0x1004:
3024 + /* skip openat with error. */
3025 + EXPECT_EQ(__NR_openat, get_syscall(_metadata, tracee));
3026 + change_syscall(_metadata, tracee, -1, -ESRCH);
3027 + break;
3028 + case 0x1005:
3029 /* do nothing (allow getppid) */
3030 EXPECT_EQ(__NR_getppid, get_syscall(_metadata, tracee));
3031 break;
3032 @@ -1729,9 +1743,11 @@ void tracer_ptrace(struct __test_metadata *_metadata, pid_t tracee,
3033 nr = get_syscall(_metadata, tracee);
3034
3035 if (nr == __NR_getpid)
3036 - change_syscall(_metadata, tracee, __NR_getppid);
3037 + change_syscall(_metadata, tracee, __NR_getppid, 0);
3038 + if (nr == __NR_gettid)
3039 + change_syscall(_metadata, tracee, -1, 45000);
3040 if (nr == __NR_openat)
3041 - change_syscall(_metadata, tracee, -1);
3042 + change_syscall(_metadata, tracee, -1, -ESRCH);
3043 }
3044
3045 FIXTURE_DATA(TRACE_syscall) {
3046 @@ -1748,8 +1764,10 @@ FIXTURE_SETUP(TRACE_syscall)
3047 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1002),
3048 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_gettid, 0, 1),
3049 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1003),
3050 - BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
3051 + BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_openat, 0, 1),
3052 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1004),
3053 + BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
3054 + BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1005),
3055 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
3056 };
3057
3058 @@ -1797,15 +1815,26 @@ TEST_F(TRACE_syscall, ptrace_syscall_redirected)
3059 EXPECT_NE(self->mypid, syscall(__NR_getpid));
3060 }
3061
3062 -TEST_F(TRACE_syscall, ptrace_syscall_dropped)
3063 +TEST_F(TRACE_syscall, ptrace_syscall_errno)
3064 +{
3065 + /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
3066 + teardown_trace_fixture(_metadata, self->tracer);
3067 + self->tracer = setup_trace_fixture(_metadata, tracer_ptrace, NULL,
3068 + true);
3069 +
3070 + /* Tracer should skip the open syscall, resulting in ESRCH. */
3071 + EXPECT_SYSCALL_RETURN(-ESRCH, syscall(__NR_openat));
3072 +}
3073 +
3074 +TEST_F(TRACE_syscall, ptrace_syscall_faked)
3075 {
3076 /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
3077 teardown_trace_fixture(_metadata, self->tracer);
3078 self->tracer = setup_trace_fixture(_metadata, tracer_ptrace, NULL,
3079 true);
3080
3081 - /* Tracer should skip the open syscall, resulting in EPERM. */
3082 - EXPECT_SYSCALL_RETURN(EPERM, syscall(__NR_openat));
3083 + /* Tracer should skip the gettid syscall, resulting fake pid. */
3084 + EXPECT_SYSCALL_RETURN(45000, syscall(__NR_gettid));
3085 }
3086
3087 TEST_F(TRACE_syscall, syscall_allowed)
3088 @@ -1838,7 +1867,21 @@ TEST_F(TRACE_syscall, syscall_redirected)
3089 EXPECT_NE(self->mypid, syscall(__NR_getpid));
3090 }
3091
3092 -TEST_F(TRACE_syscall, syscall_dropped)
3093 +TEST_F(TRACE_syscall, syscall_errno)
3094 +{
3095 + long ret;
3096 +
3097 + ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
3098 + ASSERT_EQ(0, ret);
3099 +
3100 + ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
3101 + ASSERT_EQ(0, ret);
3102 +
3103 + /* openat has been skipped and an errno return. */
3104 + EXPECT_SYSCALL_RETURN(-ESRCH, syscall(__NR_openat));
3105 +}
3106 +
3107 +TEST_F(TRACE_syscall, syscall_faked)
3108 {
3109 long ret;
3110
3111 @@ -1849,8 +1892,7 @@ TEST_F(TRACE_syscall, syscall_dropped)
3112 ASSERT_EQ(0, ret);
3113
3114 /* gettid has been skipped and an altered return value stored. */
3115 - EXPECT_SYSCALL_RETURN(EPERM, syscall(__NR_gettid));
3116 - EXPECT_NE(self->mytid, syscall(__NR_gettid));
3117 + EXPECT_SYSCALL_RETURN(45000, syscall(__NR_gettid));
3118 }
3119
3120 TEST_F(TRACE_syscall, skip_after_RET_TRACE)