Magellan Linux

Contents of /trunk/kernel-magellan/patches-4.2/0102-4.2.3-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2708 - (show annotations) (download)
Mon Nov 2 12:49:20 2015 UTC (8 years, 6 months ago) by niro
File size: 47385 byte(s)
-linux-4.2.3
1 diff --git a/Documentation/devicetree/bindings/net/ethernet.txt b/Documentation/devicetree/bindings/net/ethernet.txt
2 index 41b3f3f864e8..5d88f37480b6 100644
3 --- a/Documentation/devicetree/bindings/net/ethernet.txt
4 +++ b/Documentation/devicetree/bindings/net/ethernet.txt
5 @@ -25,7 +25,11 @@ The following properties are common to the Ethernet controllers:
6 flow control thresholds.
7 - tx-fifo-depth: the size of the controller's transmit fifo in bytes. This
8 is used for components that can have configurable fifo sizes.
9 +- managed: string, specifies the PHY management type. Supported values are:
10 + "auto", "in-band-status". "auto" is the default, it usess MDIO for
11 + management if fixed-link is not specified.
12
13 Child nodes of the Ethernet controller are typically the individual PHY devices
14 connected via the MDIO bus (sometimes the MDIO bus controller is separate).
15 They are described in the phy.txt file in this same directory.
16 +For non-MDIO PHY management see fixed-link.txt.
17 diff --git a/Makefile b/Makefile
18 index 3578b4426ecf..a6edbb11a69a 100644
19 --- a/Makefile
20 +++ b/Makefile
21 @@ -1,6 +1,6 @@
22 VERSION = 4
23 PATCHLEVEL = 2
24 -SUBLEVEL = 2
25 +SUBLEVEL = 3
26 EXTRAVERSION =
27 NAME = Hurr durr I'ma sheep
28
29 diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c
30 index 965d1afb0eaa..5cb13ca3a3ac 100644
31 --- a/drivers/block/zram/zcomp.c
32 +++ b/drivers/block/zram/zcomp.c
33 @@ -330,12 +330,14 @@ void zcomp_destroy(struct zcomp *comp)
34 * allocate new zcomp and initialize it. return compressing
35 * backend pointer or ERR_PTR if things went bad. ERR_PTR(-EINVAL)
36 * if requested algorithm is not supported, ERR_PTR(-ENOMEM) in
37 - * case of allocation error.
38 + * case of allocation error, or any other error potentially
39 + * returned by functions zcomp_strm_{multi,single}_create.
40 */
41 struct zcomp *zcomp_create(const char *compress, int max_strm)
42 {
43 struct zcomp *comp;
44 struct zcomp_backend *backend;
45 + int error;
46
47 backend = find_backend(compress);
48 if (!backend)
49 @@ -347,12 +349,12 @@ struct zcomp *zcomp_create(const char *compress, int max_strm)
50
51 comp->backend = backend;
52 if (max_strm > 1)
53 - zcomp_strm_multi_create(comp, max_strm);
54 + error = zcomp_strm_multi_create(comp, max_strm);
55 else
56 - zcomp_strm_single_create(comp);
57 - if (!comp->stream) {
58 + error = zcomp_strm_single_create(comp);
59 + if (error) {
60 kfree(comp);
61 - return ERR_PTR(-ENOMEM);
62 + return ERR_PTR(error);
63 }
64 return comp;
65 }
66 diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
67 index 079897b3a955..9d56515f4c4d 100644
68 --- a/drivers/net/dsa/bcm_sf2.c
69 +++ b/drivers/net/dsa/bcm_sf2.c
70 @@ -418,7 +418,7 @@ static int bcm_sf2_sw_fast_age_port(struct dsa_switch *ds, int port)
71 core_writel(priv, port, CORE_FAST_AGE_PORT);
72
73 reg = core_readl(priv, CORE_FAST_AGE_CTRL);
74 - reg |= EN_AGE_PORT | FAST_AGE_STR_DONE;
75 + reg |= EN_AGE_PORT | EN_AGE_DYNAMIC | FAST_AGE_STR_DONE;
76 core_writel(priv, reg, CORE_FAST_AGE_CTRL);
77
78 do {
79 @@ -432,6 +432,8 @@ static int bcm_sf2_sw_fast_age_port(struct dsa_switch *ds, int port)
80 if (!timeout)
81 return -ETIMEDOUT;
82
83 + core_writel(priv, 0, CORE_FAST_AGE_CTRL);
84 +
85 return 0;
86 }
87
88 @@ -507,7 +509,7 @@ static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
89 u32 reg;
90
91 reg = core_readl(priv, CORE_G_PCTL_PORT(port));
92 - cur_hw_state = reg >> G_MISTP_STATE_SHIFT;
93 + cur_hw_state = reg & (G_MISTP_STATE_MASK << G_MISTP_STATE_SHIFT);
94
95 switch (state) {
96 case BR_STATE_DISABLED:
97 @@ -531,10 +533,12 @@ static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
98 }
99
100 /* Fast-age ARL entries if we are moving a port from Learning or
101 - * Forwarding state to Disabled, Blocking or Listening state
102 + * Forwarding (cur_hw_state) state to Disabled, Blocking or Listening
103 + * state (hw_state)
104 */
105 if (cur_hw_state != hw_state) {
106 - if (cur_hw_state & 4 && !(hw_state & 4)) {
107 + if (cur_hw_state >= G_MISTP_LEARN_STATE &&
108 + hw_state <= G_MISTP_LISTEN_STATE) {
109 ret = bcm_sf2_sw_fast_age_port(ds, port);
110 if (ret) {
111 pr_err("%s: fast-ageing failed\n", __func__);
112 @@ -901,15 +905,11 @@ static void bcm_sf2_sw_fixed_link_update(struct dsa_switch *ds, int port,
113 struct fixed_phy_status *status)
114 {
115 struct bcm_sf2_priv *priv = ds_to_priv(ds);
116 - u32 duplex, pause, speed;
117 + u32 duplex, pause;
118 u32 reg;
119
120 duplex = core_readl(priv, CORE_DUPSTS);
121 pause = core_readl(priv, CORE_PAUSESTS);
122 - speed = core_readl(priv, CORE_SPDSTS);
123 -
124 - speed >>= (port * SPDSTS_SHIFT);
125 - speed &= SPDSTS_MASK;
126
127 status->link = 0;
128
129 @@ -944,18 +944,6 @@ static void bcm_sf2_sw_fixed_link_update(struct dsa_switch *ds, int port,
130 reg &= ~LINK_STS;
131 core_writel(priv, reg, CORE_STS_OVERRIDE_GMIIP_PORT(port));
132
133 - switch (speed) {
134 - case SPDSTS_10:
135 - status->speed = SPEED_10;
136 - break;
137 - case SPDSTS_100:
138 - status->speed = SPEED_100;
139 - break;
140 - case SPDSTS_1000:
141 - status->speed = SPEED_1000;
142 - break;
143 - }
144 -
145 if ((pause & (1 << port)) &&
146 (pause & (1 << (port + PAUSESTS_TX_PAUSE_SHIFT)))) {
147 status->asym_pause = 1;
148 diff --git a/drivers/net/dsa/bcm_sf2.h b/drivers/net/dsa/bcm_sf2.h
149 index 22e2ebf31333..789d7b7737da 100644
150 --- a/drivers/net/dsa/bcm_sf2.h
151 +++ b/drivers/net/dsa/bcm_sf2.h
152 @@ -112,8 +112,8 @@ static inline u64 name##_readq(struct bcm_sf2_priv *priv, u32 off) \
153 spin_unlock(&priv->indir_lock); \
154 return (u64)indir << 32 | dir; \
155 } \
156 -static inline void name##_writeq(struct bcm_sf2_priv *priv, u32 off, \
157 - u64 val) \
158 +static inline void name##_writeq(struct bcm_sf2_priv *priv, u64 val, \
159 + u32 off) \
160 { \
161 spin_lock(&priv->indir_lock); \
162 reg_writel(priv, upper_32_bits(val), REG_DIR_DATA_WRITE); \
163 diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
164 index 561342466076..26ec2fbfaa89 100644
165 --- a/drivers/net/dsa/mv88e6xxx.c
166 +++ b/drivers/net/dsa/mv88e6xxx.c
167 @@ -1387,6 +1387,7 @@ static int mv88e6xxx_setup_port(struct dsa_switch *ds, int port)
168 reg = _mv88e6xxx_reg_read(ds, REG_PORT(port), PORT_PCS_CTRL);
169 if (dsa_is_cpu_port(ds, port) ||
170 ds->dsa_port_mask & (1 << port)) {
171 + reg &= ~PORT_PCS_CTRL_UNFORCED;
172 reg |= PORT_PCS_CTRL_FORCE_LINK |
173 PORT_PCS_CTRL_LINK_UP |
174 PORT_PCS_CTRL_DUPLEX_FULL |
175 diff --git a/drivers/net/ethernet/altera/altera_tse_main.c b/drivers/net/ethernet/altera/altera_tse_main.c
176 index da48e66377b5..8207877d6237 100644
177 --- a/drivers/net/ethernet/altera/altera_tse_main.c
178 +++ b/drivers/net/ethernet/altera/altera_tse_main.c
179 @@ -511,8 +511,7 @@ static int tse_poll(struct napi_struct *napi, int budget)
180
181 if (rxcomplete < budget) {
182
183 - napi_gro_flush(napi, false);
184 - __napi_complete(napi);
185 + napi_complete(napi);
186
187 netdev_dbg(priv->dev,
188 "NAPI Complete, did %d packets with budget %d\n",
189 diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
190 index b349e6f36ea7..de63266de16b 100644
191 --- a/drivers/net/ethernet/freescale/fec_main.c
192 +++ b/drivers/net/ethernet/freescale/fec_main.c
193 @@ -1402,6 +1402,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
194 if ((status & BD_ENET_RX_LAST) == 0)
195 netdev_err(ndev, "rcv is not +last\n");
196
197 + writel(FEC_ENET_RXF, fep->hwp + FEC_IEVENT);
198
199 /* Check for errors. */
200 if (status & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_NO |
201 diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
202 index 62e48bc0cb23..09ec32e33076 100644
203 --- a/drivers/net/ethernet/marvell/mvneta.c
204 +++ b/drivers/net/ethernet/marvell/mvneta.c
205 @@ -1479,6 +1479,7 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo,
206 struct mvneta_rx_desc *rx_desc = mvneta_rxq_next_desc_get(rxq);
207 struct sk_buff *skb;
208 unsigned char *data;
209 + dma_addr_t phys_addr;
210 u32 rx_status;
211 int rx_bytes, err;
212
213 @@ -1486,6 +1487,7 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo,
214 rx_status = rx_desc->status;
215 rx_bytes = rx_desc->data_size - (ETH_FCS_LEN + MVNETA_MH_SIZE);
216 data = (unsigned char *)rx_desc->buf_cookie;
217 + phys_addr = rx_desc->buf_phys_addr;
218
219 if (!mvneta_rxq_desc_is_first_last(rx_status) ||
220 (rx_status & MVNETA_RXD_ERR_SUMMARY)) {
221 @@ -1534,7 +1536,7 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo,
222 if (!skb)
223 goto err_drop_frame;
224
225 - dma_unmap_single(dev->dev.parent, rx_desc->buf_phys_addr,
226 + dma_unmap_single(dev->dev.parent, phys_addr,
227 MVNETA_RX_BUF_SIZE(pp->pkt_size), DMA_FROM_DEVICE);
228
229 rcvd_pkts++;
230 @@ -3027,8 +3029,8 @@ static int mvneta_probe(struct platform_device *pdev)
231 const char *dt_mac_addr;
232 char hw_mac_addr[ETH_ALEN];
233 const char *mac_from;
234 + const char *managed;
235 int phy_mode;
236 - int fixed_phy = 0;
237 int err;
238
239 /* Our multiqueue support is not complete, so for now, only
240 @@ -3062,7 +3064,6 @@ static int mvneta_probe(struct platform_device *pdev)
241 dev_err(&pdev->dev, "cannot register fixed PHY\n");
242 goto err_free_irq;
243 }
244 - fixed_phy = 1;
245
246 /* In the case of a fixed PHY, the DT node associated
247 * to the PHY is the Ethernet MAC DT node.
248 @@ -3086,8 +3087,10 @@ static int mvneta_probe(struct platform_device *pdev)
249 pp = netdev_priv(dev);
250 pp->phy_node = phy_node;
251 pp->phy_interface = phy_mode;
252 - pp->use_inband_status = (phy_mode == PHY_INTERFACE_MODE_SGMII) &&
253 - fixed_phy;
254 +
255 + err = of_property_read_string(dn, "managed", &managed);
256 + pp->use_inband_status = (err == 0 &&
257 + strcmp(managed, "in-band-status") == 0);
258
259 pp->clk = devm_clk_get(&pdev->dev, NULL);
260 if (IS_ERR(pp->clk)) {
261 diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
262 index 9c145dddd717..4f95fa7b594d 100644
263 --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
264 +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
265 @@ -1250,8 +1250,6 @@ int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv)
266 rss_context->hash_fn = MLX4_RSS_HASH_TOP;
267 memcpy(rss_context->rss_key, priv->rss_key,
268 MLX4_EN_RSS_KEY_SIZE);
269 - netdev_rss_key_fill(rss_context->rss_key,
270 - MLX4_EN_RSS_KEY_SIZE);
271 } else {
272 en_err(priv, "Unknown RSS hash function requested\n");
273 err = -EINVAL;
274 diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
275 index 29c2a017a450..a408977a531a 100644
276 --- a/drivers/net/ethernet/mellanox/mlx4/main.c
277 +++ b/drivers/net/ethernet/mellanox/mlx4/main.c
278 @@ -2654,9 +2654,14 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev)
279
280 if (msi_x) {
281 int nreq = dev->caps.num_ports * num_online_cpus() + 1;
282 + bool shared_ports = false;
283
284 nreq = min_t(int, dev->caps.num_eqs - dev->caps.reserved_eqs,
285 nreq);
286 + if (nreq > MAX_MSIX) {
287 + nreq = MAX_MSIX;
288 + shared_ports = true;
289 + }
290
291 entries = kcalloc(nreq, sizeof *entries, GFP_KERNEL);
292 if (!entries)
293 @@ -2679,6 +2684,9 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev)
294 bitmap_zero(priv->eq_table.eq[MLX4_EQ_ASYNC].actv_ports.ports,
295 dev->caps.num_ports);
296
297 + if (MLX4_IS_LEGACY_EQ_MODE(dev->caps))
298 + shared_ports = true;
299 +
300 for (i = 0; i < dev->caps.num_comp_vectors + 1; i++) {
301 if (i == MLX4_EQ_ASYNC)
302 continue;
303 @@ -2686,7 +2694,7 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev)
304 priv->eq_table.eq[i].irq =
305 entries[i + 1 - !!(i > MLX4_EQ_ASYNC)].vector;
306
307 - if (MLX4_IS_LEGACY_EQ_MODE(dev->caps)) {
308 + if (shared_ports) {
309 bitmap_fill(priv->eq_table.eq[i].actv_ports.ports,
310 dev->caps.num_ports);
311 /* We don't set affinity hint when there
312 diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
313 index edd77342773a..248478c6f6e4 100644
314 --- a/drivers/net/macvtap.c
315 +++ b/drivers/net/macvtap.c
316 @@ -1111,10 +1111,10 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
317 return 0;
318
319 case TUNSETSNDBUF:
320 - if (get_user(u, up))
321 + if (get_user(s, sp))
322 return -EFAULT;
323
324 - q->sk.sk_sndbuf = u;
325 + q->sk.sk_sndbuf = s;
326 return 0;
327
328 case TUNGETVNETHDRSZ:
329 diff --git a/drivers/net/phy/fixed_phy.c b/drivers/net/phy/fixed_phy.c
330 index d7a65247f952..99d9bc19c94a 100644
331 --- a/drivers/net/phy/fixed_phy.c
332 +++ b/drivers/net/phy/fixed_phy.c
333 @@ -52,6 +52,10 @@ static int fixed_phy_update_regs(struct fixed_phy *fp)
334 u16 lpagb = 0;
335 u16 lpa = 0;
336
337 + if (!fp->status.link)
338 + goto done;
339 + bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE;
340 +
341 if (fp->status.duplex) {
342 bmcr |= BMCR_FULLDPLX;
343
344 @@ -96,15 +100,13 @@ static int fixed_phy_update_regs(struct fixed_phy *fp)
345 }
346 }
347
348 - if (fp->status.link)
349 - bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE;
350 -
351 if (fp->status.pause)
352 lpa |= LPA_PAUSE_CAP;
353
354 if (fp->status.asym_pause)
355 lpa |= LPA_PAUSE_ASYM;
356
357 +done:
358 fp->regs[MII_PHYSID1] = 0;
359 fp->regs[MII_PHYSID2] = 0;
360
361 diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
362 index 46a14cbb0215..02a4615b65f8 100644
363 --- a/drivers/net/phy/mdio_bus.c
364 +++ b/drivers/net/phy/mdio_bus.c
365 @@ -303,12 +303,12 @@ void mdiobus_unregister(struct mii_bus *bus)
366 BUG_ON(bus->state != MDIOBUS_REGISTERED);
367 bus->state = MDIOBUS_UNREGISTERED;
368
369 - device_del(&bus->dev);
370 for (i = 0; i < PHY_MAX_ADDR; i++) {
371 if (bus->phy_map[i])
372 device_unregister(&bus->phy_map[i]->dev);
373 bus->phy_map[i] = NULL;
374 }
375 + device_del(&bus->dev);
376 }
377 EXPORT_SYMBOL(mdiobus_unregister);
378
379 diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
380 index fa8f5046afe9..487be20b6b12 100644
381 --- a/drivers/net/ppp/ppp_generic.c
382 +++ b/drivers/net/ppp/ppp_generic.c
383 @@ -2742,6 +2742,7 @@ static struct ppp *ppp_create_interface(struct net *net, int unit,
384 */
385 dev_net_set(dev, net);
386
387 + rtnl_lock();
388 mutex_lock(&pn->all_ppp_mutex);
389
390 if (unit < 0) {
391 @@ -2772,7 +2773,7 @@ static struct ppp *ppp_create_interface(struct net *net, int unit,
392 ppp->file.index = unit;
393 sprintf(dev->name, "ppp%d", unit);
394
395 - ret = register_netdev(dev);
396 + ret = register_netdevice(dev);
397 if (ret != 0) {
398 unit_put(&pn->units_idr, unit);
399 netdev_err(ppp->dev, "PPP: couldn't register device %s (%d)\n",
400 @@ -2784,6 +2785,7 @@ static struct ppp *ppp_create_interface(struct net *net, int unit,
401
402 atomic_inc(&ppp_unit_count);
403 mutex_unlock(&pn->all_ppp_mutex);
404 + rtnl_unlock();
405
406 *retp = 0;
407 return ppp;
408 diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c
409 index fdc60db60829..7c8c23cc6896 100644
410 --- a/drivers/of/of_mdio.c
411 +++ b/drivers/of/of_mdio.c
412 @@ -266,7 +266,8 @@ EXPORT_SYMBOL(of_phy_attach);
413 bool of_phy_is_fixed_link(struct device_node *np)
414 {
415 struct device_node *dn;
416 - int len;
417 + int len, err;
418 + const char *managed;
419
420 /* New binding */
421 dn = of_get_child_by_name(np, "fixed-link");
422 @@ -275,6 +276,10 @@ bool of_phy_is_fixed_link(struct device_node *np)
423 return true;
424 }
425
426 + err = of_property_read_string(np, "managed", &managed);
427 + if (err == 0 && strcmp(managed, "auto") != 0)
428 + return true;
429 +
430 /* Old binding */
431 if (of_get_property(np, "fixed-link", &len) &&
432 len == (5 * sizeof(__be32)))
433 @@ -289,8 +294,18 @@ int of_phy_register_fixed_link(struct device_node *np)
434 struct fixed_phy_status status = {};
435 struct device_node *fixed_link_node;
436 const __be32 *fixed_link_prop;
437 - int len;
438 + int len, err;
439 struct phy_device *phy;
440 + const char *managed;
441 +
442 + err = of_property_read_string(np, "managed", &managed);
443 + if (err == 0) {
444 + if (strcmp(managed, "in-band-status") == 0) {
445 + /* status is zeroed, namely its .link member */
446 + phy = fixed_phy_register(PHY_POLL, &status, np);
447 + return IS_ERR(phy) ? PTR_ERR(phy) : 0;
448 + }
449 + }
450
451 /* New binding */
452 fixed_link_node = of_get_child_by_name(np, "fixed-link");
453 diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
454 index 06697315a088..fb4dd7b3ee71 100644
455 --- a/drivers/platform/x86/hp-wmi.c
456 +++ b/drivers/platform/x86/hp-wmi.c
457 @@ -54,8 +54,9 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
458 #define HPWMI_HARDWARE_QUERY 0x4
459 #define HPWMI_WIRELESS_QUERY 0x5
460 #define HPWMI_BIOS_QUERY 0x9
461 +#define HPWMI_FEATURE_QUERY 0xb
462 #define HPWMI_HOTKEY_QUERY 0xc
463 -#define HPWMI_FEATURE_QUERY 0xd
464 +#define HPWMI_FEATURE2_QUERY 0xd
465 #define HPWMI_WIRELESS2_QUERY 0x1b
466 #define HPWMI_POSTCODEERROR_QUERY 0x2a
467
468 @@ -295,25 +296,33 @@ static int hp_wmi_tablet_state(void)
469 return (state & 0x4) ? 1 : 0;
470 }
471
472 -static int __init hp_wmi_bios_2009_later(void)
473 +static int __init hp_wmi_bios_2008_later(void)
474 {
475 int state = 0;
476 int ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, 0, &state,
477 sizeof(state), sizeof(state));
478 - if (ret)
479 - return ret;
480 + if (!ret)
481 + return 1;
482
483 - return (state & 0x10) ? 1 : 0;
484 + return (ret == HPWMI_RET_UNKNOWN_CMDTYPE) ? 0 : -ENXIO;
485 }
486
487 -static int hp_wmi_enable_hotkeys(void)
488 +static int __init hp_wmi_bios_2009_later(void)
489 {
490 - int ret;
491 - int query = 0x6e;
492 + int state = 0;
493 + int ret = hp_wmi_perform_query(HPWMI_FEATURE2_QUERY, 0, &state,
494 + sizeof(state), sizeof(state));
495 + if (!ret)
496 + return 1;
497
498 - ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &query, sizeof(query),
499 - 0);
500 + return (ret == HPWMI_RET_UNKNOWN_CMDTYPE) ? 0 : -ENXIO;
501 +}
502
503 +static int __init hp_wmi_enable_hotkeys(void)
504 +{
505 + int value = 0x6e;
506 + int ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &value,
507 + sizeof(value), 0);
508 if (ret)
509 return -EINVAL;
510 return 0;
511 @@ -663,7 +672,7 @@ static int __init hp_wmi_input_setup(void)
512 hp_wmi_tablet_state());
513 input_sync(hp_wmi_input_dev);
514
515 - if (hp_wmi_bios_2009_later() == 4)
516 + if (!hp_wmi_bios_2009_later() && hp_wmi_bios_2008_later())
517 hp_wmi_enable_hotkeys();
518
519 status = wmi_install_notify_handler(HPWMI_EVENT_GUID, hp_wmi_notify, NULL);
520 diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
521 index 1285eaf5dc22..03cdb9e18d57 100644
522 --- a/net/bridge/br_multicast.c
523 +++ b/net/bridge/br_multicast.c
524 @@ -991,7 +991,7 @@ static int br_ip4_multicast_igmp3_report(struct net_bridge *br,
525
526 ih = igmpv3_report_hdr(skb);
527 num = ntohs(ih->ngrec);
528 - len = sizeof(*ih);
529 + len = skb_transport_offset(skb) + sizeof(*ih);
530
531 for (i = 0; i < num; i++) {
532 len += sizeof(*grec);
533 @@ -1052,7 +1052,7 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br,
534
535 icmp6h = icmp6_hdr(skb);
536 num = ntohs(icmp6h->icmp6_dataun.un_data16[1]);
537 - len = sizeof(*icmp6h);
538 + len = skb_transport_offset(skb) + sizeof(*icmp6h);
539
540 for (i = 0; i < num; i++) {
541 __be16 *nsrcs, _nsrcs;
542 diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c
543 index 9a12668f7d62..0ad144fb0c79 100644
544 --- a/net/core/fib_rules.c
545 +++ b/net/core/fib_rules.c
546 @@ -615,15 +615,17 @@ static int dump_rules(struct sk_buff *skb, struct netlink_callback *cb,
547 {
548 int idx = 0;
549 struct fib_rule *rule;
550 + int err = 0;
551
552 rcu_read_lock();
553 list_for_each_entry_rcu(rule, &ops->rules_list, list) {
554 if (idx < cb->args[1])
555 goto skip;
556
557 - if (fib_nl_fill_rule(skb, rule, NETLINK_CB(cb->skb).portid,
558 - cb->nlh->nlmsg_seq, RTM_NEWRULE,
559 - NLM_F_MULTI, ops) < 0)
560 + err = fib_nl_fill_rule(skb, rule, NETLINK_CB(cb->skb).portid,
561 + cb->nlh->nlmsg_seq, RTM_NEWRULE,
562 + NLM_F_MULTI, ops);
563 + if (err)
564 break;
565 skip:
566 idx++;
567 @@ -632,7 +634,7 @@ skip:
568 cb->args[1] = idx;
569 rules_ops_put(ops);
570
571 - return skb->len;
572 + return err;
573 }
574
575 static int fib_nl_dumprule(struct sk_buff *skb, struct netlink_callback *cb)
576 @@ -648,7 +650,9 @@ static int fib_nl_dumprule(struct sk_buff *skb, struct netlink_callback *cb)
577 if (ops == NULL)
578 return -EAFNOSUPPORT;
579
580 - return dump_rules(skb, cb, ops);
581 + dump_rules(skb, cb, ops);
582 +
583 + return skb->len;
584 }
585
586 rcu_read_lock();
587 diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
588 index dc004b1e1f85..0861018be708 100644
589 --- a/net/core/rtnetlink.c
590 +++ b/net/core/rtnetlink.c
591 @@ -3021,6 +3021,7 @@ static int rtnl_bridge_getlink(struct sk_buff *skb, struct netlink_callback *cb)
592 u32 portid = NETLINK_CB(cb->skb).portid;
593 u32 seq = cb->nlh->nlmsg_seq;
594 u32 filter_mask = 0;
595 + int err;
596
597 if (nlmsg_len(cb->nlh) > sizeof(struct ifinfomsg)) {
598 struct nlattr *extfilt;
599 @@ -3041,20 +3042,25 @@ static int rtnl_bridge_getlink(struct sk_buff *skb, struct netlink_callback *cb)
600 struct net_device *br_dev = netdev_master_upper_dev_get(dev);
601
602 if (br_dev && br_dev->netdev_ops->ndo_bridge_getlink) {
603 - if (idx >= cb->args[0] &&
604 - br_dev->netdev_ops->ndo_bridge_getlink(
605 - skb, portid, seq, dev, filter_mask,
606 - NLM_F_MULTI) < 0)
607 - break;
608 + if (idx >= cb->args[0]) {
609 + err = br_dev->netdev_ops->ndo_bridge_getlink(
610 + skb, portid, seq, dev,
611 + filter_mask, NLM_F_MULTI);
612 + if (err < 0 && err != -EOPNOTSUPP)
613 + break;
614 + }
615 idx++;
616 }
617
618 if (ops->ndo_bridge_getlink) {
619 - if (idx >= cb->args[0] &&
620 - ops->ndo_bridge_getlink(skb, portid, seq, dev,
621 - filter_mask,
622 - NLM_F_MULTI) < 0)
623 - break;
624 + if (idx >= cb->args[0]) {
625 + err = ops->ndo_bridge_getlink(skb, portid,
626 + seq, dev,
627 + filter_mask,
628 + NLM_F_MULTI);
629 + if (err < 0 && err != -EOPNOTSUPP)
630 + break;
631 + }
632 idx++;
633 }
634 }
635 diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c
636 index d79866c5f8bc..817622f3dbb7 100644
637 --- a/net/core/sock_diag.c
638 +++ b/net/core/sock_diag.c
639 @@ -90,6 +90,9 @@ int sock_diag_put_filterinfo(bool may_report_filterinfo, struct sock *sk,
640 goto out;
641
642 fprog = filter->prog->orig_prog;
643 + if (!fprog)
644 + goto out;
645 +
646 flen = bpf_classic_proglen(fprog);
647
648 attr = nla_reserve(skb, attrtype, flen);
649 diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
650 index b1c218df2c85..b7dedd9d36d8 100644
651 --- a/net/ipv4/tcp_output.c
652 +++ b/net/ipv4/tcp_output.c
653 @@ -2898,6 +2898,7 @@ void tcp_send_active_reset(struct sock *sk, gfp_t priority)
654 skb_reserve(skb, MAX_TCP_HEADER);
655 tcp_init_nondata_skb(skb, tcp_acceptable_seq(sk),
656 TCPHDR_ACK | TCPHDR_RST);
657 + skb_mstamp_get(&skb->skb_mstamp);
658 /* Send it off. */
659 if (tcp_transmit_skb(sk, skb, 0, priority))
660 NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTFAILED);
661 diff --git a/net/ipv6/exthdrs_offload.c b/net/ipv6/exthdrs_offload.c
662 index 447a7fbd1bb6..f5e2ba1c18bf 100644
663 --- a/net/ipv6/exthdrs_offload.c
664 +++ b/net/ipv6/exthdrs_offload.c
665 @@ -36,6 +36,6 @@ out:
666 return ret;
667
668 out_rt:
669 - inet_del_offload(&rthdr_offload, IPPROTO_ROUTING);
670 + inet6_del_offload(&rthdr_offload, IPPROTO_ROUTING);
671 goto out;
672 }
673 diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
674 index 74ceb73c1c9a..5f36266b1f5e 100644
675 --- a/net/ipv6/ip6mr.c
676 +++ b/net/ipv6/ip6mr.c
677 @@ -550,7 +550,7 @@ static void ipmr_mfc_seq_stop(struct seq_file *seq, void *v)
678
679 if (it->cache == &mrt->mfc6_unres_queue)
680 spin_unlock_bh(&mfc_unres_lock);
681 - else if (it->cache == mrt->mfc6_cache_array)
682 + else if (it->cache == &mrt->mfc6_cache_array[it->ct])
683 read_unlock(&mrt_lock);
684 }
685
686 diff --git a/net/ipv6/route.c b/net/ipv6/route.c
687 index d15586490cec..00b64d402a57 100644
688 --- a/net/ipv6/route.c
689 +++ b/net/ipv6/route.c
690 @@ -1727,7 +1727,7 @@ static int ip6_convert_metrics(struct mx6_config *mxc,
691 return -EINVAL;
692 }
693
694 -int ip6_route_add(struct fib6_config *cfg)
695 +int ip6_route_info_create(struct fib6_config *cfg, struct rt6_info **rt_ret)
696 {
697 int err;
698 struct net *net = cfg->fc_nlinfo.nl_net;
699 @@ -1735,7 +1735,6 @@ int ip6_route_add(struct fib6_config *cfg)
700 struct net_device *dev = NULL;
701 struct inet6_dev *idev = NULL;
702 struct fib6_table *table;
703 - struct mx6_config mxc = { .mx = NULL, };
704 int addr_type;
705
706 if (cfg->fc_dst_len > 128 || cfg->fc_src_len > 128)
707 @@ -1941,6 +1940,32 @@ install_route:
708
709 cfg->fc_nlinfo.nl_net = dev_net(dev);
710
711 + *rt_ret = rt;
712 +
713 + return 0;
714 +out:
715 + if (dev)
716 + dev_put(dev);
717 + if (idev)
718 + in6_dev_put(idev);
719 + if (rt)
720 + dst_free(&rt->dst);
721 +
722 + *rt_ret = NULL;
723 +
724 + return err;
725 +}
726 +
727 +int ip6_route_add(struct fib6_config *cfg)
728 +{
729 + struct mx6_config mxc = { .mx = NULL, };
730 + struct rt6_info *rt = NULL;
731 + int err;
732 +
733 + err = ip6_route_info_create(cfg, &rt);
734 + if (err)
735 + goto out;
736 +
737 err = ip6_convert_metrics(&mxc, cfg);
738 if (err)
739 goto out;
740 @@ -1948,14 +1973,12 @@ install_route:
741 err = __ip6_ins_rt(rt, &cfg->fc_nlinfo, &mxc);
742
743 kfree(mxc.mx);
744 +
745 return err;
746 out:
747 - if (dev)
748 - dev_put(dev);
749 - if (idev)
750 - in6_dev_put(idev);
751 if (rt)
752 dst_free(&rt->dst);
753 +
754 return err;
755 }
756
757 @@ -2727,19 +2750,78 @@ errout:
758 return err;
759 }
760
761 -static int ip6_route_multipath(struct fib6_config *cfg, int add)
762 +struct rt6_nh {
763 + struct rt6_info *rt6_info;
764 + struct fib6_config r_cfg;
765 + struct mx6_config mxc;
766 + struct list_head next;
767 +};
768 +
769 +static void ip6_print_replace_route_err(struct list_head *rt6_nh_list)
770 +{
771 + struct rt6_nh *nh;
772 +
773 + list_for_each_entry(nh, rt6_nh_list, next) {
774 + pr_warn("IPV6: multipath route replace failed (check consistency of installed routes): %pI6 nexthop %pI6 ifi %d\n",
775 + &nh->r_cfg.fc_dst, &nh->r_cfg.fc_gateway,
776 + nh->r_cfg.fc_ifindex);
777 + }
778 +}
779 +
780 +static int ip6_route_info_append(struct list_head *rt6_nh_list,
781 + struct rt6_info *rt, struct fib6_config *r_cfg)
782 +{
783 + struct rt6_nh *nh;
784 + struct rt6_info *rtnh;
785 + int err = -EEXIST;
786 +
787 + list_for_each_entry(nh, rt6_nh_list, next) {
788 + /* check if rt6_info already exists */
789 + rtnh = nh->rt6_info;
790 +
791 + if (rtnh->dst.dev == rt->dst.dev &&
792 + rtnh->rt6i_idev == rt->rt6i_idev &&
793 + ipv6_addr_equal(&rtnh->rt6i_gateway,
794 + &rt->rt6i_gateway))
795 + return err;
796 + }
797 +
798 + nh = kzalloc(sizeof(*nh), GFP_KERNEL);
799 + if (!nh)
800 + return -ENOMEM;
801 + nh->rt6_info = rt;
802 + err = ip6_convert_metrics(&nh->mxc, r_cfg);
803 + if (err) {
804 + kfree(nh);
805 + return err;
806 + }
807 + memcpy(&nh->r_cfg, r_cfg, sizeof(*r_cfg));
808 + list_add_tail(&nh->next, rt6_nh_list);
809 +
810 + return 0;
811 +}
812 +
813 +static int ip6_route_multipath_add(struct fib6_config *cfg)
814 {
815 struct fib6_config r_cfg;
816 struct rtnexthop *rtnh;
817 + struct rt6_info *rt;
818 + struct rt6_nh *err_nh;
819 + struct rt6_nh *nh, *nh_safe;
820 int remaining;
821 int attrlen;
822 - int err = 0, last_err = 0;
823 + int err = 1;
824 + int nhn = 0;
825 + int replace = (cfg->fc_nlinfo.nlh &&
826 + (cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_REPLACE));
827 + LIST_HEAD(rt6_nh_list);
828
829 remaining = cfg->fc_mp_len;
830 -beginning:
831 rtnh = (struct rtnexthop *)cfg->fc_mp;
832
833 - /* Parse a Multipath Entry */
834 + /* Parse a Multipath Entry and build a list (rt6_nh_list) of
835 + * rt6_info structs per nexthop
836 + */
837 while (rtnh_ok(rtnh, remaining)) {
838 memcpy(&r_cfg, cfg, sizeof(*cfg));
839 if (rtnh->rtnh_ifindex)
840 @@ -2755,22 +2837,32 @@ beginning:
841 r_cfg.fc_flags |= RTF_GATEWAY;
842 }
843 }
844 - err = add ? ip6_route_add(&r_cfg) : ip6_route_del(&r_cfg);
845 +
846 + err = ip6_route_info_create(&r_cfg, &rt);
847 + if (err)
848 + goto cleanup;
849 +
850 + err = ip6_route_info_append(&rt6_nh_list, rt, &r_cfg);
851 if (err) {
852 - last_err = err;
853 - /* If we are trying to remove a route, do not stop the
854 - * loop when ip6_route_del() fails (because next hop is
855 - * already gone), we should try to remove all next hops.
856 - */
857 - if (add) {
858 - /* If add fails, we should try to delete all
859 - * next hops that have been already added.
860 - */
861 - add = 0;
862 - remaining = cfg->fc_mp_len - remaining;
863 - goto beginning;
864 - }
865 + dst_free(&rt->dst);
866 + goto cleanup;
867 + }
868 +
869 + rtnh = rtnh_next(rtnh, &remaining);
870 + }
871 +
872 + err_nh = NULL;
873 + list_for_each_entry(nh, &rt6_nh_list, next) {
874 + err = __ip6_ins_rt(nh->rt6_info, &cfg->fc_nlinfo, &nh->mxc);
875 + /* nh->rt6_info is used or freed at this point, reset to NULL*/
876 + nh->rt6_info = NULL;
877 + if (err) {
878 + if (replace && nhn)
879 + ip6_print_replace_route_err(&rt6_nh_list);
880 + err_nh = nh;
881 + goto add_errout;
882 }
883 +
884 /* Because each route is added like a single route we remove
885 * these flags after the first nexthop: if there is a collision,
886 * we have already failed to add the first nexthop:
887 @@ -2780,6 +2872,63 @@ beginning:
888 */
889 cfg->fc_nlinfo.nlh->nlmsg_flags &= ~(NLM_F_EXCL |
890 NLM_F_REPLACE);
891 + nhn++;
892 + }
893 +
894 + goto cleanup;
895 +
896 +add_errout:
897 + /* Delete routes that were already added */
898 + list_for_each_entry(nh, &rt6_nh_list, next) {
899 + if (err_nh == nh)
900 + break;
901 + ip6_route_del(&nh->r_cfg);
902 + }
903 +
904 +cleanup:
905 + list_for_each_entry_safe(nh, nh_safe, &rt6_nh_list, next) {
906 + if (nh->rt6_info)
907 + dst_free(&nh->rt6_info->dst);
908 + if (nh->mxc.mx)
909 + kfree(nh->mxc.mx);
910 + list_del(&nh->next);
911 + kfree(nh);
912 + }
913 +
914 + return err;
915 +}
916 +
917 +static int ip6_route_multipath_del(struct fib6_config *cfg)
918 +{
919 + struct fib6_config r_cfg;
920 + struct rtnexthop *rtnh;
921 + int remaining;
922 + int attrlen;
923 + int err = 1, last_err = 0;
924 +
925 + remaining = cfg->fc_mp_len;
926 + rtnh = (struct rtnexthop *)cfg->fc_mp;
927 +
928 + /* Parse a Multipath Entry */
929 + while (rtnh_ok(rtnh, remaining)) {
930 + memcpy(&r_cfg, cfg, sizeof(*cfg));
931 + if (rtnh->rtnh_ifindex)
932 + r_cfg.fc_ifindex = rtnh->rtnh_ifindex;
933 +
934 + attrlen = rtnh_attrlen(rtnh);
935 + if (attrlen > 0) {
936 + struct nlattr *nla, *attrs = rtnh_attrs(rtnh);
937 +
938 + nla = nla_find(attrs, attrlen, RTA_GATEWAY);
939 + if (nla) {
940 + nla_memcpy(&r_cfg.fc_gateway, nla, 16);
941 + r_cfg.fc_flags |= RTF_GATEWAY;
942 + }
943 + }
944 + err = ip6_route_del(&r_cfg);
945 + if (err)
946 + last_err = err;
947 +
948 rtnh = rtnh_next(rtnh, &remaining);
949 }
950
951 @@ -2796,7 +2945,7 @@ static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh)
952 return err;
953
954 if (cfg.fc_mp)
955 - return ip6_route_multipath(&cfg, 0);
956 + return ip6_route_multipath_del(&cfg);
957 else
958 return ip6_route_del(&cfg);
959 }
960 @@ -2811,7 +2960,7 @@ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh)
961 return err;
962
963 if (cfg.fc_mp)
964 - return ip6_route_multipath(&cfg, 1);
965 + return ip6_route_multipath_add(&cfg);
966 else
967 return ip6_route_add(&cfg);
968 }
969 diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
970 index a774985489e2..0857f7243797 100644
971 --- a/net/netlink/af_netlink.c
972 +++ b/net/netlink/af_netlink.c
973 @@ -124,6 +124,24 @@ static inline u32 netlink_group_mask(u32 group)
974 return group ? 1 << (group - 1) : 0;
975 }
976
977 +static struct sk_buff *netlink_to_full_skb(const struct sk_buff *skb,
978 + gfp_t gfp_mask)
979 +{
980 + unsigned int len = skb_end_offset(skb);
981 + struct sk_buff *new;
982 +
983 + new = alloc_skb(len, gfp_mask);
984 + if (new == NULL)
985 + return NULL;
986 +
987 + NETLINK_CB(new).portid = NETLINK_CB(skb).portid;
988 + NETLINK_CB(new).dst_group = NETLINK_CB(skb).dst_group;
989 + NETLINK_CB(new).creds = NETLINK_CB(skb).creds;
990 +
991 + memcpy(skb_put(new, len), skb->data, len);
992 + return new;
993 +}
994 +
995 int netlink_add_tap(struct netlink_tap *nt)
996 {
997 if (unlikely(nt->dev->type != ARPHRD_NETLINK))
998 @@ -205,7 +223,11 @@ static int __netlink_deliver_tap_skb(struct sk_buff *skb,
999 int ret = -ENOMEM;
1000
1001 dev_hold(dev);
1002 - nskb = skb_clone(skb, GFP_ATOMIC);
1003 +
1004 + if (netlink_skb_is_mmaped(skb) || is_vmalloc_addr(skb->head))
1005 + nskb = netlink_to_full_skb(skb, GFP_ATOMIC);
1006 + else
1007 + nskb = skb_clone(skb, GFP_ATOMIC);
1008 if (nskb) {
1009 nskb->dev = dev;
1010 nskb->protocol = htons((u16) sk->sk_protocol);
1011 @@ -278,11 +300,6 @@ static void netlink_rcv_wake(struct sock *sk)
1012 }
1013
1014 #ifdef CONFIG_NETLINK_MMAP
1015 -static bool netlink_skb_is_mmaped(const struct sk_buff *skb)
1016 -{
1017 - return NETLINK_CB(skb).flags & NETLINK_SKB_MMAPED;
1018 -}
1019 -
1020 static bool netlink_rx_is_mmaped(struct sock *sk)
1021 {
1022 return nlk_sk(sk)->rx_ring.pg_vec != NULL;
1023 @@ -834,7 +851,6 @@ static void netlink_ring_set_copied(struct sock *sk, struct sk_buff *skb)
1024 }
1025
1026 #else /* CONFIG_NETLINK_MMAP */
1027 -#define netlink_skb_is_mmaped(skb) false
1028 #define netlink_rx_is_mmaped(sk) false
1029 #define netlink_tx_is_mmaped(sk) false
1030 #define netlink_mmap sock_no_mmap
1031 @@ -1082,8 +1098,8 @@ static int netlink_insert(struct sock *sk, u32 portid)
1032
1033 lock_sock(sk);
1034
1035 - err = -EBUSY;
1036 - if (nlk_sk(sk)->portid)
1037 + err = nlk_sk(sk)->portid == portid ? 0 : -EBUSY;
1038 + if (nlk_sk(sk)->bound)
1039 goto err;
1040
1041 err = -ENOMEM;
1042 @@ -1103,10 +1119,14 @@ static int netlink_insert(struct sock *sk, u32 portid)
1043 err = -EOVERFLOW;
1044 if (err == -EEXIST)
1045 err = -EADDRINUSE;
1046 - nlk_sk(sk)->portid = 0;
1047 sock_put(sk);
1048 + goto err;
1049 }
1050
1051 + /* We need to ensure that the socket is hashed and visible. */
1052 + smp_wmb();
1053 + nlk_sk(sk)->bound = portid;
1054 +
1055 err:
1056 release_sock(sk);
1057 return err;
1058 @@ -1491,6 +1511,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
1059 struct sockaddr_nl *nladdr = (struct sockaddr_nl *)addr;
1060 int err;
1061 long unsigned int groups = nladdr->nl_groups;
1062 + bool bound;
1063
1064 if (addr_len < sizeof(struct sockaddr_nl))
1065 return -EINVAL;
1066 @@ -1507,9 +1528,14 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
1067 return err;
1068 }
1069
1070 - if (nlk->portid)
1071 + bound = nlk->bound;
1072 + if (bound) {
1073 + /* Ensure nlk->portid is up-to-date. */
1074 + smp_rmb();
1075 +
1076 if (nladdr->nl_pid != nlk->portid)
1077 return -EINVAL;
1078 + }
1079
1080 if (nlk->netlink_bind && groups) {
1081 int group;
1082 @@ -1525,7 +1551,10 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
1083 }
1084 }
1085
1086 - if (!nlk->portid) {
1087 + /* No need for barriers here as we return to user-space without
1088 + * using any of the bound attributes.
1089 + */
1090 + if (!bound) {
1091 err = nladdr->nl_pid ?
1092 netlink_insert(sk, nladdr->nl_pid) :
1093 netlink_autobind(sock);
1094 @@ -1573,7 +1602,10 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr,
1095 !netlink_allowed(sock, NL_CFG_F_NONROOT_SEND))
1096 return -EPERM;
1097
1098 - if (!nlk->portid)
1099 + /* No need for barriers here as we return to user-space without
1100 + * using any of the bound attributes.
1101 + */
1102 + if (!nlk->bound)
1103 err = netlink_autobind(sock);
1104
1105 if (err == 0) {
1106 @@ -2391,10 +2423,13 @@ static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
1107 dst_group = nlk->dst_group;
1108 }
1109
1110 - if (!nlk->portid) {
1111 + if (!nlk->bound) {
1112 err = netlink_autobind(sock);
1113 if (err)
1114 goto out;
1115 + } else {
1116 + /* Ensure nlk is hashed and visible. */
1117 + smp_rmb();
1118 }
1119
1120 /* It's a really convoluted way for userland to ask for mmaped
1121 diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h
1122 index 89008405d6b4..14437d9b1965 100644
1123 --- a/net/netlink/af_netlink.h
1124 +++ b/net/netlink/af_netlink.h
1125 @@ -35,6 +35,7 @@ struct netlink_sock {
1126 unsigned long state;
1127 size_t max_recvmsg_len;
1128 wait_queue_head_t wait;
1129 + bool bound;
1130 bool cb_running;
1131 struct netlink_callback cb;
1132 struct mutex *cb_mutex;
1133 @@ -59,6 +60,15 @@ static inline struct netlink_sock *nlk_sk(struct sock *sk)
1134 return container_of(sk, struct netlink_sock, sk);
1135 }
1136
1137 +static inline bool netlink_skb_is_mmaped(const struct sk_buff *skb)
1138 +{
1139 +#ifdef CONFIG_NETLINK_MMAP
1140 + return NETLINK_CB(skb).flags & NETLINK_SKB_MMAPED;
1141 +#else
1142 + return false;
1143 +#endif /* CONFIG_NETLINK_MMAP */
1144 +}
1145 +
1146 struct netlink_table {
1147 struct rhashtable hash;
1148 struct hlist_head mc_list;
1149 diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
1150 index ff8c4a4c1609..ff332d1b94bc 100644
1151 --- a/net/openvswitch/datapath.c
1152 +++ b/net/openvswitch/datapath.c
1153 @@ -920,7 +920,7 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)
1154 if (error)
1155 goto err_kfree_flow;
1156
1157 - ovs_flow_mask_key(&new_flow->key, &key, &mask);
1158 + ovs_flow_mask_key(&new_flow->key, &key, true, &mask);
1159
1160 /* Extract flow identifier. */
1161 error = ovs_nla_get_identifier(&new_flow->id, a[OVS_FLOW_ATTR_UFID],
1162 @@ -1047,7 +1047,7 @@ static struct sw_flow_actions *get_flow_actions(const struct nlattr *a,
1163 struct sw_flow_key masked_key;
1164 int error;
1165
1166 - ovs_flow_mask_key(&masked_key, key, mask);
1167 + ovs_flow_mask_key(&masked_key, key, true, mask);
1168 error = ovs_nla_copy_actions(a, &masked_key, &acts, log);
1169 if (error) {
1170 OVS_NLERR(log,
1171 diff --git a/net/openvswitch/flow_table.c b/net/openvswitch/flow_table.c
1172 index 65523948fb95..b5c3bba87fc8 100644
1173 --- a/net/openvswitch/flow_table.c
1174 +++ b/net/openvswitch/flow_table.c
1175 @@ -56,20 +56,21 @@ static u16 range_n_bytes(const struct sw_flow_key_range *range)
1176 }
1177
1178 void ovs_flow_mask_key(struct sw_flow_key *dst, const struct sw_flow_key *src,
1179 - const struct sw_flow_mask *mask)
1180 + bool full, const struct sw_flow_mask *mask)
1181 {
1182 - const long *m = (const long *)((const u8 *)&mask->key +
1183 - mask->range.start);
1184 - const long *s = (const long *)((const u8 *)src +
1185 - mask->range.start);
1186 - long *d = (long *)((u8 *)dst + mask->range.start);
1187 + int start = full ? 0 : mask->range.start;
1188 + int len = full ? sizeof *dst : range_n_bytes(&mask->range);
1189 + const long *m = (const long *)((const u8 *)&mask->key + start);
1190 + const long *s = (const long *)((const u8 *)src + start);
1191 + long *d = (long *)((u8 *)dst + start);
1192 int i;
1193
1194 - /* The memory outside of the 'mask->range' are not set since
1195 - * further operations on 'dst' only uses contents within
1196 - * 'mask->range'.
1197 + /* If 'full' is true then all of 'dst' is fully initialized. Otherwise,
1198 + * if 'full' is false the memory outside of the 'mask->range' is left
1199 + * uninitialized. This can be used as an optimization when further
1200 + * operations on 'dst' only use contents within 'mask->range'.
1201 */
1202 - for (i = 0; i < range_n_bytes(&mask->range); i += sizeof(long))
1203 + for (i = 0; i < len; i += sizeof(long))
1204 *d++ = *s++ & *m++;
1205 }
1206
1207 @@ -473,7 +474,7 @@ static struct sw_flow *masked_flow_lookup(struct table_instance *ti,
1208 u32 hash;
1209 struct sw_flow_key masked_key;
1210
1211 - ovs_flow_mask_key(&masked_key, unmasked, mask);
1212 + ovs_flow_mask_key(&masked_key, unmasked, false, mask);
1213 hash = flow_hash(&masked_key, &mask->range);
1214 head = find_bucket(ti, hash);
1215 hlist_for_each_entry_rcu(flow, head, flow_table.node[ti->node_ver]) {
1216 diff --git a/net/openvswitch/flow_table.h b/net/openvswitch/flow_table.h
1217 index 616eda10d955..2dd9900f533d 100644
1218 --- a/net/openvswitch/flow_table.h
1219 +++ b/net/openvswitch/flow_table.h
1220 @@ -86,5 +86,5 @@ struct sw_flow *ovs_flow_tbl_lookup_ufid(struct flow_table *,
1221 bool ovs_flow_cmp(const struct sw_flow *, const struct sw_flow_match *);
1222
1223 void ovs_flow_mask_key(struct sw_flow_key *dst, const struct sw_flow_key *src,
1224 - const struct sw_flow_mask *mask);
1225 + bool full, const struct sw_flow_mask *mask);
1226 #endif /* flow_table.h */
1227 diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
1228 index ed458b315ef4..7851b1222a36 100644
1229 --- a/net/packet/af_packet.c
1230 +++ b/net/packet/af_packet.c
1231 @@ -229,6 +229,8 @@ struct packet_skb_cb {
1232 } sa;
1233 };
1234
1235 +#define vio_le() virtio_legacy_is_little_endian()
1236 +
1237 #define PACKET_SKB_CB(__skb) ((struct packet_skb_cb *)((__skb)->cb))
1238
1239 #define GET_PBDQC_FROM_RB(x) ((struct tpacket_kbdq_core *)(&(x)->prb_bdqc))
1240 @@ -2561,15 +2563,15 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
1241 goto out_unlock;
1242
1243 if ((vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) &&
1244 - (__virtio16_to_cpu(false, vnet_hdr.csum_start) +
1245 - __virtio16_to_cpu(false, vnet_hdr.csum_offset) + 2 >
1246 - __virtio16_to_cpu(false, vnet_hdr.hdr_len)))
1247 - vnet_hdr.hdr_len = __cpu_to_virtio16(false,
1248 - __virtio16_to_cpu(false, vnet_hdr.csum_start) +
1249 - __virtio16_to_cpu(false, vnet_hdr.csum_offset) + 2);
1250 + (__virtio16_to_cpu(vio_le(), vnet_hdr.csum_start) +
1251 + __virtio16_to_cpu(vio_le(), vnet_hdr.csum_offset) + 2 >
1252 + __virtio16_to_cpu(vio_le(), vnet_hdr.hdr_len)))
1253 + vnet_hdr.hdr_len = __cpu_to_virtio16(vio_le(),
1254 + __virtio16_to_cpu(vio_le(), vnet_hdr.csum_start) +
1255 + __virtio16_to_cpu(vio_le(), vnet_hdr.csum_offset) + 2);
1256
1257 err = -EINVAL;
1258 - if (__virtio16_to_cpu(false, vnet_hdr.hdr_len) > len)
1259 + if (__virtio16_to_cpu(vio_le(), vnet_hdr.hdr_len) > len)
1260 goto out_unlock;
1261
1262 if (vnet_hdr.gso_type != VIRTIO_NET_HDR_GSO_NONE) {
1263 @@ -2612,7 +2614,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
1264 hlen = LL_RESERVED_SPACE(dev);
1265 tlen = dev->needed_tailroom;
1266 skb = packet_alloc_skb(sk, hlen + tlen, hlen, len,
1267 - __virtio16_to_cpu(false, vnet_hdr.hdr_len),
1268 + __virtio16_to_cpu(vio_le(), vnet_hdr.hdr_len),
1269 msg->msg_flags & MSG_DONTWAIT, &err);
1270 if (skb == NULL)
1271 goto out_unlock;
1272 @@ -2659,8 +2661,8 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
1273
1274 if (po->has_vnet_hdr) {
1275 if (vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
1276 - u16 s = __virtio16_to_cpu(false, vnet_hdr.csum_start);
1277 - u16 o = __virtio16_to_cpu(false, vnet_hdr.csum_offset);
1278 + u16 s = __virtio16_to_cpu(vio_le(), vnet_hdr.csum_start);
1279 + u16 o = __virtio16_to_cpu(vio_le(), vnet_hdr.csum_offset);
1280 if (!skb_partial_csum_set(skb, s, o)) {
1281 err = -EINVAL;
1282 goto out_free;
1283 @@ -2668,7 +2670,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
1284 }
1285
1286 skb_shinfo(skb)->gso_size =
1287 - __virtio16_to_cpu(false, vnet_hdr.gso_size);
1288 + __virtio16_to_cpu(vio_le(), vnet_hdr.gso_size);
1289 skb_shinfo(skb)->gso_type = gso_type;
1290
1291 /* Header must be checked, and gso_segs computed. */
1292 @@ -3042,9 +3044,9 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
1293
1294 /* This is a hint as to how much should be linear. */
1295 vnet_hdr.hdr_len =
1296 - __cpu_to_virtio16(false, skb_headlen(skb));
1297 + __cpu_to_virtio16(vio_le(), skb_headlen(skb));
1298 vnet_hdr.gso_size =
1299 - __cpu_to_virtio16(false, sinfo->gso_size);
1300 + __cpu_to_virtio16(vio_le(), sinfo->gso_size);
1301 if (sinfo->gso_type & SKB_GSO_TCPV4)
1302 vnet_hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
1303 else if (sinfo->gso_type & SKB_GSO_TCPV6)
1304 @@ -3062,9 +3064,9 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
1305
1306 if (skb->ip_summed == CHECKSUM_PARTIAL) {
1307 vnet_hdr.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
1308 - vnet_hdr.csum_start = __cpu_to_virtio16(false,
1309 + vnet_hdr.csum_start = __cpu_to_virtio16(vio_le(),
1310 skb_checksum_start_offset(skb));
1311 - vnet_hdr.csum_offset = __cpu_to_virtio16(false,
1312 + vnet_hdr.csum_offset = __cpu_to_virtio16(vio_le(),
1313 skb->csum_offset);
1314 } else if (skb->ip_summed == CHECKSUM_UNNECESSARY) {
1315 vnet_hdr.flags = VIRTIO_NET_HDR_F_DATA_VALID;
1316 diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c
1317 index 715e01e5910a..f23a3b68bba6 100644
1318 --- a/net/sched/cls_fw.c
1319 +++ b/net/sched/cls_fw.c
1320 @@ -33,7 +33,6 @@
1321
1322 struct fw_head {
1323 u32 mask;
1324 - bool mask_set;
1325 struct fw_filter __rcu *ht[HTSIZE];
1326 struct rcu_head rcu;
1327 };
1328 @@ -84,7 +83,7 @@ static int fw_classify(struct sk_buff *skb, const struct tcf_proto *tp,
1329 }
1330 }
1331 } else {
1332 - /* old method */
1333 + /* Old method: classify the packet using its skb mark. */
1334 if (id && (TC_H_MAJ(id) == 0 ||
1335 !(TC_H_MAJ(id ^ tp->q->handle)))) {
1336 res->classid = id;
1337 @@ -114,14 +113,9 @@ static unsigned long fw_get(struct tcf_proto *tp, u32 handle)
1338
1339 static int fw_init(struct tcf_proto *tp)
1340 {
1341 - struct fw_head *head;
1342 -
1343 - head = kzalloc(sizeof(struct fw_head), GFP_KERNEL);
1344 - if (head == NULL)
1345 - return -ENOBUFS;
1346 -
1347 - head->mask_set = false;
1348 - rcu_assign_pointer(tp->root, head);
1349 + /* We don't allocate fw_head here, because in the old method
1350 + * we don't need it at all.
1351 + */
1352 return 0;
1353 }
1354
1355 @@ -252,7 +246,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb,
1356 int err;
1357
1358 if (!opt)
1359 - return handle ? -EINVAL : 0;
1360 + return handle ? -EINVAL : 0; /* Succeed if it is old method. */
1361
1362 err = nla_parse_nested(tb, TCA_FW_MAX, opt, fw_policy);
1363 if (err < 0)
1364 @@ -302,11 +296,17 @@ static int fw_change(struct net *net, struct sk_buff *in_skb,
1365 if (!handle)
1366 return -EINVAL;
1367
1368 - if (!head->mask_set) {
1369 - head->mask = 0xFFFFFFFF;
1370 + if (!head) {
1371 + u32 mask = 0xFFFFFFFF;
1372 if (tb[TCA_FW_MASK])
1373 - head->mask = nla_get_u32(tb[TCA_FW_MASK]);
1374 - head->mask_set = true;
1375 + mask = nla_get_u32(tb[TCA_FW_MASK]);
1376 +
1377 + head = kzalloc(sizeof(*head), GFP_KERNEL);
1378 + if (!head)
1379 + return -ENOBUFS;
1380 + head->mask = mask;
1381 +
1382 + rcu_assign_pointer(tp->root, head);
1383 }
1384
1385 f = kzalloc(sizeof(struct fw_filter), GFP_KERNEL);
1386 diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
1387 index 59e80356672b..3ac604f96da0 100644
1388 --- a/net/sctp/protocol.c
1389 +++ b/net/sctp/protocol.c
1390 @@ -1166,7 +1166,7 @@ static void sctp_v4_del_protocol(void)
1391 unregister_inetaddr_notifier(&sctp_inetaddr_notifier);
1392 }
1393
1394 -static int __net_init sctp_net_init(struct net *net)
1395 +static int __net_init sctp_defaults_init(struct net *net)
1396 {
1397 int status;
1398
1399 @@ -1259,12 +1259,6 @@ static int __net_init sctp_net_init(struct net *net)
1400
1401 sctp_dbg_objcnt_init(net);
1402
1403 - /* Initialize the control inode/socket for handling OOTB packets. */
1404 - if ((status = sctp_ctl_sock_init(net))) {
1405 - pr_err("Failed to initialize the SCTP control sock\n");
1406 - goto err_ctl_sock_init;
1407 - }
1408 -
1409 /* Initialize the local address list. */
1410 INIT_LIST_HEAD(&net->sctp.local_addr_list);
1411 spin_lock_init(&net->sctp.local_addr_lock);
1412 @@ -1280,9 +1274,6 @@ static int __net_init sctp_net_init(struct net *net)
1413
1414 return 0;
1415
1416 -err_ctl_sock_init:
1417 - sctp_dbg_objcnt_exit(net);
1418 - sctp_proc_exit(net);
1419 err_init_proc:
1420 cleanup_sctp_mibs(net);
1421 err_init_mibs:
1422 @@ -1291,15 +1282,12 @@ err_sysctl_register:
1423 return status;
1424 }
1425
1426 -static void __net_exit sctp_net_exit(struct net *net)
1427 +static void __net_exit sctp_defaults_exit(struct net *net)
1428 {
1429 /* Free the local address list */
1430 sctp_free_addr_wq(net);
1431 sctp_free_local_addr_list(net);
1432
1433 - /* Free the control endpoint. */
1434 - inet_ctl_sock_destroy(net->sctp.ctl_sock);
1435 -
1436 sctp_dbg_objcnt_exit(net);
1437
1438 sctp_proc_exit(net);
1439 @@ -1307,9 +1295,32 @@ static void __net_exit sctp_net_exit(struct net *net)
1440 sctp_sysctl_net_unregister(net);
1441 }
1442
1443 -static struct pernet_operations sctp_net_ops = {
1444 - .init = sctp_net_init,
1445 - .exit = sctp_net_exit,
1446 +static struct pernet_operations sctp_defaults_ops = {
1447 + .init = sctp_defaults_init,
1448 + .exit = sctp_defaults_exit,
1449 +};
1450 +
1451 +static int __net_init sctp_ctrlsock_init(struct net *net)
1452 +{
1453 + int status;
1454 +
1455 + /* Initialize the control inode/socket for handling OOTB packets. */
1456 + status = sctp_ctl_sock_init(net);
1457 + if (status)
1458 + pr_err("Failed to initialize the SCTP control sock\n");
1459 +
1460 + return status;
1461 +}
1462 +
1463 +static void __net_init sctp_ctrlsock_exit(struct net *net)
1464 +{
1465 + /* Free the control endpoint. */
1466 + inet_ctl_sock_destroy(net->sctp.ctl_sock);
1467 +}
1468 +
1469 +static struct pernet_operations sctp_ctrlsock_ops = {
1470 + .init = sctp_ctrlsock_init,
1471 + .exit = sctp_ctrlsock_exit,
1472 };
1473
1474 /* Initialize the universe into something sensible. */
1475 @@ -1442,8 +1453,11 @@ static __init int sctp_init(void)
1476 sctp_v4_pf_init();
1477 sctp_v6_pf_init();
1478
1479 - status = sctp_v4_protosw_init();
1480 + status = register_pernet_subsys(&sctp_defaults_ops);
1481 + if (status)
1482 + goto err_register_defaults;
1483
1484 + status = sctp_v4_protosw_init();
1485 if (status)
1486 goto err_protosw_init;
1487
1488 @@ -1451,9 +1465,9 @@ static __init int sctp_init(void)
1489 if (status)
1490 goto err_v6_protosw_init;
1491
1492 - status = register_pernet_subsys(&sctp_net_ops);
1493 + status = register_pernet_subsys(&sctp_ctrlsock_ops);
1494 if (status)
1495 - goto err_register_pernet_subsys;
1496 + goto err_register_ctrlsock;
1497
1498 status = sctp_v4_add_protocol();
1499 if (status)
1500 @@ -1469,12 +1483,14 @@ out:
1501 err_v6_add_protocol:
1502 sctp_v4_del_protocol();
1503 err_add_protocol:
1504 - unregister_pernet_subsys(&sctp_net_ops);
1505 -err_register_pernet_subsys:
1506 + unregister_pernet_subsys(&sctp_ctrlsock_ops);
1507 +err_register_ctrlsock:
1508 sctp_v6_protosw_exit();
1509 err_v6_protosw_init:
1510 sctp_v4_protosw_exit();
1511 err_protosw_init:
1512 + unregister_pernet_subsys(&sctp_defaults_ops);
1513 +err_register_defaults:
1514 sctp_v4_pf_exit();
1515 sctp_v6_pf_exit();
1516 sctp_sysctl_unregister();
1517 @@ -1507,12 +1523,14 @@ static __exit void sctp_exit(void)
1518 sctp_v6_del_protocol();
1519 sctp_v4_del_protocol();
1520
1521 - unregister_pernet_subsys(&sctp_net_ops);
1522 + unregister_pernet_subsys(&sctp_ctrlsock_ops);
1523
1524 /* Free protosw registrations */
1525 sctp_v6_protosw_exit();
1526 sctp_v4_protosw_exit();
1527
1528 + unregister_pernet_subsys(&sctp_defaults_ops);
1529 +
1530 /* Unregister with socket layer. */
1531 sctp_v6_pf_exit();
1532 sctp_v4_pf_exit();