Annotation of /trunk/kernel-alx/patches-4.19/0171-4.19.72-all-fixes.patch
Parent Directory | Revision Log
Revision 3468 -
(hide annotations)
(download)
Tue Oct 29 10:31:29 2019 UTC (4 years, 10 months ago) by niro
File size: 68167 byte(s)
Tue Oct 29 10:31:29 2019 UTC (4 years, 10 months ago) by niro
File size: 68167 byte(s)
-linux-4.19.72
1 | niro | 3468 | diff --git a/Makefile b/Makefile |
2 | index f6c9d5757470..ef80b1dfb753 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 = 71 | ||
10 | +SUBLEVEL = 72 | ||
11 | EXTRAVERSION = | ||
12 | NAME = "People's Front" | ||
13 | |||
14 | diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c | ||
15 | index f8debf7aeb4c..76e1edf5bf12 100644 | ||
16 | --- a/arch/x86/boot/compressed/pgtable_64.c | ||
17 | +++ b/arch/x86/boot/compressed/pgtable_64.c | ||
18 | @@ -73,6 +73,8 @@ static unsigned long find_trampoline_placement(void) | ||
19 | |||
20 | /* Find the first usable memory region under bios_start. */ | ||
21 | for (i = boot_params->e820_entries - 1; i >= 0; i--) { | ||
22 | + unsigned long new = bios_start; | ||
23 | + | ||
24 | entry = &boot_params->e820_table[i]; | ||
25 | |||
26 | /* Skip all entries above bios_start. */ | ||
27 | @@ -85,15 +87,20 @@ static unsigned long find_trampoline_placement(void) | ||
28 | |||
29 | /* Adjust bios_start to the end of the entry if needed. */ | ||
30 | if (bios_start > entry->addr + entry->size) | ||
31 | - bios_start = entry->addr + entry->size; | ||
32 | + new = entry->addr + entry->size; | ||
33 | |||
34 | /* Keep bios_start page-aligned. */ | ||
35 | - bios_start = round_down(bios_start, PAGE_SIZE); | ||
36 | + new = round_down(new, PAGE_SIZE); | ||
37 | |||
38 | /* Skip the entry if it's too small. */ | ||
39 | - if (bios_start - TRAMPOLINE_32BIT_SIZE < entry->addr) | ||
40 | + if (new - TRAMPOLINE_32BIT_SIZE < entry->addr) | ||
41 | continue; | ||
42 | |||
43 | + /* Protect against underflow. */ | ||
44 | + if (new - TRAMPOLINE_32BIT_SIZE > bios_start) | ||
45 | + break; | ||
46 | + | ||
47 | + bios_start = new; | ||
48 | break; | ||
49 | } | ||
50 | |||
51 | diff --git a/arch/x86/include/asm/bootparam_utils.h b/arch/x86/include/asm/bootparam_utils.h | ||
52 | index d3983fdf1012..8fa49cf1211d 100644 | ||
53 | --- a/arch/x86/include/asm/bootparam_utils.h | ||
54 | +++ b/arch/x86/include/asm/bootparam_utils.h | ||
55 | @@ -71,6 +71,7 @@ static void sanitize_boot_params(struct boot_params *boot_params) | ||
56 | BOOT_PARAM_PRESERVE(eddbuf_entries), | ||
57 | BOOT_PARAM_PRESERVE(edd_mbr_sig_buf_entries), | ||
58 | BOOT_PARAM_PRESERVE(edd_mbr_sig_buffer), | ||
59 | + BOOT_PARAM_PRESERVE(secure_boot), | ||
60 | BOOT_PARAM_PRESERVE(hdr), | ||
61 | BOOT_PARAM_PRESERVE(e820_table), | ||
62 | BOOT_PARAM_PRESERVE(eddbuf), | ||
63 | diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c | ||
64 | index 90be3a1506d3..b316bd61a6ac 100644 | ||
65 | --- a/arch/x86/kernel/apic/apic.c | ||
66 | +++ b/arch/x86/kernel/apic/apic.c | ||
67 | @@ -1140,10 +1140,6 @@ void clear_local_APIC(void) | ||
68 | apic_write(APIC_LVT0, v | APIC_LVT_MASKED); | ||
69 | v = apic_read(APIC_LVT1); | ||
70 | apic_write(APIC_LVT1, v | APIC_LVT_MASKED); | ||
71 | - if (!x2apic_enabled()) { | ||
72 | - v = apic_read(APIC_LDR) & ~APIC_LDR_MASK; | ||
73 | - apic_write(APIC_LDR, v); | ||
74 | - } | ||
75 | if (maxlvt >= 4) { | ||
76 | v = apic_read(APIC_LVTPC); | ||
77 | apic_write(APIC_LVTPC, v | APIC_LVT_MASKED); | ||
78 | diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c | ||
79 | index ec9e03a6b778..9e70f7c7e565 100644 | ||
80 | --- a/drivers/bluetooth/btqca.c | ||
81 | +++ b/drivers/bluetooth/btqca.c | ||
82 | @@ -363,6 +363,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, | ||
83 | return err; | ||
84 | } | ||
85 | |||
86 | + /* Give the controller some time to get ready to receive the NVM */ | ||
87 | + msleep(10); | ||
88 | + | ||
89 | /* Download NVM configuration */ | ||
90 | config.type = TLV_TYPE_NVM; | ||
91 | if (soc_type == QCA_WCN3990) | ||
92 | diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c | ||
93 | index fd83046d8376..f6389479fccb 100644 | ||
94 | --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c | ||
95 | +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c | ||
96 | @@ -220,6 +220,7 @@ static int mtk_drm_kms_init(struct drm_device *drm) | ||
97 | struct mtk_drm_private *private = drm->dev_private; | ||
98 | struct platform_device *pdev; | ||
99 | struct device_node *np; | ||
100 | + struct device *dma_dev; | ||
101 | int ret; | ||
102 | |||
103 | if (!iommu_present(&platform_bus_type)) | ||
104 | @@ -282,7 +283,29 @@ static int mtk_drm_kms_init(struct drm_device *drm) | ||
105 | goto err_component_unbind; | ||
106 | } | ||
107 | |||
108 | - private->dma_dev = &pdev->dev; | ||
109 | + dma_dev = &pdev->dev; | ||
110 | + private->dma_dev = dma_dev; | ||
111 | + | ||
112 | + /* | ||
113 | + * Configure the DMA segment size to make sure we get contiguous IOVA | ||
114 | + * when importing PRIME buffers. | ||
115 | + */ | ||
116 | + if (!dma_dev->dma_parms) { | ||
117 | + private->dma_parms_allocated = true; | ||
118 | + dma_dev->dma_parms = | ||
119 | + devm_kzalloc(drm->dev, sizeof(*dma_dev->dma_parms), | ||
120 | + GFP_KERNEL); | ||
121 | + } | ||
122 | + if (!dma_dev->dma_parms) { | ||
123 | + ret = -ENOMEM; | ||
124 | + goto err_component_unbind; | ||
125 | + } | ||
126 | + | ||
127 | + ret = dma_set_max_seg_size(dma_dev, (unsigned int)DMA_BIT_MASK(32)); | ||
128 | + if (ret) { | ||
129 | + dev_err(dma_dev, "Failed to set DMA segment size\n"); | ||
130 | + goto err_unset_dma_parms; | ||
131 | + } | ||
132 | |||
133 | /* | ||
134 | * We don't use the drm_irq_install() helpers provided by the DRM | ||
135 | @@ -292,13 +315,16 @@ static int mtk_drm_kms_init(struct drm_device *drm) | ||
136 | drm->irq_enabled = true; | ||
137 | ret = drm_vblank_init(drm, MAX_CRTC); | ||
138 | if (ret < 0) | ||
139 | - goto err_component_unbind; | ||
140 | + goto err_unset_dma_parms; | ||
141 | |||
142 | drm_kms_helper_poll_init(drm); | ||
143 | drm_mode_config_reset(drm); | ||
144 | |||
145 | return 0; | ||
146 | |||
147 | +err_unset_dma_parms: | ||
148 | + if (private->dma_parms_allocated) | ||
149 | + dma_dev->dma_parms = NULL; | ||
150 | err_component_unbind: | ||
151 | component_unbind_all(drm->dev, drm); | ||
152 | err_config_cleanup: | ||
153 | @@ -309,9 +335,14 @@ err_config_cleanup: | ||
154 | |||
155 | static void mtk_drm_kms_deinit(struct drm_device *drm) | ||
156 | { | ||
157 | + struct mtk_drm_private *private = drm->dev_private; | ||
158 | + | ||
159 | drm_kms_helper_poll_fini(drm); | ||
160 | drm_atomic_helper_shutdown(drm); | ||
161 | |||
162 | + if (private->dma_parms_allocated) | ||
163 | + private->dma_dev->dma_parms = NULL; | ||
164 | + | ||
165 | component_unbind_all(drm->dev, drm); | ||
166 | drm_mode_config_cleanup(drm); | ||
167 | } | ||
168 | @@ -327,6 +358,18 @@ static const struct file_operations mtk_drm_fops = { | ||
169 | .compat_ioctl = drm_compat_ioctl, | ||
170 | }; | ||
171 | |||
172 | +/* | ||
173 | + * We need to override this because the device used to import the memory is | ||
174 | + * not dev->dev, as drm_gem_prime_import() expects. | ||
175 | + */ | ||
176 | +struct drm_gem_object *mtk_drm_gem_prime_import(struct drm_device *dev, | ||
177 | + struct dma_buf *dma_buf) | ||
178 | +{ | ||
179 | + struct mtk_drm_private *private = dev->dev_private; | ||
180 | + | ||
181 | + return drm_gem_prime_import_dev(dev, dma_buf, private->dma_dev); | ||
182 | +} | ||
183 | + | ||
184 | static struct drm_driver mtk_drm_driver = { | ||
185 | .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | | ||
186 | DRIVER_ATOMIC, | ||
187 | @@ -338,7 +381,7 @@ static struct drm_driver mtk_drm_driver = { | ||
188 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, | ||
189 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, | ||
190 | .gem_prime_export = drm_gem_prime_export, | ||
191 | - .gem_prime_import = drm_gem_prime_import, | ||
192 | + .gem_prime_import = mtk_drm_gem_prime_import, | ||
193 | .gem_prime_get_sg_table = mtk_gem_prime_get_sg_table, | ||
194 | .gem_prime_import_sg_table = mtk_gem_prime_import_sg_table, | ||
195 | .gem_prime_mmap = mtk_drm_gem_mmap_buf, | ||
196 | diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h | ||
197 | index ecc00ca3221d..8fa60d46f860 100644 | ||
198 | --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h | ||
199 | +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h | ||
200 | @@ -59,6 +59,8 @@ struct mtk_drm_private { | ||
201 | } commit; | ||
202 | |||
203 | struct drm_atomic_state *suspend_state; | ||
204 | + | ||
205 | + bool dma_parms_allocated; | ||
206 | }; | ||
207 | |||
208 | extern struct platform_driver mtk_ddp_driver; | ||
209 | diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c | ||
210 | index 271f31461da4..6f65f5257236 100644 | ||
211 | --- a/drivers/hid/hid-cp2112.c | ||
212 | +++ b/drivers/hid/hid-cp2112.c | ||
213 | @@ -1160,8 +1160,6 @@ static unsigned int cp2112_gpio_irq_startup(struct irq_data *d) | ||
214 | |||
215 | INIT_DELAYED_WORK(&dev->gpio_poll_worker, cp2112_gpio_poll_callback); | ||
216 | |||
217 | - cp2112_gpio_direction_input(gc, d->hwirq); | ||
218 | - | ||
219 | if (!dev->gpio_poll) { | ||
220 | dev->gpio_poll = true; | ||
221 | schedule_delayed_work(&dev->gpio_poll_worker, 0); | ||
222 | @@ -1209,6 +1207,12 @@ static int __maybe_unused cp2112_allocate_irq(struct cp2112_device *dev, | ||
223 | return PTR_ERR(dev->desc[pin]); | ||
224 | } | ||
225 | |||
226 | + ret = cp2112_gpio_direction_input(&dev->gc, pin); | ||
227 | + if (ret < 0) { | ||
228 | + dev_err(dev->gc.parent, "Failed to set GPIO to input dir\n"); | ||
229 | + goto err_desc; | ||
230 | + } | ||
231 | + | ||
232 | ret = gpiochip_lock_as_irq(&dev->gc, pin); | ||
233 | if (ret) { | ||
234 | dev_err(dev->gc.parent, "Failed to lock GPIO as interrupt\n"); | ||
235 | diff --git a/drivers/infiniband/hw/hfi1/fault.c b/drivers/infiniband/hw/hfi1/fault.c | ||
236 | index 7eaff4dcbfd7..5bc811b7e6cf 100644 | ||
237 | --- a/drivers/infiniband/hw/hfi1/fault.c | ||
238 | +++ b/drivers/infiniband/hw/hfi1/fault.c | ||
239 | @@ -141,12 +141,14 @@ static ssize_t fault_opcodes_write(struct file *file, const char __user *buf, | ||
240 | if (!data) | ||
241 | return -ENOMEM; | ||
242 | copy = min(len, datalen - 1); | ||
243 | - if (copy_from_user(data, buf, copy)) | ||
244 | - return -EFAULT; | ||
245 | + if (copy_from_user(data, buf, copy)) { | ||
246 | + ret = -EFAULT; | ||
247 | + goto free_data; | ||
248 | + } | ||
249 | |||
250 | ret = debugfs_file_get(file->f_path.dentry); | ||
251 | if (unlikely(ret)) | ||
252 | - return ret; | ||
253 | + goto free_data; | ||
254 | ptr = data; | ||
255 | token = ptr; | ||
256 | for (ptr = data; *ptr; ptr = end + 1, token = ptr) { | ||
257 | @@ -195,6 +197,7 @@ static ssize_t fault_opcodes_write(struct file *file, const char __user *buf, | ||
258 | ret = len; | ||
259 | |||
260 | debugfs_file_put(file->f_path.dentry); | ||
261 | +free_data: | ||
262 | kfree(data); | ||
263 | return ret; | ||
264 | } | ||
265 | @@ -214,7 +217,7 @@ static ssize_t fault_opcodes_read(struct file *file, char __user *buf, | ||
266 | return -ENOMEM; | ||
267 | ret = debugfs_file_get(file->f_path.dentry); | ||
268 | if (unlikely(ret)) | ||
269 | - return ret; | ||
270 | + goto free_data; | ||
271 | bit = find_first_bit(fault->opcodes, bitsize); | ||
272 | while (bit < bitsize) { | ||
273 | zero = find_next_zero_bit(fault->opcodes, bitsize, bit); | ||
274 | @@ -232,6 +235,7 @@ static ssize_t fault_opcodes_read(struct file *file, char __user *buf, | ||
275 | data[size - 1] = '\n'; | ||
276 | data[size] = '\0'; | ||
277 | ret = simple_read_from_buffer(buf, len, pos, data, size); | ||
278 | +free_data: | ||
279 | kfree(data); | ||
280 | return ret; | ||
281 | } | ||
282 | diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c | ||
283 | index e5466d786bb1..5aaa2a6c431b 100644 | ||
284 | --- a/drivers/infiniband/hw/mlx4/mad.c | ||
285 | +++ b/drivers/infiniband/hw/mlx4/mad.c | ||
286 | @@ -1668,8 +1668,6 @@ tx_err: | ||
287 | tx_buf_size, DMA_TO_DEVICE); | ||
288 | kfree(tun_qp->tx_ring[i].buf.addr); | ||
289 | } | ||
290 | - kfree(tun_qp->tx_ring); | ||
291 | - tun_qp->tx_ring = NULL; | ||
292 | i = MLX4_NUM_TUNNEL_BUFS; | ||
293 | err: | ||
294 | while (i > 0) { | ||
295 | @@ -1678,6 +1676,8 @@ err: | ||
296 | rx_buf_size, DMA_FROM_DEVICE); | ||
297 | kfree(tun_qp->ring[i].addr); | ||
298 | } | ||
299 | + kfree(tun_qp->tx_ring); | ||
300 | + tun_qp->tx_ring = NULL; | ||
301 | kfree(tun_qp->ring); | ||
302 | tun_qp->ring = NULL; | ||
303 | return -ENOMEM; | ||
304 | diff --git a/drivers/input/serio/hyperv-keyboard.c b/drivers/input/serio/hyperv-keyboard.c | ||
305 | index a8b9be3e28db..7d0a5ccf5775 100644 | ||
306 | --- a/drivers/input/serio/hyperv-keyboard.c | ||
307 | +++ b/drivers/input/serio/hyperv-keyboard.c | ||
308 | @@ -245,40 +245,17 @@ static void hv_kbd_handle_received_packet(struct hv_device *hv_dev, | ||
309 | |||
310 | static void hv_kbd_on_channel_callback(void *context) | ||
311 | { | ||
312 | + struct vmpacket_descriptor *desc; | ||
313 | struct hv_device *hv_dev = context; | ||
314 | - void *buffer; | ||
315 | - int bufferlen = 0x100; /* Start with sensible size */ | ||
316 | u32 bytes_recvd; | ||
317 | u64 req_id; | ||
318 | - int error; | ||
319 | |||
320 | - buffer = kmalloc(bufferlen, GFP_ATOMIC); | ||
321 | - if (!buffer) | ||
322 | - return; | ||
323 | - | ||
324 | - while (1) { | ||
325 | - error = vmbus_recvpacket_raw(hv_dev->channel, buffer, bufferlen, | ||
326 | - &bytes_recvd, &req_id); | ||
327 | - switch (error) { | ||
328 | - case 0: | ||
329 | - if (bytes_recvd == 0) { | ||
330 | - kfree(buffer); | ||
331 | - return; | ||
332 | - } | ||
333 | - | ||
334 | - hv_kbd_handle_received_packet(hv_dev, buffer, | ||
335 | - bytes_recvd, req_id); | ||
336 | - break; | ||
337 | + foreach_vmbus_pkt(desc, hv_dev->channel) { | ||
338 | + bytes_recvd = desc->len8 * 8; | ||
339 | + req_id = desc->trans_id; | ||
340 | |||
341 | - case -ENOBUFS: | ||
342 | - kfree(buffer); | ||
343 | - /* Handle large packet */ | ||
344 | - bufferlen = bytes_recvd; | ||
345 | - buffer = kmalloc(bytes_recvd, GFP_ATOMIC); | ||
346 | - if (!buffer) | ||
347 | - return; | ||
348 | - break; | ||
349 | - } | ||
350 | + hv_kbd_handle_received_packet(hv_dev, desc, bytes_recvd, | ||
351 | + req_id); | ||
352 | } | ||
353 | } | ||
354 | |||
355 | diff --git a/drivers/net/ethernet/cavium/common/cavium_ptp.c b/drivers/net/ethernet/cavium/common/cavium_ptp.c | ||
356 | index 6aeb1045c302..1ab40c97403b 100644 | ||
357 | --- a/drivers/net/ethernet/cavium/common/cavium_ptp.c | ||
358 | +++ b/drivers/net/ethernet/cavium/common/cavium_ptp.c | ||
359 | @@ -10,7 +10,7 @@ | ||
360 | |||
361 | #include "cavium_ptp.h" | ||
362 | |||
363 | -#define DRV_NAME "Cavium PTP Driver" | ||
364 | +#define DRV_NAME "cavium_ptp" | ||
365 | |||
366 | #define PCI_DEVICE_ID_CAVIUM_PTP 0xA00C | ||
367 | #define PCI_DEVICE_ID_CAVIUM_RST 0xA00E | ||
368 | diff --git a/drivers/net/ethernet/cavium/liquidio/request_manager.c b/drivers/net/ethernet/cavium/liquidio/request_manager.c | ||
369 | index 8f746e1348d4..3deb3c07681f 100644 | ||
370 | --- a/drivers/net/ethernet/cavium/liquidio/request_manager.c | ||
371 | +++ b/drivers/net/ethernet/cavium/liquidio/request_manager.c | ||
372 | @@ -238,8 +238,10 @@ int octeon_setup_iq(struct octeon_device *oct, | ||
373 | } | ||
374 | |||
375 | oct->num_iqs++; | ||
376 | - if (oct->fn_list.enable_io_queues(oct)) | ||
377 | + if (oct->fn_list.enable_io_queues(oct)) { | ||
378 | + octeon_delete_instr_queue(oct, iq_no); | ||
379 | return 1; | ||
380 | + } | ||
381 | |||
382 | return 0; | ||
383 | } | ||
384 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | ||
385 | index 0f72f9c4ec74..b429b726b987 100644 | ||
386 | --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | ||
387 | +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | ||
388 | @@ -3276,8 +3276,10 @@ static ssize_t blocked_fl_write(struct file *filp, const char __user *ubuf, | ||
389 | return -ENOMEM; | ||
390 | |||
391 | err = bitmap_parse_user(ubuf, count, t, adap->sge.egr_sz); | ||
392 | - if (err) | ||
393 | + if (err) { | ||
394 | + kvfree(t); | ||
395 | return err; | ||
396 | + } | ||
397 | |||
398 | bitmap_copy(adap->sge.blocked_fl, t, adap->sge.egr_sz); | ||
399 | kvfree(t); | ||
400 | diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c | ||
401 | index f70cb4d3c684..40ad1e503255 100644 | ||
402 | --- a/drivers/net/ethernet/ibm/ibmveth.c | ||
403 | +++ b/drivers/net/ethernet/ibm/ibmveth.c | ||
404 | @@ -1618,7 +1618,7 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) | ||
405 | struct net_device *netdev; | ||
406 | struct ibmveth_adapter *adapter; | ||
407 | unsigned char *mac_addr_p; | ||
408 | - unsigned int *mcastFilterSize_p; | ||
409 | + __be32 *mcastFilterSize_p; | ||
410 | long ret; | ||
411 | unsigned long ret_attr; | ||
412 | |||
413 | @@ -1640,8 +1640,9 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) | ||
414 | return -EINVAL; | ||
415 | } | ||
416 | |||
417 | - mcastFilterSize_p = (unsigned int *)vio_get_attribute(dev, | ||
418 | - VETH_MCAST_FILTER_SIZE, NULL); | ||
419 | + mcastFilterSize_p = (__be32 *)vio_get_attribute(dev, | ||
420 | + VETH_MCAST_FILTER_SIZE, | ||
421 | + NULL); | ||
422 | if (!mcastFilterSize_p) { | ||
423 | dev_err(&dev->dev, "Can't find VETH_MCAST_FILTER_SIZE " | ||
424 | "attribute\n"); | ||
425 | @@ -1658,7 +1659,7 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) | ||
426 | |||
427 | adapter->vdev = dev; | ||
428 | adapter->netdev = netdev; | ||
429 | - adapter->mcastFilterSize = *mcastFilterSize_p; | ||
430 | + adapter->mcastFilterSize = be32_to_cpu(*mcastFilterSize_p); | ||
431 | adapter->pool_config = 0; | ||
432 | |||
433 | netif_napi_add(netdev, &adapter->napi, ibmveth_poll, 16); | ||
434 | diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c | ||
435 | index 0ae43d27cdcf..255de7d68cd3 100644 | ||
436 | --- a/drivers/net/ethernet/ibm/ibmvnic.c | ||
437 | +++ b/drivers/net/ethernet/ibm/ibmvnic.c | ||
438 | @@ -1586,6 +1586,8 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev) | ||
439 | lpar_rc = send_subcrq_indirect(adapter, handle_array[queue_num], | ||
440 | (u64)tx_buff->indir_dma, | ||
441 | (u64)num_entries); | ||
442 | + dma_unmap_single(dev, tx_buff->indir_dma, | ||
443 | + sizeof(tx_buff->indir_arr), DMA_TO_DEVICE); | ||
444 | } else { | ||
445 | tx_buff->num_entries = num_entries; | ||
446 | lpar_rc = send_subcrq(adapter, handle_array[queue_num], | ||
447 | @@ -2747,7 +2749,6 @@ static int ibmvnic_complete_tx(struct ibmvnic_adapter *adapter, | ||
448 | union sub_crq *next; | ||
449 | int index; | ||
450 | int i, j; | ||
451 | - u8 *first; | ||
452 | |||
453 | restart_loop: | ||
454 | while (pending_scrq(adapter, scrq)) { | ||
455 | @@ -2777,14 +2778,6 @@ restart_loop: | ||
456 | |||
457 | txbuff->data_dma[j] = 0; | ||
458 | } | ||
459 | - /* if sub_crq was sent indirectly */ | ||
460 | - first = &txbuff->indir_arr[0].generic.first; | ||
461 | - if (*first == IBMVNIC_CRQ_CMD) { | ||
462 | - dma_unmap_single(dev, txbuff->indir_dma, | ||
463 | - sizeof(txbuff->indir_arr), | ||
464 | - DMA_TO_DEVICE); | ||
465 | - *first = 0; | ||
466 | - } | ||
467 | |||
468 | if (txbuff->last_frag) { | ||
469 | dev_kfree_skb_any(txbuff->skb); | ||
470 | diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c | ||
471 | index b2d2ec8c11e2..6789eed78ff7 100644 | ||
472 | --- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c | ||
473 | +++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c | ||
474 | @@ -3922,7 +3922,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
475 | * setup (if available). */ | ||
476 | status = myri10ge_request_irq(mgp); | ||
477 | if (status != 0) | ||
478 | - goto abort_with_firmware; | ||
479 | + goto abort_with_slices; | ||
480 | myri10ge_free_irq(mgp); | ||
481 | |||
482 | /* Save configuration space to be restored if the | ||
483 | diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c | ||
484 | index 5f092bbd0514..5462d2e8a1b7 100644 | ||
485 | --- a/drivers/net/ethernet/renesas/ravb_main.c | ||
486 | +++ b/drivers/net/ethernet/renesas/ravb_main.c | ||
487 | @@ -1,7 +1,7 @@ | ||
488 | // SPDX-License-Identifier: GPL-2.0 | ||
489 | /* Renesas Ethernet AVB device driver | ||
490 | * | ||
491 | - * Copyright (C) 2014-2015 Renesas Electronics Corporation | ||
492 | + * Copyright (C) 2014-2019 Renesas Electronics Corporation | ||
493 | * Copyright (C) 2015 Renesas Solutions Corp. | ||
494 | * Copyright (C) 2015-2016 Cogent Embedded, Inc. <source@cogentembedded.com> | ||
495 | * | ||
496 | @@ -514,7 +514,10 @@ static void ravb_get_tx_tstamp(struct net_device *ndev) | ||
497 | kfree(ts_skb); | ||
498 | if (tag == tfa_tag) { | ||
499 | skb_tstamp_tx(skb, &shhwtstamps); | ||
500 | + dev_consume_skb_any(skb); | ||
501 | break; | ||
502 | + } else { | ||
503 | + dev_kfree_skb_any(skb); | ||
504 | } | ||
505 | } | ||
506 | ravb_modify(ndev, TCCR, TCCR_TFR, TCCR_TFR); | ||
507 | @@ -1556,7 +1559,7 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev) | ||
508 | DMA_TO_DEVICE); | ||
509 | goto unmap; | ||
510 | } | ||
511 | - ts_skb->skb = skb; | ||
512 | + ts_skb->skb = skb_get(skb); | ||
513 | ts_skb->tag = priv->ts_skb_tag++; | ||
514 | priv->ts_skb_tag &= 0x3ff; | ||
515 | list_add_tail(&ts_skb->list, &priv->ts_skb_list); | ||
516 | @@ -1685,6 +1688,7 @@ static int ravb_close(struct net_device *ndev) | ||
517 | /* Clear the timestamp list */ | ||
518 | list_for_each_entry_safe(ts_skb, ts_skb2, &priv->ts_skb_list, list) { | ||
519 | list_del(&ts_skb->list); | ||
520 | + kfree_skb(ts_skb->skb); | ||
521 | kfree(ts_skb); | ||
522 | } | ||
523 | |||
524 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | ||
525 | index 3b174eae77c1..f45df6df6932 100644 | ||
526 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | ||
527 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | ||
528 | @@ -1203,10 +1203,8 @@ static int phy_power_on(struct rk_priv_data *bsp_priv, bool enable) | ||
529 | int ret; | ||
530 | struct device *dev = &bsp_priv->pdev->dev; | ||
531 | |||
532 | - if (!ldo) { | ||
533 | - dev_err(dev, "no regulator found\n"); | ||
534 | - return -1; | ||
535 | - } | ||
536 | + if (!ldo) | ||
537 | + return 0; | ||
538 | |||
539 | if (enable) { | ||
540 | ret = regulator_enable(ldo); | ||
541 | diff --git a/drivers/net/ethernet/toshiba/tc35815.c b/drivers/net/ethernet/toshiba/tc35815.c | ||
542 | index cce9c9ed46aa..9146068979d2 100644 | ||
543 | --- a/drivers/net/ethernet/toshiba/tc35815.c | ||
544 | +++ b/drivers/net/ethernet/toshiba/tc35815.c | ||
545 | @@ -1497,7 +1497,7 @@ tc35815_rx(struct net_device *dev, int limit) | ||
546 | pci_unmap_single(lp->pci_dev, | ||
547 | lp->rx_skbs[cur_bd].skb_dma, | ||
548 | RX_BUF_SIZE, PCI_DMA_FROMDEVICE); | ||
549 | - if (!HAVE_DMA_RXALIGN(lp) && NET_IP_ALIGN) | ||
550 | + if (!HAVE_DMA_RXALIGN(lp) && NET_IP_ALIGN != 0) | ||
551 | memmove(skb->data, skb->data - NET_IP_ALIGN, | ||
552 | pkt_len); | ||
553 | data = skb_put(skb, pkt_len); | ||
554 | diff --git a/drivers/net/ethernet/tundra/tsi108_eth.c b/drivers/net/ethernet/tundra/tsi108_eth.c | ||
555 | index edcd1e60b30d..f076050c8ad3 100644 | ||
556 | --- a/drivers/net/ethernet/tundra/tsi108_eth.c | ||
557 | +++ b/drivers/net/ethernet/tundra/tsi108_eth.c | ||
558 | @@ -383,9 +383,10 @@ tsi108_stat_carry_one(int carry, int carry_bit, int carry_shift, | ||
559 | static void tsi108_stat_carry(struct net_device *dev) | ||
560 | { | ||
561 | struct tsi108_prv_data *data = netdev_priv(dev); | ||
562 | + unsigned long flags; | ||
563 | u32 carry1, carry2; | ||
564 | |||
565 | - spin_lock_irq(&data->misclock); | ||
566 | + spin_lock_irqsave(&data->misclock, flags); | ||
567 | |||
568 | carry1 = TSI_READ(TSI108_STAT_CARRY1); | ||
569 | carry2 = TSI_READ(TSI108_STAT_CARRY2); | ||
570 | @@ -453,7 +454,7 @@ static void tsi108_stat_carry(struct net_device *dev) | ||
571 | TSI108_STAT_TXPAUSEDROP_CARRY, | ||
572 | &data->tx_pause_drop); | ||
573 | |||
574 | - spin_unlock_irq(&data->misclock); | ||
575 | + spin_unlock_irqrestore(&data->misclock, flags); | ||
576 | } | ||
577 | |||
578 | /* Read a stat counter atomically with respect to carries. | ||
579 | diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c | ||
580 | index cc60ef9634db..6f6c0dbd91fc 100644 | ||
581 | --- a/drivers/net/hyperv/netvsc_drv.c | ||
582 | +++ b/drivers/net/hyperv/netvsc_drv.c | ||
583 | @@ -1248,12 +1248,15 @@ static void netvsc_get_stats64(struct net_device *net, | ||
584 | struct rtnl_link_stats64 *t) | ||
585 | { | ||
586 | struct net_device_context *ndev_ctx = netdev_priv(net); | ||
587 | - struct netvsc_device *nvdev = rcu_dereference_rtnl(ndev_ctx->nvdev); | ||
588 | + struct netvsc_device *nvdev; | ||
589 | struct netvsc_vf_pcpu_stats vf_tot; | ||
590 | int i; | ||
591 | |||
592 | + rcu_read_lock(); | ||
593 | + | ||
594 | + nvdev = rcu_dereference(ndev_ctx->nvdev); | ||
595 | if (!nvdev) | ||
596 | - return; | ||
597 | + goto out; | ||
598 | |||
599 | netdev_stats_to_stats64(t, &net->stats); | ||
600 | |||
601 | @@ -1292,6 +1295,8 @@ static void netvsc_get_stats64(struct net_device *net, | ||
602 | t->rx_packets += packets; | ||
603 | t->multicast += multicast; | ||
604 | } | ||
605 | +out: | ||
606 | + rcu_read_unlock(); | ||
607 | } | ||
608 | |||
609 | static int netvsc_set_mac_addr(struct net_device *ndev, void *p) | ||
610 | diff --git a/drivers/net/usb/cx82310_eth.c b/drivers/net/usb/cx82310_eth.c | ||
611 | index 947bea81d924..dfbdea22fbad 100644 | ||
612 | --- a/drivers/net/usb/cx82310_eth.c | ||
613 | +++ b/drivers/net/usb/cx82310_eth.c | ||
614 | @@ -175,7 +175,8 @@ static int cx82310_bind(struct usbnet *dev, struct usb_interface *intf) | ||
615 | } | ||
616 | if (!timeout) { | ||
617 | dev_err(&udev->dev, "firmware not ready in time\n"); | ||
618 | - return -ETIMEDOUT; | ||
619 | + ret = -ETIMEDOUT; | ||
620 | + goto err; | ||
621 | } | ||
622 | |||
623 | /* enable ethernet mode (?) */ | ||
624 | diff --git a/drivers/net/usb/kalmia.c b/drivers/net/usb/kalmia.c | ||
625 | index bd2ba3659028..0cc6993c279a 100644 | ||
626 | --- a/drivers/net/usb/kalmia.c | ||
627 | +++ b/drivers/net/usb/kalmia.c | ||
628 | @@ -117,16 +117,16 @@ kalmia_init_and_get_ethernet_addr(struct usbnet *dev, u8 *ethernet_addr) | ||
629 | status = kalmia_send_init_packet(dev, usb_buf, ARRAY_SIZE(init_msg_1), | ||
630 | usb_buf, 24); | ||
631 | if (status != 0) | ||
632 | - return status; | ||
633 | + goto out; | ||
634 | |||
635 | memcpy(usb_buf, init_msg_2, 12); | ||
636 | status = kalmia_send_init_packet(dev, usb_buf, ARRAY_SIZE(init_msg_2), | ||
637 | usb_buf, 28); | ||
638 | if (status != 0) | ||
639 | - return status; | ||
640 | + goto out; | ||
641 | |||
642 | memcpy(ethernet_addr, usb_buf + 10, ETH_ALEN); | ||
643 | - | ||
644 | +out: | ||
645 | kfree(usb_buf); | ||
646 | return status; | ||
647 | } | ||
648 | diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c | ||
649 | index 8d140495da79..e20266bd209e 100644 | ||
650 | --- a/drivers/net/usb/lan78xx.c | ||
651 | +++ b/drivers/net/usb/lan78xx.c | ||
652 | @@ -3799,7 +3799,7 @@ static int lan78xx_probe(struct usb_interface *intf, | ||
653 | ret = register_netdev(netdev); | ||
654 | if (ret != 0) { | ||
655 | netif_err(dev, probe, netdev, "couldn't register the device\n"); | ||
656 | - goto out3; | ||
657 | + goto out4; | ||
658 | } | ||
659 | |||
660 | usb_set_intfdata(intf, dev); | ||
661 | @@ -3814,12 +3814,14 @@ static int lan78xx_probe(struct usb_interface *intf, | ||
662 | |||
663 | ret = lan78xx_phy_init(dev); | ||
664 | if (ret < 0) | ||
665 | - goto out4; | ||
666 | + goto out5; | ||
667 | |||
668 | return 0; | ||
669 | |||
670 | -out4: | ||
671 | +out5: | ||
672 | unregister_netdev(netdev); | ||
673 | +out4: | ||
674 | + usb_free_urb(dev->urb_intr); | ||
675 | out3: | ||
676 | lan78xx_unbind(dev, intf); | ||
677 | out2: | ||
678 | diff --git a/drivers/net/wimax/i2400m/fw.c b/drivers/net/wimax/i2400m/fw.c | ||
679 | index e9fc168bb734..489cba9b284d 100644 | ||
680 | --- a/drivers/net/wimax/i2400m/fw.c | ||
681 | +++ b/drivers/net/wimax/i2400m/fw.c | ||
682 | @@ -351,13 +351,15 @@ int i2400m_barker_db_init(const char *_options) | ||
683 | } | ||
684 | result = i2400m_barker_db_add(barker); | ||
685 | if (result < 0) | ||
686 | - goto error_add; | ||
687 | + goto error_parse_add; | ||
688 | } | ||
689 | kfree(options_orig); | ||
690 | } | ||
691 | return 0; | ||
692 | |||
693 | +error_parse_add: | ||
694 | error_parse: | ||
695 | + kfree(options_orig); | ||
696 | error_add: | ||
697 | kfree(i2400m_barker_db); | ||
698 | return result; | ||
699 | diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c | ||
700 | index 05d6371c7f38..f57feb8fdea4 100644 | ||
701 | --- a/drivers/nvme/host/multipath.c | ||
702 | +++ b/drivers/nvme/host/multipath.c | ||
703 | @@ -323,6 +323,7 @@ static void nvme_mpath_set_live(struct nvme_ns *ns) | ||
704 | "failed to create id group.\n"); | ||
705 | } | ||
706 | |||
707 | + synchronize_srcu(&ns->head->srcu); | ||
708 | kblockd_schedule_work(&ns->head->requeue_work); | ||
709 | } | ||
710 | |||
711 | diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c | ||
712 | index f8f4d3ea67f3..15d493f30810 100644 | ||
713 | --- a/drivers/scsi/qla2xxx/qla_attr.c | ||
714 | +++ b/drivers/scsi/qla2xxx/qla_attr.c | ||
715 | @@ -2191,6 +2191,8 @@ qla24xx_vport_delete(struct fc_vport *fc_vport) | ||
716 | dma_free_coherent(&ha->pdev->dev, vha->gnl.size, vha->gnl.l, | ||
717 | vha->gnl.ldma); | ||
718 | |||
719 | + vha->gnl.l = NULL; | ||
720 | + | ||
721 | vfree(vha->scan.l); | ||
722 | |||
723 | if (vha->qpair && vha->qpair->vp_idx == vha->vp_idx) { | ||
724 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c | ||
725 | index 42b8f0d3e580..02fa81f122c2 100644 | ||
726 | --- a/drivers/scsi/qla2xxx/qla_os.c | ||
727 | +++ b/drivers/scsi/qla2xxx/qla_os.c | ||
728 | @@ -3395,6 +3395,12 @@ skip_dpc: | ||
729 | return 0; | ||
730 | |||
731 | probe_failed: | ||
732 | + if (base_vha->gnl.l) { | ||
733 | + dma_free_coherent(&ha->pdev->dev, base_vha->gnl.size, | ||
734 | + base_vha->gnl.l, base_vha->gnl.ldma); | ||
735 | + base_vha->gnl.l = NULL; | ||
736 | + } | ||
737 | + | ||
738 | if (base_vha->timer_active) | ||
739 | qla2x00_stop_timer(base_vha); | ||
740 | base_vha->flags.online = 0; | ||
741 | @@ -3624,7 +3630,7 @@ qla2x00_remove_one(struct pci_dev *pdev) | ||
742 | if (!atomic_read(&pdev->enable_cnt)) { | ||
743 | dma_free_coherent(&ha->pdev->dev, base_vha->gnl.size, | ||
744 | base_vha->gnl.l, base_vha->gnl.ldma); | ||
745 | - | ||
746 | + base_vha->gnl.l = NULL; | ||
747 | scsi_host_put(base_vha->host); | ||
748 | kfree(ha); | ||
749 | pci_set_drvdata(pdev, NULL); | ||
750 | @@ -3663,6 +3669,8 @@ qla2x00_remove_one(struct pci_dev *pdev) | ||
751 | dma_free_coherent(&ha->pdev->dev, | ||
752 | base_vha->gnl.size, base_vha->gnl.l, base_vha->gnl.ldma); | ||
753 | |||
754 | + base_vha->gnl.l = NULL; | ||
755 | + | ||
756 | vfree(base_vha->scan.l); | ||
757 | |||
758 | if (IS_QLAFX00(ha)) | ||
759 | @@ -4602,6 +4610,7 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht, | ||
760 | "Alloc failed for scan database.\n"); | ||
761 | dma_free_coherent(&ha->pdev->dev, vha->gnl.size, | ||
762 | vha->gnl.l, vha->gnl.ldma); | ||
763 | + vha->gnl.l = NULL; | ||
764 | scsi_remove_host(vha->host); | ||
765 | return NULL; | ||
766 | } | ||
767 | diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c | ||
768 | index 3094d818cf06..12c1fa5b06c5 100644 | ||
769 | --- a/drivers/spi/spi-bcm2835aux.c | ||
770 | +++ b/drivers/spi/spi-bcm2835aux.c | ||
771 | @@ -178,24 +178,14 @@ static void bcm2835aux_spi_reset_hw(struct bcm2835aux_spi *bs) | ||
772 | BCM2835_AUX_SPI_CNTL0_CLEARFIFO); | ||
773 | } | ||
774 | |||
775 | -static irqreturn_t bcm2835aux_spi_interrupt(int irq, void *dev_id) | ||
776 | +static void bcm2835aux_spi_transfer_helper(struct bcm2835aux_spi *bs) | ||
777 | { | ||
778 | - struct spi_master *master = dev_id; | ||
779 | - struct bcm2835aux_spi *bs = spi_master_get_devdata(master); | ||
780 | - irqreturn_t ret = IRQ_NONE; | ||
781 | - | ||
782 | - /* IRQ may be shared, so return if our interrupts are disabled */ | ||
783 | - if (!(bcm2835aux_rd(bs, BCM2835_AUX_SPI_CNTL1) & | ||
784 | - (BCM2835_AUX_SPI_CNTL1_TXEMPTY | BCM2835_AUX_SPI_CNTL1_IDLE))) | ||
785 | - return ret; | ||
786 | + u32 stat = bcm2835aux_rd(bs, BCM2835_AUX_SPI_STAT); | ||
787 | |||
788 | /* check if we have data to read */ | ||
789 | - while (bs->rx_len && | ||
790 | - (!(bcm2835aux_rd(bs, BCM2835_AUX_SPI_STAT) & | ||
791 | - BCM2835_AUX_SPI_STAT_RX_EMPTY))) { | ||
792 | + for (; bs->rx_len && (stat & BCM2835_AUX_SPI_STAT_RX_LVL); | ||
793 | + stat = bcm2835aux_rd(bs, BCM2835_AUX_SPI_STAT)) | ||
794 | bcm2835aux_rd_fifo(bs); | ||
795 | - ret = IRQ_HANDLED; | ||
796 | - } | ||
797 | |||
798 | /* check if we have data to write */ | ||
799 | while (bs->tx_len && | ||
800 | @@ -203,16 +193,21 @@ static irqreturn_t bcm2835aux_spi_interrupt(int irq, void *dev_id) | ||
801 | (!(bcm2835aux_rd(bs, BCM2835_AUX_SPI_STAT) & | ||
802 | BCM2835_AUX_SPI_STAT_TX_FULL))) { | ||
803 | bcm2835aux_wr_fifo(bs); | ||
804 | - ret = IRQ_HANDLED; | ||
805 | } | ||
806 | +} | ||
807 | |||
808 | - /* and check if we have reached "done" */ | ||
809 | - while (bs->rx_len && | ||
810 | - (!(bcm2835aux_rd(bs, BCM2835_AUX_SPI_STAT) & | ||
811 | - BCM2835_AUX_SPI_STAT_BUSY))) { | ||
812 | - bcm2835aux_rd_fifo(bs); | ||
813 | - ret = IRQ_HANDLED; | ||
814 | - } | ||
815 | +static irqreturn_t bcm2835aux_spi_interrupt(int irq, void *dev_id) | ||
816 | +{ | ||
817 | + struct spi_master *master = dev_id; | ||
818 | + struct bcm2835aux_spi *bs = spi_master_get_devdata(master); | ||
819 | + | ||
820 | + /* IRQ may be shared, so return if our interrupts are disabled */ | ||
821 | + if (!(bcm2835aux_rd(bs, BCM2835_AUX_SPI_CNTL1) & | ||
822 | + (BCM2835_AUX_SPI_CNTL1_TXEMPTY | BCM2835_AUX_SPI_CNTL1_IDLE))) | ||
823 | + return IRQ_NONE; | ||
824 | + | ||
825 | + /* do common fifo handling */ | ||
826 | + bcm2835aux_spi_transfer_helper(bs); | ||
827 | |||
828 | if (!bs->tx_len) { | ||
829 | /* disable tx fifo empty interrupt */ | ||
830 | @@ -226,8 +221,7 @@ static irqreturn_t bcm2835aux_spi_interrupt(int irq, void *dev_id) | ||
831 | complete(&master->xfer_completion); | ||
832 | } | ||
833 | |||
834 | - /* and return */ | ||
835 | - return ret; | ||
836 | + return IRQ_HANDLED; | ||
837 | } | ||
838 | |||
839 | static int __bcm2835aux_spi_transfer_one_irq(struct spi_master *master, | ||
840 | @@ -273,7 +267,6 @@ static int bcm2835aux_spi_transfer_one_poll(struct spi_master *master, | ||
841 | { | ||
842 | struct bcm2835aux_spi *bs = spi_master_get_devdata(master); | ||
843 | unsigned long timeout; | ||
844 | - u32 stat; | ||
845 | |||
846 | /* configure spi */ | ||
847 | bcm2835aux_wr(bs, BCM2835_AUX_SPI_CNTL1, bs->cntl[1]); | ||
848 | @@ -284,24 +277,9 @@ static int bcm2835aux_spi_transfer_one_poll(struct spi_master *master, | ||
849 | |||
850 | /* loop until finished the transfer */ | ||
851 | while (bs->rx_len) { | ||
852 | - /* read status */ | ||
853 | - stat = bcm2835aux_rd(bs, BCM2835_AUX_SPI_STAT); | ||
854 | - | ||
855 | - /* fill in tx fifo with remaining data */ | ||
856 | - if ((bs->tx_len) && (!(stat & BCM2835_AUX_SPI_STAT_TX_FULL))) { | ||
857 | - bcm2835aux_wr_fifo(bs); | ||
858 | - continue; | ||
859 | - } | ||
860 | |||
861 | - /* read data from fifo for both cases */ | ||
862 | - if (!(stat & BCM2835_AUX_SPI_STAT_RX_EMPTY)) { | ||
863 | - bcm2835aux_rd_fifo(bs); | ||
864 | - continue; | ||
865 | - } | ||
866 | - if (!(stat & BCM2835_AUX_SPI_STAT_BUSY)) { | ||
867 | - bcm2835aux_rd_fifo(bs); | ||
868 | - continue; | ||
869 | - } | ||
870 | + /* do common fifo handling */ | ||
871 | + bcm2835aux_spi_transfer_helper(bs); | ||
872 | |||
873 | /* there is still data pending to read check the timeout */ | ||
874 | if (bs->rx_len && time_after(jiffies, timeout)) { | ||
875 | diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c | ||
876 | index c46efa47d68a..7159e8363b83 100644 | ||
877 | --- a/drivers/target/target_core_user.c | ||
878 | +++ b/drivers/target/target_core_user.c | ||
879 | @@ -1143,14 +1143,16 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry * | ||
880 | struct se_cmd *se_cmd = cmd->se_cmd; | ||
881 | struct tcmu_dev *udev = cmd->tcmu_dev; | ||
882 | bool read_len_valid = false; | ||
883 | - uint32_t read_len = se_cmd->data_length; | ||
884 | + uint32_t read_len; | ||
885 | |||
886 | /* | ||
887 | * cmd has been completed already from timeout, just reclaim | ||
888 | * data area space and free cmd | ||
889 | */ | ||
890 | - if (test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) | ||
891 | + if (test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) { | ||
892 | + WARN_ON_ONCE(se_cmd); | ||
893 | goto out; | ||
894 | + } | ||
895 | |||
896 | list_del_init(&cmd->queue_entry); | ||
897 | |||
898 | @@ -1163,6 +1165,7 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry * | ||
899 | goto done; | ||
900 | } | ||
901 | |||
902 | + read_len = se_cmd->data_length; | ||
903 | if (se_cmd->data_direction == DMA_FROM_DEVICE && | ||
904 | (entry->hdr.uflags & TCMU_UFLAG_READ_LEN) && entry->rsp.read_len) { | ||
905 | read_len_valid = true; | ||
906 | @@ -1318,6 +1321,7 @@ static int tcmu_check_expired_cmd(int id, void *p, void *data) | ||
907 | */ | ||
908 | scsi_status = SAM_STAT_CHECK_CONDITION; | ||
909 | list_del_init(&cmd->queue_entry); | ||
910 | + cmd->se_cmd = NULL; | ||
911 | } else { | ||
912 | list_del_init(&cmd->queue_entry); | ||
913 | idr_remove(&udev->commands, id); | ||
914 | @@ -2036,6 +2040,7 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level) | ||
915 | |||
916 | idr_remove(&udev->commands, i); | ||
917 | if (!test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) { | ||
918 | + WARN_ON(!cmd->se_cmd); | ||
919 | list_del_init(&cmd->queue_entry); | ||
920 | if (err_level == 1) { | ||
921 | /* | ||
922 | diff --git a/fs/afs/cell.c b/fs/afs/cell.c | ||
923 | index 6127f0fcd62c..ee07162d35c7 100644 | ||
924 | --- a/fs/afs/cell.c | ||
925 | +++ b/fs/afs/cell.c | ||
926 | @@ -76,6 +76,7 @@ struct afs_cell *afs_lookup_cell_rcu(struct afs_net *net, | ||
927 | cell = rcu_dereference_raw(net->ws_cell); | ||
928 | if (cell) { | ||
929 | afs_get_cell(cell); | ||
930 | + ret = 0; | ||
931 | break; | ||
932 | } | ||
933 | ret = -EDESTADDRREQ; | ||
934 | @@ -110,6 +111,9 @@ struct afs_cell *afs_lookup_cell_rcu(struct afs_net *net, | ||
935 | |||
936 | done_seqretry(&net->cells_lock, seq); | ||
937 | |||
938 | + if (ret != 0 && cell) | ||
939 | + afs_put_cell(net, cell); | ||
940 | + | ||
941 | return ret == 0 ? cell : ERR_PTR(ret); | ||
942 | } | ||
943 | |||
944 | diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c | ||
945 | index a11fa0b6b34d..db547af01b59 100644 | ||
946 | --- a/fs/ceph/caps.c | ||
947 | +++ b/fs/ceph/caps.c | ||
948 | @@ -1280,6 +1280,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, | ||
949 | { | ||
950 | struct ceph_inode_info *ci = cap->ci; | ||
951 | struct inode *inode = &ci->vfs_inode; | ||
952 | + struct ceph_buffer *old_blob = NULL; | ||
953 | struct cap_msg_args arg; | ||
954 | int held, revoking; | ||
955 | int wake = 0; | ||
956 | @@ -1344,7 +1345,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, | ||
957 | ci->i_requested_max_size = arg.max_size; | ||
958 | |||
959 | if (flushing & CEPH_CAP_XATTR_EXCL) { | ||
960 | - __ceph_build_xattrs_blob(ci); | ||
961 | + old_blob = __ceph_build_xattrs_blob(ci); | ||
962 | arg.xattr_version = ci->i_xattrs.version; | ||
963 | arg.xattr_buf = ci->i_xattrs.blob; | ||
964 | } else { | ||
965 | @@ -1379,6 +1380,8 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, | ||
966 | |||
967 | spin_unlock(&ci->i_ceph_lock); | ||
968 | |||
969 | + ceph_buffer_put(old_blob); | ||
970 | + | ||
971 | ret = send_cap_msg(&arg); | ||
972 | if (ret < 0) { | ||
973 | dout("error sending cap msg, must requeue %p\n", inode); | ||
974 | diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c | ||
975 | index 3e518c2ae2bf..11f19432a74c 100644 | ||
976 | --- a/fs/ceph/inode.c | ||
977 | +++ b/fs/ceph/inode.c | ||
978 | @@ -742,6 +742,7 @@ static int fill_inode(struct inode *inode, struct page *locked_page, | ||
979 | int issued, new_issued, info_caps; | ||
980 | struct timespec64 mtime, atime, ctime; | ||
981 | struct ceph_buffer *xattr_blob = NULL; | ||
982 | + struct ceph_buffer *old_blob = NULL; | ||
983 | struct ceph_string *pool_ns = NULL; | ||
984 | struct ceph_cap *new_cap = NULL; | ||
985 | int err = 0; | ||
986 | @@ -878,7 +879,7 @@ static int fill_inode(struct inode *inode, struct page *locked_page, | ||
987 | if ((ci->i_xattrs.version == 0 || !(issued & CEPH_CAP_XATTR_EXCL)) && | ||
988 | le64_to_cpu(info->xattr_version) > ci->i_xattrs.version) { | ||
989 | if (ci->i_xattrs.blob) | ||
990 | - ceph_buffer_put(ci->i_xattrs.blob); | ||
991 | + old_blob = ci->i_xattrs.blob; | ||
992 | ci->i_xattrs.blob = xattr_blob; | ||
993 | if (xattr_blob) | ||
994 | memcpy(ci->i_xattrs.blob->vec.iov_base, | ||
995 | @@ -1017,8 +1018,8 @@ static int fill_inode(struct inode *inode, struct page *locked_page, | ||
996 | out: | ||
997 | if (new_cap) | ||
998 | ceph_put_cap(mdsc, new_cap); | ||
999 | - if (xattr_blob) | ||
1000 | - ceph_buffer_put(xattr_blob); | ||
1001 | + ceph_buffer_put(old_blob); | ||
1002 | + ceph_buffer_put(xattr_blob); | ||
1003 | ceph_put_string(pool_ns); | ||
1004 | return err; | ||
1005 | } | ||
1006 | diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c | ||
1007 | index 1f46b02f7314..5cf7b5f4db94 100644 | ||
1008 | --- a/fs/ceph/snap.c | ||
1009 | +++ b/fs/ceph/snap.c | ||
1010 | @@ -460,6 +460,7 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci) | ||
1011 | struct inode *inode = &ci->vfs_inode; | ||
1012 | struct ceph_cap_snap *capsnap; | ||
1013 | struct ceph_snap_context *old_snapc, *new_snapc; | ||
1014 | + struct ceph_buffer *old_blob = NULL; | ||
1015 | int used, dirty; | ||
1016 | |||
1017 | capsnap = kzalloc(sizeof(*capsnap), GFP_NOFS); | ||
1018 | @@ -536,7 +537,7 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci) | ||
1019 | capsnap->gid = inode->i_gid; | ||
1020 | |||
1021 | if (dirty & CEPH_CAP_XATTR_EXCL) { | ||
1022 | - __ceph_build_xattrs_blob(ci); | ||
1023 | + old_blob = __ceph_build_xattrs_blob(ci); | ||
1024 | capsnap->xattr_blob = | ||
1025 | ceph_buffer_get(ci->i_xattrs.blob); | ||
1026 | capsnap->xattr_version = ci->i_xattrs.version; | ||
1027 | @@ -579,6 +580,7 @@ update_snapc: | ||
1028 | } | ||
1029 | spin_unlock(&ci->i_ceph_lock); | ||
1030 | |||
1031 | + ceph_buffer_put(old_blob); | ||
1032 | kfree(capsnap); | ||
1033 | ceph_put_snap_context(old_snapc); | ||
1034 | } | ||
1035 | diff --git a/fs/ceph/super.h b/fs/ceph/super.h | ||
1036 | index d8579a56e5dc..018019309790 100644 | ||
1037 | --- a/fs/ceph/super.h | ||
1038 | +++ b/fs/ceph/super.h | ||
1039 | @@ -896,7 +896,7 @@ extern int ceph_getattr(const struct path *path, struct kstat *stat, | ||
1040 | int __ceph_setxattr(struct inode *, const char *, const void *, size_t, int); | ||
1041 | ssize_t __ceph_getxattr(struct inode *, const char *, void *, size_t); | ||
1042 | extern ssize_t ceph_listxattr(struct dentry *, char *, size_t); | ||
1043 | -extern void __ceph_build_xattrs_blob(struct ceph_inode_info *ci); | ||
1044 | +extern struct ceph_buffer *__ceph_build_xattrs_blob(struct ceph_inode_info *ci); | ||
1045 | extern void __ceph_destroy_xattrs(struct ceph_inode_info *ci); | ||
1046 | extern void __init ceph_xattr_init(void); | ||
1047 | extern void ceph_xattr_exit(void); | ||
1048 | diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c | ||
1049 | index 0a2d4898ee16..5e4f3f833e85 100644 | ||
1050 | --- a/fs/ceph/xattr.c | ||
1051 | +++ b/fs/ceph/xattr.c | ||
1052 | @@ -734,12 +734,15 @@ static int __get_required_blob_size(struct ceph_inode_info *ci, int name_size, | ||
1053 | |||
1054 | /* | ||
1055 | * If there are dirty xattrs, reencode xattrs into the prealloc_blob | ||
1056 | - * and swap into place. | ||
1057 | + * and swap into place. It returns the old i_xattrs.blob (or NULL) so | ||
1058 | + * that it can be freed by the caller as the i_ceph_lock is likely to be | ||
1059 | + * held. | ||
1060 | */ | ||
1061 | -void __ceph_build_xattrs_blob(struct ceph_inode_info *ci) | ||
1062 | +struct ceph_buffer *__ceph_build_xattrs_blob(struct ceph_inode_info *ci) | ||
1063 | { | ||
1064 | struct rb_node *p; | ||
1065 | struct ceph_inode_xattr *xattr = NULL; | ||
1066 | + struct ceph_buffer *old_blob = NULL; | ||
1067 | void *dest; | ||
1068 | |||
1069 | dout("__build_xattrs_blob %p\n", &ci->vfs_inode); | ||
1070 | @@ -770,12 +773,14 @@ void __ceph_build_xattrs_blob(struct ceph_inode_info *ci) | ||
1071 | dest - ci->i_xattrs.prealloc_blob->vec.iov_base; | ||
1072 | |||
1073 | if (ci->i_xattrs.blob) | ||
1074 | - ceph_buffer_put(ci->i_xattrs.blob); | ||
1075 | + old_blob = ci->i_xattrs.blob; | ||
1076 | ci->i_xattrs.blob = ci->i_xattrs.prealloc_blob; | ||
1077 | ci->i_xattrs.prealloc_blob = NULL; | ||
1078 | ci->i_xattrs.dirty = false; | ||
1079 | ci->i_xattrs.version++; | ||
1080 | } | ||
1081 | + | ||
1082 | + return old_blob; | ||
1083 | } | ||
1084 | |||
1085 | static inline int __get_request_mask(struct inode *in) { | ||
1086 | @@ -1011,6 +1016,7 @@ int __ceph_setxattr(struct inode *inode, const char *name, | ||
1087 | struct ceph_inode_info *ci = ceph_inode(inode); | ||
1088 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; | ||
1089 | struct ceph_cap_flush *prealloc_cf = NULL; | ||
1090 | + struct ceph_buffer *old_blob = NULL; | ||
1091 | int issued; | ||
1092 | int err; | ||
1093 | int dirty = 0; | ||
1094 | @@ -1084,13 +1090,15 @@ retry: | ||
1095 | struct ceph_buffer *blob; | ||
1096 | |||
1097 | spin_unlock(&ci->i_ceph_lock); | ||
1098 | - dout(" preaallocating new blob size=%d\n", required_blob_size); | ||
1099 | + ceph_buffer_put(old_blob); /* Shouldn't be required */ | ||
1100 | + dout(" pre-allocating new blob size=%d\n", required_blob_size); | ||
1101 | blob = ceph_buffer_new(required_blob_size, GFP_NOFS); | ||
1102 | if (!blob) | ||
1103 | goto do_sync_unlocked; | ||
1104 | spin_lock(&ci->i_ceph_lock); | ||
1105 | + /* prealloc_blob can't be released while holding i_ceph_lock */ | ||
1106 | if (ci->i_xattrs.prealloc_blob) | ||
1107 | - ceph_buffer_put(ci->i_xattrs.prealloc_blob); | ||
1108 | + old_blob = ci->i_xattrs.prealloc_blob; | ||
1109 | ci->i_xattrs.prealloc_blob = blob; | ||
1110 | goto retry; | ||
1111 | } | ||
1112 | @@ -1106,6 +1114,7 @@ retry: | ||
1113 | } | ||
1114 | |||
1115 | spin_unlock(&ci->i_ceph_lock); | ||
1116 | + ceph_buffer_put(old_blob); | ||
1117 | if (lock_snap_rwsem) | ||
1118 | up_read(&mdsc->snap_rwsem); | ||
1119 | if (dirty) | ||
1120 | diff --git a/fs/read_write.c b/fs/read_write.c | ||
1121 | index 85fd7a8ee29e..5fb5ee5b8cd7 100644 | ||
1122 | --- a/fs/read_write.c | ||
1123 | +++ b/fs/read_write.c | ||
1124 | @@ -1888,10 +1888,7 @@ int vfs_clone_file_range(struct file *file_in, loff_t pos_in, | ||
1125 | } | ||
1126 | EXPORT_SYMBOL(vfs_clone_file_range); | ||
1127 | |||
1128 | -/* | ||
1129 | - * Read a page's worth of file data into the page cache. Return the page | ||
1130 | - * locked. | ||
1131 | - */ | ||
1132 | +/* Read a page's worth of file data into the page cache. */ | ||
1133 | static struct page *vfs_dedupe_get_page(struct inode *inode, loff_t offset) | ||
1134 | { | ||
1135 | struct address_space *mapping; | ||
1136 | @@ -1907,10 +1904,32 @@ static struct page *vfs_dedupe_get_page(struct inode *inode, loff_t offset) | ||
1137 | put_page(page); | ||
1138 | return ERR_PTR(-EIO); | ||
1139 | } | ||
1140 | - lock_page(page); | ||
1141 | return page; | ||
1142 | } | ||
1143 | |||
1144 | +/* | ||
1145 | + * Lock two pages, ensuring that we lock in offset order if the pages are from | ||
1146 | + * the same file. | ||
1147 | + */ | ||
1148 | +static void vfs_lock_two_pages(struct page *page1, struct page *page2) | ||
1149 | +{ | ||
1150 | + /* Always lock in order of increasing index. */ | ||
1151 | + if (page1->index > page2->index) | ||
1152 | + swap(page1, page2); | ||
1153 | + | ||
1154 | + lock_page(page1); | ||
1155 | + if (page1 != page2) | ||
1156 | + lock_page(page2); | ||
1157 | +} | ||
1158 | + | ||
1159 | +/* Unlock two pages, being careful not to unlock the same page twice. */ | ||
1160 | +static void vfs_unlock_two_pages(struct page *page1, struct page *page2) | ||
1161 | +{ | ||
1162 | + unlock_page(page1); | ||
1163 | + if (page1 != page2) | ||
1164 | + unlock_page(page2); | ||
1165 | +} | ||
1166 | + | ||
1167 | /* | ||
1168 | * Compare extents of two files to see if they are the same. | ||
1169 | * Caller must have locked both inodes to prevent write races. | ||
1170 | @@ -1948,10 +1967,24 @@ int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff, | ||
1171 | dest_page = vfs_dedupe_get_page(dest, destoff); | ||
1172 | if (IS_ERR(dest_page)) { | ||
1173 | error = PTR_ERR(dest_page); | ||
1174 | - unlock_page(src_page); | ||
1175 | put_page(src_page); | ||
1176 | goto out_error; | ||
1177 | } | ||
1178 | + | ||
1179 | + vfs_lock_two_pages(src_page, dest_page); | ||
1180 | + | ||
1181 | + /* | ||
1182 | + * Now that we've locked both pages, make sure they're still | ||
1183 | + * mapped to the file data we're interested in. If not, | ||
1184 | + * someone is invalidating pages on us and we lose. | ||
1185 | + */ | ||
1186 | + if (!PageUptodate(src_page) || !PageUptodate(dest_page) || | ||
1187 | + src_page->mapping != src->i_mapping || | ||
1188 | + dest_page->mapping != dest->i_mapping) { | ||
1189 | + same = false; | ||
1190 | + goto unlock; | ||
1191 | + } | ||
1192 | + | ||
1193 | src_addr = kmap_atomic(src_page); | ||
1194 | dest_addr = kmap_atomic(dest_page); | ||
1195 | |||
1196 | @@ -1963,8 +1996,8 @@ int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff, | ||
1197 | |||
1198 | kunmap_atomic(dest_addr); | ||
1199 | kunmap_atomic(src_addr); | ||
1200 | - unlock_page(dest_page); | ||
1201 | - unlock_page(src_page); | ||
1202 | +unlock: | ||
1203 | + vfs_unlock_two_pages(src_page, dest_page); | ||
1204 | put_page(dest_page); | ||
1205 | put_page(src_page); | ||
1206 | |||
1207 | diff --git a/include/linux/ceph/buffer.h b/include/linux/ceph/buffer.h | ||
1208 | index 5e58bb29b1a3..11cdc7c60480 100644 | ||
1209 | --- a/include/linux/ceph/buffer.h | ||
1210 | +++ b/include/linux/ceph/buffer.h | ||
1211 | @@ -30,7 +30,8 @@ static inline struct ceph_buffer *ceph_buffer_get(struct ceph_buffer *b) | ||
1212 | |||
1213 | static inline void ceph_buffer_put(struct ceph_buffer *b) | ||
1214 | { | ||
1215 | - kref_put(&b->kref, ceph_buffer_release); | ||
1216 | + if (b) | ||
1217 | + kref_put(&b->kref, ceph_buffer_release); | ||
1218 | } | ||
1219 | |||
1220 | extern int ceph_decode_buffer(struct ceph_buffer **b, void **p, void *end); | ||
1221 | diff --git a/include/linux/gpio.h b/include/linux/gpio.h | ||
1222 | index 39745b8bdd65..b3115d1a7d49 100644 | ||
1223 | --- a/include/linux/gpio.h | ||
1224 | +++ b/include/linux/gpio.h | ||
1225 | @@ -240,30 +240,6 @@ static inline int irq_to_gpio(unsigned irq) | ||
1226 | return -EINVAL; | ||
1227 | } | ||
1228 | |||
1229 | -static inline int | ||
1230 | -gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, | ||
1231 | - unsigned int gpio_offset, unsigned int pin_offset, | ||
1232 | - unsigned int npins) | ||
1233 | -{ | ||
1234 | - WARN_ON(1); | ||
1235 | - return -EINVAL; | ||
1236 | -} | ||
1237 | - | ||
1238 | -static inline int | ||
1239 | -gpiochip_add_pingroup_range(struct gpio_chip *chip, | ||
1240 | - struct pinctrl_dev *pctldev, | ||
1241 | - unsigned int gpio_offset, const char *pin_group) | ||
1242 | -{ | ||
1243 | - WARN_ON(1); | ||
1244 | - return -EINVAL; | ||
1245 | -} | ||
1246 | - | ||
1247 | -static inline void | ||
1248 | -gpiochip_remove_pin_ranges(struct gpio_chip *chip) | ||
1249 | -{ | ||
1250 | - WARN_ON(1); | ||
1251 | -} | ||
1252 | - | ||
1253 | static inline int devm_gpio_request(struct device *dev, unsigned gpio, | ||
1254 | const char *label) | ||
1255 | { | ||
1256 | diff --git a/include/net/act_api.h b/include/net/act_api.h | ||
1257 | index 970303448c90..0c82d7ea6ee1 100644 | ||
1258 | --- a/include/net/act_api.h | ||
1259 | +++ b/include/net/act_api.h | ||
1260 | @@ -15,6 +15,7 @@ | ||
1261 | struct tcf_idrinfo { | ||
1262 | spinlock_t lock; | ||
1263 | struct idr action_idr; | ||
1264 | + struct net *net; | ||
1265 | }; | ||
1266 | |||
1267 | struct tc_action_ops; | ||
1268 | @@ -107,7 +108,7 @@ struct tc_action_net { | ||
1269 | }; | ||
1270 | |||
1271 | static inline | ||
1272 | -int tc_action_net_init(struct tc_action_net *tn, | ||
1273 | +int tc_action_net_init(struct net *net, struct tc_action_net *tn, | ||
1274 | const struct tc_action_ops *ops) | ||
1275 | { | ||
1276 | int err = 0; | ||
1277 | @@ -116,6 +117,7 @@ int tc_action_net_init(struct tc_action_net *tn, | ||
1278 | if (!tn->idrinfo) | ||
1279 | return -ENOMEM; | ||
1280 | tn->ops = ops; | ||
1281 | + tn->idrinfo->net = net; | ||
1282 | spin_lock_init(&tn->idrinfo->lock); | ||
1283 | idr_init(&tn->idrinfo->action_idr); | ||
1284 | return err; | ||
1285 | diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h | ||
1286 | index f2be5d041ba3..7685cbda9f28 100644 | ||
1287 | --- a/include/net/netfilter/nf_tables.h | ||
1288 | +++ b/include/net/netfilter/nf_tables.h | ||
1289 | @@ -418,8 +418,7 @@ struct nft_set { | ||
1290 | unsigned char *udata; | ||
1291 | /* runtime data below here */ | ||
1292 | const struct nft_set_ops *ops ____cacheline_aligned; | ||
1293 | - u16 flags:13, | ||
1294 | - bound:1, | ||
1295 | + u16 flags:14, | ||
1296 | genmask:2; | ||
1297 | u8 klen; | ||
1298 | u8 dlen; | ||
1299 | @@ -1337,12 +1336,15 @@ struct nft_trans_rule { | ||
1300 | struct nft_trans_set { | ||
1301 | struct nft_set *set; | ||
1302 | u32 set_id; | ||
1303 | + bool bound; | ||
1304 | }; | ||
1305 | |||
1306 | #define nft_trans_set(trans) \ | ||
1307 | (((struct nft_trans_set *)trans->data)->set) | ||
1308 | #define nft_trans_set_id(trans) \ | ||
1309 | (((struct nft_trans_set *)trans->data)->set_id) | ||
1310 | +#define nft_trans_set_bound(trans) \ | ||
1311 | + (((struct nft_trans_set *)trans->data)->bound) | ||
1312 | |||
1313 | struct nft_trans_chain { | ||
1314 | bool update; | ||
1315 | @@ -1373,12 +1375,15 @@ struct nft_trans_table { | ||
1316 | struct nft_trans_elem { | ||
1317 | struct nft_set *set; | ||
1318 | struct nft_set_elem elem; | ||
1319 | + bool bound; | ||
1320 | }; | ||
1321 | |||
1322 | #define nft_trans_elem_set(trans) \ | ||
1323 | (((struct nft_trans_elem *)trans->data)->set) | ||
1324 | #define nft_trans_elem(trans) \ | ||
1325 | (((struct nft_trans_elem *)trans->data)->elem) | ||
1326 | +#define nft_trans_elem_set_bound(trans) \ | ||
1327 | + (((struct nft_trans_elem *)trans->data)->bound) | ||
1328 | |||
1329 | struct nft_trans_obj { | ||
1330 | struct nft_object *obj; | ||
1331 | diff --git a/include/net/psample.h b/include/net/psample.h | ||
1332 | index 9b80f814ab04..94cb37a7bf75 100644 | ||
1333 | --- a/include/net/psample.h | ||
1334 | +++ b/include/net/psample.h | ||
1335 | @@ -12,6 +12,7 @@ struct psample_group { | ||
1336 | u32 group_num; | ||
1337 | u32 refcount; | ||
1338 | u32 seq; | ||
1339 | + struct rcu_head rcu; | ||
1340 | }; | ||
1341 | |||
1342 | struct psample_group *psample_group_get(struct net *net, u32 group_num); | ||
1343 | diff --git a/kernel/kprobes.c b/kernel/kprobes.c | ||
1344 | index 29ff6635d259..714d63f60460 100644 | ||
1345 | --- a/kernel/kprobes.c | ||
1346 | +++ b/kernel/kprobes.c | ||
1347 | @@ -483,6 +483,7 @@ static DECLARE_DELAYED_WORK(optimizing_work, kprobe_optimizer); | ||
1348 | */ | ||
1349 | static void do_optimize_kprobes(void) | ||
1350 | { | ||
1351 | + lockdep_assert_held(&text_mutex); | ||
1352 | /* | ||
1353 | * The optimization/unoptimization refers online_cpus via | ||
1354 | * stop_machine() and cpu-hotplug modifies online_cpus. | ||
1355 | @@ -500,9 +501,7 @@ static void do_optimize_kprobes(void) | ||
1356 | list_empty(&optimizing_list)) | ||
1357 | return; | ||
1358 | |||
1359 | - mutex_lock(&text_mutex); | ||
1360 | arch_optimize_kprobes(&optimizing_list); | ||
1361 | - mutex_unlock(&text_mutex); | ||
1362 | } | ||
1363 | |||
1364 | /* | ||
1365 | @@ -513,6 +512,7 @@ static void do_unoptimize_kprobes(void) | ||
1366 | { | ||
1367 | struct optimized_kprobe *op, *tmp; | ||
1368 | |||
1369 | + lockdep_assert_held(&text_mutex); | ||
1370 | /* See comment in do_optimize_kprobes() */ | ||
1371 | lockdep_assert_cpus_held(); | ||
1372 | |||
1373 | @@ -520,7 +520,6 @@ static void do_unoptimize_kprobes(void) | ||
1374 | if (list_empty(&unoptimizing_list)) | ||
1375 | return; | ||
1376 | |||
1377 | - mutex_lock(&text_mutex); | ||
1378 | arch_unoptimize_kprobes(&unoptimizing_list, &freeing_list); | ||
1379 | /* Loop free_list for disarming */ | ||
1380 | list_for_each_entry_safe(op, tmp, &freeing_list, list) { | ||
1381 | @@ -537,7 +536,6 @@ static void do_unoptimize_kprobes(void) | ||
1382 | } else | ||
1383 | list_del_init(&op->list); | ||
1384 | } | ||
1385 | - mutex_unlock(&text_mutex); | ||
1386 | } | ||
1387 | |||
1388 | /* Reclaim all kprobes on the free_list */ | ||
1389 | @@ -563,6 +561,7 @@ static void kprobe_optimizer(struct work_struct *work) | ||
1390 | { | ||
1391 | mutex_lock(&kprobe_mutex); | ||
1392 | cpus_read_lock(); | ||
1393 | + mutex_lock(&text_mutex); | ||
1394 | /* Lock modules while optimizing kprobes */ | ||
1395 | mutex_lock(&module_mutex); | ||
1396 | |||
1397 | @@ -590,6 +589,7 @@ static void kprobe_optimizer(struct work_struct *work) | ||
1398 | do_free_cleaned_kprobes(); | ||
1399 | |||
1400 | mutex_unlock(&module_mutex); | ||
1401 | + mutex_unlock(&text_mutex); | ||
1402 | cpus_read_unlock(); | ||
1403 | mutex_unlock(&kprobe_mutex); | ||
1404 | |||
1405 | diff --git a/net/core/netpoll.c b/net/core/netpoll.c | ||
1406 | index 3ae899805f8b..a581cf101cd9 100644 | ||
1407 | --- a/net/core/netpoll.c | ||
1408 | +++ b/net/core/netpoll.c | ||
1409 | @@ -122,7 +122,7 @@ static void queue_process(struct work_struct *work) | ||
1410 | txq = netdev_get_tx_queue(dev, q_index); | ||
1411 | HARD_TX_LOCK(dev, txq, smp_processor_id()); | ||
1412 | if (netif_xmit_frozen_or_stopped(txq) || | ||
1413 | - netpoll_start_xmit(skb, dev, txq) != NETDEV_TX_OK) { | ||
1414 | + !dev_xmit_complete(netpoll_start_xmit(skb, dev, txq))) { | ||
1415 | skb_queue_head(&npinfo->txq, skb); | ||
1416 | HARD_TX_UNLOCK(dev, txq); | ||
1417 | local_irq_restore(flags); | ||
1418 | @@ -335,7 +335,7 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, | ||
1419 | |||
1420 | HARD_TX_UNLOCK(dev, txq); | ||
1421 | |||
1422 | - if (status == NETDEV_TX_OK) | ||
1423 | + if (dev_xmit_complete(status)) | ||
1424 | break; | ||
1425 | |||
1426 | } | ||
1427 | @@ -352,7 +352,7 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, | ||
1428 | |||
1429 | } | ||
1430 | |||
1431 | - if (status != NETDEV_TX_OK) { | ||
1432 | + if (!dev_xmit_complete(status)) { | ||
1433 | skb_queue_tail(&npinfo->txq, skb); | ||
1434 | schedule_delayed_work(&npinfo->tx_work,0); | ||
1435 | } | ||
1436 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c | ||
1437 | index b7ef367fe6a1..611ba174265c 100644 | ||
1438 | --- a/net/ipv4/tcp.c | ||
1439 | +++ b/net/ipv4/tcp.c | ||
1440 | @@ -934,6 +934,22 @@ static int tcp_send_mss(struct sock *sk, int *size_goal, int flags) | ||
1441 | return mss_now; | ||
1442 | } | ||
1443 | |||
1444 | +/* In some cases, both sendpage() and sendmsg() could have added | ||
1445 | + * an skb to the write queue, but failed adding payload on it. | ||
1446 | + * We need to remove it to consume less memory, but more | ||
1447 | + * importantly be able to generate EPOLLOUT for Edge Trigger epoll() | ||
1448 | + * users. | ||
1449 | + */ | ||
1450 | +static void tcp_remove_empty_skb(struct sock *sk, struct sk_buff *skb) | ||
1451 | +{ | ||
1452 | + if (skb && !skb->len) { | ||
1453 | + tcp_unlink_write_queue(skb, sk); | ||
1454 | + if (tcp_write_queue_empty(sk)) | ||
1455 | + tcp_chrono_stop(sk, TCP_CHRONO_BUSY); | ||
1456 | + sk_wmem_free_skb(sk, skb); | ||
1457 | + } | ||
1458 | +} | ||
1459 | + | ||
1460 | ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset, | ||
1461 | size_t size, int flags) | ||
1462 | { | ||
1463 | @@ -1056,6 +1072,7 @@ out: | ||
1464 | return copied; | ||
1465 | |||
1466 | do_error: | ||
1467 | + tcp_remove_empty_skb(sk, tcp_write_queue_tail(sk)); | ||
1468 | if (copied) | ||
1469 | goto out; | ||
1470 | out_err: | ||
1471 | @@ -1409,17 +1426,11 @@ out_nopush: | ||
1472 | sock_zerocopy_put(uarg); | ||
1473 | return copied + copied_syn; | ||
1474 | |||
1475 | +do_error: | ||
1476 | + skb = tcp_write_queue_tail(sk); | ||
1477 | do_fault: | ||
1478 | - if (!skb->len) { | ||
1479 | - tcp_unlink_write_queue(skb, sk); | ||
1480 | - /* It is the one place in all of TCP, except connection | ||
1481 | - * reset, where we can be unlinking the send_head. | ||
1482 | - */ | ||
1483 | - tcp_check_send_head(sk, skb); | ||
1484 | - sk_wmem_free_skb(sk, skb); | ||
1485 | - } | ||
1486 | + tcp_remove_empty_skb(sk, skb); | ||
1487 | |||
1488 | -do_error: | ||
1489 | if (copied + copied_syn) | ||
1490 | goto out; | ||
1491 | out_err: | ||
1492 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
1493 | index 88c7e821fd11..2697e4397e46 100644 | ||
1494 | --- a/net/ipv4/tcp_output.c | ||
1495 | +++ b/net/ipv4/tcp_output.c | ||
1496 | @@ -2046,7 +2046,7 @@ static bool tcp_can_coalesce_send_queue_head(struct sock *sk, int len) | ||
1497 | if (len <= skb->len) | ||
1498 | break; | ||
1499 | |||
1500 | - if (unlikely(TCP_SKB_CB(skb)->eor)) | ||
1501 | + if (unlikely(TCP_SKB_CB(skb)->eor) || tcp_has_tx_tstamp(skb)) | ||
1502 | return false; | ||
1503 | |||
1504 | len -= skb->len; | ||
1505 | @@ -2162,6 +2162,7 @@ static int tcp_mtu_probe(struct sock *sk) | ||
1506 | * we need to propagate it to the new skb. | ||
1507 | */ | ||
1508 | TCP_SKB_CB(nskb)->eor = TCP_SKB_CB(skb)->eor; | ||
1509 | + tcp_skb_collapse_tstamp(nskb, skb); | ||
1510 | tcp_unlink_write_queue(skb, sk); | ||
1511 | sk_wmem_free_skb(sk, skb); | ||
1512 | } else { | ||
1513 | diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c | ||
1514 | index dbab62e3f0d7..2d80e913b82f 100644 | ||
1515 | --- a/net/ipv6/mcast.c | ||
1516 | +++ b/net/ipv6/mcast.c | ||
1517 | @@ -791,14 +791,15 @@ static void mld_del_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im) | ||
1518 | if (pmc) { | ||
1519 | im->idev = pmc->idev; | ||
1520 | if (im->mca_sfmode == MCAST_INCLUDE) { | ||
1521 | - im->mca_tomb = pmc->mca_tomb; | ||
1522 | - im->mca_sources = pmc->mca_sources; | ||
1523 | + swap(im->mca_tomb, pmc->mca_tomb); | ||
1524 | + swap(im->mca_sources, pmc->mca_sources); | ||
1525 | for (psf = im->mca_sources; psf; psf = psf->sf_next) | ||
1526 | psf->sf_crcount = idev->mc_qrv; | ||
1527 | } else { | ||
1528 | im->mca_crcount = idev->mc_qrv; | ||
1529 | } | ||
1530 | in6_dev_put(pmc->idev); | ||
1531 | + ip6_mc_clear_src(pmc); | ||
1532 | kfree(pmc); | ||
1533 | } | ||
1534 | spin_unlock_bh(&im->mca_lock); | ||
1535 | diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c | ||
1536 | index 29ff59dd99ac..2145581d7b3d 100644 | ||
1537 | --- a/net/netfilter/nf_tables_api.c | ||
1538 | +++ b/net/netfilter/nf_tables_api.c | ||
1539 | @@ -121,9 +121,14 @@ static void nft_set_trans_bind(const struct nft_ctx *ctx, struct nft_set *set) | ||
1540 | return; | ||
1541 | |||
1542 | list_for_each_entry_reverse(trans, &net->nft.commit_list, list) { | ||
1543 | - if (trans->msg_type == NFT_MSG_NEWSET && | ||
1544 | - nft_trans_set(trans) == set) { | ||
1545 | - set->bound = true; | ||
1546 | + switch (trans->msg_type) { | ||
1547 | + case NFT_MSG_NEWSET: | ||
1548 | + if (nft_trans_set(trans) == set) | ||
1549 | + nft_trans_set_bound(trans) = true; | ||
1550 | + break; | ||
1551 | + case NFT_MSG_NEWSETELEM: | ||
1552 | + if (nft_trans_elem_set(trans) == set) | ||
1553 | + nft_trans_elem_set_bound(trans) = true; | ||
1554 | break; | ||
1555 | } | ||
1556 | } | ||
1557 | @@ -6656,7 +6661,7 @@ static int __nf_tables_abort(struct net *net) | ||
1558 | break; | ||
1559 | case NFT_MSG_NEWSET: | ||
1560 | trans->ctx.table->use--; | ||
1561 | - if (nft_trans_set(trans)->bound) { | ||
1562 | + if (nft_trans_set_bound(trans)) { | ||
1563 | nft_trans_destroy(trans); | ||
1564 | break; | ||
1565 | } | ||
1566 | @@ -6668,7 +6673,7 @@ static int __nf_tables_abort(struct net *net) | ||
1567 | nft_trans_destroy(trans); | ||
1568 | break; | ||
1569 | case NFT_MSG_NEWSETELEM: | ||
1570 | - if (nft_trans_elem_set(trans)->bound) { | ||
1571 | + if (nft_trans_elem_set_bound(trans)) { | ||
1572 | nft_trans_destroy(trans); | ||
1573 | break; | ||
1574 | } | ||
1575 | diff --git a/net/netfilter/nft_flow_offload.c b/net/netfilter/nft_flow_offload.c | ||
1576 | index 6e0c26025ab1..69decbe2c988 100644 | ||
1577 | --- a/net/netfilter/nft_flow_offload.c | ||
1578 | +++ b/net/netfilter/nft_flow_offload.c | ||
1579 | @@ -71,11 +71,11 @@ static void nft_flow_offload_eval(const struct nft_expr *expr, | ||
1580 | { | ||
1581 | struct nft_flow_offload *priv = nft_expr_priv(expr); | ||
1582 | struct nf_flowtable *flowtable = &priv->flowtable->data; | ||
1583 | + struct tcphdr _tcph, *tcph = NULL; | ||
1584 | enum ip_conntrack_info ctinfo; | ||
1585 | struct nf_flow_route route; | ||
1586 | struct flow_offload *flow; | ||
1587 | enum ip_conntrack_dir dir; | ||
1588 | - bool is_tcp = false; | ||
1589 | struct nf_conn *ct; | ||
1590 | int ret; | ||
1591 | |||
1592 | @@ -88,7 +88,10 @@ static void nft_flow_offload_eval(const struct nft_expr *expr, | ||
1593 | |||
1594 | switch (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum) { | ||
1595 | case IPPROTO_TCP: | ||
1596 | - is_tcp = true; | ||
1597 | + tcph = skb_header_pointer(pkt->skb, pkt->xt.thoff, | ||
1598 | + sizeof(_tcph), &_tcph); | ||
1599 | + if (unlikely(!tcph || tcph->fin || tcph->rst)) | ||
1600 | + goto out; | ||
1601 | break; | ||
1602 | case IPPROTO_UDP: | ||
1603 | break; | ||
1604 | @@ -115,7 +118,7 @@ static void nft_flow_offload_eval(const struct nft_expr *expr, | ||
1605 | if (!flow) | ||
1606 | goto err_flow_alloc; | ||
1607 | |||
1608 | - if (is_tcp) { | ||
1609 | + if (tcph) { | ||
1610 | ct->proto.tcp.seen[0].flags |= IP_CT_TCP_FLAG_BE_LIBERAL; | ||
1611 | ct->proto.tcp.seen[1].flags |= IP_CT_TCP_FLAG_BE_LIBERAL; | ||
1612 | } | ||
1613 | diff --git a/net/psample/psample.c b/net/psample/psample.c | ||
1614 | index 64f95624f219..4cea353221da 100644 | ||
1615 | --- a/net/psample/psample.c | ||
1616 | +++ b/net/psample/psample.c | ||
1617 | @@ -156,7 +156,7 @@ static void psample_group_destroy(struct psample_group *group) | ||
1618 | { | ||
1619 | psample_group_notify(group, PSAMPLE_CMD_DEL_GROUP); | ||
1620 | list_del(&group->list); | ||
1621 | - kfree(group); | ||
1622 | + kfree_rcu(group, rcu); | ||
1623 | } | ||
1624 | |||
1625 | static struct psample_group * | ||
1626 | diff --git a/net/rds/recv.c b/net/rds/recv.c | ||
1627 | index 504cd6bcc54c..c0b945516cdb 100644 | ||
1628 | --- a/net/rds/recv.c | ||
1629 | +++ b/net/rds/recv.c | ||
1630 | @@ -1,5 +1,5 @@ | ||
1631 | /* | ||
1632 | - * Copyright (c) 2006, 2018 Oracle and/or its affiliates. All rights reserved. | ||
1633 | + * Copyright (c) 2006, 2019 Oracle and/or its affiliates. All rights reserved. | ||
1634 | * | ||
1635 | * This software is available to you under a choice of one of two | ||
1636 | * licenses. You may choose to be licensed under the terms of the GNU | ||
1637 | @@ -803,6 +803,7 @@ void rds6_inc_info_copy(struct rds_incoming *inc, | ||
1638 | |||
1639 | minfo6.seq = be64_to_cpu(inc->i_hdr.h_sequence); | ||
1640 | minfo6.len = be32_to_cpu(inc->i_hdr.h_len); | ||
1641 | + minfo6.tos = 0; | ||
1642 | |||
1643 | if (flip) { | ||
1644 | minfo6.laddr = *daddr; | ||
1645 | @@ -816,6 +817,8 @@ void rds6_inc_info_copy(struct rds_incoming *inc, | ||
1646 | minfo6.fport = inc->i_hdr.h_dport; | ||
1647 | } | ||
1648 | |||
1649 | + minfo6.flags = 0; | ||
1650 | + | ||
1651 | rds_info_copy(iter, &minfo6, sizeof(minfo6)); | ||
1652 | } | ||
1653 | #endif | ||
1654 | diff --git a/net/sched/act_bpf.c b/net/sched/act_bpf.c | ||
1655 | index 20fae5ca87fa..800846d77a56 100644 | ||
1656 | --- a/net/sched/act_bpf.c | ||
1657 | +++ b/net/sched/act_bpf.c | ||
1658 | @@ -413,7 +413,7 @@ static __net_init int bpf_init_net(struct net *net) | ||
1659 | { | ||
1660 | struct tc_action_net *tn = net_generic(net, bpf_net_id); | ||
1661 | |||
1662 | - return tc_action_net_init(tn, &act_bpf_ops); | ||
1663 | + return tc_action_net_init(net, tn, &act_bpf_ops); | ||
1664 | } | ||
1665 | |||
1666 | static void __net_exit bpf_exit_net(struct list_head *net_list) | ||
1667 | diff --git a/net/sched/act_connmark.c b/net/sched/act_connmark.c | ||
1668 | index 605436747978..538dedd84e21 100644 | ||
1669 | --- a/net/sched/act_connmark.c | ||
1670 | +++ b/net/sched/act_connmark.c | ||
1671 | @@ -215,7 +215,7 @@ static __net_init int connmark_init_net(struct net *net) | ||
1672 | { | ||
1673 | struct tc_action_net *tn = net_generic(net, connmark_net_id); | ||
1674 | |||
1675 | - return tc_action_net_init(tn, &act_connmark_ops); | ||
1676 | + return tc_action_net_init(net, tn, &act_connmark_ops); | ||
1677 | } | ||
1678 | |||
1679 | static void __net_exit connmark_exit_net(struct list_head *net_list) | ||
1680 | diff --git a/net/sched/act_csum.c b/net/sched/act_csum.c | ||
1681 | index 40437197e053..1e269441065a 100644 | ||
1682 | --- a/net/sched/act_csum.c | ||
1683 | +++ b/net/sched/act_csum.c | ||
1684 | @@ -678,7 +678,7 @@ static __net_init int csum_init_net(struct net *net) | ||
1685 | { | ||
1686 | struct tc_action_net *tn = net_generic(net, csum_net_id); | ||
1687 | |||
1688 | - return tc_action_net_init(tn, &act_csum_ops); | ||
1689 | + return tc_action_net_init(net, tn, &act_csum_ops); | ||
1690 | } | ||
1691 | |||
1692 | static void __net_exit csum_exit_net(struct list_head *net_list) | ||
1693 | diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c | ||
1694 | index 72d3347bdd41..dfef9621375e 100644 | ||
1695 | --- a/net/sched/act_gact.c | ||
1696 | +++ b/net/sched/act_gact.c | ||
1697 | @@ -263,7 +263,7 @@ static __net_init int gact_init_net(struct net *net) | ||
1698 | { | ||
1699 | struct tc_action_net *tn = net_generic(net, gact_net_id); | ||
1700 | |||
1701 | - return tc_action_net_init(tn, &act_gact_ops); | ||
1702 | + return tc_action_net_init(net, tn, &act_gact_ops); | ||
1703 | } | ||
1704 | |||
1705 | static void __net_exit gact_exit_net(struct list_head *net_list) | ||
1706 | diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c | ||
1707 | index 24047e0e5db0..bac353bea02f 100644 | ||
1708 | --- a/net/sched/act_ife.c | ||
1709 | +++ b/net/sched/act_ife.c | ||
1710 | @@ -887,7 +887,7 @@ static __net_init int ife_init_net(struct net *net) | ||
1711 | { | ||
1712 | struct tc_action_net *tn = net_generic(net, ife_net_id); | ||
1713 | |||
1714 | - return tc_action_net_init(tn, &act_ife_ops); | ||
1715 | + return tc_action_net_init(net, tn, &act_ife_ops); | ||
1716 | } | ||
1717 | |||
1718 | static void __net_exit ife_exit_net(struct list_head *net_list) | ||
1719 | diff --git a/net/sched/act_ipt.c b/net/sched/act_ipt.c | ||
1720 | index 334f3a057671..01d3669ef498 100644 | ||
1721 | --- a/net/sched/act_ipt.c | ||
1722 | +++ b/net/sched/act_ipt.c | ||
1723 | @@ -65,12 +65,13 @@ static int ipt_init_target(struct net *net, struct xt_entry_target *t, | ||
1724 | return 0; | ||
1725 | } | ||
1726 | |||
1727 | -static void ipt_destroy_target(struct xt_entry_target *t) | ||
1728 | +static void ipt_destroy_target(struct xt_entry_target *t, struct net *net) | ||
1729 | { | ||
1730 | struct xt_tgdtor_param par = { | ||
1731 | .target = t->u.kernel.target, | ||
1732 | .targinfo = t->data, | ||
1733 | .family = NFPROTO_IPV4, | ||
1734 | + .net = net, | ||
1735 | }; | ||
1736 | if (par.target->destroy != NULL) | ||
1737 | par.target->destroy(&par); | ||
1738 | @@ -82,7 +83,7 @@ static void tcf_ipt_release(struct tc_action *a) | ||
1739 | struct tcf_ipt *ipt = to_ipt(a); | ||
1740 | |||
1741 | if (ipt->tcfi_t) { | ||
1742 | - ipt_destroy_target(ipt->tcfi_t); | ||
1743 | + ipt_destroy_target(ipt->tcfi_t, a->idrinfo->net); | ||
1744 | kfree(ipt->tcfi_t); | ||
1745 | } | ||
1746 | kfree(ipt->tcfi_tname); | ||
1747 | @@ -182,7 +183,7 @@ static int __tcf_ipt_init(struct net *net, unsigned int id, struct nlattr *nla, | ||
1748 | |||
1749 | spin_lock_bh(&ipt->tcf_lock); | ||
1750 | if (ret != ACT_P_CREATED) { | ||
1751 | - ipt_destroy_target(ipt->tcfi_t); | ||
1752 | + ipt_destroy_target(ipt->tcfi_t, net); | ||
1753 | kfree(ipt->tcfi_tname); | ||
1754 | kfree(ipt->tcfi_t); | ||
1755 | } | ||
1756 | @@ -353,7 +354,7 @@ static __net_init int ipt_init_net(struct net *net) | ||
1757 | { | ||
1758 | struct tc_action_net *tn = net_generic(net, ipt_net_id); | ||
1759 | |||
1760 | - return tc_action_net_init(tn, &act_ipt_ops); | ||
1761 | + return tc_action_net_init(net, tn, &act_ipt_ops); | ||
1762 | } | ||
1763 | |||
1764 | static void __net_exit ipt_exit_net(struct list_head *net_list) | ||
1765 | @@ -403,7 +404,7 @@ static __net_init int xt_init_net(struct net *net) | ||
1766 | { | ||
1767 | struct tc_action_net *tn = net_generic(net, xt_net_id); | ||
1768 | |||
1769 | - return tc_action_net_init(tn, &act_xt_ops); | ||
1770 | + return tc_action_net_init(net, tn, &act_xt_ops); | ||
1771 | } | ||
1772 | |||
1773 | static void __net_exit xt_exit_net(struct list_head *net_list) | ||
1774 | diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c | ||
1775 | index 548614bd9366..399e3beae6cf 100644 | ||
1776 | --- a/net/sched/act_mirred.c | ||
1777 | +++ b/net/sched/act_mirred.c | ||
1778 | @@ -419,7 +419,7 @@ static __net_init int mirred_init_net(struct net *net) | ||
1779 | { | ||
1780 | struct tc_action_net *tn = net_generic(net, mirred_net_id); | ||
1781 | |||
1782 | - return tc_action_net_init(tn, &act_mirred_ops); | ||
1783 | + return tc_action_net_init(net, tn, &act_mirred_ops); | ||
1784 | } | ||
1785 | |||
1786 | static void __net_exit mirred_exit_net(struct list_head *net_list) | ||
1787 | diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c | ||
1788 | index 619828920b97..d1b47a1b145c 100644 | ||
1789 | --- a/net/sched/act_nat.c | ||
1790 | +++ b/net/sched/act_nat.c | ||
1791 | @@ -317,7 +317,7 @@ static __net_init int nat_init_net(struct net *net) | ||
1792 | { | ||
1793 | struct tc_action_net *tn = net_generic(net, nat_net_id); | ||
1794 | |||
1795 | - return tc_action_net_init(tn, &act_nat_ops); | ||
1796 | + return tc_action_net_init(net, tn, &act_nat_ops); | ||
1797 | } | ||
1798 | |||
1799 | static void __net_exit nat_exit_net(struct list_head *net_list) | ||
1800 | diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c | ||
1801 | index 82d258b2a75a..33c0cc5ef229 100644 | ||
1802 | --- a/net/sched/act_pedit.c | ||
1803 | +++ b/net/sched/act_pedit.c | ||
1804 | @@ -488,7 +488,7 @@ static __net_init int pedit_init_net(struct net *net) | ||
1805 | { | ||
1806 | struct tc_action_net *tn = net_generic(net, pedit_net_id); | ||
1807 | |||
1808 | - return tc_action_net_init(tn, &act_pedit_ops); | ||
1809 | + return tc_action_net_init(net, tn, &act_pedit_ops); | ||
1810 | } | ||
1811 | |||
1812 | static void __net_exit pedit_exit_net(struct list_head *net_list) | ||
1813 | diff --git a/net/sched/act_police.c b/net/sched/act_police.c | ||
1814 | index 997c34db1491..4db25959e156 100644 | ||
1815 | --- a/net/sched/act_police.c | ||
1816 | +++ b/net/sched/act_police.c | ||
1817 | @@ -342,7 +342,7 @@ static __net_init int police_init_net(struct net *net) | ||
1818 | { | ||
1819 | struct tc_action_net *tn = net_generic(net, police_net_id); | ||
1820 | |||
1821 | - return tc_action_net_init(tn, &act_police_ops); | ||
1822 | + return tc_action_net_init(net, tn, &act_police_ops); | ||
1823 | } | ||
1824 | |||
1825 | static void __net_exit police_exit_net(struct list_head *net_list) | ||
1826 | diff --git a/net/sched/act_sample.c b/net/sched/act_sample.c | ||
1827 | index ac37654ca292..98635311a5a0 100644 | ||
1828 | --- a/net/sched/act_sample.c | ||
1829 | +++ b/net/sched/act_sample.c | ||
1830 | @@ -99,7 +99,8 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, | ||
1831 | s->tcf_action = parm->action; | ||
1832 | s->rate = rate; | ||
1833 | s->psample_group_num = psample_group_num; | ||
1834 | - RCU_INIT_POINTER(s->psample_group, psample_group); | ||
1835 | + rcu_swap_protected(s->psample_group, psample_group, | ||
1836 | + lockdep_is_held(&s->tcf_lock)); | ||
1837 | |||
1838 | if (tb[TCA_SAMPLE_TRUNC_SIZE]) { | ||
1839 | s->truncate = true; | ||
1840 | @@ -107,6 +108,8 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, | ||
1841 | } | ||
1842 | spin_unlock_bh(&s->tcf_lock); | ||
1843 | |||
1844 | + if (psample_group) | ||
1845 | + psample_group_put(psample_group); | ||
1846 | if (ret == ACT_P_CREATED) | ||
1847 | tcf_idr_insert(tn, *a); | ||
1848 | return ret; | ||
1849 | @@ -255,7 +258,7 @@ static __net_init int sample_init_net(struct net *net) | ||
1850 | { | ||
1851 | struct tc_action_net *tn = net_generic(net, sample_net_id); | ||
1852 | |||
1853 | - return tc_action_net_init(tn, &act_sample_ops); | ||
1854 | + return tc_action_net_init(net, tn, &act_sample_ops); | ||
1855 | } | ||
1856 | |||
1857 | static void __net_exit sample_exit_net(struct list_head *net_list) | ||
1858 | diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c | ||
1859 | index 658efae71a09..b418ef62e0a4 100644 | ||
1860 | --- a/net/sched/act_simple.c | ||
1861 | +++ b/net/sched/act_simple.c | ||
1862 | @@ -215,7 +215,7 @@ static __net_init int simp_init_net(struct net *net) | ||
1863 | { | ||
1864 | struct tc_action_net *tn = net_generic(net, simp_net_id); | ||
1865 | |||
1866 | - return tc_action_net_init(tn, &act_simp_ops); | ||
1867 | + return tc_action_net_init(net, tn, &act_simp_ops); | ||
1868 | } | ||
1869 | |||
1870 | static void __net_exit simp_exit_net(struct list_head *net_list) | ||
1871 | diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c | ||
1872 | index 7709710a41f7..a80179c1075f 100644 | ||
1873 | --- a/net/sched/act_skbedit.c | ||
1874 | +++ b/net/sched/act_skbedit.c | ||
1875 | @@ -316,7 +316,7 @@ static __net_init int skbedit_init_net(struct net *net) | ||
1876 | { | ||
1877 | struct tc_action_net *tn = net_generic(net, skbedit_net_id); | ||
1878 | |||
1879 | - return tc_action_net_init(tn, &act_skbedit_ops); | ||
1880 | + return tc_action_net_init(net, tn, &act_skbedit_ops); | ||
1881 | } | ||
1882 | |||
1883 | static void __net_exit skbedit_exit_net(struct list_head *net_list) | ||
1884 | diff --git a/net/sched/act_skbmod.c b/net/sched/act_skbmod.c | ||
1885 | index 3038493d18ca..21d195296121 100644 | ||
1886 | --- a/net/sched/act_skbmod.c | ||
1887 | +++ b/net/sched/act_skbmod.c | ||
1888 | @@ -277,7 +277,7 @@ static __net_init int skbmod_init_net(struct net *net) | ||
1889 | { | ||
1890 | struct tc_action_net *tn = net_generic(net, skbmod_net_id); | ||
1891 | |||
1892 | - return tc_action_net_init(tn, &act_skbmod_ops); | ||
1893 | + return tc_action_net_init(net, tn, &act_skbmod_ops); | ||
1894 | } | ||
1895 | |||
1896 | static void __net_exit skbmod_exit_net(struct list_head *net_list) | ||
1897 | diff --git a/net/sched/act_tunnel_key.c b/net/sched/act_tunnel_key.c | ||
1898 | index 66bfe57e74ae..43309ff2b5dc 100644 | ||
1899 | --- a/net/sched/act_tunnel_key.c | ||
1900 | +++ b/net/sched/act_tunnel_key.c | ||
1901 | @@ -579,7 +579,7 @@ static __net_init int tunnel_key_init_net(struct net *net) | ||
1902 | { | ||
1903 | struct tc_action_net *tn = net_generic(net, tunnel_key_net_id); | ||
1904 | |||
1905 | - return tc_action_net_init(tn, &act_tunnel_key_ops); | ||
1906 | + return tc_action_net_init(net, tn, &act_tunnel_key_ops); | ||
1907 | } | ||
1908 | |||
1909 | static void __net_exit tunnel_key_exit_net(struct list_head *net_list) | ||
1910 | diff --git a/net/sched/act_vlan.c b/net/sched/act_vlan.c | ||
1911 | index da993edd2e40..41528b966440 100644 | ||
1912 | --- a/net/sched/act_vlan.c | ||
1913 | +++ b/net/sched/act_vlan.c | ||
1914 | @@ -324,7 +324,7 @@ static __net_init int vlan_init_net(struct net *net) | ||
1915 | { | ||
1916 | struct tc_action_net *tn = net_generic(net, vlan_net_id); | ||
1917 | |||
1918 | - return tc_action_net_init(tn, &act_vlan_ops); | ||
1919 | + return tc_action_net_init(net, tn, &act_vlan_ops); | ||
1920 | } | ||
1921 | |||
1922 | static void __net_exit vlan_exit_net(struct list_head *net_list) | ||
1923 | diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c | ||
1924 | index fcaf00621102..be7aebff0c1e 100644 | ||
1925 | --- a/tools/bpf/bpftool/common.c | ||
1926 | +++ b/tools/bpf/bpftool/common.c | ||
1927 | @@ -238,7 +238,7 @@ int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32)) | ||
1928 | |||
1929 | fd = get_fd_by_id(id); | ||
1930 | if (fd < 0) { | ||
1931 | - p_err("can't get prog by id (%u): %s", id, strerror(errno)); | ||
1932 | + p_err("can't open object by id (%u): %s", id, strerror(errno)); | ||
1933 | return -1; | ||
1934 | } | ||
1935 | |||
1936 | diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c | ||
1937 | index 0ce50c319cfd..ef8a82f29f02 100644 | ||
1938 | --- a/tools/hv/hv_kvp_daemon.c | ||
1939 | +++ b/tools/hv/hv_kvp_daemon.c | ||
1940 | @@ -809,7 +809,7 @@ kvp_get_ip_info(int family, char *if_name, int op, | ||
1941 | int sn_offset = 0; | ||
1942 | int error = 0; | ||
1943 | char *buffer; | ||
1944 | - struct hv_kvp_ipaddr_value *ip_buffer; | ||
1945 | + struct hv_kvp_ipaddr_value *ip_buffer = NULL; | ||
1946 | char cidr_mask[5]; /* /xyz */ | ||
1947 | int weight; | ||
1948 | int i; | ||
1949 | diff --git a/tools/testing/selftests/kvm/lib/x86.c b/tools/testing/selftests/kvm/lib/x86.c | ||
1950 | index a3122f1949a8..4d35eba73dc9 100644 | ||
1951 | --- a/tools/testing/selftests/kvm/lib/x86.c | ||
1952 | +++ b/tools/testing/selftests/kvm/lib/x86.c | ||
1953 | @@ -809,9 +809,11 @@ struct kvm_x86_state *vcpu_save_state(struct kvm_vm *vm, uint32_t vcpuid) | ||
1954 | TEST_ASSERT(r == 0, "Unexpected result from KVM_GET_XSAVE, r: %i", | ||
1955 | r); | ||
1956 | |||
1957 | - r = ioctl(vcpu->fd, KVM_GET_XCRS, &state->xcrs); | ||
1958 | - TEST_ASSERT(r == 0, "Unexpected result from KVM_GET_XCRS, r: %i", | ||
1959 | - r); | ||
1960 | + if (kvm_check_cap(KVM_CAP_XCRS)) { | ||
1961 | + r = ioctl(vcpu->fd, KVM_GET_XCRS, &state->xcrs); | ||
1962 | + TEST_ASSERT(r == 0, "Unexpected result from KVM_GET_XCRS, r: %i", | ||
1963 | + r); | ||
1964 | + } | ||
1965 | |||
1966 | r = ioctl(vcpu->fd, KVM_GET_SREGS, &state->sregs); | ||
1967 | TEST_ASSERT(r == 0, "Unexpected result from KVM_GET_SREGS, r: %i", | ||
1968 | @@ -858,9 +860,11 @@ void vcpu_load_state(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_x86_state *s | ||
1969 | TEST_ASSERT(r == 0, "Unexpected result from KVM_SET_XSAVE, r: %i", | ||
1970 | r); | ||
1971 | |||
1972 | - r = ioctl(vcpu->fd, KVM_SET_XCRS, &state->xcrs); | ||
1973 | - TEST_ASSERT(r == 0, "Unexpected result from KVM_SET_XCRS, r: %i", | ||
1974 | - r); | ||
1975 | + if (kvm_check_cap(KVM_CAP_XCRS)) { | ||
1976 | + r = ioctl(vcpu->fd, KVM_SET_XCRS, &state->xcrs); | ||
1977 | + TEST_ASSERT(r == 0, "Unexpected result from KVM_SET_XCRS, r: %i", | ||
1978 | + r); | ||
1979 | + } | ||
1980 | |||
1981 | r = ioctl(vcpu->fd, KVM_SET_SREGS, &state->sregs); | ||
1982 | TEST_ASSERT(r == 0, "Unexpected result from KVM_SET_SREGS, r: %i", | ||
1983 | diff --git a/tools/testing/selftests/kvm/platform_info_test.c b/tools/testing/selftests/kvm/platform_info_test.c | ||
1984 | index 3764e7121265..65db510dddc3 100644 | ||
1985 | --- a/tools/testing/selftests/kvm/platform_info_test.c | ||
1986 | +++ b/tools/testing/selftests/kvm/platform_info_test.c | ||
1987 | @@ -100,8 +100,8 @@ int main(int argc, char *argv[]) | ||
1988 | msr_platform_info = vcpu_get_msr(vm, VCPU_ID, MSR_PLATFORM_INFO); | ||
1989 | vcpu_set_msr(vm, VCPU_ID, MSR_PLATFORM_INFO, | ||
1990 | msr_platform_info | MSR_PLATFORM_INFO_MAX_TURBO_RATIO); | ||
1991 | - test_msr_platform_info_disabled(vm); | ||
1992 | test_msr_platform_info_enabled(vm); | ||
1993 | + test_msr_platform_info_disabled(vm); | ||
1994 | vcpu_set_msr(vm, VCPU_ID, MSR_PLATFORM_INFO, msr_platform_info); | ||
1995 | |||
1996 | kvm_vm_free(vm); | ||
1997 | diff --git a/virt/kvm/arm/mmio.c b/virt/kvm/arm/mmio.c | ||
1998 | index 08443a15e6be..3caee91bca08 100644 | ||
1999 | --- a/virt/kvm/arm/mmio.c | ||
2000 | +++ b/virt/kvm/arm/mmio.c | ||
2001 | @@ -98,6 +98,12 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||
2002 | unsigned int len; | ||
2003 | int mask; | ||
2004 | |||
2005 | + /* Detect an already handled MMIO return */ | ||
2006 | + if (unlikely(!vcpu->mmio_needed)) | ||
2007 | + return 0; | ||
2008 | + | ||
2009 | + vcpu->mmio_needed = 0; | ||
2010 | + | ||
2011 | if (!run->mmio.is_write) { | ||
2012 | len = run->mmio.len; | ||
2013 | if (len > sizeof(unsigned long)) | ||
2014 | @@ -200,6 +206,7 @@ int io_mem_abort(struct kvm_vcpu *vcpu, struct kvm_run *run, | ||
2015 | run->mmio.is_write = is_write; | ||
2016 | run->mmio.phys_addr = fault_ipa; | ||
2017 | run->mmio.len = len; | ||
2018 | + vcpu->mmio_needed = 1; | ||
2019 | |||
2020 | if (!ret) { | ||
2021 | /* We handled the access successfully in the kernel. */ | ||
2022 | diff --git a/virt/kvm/arm/vgic/vgic-init.c b/virt/kvm/arm/vgic/vgic-init.c | ||
2023 | index 8196e4f8731f..cd75df25fe14 100644 | ||
2024 | --- a/virt/kvm/arm/vgic/vgic-init.c | ||
2025 | +++ b/virt/kvm/arm/vgic/vgic-init.c | ||
2026 | @@ -19,6 +19,7 @@ | ||
2027 | #include <linux/cpu.h> | ||
2028 | #include <linux/kvm_host.h> | ||
2029 | #include <kvm/arm_vgic.h> | ||
2030 | +#include <asm/kvm_emulate.h> | ||
2031 | #include <asm/kvm_mmu.h> | ||
2032 | #include "vgic.h" | ||
2033 | |||
2034 | @@ -175,12 +176,18 @@ static int kvm_vgic_dist_init(struct kvm *kvm, unsigned int nr_spis) | ||
2035 | irq->vcpu = NULL; | ||
2036 | irq->target_vcpu = vcpu0; | ||
2037 | kref_init(&irq->refcount); | ||
2038 | - if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V2) { | ||
2039 | + switch (dist->vgic_model) { | ||
2040 | + case KVM_DEV_TYPE_ARM_VGIC_V2: | ||
2041 | irq->targets = 0; | ||
2042 | irq->group = 0; | ||
2043 | - } else { | ||
2044 | + break; | ||
2045 | + case KVM_DEV_TYPE_ARM_VGIC_V3: | ||
2046 | irq->mpidr = 0; | ||
2047 | irq->group = 1; | ||
2048 | + break; | ||
2049 | + default: | ||
2050 | + kfree(dist->spis); | ||
2051 | + return -EINVAL; | ||
2052 | } | ||
2053 | } | ||
2054 | return 0; | ||
2055 | @@ -220,7 +227,6 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) | ||
2056 | irq->intid = i; | ||
2057 | irq->vcpu = NULL; | ||
2058 | irq->target_vcpu = vcpu; | ||
2059 | - irq->targets = 1U << vcpu->vcpu_id; | ||
2060 | kref_init(&irq->refcount); | ||
2061 | if (vgic_irq_is_sgi(i)) { | ||
2062 | /* SGIs */ | ||
2063 | @@ -230,11 +236,6 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) | ||
2064 | /* PPIs */ | ||
2065 | irq->config = VGIC_CONFIG_LEVEL; | ||
2066 | } | ||
2067 | - | ||
2068 | - if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) | ||
2069 | - irq->group = 1; | ||
2070 | - else | ||
2071 | - irq->group = 0; | ||
2072 | } | ||
2073 | |||
2074 | if (!irqchip_in_kernel(vcpu->kvm)) | ||
2075 | @@ -297,10 +298,19 @@ int vgic_init(struct kvm *kvm) | ||
2076 | |||
2077 | for (i = 0; i < VGIC_NR_PRIVATE_IRQS; i++) { | ||
2078 | struct vgic_irq *irq = &vgic_cpu->private_irqs[i]; | ||
2079 | - if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) | ||
2080 | + switch (dist->vgic_model) { | ||
2081 | + case KVM_DEV_TYPE_ARM_VGIC_V3: | ||
2082 | irq->group = 1; | ||
2083 | - else | ||
2084 | + irq->mpidr = kvm_vcpu_get_mpidr_aff(vcpu); | ||
2085 | + break; | ||
2086 | + case KVM_DEV_TYPE_ARM_VGIC_V2: | ||
2087 | irq->group = 0; | ||
2088 | + irq->targets = 1U << idx; | ||
2089 | + break; | ||
2090 | + default: | ||
2091 | + ret = -EINVAL; | ||
2092 | + goto out; | ||
2093 | + } | ||
2094 | } | ||
2095 | } | ||
2096 |