Magellan Linux

Contents of /trunk/kernel-alx/patches-4.9/0233-4.9.134-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3235 - (show annotations) (download)
Thu Oct 18 08:37:27 2018 UTC (5 years, 6 months ago) by niro
File size: 141982 byte(s)
-linux-4.9.134
1 diff --git a/Documentation/devicetree/bindings/net/macb.txt b/Documentation/devicetree/bindings/net/macb.txt
2 index 1506e948610c..d1f435c92912 100644
3 --- a/Documentation/devicetree/bindings/net/macb.txt
4 +++ b/Documentation/devicetree/bindings/net/macb.txt
5 @@ -10,6 +10,7 @@ Required properties:
6 Use "cdns,pc302-gem" for Picochip picoXcell pc302 and later devices based on
7 the Cadence GEM, or the generic form: "cdns,gem".
8 Use "atmel,sama5d2-gem" for the GEM IP (10/100) available on Atmel sama5d2 SoCs.
9 + Use "atmel,sama5d3-macb" for the 10/100Mbit IP available on Atmel sama5d3 SoCs.
10 Use "atmel,sama5d3-gem" for the Gigabit IP available on Atmel sama5d3 SoCs.
11 Use "atmel,sama5d4-gem" for the GEM IP (10/100) available on Atmel sama5d4 SoCs.
12 Use "cdns,zynq-gem" Xilinx Zynq-7xxx SoC.
13 diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
14 index 3db8c67d2c8d..dbdc4130e149 100644
15 --- a/Documentation/networking/ip-sysctl.txt
16 +++ b/Documentation/networking/ip-sysctl.txt
17 @@ -122,14 +122,11 @@ min_adv_mss - INTEGER
18
19 IP Fragmentation:
20
21 -ipfrag_high_thresh - INTEGER
22 - Maximum memory used to reassemble IP fragments. When
23 - ipfrag_high_thresh bytes of memory is allocated for this purpose,
24 - the fragment handler will toss packets until ipfrag_low_thresh
25 - is reached. This also serves as a maximum limit to namespaces
26 - different from the initial one.
27 -
28 -ipfrag_low_thresh - INTEGER
29 +ipfrag_high_thresh - LONG INTEGER
30 + Maximum memory used to reassemble IP fragments.
31 +
32 +ipfrag_low_thresh - LONG INTEGER
33 + (Obsolete since linux-4.17)
34 Maximum memory used to reassemble IP fragments before the kernel
35 begins to remove incomplete fragment queues to free up resources.
36 The kernel still accepts new fragments for defragmentation.
37 diff --git a/Makefile b/Makefile
38 index 18090f899a7c..46135e4333e6 100644
39 --- a/Makefile
40 +++ b/Makefile
41 @@ -1,6 +1,6 @@
42 VERSION = 4
43 PATCHLEVEL = 9
44 -SUBLEVEL = 133
45 +SUBLEVEL = 134
46 EXTRAVERSION =
47 NAME = Roaring Lionus
48
49 diff --git a/arch/arm/boot/dts/sama5d3_emac.dtsi b/arch/arm/boot/dts/sama5d3_emac.dtsi
50 index 7cb235ef0fb6..6e9e1c2f9def 100644
51 --- a/arch/arm/boot/dts/sama5d3_emac.dtsi
52 +++ b/arch/arm/boot/dts/sama5d3_emac.dtsi
53 @@ -41,7 +41,7 @@
54 };
55
56 macb1: ethernet@f802c000 {
57 - compatible = "cdns,at91sam9260-macb", "cdns,macb";
58 + compatible = "atmel,sama5d3-macb", "cdns,at91sam9260-macb", "cdns,macb";
59 reg = <0xf802c000 0x100>;
60 interrupts = <35 IRQ_TYPE_LEVEL_HIGH 3>;
61 pinctrl-names = "default";
62 diff --git a/arch/x86/include/uapi/asm/kvm.h b/arch/x86/include/uapi/asm/kvm.h
63 index 739c0c594022..1bb90fafcdc3 100644
64 --- a/arch/x86/include/uapi/asm/kvm.h
65 +++ b/arch/x86/include/uapi/asm/kvm.h
66 @@ -356,5 +356,6 @@ struct kvm_sync_regs {
67
68 #define KVM_X86_QUIRK_LINT0_REENABLED (1 << 0)
69 #define KVM_X86_QUIRK_CD_NW_CLEARED (1 << 1)
70 +#define KVM_X86_QUIRK_LAPIC_MMIO_HOLE (1 << 2)
71
72 #endif /* _ASM_X86_KVM_H */
73 diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
74 index a8a86be8cf15..69a81a7daa24 100644
75 --- a/arch/x86/kvm/lapic.c
76 +++ b/arch/x86/kvm/lapic.c
77 @@ -1220,9 +1220,8 @@ EXPORT_SYMBOL_GPL(kvm_lapic_reg_read);
78
79 static int apic_mmio_in_range(struct kvm_lapic *apic, gpa_t addr)
80 {
81 - return kvm_apic_hw_enabled(apic) &&
82 - addr >= apic->base_address &&
83 - addr < apic->base_address + LAPIC_MMIO_LENGTH;
84 + return addr >= apic->base_address &&
85 + addr < apic->base_address + LAPIC_MMIO_LENGTH;
86 }
87
88 static int apic_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
89 @@ -1234,6 +1233,15 @@ static int apic_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
90 if (!apic_mmio_in_range(apic, address))
91 return -EOPNOTSUPP;
92
93 + if (!kvm_apic_hw_enabled(apic) || apic_x2apic_mode(apic)) {
94 + if (!kvm_check_has_quirk(vcpu->kvm,
95 + KVM_X86_QUIRK_LAPIC_MMIO_HOLE))
96 + return -EOPNOTSUPP;
97 +
98 + memset(data, 0xff, len);
99 + return 0;
100 + }
101 +
102 kvm_lapic_reg_read(apic, offset, len, data);
103
104 return 0;
105 @@ -1646,6 +1654,14 @@ static int apic_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
106 if (!apic_mmio_in_range(apic, address))
107 return -EOPNOTSUPP;
108
109 + if (!kvm_apic_hw_enabled(apic) || apic_x2apic_mode(apic)) {
110 + if (!kvm_check_has_quirk(vcpu->kvm,
111 + KVM_X86_QUIRK_LAPIC_MMIO_HOLE))
112 + return -EOPNOTSUPP;
113 +
114 + return 0;
115 + }
116 +
117 /*
118 * APIC register must be aligned on 128-bits boundary.
119 * 32/64/128 bits registers must be accessed thru 32 bits.
120 diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
121 index 47951f4775b9..d47c32a18da8 100644
122 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
123 +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
124 @@ -505,7 +505,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
125
126 while (true) {
127 temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
128 - if (temp & SDMA0_STATUS_REG__RB_CMD_IDLE__SHIFT)
129 + if (temp & SDMA0_RLC0_CONTEXT_STATUS__IDLE_MASK)
130 break;
131 if (timeout <= 0)
132 return -ETIME;
133 diff --git a/drivers/i2c/busses/i2c-scmi.c b/drivers/i2c/busses/i2c-scmi.c
134 index 7aa7b9cb6203..efefcfa24a4c 100644
135 --- a/drivers/i2c/busses/i2c-scmi.c
136 +++ b/drivers/i2c/busses/i2c-scmi.c
137 @@ -152,6 +152,7 @@ acpi_smbus_cmi_access(struct i2c_adapter *adap, u16 addr, unsigned short flags,
138 mt_params[3].type = ACPI_TYPE_INTEGER;
139 mt_params[3].integer.value = len;
140 mt_params[4].type = ACPI_TYPE_BUFFER;
141 + mt_params[4].buffer.length = len;
142 mt_params[4].buffer.pointer = data->block + 1;
143 }
144 break;
145 diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c
146 index 7aab376ecb84..3785c638d530 100644
147 --- a/drivers/mfd/omap-usb-host.c
148 +++ b/drivers/mfd/omap-usb-host.c
149 @@ -548,8 +548,8 @@ static int usbhs_omap_get_dt_pdata(struct device *dev,
150 }
151
152 static const struct of_device_id usbhs_child_match_table[] = {
153 - { .compatible = "ti,omap-ehci", },
154 - { .compatible = "ti,omap-ohci", },
155 + { .compatible = "ti,ehci-omap", },
156 + { .compatible = "ti,ohci-omap3", },
157 { }
158 };
159
160 @@ -875,6 +875,7 @@ static struct platform_driver usbhs_omap_driver = {
161 .pm = &usbhsomap_dev_pm_ops,
162 .of_match_table = usbhs_omap_dt_ids,
163 },
164 + .probe = usbhs_omap_probe,
165 .remove = usbhs_omap_remove,
166 };
167
168 @@ -884,9 +885,9 @@ MODULE_ALIAS("platform:" USBHS_DRIVER_NAME);
169 MODULE_LICENSE("GPL v2");
170 MODULE_DESCRIPTION("usb host common core driver for omap EHCI and OHCI");
171
172 -static int __init omap_usbhs_drvinit(void)
173 +static int omap_usbhs_drvinit(void)
174 {
175 - return platform_driver_probe(&usbhs_omap_driver, usbhs_omap_probe);
176 + return platform_driver_register(&usbhs_omap_driver);
177 }
178
179 /*
180 @@ -898,7 +899,7 @@ static int __init omap_usbhs_drvinit(void)
181 */
182 fs_initcall_sync(omap_usbhs_drvinit);
183
184 -static void __exit omap_usbhs_drvexit(void)
185 +static void omap_usbhs_drvexit(void)
186 {
187 platform_driver_unregister(&usbhs_omap_driver);
188 }
189 diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
190 index 8a5e0ae4e4c0..b1ea29d8ad1a 100644
191 --- a/drivers/net/bonding/bond_main.c
192 +++ b/drivers/net/bonding/bond_main.c
193 @@ -216,6 +216,7 @@ static struct rtnl_link_stats64 *bond_get_stats(struct net_device *bond_dev,
194 static void bond_slave_arr_handler(struct work_struct *work);
195 static bool bond_time_in_interval(struct bonding *bond, unsigned long last_act,
196 int mod);
197 +static void bond_netdev_notify_work(struct work_struct *work);
198
199 /*---------------------------- General routines -----------------------------*/
200
201 @@ -1250,6 +1251,8 @@ static struct slave *bond_alloc_slave(struct bonding *bond)
202 return NULL;
203 }
204 }
205 + INIT_DELAYED_WORK(&slave->notify_work, bond_netdev_notify_work);
206 +
207 return slave;
208 }
209
210 @@ -1257,6 +1260,7 @@ static void bond_free_slave(struct slave *slave)
211 {
212 struct bonding *bond = bond_get_bond_by_slave(slave);
213
214 + cancel_delayed_work_sync(&slave->notify_work);
215 if (BOND_MODE(bond) == BOND_MODE_8023AD)
216 kfree(SLAVE_AD_INFO(slave));
217
218 @@ -1278,39 +1282,26 @@ static void bond_fill_ifslave(struct slave *slave, struct ifslave *info)
219 info->link_failure_count = slave->link_failure_count;
220 }
221
222 -static void bond_netdev_notify(struct net_device *dev,
223 - struct netdev_bonding_info *info)
224 -{
225 - rtnl_lock();
226 - netdev_bonding_info_change(dev, info);
227 - rtnl_unlock();
228 -}
229 -
230 static void bond_netdev_notify_work(struct work_struct *_work)
231 {
232 - struct netdev_notify_work *w =
233 - container_of(_work, struct netdev_notify_work, work.work);
234 + struct slave *slave = container_of(_work, struct slave,
235 + notify_work.work);
236 +
237 + if (rtnl_trylock()) {
238 + struct netdev_bonding_info binfo;
239
240 - bond_netdev_notify(w->dev, &w->bonding_info);
241 - dev_put(w->dev);
242 - kfree(w);
243 + bond_fill_ifslave(slave, &binfo.slave);
244 + bond_fill_ifbond(slave->bond, &binfo.master);
245 + netdev_bonding_info_change(slave->dev, &binfo);
246 + rtnl_unlock();
247 + } else {
248 + queue_delayed_work(slave->bond->wq, &slave->notify_work, 1);
249 + }
250 }
251
252 void bond_queue_slave_event(struct slave *slave)
253 {
254 - struct bonding *bond = slave->bond;
255 - struct netdev_notify_work *nnw = kzalloc(sizeof(*nnw), GFP_ATOMIC);
256 -
257 - if (!nnw)
258 - return;
259 -
260 - dev_hold(slave->dev);
261 - nnw->dev = slave->dev;
262 - bond_fill_ifslave(slave, &nnw->bonding_info.slave);
263 - bond_fill_ifbond(bond, &nnw->bonding_info.master);
264 - INIT_DELAYED_WORK(&nnw->work, bond_netdev_notify_work);
265 -
266 - queue_delayed_work(slave->bond->wq, &nnw->work, 0);
267 + queue_delayed_work(slave->bond->wq, &slave->notify_work, 0);
268 }
269
270 void bond_lower_state_changed(struct slave *slave)
271 diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
272 index 2ce7ae97ac91..c2cd540e9c9e 100644
273 --- a/drivers/net/dsa/bcm_sf2.c
274 +++ b/drivers/net/dsa/bcm_sf2.c
275 @@ -744,7 +744,6 @@ static int bcm_sf2_sw_suspend(struct dsa_switch *ds)
276 static int bcm_sf2_sw_resume(struct dsa_switch *ds)
277 {
278 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
279 - unsigned int port;
280 int ret;
281
282 ret = bcm_sf2_sw_rst(priv);
283 @@ -756,12 +755,7 @@ static int bcm_sf2_sw_resume(struct dsa_switch *ds)
284 if (priv->hw_params.num_gphy == 1)
285 bcm_sf2_gphy_enable_set(ds, true);
286
287 - for (port = 0; port < DSA_MAX_PORTS; port++) {
288 - if ((1 << port) & ds->enabled_port_mask)
289 - bcm_sf2_port_setup(ds, port, NULL);
290 - else if (dsa_is_cpu_port(ds, port))
291 - bcm_sf2_imp_setup(ds, port);
292 - }
293 + ds->ops->setup(ds);
294
295 return 0;
296 }
297 @@ -1135,10 +1129,10 @@ static int bcm_sf2_sw_remove(struct platform_device *pdev)
298 {
299 struct bcm_sf2_priv *priv = platform_get_drvdata(pdev);
300
301 - /* Disable all ports and interrupts */
302 priv->wol_ports_mask = 0;
303 - bcm_sf2_sw_suspend(priv->dev->ds);
304 dsa_unregister_switch(priv->dev->ds);
305 + /* Disable all ports and interrupts */
306 + bcm_sf2_sw_suspend(priv->dev->ds);
307 bcm_sf2_mdio_unregister(priv);
308
309 return 0;
310 diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
311 index 91fbba58d033..16dc9ac7ecb6 100644
312 --- a/drivers/net/ethernet/broadcom/bcmsysport.c
313 +++ b/drivers/net/ethernet/broadcom/bcmsysport.c
314 @@ -828,14 +828,22 @@ static void bcm_sysport_resume_from_wol(struct bcm_sysport_priv *priv)
315 {
316 u32 reg;
317
318 - /* Stop monitoring MPD interrupt */
319 - intrl2_0_mask_set(priv, INTRL2_0_MPD);
320 -
321 /* Clear the MagicPacket detection logic */
322 reg = umac_readl(priv, UMAC_MPD_CTRL);
323 reg &= ~MPD_EN;
324 umac_writel(priv, reg, UMAC_MPD_CTRL);
325
326 + reg = intrl2_0_readl(priv, INTRL2_CPU_STATUS);
327 + if (reg & INTRL2_0_MPD)
328 + netdev_info(priv->netdev, "Wake-on-LAN (MPD) interrupt!\n");
329 +
330 + if (reg & INTRL2_0_BRCM_MATCH_TAG) {
331 + reg = rxchk_readl(priv, RXCHK_BRCM_TAG_MATCH_STATUS) &
332 + RXCHK_BRCM_TAG_MATCH_MASK;
333 + netdev_info(priv->netdev,
334 + "Wake-on-LAN (filters 0x%02x) interrupt!\n", reg);
335 + }
336 +
337 netif_dbg(priv, wol, priv->netdev, "resumed from WOL\n");
338 }
339
340 @@ -868,11 +876,6 @@ static irqreturn_t bcm_sysport_rx_isr(int irq, void *dev_id)
341 if (priv->irq0_stat & INTRL2_0_TX_RING_FULL)
342 bcm_sysport_tx_reclaim_all(priv);
343
344 - if (priv->irq0_stat & INTRL2_0_MPD) {
345 - netdev_info(priv->netdev, "Wake-on-LAN interrupt!\n");
346 - bcm_sysport_resume_from_wol(priv);
347 - }
348 -
349 return IRQ_HANDLED;
350 }
351
352 @@ -1901,9 +1904,6 @@ static int bcm_sysport_suspend_to_wol(struct bcm_sysport_priv *priv)
353 /* UniMAC receive needs to be turned on */
354 umac_enable_set(priv, CMD_RX_EN, 1);
355
356 - /* Enable the interrupt wake-up source */
357 - intrl2_0_mask_clear(priv, INTRL2_0_MPD);
358 -
359 netif_dbg(priv, wol, ndev, "entered WOL mode\n");
360
361 return 0;
362 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
363 index 72297b76944f..208e9dacfd34 100644
364 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
365 +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
366 @@ -1666,8 +1666,11 @@ static int bnxt_poll_work(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
367 if (TX_CMP_TYPE(txcmp) == CMP_TYPE_TX_L2_CMP) {
368 tx_pkts++;
369 /* return full budget so NAPI will complete. */
370 - if (unlikely(tx_pkts > bp->tx_wake_thresh))
371 + if (unlikely(tx_pkts > bp->tx_wake_thresh)) {
372 rx_pkts = budget;
373 + raw_cons = NEXT_RAW_CMP(raw_cons);
374 + break;
375 + }
376 } else if ((TX_CMP_TYPE(txcmp) & 0x30) == 0x10) {
377 rc = bnxt_rx_pkt(bp, bnapi, &raw_cons, &agg_event);
378 if (likely(rc >= 0))
379 @@ -1685,7 +1688,7 @@ static int bnxt_poll_work(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
380 }
381 raw_cons = NEXT_RAW_CMP(raw_cons);
382
383 - if (rx_pkts == budget)
384 + if (rx_pkts && rx_pkts == budget)
385 break;
386 }
387
388 @@ -1797,8 +1800,12 @@ static int bnxt_poll(struct napi_struct *napi, int budget)
389 while (1) {
390 work_done += bnxt_poll_work(bp, bnapi, budget - work_done);
391
392 - if (work_done >= budget)
393 + if (work_done >= budget) {
394 + if (!budget)
395 + BNXT_CP_DB_REARM(cpr->cp_doorbell,
396 + cpr->cp_raw_cons);
397 break;
398 + }
399
400 if (!bnxt_has_work(bp, cpr)) {
401 napi_complete(napi);
402 diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c
403 index 2e1585635083..8f55c23e9821 100644
404 --- a/drivers/net/ethernet/cadence/macb.c
405 +++ b/drivers/net/ethernet/cadence/macb.c
406 @@ -2861,6 +2861,13 @@ static const struct macb_config at91sam9260_config = {
407 .init = macb_init,
408 };
409
410 +static const struct macb_config sama5d3macb_config = {
411 + .caps = MACB_CAPS_SG_DISABLED
412 + | MACB_CAPS_USRIO_HAS_CLKEN | MACB_CAPS_USRIO_DEFAULT_IS_MII_GMII,
413 + .clk_init = macb_clk_init,
414 + .init = macb_init,
415 +};
416 +
417 static const struct macb_config pc302gem_config = {
418 .caps = MACB_CAPS_SG_DISABLED | MACB_CAPS_GIGABIT_MODE_AVAILABLE,
419 .dma_burst_length = 16,
420 @@ -2925,6 +2932,7 @@ static const struct of_device_id macb_dt_ids[] = {
421 { .compatible = "cdns,gem", .data = &pc302gem_config },
422 { .compatible = "atmel,sama5d2-gem", .data = &sama5d2_config },
423 { .compatible = "atmel,sama5d3-gem", .data = &sama5d3_config },
424 + { .compatible = "atmel,sama5d3-macb", .data = &sama5d3macb_config },
425 { .compatible = "atmel,sama5d4-gem", .data = &sama5d4_config },
426 { .compatible = "cdns,at91rm9200-emac", .data = &emac_config },
427 { .compatible = "cdns,emac", .data = &emac_config },
428 diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.c b/drivers/net/ethernet/hisilicon/hns/hnae.c
429 index b6ed818f78ff..06bc8638501e 100644
430 --- a/drivers/net/ethernet/hisilicon/hns/hnae.c
431 +++ b/drivers/net/ethernet/hisilicon/hns/hnae.c
432 @@ -80,7 +80,7 @@ static void hnae_unmap_buffer(struct hnae_ring *ring, struct hnae_desc_cb *cb)
433 if (cb->type == DESC_TYPE_SKB)
434 dma_unmap_single(ring_to_dev(ring), cb->dma, cb->length,
435 ring_to_dma_dir(ring));
436 - else
437 + else if (cb->length)
438 dma_unmap_page(ring_to_dev(ring), cb->dma, cb->length,
439 ring_to_dma_dir(ring));
440 }
441 diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
442 index 8a2a07e21324..92ed6534ceae 100644
443 --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
444 +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
445 @@ -39,9 +39,9 @@
446 #define SKB_TMP_LEN(SKB) \
447 (((SKB)->transport_header - (SKB)->mac_header) + tcp_hdrlen(SKB))
448
449 -static void fill_v2_desc(struct hnae_ring *ring, void *priv,
450 - int size, dma_addr_t dma, int frag_end,
451 - int buf_num, enum hns_desc_type type, int mtu)
452 +static void fill_v2_desc_hw(struct hnae_ring *ring, void *priv, int size,
453 + int send_sz, dma_addr_t dma, int frag_end,
454 + int buf_num, enum hns_desc_type type, int mtu)
455 {
456 struct hnae_desc *desc = &ring->desc[ring->next_to_use];
457 struct hnae_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_use];
458 @@ -63,7 +63,7 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
459 desc_cb->type = type;
460
461 desc->addr = cpu_to_le64(dma);
462 - desc->tx.send_size = cpu_to_le16((u16)size);
463 + desc->tx.send_size = cpu_to_le16((u16)send_sz);
464
465 /* config bd buffer end */
466 hnae_set_bit(rrcfv, HNSV2_TXD_VLD_B, 1);
467 @@ -132,6 +132,14 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
468 ring_ptr_move_fw(ring, next_to_use);
469 }
470
471 +static void fill_v2_desc(struct hnae_ring *ring, void *priv,
472 + int size, dma_addr_t dma, int frag_end,
473 + int buf_num, enum hns_desc_type type, int mtu)
474 +{
475 + fill_v2_desc_hw(ring, priv, size, size, dma, frag_end,
476 + buf_num, type, mtu);
477 +}
478 +
479 static const struct acpi_device_id hns_enet_acpi_match[] = {
480 { "HISI00C1", 0 },
481 { "HISI00C2", 0 },
482 @@ -288,15 +296,15 @@ static void fill_tso_desc(struct hnae_ring *ring, void *priv,
483
484 /* when the frag size is bigger than hardware, split this frag */
485 for (k = 0; k < frag_buf_num; k++)
486 - fill_v2_desc(ring, priv,
487 - (k == frag_buf_num - 1) ?
488 + fill_v2_desc_hw(ring, priv, k == 0 ? size : 0,
489 + (k == frag_buf_num - 1) ?
490 sizeoflast : BD_MAX_SEND_SIZE,
491 - dma + BD_MAX_SEND_SIZE * k,
492 - frag_end && (k == frag_buf_num - 1) ? 1 : 0,
493 - buf_num,
494 - (type == DESC_TYPE_SKB && !k) ?
495 + dma + BD_MAX_SEND_SIZE * k,
496 + frag_end && (k == frag_buf_num - 1) ? 1 : 0,
497 + buf_num,
498 + (type == DESC_TYPE_SKB && !k) ?
499 DESC_TYPE_SKB : DESC_TYPE_PAGE,
500 - mtu);
501 + mtu);
502 }
503
504 netdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev,
505 diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
506 index 7e2ebfc565ee..ff62dc7485d5 100644
507 --- a/drivers/net/ethernet/marvell/mvpp2.c
508 +++ b/drivers/net/ethernet/marvell/mvpp2.c
509 @@ -29,6 +29,7 @@
510 #include <linux/clk.h>
511 #include <linux/hrtimer.h>
512 #include <linux/ktime.h>
513 +#include <linux/if_vlan.h>
514 #include <uapi/linux/ppp_defs.h>
515 #include <net/ip.h>
516 #include <net/ipv6.h>
517 @@ -4266,7 +4267,7 @@ static void mvpp2_txq_desc_put(struct mvpp2_tx_queue *txq)
518 }
519
520 /* Set Tx descriptors fields relevant for CSUM calculation */
521 -static u32 mvpp2_txq_desc_csum(int l3_offs, int l3_proto,
522 +static u32 mvpp2_txq_desc_csum(int l3_offs, __be16 l3_proto,
523 int ip_hdr_len, int l4_proto)
524 {
525 u32 command;
526 @@ -5019,14 +5020,15 @@ static u32 mvpp2_skb_tx_csum(struct mvpp2_port *port, struct sk_buff *skb)
527 if (skb->ip_summed == CHECKSUM_PARTIAL) {
528 int ip_hdr_len = 0;
529 u8 l4_proto;
530 + __be16 l3_proto = vlan_get_protocol(skb);
531
532 - if (skb->protocol == htons(ETH_P_IP)) {
533 + if (l3_proto == htons(ETH_P_IP)) {
534 struct iphdr *ip4h = ip_hdr(skb);
535
536 /* Calculate IPv4 checksum and L4 checksum */
537 ip_hdr_len = ip4h->ihl;
538 l4_proto = ip4h->protocol;
539 - } else if (skb->protocol == htons(ETH_P_IPV6)) {
540 + } else if (l3_proto == htons(ETH_P_IPV6)) {
541 struct ipv6hdr *ip6h = ipv6_hdr(skb);
542
543 /* Read l4_protocol from one of IPv6 extra headers */
544 @@ -5038,7 +5040,7 @@ static u32 mvpp2_skb_tx_csum(struct mvpp2_port *port, struct sk_buff *skb)
545 }
546
547 return mvpp2_txq_desc_csum(skb_network_offset(skb),
548 - skb->protocol, ip_hdr_len, l4_proto);
549 + l3_proto, ip_hdr_len, l4_proto);
550 }
551
552 return MVPP2_TXD_L4_CSUM_NOT | MVPP2_TXD_IP_CSUM_DISABLE;
553 diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
554 index 49bad00a0f8f..5ddadcd0c8db 100644
555 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
556 +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
557 @@ -1800,7 +1800,8 @@ struct qlcnic_hardware_ops {
558 int (*config_loopback) (struct qlcnic_adapter *, u8);
559 int (*clear_loopback) (struct qlcnic_adapter *, u8);
560 int (*config_promisc_mode) (struct qlcnic_adapter *, u32);
561 - void (*change_l2_filter) (struct qlcnic_adapter *, u64 *, u16);
562 + void (*change_l2_filter)(struct qlcnic_adapter *adapter, u64 *addr,
563 + u16 vlan, struct qlcnic_host_tx_ring *tx_ring);
564 int (*get_board_info) (struct qlcnic_adapter *);
565 void (*set_mac_filter_count) (struct qlcnic_adapter *);
566 void (*free_mac_list) (struct qlcnic_adapter *);
567 @@ -2042,9 +2043,10 @@ static inline int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter,
568 }
569
570 static inline void qlcnic_change_filter(struct qlcnic_adapter *adapter,
571 - u64 *addr, u16 id)
572 + u64 *addr, u16 vlan,
573 + struct qlcnic_host_tx_ring *tx_ring)
574 {
575 - adapter->ahw->hw_ops->change_l2_filter(adapter, addr, id);
576 + adapter->ahw->hw_ops->change_l2_filter(adapter, addr, vlan, tx_ring);
577 }
578
579 static inline int qlcnic_get_board_info(struct qlcnic_adapter *adapter)
580 diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
581 index c3c28f0960e5..05d32e86bcf7 100644
582 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
583 +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
584 @@ -2132,7 +2132,8 @@ out:
585 }
586
587 void qlcnic_83xx_change_l2_filter(struct qlcnic_adapter *adapter, u64 *addr,
588 - u16 vlan_id)
589 + u16 vlan_id,
590 + struct qlcnic_host_tx_ring *tx_ring)
591 {
592 u8 mac[ETH_ALEN];
593 memcpy(&mac, addr, ETH_ALEN);
594 diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
595 index 331ae2c20f40..c8e012b3f7e7 100644
596 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
597 +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
598 @@ -550,7 +550,8 @@ int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32);
599 int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32);
600 int qlcnic_83xx_config_hw_lro(struct qlcnic_adapter *, int);
601 int qlcnic_83xx_config_rss(struct qlcnic_adapter *, int);
602 -void qlcnic_83xx_change_l2_filter(struct qlcnic_adapter *, u64 *, u16);
603 +void qlcnic_83xx_change_l2_filter(struct qlcnic_adapter *adapter, u64 *addr,
604 + u16 vlan, struct qlcnic_host_tx_ring *ring);
605 int qlcnic_83xx_get_pci_info(struct qlcnic_adapter *, struct qlcnic_pci_info *);
606 int qlcnic_83xx_set_nic_info(struct qlcnic_adapter *, struct qlcnic_info *);
607 void qlcnic_83xx_initialize_nic(struct qlcnic_adapter *, int);
608 diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
609 index 4bb33af8e2b3..56a3bd9e37dc 100644
610 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
611 +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
612 @@ -173,7 +173,8 @@ int qlcnic_82xx_napi_add(struct qlcnic_adapter *adapter,
613 struct net_device *netdev);
614 void qlcnic_82xx_get_beacon_state(struct qlcnic_adapter *);
615 void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter,
616 - u64 *uaddr, u16 vlan_id);
617 + u64 *uaddr, u16 vlan_id,
618 + struct qlcnic_host_tx_ring *tx_ring);
619 int qlcnic_82xx_config_intr_coalesce(struct qlcnic_adapter *,
620 struct ethtool_coalesce *);
621 int qlcnic_82xx_set_rx_coalesce(struct qlcnic_adapter *);
622 diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
623 index fedd7366713c..e36129401b71 100644
624 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
625 +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
626 @@ -268,13 +268,12 @@ static void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter,
627 }
628
629 void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter, u64 *uaddr,
630 - u16 vlan_id)
631 + u16 vlan_id, struct qlcnic_host_tx_ring *tx_ring)
632 {
633 struct cmd_desc_type0 *hwdesc;
634 struct qlcnic_nic_req *req;
635 struct qlcnic_mac_req *mac_req;
636 struct qlcnic_vlan_req *vlan_req;
637 - struct qlcnic_host_tx_ring *tx_ring = adapter->tx_ring;
638 u32 producer;
639 u64 word;
640
641 @@ -301,7 +300,8 @@ void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter, u64 *uaddr,
642
643 static void qlcnic_send_filter(struct qlcnic_adapter *adapter,
644 struct cmd_desc_type0 *first_desc,
645 - struct sk_buff *skb)
646 + struct sk_buff *skb,
647 + struct qlcnic_host_tx_ring *tx_ring)
648 {
649 struct vlan_ethhdr *vh = (struct vlan_ethhdr *)(skb->data);
650 struct ethhdr *phdr = (struct ethhdr *)(skb->data);
651 @@ -335,7 +335,7 @@ static void qlcnic_send_filter(struct qlcnic_adapter *adapter,
652 tmp_fil->vlan_id == vlan_id) {
653 if (jiffies > (QLCNIC_READD_AGE * HZ + tmp_fil->ftime))
654 qlcnic_change_filter(adapter, &src_addr,
655 - vlan_id);
656 + vlan_id, tx_ring);
657 tmp_fil->ftime = jiffies;
658 return;
659 }
660 @@ -350,7 +350,7 @@ static void qlcnic_send_filter(struct qlcnic_adapter *adapter,
661 if (!fil)
662 return;
663
664 - qlcnic_change_filter(adapter, &src_addr, vlan_id);
665 + qlcnic_change_filter(adapter, &src_addr, vlan_id, tx_ring);
666 fil->ftime = jiffies;
667 fil->vlan_id = vlan_id;
668 memcpy(fil->faddr, &src_addr, ETH_ALEN);
669 @@ -766,7 +766,7 @@ netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
670 }
671
672 if (adapter->drv_mac_learn)
673 - qlcnic_send_filter(adapter, first_desc, skb);
674 + qlcnic_send_filter(adapter, first_desc, skb, tx_ring);
675
676 tx_ring->tx_stats.tx_bytes += skb->len;
677 tx_ring->tx_stats.xmit_called++;
678 diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
679 index 890e4b083f4f..2019e163e0e9 100644
680 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
681 +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
682 @@ -71,7 +71,7 @@ static int dwmac1000_validate_mcast_bins(int mcast_bins)
683 * Description:
684 * This function validates the number of Unicast address entries supported
685 * by a particular Synopsys 10/100/1000 controller. The Synopsys controller
686 - * supports 1, 32, 64, or 128 Unicast filter entries for it's Unicast filter
687 + * supports 1..32, 64, or 128 Unicast filter entries for it's Unicast filter
688 * logic. This function validates a valid, supported configuration is
689 * selected, and defaults to 1 Unicast address if an unsupported
690 * configuration is selected.
691 @@ -81,8 +81,7 @@ static int dwmac1000_validate_ucast_entries(int ucast_entries)
692 int x = ucast_entries;
693
694 switch (x) {
695 - case 1:
696 - case 32:
697 + case 1 ... 32:
698 case 64:
699 case 128:
700 break;
701 diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
702 index f9ec00981b1e..9670aa23ffb9 100644
703 --- a/drivers/net/team/team.c
704 +++ b/drivers/net/team/team.c
705 @@ -1171,6 +1171,11 @@ static int team_port_add(struct team *team, struct net_device *port_dev)
706 return -EBUSY;
707 }
708
709 + if (dev == port_dev) {
710 + netdev_err(dev, "Cannot enslave team device to itself\n");
711 + return -EINVAL;
712 + }
713 +
714 if (port_dev->features & NETIF_F_VLAN_CHALLENGED &&
715 vlan_uses_dev(dev)) {
716 netdev_err(dev, "Device %s is VLAN challenged and team device has VLAN set up\n",
717 diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
718 index 0d4440f28f6b..2b728cc52e3a 100644
719 --- a/drivers/net/usb/qmi_wwan.c
720 +++ b/drivers/net/usb/qmi_wwan.c
721 @@ -934,6 +934,7 @@ static const struct usb_device_id products[] = {
722 {QMI_FIXED_INTF(0x0b3c, 0xc00b, 4)}, /* Olivetti Olicard 500 */
723 {QMI_FIXED_INTF(0x1e2d, 0x0060, 4)}, /* Cinterion PLxx */
724 {QMI_FIXED_INTF(0x1e2d, 0x0053, 4)}, /* Cinterion PHxx,PXxx */
725 + {QMI_FIXED_INTF(0x1e2d, 0x0063, 10)}, /* Cinterion ALASxx (1 RmNet) */
726 {QMI_FIXED_INTF(0x1e2d, 0x0082, 4)}, /* Cinterion PHxx,PXxx (2 RmNet) */
727 {QMI_FIXED_INTF(0x1e2d, 0x0082, 5)}, /* Cinterion PHxx,PXxx (2 RmNet) */
728 {QMI_FIXED_INTF(0x1e2d, 0x0083, 4)}, /* Cinterion PHxx,PXxx (1 RmNet + USB Audio)*/
729 diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
730 index 03d04011d653..8d3f938c6a51 100644
731 --- a/drivers/net/usb/smsc75xx.c
732 +++ b/drivers/net/usb/smsc75xx.c
733 @@ -1518,6 +1518,7 @@ static void smsc75xx_unbind(struct usbnet *dev, struct usb_interface *intf)
734 {
735 struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
736 if (pdata) {
737 + cancel_work_sync(&pdata->set_multicast);
738 netif_dbg(dev, ifdown, dev->net, "free pdata\n");
739 kfree(pdata);
740 pdata = NULL;
741 diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h
742 index 0824a8164a24..07ea4fcf4f88 100644
743 --- a/drivers/scsi/qla2xxx/qla_target.h
744 +++ b/drivers/scsi/qla2xxx/qla_target.h
745 @@ -440,8 +440,8 @@ struct atio_from_isp {
746 static inline int fcpcmd_is_corrupted(struct atio *atio)
747 {
748 if (atio->entry_type == ATIO_TYPE7 &&
749 - (le16_to_cpu(atio->attr_n_length & FCP_CMD_LENGTH_MASK) <
750 - FCP_CMD_LENGTH_MIN))
751 + ((le16_to_cpu(atio->attr_n_length) & FCP_CMD_LENGTH_MASK) <
752 + FCP_CMD_LENGTH_MIN))
753 return 1;
754 else
755 return 0;
756 diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
757 index 04d2b6e25503..80205f3362d4 100644
758 --- a/drivers/target/iscsi/iscsi_target.c
759 +++ b/drivers/target/iscsi/iscsi_target.c
760 @@ -1435,7 +1435,8 @@ static void iscsit_do_crypto_hash_buf(
761
762 sg_init_table(sg, ARRAY_SIZE(sg));
763 sg_set_buf(sg, buf, payload_length);
764 - sg_set_buf(sg + 1, pad_bytes, padding);
765 + if (padding)
766 + sg_set_buf(sg + 1, pad_bytes, padding);
767
768 ahash_request_set_crypt(hash, sg, data_crc, payload_length + padding);
769
770 @@ -3949,10 +3950,14 @@ static bool iscsi_target_check_conn_state(struct iscsi_conn *conn)
771 static void iscsit_get_rx_pdu(struct iscsi_conn *conn)
772 {
773 int ret;
774 - u8 buffer[ISCSI_HDR_LEN], opcode;
775 + u8 *buffer, opcode;
776 u32 checksum = 0, digest = 0;
777 struct kvec iov;
778
779 + buffer = kcalloc(ISCSI_HDR_LEN, sizeof(*buffer), GFP_KERNEL);
780 + if (!buffer)
781 + return;
782 +
783 while (!kthread_should_stop()) {
784 /*
785 * Ensure that both TX and RX per connection kthreads
786 @@ -3960,7 +3965,6 @@ static void iscsit_get_rx_pdu(struct iscsi_conn *conn)
787 */
788 iscsit_thread_check_cpumask(conn, current, 0);
789
790 - memset(buffer, 0, ISCSI_HDR_LEN);
791 memset(&iov, 0, sizeof(struct kvec));
792
793 iov.iov_base = buffer;
794 @@ -3969,7 +3973,7 @@ static void iscsit_get_rx_pdu(struct iscsi_conn *conn)
795 ret = rx_data(conn, &iov, 1, ISCSI_HDR_LEN);
796 if (ret != ISCSI_HDR_LEN) {
797 iscsit_rx_thread_wait_for_tcp(conn);
798 - return;
799 + break;
800 }
801
802 if (conn->conn_ops->HeaderDigest) {
803 @@ -3979,7 +3983,7 @@ static void iscsit_get_rx_pdu(struct iscsi_conn *conn)
804 ret = rx_data(conn, &iov, 1, ISCSI_CRC_LEN);
805 if (ret != ISCSI_CRC_LEN) {
806 iscsit_rx_thread_wait_for_tcp(conn);
807 - return;
808 + break;
809 }
810
811 iscsit_do_crypto_hash_buf(conn->conn_rx_hash,
812 @@ -4003,7 +4007,7 @@ static void iscsit_get_rx_pdu(struct iscsi_conn *conn)
813 }
814
815 if (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT)
816 - return;
817 + break;
818
819 opcode = buffer[0] & ISCSI_OPCODE_MASK;
820
821 @@ -4014,13 +4018,15 @@ static void iscsit_get_rx_pdu(struct iscsi_conn *conn)
822 " while in Discovery Session, rejecting.\n", opcode);
823 iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
824 buffer);
825 - return;
826 + break;
827 }
828
829 ret = iscsi_target_rx_opcode(conn, buffer);
830 if (ret < 0)
831 - return;
832 + break;
833 }
834 +
835 + kfree(buffer);
836 }
837
838 int iscsi_target_rx_thread(void *arg)
839 diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
840 index 0722f75f1d6a..45a03eff4db1 100644
841 --- a/drivers/usb/host/xhci-hub.c
842 +++ b/drivers/usb/host/xhci-hub.c
843 @@ -1072,17 +1072,17 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
844 temp = readl(port_array[wIndex]);
845 break;
846 }
847 -
848 - /* Software should not attempt to set
849 - * port link state above '3' (U3) and the port
850 - * must be enabled.
851 - */
852 - if ((temp & PORT_PE) == 0 ||
853 - (link_state > USB_SS_PORT_LS_U3)) {
854 - xhci_warn(xhci, "Cannot set link state.\n");
855 + /* Port must be enabled */
856 + if (!(temp & PORT_PE)) {
857 + retval = -ENODEV;
858 + break;
859 + }
860 + /* Can't set port link state above '3' (U3) */
861 + if (link_state > USB_SS_PORT_LS_U3) {
862 + xhci_warn(xhci, "Cannot set port %d link state %d\n",
863 + wIndex, link_state);
864 goto error;
865 }
866 -
867 if (link_state == USB_SS_PORT_LS_U3) {
868 slot_id = xhci_find_slot_id_by_port(hcd, xhci,
869 wIndex + 1);
870 diff --git a/drivers/video/fbdev/aty/atyfb.h b/drivers/video/fbdev/aty/atyfb.h
871 index 63c4842eb224..46e0e8b39b76 100644
872 --- a/drivers/video/fbdev/aty/atyfb.h
873 +++ b/drivers/video/fbdev/aty/atyfb.h
874 @@ -332,6 +332,8 @@ extern const struct aty_pll_ops aty_pll_ct; /* Integrated */
875 extern void aty_set_pll_ct(const struct fb_info *info, const union aty_pll *pll);
876 extern u8 aty_ld_pll_ct(int offset, const struct atyfb_par *par);
877
878 +extern const u8 aty_postdividers[8];
879 +
880
881 /*
882 * Hardware cursor support
883 @@ -358,7 +360,6 @@ static inline void wait_for_idle(struct atyfb_par *par)
884
885 extern void aty_reset_engine(const struct atyfb_par *par);
886 extern void aty_init_engine(struct atyfb_par *par, struct fb_info *info);
887 -extern u8 aty_ld_pll_ct(int offset, const struct atyfb_par *par);
888
889 void atyfb_copyarea(struct fb_info *info, const struct fb_copyarea *area);
890 void atyfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect);
891 diff --git a/drivers/video/fbdev/aty/atyfb_base.c b/drivers/video/fbdev/aty/atyfb_base.c
892 index 81367cf0af77..da748c39196c 100644
893 --- a/drivers/video/fbdev/aty/atyfb_base.c
894 +++ b/drivers/video/fbdev/aty/atyfb_base.c
895 @@ -3093,17 +3093,18 @@ static int atyfb_setup_sparc(struct pci_dev *pdev, struct fb_info *info,
896 /*
897 * PLL Reference Divider M:
898 */
899 - M = pll_regs[2];
900 + M = pll_regs[PLL_REF_DIV];
901
902 /*
903 * PLL Feedback Divider N (Dependent on CLOCK_CNTL):
904 */
905 - N = pll_regs[7 + (clock_cntl & 3)];
906 + N = pll_regs[VCLK0_FB_DIV + (clock_cntl & 3)];
907
908 /*
909 * PLL Post Divider P (Dependent on CLOCK_CNTL):
910 */
911 - P = 1 << (pll_regs[6] >> ((clock_cntl & 3) << 1));
912 + P = aty_postdividers[((pll_regs[VCLK_POST_DIV] >> ((clock_cntl & 3) << 1)) & 3) |
913 + ((pll_regs[PLL_EXT_CNTL] >> (2 + (clock_cntl & 3))) & 4)];
914
915 /*
916 * PLL Divider Q:
917 diff --git a/drivers/video/fbdev/aty/mach64_ct.c b/drivers/video/fbdev/aty/mach64_ct.c
918 index 51f29d627ceb..af54256a20a1 100644
919 --- a/drivers/video/fbdev/aty/mach64_ct.c
920 +++ b/drivers/video/fbdev/aty/mach64_ct.c
921 @@ -114,7 +114,7 @@ static void aty_st_pll_ct(int offset, u8 val, const struct atyfb_par *par)
922 */
923
924 #define Maximum_DSP_PRECISION 7
925 -static u8 postdividers[] = {1,2,4,8,3};
926 +const u8 aty_postdividers[8] = {1,2,4,8,3,5,6,12};
927
928 static int aty_dsp_gt(const struct fb_info *info, u32 bpp, struct pll_ct *pll)
929 {
930 @@ -221,7 +221,7 @@ static int aty_valid_pll_ct(const struct fb_info *info, u32 vclk_per, struct pll
931 pll->vclk_post_div += (q < 64*8);
932 pll->vclk_post_div += (q < 32*8);
933 }
934 - pll->vclk_post_div_real = postdividers[pll->vclk_post_div];
935 + pll->vclk_post_div_real = aty_postdividers[pll->vclk_post_div];
936 // pll->vclk_post_div <<= 6;
937 pll->vclk_fb_div = q * pll->vclk_post_div_real / 8;
938 pllvclk = (1000000 * 2 * pll->vclk_fb_div) /
939 @@ -512,7 +512,7 @@ static int aty_init_pll_ct(const struct fb_info *info, union aty_pll *pll)
940 u8 mclk_fb_div, pll_ext_cntl;
941 pll->ct.pll_ref_div = aty_ld_pll_ct(PLL_REF_DIV, par);
942 pll_ext_cntl = aty_ld_pll_ct(PLL_EXT_CNTL, par);
943 - pll->ct.xclk_post_div_real = postdividers[pll_ext_cntl & 0x07];
944 + pll->ct.xclk_post_div_real = aty_postdividers[pll_ext_cntl & 0x07];
945 mclk_fb_div = aty_ld_pll_ct(MCLK_FB_DIV, par);
946 if (pll_ext_cntl & PLL_MFB_TIMES_4_2B)
947 mclk_fb_div <<= 1;
948 @@ -534,7 +534,7 @@ static int aty_init_pll_ct(const struct fb_info *info, union aty_pll *pll)
949 xpost_div += (q < 64*8);
950 xpost_div += (q < 32*8);
951 }
952 - pll->ct.xclk_post_div_real = postdividers[xpost_div];
953 + pll->ct.xclk_post_div_real = aty_postdividers[xpost_div];
954 pll->ct.mclk_fb_div = q * pll->ct.xclk_post_div_real / 8;
955
956 #ifdef CONFIG_PPC
957 @@ -583,7 +583,7 @@ static int aty_init_pll_ct(const struct fb_info *info, union aty_pll *pll)
958 mpost_div += (q < 64*8);
959 mpost_div += (q < 32*8);
960 }
961 - sclk_post_div_real = postdividers[mpost_div];
962 + sclk_post_div_real = aty_postdividers[mpost_div];
963 pll->ct.sclk_fb_div = q * sclk_post_div_real / 8;
964 pll->ct.spll_cntl2 = mpost_div << 4;
965 #ifdef DEBUG
966 diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
967 index c10180d0b018..7d6da09e637b 100644
968 --- a/fs/ext4/xattr.c
969 +++ b/fs/ext4/xattr.c
970 @@ -657,7 +657,7 @@ ext4_xattr_set_entry(struct ext4_xattr_info *i, struct ext4_xattr_search *s,
971 next = EXT4_XATTR_NEXT(last);
972 if ((void *)next >= s->end) {
973 EXT4_ERROR_INODE(inode, "corrupted xattr entries");
974 - return -EIO;
975 + return -EFSCORRUPTED;
976 }
977 if (last->e_value_size) {
978 size_t offs = le16_to_cpu(last->e_value_offs);
979 diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
980 index 47c7f5b8f675..f254982e1a8f 100644
981 --- a/include/linux/netdevice.h
982 +++ b/include/linux/netdevice.h
983 @@ -2338,6 +2338,13 @@ struct netdev_notifier_info {
984 struct net_device *dev;
985 };
986
987 +struct netdev_notifier_info_ext {
988 + struct netdev_notifier_info info; /* must be first */
989 + union {
990 + u32 mtu;
991 + } ext;
992 +};
993 +
994 struct netdev_notifier_change_info {
995 struct netdev_notifier_info info; /* must be first */
996 unsigned int flags_changed;
997 diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h
998 index 85d1ffc90285..4421e5ccb092 100644
999 --- a/include/linux/rhashtable.h
1000 +++ b/include/linux/rhashtable.h
1001 @@ -138,7 +138,6 @@ struct rhashtable_params {
1002 /**
1003 * struct rhashtable - Hash table handle
1004 * @tbl: Bucket table
1005 - * @nelems: Number of elements in table
1006 * @key_len: Key length for hashfn
1007 * @elasticity: Maximum chain length before rehash
1008 * @p: Configuration parameters
1009 @@ -146,10 +145,10 @@ struct rhashtable_params {
1010 * @run_work: Deferred worker to expand/shrink asynchronously
1011 * @mutex: Mutex to protect current/future table swapping
1012 * @lock: Spin lock to protect walker list
1013 + * @nelems: Number of elements in table
1014 */
1015 struct rhashtable {
1016 struct bucket_table __rcu *tbl;
1017 - atomic_t nelems;
1018 unsigned int key_len;
1019 unsigned int elasticity;
1020 struct rhashtable_params p;
1021 @@ -157,6 +156,7 @@ struct rhashtable {
1022 struct work_struct run_work;
1023 struct mutex mutex;
1024 spinlock_t lock;
1025 + atomic_t nelems;
1026 };
1027
1028 /**
1029 diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
1030 index 1f207dd22757..e90fe6b83e00 100644
1031 --- a/include/linux/skbuff.h
1032 +++ b/include/linux/skbuff.h
1033 @@ -643,9 +643,14 @@ struct sk_buff {
1034 struct skb_mstamp skb_mstamp;
1035 };
1036 };
1037 - struct rb_node rbnode; /* used in netem & tcp stack */
1038 + struct rb_node rbnode; /* used in netem, ip4 defrag, and tcp stack */
1039 };
1040 - struct sock *sk;
1041 +
1042 + union {
1043 + struct sock *sk;
1044 + int ip_defrag_offset;
1045 + };
1046 +
1047 struct net_device *dev;
1048
1049 /*
1050 @@ -2413,7 +2418,7 @@ static inline void __skb_queue_purge(struct sk_buff_head *list)
1051 kfree_skb(skb);
1052 }
1053
1054 -void skb_rbtree_purge(struct rb_root *root);
1055 +unsigned int skb_rbtree_purge(struct rb_root *root);
1056
1057 void *netdev_alloc_frag(unsigned int fragsz);
1058
1059 @@ -2949,6 +2954,7 @@ static inline unsigned char *skb_push_rcsum(struct sk_buff *skb,
1060 return skb->data;
1061 }
1062
1063 +int pskb_trim_rcsum_slow(struct sk_buff *skb, unsigned int len);
1064 /**
1065 * pskb_trim_rcsum - trim received skb and update checksum
1066 * @skb: buffer to trim
1067 @@ -2962,9 +2968,7 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
1068 {
1069 if (likely(len >= skb->len))
1070 return 0;
1071 - if (skb->ip_summed == CHECKSUM_COMPLETE)
1072 - skb->ip_summed = CHECKSUM_NONE;
1073 - return __pskb_trim(skb, len);
1074 + return pskb_trim_rcsum_slow(skb, len);
1075 }
1076
1077 static inline int __skb_trim_rcsum(struct sk_buff *skb, unsigned int len)
1078 @@ -2984,6 +2988,12 @@ static inline int __skb_grow_rcsum(struct sk_buff *skb, unsigned int len)
1079
1080 #define rb_to_skb(rb) rb_entry_safe(rb, struct sk_buff, rbnode)
1081
1082 +#define rb_to_skb(rb) rb_entry_safe(rb, struct sk_buff, rbnode)
1083 +#define skb_rb_first(root) rb_to_skb(rb_first(root))
1084 +#define skb_rb_last(root) rb_to_skb(rb_last(root))
1085 +#define skb_rb_next(skb) rb_to_skb(rb_next(&(skb)->rbnode))
1086 +#define skb_rb_prev(skb) rb_to_skb(rb_prev(&(skb)->rbnode))
1087 +
1088 #define skb_queue_walk(queue, skb) \
1089 for (skb = (queue)->next; \
1090 skb != (struct sk_buff *)(queue); \
1091 @@ -2998,6 +3008,18 @@ static inline int __skb_grow_rcsum(struct sk_buff *skb, unsigned int len)
1092 for (; skb != (struct sk_buff *)(queue); \
1093 skb = skb->next)
1094
1095 +#define skb_rbtree_walk(skb, root) \
1096 + for (skb = skb_rb_first(root); skb != NULL; \
1097 + skb = skb_rb_next(skb))
1098 +
1099 +#define skb_rbtree_walk_from(skb) \
1100 + for (; skb != NULL; \
1101 + skb = skb_rb_next(skb))
1102 +
1103 +#define skb_rbtree_walk_from_safe(skb, tmp) \
1104 + for (; tmp = skb ? skb_rb_next(skb) : NULL, (skb != NULL); \
1105 + skb = tmp)
1106 +
1107 #define skb_queue_walk_from_safe(queue, skb, tmp) \
1108 for (tmp = skb->next; \
1109 skb != (struct sk_buff *)(queue); \
1110 diff --git a/include/net/bonding.h b/include/net/bonding.h
1111 index 714428c54c68..8750c2c4871a 100644
1112 --- a/include/net/bonding.h
1113 +++ b/include/net/bonding.h
1114 @@ -139,12 +139,6 @@ struct bond_parm_tbl {
1115 int mode;
1116 };
1117
1118 -struct netdev_notify_work {
1119 - struct delayed_work work;
1120 - struct net_device *dev;
1121 - struct netdev_bonding_info bonding_info;
1122 -};
1123 -
1124 struct slave {
1125 struct net_device *dev; /* first - useful for panic debug */
1126 struct bonding *bond; /* our master */
1127 @@ -171,6 +165,7 @@ struct slave {
1128 #ifdef CONFIG_NET_POLL_CONTROLLER
1129 struct netpoll *np;
1130 #endif
1131 + struct delayed_work notify_work;
1132 struct kobject kobj;
1133 struct rtnl_link_stats64 slave_stats;
1134 };
1135 diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h
1136 index 634d19203e7d..a3812e9c8fee 100644
1137 --- a/include/net/inet_frag.h
1138 +++ b/include/net/inet_frag.h
1139 @@ -1,14 +1,20 @@
1140 #ifndef __NET_FRAG_H__
1141 #define __NET_FRAG_H__
1142
1143 +#include <linux/rhashtable.h>
1144 +
1145 struct netns_frags {
1146 - /* Keep atomic mem on separate cachelines in structs that include it */
1147 - atomic_t mem ____cacheline_aligned_in_smp;
1148 /* sysctls */
1149 + long high_thresh;
1150 + long low_thresh;
1151 int timeout;
1152 - int high_thresh;
1153 - int low_thresh;
1154 int max_dist;
1155 + struct inet_frags *f;
1156 +
1157 + struct rhashtable rhashtable ____cacheline_aligned_in_smp;
1158 +
1159 + /* Keep atomic mem on separate cachelines in structs that include it */
1160 + atomic_long_t mem ____cacheline_aligned_in_smp;
1161 };
1162
1163 /**
1164 @@ -24,130 +30,115 @@ enum {
1165 INET_FRAG_COMPLETE = BIT(2),
1166 };
1167
1168 +struct frag_v4_compare_key {
1169 + __be32 saddr;
1170 + __be32 daddr;
1171 + u32 user;
1172 + u32 vif;
1173 + __be16 id;
1174 + u16 protocol;
1175 +};
1176 +
1177 +struct frag_v6_compare_key {
1178 + struct in6_addr saddr;
1179 + struct in6_addr daddr;
1180 + u32 user;
1181 + __be32 id;
1182 + u32 iif;
1183 +};
1184 +
1185 /**
1186 * struct inet_frag_queue - fragment queue
1187 *
1188 - * @lock: spinlock protecting the queue
1189 + * @node: rhash node
1190 + * @key: keys identifying this frag.
1191 * @timer: queue expiration timer
1192 - * @list: hash bucket list
1193 + * @lock: spinlock protecting this frag
1194 * @refcnt: reference count of the queue
1195 * @fragments: received fragments head
1196 + * @rb_fragments: received fragments rb-tree root
1197 * @fragments_tail: received fragments tail
1198 + * @last_run_head: the head of the last "run". see ip_fragment.c
1199 * @stamp: timestamp of the last received fragment
1200 * @len: total length of the original datagram
1201 * @meat: length of received fragments so far
1202 * @flags: fragment queue flags
1203 * @max_size: maximum received fragment size
1204 * @net: namespace that this frag belongs to
1205 - * @list_evictor: list of queues to forcefully evict (e.g. due to low memory)
1206 + * @rcu: rcu head for freeing deferall
1207 */
1208 struct inet_frag_queue {
1209 - spinlock_t lock;
1210 + struct rhash_head node;
1211 + union {
1212 + struct frag_v4_compare_key v4;
1213 + struct frag_v6_compare_key v6;
1214 + } key;
1215 struct timer_list timer;
1216 - struct hlist_node list;
1217 + spinlock_t lock;
1218 atomic_t refcnt;
1219 - struct sk_buff *fragments;
1220 + struct sk_buff *fragments; /* Used in IPv6. */
1221 + struct rb_root rb_fragments; /* Used in IPv4. */
1222 struct sk_buff *fragments_tail;
1223 + struct sk_buff *last_run_head;
1224 ktime_t stamp;
1225 int len;
1226 int meat;
1227 __u8 flags;
1228 u16 max_size;
1229 - struct netns_frags *net;
1230 - struct hlist_node list_evictor;
1231 -};
1232 -
1233 -#define INETFRAGS_HASHSZ 1024
1234 -
1235 -/* averaged:
1236 - * max_depth = default ipfrag_high_thresh / INETFRAGS_HASHSZ /
1237 - * rounded up (SKB_TRUELEN(0) + sizeof(struct ipq or
1238 - * struct frag_queue))
1239 - */
1240 -#define INETFRAGS_MAXDEPTH 128
1241 -
1242 -struct inet_frag_bucket {
1243 - struct hlist_head chain;
1244 - spinlock_t chain_lock;
1245 + struct netns_frags *net;
1246 + struct rcu_head rcu;
1247 };
1248
1249 struct inet_frags {
1250 - struct inet_frag_bucket hash[INETFRAGS_HASHSZ];
1251 -
1252 - struct work_struct frags_work;
1253 - unsigned int next_bucket;
1254 - unsigned long last_rebuild_jiffies;
1255 - bool rebuild;
1256 -
1257 - /* The first call to hashfn is responsible to initialize
1258 - * rnd. This is best done with net_get_random_once.
1259 - *
1260 - * rnd_seqlock is used to let hash insertion detect
1261 - * when it needs to re-lookup the hash chain to use.
1262 - */
1263 - u32 rnd;
1264 - seqlock_t rnd_seqlock;
1265 int qsize;
1266
1267 - unsigned int (*hashfn)(const struct inet_frag_queue *);
1268 - bool (*match)(const struct inet_frag_queue *q,
1269 - const void *arg);
1270 void (*constructor)(struct inet_frag_queue *q,
1271 const void *arg);
1272 void (*destructor)(struct inet_frag_queue *);
1273 void (*frag_expire)(unsigned long data);
1274 struct kmem_cache *frags_cachep;
1275 const char *frags_cache_name;
1276 + struct rhashtable_params rhash_params;
1277 };
1278
1279 int inet_frags_init(struct inet_frags *);
1280 void inet_frags_fini(struct inet_frags *);
1281
1282 -static inline void inet_frags_init_net(struct netns_frags *nf)
1283 +static inline int inet_frags_init_net(struct netns_frags *nf)
1284 {
1285 - atomic_set(&nf->mem, 0);
1286 + atomic_long_set(&nf->mem, 0);
1287 + return rhashtable_init(&nf->rhashtable, &nf->f->rhash_params);
1288 }
1289 -void inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f);
1290 +void inet_frags_exit_net(struct netns_frags *nf);
1291
1292 -void inet_frag_kill(struct inet_frag_queue *q, struct inet_frags *f);
1293 -void inet_frag_destroy(struct inet_frag_queue *q, struct inet_frags *f);
1294 -struct inet_frag_queue *inet_frag_find(struct netns_frags *nf,
1295 - struct inet_frags *f, void *key, unsigned int hash);
1296 +void inet_frag_kill(struct inet_frag_queue *q);
1297 +void inet_frag_destroy(struct inet_frag_queue *q);
1298 +struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, void *key);
1299
1300 -void inet_frag_maybe_warn_overflow(struct inet_frag_queue *q,
1301 - const char *prefix);
1302 +/* Free all skbs in the queue; return the sum of their truesizes. */
1303 +unsigned int inet_frag_rbtree_purge(struct rb_root *root);
1304
1305 -static inline void inet_frag_put(struct inet_frag_queue *q, struct inet_frags *f)
1306 +static inline void inet_frag_put(struct inet_frag_queue *q)
1307 {
1308 if (atomic_dec_and_test(&q->refcnt))
1309 - inet_frag_destroy(q, f);
1310 -}
1311 -
1312 -static inline bool inet_frag_evicting(struct inet_frag_queue *q)
1313 -{
1314 - return !hlist_unhashed(&q->list_evictor);
1315 + inet_frag_destroy(q);
1316 }
1317
1318 /* Memory Tracking Functions. */
1319
1320 -static inline int frag_mem_limit(struct netns_frags *nf)
1321 -{
1322 - return atomic_read(&nf->mem);
1323 -}
1324 -
1325 -static inline void sub_frag_mem_limit(struct netns_frags *nf, int i)
1326 +static inline long frag_mem_limit(const struct netns_frags *nf)
1327 {
1328 - atomic_sub(i, &nf->mem);
1329 + return atomic_long_read(&nf->mem);
1330 }
1331
1332 -static inline void add_frag_mem_limit(struct netns_frags *nf, int i)
1333 +static inline void sub_frag_mem_limit(struct netns_frags *nf, long val)
1334 {
1335 - atomic_add(i, &nf->mem);
1336 + atomic_long_sub(val, &nf->mem);
1337 }
1338
1339 -static inline int sum_frag_mem_limit(struct netns_frags *nf)
1340 +static inline void add_frag_mem_limit(struct netns_frags *nf, long val)
1341 {
1342 - return atomic_read(&nf->mem);
1343 + atomic_long_add(val, &nf->mem);
1344 }
1345
1346 /* RFC 3168 support :
1347 diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
1348 index 0464b207d0cf..6213a90a8cec 100644
1349 --- a/include/net/inet_sock.h
1350 +++ b/include/net/inet_sock.h
1351 @@ -132,12 +132,6 @@ static inline int inet_request_bound_dev_if(const struct sock *sk,
1352 return sk->sk_bound_dev_if;
1353 }
1354
1355 -static inline struct ip_options_rcu *ireq_opt_deref(const struct inet_request_sock *ireq)
1356 -{
1357 - return rcu_dereference_check(ireq->ireq_opt,
1358 - atomic_read(&ireq->req.rsk_refcnt) > 0);
1359 -}
1360 -
1361 struct inet_cork {
1362 unsigned int flags;
1363 __be32 addr;
1364 diff --git a/include/net/ip.h b/include/net/ip.h
1365 index bc9b4deeb60e..8646da034851 100644
1366 --- a/include/net/ip.h
1367 +++ b/include/net/ip.h
1368 @@ -548,7 +548,6 @@ static inline struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *s
1369 return skb;
1370 }
1371 #endif
1372 -int ip_frag_mem(struct net *net);
1373
1374 /*
1375 * Functions provided by ip_forward.c
1376 diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
1377 index 978387d6c3e6..a6446d72c5d9 100644
1378 --- a/include/net/ip_fib.h
1379 +++ b/include/net/ip_fib.h
1380 @@ -363,6 +363,7 @@ int ip_fib_check_default(__be32 gw, struct net_device *dev);
1381 int fib_sync_down_dev(struct net_device *dev, unsigned long event, bool force);
1382 int fib_sync_down_addr(struct net_device *dev, __be32 local);
1383 int fib_sync_up(struct net_device *dev, unsigned int nh_flags);
1384 +void fib_sync_mtu(struct net_device *dev, u32 orig_mtu);
1385
1386 extern u32 fib_multipath_secret __read_mostly;
1387
1388 diff --git a/include/net/ipv6.h b/include/net/ipv6.h
1389 index 64b0e9df31c7..7cb100d25bb5 100644
1390 --- a/include/net/ipv6.h
1391 +++ b/include/net/ipv6.h
1392 @@ -330,13 +330,6 @@ static inline bool ipv6_accept_ra(struct inet6_dev *idev)
1393 idev->cnf.accept_ra;
1394 }
1395
1396 -#if IS_ENABLED(CONFIG_IPV6)
1397 -static inline int ip6_frag_mem(struct net *net)
1398 -{
1399 - return sum_frag_mem_limit(&net->ipv6.frags);
1400 -}
1401 -#endif
1402 -
1403 #define IPV6_FRAG_HIGH_THRESH (4 * 1024*1024) /* 4194304 */
1404 #define IPV6_FRAG_LOW_THRESH (3 * 1024*1024) /* 3145728 */
1405 #define IPV6_FRAG_TIMEOUT (60 * HZ) /* 60 seconds */
1406 @@ -530,17 +523,8 @@ enum ip6_defrag_users {
1407 __IP6_DEFRAG_CONNTRACK_BRIDGE_IN = IP6_DEFRAG_CONNTRACK_BRIDGE_IN + USHRT_MAX,
1408 };
1409
1410 -struct ip6_create_arg {
1411 - __be32 id;
1412 - u32 user;
1413 - const struct in6_addr *src;
1414 - const struct in6_addr *dst;
1415 - int iif;
1416 - u8 ecn;
1417 -};
1418 -
1419 void ip6_frag_init(struct inet_frag_queue *q, const void *a);
1420 -bool ip6_frag_match(const struct inet_frag_queue *q, const void *a);
1421 +extern const struct rhashtable_params ip6_rhash_params;
1422
1423 /*
1424 * Equivalent of ipv4 struct ip
1425 @@ -548,19 +532,13 @@ bool ip6_frag_match(const struct inet_frag_queue *q, const void *a);
1426 struct frag_queue {
1427 struct inet_frag_queue q;
1428
1429 - __be32 id; /* fragment id */
1430 - u32 user;
1431 - struct in6_addr saddr;
1432 - struct in6_addr daddr;
1433 -
1434 int iif;
1435 unsigned int csum;
1436 __u16 nhoffset;
1437 u8 ecn;
1438 };
1439
1440 -void ip6_expire_frag_queue(struct net *net, struct frag_queue *fq,
1441 - struct inet_frags *frags);
1442 +void ip6_expire_frag_queue(struct net *net, struct frag_queue *fq);
1443
1444 static inline bool ipv6_addr_any(const struct in6_addr *a)
1445 {
1446 diff --git a/include/uapi/linux/snmp.h b/include/uapi/linux/snmp.h
1447 index e7a31f830690..3442a26d36d9 100644
1448 --- a/include/uapi/linux/snmp.h
1449 +++ b/include/uapi/linux/snmp.h
1450 @@ -55,6 +55,7 @@ enum
1451 IPSTATS_MIB_ECT1PKTS, /* InECT1Pkts */
1452 IPSTATS_MIB_ECT0PKTS, /* InECT0Pkts */
1453 IPSTATS_MIB_CEPKTS, /* InCEPkts */
1454 + IPSTATS_MIB_REASM_OVERLAPS, /* ReasmOverlaps */
1455 __IPSTATS_MIB_MAX
1456 };
1457
1458 diff --git a/lib/rhashtable.c b/lib/rhashtable.c
1459 index 101dac085c62..fdffd6232365 100644
1460 --- a/lib/rhashtable.c
1461 +++ b/lib/rhashtable.c
1462 @@ -251,8 +251,10 @@ static int rhashtable_rehash_table(struct rhashtable *ht)
1463 if (!new_tbl)
1464 return 0;
1465
1466 - for (old_hash = 0; old_hash < old_tbl->size; old_hash++)
1467 + for (old_hash = 0; old_hash < old_tbl->size; old_hash++) {
1468 rhashtable_rehash_chain(ht, old_hash);
1469 + cond_resched();
1470 + }
1471
1472 /* Publish the new table pointer. */
1473 rcu_assign_pointer(ht->tbl, new_tbl);
1474 @@ -993,6 +995,7 @@ void rhashtable_free_and_destroy(struct rhashtable *ht,
1475 for (i = 0; i < tbl->size; i++) {
1476 struct rhash_head *pos, *next;
1477
1478 + cond_resched();
1479 for (pos = rht_dereference(tbl->buckets[i], ht),
1480 next = !rht_is_a_nulls(pos) ?
1481 rht_dereference(pos->next, ht) : NULL;
1482 diff --git a/mm/vmstat.c b/mm/vmstat.c
1483 index d31e801a467c..5e6a4d76659d 100644
1484 --- a/mm/vmstat.c
1485 +++ b/mm/vmstat.c
1486 @@ -1089,7 +1089,6 @@ const char * const vmstat_text[] = {
1487 #ifdef CONFIG_DEBUG_VM_VMACACHE
1488 "vmacache_find_calls",
1489 "vmacache_find_hits",
1490 - "vmacache_full_flushes",
1491 #endif
1492 #endif /* CONFIG_VM_EVENTS_COUNTERS */
1493 };
1494 diff --git a/net/core/dev.c b/net/core/dev.c
1495 index b85e789044d5..15e3bb94156b 100644
1496 --- a/net/core/dev.c
1497 +++ b/net/core/dev.c
1498 @@ -1664,6 +1664,28 @@ int call_netdevice_notifiers(unsigned long val, struct net_device *dev)
1499 }
1500 EXPORT_SYMBOL(call_netdevice_notifiers);
1501
1502 +/**
1503 + * call_netdevice_notifiers_mtu - call all network notifier blocks
1504 + * @val: value passed unmodified to notifier function
1505 + * @dev: net_device pointer passed unmodified to notifier function
1506 + * @arg: additional u32 argument passed to the notifier function
1507 + *
1508 + * Call all network notifier blocks. Parameters and return value
1509 + * are as for raw_notifier_call_chain().
1510 + */
1511 +static int call_netdevice_notifiers_mtu(unsigned long val,
1512 + struct net_device *dev, u32 arg)
1513 +{
1514 + struct netdev_notifier_info_ext info = {
1515 + .info.dev = dev,
1516 + .ext.mtu = arg,
1517 + };
1518 +
1519 + BUILD_BUG_ON(offsetof(struct netdev_notifier_info_ext, info) != 0);
1520 +
1521 + return call_netdevice_notifiers_info(val, dev, &info.info);
1522 +}
1523 +
1524 #ifdef CONFIG_NET_INGRESS
1525 static struct static_key ingress_needed __read_mostly;
1526
1527 @@ -6589,14 +6611,16 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
1528 err = __dev_set_mtu(dev, new_mtu);
1529
1530 if (!err) {
1531 - err = call_netdevice_notifiers(NETDEV_CHANGEMTU, dev);
1532 + err = call_netdevice_notifiers_mtu(NETDEV_CHANGEMTU, dev,
1533 + orig_mtu);
1534 err = notifier_to_errno(err);
1535 if (err) {
1536 /* setting mtu back and notifying everyone again,
1537 * so that they have a chance to revert changes.
1538 */
1539 __dev_set_mtu(dev, orig_mtu);
1540 - call_netdevice_notifiers(NETDEV_CHANGEMTU, dev);
1541 + call_netdevice_notifiers_mtu(NETDEV_CHANGEMTU, dev,
1542 + new_mtu);
1543 }
1544 }
1545 return err;
1546 diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
1547 index 194e844e1021..189082dc288d 100644
1548 --- a/net/core/rtnetlink.c
1549 +++ b/net/core/rtnetlink.c
1550 @@ -2368,6 +2368,12 @@ struct net_device *rtnl_create_link(struct net *net,
1551 else if (ops->get_num_rx_queues)
1552 num_rx_queues = ops->get_num_rx_queues();
1553
1554 + if (num_tx_queues < 1 || num_tx_queues > 4096)
1555 + return ERR_PTR(-EINVAL);
1556 +
1557 + if (num_rx_queues < 1 || num_rx_queues > 4096)
1558 + return ERR_PTR(-EINVAL);
1559 +
1560 err = -ENOMEM;
1561 dev = alloc_netdev_mqs(ops->priv_size, ifname, name_assign_type,
1562 ops->setup, num_tx_queues, num_rx_queues);
1563 diff --git a/net/core/skbuff.c b/net/core/skbuff.c
1564 index 84c731aef0d8..038ec74fa131 100644
1565 --- a/net/core/skbuff.c
1566 +++ b/net/core/skbuff.c
1567 @@ -1578,6 +1578,20 @@ done:
1568 }
1569 EXPORT_SYMBOL(___pskb_trim);
1570
1571 +/* Note : use pskb_trim_rcsum() instead of calling this directly
1572 + */
1573 +int pskb_trim_rcsum_slow(struct sk_buff *skb, unsigned int len)
1574 +{
1575 + if (skb->ip_summed == CHECKSUM_COMPLETE) {
1576 + int delta = skb->len - len;
1577 +
1578 + skb->csum = csum_sub(skb->csum,
1579 + skb_checksum(skb, len, delta, 0));
1580 + }
1581 + return __pskb_trim(skb, len);
1582 +}
1583 +EXPORT_SYMBOL(pskb_trim_rcsum_slow);
1584 +
1585 /**
1586 * __pskb_pull_tail - advance tail of skb header
1587 * @skb: buffer to reallocate
1588 @@ -2425,20 +2439,27 @@ EXPORT_SYMBOL(skb_queue_purge);
1589 /**
1590 * skb_rbtree_purge - empty a skb rbtree
1591 * @root: root of the rbtree to empty
1592 + * Return value: the sum of truesizes of all purged skbs.
1593 *
1594 * Delete all buffers on an &sk_buff rbtree. Each buffer is removed from
1595 * the list and one reference dropped. This function does not take
1596 * any lock. Synchronization should be handled by the caller (e.g., TCP
1597 * out-of-order queue is protected by the socket lock).
1598 */
1599 -void skb_rbtree_purge(struct rb_root *root)
1600 +unsigned int skb_rbtree_purge(struct rb_root *root)
1601 {
1602 - struct sk_buff *skb, *next;
1603 + struct rb_node *p = rb_first(root);
1604 + unsigned int sum = 0;
1605
1606 - rbtree_postorder_for_each_entry_safe(skb, next, root, rbnode)
1607 - kfree_skb(skb);
1608 + while (p) {
1609 + struct sk_buff *skb = rb_entry(p, struct sk_buff, rbnode);
1610
1611 - *root = RB_ROOT;
1612 + p = rb_next(p);
1613 + rb_erase(&skb->rbnode, root);
1614 + sum += skb->truesize;
1615 + kfree_skb(skb);
1616 + }
1617 + return sum;
1618 }
1619
1620 /**
1621 diff --git a/net/dccp/input.c b/net/dccp/input.c
1622 index 4a05d7876850..84ff43acd427 100644
1623 --- a/net/dccp/input.c
1624 +++ b/net/dccp/input.c
1625 @@ -605,11 +605,13 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
1626 if (sk->sk_state == DCCP_LISTEN) {
1627 if (dh->dccph_type == DCCP_PKT_REQUEST) {
1628 /* It is possible that we process SYN packets from backlog,
1629 - * so we need to make sure to disable BH right there.
1630 + * so we need to make sure to disable BH and RCU right there.
1631 */
1632 + rcu_read_lock();
1633 local_bh_disable();
1634 acceptable = inet_csk(sk)->icsk_af_ops->conn_request(sk, skb) >= 0;
1635 local_bh_enable();
1636 + rcu_read_unlock();
1637 if (!acceptable)
1638 return 1;
1639 consume_skb(skb);
1640 diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
1641 index 6697b180e122..28ad6f187e19 100644
1642 --- a/net/dccp/ipv4.c
1643 +++ b/net/dccp/ipv4.c
1644 @@ -493,9 +493,11 @@ static int dccp_v4_send_response(const struct sock *sk, struct request_sock *req
1645
1646 dh->dccph_checksum = dccp_v4_csum_finish(skb, ireq->ir_loc_addr,
1647 ireq->ir_rmt_addr);
1648 + rcu_read_lock();
1649 err = ip_build_and_send_pkt(skb, sk, ireq->ir_loc_addr,
1650 ireq->ir_rmt_addr,
1651 - ireq_opt_deref(ireq));
1652 + rcu_dereference(ireq->ireq_opt));
1653 + rcu_read_unlock();
1654 err = net_xmit_eval(err);
1655 }
1656
1657 diff --git a/net/ieee802154/6lowpan/6lowpan_i.h b/net/ieee802154/6lowpan/6lowpan_i.h
1658 index 5ac778962e4e..3bfec472734a 100644
1659 --- a/net/ieee802154/6lowpan/6lowpan_i.h
1660 +++ b/net/ieee802154/6lowpan/6lowpan_i.h
1661 @@ -16,37 +16,19 @@ typedef unsigned __bitwise__ lowpan_rx_result;
1662 #define LOWPAN_DISPATCH_FRAG1 0xc0
1663 #define LOWPAN_DISPATCH_FRAGN 0xe0
1664
1665 -struct lowpan_create_arg {
1666 +struct frag_lowpan_compare_key {
1667 u16 tag;
1668 u16 d_size;
1669 - const struct ieee802154_addr *src;
1670 - const struct ieee802154_addr *dst;
1671 + const struct ieee802154_addr src;
1672 + const struct ieee802154_addr dst;
1673 };
1674
1675 -/* Equivalent of ipv4 struct ip
1676 +/* Equivalent of ipv4 struct ipq
1677 */
1678 struct lowpan_frag_queue {
1679 struct inet_frag_queue q;
1680 -
1681 - u16 tag;
1682 - u16 d_size;
1683 - struct ieee802154_addr saddr;
1684 - struct ieee802154_addr daddr;
1685 };
1686
1687 -static inline u32 ieee802154_addr_hash(const struct ieee802154_addr *a)
1688 -{
1689 - switch (a->mode) {
1690 - case IEEE802154_ADDR_LONG:
1691 - return (((__force u64)a->extended_addr) >> 32) ^
1692 - (((__force u64)a->extended_addr) & 0xffffffff);
1693 - case IEEE802154_ADDR_SHORT:
1694 - return (__force u32)(a->short_addr + (a->pan_id << 16));
1695 - default:
1696 - return 0;
1697 - }
1698 -}
1699 -
1700 int lowpan_frag_rcv(struct sk_buff *skb, const u8 frag_type);
1701 void lowpan_net_frag_exit(void);
1702 int lowpan_net_frag_init(void);
1703 diff --git a/net/ieee802154/6lowpan/reassembly.c b/net/ieee802154/6lowpan/reassembly.c
1704 index f85b08baff16..6fca75581e13 100644
1705 --- a/net/ieee802154/6lowpan/reassembly.c
1706 +++ b/net/ieee802154/6lowpan/reassembly.c
1707 @@ -37,47 +37,15 @@ static struct inet_frags lowpan_frags;
1708 static int lowpan_frag_reasm(struct lowpan_frag_queue *fq,
1709 struct sk_buff *prev, struct net_device *ldev);
1710
1711 -static unsigned int lowpan_hash_frag(u16 tag, u16 d_size,
1712 - const struct ieee802154_addr *saddr,
1713 - const struct ieee802154_addr *daddr)
1714 -{
1715 - net_get_random_once(&lowpan_frags.rnd, sizeof(lowpan_frags.rnd));
1716 - return jhash_3words(ieee802154_addr_hash(saddr),
1717 - ieee802154_addr_hash(daddr),
1718 - (__force u32)(tag + (d_size << 16)),
1719 - lowpan_frags.rnd);
1720 -}
1721 -
1722 -static unsigned int lowpan_hashfn(const struct inet_frag_queue *q)
1723 -{
1724 - const struct lowpan_frag_queue *fq;
1725 -
1726 - fq = container_of(q, struct lowpan_frag_queue, q);
1727 - return lowpan_hash_frag(fq->tag, fq->d_size, &fq->saddr, &fq->daddr);
1728 -}
1729 -
1730 -static bool lowpan_frag_match(const struct inet_frag_queue *q, const void *a)
1731 -{
1732 - const struct lowpan_frag_queue *fq;
1733 - const struct lowpan_create_arg *arg = a;
1734 -
1735 - fq = container_of(q, struct lowpan_frag_queue, q);
1736 - return fq->tag == arg->tag && fq->d_size == arg->d_size &&
1737 - ieee802154_addr_equal(&fq->saddr, arg->src) &&
1738 - ieee802154_addr_equal(&fq->daddr, arg->dst);
1739 -}
1740 -
1741 static void lowpan_frag_init(struct inet_frag_queue *q, const void *a)
1742 {
1743 - const struct lowpan_create_arg *arg = a;
1744 + const struct frag_lowpan_compare_key *key = a;
1745 struct lowpan_frag_queue *fq;
1746
1747 fq = container_of(q, struct lowpan_frag_queue, q);
1748
1749 - fq->tag = arg->tag;
1750 - fq->d_size = arg->d_size;
1751 - fq->saddr = *arg->src;
1752 - fq->daddr = *arg->dst;
1753 + BUILD_BUG_ON(sizeof(*key) > sizeof(q->key));
1754 + memcpy(&q->key, key, sizeof(*key));
1755 }
1756
1757 static void lowpan_frag_expire(unsigned long data)
1758 @@ -93,10 +61,10 @@ static void lowpan_frag_expire(unsigned long data)
1759 if (fq->q.flags & INET_FRAG_COMPLETE)
1760 goto out;
1761
1762 - inet_frag_kill(&fq->q, &lowpan_frags);
1763 + inet_frag_kill(&fq->q);
1764 out:
1765 spin_unlock(&fq->q.lock);
1766 - inet_frag_put(&fq->q, &lowpan_frags);
1767 + inet_frag_put(&fq->q);
1768 }
1769
1770 static inline struct lowpan_frag_queue *
1771 @@ -104,25 +72,20 @@ fq_find(struct net *net, const struct lowpan_802154_cb *cb,
1772 const struct ieee802154_addr *src,
1773 const struct ieee802154_addr *dst)
1774 {
1775 - struct inet_frag_queue *q;
1776 - struct lowpan_create_arg arg;
1777 - unsigned int hash;
1778 struct netns_ieee802154_lowpan *ieee802154_lowpan =
1779 net_ieee802154_lowpan(net);
1780 + struct frag_lowpan_compare_key key = {
1781 + .tag = cb->d_tag,
1782 + .d_size = cb->d_size,
1783 + .src = *src,
1784 + .dst = *dst,
1785 + };
1786 + struct inet_frag_queue *q;
1787
1788 - arg.tag = cb->d_tag;
1789 - arg.d_size = cb->d_size;
1790 - arg.src = src;
1791 - arg.dst = dst;
1792 -
1793 - hash = lowpan_hash_frag(cb->d_tag, cb->d_size, src, dst);
1794 -
1795 - q = inet_frag_find(&ieee802154_lowpan->frags,
1796 - &lowpan_frags, &arg, hash);
1797 - if (IS_ERR_OR_NULL(q)) {
1798 - inet_frag_maybe_warn_overflow(q, pr_fmt());
1799 + q = inet_frag_find(&ieee802154_lowpan->frags, &key);
1800 + if (!q)
1801 return NULL;
1802 - }
1803 +
1804 return container_of(q, struct lowpan_frag_queue, q);
1805 }
1806
1807 @@ -229,7 +192,7 @@ static int lowpan_frag_reasm(struct lowpan_frag_queue *fq, struct sk_buff *prev,
1808 struct sk_buff *fp, *head = fq->q.fragments;
1809 int sum_truesize;
1810
1811 - inet_frag_kill(&fq->q, &lowpan_frags);
1812 + inet_frag_kill(&fq->q);
1813
1814 /* Make the one we just received the head. */
1815 if (prev) {
1816 @@ -437,7 +400,7 @@ int lowpan_frag_rcv(struct sk_buff *skb, u8 frag_type)
1817 ret = lowpan_frag_queue(fq, skb, frag_type);
1818 spin_unlock(&fq->q.lock);
1819
1820 - inet_frag_put(&fq->q, &lowpan_frags);
1821 + inet_frag_put(&fq->q);
1822 return ret;
1823 }
1824
1825 @@ -447,24 +410,22 @@ err:
1826 }
1827
1828 #ifdef CONFIG_SYSCTL
1829 -static int zero;
1830
1831 static struct ctl_table lowpan_frags_ns_ctl_table[] = {
1832 {
1833 .procname = "6lowpanfrag_high_thresh",
1834 .data = &init_net.ieee802154_lowpan.frags.high_thresh,
1835 - .maxlen = sizeof(int),
1836 + .maxlen = sizeof(unsigned long),
1837 .mode = 0644,
1838 - .proc_handler = proc_dointvec_minmax,
1839 + .proc_handler = proc_doulongvec_minmax,
1840 .extra1 = &init_net.ieee802154_lowpan.frags.low_thresh
1841 },
1842 {
1843 .procname = "6lowpanfrag_low_thresh",
1844 .data = &init_net.ieee802154_lowpan.frags.low_thresh,
1845 - .maxlen = sizeof(int),
1846 + .maxlen = sizeof(unsigned long),
1847 .mode = 0644,
1848 - .proc_handler = proc_dointvec_minmax,
1849 - .extra1 = &zero,
1850 + .proc_handler = proc_doulongvec_minmax,
1851 .extra2 = &init_net.ieee802154_lowpan.frags.high_thresh
1852 },
1853 {
1854 @@ -580,14 +541,20 @@ static int __net_init lowpan_frags_init_net(struct net *net)
1855 {
1856 struct netns_ieee802154_lowpan *ieee802154_lowpan =
1857 net_ieee802154_lowpan(net);
1858 + int res;
1859
1860 ieee802154_lowpan->frags.high_thresh = IPV6_FRAG_HIGH_THRESH;
1861 ieee802154_lowpan->frags.low_thresh = IPV6_FRAG_LOW_THRESH;
1862 ieee802154_lowpan->frags.timeout = IPV6_FRAG_TIMEOUT;
1863 + ieee802154_lowpan->frags.f = &lowpan_frags;
1864
1865 - inet_frags_init_net(&ieee802154_lowpan->frags);
1866 -
1867 - return lowpan_frags_ns_sysctl_register(net);
1868 + res = inet_frags_init_net(&ieee802154_lowpan->frags);
1869 + if (res < 0)
1870 + return res;
1871 + res = lowpan_frags_ns_sysctl_register(net);
1872 + if (res < 0)
1873 + inet_frags_exit_net(&ieee802154_lowpan->frags);
1874 + return res;
1875 }
1876
1877 static void __net_exit lowpan_frags_exit_net(struct net *net)
1878 @@ -596,7 +563,7 @@ static void __net_exit lowpan_frags_exit_net(struct net *net)
1879 net_ieee802154_lowpan(net);
1880
1881 lowpan_frags_ns_sysctl_unregister(net);
1882 - inet_frags_exit_net(&ieee802154_lowpan->frags, &lowpan_frags);
1883 + inet_frags_exit_net(&ieee802154_lowpan->frags);
1884 }
1885
1886 static struct pernet_operations lowpan_frags_ops = {
1887 @@ -604,32 +571,63 @@ static struct pernet_operations lowpan_frags_ops = {
1888 .exit = lowpan_frags_exit_net,
1889 };
1890
1891 -int __init lowpan_net_frag_init(void)
1892 +static u32 lowpan_key_hashfn(const void *data, u32 len, u32 seed)
1893 {
1894 - int ret;
1895 + return jhash2(data,
1896 + sizeof(struct frag_lowpan_compare_key) / sizeof(u32), seed);
1897 +}
1898
1899 - ret = lowpan_frags_sysctl_register();
1900 - if (ret)
1901 - return ret;
1902 +static u32 lowpan_obj_hashfn(const void *data, u32 len, u32 seed)
1903 +{
1904 + const struct inet_frag_queue *fq = data;
1905
1906 - ret = register_pernet_subsys(&lowpan_frags_ops);
1907 - if (ret)
1908 - goto err_pernet;
1909 + return jhash2((const u32 *)&fq->key,
1910 + sizeof(struct frag_lowpan_compare_key) / sizeof(u32), seed);
1911 +}
1912 +
1913 +static int lowpan_obj_cmpfn(struct rhashtable_compare_arg *arg, const void *ptr)
1914 +{
1915 + const struct frag_lowpan_compare_key *key = arg->key;
1916 + const struct inet_frag_queue *fq = ptr;
1917 +
1918 + return !!memcmp(&fq->key, key, sizeof(*key));
1919 +}
1920 +
1921 +static const struct rhashtable_params lowpan_rhash_params = {
1922 + .head_offset = offsetof(struct inet_frag_queue, node),
1923 + .hashfn = lowpan_key_hashfn,
1924 + .obj_hashfn = lowpan_obj_hashfn,
1925 + .obj_cmpfn = lowpan_obj_cmpfn,
1926 + .automatic_shrinking = true,
1927 +};
1928 +
1929 +int __init lowpan_net_frag_init(void)
1930 +{
1931 + int ret;
1932
1933 - lowpan_frags.hashfn = lowpan_hashfn;
1934 lowpan_frags.constructor = lowpan_frag_init;
1935 lowpan_frags.destructor = NULL;
1936 lowpan_frags.qsize = sizeof(struct frag_queue);
1937 - lowpan_frags.match = lowpan_frag_match;
1938 lowpan_frags.frag_expire = lowpan_frag_expire;
1939 lowpan_frags.frags_cache_name = lowpan_frags_cache_name;
1940 + lowpan_frags.rhash_params = lowpan_rhash_params;
1941 ret = inet_frags_init(&lowpan_frags);
1942 if (ret)
1943 - goto err_pernet;
1944 + goto out;
1945
1946 + ret = lowpan_frags_sysctl_register();
1947 + if (ret)
1948 + goto err_sysctl;
1949 +
1950 + ret = register_pernet_subsys(&lowpan_frags_ops);
1951 + if (ret)
1952 + goto err_pernet;
1953 +out:
1954 return ret;
1955 err_pernet:
1956 lowpan_frags_sysctl_unregister();
1957 +err_sysctl:
1958 + inet_frags_fini(&lowpan_frags);
1959 return ret;
1960 }
1961
1962 diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
1963 index 6a2ef162088d..9364c39d0555 100644
1964 --- a/net/ipv4/fib_frontend.c
1965 +++ b/net/ipv4/fib_frontend.c
1966 @@ -1171,7 +1171,8 @@ static int fib_inetaddr_event(struct notifier_block *this, unsigned long event,
1967 static int fib_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1968 {
1969 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1970 - struct netdev_notifier_changeupper_info *info;
1971 + struct netdev_notifier_changeupper_info *upper_info = ptr;
1972 + struct netdev_notifier_info_ext *info_ext = ptr;
1973 struct in_device *in_dev;
1974 struct net *net = dev_net(dev);
1975 unsigned int flags;
1976 @@ -1206,16 +1207,19 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo
1977 fib_sync_up(dev, RTNH_F_LINKDOWN);
1978 else
1979 fib_sync_down_dev(dev, event, false);
1980 - /* fall through */
1981 + rt_cache_flush(net);
1982 + break;
1983 case NETDEV_CHANGEMTU:
1984 + fib_sync_mtu(dev, info_ext->ext.mtu);
1985 rt_cache_flush(net);
1986 break;
1987 case NETDEV_CHANGEUPPER:
1988 - info = ptr;
1989 + upper_info = ptr;
1990 /* flush all routes if dev is linked to or unlinked from
1991 * an L3 master device (e.g., VRF)
1992 */
1993 - if (info->upper_dev && netif_is_l3_master(info->upper_dev))
1994 + if (upper_info->upper_dev &&
1995 + netif_is_l3_master(upper_info->upper_dev))
1996 fib_disable_ip(dev, NETDEV_DOWN, true);
1997 break;
1998 }
1999 diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
2000 index a88dab33cdf6..90c654012510 100644
2001 --- a/net/ipv4/fib_semantics.c
2002 +++ b/net/ipv4/fib_semantics.c
2003 @@ -1377,6 +1377,56 @@ int fib_sync_down_addr(struct net_device *dev, __be32 local)
2004 return ret;
2005 }
2006
2007 +/* Update the PMTU of exceptions when:
2008 + * - the new MTU of the first hop becomes smaller than the PMTU
2009 + * - the old MTU was the same as the PMTU, and it limited discovery of
2010 + * larger MTUs on the path. With that limit raised, we can now
2011 + * discover larger MTUs
2012 + * A special case is locked exceptions, for which the PMTU is smaller
2013 + * than the minimal accepted PMTU:
2014 + * - if the new MTU is greater than the PMTU, don't make any change
2015 + * - otherwise, unlock and set PMTU
2016 + */
2017 +static void nh_update_mtu(struct fib_nh *nh, u32 new, u32 orig)
2018 +{
2019 + struct fnhe_hash_bucket *bucket;
2020 + int i;
2021 +
2022 + bucket = rcu_dereference_protected(nh->nh_exceptions, 1);
2023 + if (!bucket)
2024 + return;
2025 +
2026 + for (i = 0; i < FNHE_HASH_SIZE; i++) {
2027 + struct fib_nh_exception *fnhe;
2028 +
2029 + for (fnhe = rcu_dereference_protected(bucket[i].chain, 1);
2030 + fnhe;
2031 + fnhe = rcu_dereference_protected(fnhe->fnhe_next, 1)) {
2032 + if (fnhe->fnhe_mtu_locked) {
2033 + if (new <= fnhe->fnhe_pmtu) {
2034 + fnhe->fnhe_pmtu = new;
2035 + fnhe->fnhe_mtu_locked = false;
2036 + }
2037 + } else if (new < fnhe->fnhe_pmtu ||
2038 + orig == fnhe->fnhe_pmtu) {
2039 + fnhe->fnhe_pmtu = new;
2040 + }
2041 + }
2042 + }
2043 +}
2044 +
2045 +void fib_sync_mtu(struct net_device *dev, u32 orig_mtu)
2046 +{
2047 + unsigned int hash = fib_devindex_hashfn(dev->ifindex);
2048 + struct hlist_head *head = &fib_info_devhash[hash];
2049 + struct fib_nh *nh;
2050 +
2051 + hlist_for_each_entry(nh, head, nh_hash) {
2052 + if (nh->nh_dev == dev)
2053 + nh_update_mtu(nh, dev->mtu, orig_mtu);
2054 + }
2055 +}
2056 +
2057 /* Event force Flags Description
2058 * NETDEV_CHANGE 0 LINKDOWN Carrier OFF, not for scope host
2059 * NETDEV_DOWN 0 LINKDOWN|DEAD Link down, not for scope host
2060 diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
2061 index d1cab49393e2..528a6777cda0 100644
2062 --- a/net/ipv4/inet_connection_sock.c
2063 +++ b/net/ipv4/inet_connection_sock.c
2064 @@ -410,7 +410,8 @@ struct dst_entry *inet_csk_route_req(const struct sock *sk,
2065 struct ip_options_rcu *opt;
2066 struct rtable *rt;
2067
2068 - opt = ireq_opt_deref(ireq);
2069 + rcu_read_lock();
2070 + opt = rcu_dereference(ireq->ireq_opt);
2071
2072 flowi4_init_output(fl4, ireq->ir_iif, ireq->ir_mark,
2073 RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE,
2074 @@ -424,11 +425,13 @@ struct dst_entry *inet_csk_route_req(const struct sock *sk,
2075 goto no_route;
2076 if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway)
2077 goto route_err;
2078 + rcu_read_unlock();
2079 return &rt->dst;
2080
2081 route_err:
2082 ip_rt_put(rt);
2083 no_route:
2084 + rcu_read_unlock();
2085 __IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);
2086 return NULL;
2087 }
2088 diff --git a/net/ipv4/inet_fragment.c b/net/ipv4/inet_fragment.c
2089 index f8b41aaac76f..8323d33c0ce2 100644
2090 --- a/net/ipv4/inet_fragment.c
2091 +++ b/net/ipv4/inet_fragment.c
2092 @@ -25,12 +25,6 @@
2093 #include <net/inet_frag.h>
2094 #include <net/inet_ecn.h>
2095
2096 -#define INETFRAGS_EVICT_BUCKETS 128
2097 -#define INETFRAGS_EVICT_MAX 512
2098 -
2099 -/* don't rebuild inetfrag table with new secret more often than this */
2100 -#define INETFRAGS_MIN_REBUILD_INTERVAL (5 * HZ)
2101 -
2102 /* Given the OR values of all fragments, apply RFC 3168 5.3 requirements
2103 * Value : 0xff if frame should be dropped.
2104 * 0 or INET_ECN_CE value, to be ORed in to final iph->tos field
2105 @@ -52,157 +46,8 @@ const u8 ip_frag_ecn_table[16] = {
2106 };
2107 EXPORT_SYMBOL(ip_frag_ecn_table);
2108
2109 -static unsigned int
2110 -inet_frag_hashfn(const struct inet_frags *f, const struct inet_frag_queue *q)
2111 -{
2112 - return f->hashfn(q) & (INETFRAGS_HASHSZ - 1);
2113 -}
2114 -
2115 -static bool inet_frag_may_rebuild(struct inet_frags *f)
2116 -{
2117 - return time_after(jiffies,
2118 - f->last_rebuild_jiffies + INETFRAGS_MIN_REBUILD_INTERVAL);
2119 -}
2120 -
2121 -static void inet_frag_secret_rebuild(struct inet_frags *f)
2122 -{
2123 - int i;
2124 -
2125 - write_seqlock_bh(&f->rnd_seqlock);
2126 -
2127 - if (!inet_frag_may_rebuild(f))
2128 - goto out;
2129 -
2130 - get_random_bytes(&f->rnd, sizeof(u32));
2131 -
2132 - for (i = 0; i < INETFRAGS_HASHSZ; i++) {
2133 - struct inet_frag_bucket *hb;
2134 - struct inet_frag_queue *q;
2135 - struct hlist_node *n;
2136 -
2137 - hb = &f->hash[i];
2138 - spin_lock(&hb->chain_lock);
2139 -
2140 - hlist_for_each_entry_safe(q, n, &hb->chain, list) {
2141 - unsigned int hval = inet_frag_hashfn(f, q);
2142 -
2143 - if (hval != i) {
2144 - struct inet_frag_bucket *hb_dest;
2145 -
2146 - hlist_del(&q->list);
2147 -
2148 - /* Relink to new hash chain. */
2149 - hb_dest = &f->hash[hval];
2150 -
2151 - /* This is the only place where we take
2152 - * another chain_lock while already holding
2153 - * one. As this will not run concurrently,
2154 - * we cannot deadlock on hb_dest lock below, if its
2155 - * already locked it will be released soon since
2156 - * other caller cannot be waiting for hb lock
2157 - * that we've taken above.
2158 - */
2159 - spin_lock_nested(&hb_dest->chain_lock,
2160 - SINGLE_DEPTH_NESTING);
2161 - hlist_add_head(&q->list, &hb_dest->chain);
2162 - spin_unlock(&hb_dest->chain_lock);
2163 - }
2164 - }
2165 - spin_unlock(&hb->chain_lock);
2166 - }
2167 -
2168 - f->rebuild = false;
2169 - f->last_rebuild_jiffies = jiffies;
2170 -out:
2171 - write_sequnlock_bh(&f->rnd_seqlock);
2172 -}
2173 -
2174 -static bool inet_fragq_should_evict(const struct inet_frag_queue *q)
2175 -{
2176 - if (!hlist_unhashed(&q->list_evictor))
2177 - return false;
2178 -
2179 - return q->net->low_thresh == 0 ||
2180 - frag_mem_limit(q->net) >= q->net->low_thresh;
2181 -}
2182 -
2183 -static unsigned int
2184 -inet_evict_bucket(struct inet_frags *f, struct inet_frag_bucket *hb)
2185 -{
2186 - struct inet_frag_queue *fq;
2187 - struct hlist_node *n;
2188 - unsigned int evicted = 0;
2189 - HLIST_HEAD(expired);
2190 -
2191 - spin_lock(&hb->chain_lock);
2192 -
2193 - hlist_for_each_entry_safe(fq, n, &hb->chain, list) {
2194 - if (!inet_fragq_should_evict(fq))
2195 - continue;
2196 -
2197 - if (!del_timer(&fq->timer))
2198 - continue;
2199 -
2200 - hlist_add_head(&fq->list_evictor, &expired);
2201 - ++evicted;
2202 - }
2203 -
2204 - spin_unlock(&hb->chain_lock);
2205 -
2206 - hlist_for_each_entry_safe(fq, n, &expired, list_evictor)
2207 - f->frag_expire((unsigned long) fq);
2208 -
2209 - return evicted;
2210 -}
2211 -
2212 -static void inet_frag_worker(struct work_struct *work)
2213 -{
2214 - unsigned int budget = INETFRAGS_EVICT_BUCKETS;
2215 - unsigned int i, evicted = 0;
2216 - struct inet_frags *f;
2217 -
2218 - f = container_of(work, struct inet_frags, frags_work);
2219 -
2220 - BUILD_BUG_ON(INETFRAGS_EVICT_BUCKETS >= INETFRAGS_HASHSZ);
2221 -
2222 - local_bh_disable();
2223 -
2224 - for (i = ACCESS_ONCE(f->next_bucket); budget; --budget) {
2225 - evicted += inet_evict_bucket(f, &f->hash[i]);
2226 - i = (i + 1) & (INETFRAGS_HASHSZ - 1);
2227 - if (evicted > INETFRAGS_EVICT_MAX)
2228 - break;
2229 - }
2230 -
2231 - f->next_bucket = i;
2232 -
2233 - local_bh_enable();
2234 -
2235 - if (f->rebuild && inet_frag_may_rebuild(f))
2236 - inet_frag_secret_rebuild(f);
2237 -}
2238 -
2239 -static void inet_frag_schedule_worker(struct inet_frags *f)
2240 -{
2241 - if (unlikely(!work_pending(&f->frags_work)))
2242 - schedule_work(&f->frags_work);
2243 -}
2244 -
2245 int inet_frags_init(struct inet_frags *f)
2246 {
2247 - int i;
2248 -
2249 - INIT_WORK(&f->frags_work, inet_frag_worker);
2250 -
2251 - for (i = 0; i < INETFRAGS_HASHSZ; i++) {
2252 - struct inet_frag_bucket *hb = &f->hash[i];
2253 -
2254 - spin_lock_init(&hb->chain_lock);
2255 - INIT_HLIST_HEAD(&hb->chain);
2256 - }
2257 -
2258 - seqlock_init(&f->rnd_seqlock);
2259 - f->last_rebuild_jiffies = 0;
2260 f->frags_cachep = kmem_cache_create(f->frags_cache_name, f->qsize, 0, 0,
2261 NULL);
2262 if (!f->frags_cachep)
2263 @@ -214,83 +59,75 @@ EXPORT_SYMBOL(inet_frags_init);
2264
2265 void inet_frags_fini(struct inet_frags *f)
2266 {
2267 - cancel_work_sync(&f->frags_work);
2268 + /* We must wait that all inet_frag_destroy_rcu() have completed. */
2269 + rcu_barrier();
2270 +
2271 kmem_cache_destroy(f->frags_cachep);
2272 + f->frags_cachep = NULL;
2273 }
2274 EXPORT_SYMBOL(inet_frags_fini);
2275
2276 -void inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f)
2277 +static void inet_frags_free_cb(void *ptr, void *arg)
2278 {
2279 - unsigned int seq;
2280 - int i;
2281 -
2282 - nf->low_thresh = 0;
2283 -
2284 -evict_again:
2285 - local_bh_disable();
2286 - seq = read_seqbegin(&f->rnd_seqlock);
2287 + struct inet_frag_queue *fq = ptr;
2288
2289 - for (i = 0; i < INETFRAGS_HASHSZ ; i++)
2290 - inet_evict_bucket(f, &f->hash[i]);
2291 -
2292 - local_bh_enable();
2293 - cond_resched();
2294 -
2295 - if (read_seqretry(&f->rnd_seqlock, seq) ||
2296 - sum_frag_mem_limit(nf))
2297 - goto evict_again;
2298 -}
2299 -EXPORT_SYMBOL(inet_frags_exit_net);
2300 -
2301 -static struct inet_frag_bucket *
2302 -get_frag_bucket_locked(struct inet_frag_queue *fq, struct inet_frags *f)
2303 -__acquires(hb->chain_lock)
2304 -{
2305 - struct inet_frag_bucket *hb;
2306 - unsigned int seq, hash;
2307 -
2308 - restart:
2309 - seq = read_seqbegin(&f->rnd_seqlock);
2310 -
2311 - hash = inet_frag_hashfn(f, fq);
2312 - hb = &f->hash[hash];
2313 + /* If we can not cancel the timer, it means this frag_queue
2314 + * is already disappearing, we have nothing to do.
2315 + * Otherwise, we own a refcount until the end of this function.
2316 + */
2317 + if (!del_timer(&fq->timer))
2318 + return;
2319
2320 - spin_lock(&hb->chain_lock);
2321 - if (read_seqretry(&f->rnd_seqlock, seq)) {
2322 - spin_unlock(&hb->chain_lock);
2323 - goto restart;
2324 + spin_lock_bh(&fq->lock);
2325 + if (!(fq->flags & INET_FRAG_COMPLETE)) {
2326 + fq->flags |= INET_FRAG_COMPLETE;
2327 + atomic_dec(&fq->refcnt);
2328 }
2329 + spin_unlock_bh(&fq->lock);
2330
2331 - return hb;
2332 + inet_frag_put(fq);
2333 }
2334
2335 -static inline void fq_unlink(struct inet_frag_queue *fq, struct inet_frags *f)
2336 +void inet_frags_exit_net(struct netns_frags *nf)
2337 {
2338 - struct inet_frag_bucket *hb;
2339 + nf->low_thresh = 0; /* prevent creation of new frags */
2340
2341 - hb = get_frag_bucket_locked(fq, f);
2342 - hlist_del(&fq->list);
2343 - fq->flags |= INET_FRAG_COMPLETE;
2344 - spin_unlock(&hb->chain_lock);
2345 + rhashtable_free_and_destroy(&nf->rhashtable, inet_frags_free_cb, NULL);
2346 }
2347 +EXPORT_SYMBOL(inet_frags_exit_net);
2348
2349 -void inet_frag_kill(struct inet_frag_queue *fq, struct inet_frags *f)
2350 +void inet_frag_kill(struct inet_frag_queue *fq)
2351 {
2352 if (del_timer(&fq->timer))
2353 atomic_dec(&fq->refcnt);
2354
2355 if (!(fq->flags & INET_FRAG_COMPLETE)) {
2356 - fq_unlink(fq, f);
2357 + struct netns_frags *nf = fq->net;
2358 +
2359 + fq->flags |= INET_FRAG_COMPLETE;
2360 + rhashtable_remove_fast(&nf->rhashtable, &fq->node, nf->f->rhash_params);
2361 atomic_dec(&fq->refcnt);
2362 }
2363 }
2364 EXPORT_SYMBOL(inet_frag_kill);
2365
2366 -void inet_frag_destroy(struct inet_frag_queue *q, struct inet_frags *f)
2367 +static void inet_frag_destroy_rcu(struct rcu_head *head)
2368 +{
2369 + struct inet_frag_queue *q = container_of(head, struct inet_frag_queue,
2370 + rcu);
2371 + struct inet_frags *f = q->net->f;
2372 +
2373 + if (f->destructor)
2374 + f->destructor(q);
2375 + kmem_cache_free(f->frags_cachep, q);
2376 +}
2377 +
2378 +void inet_frag_destroy(struct inet_frag_queue *q)
2379 {
2380 struct sk_buff *fp;
2381 struct netns_frags *nf;
2382 unsigned int sum, sum_truesize = 0;
2383 + struct inet_frags *f;
2384
2385 WARN_ON(!(q->flags & INET_FRAG_COMPLETE));
2386 WARN_ON(del_timer(&q->timer) != 0);
2387 @@ -298,64 +135,35 @@ void inet_frag_destroy(struct inet_frag_queue *q, struct inet_frags *f)
2388 /* Release all fragment data. */
2389 fp = q->fragments;
2390 nf = q->net;
2391 - while (fp) {
2392 - struct sk_buff *xp = fp->next;
2393 -
2394 - sum_truesize += fp->truesize;
2395 - kfree_skb(fp);
2396 - fp = xp;
2397 + f = nf->f;
2398 + if (fp) {
2399 + do {
2400 + struct sk_buff *xp = fp->next;
2401 +
2402 + sum_truesize += fp->truesize;
2403 + kfree_skb(fp);
2404 + fp = xp;
2405 + } while (fp);
2406 + } else {
2407 + sum_truesize = inet_frag_rbtree_purge(&q->rb_fragments);
2408 }
2409 sum = sum_truesize + f->qsize;
2410
2411 - if (f->destructor)
2412 - f->destructor(q);
2413 - kmem_cache_free(f->frags_cachep, q);
2414 + call_rcu(&q->rcu, inet_frag_destroy_rcu);
2415
2416 sub_frag_mem_limit(nf, sum);
2417 }
2418 EXPORT_SYMBOL(inet_frag_destroy);
2419
2420 -static struct inet_frag_queue *inet_frag_intern(struct netns_frags *nf,
2421 - struct inet_frag_queue *qp_in,
2422 - struct inet_frags *f,
2423 - void *arg)
2424 -{
2425 - struct inet_frag_bucket *hb = get_frag_bucket_locked(qp_in, f);
2426 - struct inet_frag_queue *qp;
2427 -
2428 -#ifdef CONFIG_SMP
2429 - /* With SMP race we have to recheck hash table, because
2430 - * such entry could have been created on other cpu before
2431 - * we acquired hash bucket lock.
2432 - */
2433 - hlist_for_each_entry(qp, &hb->chain, list) {
2434 - if (qp->net == nf && f->match(qp, arg)) {
2435 - atomic_inc(&qp->refcnt);
2436 - spin_unlock(&hb->chain_lock);
2437 - qp_in->flags |= INET_FRAG_COMPLETE;
2438 - inet_frag_put(qp_in, f);
2439 - return qp;
2440 - }
2441 - }
2442 -#endif
2443 - qp = qp_in;
2444 - if (!mod_timer(&qp->timer, jiffies + nf->timeout))
2445 - atomic_inc(&qp->refcnt);
2446 -
2447 - atomic_inc(&qp->refcnt);
2448 - hlist_add_head(&qp->list, &hb->chain);
2449 -
2450 - spin_unlock(&hb->chain_lock);
2451 -
2452 - return qp;
2453 -}
2454 -
2455 static struct inet_frag_queue *inet_frag_alloc(struct netns_frags *nf,
2456 struct inet_frags *f,
2457 void *arg)
2458 {
2459 struct inet_frag_queue *q;
2460
2461 + if (!nf->high_thresh || frag_mem_limit(nf) > nf->high_thresh)
2462 + return NULL;
2463 +
2464 q = kmem_cache_zalloc(f->frags_cachep, GFP_ATOMIC);
2465 if (!q)
2466 return NULL;
2467 @@ -366,75 +174,50 @@ static struct inet_frag_queue *inet_frag_alloc(struct netns_frags *nf,
2468
2469 setup_timer(&q->timer, f->frag_expire, (unsigned long)q);
2470 spin_lock_init(&q->lock);
2471 - atomic_set(&q->refcnt, 1);
2472 + atomic_set(&q->refcnt, 3);
2473
2474 return q;
2475 }
2476
2477 static struct inet_frag_queue *inet_frag_create(struct netns_frags *nf,
2478 - struct inet_frags *f,
2479 void *arg)
2480 {
2481 + struct inet_frags *f = nf->f;
2482 struct inet_frag_queue *q;
2483 + int err;
2484
2485 q = inet_frag_alloc(nf, f, arg);
2486 if (!q)
2487 return NULL;
2488
2489 - return inet_frag_intern(nf, q, f, arg);
2490 -}
2491 + mod_timer(&q->timer, jiffies + nf->timeout);
2492
2493 -struct inet_frag_queue *inet_frag_find(struct netns_frags *nf,
2494 - struct inet_frags *f, void *key,
2495 - unsigned int hash)
2496 -{
2497 - struct inet_frag_bucket *hb;
2498 - struct inet_frag_queue *q;
2499 - int depth = 0;
2500 -
2501 - if (!nf->high_thresh || frag_mem_limit(nf) > nf->high_thresh) {
2502 - inet_frag_schedule_worker(f);
2503 + err = rhashtable_insert_fast(&nf->rhashtable, &q->node,
2504 + f->rhash_params);
2505 + if (err < 0) {
2506 + q->flags |= INET_FRAG_COMPLETE;
2507 + inet_frag_kill(q);
2508 + inet_frag_destroy(q);
2509 return NULL;
2510 }
2511 -
2512 - if (frag_mem_limit(nf) > nf->low_thresh)
2513 - inet_frag_schedule_worker(f);
2514 -
2515 - hash &= (INETFRAGS_HASHSZ - 1);
2516 - hb = &f->hash[hash];
2517 -
2518 - spin_lock(&hb->chain_lock);
2519 - hlist_for_each_entry(q, &hb->chain, list) {
2520 - if (q->net == nf && f->match(q, key)) {
2521 - atomic_inc(&q->refcnt);
2522 - spin_unlock(&hb->chain_lock);
2523 - return q;
2524 - }
2525 - depth++;
2526 - }
2527 - spin_unlock(&hb->chain_lock);
2528 -
2529 - if (depth <= INETFRAGS_MAXDEPTH)
2530 - return inet_frag_create(nf, f, key);
2531 -
2532 - if (inet_frag_may_rebuild(f)) {
2533 - if (!f->rebuild)
2534 - f->rebuild = true;
2535 - inet_frag_schedule_worker(f);
2536 - }
2537 -
2538 - return ERR_PTR(-ENOBUFS);
2539 + return q;
2540 }
2541 -EXPORT_SYMBOL(inet_frag_find);
2542 +EXPORT_SYMBOL(inet_frag_create);
2543
2544 -void inet_frag_maybe_warn_overflow(struct inet_frag_queue *q,
2545 - const char *prefix)
2546 +/* TODO : call from rcu_read_lock() and no longer use refcount_inc_not_zero() */
2547 +struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, void *key)
2548 {
2549 - static const char msg[] = "inet_frag_find: Fragment hash bucket"
2550 - " list length grew over limit " __stringify(INETFRAGS_MAXDEPTH)
2551 - ". Dropping fragment.\n";
2552 + struct inet_frag_queue *fq;
2553
2554 - if (PTR_ERR(q) == -ENOBUFS)
2555 - net_dbg_ratelimited("%s%s", prefix, msg);
2556 + rcu_read_lock();
2557 + fq = rhashtable_lookup(&nf->rhashtable, key, nf->f->rhash_params);
2558 + if (fq) {
2559 + if (!atomic_inc_not_zero(&fq->refcnt))
2560 + fq = NULL;
2561 + rcu_read_unlock();
2562 + return fq;
2563 + }
2564 + rcu_read_unlock();
2565 + return inet_frag_create(nf, key);
2566 }
2567 -EXPORT_SYMBOL(inet_frag_maybe_warn_overflow);
2568 +EXPORT_SYMBOL(inet_frag_find);
2569 diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
2570 index 752711cd4834..cc8c6ac84d08 100644
2571 --- a/net/ipv4/ip_fragment.c
2572 +++ b/net/ipv4/ip_fragment.c
2573 @@ -56,27 +56,64 @@
2574 */
2575 static const char ip_frag_cache_name[] = "ip4-frags";
2576
2577 -struct ipfrag_skb_cb
2578 -{
2579 +/* Use skb->cb to track consecutive/adjacent fragments coming at
2580 + * the end of the queue. Nodes in the rb-tree queue will
2581 + * contain "runs" of one or more adjacent fragments.
2582 + *
2583 + * Invariants:
2584 + * - next_frag is NULL at the tail of a "run";
2585 + * - the head of a "run" has the sum of all fragment lengths in frag_run_len.
2586 + */
2587 +struct ipfrag_skb_cb {
2588 struct inet_skb_parm h;
2589 - int offset;
2590 + struct sk_buff *next_frag;
2591 + int frag_run_len;
2592 };
2593
2594 -#define FRAG_CB(skb) ((struct ipfrag_skb_cb *)((skb)->cb))
2595 +#define FRAG_CB(skb) ((struct ipfrag_skb_cb *)((skb)->cb))
2596 +
2597 +static void ip4_frag_init_run(struct sk_buff *skb)
2598 +{
2599 + BUILD_BUG_ON(sizeof(struct ipfrag_skb_cb) > sizeof(skb->cb));
2600 +
2601 + FRAG_CB(skb)->next_frag = NULL;
2602 + FRAG_CB(skb)->frag_run_len = skb->len;
2603 +}
2604 +
2605 +/* Append skb to the last "run". */
2606 +static void ip4_frag_append_to_last_run(struct inet_frag_queue *q,
2607 + struct sk_buff *skb)
2608 +{
2609 + RB_CLEAR_NODE(&skb->rbnode);
2610 + FRAG_CB(skb)->next_frag = NULL;
2611 +
2612 + FRAG_CB(q->last_run_head)->frag_run_len += skb->len;
2613 + FRAG_CB(q->fragments_tail)->next_frag = skb;
2614 + q->fragments_tail = skb;
2615 +}
2616 +
2617 +/* Create a new "run" with the skb. */
2618 +static void ip4_frag_create_run(struct inet_frag_queue *q, struct sk_buff *skb)
2619 +{
2620 + if (q->last_run_head)
2621 + rb_link_node(&skb->rbnode, &q->last_run_head->rbnode,
2622 + &q->last_run_head->rbnode.rb_right);
2623 + else
2624 + rb_link_node(&skb->rbnode, NULL, &q->rb_fragments.rb_node);
2625 + rb_insert_color(&skb->rbnode, &q->rb_fragments);
2626 +
2627 + ip4_frag_init_run(skb);
2628 + q->fragments_tail = skb;
2629 + q->last_run_head = skb;
2630 +}
2631
2632 /* Describe an entry in the "incomplete datagrams" queue. */
2633 struct ipq {
2634 struct inet_frag_queue q;
2635
2636 - u32 user;
2637 - __be32 saddr;
2638 - __be32 daddr;
2639 - __be16 id;
2640 - u8 protocol;
2641 u8 ecn; /* RFC3168 support */
2642 u16 max_df_size; /* largest frag with DF set seen */
2643 int iif;
2644 - int vif; /* L3 master device index */
2645 unsigned int rid;
2646 struct inet_peer *peer;
2647 };
2648 @@ -88,49 +125,9 @@ static u8 ip4_frag_ecn(u8 tos)
2649
2650 static struct inet_frags ip4_frags;
2651
2652 -int ip_frag_mem(struct net *net)
2653 -{
2654 - return sum_frag_mem_limit(&net->ipv4.frags);
2655 -}
2656 -
2657 -static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,
2658 - struct net_device *dev);
2659 -
2660 -struct ip4_create_arg {
2661 - struct iphdr *iph;
2662 - u32 user;
2663 - int vif;
2664 -};
2665 +static int ip_frag_reasm(struct ipq *qp, struct sk_buff *skb,
2666 + struct sk_buff *prev_tail, struct net_device *dev);
2667
2668 -static unsigned int ipqhashfn(__be16 id, __be32 saddr, __be32 daddr, u8 prot)
2669 -{
2670 - net_get_random_once(&ip4_frags.rnd, sizeof(ip4_frags.rnd));
2671 - return jhash_3words((__force u32)id << 16 | prot,
2672 - (__force u32)saddr, (__force u32)daddr,
2673 - ip4_frags.rnd);
2674 -}
2675 -
2676 -static unsigned int ip4_hashfn(const struct inet_frag_queue *q)
2677 -{
2678 - const struct ipq *ipq;
2679 -
2680 - ipq = container_of(q, struct ipq, q);
2681 - return ipqhashfn(ipq->id, ipq->saddr, ipq->daddr, ipq->protocol);
2682 -}
2683 -
2684 -static bool ip4_frag_match(const struct inet_frag_queue *q, const void *a)
2685 -{
2686 - const struct ipq *qp;
2687 - const struct ip4_create_arg *arg = a;
2688 -
2689 - qp = container_of(q, struct ipq, q);
2690 - return qp->id == arg->iph->id &&
2691 - qp->saddr == arg->iph->saddr &&
2692 - qp->daddr == arg->iph->daddr &&
2693 - qp->protocol == arg->iph->protocol &&
2694 - qp->user == arg->user &&
2695 - qp->vif == arg->vif;
2696 -}
2697
2698 static void ip4_frag_init(struct inet_frag_queue *q, const void *a)
2699 {
2700 @@ -139,17 +136,12 @@ static void ip4_frag_init(struct inet_frag_queue *q, const void *a)
2701 frags);
2702 struct net *net = container_of(ipv4, struct net, ipv4);
2703
2704 - const struct ip4_create_arg *arg = a;
2705 + const struct frag_v4_compare_key *key = a;
2706
2707 - qp->protocol = arg->iph->protocol;
2708 - qp->id = arg->iph->id;
2709 - qp->ecn = ip4_frag_ecn(arg->iph->tos);
2710 - qp->saddr = arg->iph->saddr;
2711 - qp->daddr = arg->iph->daddr;
2712 - qp->vif = arg->vif;
2713 - qp->user = arg->user;
2714 + q->key.v4 = *key;
2715 + qp->ecn = 0;
2716 qp->peer = q->net->max_dist ?
2717 - inet_getpeer_v4(net->ipv4.peers, arg->iph->saddr, arg->vif, 1) :
2718 + inet_getpeer_v4(net->ipv4.peers, key->saddr, key->vif, 1) :
2719 NULL;
2720 }
2721
2722 @@ -167,7 +159,7 @@ static void ip4_frag_free(struct inet_frag_queue *q)
2723
2724 static void ipq_put(struct ipq *ipq)
2725 {
2726 - inet_frag_put(&ipq->q, &ip4_frags);
2727 + inet_frag_put(&ipq->q);
2728 }
2729
2730 /* Kill ipq entry. It is not destroyed immediately,
2731 @@ -175,7 +167,7 @@ static void ipq_put(struct ipq *ipq)
2732 */
2733 static void ipq_kill(struct ipq *ipq)
2734 {
2735 - inet_frag_kill(&ipq->q, &ip4_frags);
2736 + inet_frag_kill(&ipq->q);
2737 }
2738
2739 static bool frag_expire_skip_icmp(u32 user)
2740 @@ -192,8 +184,11 @@ static bool frag_expire_skip_icmp(u32 user)
2741 */
2742 static void ip_expire(unsigned long arg)
2743 {
2744 - struct ipq *qp;
2745 + const struct iphdr *iph;
2746 + struct sk_buff *head = NULL;
2747 struct net *net;
2748 + struct ipq *qp;
2749 + int err;
2750
2751 qp = container_of((struct inet_frag_queue *) arg, struct ipq, q);
2752 net = container_of(qp->q.net, struct net, ipv4.frags);
2753 @@ -206,51 +201,65 @@ static void ip_expire(unsigned long arg)
2754
2755 ipq_kill(qp);
2756 __IP_INC_STATS(net, IPSTATS_MIB_REASMFAILS);
2757 + __IP_INC_STATS(net, IPSTATS_MIB_REASMTIMEOUT);
2758
2759 - if (!inet_frag_evicting(&qp->q)) {
2760 - struct sk_buff *clone, *head = qp->q.fragments;
2761 - const struct iphdr *iph;
2762 - int err;
2763 -
2764 - __IP_INC_STATS(net, IPSTATS_MIB_REASMTIMEOUT);
2765 + if (!(qp->q.flags & INET_FRAG_FIRST_IN))
2766 + goto out;
2767
2768 - if (!(qp->q.flags & INET_FRAG_FIRST_IN) || !qp->q.fragments)
2769 + /* sk_buff::dev and sk_buff::rbnode are unionized. So we
2770 + * pull the head out of the tree in order to be able to
2771 + * deal with head->dev.
2772 + */
2773 + if (qp->q.fragments) {
2774 + head = qp->q.fragments;
2775 + qp->q.fragments = head->next;
2776 + } else {
2777 + head = skb_rb_first(&qp->q.rb_fragments);
2778 + if (!head)
2779 goto out;
2780 + if (FRAG_CB(head)->next_frag)
2781 + rb_replace_node(&head->rbnode,
2782 + &FRAG_CB(head)->next_frag->rbnode,
2783 + &qp->q.rb_fragments);
2784 + else
2785 + rb_erase(&head->rbnode, &qp->q.rb_fragments);
2786 + memset(&head->rbnode, 0, sizeof(head->rbnode));
2787 + barrier();
2788 + }
2789 + if (head == qp->q.fragments_tail)
2790 + qp->q.fragments_tail = NULL;
2791
2792 - head->dev = dev_get_by_index_rcu(net, qp->iif);
2793 - if (!head->dev)
2794 - goto out;
2795 + sub_frag_mem_limit(qp->q.net, head->truesize);
2796 +
2797 + head->dev = dev_get_by_index_rcu(net, qp->iif);
2798 + if (!head->dev)
2799 + goto out;
2800
2801
2802 - /* skb has no dst, perform route lookup again */
2803 - iph = ip_hdr(head);
2804 - err = ip_route_input_noref(head, iph->daddr, iph->saddr,
2805 + /* skb has no dst, perform route lookup again */
2806 + iph = ip_hdr(head);
2807 + err = ip_route_input_noref(head, iph->daddr, iph->saddr,
2808 iph->tos, head->dev);
2809 - if (err)
2810 - goto out;
2811 + if (err)
2812 + goto out;
2813
2814 - /* Only an end host needs to send an ICMP
2815 - * "Fragment Reassembly Timeout" message, per RFC792.
2816 - */
2817 - if (frag_expire_skip_icmp(qp->user) &&
2818 - (skb_rtable(head)->rt_type != RTN_LOCAL))
2819 - goto out;
2820 + /* Only an end host needs to send an ICMP
2821 + * "Fragment Reassembly Timeout" message, per RFC792.
2822 + */
2823 + if (frag_expire_skip_icmp(qp->q.key.v4.user) &&
2824 + (skb_rtable(head)->rt_type != RTN_LOCAL))
2825 + goto out;
2826
2827 - clone = skb_clone(head, GFP_ATOMIC);
2828 + spin_unlock(&qp->q.lock);
2829 + icmp_send(head, ICMP_TIME_EXCEEDED, ICMP_EXC_FRAGTIME, 0);
2830 + goto out_rcu_unlock;
2831
2832 - /* Send an ICMP "Fragment Reassembly Timeout" message. */
2833 - if (clone) {
2834 - spin_unlock(&qp->q.lock);
2835 - icmp_send(clone, ICMP_TIME_EXCEEDED,
2836 - ICMP_EXC_FRAGTIME, 0);
2837 - consume_skb(clone);
2838 - goto out_rcu_unlock;
2839 - }
2840 - }
2841 out:
2842 spin_unlock(&qp->q.lock);
2843 out_rcu_unlock:
2844 rcu_read_unlock();
2845 + if (head)
2846 + kfree_skb(head);
2847 ipq_put(qp);
2848 }
2849
2850 @@ -260,21 +269,20 @@ out_rcu_unlock:
2851 static struct ipq *ip_find(struct net *net, struct iphdr *iph,
2852 u32 user, int vif)
2853 {
2854 + struct frag_v4_compare_key key = {
2855 + .saddr = iph->saddr,
2856 + .daddr = iph->daddr,
2857 + .user = user,
2858 + .vif = vif,
2859 + .id = iph->id,
2860 + .protocol = iph->protocol,
2861 + };
2862 struct inet_frag_queue *q;
2863 - struct ip4_create_arg arg;
2864 - unsigned int hash;
2865 -
2866 - arg.iph = iph;
2867 - arg.user = user;
2868 - arg.vif = vif;
2869
2870 - hash = ipqhashfn(iph->id, iph->saddr, iph->daddr, iph->protocol);
2871 -
2872 - q = inet_frag_find(&net->ipv4.frags, &ip4_frags, &arg, hash);
2873 - if (IS_ERR_OR_NULL(q)) {
2874 - inet_frag_maybe_warn_overflow(q, pr_fmt());
2875 + q = inet_frag_find(&net->ipv4.frags, &key);
2876 + if (!q)
2877 return NULL;
2878 - }
2879 +
2880 return container_of(q, struct ipq, q);
2881 }
2882
2883 @@ -294,7 +302,7 @@ static int ip_frag_too_far(struct ipq *qp)
2884 end = atomic_inc_return(&peer->rid);
2885 qp->rid = end;
2886
2887 - rc = qp->q.fragments && (end - start) > max;
2888 + rc = qp->q.fragments_tail && (end - start) > max;
2889
2890 if (rc) {
2891 struct net *net;
2892 @@ -308,7 +316,6 @@ static int ip_frag_too_far(struct ipq *qp)
2893
2894 static int ip_frag_reinit(struct ipq *qp)
2895 {
2896 - struct sk_buff *fp;
2897 unsigned int sum_truesize = 0;
2898
2899 if (!mod_timer(&qp->q.timer, jiffies + qp->q.net->timeout)) {
2900 @@ -316,21 +323,16 @@ static int ip_frag_reinit(struct ipq *qp)
2901 return -ETIMEDOUT;
2902 }
2903
2904 - fp = qp->q.fragments;
2905 - do {
2906 - struct sk_buff *xp = fp->next;
2907 -
2908 - sum_truesize += fp->truesize;
2909 - kfree_skb(fp);
2910 - fp = xp;
2911 - } while (fp);
2912 + sum_truesize = inet_frag_rbtree_purge(&qp->q.rb_fragments);
2913 sub_frag_mem_limit(qp->q.net, sum_truesize);
2914
2915 qp->q.flags = 0;
2916 qp->q.len = 0;
2917 qp->q.meat = 0;
2918 qp->q.fragments = NULL;
2919 + qp->q.rb_fragments = RB_ROOT;
2920 qp->q.fragments_tail = NULL;
2921 + qp->q.last_run_head = NULL;
2922 qp->iif = 0;
2923 qp->ecn = 0;
2924
2925 @@ -340,7 +342,9 @@ static int ip_frag_reinit(struct ipq *qp)
2926 /* Add new segment to existing queue. */
2927 static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
2928 {
2929 - struct sk_buff *prev, *next;
2930 + struct net *net = container_of(qp->q.net, struct net, ipv4.frags);
2931 + struct rb_node **rbn, *parent;
2932 + struct sk_buff *skb1, *prev_tail;
2933 struct net_device *dev;
2934 unsigned int fragsize;
2935 int flags, offset;
2936 @@ -403,99 +407,61 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
2937 if (err)
2938 goto err;
2939
2940 - /* Find out which fragments are in front and at the back of us
2941 - * in the chain of fragments so far. We must know where to put
2942 - * this fragment, right?
2943 - */
2944 - prev = qp->q.fragments_tail;
2945 - if (!prev || FRAG_CB(prev)->offset < offset) {
2946 - next = NULL;
2947 - goto found;
2948 - }
2949 - prev = NULL;
2950 - for (next = qp->q.fragments; next != NULL; next = next->next) {
2951 - if (FRAG_CB(next)->offset >= offset)
2952 - break; /* bingo! */
2953 - prev = next;
2954 - }
2955 -
2956 -found:
2957 - /* We found where to put this one. Check for overlap with
2958 - * preceding fragment, and, if needed, align things so that
2959 - * any overlaps are eliminated.
2960 + /* Note : skb->rbnode and skb->dev share the same location. */
2961 + dev = skb->dev;
2962 + /* Makes sure compiler wont do silly aliasing games */
2963 + barrier();
2964 +
2965 + /* RFC5722, Section 4, amended by Errata ID : 3089
2966 + * When reassembling an IPv6 datagram, if
2967 + * one or more its constituent fragments is determined to be an
2968 + * overlapping fragment, the entire datagram (and any constituent
2969 + * fragments) MUST be silently discarded.
2970 + *
2971 + * We do the same here for IPv4 (and increment an snmp counter).
2972 */
2973 - if (prev) {
2974 - int i = (FRAG_CB(prev)->offset + prev->len) - offset;
2975
2976 - if (i > 0) {
2977 - offset += i;
2978 - err = -EINVAL;
2979 - if (end <= offset)
2980 - goto err;
2981 - err = -ENOMEM;
2982 - if (!pskb_pull(skb, i))
2983 - goto err;
2984 - if (skb->ip_summed != CHECKSUM_UNNECESSARY)
2985 - skb->ip_summed = CHECKSUM_NONE;
2986 - }
2987 - }
2988 -
2989 - err = -ENOMEM;
2990 -
2991 - while (next && FRAG_CB(next)->offset < end) {
2992 - int i = end - FRAG_CB(next)->offset; /* overlap is 'i' bytes */
2993 -
2994 - if (i < next->len) {
2995 - int delta = -next->truesize;
2996 -
2997 - /* Eat head of the next overlapped fragment
2998 - * and leave the loop. The next ones cannot overlap.
2999 - */
3000 - if (!pskb_pull(next, i))
3001 - goto err;
3002 - delta += next->truesize;
3003 - if (delta)
3004 - add_frag_mem_limit(qp->q.net, delta);
3005 - FRAG_CB(next)->offset += i;
3006 - qp->q.meat -= i;
3007 - if (next->ip_summed != CHECKSUM_UNNECESSARY)
3008 - next->ip_summed = CHECKSUM_NONE;
3009 - break;
3010 - } else {
3011 - struct sk_buff *free_it = next;
3012 -
3013 - /* Old fragment is completely overridden with
3014 - * new one drop it.
3015 - */
3016 - next = next->next;
3017 -
3018 - if (prev)
3019 - prev->next = next;
3020 - else
3021 - qp->q.fragments = next;
3022 -
3023 - qp->q.meat -= free_it->len;
3024 - sub_frag_mem_limit(qp->q.net, free_it->truesize);
3025 - kfree_skb(free_it);
3026 - }
3027 + /* Find out where to put this fragment. */
3028 + prev_tail = qp->q.fragments_tail;
3029 + if (!prev_tail)
3030 + ip4_frag_create_run(&qp->q, skb); /* First fragment. */
3031 + else if (prev_tail->ip_defrag_offset + prev_tail->len < end) {
3032 + /* This is the common case: skb goes to the end. */
3033 + /* Detect and discard overlaps. */
3034 + if (offset < prev_tail->ip_defrag_offset + prev_tail->len)
3035 + goto discard_qp;
3036 + if (offset == prev_tail->ip_defrag_offset + prev_tail->len)
3037 + ip4_frag_append_to_last_run(&qp->q, skb);
3038 + else
3039 + ip4_frag_create_run(&qp->q, skb);
3040 + } else {
3041 + /* Binary search. Note that skb can become the first fragment,
3042 + * but not the last (covered above).
3043 + */
3044 + rbn = &qp->q.rb_fragments.rb_node;
3045 + do {
3046 + parent = *rbn;
3047 + skb1 = rb_to_skb(parent);
3048 + if (end <= skb1->ip_defrag_offset)
3049 + rbn = &parent->rb_left;
3050 + else if (offset >= skb1->ip_defrag_offset +
3051 + FRAG_CB(skb1)->frag_run_len)
3052 + rbn = &parent->rb_right;
3053 + else /* Found an overlap with skb1. */
3054 + goto discard_qp;
3055 + } while (*rbn);
3056 + /* Here we have parent properly set, and rbn pointing to
3057 + * one of its NULL left/right children. Insert skb.
3058 + */
3059 + ip4_frag_init_run(skb);
3060 + rb_link_node(&skb->rbnode, parent, rbn);
3061 + rb_insert_color(&skb->rbnode, &qp->q.rb_fragments);
3062 }
3063
3064 - FRAG_CB(skb)->offset = offset;
3065 -
3066 - /* Insert this fragment in the chain of fragments. */
3067 - skb->next = next;
3068 - if (!next)
3069 - qp->q.fragments_tail = skb;
3070 - if (prev)
3071 - prev->next = skb;
3072 - else
3073 - qp->q.fragments = skb;
3074 -
3075 - dev = skb->dev;
3076 - if (dev) {
3077 + if (dev)
3078 qp->iif = dev->ifindex;
3079 - skb->dev = NULL;
3080 - }
3081 + skb->ip_defrag_offset = offset;
3082 +
3083 qp->q.stamp = skb->tstamp;
3084 qp->q.meat += skb->len;
3085 qp->ecn |= ecn;
3086 @@ -517,7 +483,7 @@ found:
3087 unsigned long orefdst = skb->_skb_refdst;
3088
3089 skb->_skb_refdst = 0UL;
3090 - err = ip_frag_reasm(qp, prev, dev);
3091 + err = ip_frag_reasm(qp, skb, prev_tail, dev);
3092 skb->_skb_refdst = orefdst;
3093 return err;
3094 }
3095 @@ -525,20 +491,24 @@ found:
3096 skb_dst_drop(skb);
3097 return -EINPROGRESS;
3098
3099 +discard_qp:
3100 + inet_frag_kill(&qp->q);
3101 + err = -EINVAL;
3102 + __IP_INC_STATS(net, IPSTATS_MIB_REASM_OVERLAPS);
3103 err:
3104 kfree_skb(skb);
3105 return err;
3106 }
3107
3108 -
3109 /* Build a new IP datagram from all its fragments. */
3110 -
3111 -static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,
3112 - struct net_device *dev)
3113 +static int ip_frag_reasm(struct ipq *qp, struct sk_buff *skb,
3114 + struct sk_buff *prev_tail, struct net_device *dev)
3115 {
3116 struct net *net = container_of(qp->q.net, struct net, ipv4.frags);
3117 struct iphdr *iph;
3118 - struct sk_buff *fp, *head = qp->q.fragments;
3119 + struct sk_buff *fp, *head = skb_rb_first(&qp->q.rb_fragments);
3120 + struct sk_buff **nextp; /* To build frag_list. */
3121 + struct rb_node *rbn;
3122 int len;
3123 int ihlen;
3124 int err;
3125 @@ -552,26 +522,27 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,
3126 goto out_fail;
3127 }
3128 /* Make the one we just received the head. */
3129 - if (prev) {
3130 - head = prev->next;
3131 - fp = skb_clone(head, GFP_ATOMIC);
3132 + if (head != skb) {
3133 + fp = skb_clone(skb, GFP_ATOMIC);
3134 if (!fp)
3135 goto out_nomem;
3136 -
3137 - fp->next = head->next;
3138 - if (!fp->next)
3139 + FRAG_CB(fp)->next_frag = FRAG_CB(skb)->next_frag;
3140 + if (RB_EMPTY_NODE(&skb->rbnode))
3141 + FRAG_CB(prev_tail)->next_frag = fp;
3142 + else
3143 + rb_replace_node(&skb->rbnode, &fp->rbnode,
3144 + &qp->q.rb_fragments);
3145 + if (qp->q.fragments_tail == skb)
3146 qp->q.fragments_tail = fp;
3147 - prev->next = fp;
3148 -
3149 - skb_morph(head, qp->q.fragments);
3150 - head->next = qp->q.fragments->next;
3151 -
3152 - consume_skb(qp->q.fragments);
3153 - qp->q.fragments = head;
3154 + skb_morph(skb, head);
3155 + FRAG_CB(skb)->next_frag = FRAG_CB(head)->next_frag;
3156 + rb_replace_node(&head->rbnode, &skb->rbnode,
3157 + &qp->q.rb_fragments);
3158 + consume_skb(head);
3159 + head = skb;
3160 }
3161
3162 - WARN_ON(!head);
3163 - WARN_ON(FRAG_CB(head)->offset != 0);
3164 + WARN_ON(head->ip_defrag_offset != 0);
3165
3166 /* Allocate a new buffer for the datagram. */
3167 ihlen = ip_hdrlen(head);
3168 @@ -595,35 +566,61 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,
3169 clone = alloc_skb(0, GFP_ATOMIC);
3170 if (!clone)
3171 goto out_nomem;
3172 - clone->next = head->next;
3173 - head->next = clone;
3174 skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list;
3175 skb_frag_list_init(head);
3176 for (i = 0; i < skb_shinfo(head)->nr_frags; i++)
3177 plen += skb_frag_size(&skb_shinfo(head)->frags[i]);
3178 clone->len = clone->data_len = head->data_len - plen;
3179 - head->data_len -= clone->len;
3180 - head->len -= clone->len;
3181 + head->truesize += clone->truesize;
3182 clone->csum = 0;
3183 clone->ip_summed = head->ip_summed;
3184 add_frag_mem_limit(qp->q.net, clone->truesize);
3185 + skb_shinfo(head)->frag_list = clone;
3186 + nextp = &clone->next;
3187 + } else {
3188 + nextp = &skb_shinfo(head)->frag_list;
3189 }
3190
3191 - skb_shinfo(head)->frag_list = head->next;
3192 skb_push(head, head->data - skb_network_header(head));
3193
3194 - for (fp=head->next; fp; fp = fp->next) {
3195 - head->data_len += fp->len;
3196 - head->len += fp->len;
3197 - if (head->ip_summed != fp->ip_summed)
3198 - head->ip_summed = CHECKSUM_NONE;
3199 - else if (head->ip_summed == CHECKSUM_COMPLETE)
3200 - head->csum = csum_add(head->csum, fp->csum);
3201 - head->truesize += fp->truesize;
3202 + /* Traverse the tree in order, to build frag_list. */
3203 + fp = FRAG_CB(head)->next_frag;
3204 + rbn = rb_next(&head->rbnode);
3205 + rb_erase(&head->rbnode, &qp->q.rb_fragments);
3206 + while (rbn || fp) {
3207 + /* fp points to the next sk_buff in the current run;
3208 + * rbn points to the next run.
3209 + */
3210 + /* Go through the current run. */
3211 + while (fp) {
3212 + *nextp = fp;
3213 + nextp = &fp->next;
3214 + fp->prev = NULL;
3215 + memset(&fp->rbnode, 0, sizeof(fp->rbnode));
3216 + fp->sk = NULL;
3217 + head->data_len += fp->len;
3218 + head->len += fp->len;
3219 + if (head->ip_summed != fp->ip_summed)
3220 + head->ip_summed = CHECKSUM_NONE;
3221 + else if (head->ip_summed == CHECKSUM_COMPLETE)
3222 + head->csum = csum_add(head->csum, fp->csum);
3223 + head->truesize += fp->truesize;
3224 + fp = FRAG_CB(fp)->next_frag;
3225 + }
3226 + /* Move to the next run. */
3227 + if (rbn) {
3228 + struct rb_node *rbnext = rb_next(rbn);
3229 +
3230 + fp = rb_to_skb(rbn);
3231 + rb_erase(rbn, &qp->q.rb_fragments);
3232 + rbn = rbnext;
3233 + }
3234 }
3235 sub_frag_mem_limit(qp->q.net, head->truesize);
3236
3237 + *nextp = NULL;
3238 head->next = NULL;
3239 + head->prev = NULL;
3240 head->dev = dev;
3241 head->tstamp = qp->q.stamp;
3242 IPCB(head)->frag_max_size = max(qp->max_df_size, qp->q.max_size);
3243 @@ -651,7 +648,9 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,
3244
3245 __IP_INC_STATS(net, IPSTATS_MIB_REASMOKS);
3246 qp->q.fragments = NULL;
3247 + qp->q.rb_fragments = RB_ROOT;
3248 qp->q.fragments_tail = NULL;
3249 + qp->q.last_run_head = NULL;
3250 return 0;
3251
3252 out_nomem:
3253 @@ -659,7 +658,7 @@ out_nomem:
3254 err = -ENOMEM;
3255 goto out_fail;
3256 out_oversize:
3257 - net_info_ratelimited("Oversized IP packet from %pI4\n", &qp->saddr);
3258 + net_info_ratelimited("Oversized IP packet from %pI4\n", &qp->q.key.v4.saddr);
3259 out_fail:
3260 __IP_INC_STATS(net, IPSTATS_MIB_REASMFAILS);
3261 return err;
3262 @@ -733,25 +732,46 @@ struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user)
3263 }
3264 EXPORT_SYMBOL(ip_check_defrag);
3265
3266 +unsigned int inet_frag_rbtree_purge(struct rb_root *root)
3267 +{
3268 + struct rb_node *p = rb_first(root);
3269 + unsigned int sum = 0;
3270 +
3271 + while (p) {
3272 + struct sk_buff *skb = rb_entry(p, struct sk_buff, rbnode);
3273 +
3274 + p = rb_next(p);
3275 + rb_erase(&skb->rbnode, root);
3276 + while (skb) {
3277 + struct sk_buff *next = FRAG_CB(skb)->next_frag;
3278 +
3279 + sum += skb->truesize;
3280 + kfree_skb(skb);
3281 + skb = next;
3282 + }
3283 + }
3284 + return sum;
3285 +}
3286 +EXPORT_SYMBOL(inet_frag_rbtree_purge);
3287 +
3288 #ifdef CONFIG_SYSCTL
3289 -static int zero;
3290 +static int dist_min;
3291
3292 static struct ctl_table ip4_frags_ns_ctl_table[] = {
3293 {
3294 .procname = "ipfrag_high_thresh",
3295 .data = &init_net.ipv4.frags.high_thresh,
3296 - .maxlen = sizeof(int),
3297 + .maxlen = sizeof(unsigned long),
3298 .mode = 0644,
3299 - .proc_handler = proc_dointvec_minmax,
3300 + .proc_handler = proc_doulongvec_minmax,
3301 .extra1 = &init_net.ipv4.frags.low_thresh
3302 },
3303 {
3304 .procname = "ipfrag_low_thresh",
3305 .data = &init_net.ipv4.frags.low_thresh,
3306 - .maxlen = sizeof(int),
3307 + .maxlen = sizeof(unsigned long),
3308 .mode = 0644,
3309 - .proc_handler = proc_dointvec_minmax,
3310 - .extra1 = &zero,
3311 + .proc_handler = proc_doulongvec_minmax,
3312 .extra2 = &init_net.ipv4.frags.high_thresh
3313 },
3314 {
3315 @@ -767,7 +787,7 @@ static struct ctl_table ip4_frags_ns_ctl_table[] = {
3316 .maxlen = sizeof(int),
3317 .mode = 0644,
3318 .proc_handler = proc_dointvec_minmax,
3319 - .extra1 = &zero
3320 + .extra1 = &dist_min,
3321 },
3322 { }
3323 };
3324 @@ -849,6 +869,8 @@ static void __init ip4_frags_ctl_register(void)
3325
3326 static int __net_init ipv4_frags_init_net(struct net *net)
3327 {
3328 + int res;
3329 +
3330 /* Fragment cache limits.
3331 *
3332 * The fragment memory accounting code, (tries to) account for
3333 @@ -873,16 +895,21 @@ static int __net_init ipv4_frags_init_net(struct net *net)
3334 net->ipv4.frags.timeout = IP_FRAG_TIME;
3335
3336 net->ipv4.frags.max_dist = 64;
3337 -
3338 - inet_frags_init_net(&net->ipv4.frags);
3339 -
3340 - return ip4_frags_ns_ctl_register(net);
3341 + net->ipv4.frags.f = &ip4_frags;
3342 +
3343 + res = inet_frags_init_net(&net->ipv4.frags);
3344 + if (res < 0)
3345 + return res;
3346 + res = ip4_frags_ns_ctl_register(net);
3347 + if (res < 0)
3348 + inet_frags_exit_net(&net->ipv4.frags);
3349 + return res;
3350 }
3351
3352 static void __net_exit ipv4_frags_exit_net(struct net *net)
3353 {
3354 ip4_frags_ns_ctl_unregister(net);
3355 - inet_frags_exit_net(&net->ipv4.frags, &ip4_frags);
3356 + inet_frags_exit_net(&net->ipv4.frags);
3357 }
3358
3359 static struct pernet_operations ip4_frags_ops = {
3360 @@ -890,17 +917,49 @@ static struct pernet_operations ip4_frags_ops = {
3361 .exit = ipv4_frags_exit_net,
3362 };
3363
3364 +
3365 +static u32 ip4_key_hashfn(const void *data, u32 len, u32 seed)
3366 +{
3367 + return jhash2(data,
3368 + sizeof(struct frag_v4_compare_key) / sizeof(u32), seed);
3369 +}
3370 +
3371 +static u32 ip4_obj_hashfn(const void *data, u32 len, u32 seed)
3372 +{
3373 + const struct inet_frag_queue *fq = data;
3374 +
3375 + return jhash2((const u32 *)&fq->key.v4,
3376 + sizeof(struct frag_v4_compare_key) / sizeof(u32), seed);
3377 +}
3378 +
3379 +static int ip4_obj_cmpfn(struct rhashtable_compare_arg *arg, const void *ptr)
3380 +{
3381 + const struct frag_v4_compare_key *key = arg->key;
3382 + const struct inet_frag_queue *fq = ptr;
3383 +
3384 + return !!memcmp(&fq->key, key, sizeof(*key));
3385 +}
3386 +
3387 +static const struct rhashtable_params ip4_rhash_params = {
3388 + .head_offset = offsetof(struct inet_frag_queue, node),
3389 + .key_offset = offsetof(struct inet_frag_queue, key),
3390 + .key_len = sizeof(struct frag_v4_compare_key),
3391 + .hashfn = ip4_key_hashfn,
3392 + .obj_hashfn = ip4_obj_hashfn,
3393 + .obj_cmpfn = ip4_obj_cmpfn,
3394 + .automatic_shrinking = true,
3395 +};
3396 +
3397 void __init ipfrag_init(void)
3398 {
3399 - ip4_frags_ctl_register();
3400 - register_pernet_subsys(&ip4_frags_ops);
3401 - ip4_frags.hashfn = ip4_hashfn;
3402 ip4_frags.constructor = ip4_frag_init;
3403 ip4_frags.destructor = ip4_frag_free;
3404 ip4_frags.qsize = sizeof(struct ipq);
3405 - ip4_frags.match = ip4_frag_match;
3406 ip4_frags.frag_expire = ip_expire;
3407 ip4_frags.frags_cache_name = ip_frag_cache_name;
3408 + ip4_frags.rhash_params = ip4_rhash_params;
3409 if (inet_frags_init(&ip4_frags))
3410 panic("IP: failed to allocate ip4_frags cache\n");
3411 + ip4_frags_ctl_register();
3412 + register_pernet_subsys(&ip4_frags_ops);
3413 }
3414 diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
3415 index b21e435f428c..a5851c0bc278 100644
3416 --- a/net/ipv4/ip_sockglue.c
3417 +++ b/net/ipv4/ip_sockglue.c
3418 @@ -134,7 +134,6 @@ static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb)
3419 static void ip_cmsg_recv_dstaddr(struct msghdr *msg, struct sk_buff *skb)
3420 {
3421 struct sockaddr_in sin;
3422 - const struct iphdr *iph = ip_hdr(skb);
3423 __be16 *ports;
3424 int end;
3425
3426 @@ -149,7 +148,7 @@ static void ip_cmsg_recv_dstaddr(struct msghdr *msg, struct sk_buff *skb)
3427 ports = (__be16 *)skb_transport_header(skb);
3428
3429 sin.sin_family = AF_INET;
3430 - sin.sin_addr.s_addr = iph->daddr;
3431 + sin.sin_addr.s_addr = ip_hdr(skb)->daddr;
3432 sin.sin_port = ports[1];
3433 memset(sin.sin_zero, 0, sizeof(sin.sin_zero));
3434
3435 diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
3436 index e1271e75e107..d8d99c21a9c1 100644
3437 --- a/net/ipv4/ip_tunnel.c
3438 +++ b/net/ipv4/ip_tunnel.c
3439 @@ -627,6 +627,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
3440 const struct iphdr *tnl_params, u8 protocol)
3441 {
3442 struct ip_tunnel *tunnel = netdev_priv(dev);
3443 + unsigned int inner_nhdr_len = 0;
3444 const struct iphdr *inner_iph;
3445 struct flowi4 fl4;
3446 u8 tos, ttl;
3447 @@ -636,6 +637,14 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
3448 __be32 dst;
3449 bool connected;
3450
3451 + /* ensure we can access the inner net header, for several users below */
3452 + if (skb->protocol == htons(ETH_P_IP))
3453 + inner_nhdr_len = sizeof(struct iphdr);
3454 + else if (skb->protocol == htons(ETH_P_IPV6))
3455 + inner_nhdr_len = sizeof(struct ipv6hdr);
3456 + if (unlikely(!pskb_may_pull(skb, inner_nhdr_len)))
3457 + goto tx_error;
3458 +
3459 inner_iph = (const struct iphdr *)skb_inner_network_header(skb);
3460 connected = (tunnel->parms.iph.daddr != 0);
3461
3462 diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c
3463 index 7143ca1a6af9..ec48d8eafc7e 100644
3464 --- a/net/ipv4/proc.c
3465 +++ b/net/ipv4/proc.c
3466 @@ -54,7 +54,6 @@
3467 static int sockstat_seq_show(struct seq_file *seq, void *v)
3468 {
3469 struct net *net = seq->private;
3470 - unsigned int frag_mem;
3471 int orphans, sockets;
3472
3473 local_bh_disable();
3474 @@ -74,8 +73,9 @@ static int sockstat_seq_show(struct seq_file *seq, void *v)
3475 sock_prot_inuse_get(net, &udplite_prot));
3476 seq_printf(seq, "RAW: inuse %d\n",
3477 sock_prot_inuse_get(net, &raw_prot));
3478 - frag_mem = ip_frag_mem(net);
3479 - seq_printf(seq, "FRAG: inuse %u memory %u\n", !!frag_mem, frag_mem);
3480 + seq_printf(seq, "FRAG: inuse %u memory %lu\n",
3481 + atomic_read(&net->ipv4.frags.rhashtable.nelems),
3482 + frag_mem_limit(&net->ipv4.frags));
3483 return 0;
3484 }
3485
3486 @@ -134,6 +134,7 @@ static const struct snmp_mib snmp4_ipextstats_list[] = {
3487 SNMP_MIB_ITEM("InECT1Pkts", IPSTATS_MIB_ECT1PKTS),
3488 SNMP_MIB_ITEM("InECT0Pkts", IPSTATS_MIB_ECT0PKTS),
3489 SNMP_MIB_ITEM("InCEPkts", IPSTATS_MIB_CEPKTS),
3490 + SNMP_MIB_ITEM("ReasmOverlaps", IPSTATS_MIB_REASM_OVERLAPS),
3491 SNMP_MIB_SENTINEL
3492 };
3493
3494 diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
3495 index 9d0b73aa649f..dbb153c6b21a 100644
3496 --- a/net/ipv4/tcp_input.c
3497 +++ b/net/ipv4/tcp_input.c
3498 @@ -4406,7 +4406,7 @@ static void tcp_ofo_queue(struct sock *sk)
3499
3500 p = rb_first(&tp->out_of_order_queue);
3501 while (p) {
3502 - skb = rb_entry(p, struct sk_buff, rbnode);
3503 + skb = rb_to_skb(p);
3504 if (after(TCP_SKB_CB(skb)->seq, tp->rcv_nxt))
3505 break;
3506
3507 @@ -4470,7 +4470,7 @@ static int tcp_try_rmem_schedule(struct sock *sk, struct sk_buff *skb,
3508 static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb)
3509 {
3510 struct tcp_sock *tp = tcp_sk(sk);
3511 - struct rb_node **p, *q, *parent;
3512 + struct rb_node **p, *parent;
3513 struct sk_buff *skb1;
3514 u32 seq, end_seq;
3515 bool fragstolen;
3516 @@ -4529,7 +4529,7 @@ coalesce_done:
3517 parent = NULL;
3518 while (*p) {
3519 parent = *p;
3520 - skb1 = rb_entry(parent, struct sk_buff, rbnode);
3521 + skb1 = rb_to_skb(parent);
3522 if (before(seq, TCP_SKB_CB(skb1)->seq)) {
3523 p = &parent->rb_left;
3524 continue;
3525 @@ -4574,9 +4574,7 @@ insert:
3526
3527 merge_right:
3528 /* Remove other segments covered by skb. */
3529 - while ((q = rb_next(&skb->rbnode)) != NULL) {
3530 - skb1 = rb_entry(q, struct sk_buff, rbnode);
3531 -
3532 + while ((skb1 = skb_rb_next(skb)) != NULL) {
3533 if (!after(end_seq, TCP_SKB_CB(skb1)->seq))
3534 break;
3535 if (before(end_seq, TCP_SKB_CB(skb1)->end_seq)) {
3536 @@ -4591,7 +4589,7 @@ merge_right:
3537 tcp_drop(sk, skb1);
3538 }
3539 /* If there is no skb after us, we are the last_skb ! */
3540 - if (!q)
3541 + if (!skb1)
3542 tp->ooo_last_skb = skb;
3543
3544 add_sack:
3545 @@ -4792,7 +4790,7 @@ static struct sk_buff *tcp_skb_next(struct sk_buff *skb, struct sk_buff_head *li
3546 if (list)
3547 return !skb_queue_is_last(list, skb) ? skb->next : NULL;
3548
3549 - return rb_entry_safe(rb_next(&skb->rbnode), struct sk_buff, rbnode);
3550 + return skb_rb_next(skb);
3551 }
3552
3553 static struct sk_buff *tcp_collapse_one(struct sock *sk, struct sk_buff *skb,
3554 @@ -4821,7 +4819,7 @@ static void tcp_rbtree_insert(struct rb_root *root, struct sk_buff *skb)
3555
3556 while (*p) {
3557 parent = *p;
3558 - skb1 = rb_entry(parent, struct sk_buff, rbnode);
3559 + skb1 = rb_to_skb(parent);
3560 if (before(TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb1)->seq))
3561 p = &parent->rb_left;
3562 else
3563 @@ -4941,19 +4939,12 @@ static void tcp_collapse_ofo_queue(struct sock *sk)
3564 struct tcp_sock *tp = tcp_sk(sk);
3565 u32 range_truesize, sum_tiny = 0;
3566 struct sk_buff *skb, *head;
3567 - struct rb_node *p;
3568 u32 start, end;
3569
3570 - p = rb_first(&tp->out_of_order_queue);
3571 - skb = rb_entry_safe(p, struct sk_buff, rbnode);
3572 + skb = skb_rb_first(&tp->out_of_order_queue);
3573 new_range:
3574 if (!skb) {
3575 - p = rb_last(&tp->out_of_order_queue);
3576 - /* Note: This is possible p is NULL here. We do not
3577 - * use rb_entry_safe(), as ooo_last_skb is valid only
3578 - * if rbtree is not empty.
3579 - */
3580 - tp->ooo_last_skb = rb_entry(p, struct sk_buff, rbnode);
3581 + tp->ooo_last_skb = skb_rb_last(&tp->out_of_order_queue);
3582 return;
3583 }
3584 start = TCP_SKB_CB(skb)->seq;
3585 @@ -4961,7 +4952,7 @@ new_range:
3586 range_truesize = skb->truesize;
3587
3588 for (head = skb;;) {
3589 - skb = tcp_skb_next(skb, NULL);
3590 + skb = skb_rb_next(skb);
3591
3592 /* Range is terminated when we see a gap or when
3593 * we are at the queue end.
3594 @@ -5017,7 +5008,7 @@ static bool tcp_prune_ofo_queue(struct sock *sk)
3595 prev = rb_prev(node);
3596 rb_erase(node, &tp->out_of_order_queue);
3597 goal -= rb_to_skb(node)->truesize;
3598 - tcp_drop(sk, rb_entry(node, struct sk_buff, rbnode));
3599 + tcp_drop(sk, rb_to_skb(node));
3600 if (!prev || goal <= 0) {
3601 sk_mem_reclaim(sk);
3602 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf &&
3603 @@ -5027,7 +5018,7 @@ static bool tcp_prune_ofo_queue(struct sock *sk)
3604 }
3605 node = prev;
3606 } while (node);
3607 - tp->ooo_last_skb = rb_entry(prev, struct sk_buff, rbnode);
3608 + tp->ooo_last_skb = rb_to_skb(prev);
3609
3610 /* Reset SACK state. A conforming SACK implementation will
3611 * do the same at a timeout based retransmit. When a connection
3612 @@ -5978,11 +5969,13 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
3613 if (th->fin)
3614 goto discard;
3615 /* It is possible that we process SYN packets from backlog,
3616 - * so we need to make sure to disable BH right there.
3617 + * so we need to make sure to disable BH and RCU right there.
3618 */
3619 + rcu_read_lock();
3620 local_bh_disable();
3621 acceptable = icsk->icsk_af_ops->conn_request(sk, skb) >= 0;
3622 local_bh_enable();
3623 + rcu_read_unlock();
3624
3625 if (!acceptable)
3626 return 1;
3627 diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
3628 index 16dea67792e0..1ea0c91ba994 100644
3629 --- a/net/ipv4/tcp_ipv4.c
3630 +++ b/net/ipv4/tcp_ipv4.c
3631 @@ -859,9 +859,11 @@ static int tcp_v4_send_synack(const struct sock *sk, struct dst_entry *dst,
3632 if (skb) {
3633 __tcp_v4_send_check(skb, ireq->ir_loc_addr, ireq->ir_rmt_addr);
3634
3635 + rcu_read_lock();
3636 err = ip_build_and_send_pkt(skb, sk, ireq->ir_loc_addr,
3637 ireq->ir_rmt_addr,
3638 - ireq_opt_deref(ireq));
3639 + rcu_dereference(ireq->ireq_opt));
3640 + rcu_read_unlock();
3641 err = net_xmit_eval(err);
3642 }
3643
3644 diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
3645 index 3a27cf762da1..bc532206077f 100644
3646 --- a/net/ipv6/addrconf.c
3647 +++ b/net/ipv6/addrconf.c
3648 @@ -4068,7 +4068,6 @@ static struct inet6_ifaddr *if6_get_first(struct seq_file *seq, loff_t pos)
3649 p++;
3650 continue;
3651 }
3652 - state->offset++;
3653 return ifa;
3654 }
3655
3656 @@ -4092,13 +4091,12 @@ static struct inet6_ifaddr *if6_get_next(struct seq_file *seq,
3657 return ifa;
3658 }
3659
3660 + state->offset = 0;
3661 while (++state->bucket < IN6_ADDR_HSIZE) {
3662 - state->offset = 0;
3663 hlist_for_each_entry_rcu_bh(ifa,
3664 &inet6_addr_lst[state->bucket], addr_lst) {
3665 if (!net_eq(dev_net(ifa->idev->dev), net))
3666 continue;
3667 - state->offset++;
3668 return ifa;
3669 }
3670 }
3671 diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
3672 index cda63426eefb..fd081a14064e 100644
3673 --- a/net/ipv6/ip6_tunnel.c
3674 +++ b/net/ipv6/ip6_tunnel.c
3675 @@ -1226,7 +1226,7 @@ static inline int
3676 ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
3677 {
3678 struct ip6_tnl *t = netdev_priv(dev);
3679 - const struct iphdr *iph = ip_hdr(skb);
3680 + const struct iphdr *iph;
3681 int encap_limit = -1;
3682 struct flowi6 fl6;
3683 __u8 dsfield;
3684 @@ -1234,6 +1234,11 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
3685 u8 tproto;
3686 int err;
3687
3688 + /* ensure we can access the full inner ip header */
3689 + if (!pskb_may_pull(skb, sizeof(struct iphdr)))
3690 + return -1;
3691 +
3692 + iph = ip_hdr(skb);
3693 memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
3694
3695 tproto = ACCESS_ONCE(t->parms.proto);
3696 @@ -1293,7 +1298,7 @@ static inline int
3697 ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
3698 {
3699 struct ip6_tnl *t = netdev_priv(dev);
3700 - struct ipv6hdr *ipv6h = ipv6_hdr(skb);
3701 + struct ipv6hdr *ipv6h;
3702 int encap_limit = -1;
3703 __u16 offset;
3704 struct flowi6 fl6;
3705 @@ -1302,6 +1307,10 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
3706 u8 tproto;
3707 int err;
3708
3709 + if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h))))
3710 + return -1;
3711 +
3712 + ipv6h = ipv6_hdr(skb);
3713 tproto = ACCESS_ONCE(t->parms.proto);
3714 if ((tproto != IPPROTO_IPV6 && tproto != 0) ||
3715 ip6_tnl_addr_conflict(t, ipv6h))
3716 diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
3717 index ee33a6743f3b..b9147558a8f2 100644
3718 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c
3719 +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
3720 @@ -63,7 +63,6 @@ struct nf_ct_frag6_skb_cb
3721 static struct inet_frags nf_frags;
3722
3723 #ifdef CONFIG_SYSCTL
3724 -static int zero;
3725
3726 static struct ctl_table nf_ct_frag6_sysctl_table[] = {
3727 {
3728 @@ -76,18 +75,17 @@ static struct ctl_table nf_ct_frag6_sysctl_table[] = {
3729 {
3730 .procname = "nf_conntrack_frag6_low_thresh",
3731 .data = &init_net.nf_frag.frags.low_thresh,
3732 - .maxlen = sizeof(unsigned int),
3733 + .maxlen = sizeof(unsigned long),
3734 .mode = 0644,
3735 - .proc_handler = proc_dointvec_minmax,
3736 - .extra1 = &zero,
3737 + .proc_handler = proc_doulongvec_minmax,
3738 .extra2 = &init_net.nf_frag.frags.high_thresh
3739 },
3740 {
3741 .procname = "nf_conntrack_frag6_high_thresh",
3742 .data = &init_net.nf_frag.frags.high_thresh,
3743 - .maxlen = sizeof(unsigned int),
3744 + .maxlen = sizeof(unsigned long),
3745 .mode = 0644,
3746 - .proc_handler = proc_dointvec_minmax,
3747 + .proc_handler = proc_doulongvec_minmax,
3748 .extra1 = &init_net.nf_frag.frags.low_thresh
3749 },
3750 { }
3751 @@ -152,23 +150,6 @@ static inline u8 ip6_frag_ecn(const struct ipv6hdr *ipv6h)
3752 return 1 << (ipv6_get_dsfield(ipv6h) & INET_ECN_MASK);
3753 }
3754
3755 -static unsigned int nf_hash_frag(__be32 id, const struct in6_addr *saddr,
3756 - const struct in6_addr *daddr)
3757 -{
3758 - net_get_random_once(&nf_frags.rnd, sizeof(nf_frags.rnd));
3759 - return jhash_3words(ipv6_addr_hash(saddr), ipv6_addr_hash(daddr),
3760 - (__force u32)id, nf_frags.rnd);
3761 -}
3762 -
3763 -
3764 -static unsigned int nf_hashfn(const struct inet_frag_queue *q)
3765 -{
3766 - const struct frag_queue *nq;
3767 -
3768 - nq = container_of(q, struct frag_queue, q);
3769 - return nf_hash_frag(nq->id, &nq->saddr, &nq->daddr);
3770 -}
3771 -
3772 static void nf_ct_frag6_expire(unsigned long data)
3773 {
3774 struct frag_queue *fq;
3775 @@ -177,34 +158,26 @@ static void nf_ct_frag6_expire(unsigned long data)
3776 fq = container_of((struct inet_frag_queue *)data, struct frag_queue, q);
3777 net = container_of(fq->q.net, struct net, nf_frag.frags);
3778
3779 - ip6_expire_frag_queue(net, fq, &nf_frags);
3780 + ip6_expire_frag_queue(net, fq);
3781 }
3782
3783 /* Creation primitives. */
3784 -static inline struct frag_queue *fq_find(struct net *net, __be32 id,
3785 - u32 user, struct in6_addr *src,
3786 - struct in6_addr *dst, int iif, u8 ecn)
3787 +static struct frag_queue *fq_find(struct net *net, __be32 id, u32 user,
3788 + const struct ipv6hdr *hdr, int iif)
3789 {
3790 + struct frag_v6_compare_key key = {
3791 + .id = id,
3792 + .saddr = hdr->saddr,
3793 + .daddr = hdr->daddr,
3794 + .user = user,
3795 + .iif = iif,
3796 + };
3797 struct inet_frag_queue *q;
3798 - struct ip6_create_arg arg;
3799 - unsigned int hash;
3800 -
3801 - arg.id = id;
3802 - arg.user = user;
3803 - arg.src = src;
3804 - arg.dst = dst;
3805 - arg.iif = iif;
3806 - arg.ecn = ecn;
3807 -
3808 - local_bh_disable();
3809 - hash = nf_hash_frag(id, src, dst);
3810 -
3811 - q = inet_frag_find(&net->nf_frag.frags, &nf_frags, &arg, hash);
3812 - local_bh_enable();
3813 - if (IS_ERR_OR_NULL(q)) {
3814 - inet_frag_maybe_warn_overflow(q, pr_fmt());
3815 +
3816 + q = inet_frag_find(&net->nf_frag.frags, &key);
3817 + if (!q)
3818 return NULL;
3819 - }
3820 +
3821 return container_of(q, struct frag_queue, q);
3822 }
3823
3824 @@ -263,7 +236,7 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb,
3825 * this case. -DaveM
3826 */
3827 pr_debug("end of fragment not rounded to 8 bytes.\n");
3828 - inet_frag_kill(&fq->q, &nf_frags);
3829 + inet_frag_kill(&fq->q);
3830 return -EPROTO;
3831 }
3832 if (end > fq->q.len) {
3833 @@ -356,7 +329,7 @@ found:
3834 return 0;
3835
3836 discard_fq:
3837 - inet_frag_kill(&fq->q, &nf_frags);
3838 + inet_frag_kill(&fq->q);
3839 err:
3840 return -EINVAL;
3841 }
3842 @@ -378,7 +351,7 @@ nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *prev, struct net_devic
3843 int payload_len;
3844 u8 ecn;
3845
3846 - inet_frag_kill(&fq->q, &nf_frags);
3847 + inet_frag_kill(&fq->q);
3848
3849 WARN_ON(head == NULL);
3850 WARN_ON(NFCT_FRAG6_CB(head)->offset != 0);
3851 @@ -479,6 +452,7 @@ nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *prev, struct net_devic
3852 else if (head->ip_summed == CHECKSUM_COMPLETE)
3853 head->csum = csum_add(head->csum, fp->csum);
3854 head->truesize += fp->truesize;
3855 + fp->sk = NULL;
3856 }
3857 sub_frag_mem_limit(fq->q.net, head->truesize);
3858
3859 @@ -497,6 +471,7 @@ nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *prev, struct net_devic
3860 head->csum);
3861
3862 fq->q.fragments = NULL;
3863 + fq->q.rb_fragments = RB_ROOT;
3864 fq->q.fragments_tail = NULL;
3865
3866 return true;
3867 @@ -591,9 +566,13 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user)
3868 hdr = ipv6_hdr(skb);
3869 fhdr = (struct frag_hdr *)skb_transport_header(skb);
3870
3871 + if (skb->len - skb_network_offset(skb) < IPV6_MIN_MTU &&
3872 + fhdr->frag_off & htons(IP6_MF))
3873 + return -EINVAL;
3874 +
3875 skb_orphan(skb);
3876 - fq = fq_find(net, fhdr->identification, user, &hdr->saddr, &hdr->daddr,
3877 - skb->dev ? skb->dev->ifindex : 0, ip6_frag_ecn(hdr));
3878 + fq = fq_find(net, fhdr->identification, user, hdr,
3879 + skb->dev ? skb->dev->ifindex : 0);
3880 if (fq == NULL) {
3881 pr_debug("Can't find and can't create new queue\n");
3882 return -ENOMEM;
3883 @@ -623,25 +602,33 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user)
3884
3885 out_unlock:
3886 spin_unlock_bh(&fq->q.lock);
3887 - inet_frag_put(&fq->q, &nf_frags);
3888 + inet_frag_put(&fq->q);
3889 return ret;
3890 }
3891 EXPORT_SYMBOL_GPL(nf_ct_frag6_gather);
3892
3893 static int nf_ct_net_init(struct net *net)
3894 {
3895 + int res;
3896 +
3897 net->nf_frag.frags.high_thresh = IPV6_FRAG_HIGH_THRESH;
3898 net->nf_frag.frags.low_thresh = IPV6_FRAG_LOW_THRESH;
3899 net->nf_frag.frags.timeout = IPV6_FRAG_TIMEOUT;
3900 - inet_frags_init_net(&net->nf_frag.frags);
3901 -
3902 - return nf_ct_frag6_sysctl_register(net);
3903 + net->nf_frag.frags.f = &nf_frags;
3904 +
3905 + res = inet_frags_init_net(&net->nf_frag.frags);
3906 + if (res < 0)
3907 + return res;
3908 + res = nf_ct_frag6_sysctl_register(net);
3909 + if (res < 0)
3910 + inet_frags_exit_net(&net->nf_frag.frags);
3911 + return res;
3912 }
3913
3914 static void nf_ct_net_exit(struct net *net)
3915 {
3916 nf_ct_frags6_sysctl_unregister(net);
3917 - inet_frags_exit_net(&net->nf_frag.frags, &nf_frags);
3918 + inet_frags_exit_net(&net->nf_frag.frags);
3919 }
3920
3921 static struct pernet_operations nf_ct_net_ops = {
3922 @@ -653,13 +640,12 @@ int nf_ct_frag6_init(void)
3923 {
3924 int ret = 0;
3925
3926 - nf_frags.hashfn = nf_hashfn;
3927 nf_frags.constructor = ip6_frag_init;
3928 nf_frags.destructor = NULL;
3929 nf_frags.qsize = sizeof(struct frag_queue);
3930 - nf_frags.match = ip6_frag_match;
3931 nf_frags.frag_expire = nf_ct_frag6_expire;
3932 nf_frags.frags_cache_name = nf_frags_cache_name;
3933 + nf_frags.rhash_params = ip6_rhash_params;
3934 ret = inet_frags_init(&nf_frags);
3935 if (ret)
3936 goto out;
3937 diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c
3938 index e88bcb8ff0fd..dc04c024986c 100644
3939 --- a/net/ipv6/proc.c
3940 +++ b/net/ipv6/proc.c
3941 @@ -38,7 +38,6 @@
3942 static int sockstat6_seq_show(struct seq_file *seq, void *v)
3943 {
3944 struct net *net = seq->private;
3945 - unsigned int frag_mem = ip6_frag_mem(net);
3946
3947 seq_printf(seq, "TCP6: inuse %d\n",
3948 sock_prot_inuse_get(net, &tcpv6_prot));
3949 @@ -48,7 +47,9 @@ static int sockstat6_seq_show(struct seq_file *seq, void *v)
3950 sock_prot_inuse_get(net, &udplitev6_prot));
3951 seq_printf(seq, "RAW6: inuse %d\n",
3952 sock_prot_inuse_get(net, &rawv6_prot));
3953 - seq_printf(seq, "FRAG6: inuse %u memory %u\n", !!frag_mem, frag_mem);
3954 + seq_printf(seq, "FRAG6: inuse %u memory %lu\n",
3955 + atomic_read(&net->ipv6.frags.rhashtable.nelems),
3956 + frag_mem_limit(&net->ipv6.frags));
3957 return 0;
3958 }
3959
3960 diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
3961 index 71ffa526cb23..a4f979ff31b9 100644
3962 --- a/net/ipv6/raw.c
3963 +++ b/net/ipv6/raw.c
3964 @@ -645,8 +645,6 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length,
3965 skb->protocol = htons(ETH_P_IPV6);
3966 skb->priority = sk->sk_priority;
3967 skb->mark = sk->sk_mark;
3968 - skb_dst_set(skb, &rt->dst);
3969 - *dstp = NULL;
3970
3971 skb_put(skb, length);
3972 skb_reset_network_header(skb);
3973 @@ -656,8 +654,14 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length,
3974
3975 skb->transport_header = skb->network_header;
3976 err = memcpy_from_msg(iph, msg, length);
3977 - if (err)
3978 - goto error_fault;
3979 + if (err) {
3980 + err = -EFAULT;
3981 + kfree_skb(skb);
3982 + goto error;
3983 + }
3984 +
3985 + skb_dst_set(skb, &rt->dst);
3986 + *dstp = NULL;
3987
3988 /* if egress device is enslaved to an L3 master device pass the
3989 * skb to its handler for processing
3990 @@ -666,21 +670,28 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length,
3991 if (unlikely(!skb))
3992 return 0;
3993
3994 + /* Acquire rcu_read_lock() in case we need to use rt->rt6i_idev
3995 + * in the error path. Since skb has been freed, the dst could
3996 + * have been queued for deletion.
3997 + */
3998 + rcu_read_lock();
3999 IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len);
4000 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, net, sk, skb,
4001 NULL, rt->dst.dev, dst_output);
4002 if (err > 0)
4003 err = net_xmit_errno(err);
4004 - if (err)
4005 - goto error;
4006 + if (err) {
4007 + IP6_INC_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
4008 + rcu_read_unlock();
4009 + goto error_check;
4010 + }
4011 + rcu_read_unlock();
4012 out:
4013 return 0;
4014
4015 -error_fault:
4016 - err = -EFAULT;
4017 - kfree_skb(skb);
4018 error:
4019 IP6_INC_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
4020 +error_check:
4021 if (err == -ENOBUFS && !np->recverr)
4022 err = 0;
4023 return err;
4024 diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
4025 index e585c0a2591c..74ffbcb306a6 100644
4026 --- a/net/ipv6/reassembly.c
4027 +++ b/net/ipv6/reassembly.c
4028 @@ -79,94 +79,58 @@ static struct inet_frags ip6_frags;
4029 static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,
4030 struct net_device *dev);
4031
4032 -/*
4033 - * callers should be careful not to use the hash value outside the ipfrag_lock
4034 - * as doing so could race with ipfrag_hash_rnd being recalculated.
4035 - */
4036 -static unsigned int inet6_hash_frag(__be32 id, const struct in6_addr *saddr,
4037 - const struct in6_addr *daddr)
4038 -{
4039 - net_get_random_once(&ip6_frags.rnd, sizeof(ip6_frags.rnd));
4040 - return jhash_3words(ipv6_addr_hash(saddr), ipv6_addr_hash(daddr),
4041 - (__force u32)id, ip6_frags.rnd);
4042 -}
4043 -
4044 -static unsigned int ip6_hashfn(const struct inet_frag_queue *q)
4045 -{
4046 - const struct frag_queue *fq;
4047 -
4048 - fq = container_of(q, struct frag_queue, q);
4049 - return inet6_hash_frag(fq->id, &fq->saddr, &fq->daddr);
4050 -}
4051 -
4052 -bool ip6_frag_match(const struct inet_frag_queue *q, const void *a)
4053 -{
4054 - const struct frag_queue *fq;
4055 - const struct ip6_create_arg *arg = a;
4056 -
4057 - fq = container_of(q, struct frag_queue, q);
4058 - return fq->id == arg->id &&
4059 - fq->user == arg->user &&
4060 - ipv6_addr_equal(&fq->saddr, arg->src) &&
4061 - ipv6_addr_equal(&fq->daddr, arg->dst) &&
4062 - (arg->iif == fq->iif ||
4063 - !(ipv6_addr_type(arg->dst) & (IPV6_ADDR_MULTICAST |
4064 - IPV6_ADDR_LINKLOCAL)));
4065 -}
4066 -EXPORT_SYMBOL(ip6_frag_match);
4067 -
4068 void ip6_frag_init(struct inet_frag_queue *q, const void *a)
4069 {
4070 struct frag_queue *fq = container_of(q, struct frag_queue, q);
4071 - const struct ip6_create_arg *arg = a;
4072 + const struct frag_v6_compare_key *key = a;
4073
4074 - fq->id = arg->id;
4075 - fq->user = arg->user;
4076 - fq->saddr = *arg->src;
4077 - fq->daddr = *arg->dst;
4078 - fq->ecn = arg->ecn;
4079 + q->key.v6 = *key;
4080 + fq->ecn = 0;
4081 }
4082 EXPORT_SYMBOL(ip6_frag_init);
4083
4084 -void ip6_expire_frag_queue(struct net *net, struct frag_queue *fq,
4085 - struct inet_frags *frags)
4086 +void ip6_expire_frag_queue(struct net *net, struct frag_queue *fq)
4087 {
4088 struct net_device *dev = NULL;
4089 + struct sk_buff *head;
4090
4091 + rcu_read_lock();
4092 spin_lock(&fq->q.lock);
4093
4094 if (fq->q.flags & INET_FRAG_COMPLETE)
4095 goto out;
4096
4097 - inet_frag_kill(&fq->q, frags);
4098 + inet_frag_kill(&fq->q);
4099
4100 - rcu_read_lock();
4101 dev = dev_get_by_index_rcu(net, fq->iif);
4102 if (!dev)
4103 - goto out_rcu_unlock;
4104 + goto out;
4105
4106 __IP6_INC_STATS(net, __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS);
4107 -
4108 - if (inet_frag_evicting(&fq->q))
4109 - goto out_rcu_unlock;
4110 -
4111 __IP6_INC_STATS(net, __in6_dev_get(dev), IPSTATS_MIB_REASMTIMEOUT);
4112
4113 /* Don't send error if the first segment did not arrive. */
4114 - if (!(fq->q.flags & INET_FRAG_FIRST_IN) || !fq->q.fragments)
4115 - goto out_rcu_unlock;
4116 + head = fq->q.fragments;
4117 + if (!(fq->q.flags & INET_FRAG_FIRST_IN) || !head)
4118 + goto out;
4119
4120 /* But use as source device on which LAST ARRIVED
4121 * segment was received. And do not use fq->dev
4122 * pointer directly, device might already disappeared.
4123 */
4124 - fq->q.fragments->dev = dev;
4125 - icmpv6_send(fq->q.fragments, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0);
4126 -out_rcu_unlock:
4127 - rcu_read_unlock();
4128 + head->dev = dev;
4129 + skb_get(head);
4130 + spin_unlock(&fq->q.lock);
4131 +
4132 + icmpv6_send(head, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0);
4133 + kfree_skb(head);
4134 + goto out_rcu_unlock;
4135 +
4136 out:
4137 spin_unlock(&fq->q.lock);
4138 - inet_frag_put(&fq->q, frags);
4139 +out_rcu_unlock:
4140 + rcu_read_unlock();
4141 + inet_frag_put(&fq->q);
4142 }
4143 EXPORT_SYMBOL(ip6_expire_frag_queue);
4144
4145 @@ -178,31 +142,29 @@ static void ip6_frag_expire(unsigned long data)
4146 fq = container_of((struct inet_frag_queue *)data, struct frag_queue, q);
4147 net = container_of(fq->q.net, struct net, ipv6.frags);
4148
4149 - ip6_expire_frag_queue(net, fq, &ip6_frags);
4150 + ip6_expire_frag_queue(net, fq);
4151 }
4152
4153 static struct frag_queue *
4154 -fq_find(struct net *net, __be32 id, const struct in6_addr *src,
4155 - const struct in6_addr *dst, int iif, u8 ecn)
4156 +fq_find(struct net *net, __be32 id, const struct ipv6hdr *hdr, int iif)
4157 {
4158 + struct frag_v6_compare_key key = {
4159 + .id = id,
4160 + .saddr = hdr->saddr,
4161 + .daddr = hdr->daddr,
4162 + .user = IP6_DEFRAG_LOCAL_DELIVER,
4163 + .iif = iif,
4164 + };
4165 struct inet_frag_queue *q;
4166 - struct ip6_create_arg arg;
4167 - unsigned int hash;
4168
4169 - arg.id = id;
4170 - arg.user = IP6_DEFRAG_LOCAL_DELIVER;
4171 - arg.src = src;
4172 - arg.dst = dst;
4173 - arg.iif = iif;
4174 - arg.ecn = ecn;
4175 + if (!(ipv6_addr_type(&hdr->daddr) & (IPV6_ADDR_MULTICAST |
4176 + IPV6_ADDR_LINKLOCAL)))
4177 + key.iif = 0;
4178
4179 - hash = inet6_hash_frag(id, src, dst);
4180 -
4181 - q = inet_frag_find(&net->ipv6.frags, &ip6_frags, &arg, hash);
4182 - if (IS_ERR_OR_NULL(q)) {
4183 - inet_frag_maybe_warn_overflow(q, pr_fmt());
4184 + q = inet_frag_find(&net->ipv6.frags, &key);
4185 + if (!q)
4186 return NULL;
4187 - }
4188 +
4189 return container_of(q, struct frag_queue, q);
4190 }
4191
4192 @@ -359,7 +321,7 @@ found:
4193 return -1;
4194
4195 discard_fq:
4196 - inet_frag_kill(&fq->q, &ip6_frags);
4197 + inet_frag_kill(&fq->q);
4198 err:
4199 __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
4200 IPSTATS_MIB_REASMFAILS);
4201 @@ -386,7 +348,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,
4202 int sum_truesize;
4203 u8 ecn;
4204
4205 - inet_frag_kill(&fq->q, &ip6_frags);
4206 + inet_frag_kill(&fq->q);
4207
4208 ecn = ip_frag_ecn_table[fq->ecn];
4209 if (unlikely(ecn == 0xff))
4210 @@ -504,6 +466,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,
4211 __IP6_INC_STATS(net, __in6_dev_get(dev), IPSTATS_MIB_REASMOKS);
4212 rcu_read_unlock();
4213 fq->q.fragments = NULL;
4214 + fq->q.rb_fragments = RB_ROOT;
4215 fq->q.fragments_tail = NULL;
4216 return 1;
4217
4218 @@ -525,6 +488,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
4219 struct frag_queue *fq;
4220 const struct ipv6hdr *hdr = ipv6_hdr(skb);
4221 struct net *net = dev_net(skb_dst(skb)->dev);
4222 + int iif;
4223
4224 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED)
4225 goto fail_hdr;
4226 @@ -553,17 +517,22 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
4227 return 1;
4228 }
4229
4230 - fq = fq_find(net, fhdr->identification, &hdr->saddr, &hdr->daddr,
4231 - skb->dev ? skb->dev->ifindex : 0, ip6_frag_ecn(hdr));
4232 + if (skb->len - skb_network_offset(skb) < IPV6_MIN_MTU &&
4233 + fhdr->frag_off & htons(IP6_MF))
4234 + goto fail_hdr;
4235 +
4236 + iif = skb->dev ? skb->dev->ifindex : 0;
4237 + fq = fq_find(net, fhdr->identification, hdr, iif);
4238 if (fq) {
4239 int ret;
4240
4241 spin_lock(&fq->q.lock);
4242
4243 + fq->iif = iif;
4244 ret = ip6_frag_queue(fq, skb, fhdr, IP6CB(skb)->nhoff);
4245
4246 spin_unlock(&fq->q.lock);
4247 - inet_frag_put(&fq->q, &ip6_frags);
4248 + inet_frag_put(&fq->q);
4249 return ret;
4250 }
4251
4252 @@ -584,24 +553,22 @@ static const struct inet6_protocol frag_protocol = {
4253 };
4254
4255 #ifdef CONFIG_SYSCTL
4256 -static int zero;
4257
4258 static struct ctl_table ip6_frags_ns_ctl_table[] = {
4259 {
4260 .procname = "ip6frag_high_thresh",
4261 .data = &init_net.ipv6.frags.high_thresh,
4262 - .maxlen = sizeof(int),
4263 + .maxlen = sizeof(unsigned long),
4264 .mode = 0644,
4265 - .proc_handler = proc_dointvec_minmax,
4266 + .proc_handler = proc_doulongvec_minmax,
4267 .extra1 = &init_net.ipv6.frags.low_thresh
4268 },
4269 {
4270 .procname = "ip6frag_low_thresh",
4271 .data = &init_net.ipv6.frags.low_thresh,
4272 - .maxlen = sizeof(int),
4273 + .maxlen = sizeof(unsigned long),
4274 .mode = 0644,
4275 - .proc_handler = proc_dointvec_minmax,
4276 - .extra1 = &zero,
4277 + .proc_handler = proc_doulongvec_minmax,
4278 .extra2 = &init_net.ipv6.frags.high_thresh
4279 },
4280 {
4281 @@ -644,10 +611,6 @@ static int __net_init ip6_frags_ns_sysctl_register(struct net *net)
4282 table[1].data = &net->ipv6.frags.low_thresh;
4283 table[1].extra2 = &net->ipv6.frags.high_thresh;
4284 table[2].data = &net->ipv6.frags.timeout;
4285 -
4286 - /* Don't export sysctls to unprivileged users */
4287 - if (net->user_ns != &init_user_ns)
4288 - table[0].procname = NULL;
4289 }
4290
4291 hdr = register_net_sysctl(net, "net/ipv6", table);
4292 @@ -709,19 +672,27 @@ static void ip6_frags_sysctl_unregister(void)
4293
4294 static int __net_init ipv6_frags_init_net(struct net *net)
4295 {
4296 + int res;
4297 +
4298 net->ipv6.frags.high_thresh = IPV6_FRAG_HIGH_THRESH;
4299 net->ipv6.frags.low_thresh = IPV6_FRAG_LOW_THRESH;
4300 net->ipv6.frags.timeout = IPV6_FRAG_TIMEOUT;
4301 + net->ipv6.frags.f = &ip6_frags;
4302
4303 - inet_frags_init_net(&net->ipv6.frags);
4304 + res = inet_frags_init_net(&net->ipv6.frags);
4305 + if (res < 0)
4306 + return res;
4307
4308 - return ip6_frags_ns_sysctl_register(net);
4309 + res = ip6_frags_ns_sysctl_register(net);
4310 + if (res < 0)
4311 + inet_frags_exit_net(&net->ipv6.frags);
4312 + return res;
4313 }
4314
4315 static void __net_exit ipv6_frags_exit_net(struct net *net)
4316 {
4317 ip6_frags_ns_sysctl_unregister(net);
4318 - inet_frags_exit_net(&net->ipv6.frags, &ip6_frags);
4319 + inet_frags_exit_net(&net->ipv6.frags);
4320 }
4321
4322 static struct pernet_operations ip6_frags_ops = {
4323 @@ -729,14 +700,55 @@ static struct pernet_operations ip6_frags_ops = {
4324 .exit = ipv6_frags_exit_net,
4325 };
4326
4327 +static u32 ip6_key_hashfn(const void *data, u32 len, u32 seed)
4328 +{
4329 + return jhash2(data,
4330 + sizeof(struct frag_v6_compare_key) / sizeof(u32), seed);
4331 +}
4332 +
4333 +static u32 ip6_obj_hashfn(const void *data, u32 len, u32 seed)
4334 +{
4335 + const struct inet_frag_queue *fq = data;
4336 +
4337 + return jhash2((const u32 *)&fq->key.v6,
4338 + sizeof(struct frag_v6_compare_key) / sizeof(u32), seed);
4339 +}
4340 +
4341 +static int ip6_obj_cmpfn(struct rhashtable_compare_arg *arg, const void *ptr)
4342 +{
4343 + const struct frag_v6_compare_key *key = arg->key;
4344 + const struct inet_frag_queue *fq = ptr;
4345 +
4346 + return !!memcmp(&fq->key, key, sizeof(*key));
4347 +}
4348 +
4349 +const struct rhashtable_params ip6_rhash_params = {
4350 + .head_offset = offsetof(struct inet_frag_queue, node),
4351 + .hashfn = ip6_key_hashfn,
4352 + .obj_hashfn = ip6_obj_hashfn,
4353 + .obj_cmpfn = ip6_obj_cmpfn,
4354 + .automatic_shrinking = true,
4355 +};
4356 +EXPORT_SYMBOL(ip6_rhash_params);
4357 +
4358 int __init ipv6_frag_init(void)
4359 {
4360 int ret;
4361
4362 - ret = inet6_add_protocol(&frag_protocol, IPPROTO_FRAGMENT);
4363 + ip6_frags.constructor = ip6_frag_init;
4364 + ip6_frags.destructor = NULL;
4365 + ip6_frags.qsize = sizeof(struct frag_queue);
4366 + ip6_frags.frag_expire = ip6_frag_expire;
4367 + ip6_frags.frags_cache_name = ip6_frag_cache_name;
4368 + ip6_frags.rhash_params = ip6_rhash_params;
4369 + ret = inet_frags_init(&ip6_frags);
4370 if (ret)
4371 goto out;
4372
4373 + ret = inet6_add_protocol(&frag_protocol, IPPROTO_FRAGMENT);
4374 + if (ret)
4375 + goto err_protocol;
4376 +
4377 ret = ip6_frags_sysctl_register();
4378 if (ret)
4379 goto err_sysctl;
4380 @@ -745,16 +757,6 @@ int __init ipv6_frag_init(void)
4381 if (ret)
4382 goto err_pernet;
4383
4384 - ip6_frags.hashfn = ip6_hashfn;
4385 - ip6_frags.constructor = ip6_frag_init;
4386 - ip6_frags.destructor = NULL;
4387 - ip6_frags.qsize = sizeof(struct frag_queue);
4388 - ip6_frags.match = ip6_frag_match;
4389 - ip6_frags.frag_expire = ip6_frag_expire;
4390 - ip6_frags.frags_cache_name = ip6_frag_cache_name;
4391 - ret = inet_frags_init(&ip6_frags);
4392 - if (ret)
4393 - goto err_pernet;
4394 out:
4395 return ret;
4396
4397 @@ -762,6 +764,8 @@ err_pernet:
4398 ip6_frags_sysctl_unregister();
4399 err_sysctl:
4400 inet6_del_protocol(&frag_protocol, IPPROTO_FRAGMENT);
4401 +err_protocol:
4402 + inet_frags_fini(&ip6_frags);
4403 goto out;
4404 }
4405
4406 diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c
4407 index a123d0dc1ef9..053ba8646155 100644
4408 --- a/net/netlabel/netlabel_unlabeled.c
4409 +++ b/net/netlabel/netlabel_unlabeled.c
4410 @@ -787,7 +787,8 @@ static int netlbl_unlabel_addrinfo_get(struct genl_info *info,
4411 {
4412 u32 addr_len;
4413
4414 - if (info->attrs[NLBL_UNLABEL_A_IPV4ADDR]) {
4415 + if (info->attrs[NLBL_UNLABEL_A_IPV4ADDR] &&
4416 + info->attrs[NLBL_UNLABEL_A_IPV4MASK]) {
4417 addr_len = nla_len(info->attrs[NLBL_UNLABEL_A_IPV4ADDR]);
4418 if (addr_len != sizeof(struct in_addr) &&
4419 addr_len != nla_len(info->attrs[NLBL_UNLABEL_A_IPV4MASK]))
4420 diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c
4421 index 8761877207ec..00c6af2ae1c2 100644
4422 --- a/sound/hda/hdac_controller.c
4423 +++ b/sound/hda/hdac_controller.c
4424 @@ -40,6 +40,8 @@ static void azx_clear_corbrp(struct hdac_bus *bus)
4425 */
4426 void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus)
4427 {
4428 + WARN_ON_ONCE(!bus->rb.area);
4429 +
4430 spin_lock_irq(&bus->reg_lock);
4431 /* CORB set up */
4432 bus->corb.addr = bus->rb.addr;
4433 @@ -478,13 +480,15 @@ bool snd_hdac_bus_init_chip(struct hdac_bus *bus, bool full_reset)
4434 /* reset controller */
4435 azx_reset(bus, full_reset);
4436
4437 - /* initialize interrupts */
4438 + /* clear interrupts */
4439 azx_int_clear(bus);
4440 - azx_int_enable(bus);
4441
4442 /* initialize the codec command I/O */
4443 snd_hdac_bus_init_cmd_io(bus);
4444
4445 + /* enable interrupts after CORB/RIRB buffers are initialized above */
4446 + azx_int_enable(bus);
4447 +
4448 /* program the position buffer */
4449 if (bus->use_posbuf && bus->posbuf.addr) {
4450 snd_hdac_chip_writel(bus, DPLBASE, (u32)bus->posbuf.addr);
4451 diff --git a/sound/soc/codecs/sigmadsp.c b/sound/soc/codecs/sigmadsp.c
4452 index d53680ac78e4..6df158669420 100644
4453 --- a/sound/soc/codecs/sigmadsp.c
4454 +++ b/sound/soc/codecs/sigmadsp.c
4455 @@ -117,8 +117,7 @@ static int sigmadsp_ctrl_write(struct sigmadsp *sigmadsp,
4456 struct sigmadsp_control *ctrl, void *data)
4457 {
4458 /* safeload loads up to 20 bytes in a atomic operation */
4459 - if (ctrl->num_bytes > 4 && ctrl->num_bytes <= 20 && sigmadsp->ops &&
4460 - sigmadsp->ops->safeload)
4461 + if (ctrl->num_bytes <= 20 && sigmadsp->ops && sigmadsp->ops->safeload)
4462 return sigmadsp->ops->safeload(sigmadsp, ctrl->addr, data,
4463 ctrl->num_bytes);
4464 else
4465 diff --git a/sound/soc/codecs/wm8804-i2c.c b/sound/soc/codecs/wm8804-i2c.c
4466 index f27464c2c5ba..79541960f45d 100644
4467 --- a/sound/soc/codecs/wm8804-i2c.c
4468 +++ b/sound/soc/codecs/wm8804-i2c.c
4469 @@ -13,6 +13,7 @@
4470 #include <linux/init.h>
4471 #include <linux/module.h>
4472 #include <linux/i2c.h>
4473 +#include <linux/acpi.h>
4474
4475 #include "wm8804.h"
4476
4477 @@ -40,17 +41,29 @@ static const struct i2c_device_id wm8804_i2c_id[] = {
4478 };
4479 MODULE_DEVICE_TABLE(i2c, wm8804_i2c_id);
4480
4481 +#if defined(CONFIG_OF)
4482 static const struct of_device_id wm8804_of_match[] = {
4483 { .compatible = "wlf,wm8804", },
4484 { }
4485 };
4486 MODULE_DEVICE_TABLE(of, wm8804_of_match);
4487 +#endif
4488 +
4489 +#ifdef CONFIG_ACPI
4490 +static const struct acpi_device_id wm8804_acpi_match[] = {
4491 + { "1AEC8804", 0 }, /* Wolfson PCI ID + part ID */
4492 + { "10138804", 0 }, /* Cirrus Logic PCI ID + part ID */
4493 + { },
4494 +};
4495 +MODULE_DEVICE_TABLE(acpi, wm8804_acpi_match);
4496 +#endif
4497
4498 static struct i2c_driver wm8804_i2c_driver = {
4499 .driver = {
4500 .name = "wm8804",
4501 .pm = &wm8804_pm,
4502 - .of_match_table = wm8804_of_match,
4503 + .of_match_table = of_match_ptr(wm8804_of_match),
4504 + .acpi_match_table = ACPI_PTR(wm8804_acpi_match),
4505 },
4506 .probe = wm8804_i2c_probe,
4507 .remove = wm8804_i2c_remove,
4508 diff --git a/tools/perf/scripts/python/export-to-postgresql.py b/tools/perf/scripts/python/export-to-postgresql.py
4509 index 7656ff8aa066..c001d5a91d22 100644
4510 --- a/tools/perf/scripts/python/export-to-postgresql.py
4511 +++ b/tools/perf/scripts/python/export-to-postgresql.py
4512 @@ -204,14 +204,23 @@ from ctypes import *
4513 libpq = CDLL("libpq.so.5")
4514 PQconnectdb = libpq.PQconnectdb
4515 PQconnectdb.restype = c_void_p
4516 +PQconnectdb.argtypes = [ c_char_p ]
4517 PQfinish = libpq.PQfinish
4518 +PQfinish.argtypes = [ c_void_p ]
4519 PQstatus = libpq.PQstatus
4520 +PQstatus.restype = c_int
4521 +PQstatus.argtypes = [ c_void_p ]
4522 PQexec = libpq.PQexec
4523 PQexec.restype = c_void_p
4524 +PQexec.argtypes = [ c_void_p, c_char_p ]
4525 PQresultStatus = libpq.PQresultStatus
4526 +PQresultStatus.restype = c_int
4527 +PQresultStatus.argtypes = [ c_void_p ]
4528 PQputCopyData = libpq.PQputCopyData
4529 +PQputCopyData.restype = c_int
4530 PQputCopyData.argtypes = [ c_void_p, c_void_p, c_int ]
4531 PQputCopyEnd = libpq.PQputCopyEnd
4532 +PQputCopyEnd.restype = c_int
4533 PQputCopyEnd.argtypes = [ c_void_p, c_void_p ]
4534
4535 sys.path.append(os.environ['PERF_EXEC_PATH'] + \
4536 diff --git a/tools/testing/selftests/efivarfs/config b/tools/testing/selftests/efivarfs/config
4537 new file mode 100644
4538 index 000000000000..4e151f1005b2
4539 --- /dev/null
4540 +++ b/tools/testing/selftests/efivarfs/config
4541 @@ -0,0 +1 @@
4542 +CONFIG_EFIVAR_FS=y
4543 diff --git a/tools/testing/selftests/memory-hotplug/config b/tools/testing/selftests/memory-hotplug/config
4544 index 2fde30191a47..a7e8cd5bb265 100644
4545 --- a/tools/testing/selftests/memory-hotplug/config
4546 +++ b/tools/testing/selftests/memory-hotplug/config
4547 @@ -2,3 +2,4 @@ CONFIG_MEMORY_HOTPLUG=y
4548 CONFIG_MEMORY_HOTPLUG_SPARSE=y
4549 CONFIG_NOTIFIER_ERROR_INJECTION=y
4550 CONFIG_MEMORY_NOTIFIER_ERROR_INJECT=m
4551 +CONFIG_MEMORY_HOTREMOVE=y