Contents of /trunk/kernel-alx/patches-4.9/0245-4.9.146-all-fixes.patch
Parent Directory | Revision Log
Revision 3298 -
(show annotations)
(download)
Tue Mar 12 10:43:07 2019 UTC (5 years, 6 months ago) by niro
File size: 48129 byte(s)
Tue Mar 12 10:43:07 2019 UTC (5 years, 6 months ago) by niro
File size: 48129 byte(s)
-linux-4.9.146
1 | diff --git a/Makefile b/Makefile |
2 | index 1499c7ba2874..0a150d2b3353 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 145 |
9 | +SUBLEVEL = 146 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/arch/arm/boot/dts/logicpd-som-lv.dtsi b/arch/arm/boot/dts/logicpd-som-lv.dtsi |
14 | index e262fa9ef334..876ed5f2922c 100644 |
15 | --- a/arch/arm/boot/dts/logicpd-som-lv.dtsi |
16 | +++ b/arch/arm/boot/dts/logicpd-som-lv.dtsi |
17 | @@ -122,7 +122,7 @@ |
18 | }; |
19 | |
20 | &mmc3 { |
21 | - interrupts-extended = <&intc 94 &omap3_pmx_core2 0x46>; |
22 | + interrupts-extended = <&intc 94 &omap3_pmx_core 0x136>; |
23 | pinctrl-0 = <&mmc3_pins &wl127x_gpio>; |
24 | pinctrl-names = "default"; |
25 | vmmc-supply = <&wl12xx_vmmc>; |
26 | diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c |
27 | index 6613a6ff5dbc..c4b634c54fbd 100644 |
28 | --- a/arch/arm/mach-omap1/board-ams-delta.c |
29 | +++ b/arch/arm/mach-omap1/board-ams-delta.c |
30 | @@ -511,6 +511,9 @@ static void modem_pm(struct uart_port *port, unsigned int state, unsigned old) |
31 | { |
32 | struct modem_private_data *priv = port->private_data; |
33 | |
34 | + if (!priv) |
35 | + return; |
36 | + |
37 | if (IS_ERR(priv->regulator)) |
38 | return; |
39 | |
40 | diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c |
41 | index 30768003f854..8c505284bc0c 100644 |
42 | --- a/arch/arm/mach-omap2/prm44xx.c |
43 | +++ b/arch/arm/mach-omap2/prm44xx.c |
44 | @@ -344,7 +344,7 @@ static void omap44xx_prm_reconfigure_io_chain(void) |
45 | * to occur, WAKEUPENABLE bits must be set in the pad mux registers, and |
46 | * omap44xx_prm_reconfigure_io_chain() must be called. No return value. |
47 | */ |
48 | -static void __init omap44xx_prm_enable_io_wakeup(void) |
49 | +static void omap44xx_prm_enable_io_wakeup(void) |
50 | { |
51 | s32 inst = omap4_prmst_get_prm_dev_inst(); |
52 | |
53 | diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c |
54 | index 037c2a253ae4..1238e7ef1170 100644 |
55 | --- a/arch/s390/kernel/perf_cpum_cf.c |
56 | +++ b/arch/s390/kernel/perf_cpum_cf.c |
57 | @@ -344,6 +344,8 @@ static int __hw_perf_event_init(struct perf_event *event) |
58 | break; |
59 | |
60 | case PERF_TYPE_HARDWARE: |
61 | + if (is_sampling_event(event)) /* No sampling support */ |
62 | + return -ENOENT; |
63 | ev = attr->config; |
64 | /* Count user space (problem-state) only */ |
65 | if (!attr->exclude_user && attr->exclude_kernel) { |
66 | diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c |
67 | index 69a81a7daa24..c8630569e392 100644 |
68 | --- a/arch/x86/kvm/lapic.c |
69 | +++ b/arch/x86/kvm/lapic.c |
70 | @@ -57,7 +57,7 @@ |
71 | #define APIC_BUS_CYCLE_NS 1 |
72 | |
73 | /* #define apic_debug(fmt,arg...) printk(KERN_WARNING fmt,##arg) */ |
74 | -#define apic_debug(fmt, arg...) |
75 | +#define apic_debug(fmt, arg...) do {} while (0) |
76 | |
77 | /* 14 is the version for Xeon and Pentium 8.4.8*/ |
78 | #define APIC_VERSION (0x14UL | ((KVM_APIC_LVT_NUM - 1) << 16)) |
79 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
80 | index 8888d894bf39..011050820608 100644 |
81 | --- a/arch/x86/kvm/vmx.c |
82 | +++ b/arch/x86/kvm/vmx.c |
83 | @@ -1077,7 +1077,7 @@ static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx); |
84 | static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx); |
85 | static int alloc_identity_pagetable(struct kvm *kvm); |
86 | static void vmx_update_msr_bitmap(struct kvm_vcpu *vcpu); |
87 | -static void __always_inline vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, |
88 | +static __always_inline void vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, |
89 | u32 msr, int type); |
90 | |
91 | static DEFINE_PER_CPU(struct vmcs *, vmxarea); |
92 | @@ -4872,7 +4872,7 @@ static void free_vpid(int vpid) |
93 | spin_unlock(&vmx_vpid_lock); |
94 | } |
95 | |
96 | -static void __always_inline vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, |
97 | +static __always_inline void vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, |
98 | u32 msr, int type) |
99 | { |
100 | int f = sizeof(unsigned long); |
101 | @@ -4907,7 +4907,7 @@ static void __always_inline vmx_disable_intercept_for_msr(unsigned long *msr_bit |
102 | } |
103 | } |
104 | |
105 | -static void __always_inline vmx_enable_intercept_for_msr(unsigned long *msr_bitmap, |
106 | +static __always_inline void vmx_enable_intercept_for_msr(unsigned long *msr_bitmap, |
107 | u32 msr, int type) |
108 | { |
109 | int f = sizeof(unsigned long); |
110 | @@ -4942,7 +4942,7 @@ static void __always_inline vmx_enable_intercept_for_msr(unsigned long *msr_bitm |
111 | } |
112 | } |
113 | |
114 | -static void __always_inline vmx_set_intercept_for_msr(unsigned long *msr_bitmap, |
115 | +static __always_inline void vmx_set_intercept_for_msr(unsigned long *msr_bitmap, |
116 | u32 msr, int type, bool value) |
117 | { |
118 | if (value) |
119 | diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c |
120 | index 57205016b04a..201874b96dd6 100644 |
121 | --- a/drivers/gpu/drm/ast/ast_mode.c |
122 | +++ b/drivers/gpu/drm/ast/ast_mode.c |
123 | @@ -954,9 +954,21 @@ static int get_clock(void *i2c_priv) |
124 | { |
125 | struct ast_i2c_chan *i2c = i2c_priv; |
126 | struct ast_private *ast = i2c->dev->dev_private; |
127 | - uint32_t val; |
128 | + uint32_t val, val2, count, pass; |
129 | + |
130 | + count = 0; |
131 | + pass = 0; |
132 | + val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01; |
133 | + do { |
134 | + val2 = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01; |
135 | + if (val == val2) { |
136 | + pass++; |
137 | + } else { |
138 | + pass = 0; |
139 | + val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01; |
140 | + } |
141 | + } while ((pass < 5) && (count++ < 0x10000)); |
142 | |
143 | - val = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4; |
144 | return val & 1 ? 1 : 0; |
145 | } |
146 | |
147 | @@ -964,9 +976,21 @@ static int get_data(void *i2c_priv) |
148 | { |
149 | struct ast_i2c_chan *i2c = i2c_priv; |
150 | struct ast_private *ast = i2c->dev->dev_private; |
151 | - uint32_t val; |
152 | + uint32_t val, val2, count, pass; |
153 | + |
154 | + count = 0; |
155 | + pass = 0; |
156 | + val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01; |
157 | + do { |
158 | + val2 = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01; |
159 | + if (val == val2) { |
160 | + pass++; |
161 | + } else { |
162 | + pass = 0; |
163 | + val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01; |
164 | + } |
165 | + } while ((pass < 5) && (count++ < 0x10000)); |
166 | |
167 | - val = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5; |
168 | return val & 1 ? 1 : 0; |
169 | } |
170 | |
171 | @@ -979,7 +1003,7 @@ static void set_clock(void *i2c_priv, int clock) |
172 | |
173 | for (i = 0; i < 0x10000; i++) { |
174 | ujcrb7 = ((clock & 0x01) ? 0 : 1); |
175 | - ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xfe, ujcrb7); |
176 | + ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xf4, ujcrb7); |
177 | jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x01); |
178 | if (ujcrb7 == jtemp) |
179 | break; |
180 | @@ -995,7 +1019,7 @@ static void set_data(void *i2c_priv, int data) |
181 | |
182 | for (i = 0; i < 0x10000; i++) { |
183 | ujcrb7 = ((data & 0x01) ? 0 : 1) << 2; |
184 | - ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xfb, ujcrb7); |
185 | + ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xf1, ujcrb7); |
186 | jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x04); |
187 | if (ujcrb7 == jtemp) |
188 | break; |
189 | diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c |
190 | index 9ac6e1673375..1f291b344178 100644 |
191 | --- a/drivers/hwmon/ina2xx.c |
192 | +++ b/drivers/hwmon/ina2xx.c |
193 | @@ -273,7 +273,7 @@ static int ina2xx_get_value(struct ina2xx_data *data, u8 reg, |
194 | break; |
195 | case INA2XX_CURRENT: |
196 | /* signed register, result in mA */ |
197 | - val = regval * data->current_lsb_uA; |
198 | + val = (s16)regval * data->current_lsb_uA; |
199 | val = DIV_ROUND_CLOSEST(val, 1000); |
200 | break; |
201 | case INA2XX_CALIBRATION: |
202 | diff --git a/drivers/hwmon/w83795.c b/drivers/hwmon/w83795.c |
203 | index 49276bbdac3d..1bb80f992aa8 100644 |
204 | --- a/drivers/hwmon/w83795.c |
205 | +++ b/drivers/hwmon/w83795.c |
206 | @@ -1691,7 +1691,7 @@ store_sf_setup(struct device *dev, struct device_attribute *attr, |
207 | * somewhere else in the code |
208 | */ |
209 | #define SENSOR_ATTR_TEMP(index) { \ |
210 | - SENSOR_ATTR_2(temp##index##_type, S_IRUGO | (index < 4 ? S_IWUSR : 0), \ |
211 | + SENSOR_ATTR_2(temp##index##_type, S_IRUGO | (index < 5 ? S_IWUSR : 0), \ |
212 | show_temp_mode, store_temp_mode, NOT_USED, index - 1), \ |
213 | SENSOR_ATTR_2(temp##index##_input, S_IRUGO, show_temp, \ |
214 | NULL, TEMP_READ, index - 1), \ |
215 | diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c |
216 | index f8f7a2191b98..f89489b28575 100644 |
217 | --- a/drivers/infiniband/hw/mlx5/qp.c |
218 | +++ b/drivers/infiniband/hw/mlx5/qp.c |
219 | @@ -3888,17 +3888,18 @@ int mlx5_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, |
220 | goto out; |
221 | } |
222 | |
223 | - if (wr->opcode == IB_WR_LOCAL_INV || |
224 | - wr->opcode == IB_WR_REG_MR) { |
225 | + if (wr->opcode == IB_WR_REG_MR) { |
226 | fence = dev->umr_fence; |
227 | next_fence = MLX5_FENCE_MODE_INITIATOR_SMALL; |
228 | - } else if (wr->send_flags & IB_SEND_FENCE) { |
229 | - if (qp->next_fence) |
230 | - fence = MLX5_FENCE_MODE_SMALL_AND_FENCE; |
231 | - else |
232 | - fence = MLX5_FENCE_MODE_FENCE; |
233 | - } else { |
234 | - fence = qp->next_fence; |
235 | + } else { |
236 | + if (wr->send_flags & IB_SEND_FENCE) { |
237 | + if (qp->next_fence) |
238 | + fence = MLX5_FENCE_MODE_SMALL_AND_FENCE; |
239 | + else |
240 | + fence = MLX5_FENCE_MODE_FENCE; |
241 | + } else { |
242 | + fence = qp->next_fence; |
243 | + } |
244 | } |
245 | |
246 | switch (ibqp->qp_type) { |
247 | diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c b/drivers/net/ethernet/cavium/thunder/nic_main.c |
248 | index 6677b96e1f3f..da142f6bd0c3 100644 |
249 | --- a/drivers/net/ethernet/cavium/thunder/nic_main.c |
250 | +++ b/drivers/net/ethernet/cavium/thunder/nic_main.c |
251 | @@ -1371,6 +1371,9 @@ static void nic_remove(struct pci_dev *pdev) |
252 | { |
253 | struct nicpf *nic = pci_get_drvdata(pdev); |
254 | |
255 | + if (!nic) |
256 | + return; |
257 | + |
258 | if (nic->flags & NIC_SRIOV_ENABLED) |
259 | pci_disable_sriov(pdev); |
260 | |
261 | diff --git a/drivers/net/ethernet/hisilicon/hip04_eth.c b/drivers/net/ethernet/hisilicon/hip04_eth.c |
262 | index 39778892b3b3..b5d18d95d7b9 100644 |
263 | --- a/drivers/net/ethernet/hisilicon/hip04_eth.c |
264 | +++ b/drivers/net/ethernet/hisilicon/hip04_eth.c |
265 | @@ -922,10 +922,8 @@ static int hip04_mac_probe(struct platform_device *pdev) |
266 | } |
267 | |
268 | ret = register_netdev(ndev); |
269 | - if (ret) { |
270 | - free_netdev(ndev); |
271 | + if (ret) |
272 | goto alloc_fail; |
273 | - } |
274 | |
275 | return 0; |
276 | |
277 | diff --git a/drivers/net/ethernet/intel/igb/e1000_i210.c b/drivers/net/ethernet/intel/igb/e1000_i210.c |
278 | index 07d48f2e3369..6766081f5ab9 100644 |
279 | --- a/drivers/net/ethernet/intel/igb/e1000_i210.c |
280 | +++ b/drivers/net/ethernet/intel/igb/e1000_i210.c |
281 | @@ -862,6 +862,7 @@ s32 igb_pll_workaround_i210(struct e1000_hw *hw) |
282 | nvm_word = E1000_INVM_DEFAULT_AL; |
283 | tmp_nvm = nvm_word | E1000_INVM_PLL_WO_VAL; |
284 | igb_write_phy_reg_82580(hw, I347AT4_PAGE_SELECT, E1000_PHY_PLL_FREQ_PAGE); |
285 | + phy_word = E1000_PHY_PLL_UNCONF; |
286 | for (i = 0; i < E1000_MAX_PLL_TRIES; i++) { |
287 | /* check current state directly from internal PHY */ |
288 | igb_read_phy_reg_82580(hw, E1000_PHY_PLL_FREQ_REG, &phy_word); |
289 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
290 | index 77a60aa5dc7e..8466f3874a28 100644 |
291 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
292 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
293 | @@ -1702,7 +1702,9 @@ static s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw, |
294 | *autoneg = false; |
295 | |
296 | if (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 || |
297 | - hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) { |
298 | + hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1 || |
299 | + hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 || |
300 | + hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1) { |
301 | *speed = IXGBE_LINK_SPEED_1GB_FULL; |
302 | return 0; |
303 | } |
304 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
305 | index 9a4c4f8281bd..8a9a332d78b4 100644 |
306 | --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
307 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
308 | @@ -1027,8 +1027,8 @@ static int mlx4_en_set_pauseparam(struct net_device *dev, |
309 | |
310 | tx_pause = !!(pause->tx_pause); |
311 | rx_pause = !!(pause->rx_pause); |
312 | - rx_ppp = priv->prof->rx_ppp && !(tx_pause || rx_pause); |
313 | - tx_ppp = priv->prof->tx_ppp && !(tx_pause || rx_pause); |
314 | + rx_ppp = (tx_pause || rx_pause) ? 0 : priv->prof->rx_ppp; |
315 | + tx_ppp = (tx_pause || rx_pause) ? 0 : priv->prof->tx_ppp; |
316 | |
317 | err = mlx4_SET_PORT_general(mdev->dev, priv->port, |
318 | priv->rx_skb_size + ETH_FCS_LEN, |
319 | diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c |
320 | index 5297bf77211c..d608c2a6c01f 100644 |
321 | --- a/drivers/net/ethernet/realtek/8139cp.c |
322 | +++ b/drivers/net/ethernet/realtek/8139cp.c |
323 | @@ -578,6 +578,7 @@ static irqreturn_t cp_interrupt (int irq, void *dev_instance) |
324 | struct cp_private *cp; |
325 | int handled = 0; |
326 | u16 status; |
327 | + u16 mask; |
328 | |
329 | if (unlikely(dev == NULL)) |
330 | return IRQ_NONE; |
331 | @@ -585,6 +586,10 @@ static irqreturn_t cp_interrupt (int irq, void *dev_instance) |
332 | |
333 | spin_lock(&cp->lock); |
334 | |
335 | + mask = cpr16(IntrMask); |
336 | + if (!mask) |
337 | + goto out_unlock; |
338 | + |
339 | status = cpr16(IntrStatus); |
340 | if (!status || (status == 0xFFFF)) |
341 | goto out_unlock; |
342 | diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c |
343 | index b131e555d3c2..f04be9e8980f 100644 |
344 | --- a/drivers/net/phy/phy_device.c |
345 | +++ b/drivers/net/phy/phy_device.c |
346 | @@ -1579,20 +1579,17 @@ static int gen10g_resume(struct phy_device *phydev) |
347 | |
348 | static int __set_phy_supported(struct phy_device *phydev, u32 max_speed) |
349 | { |
350 | - phydev->supported &= ~(PHY_1000BT_FEATURES | PHY_100BT_FEATURES | |
351 | - PHY_10BT_FEATURES); |
352 | - |
353 | switch (max_speed) { |
354 | - default: |
355 | - return -ENOTSUPP; |
356 | - case SPEED_1000: |
357 | - phydev->supported |= PHY_1000BT_FEATURES; |
358 | + case SPEED_10: |
359 | + phydev->supported &= ~PHY_100BT_FEATURES; |
360 | /* fall through */ |
361 | case SPEED_100: |
362 | - phydev->supported |= PHY_100BT_FEATURES; |
363 | - /* fall through */ |
364 | - case SPEED_10: |
365 | - phydev->supported |= PHY_10BT_FEATURES; |
366 | + phydev->supported &= ~PHY_1000BT_FEATURES; |
367 | + break; |
368 | + case SPEED_1000: |
369 | + break; |
370 | + default: |
371 | + return -ENOTSUPP; |
372 | } |
373 | |
374 | return 0; |
375 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c |
376 | index 0260bc15bc0c..7a0d5e928bec 100644 |
377 | --- a/drivers/net/tun.c |
378 | +++ b/drivers/net/tun.c |
379 | @@ -1570,9 +1570,9 @@ static void tun_setup(struct net_device *dev) |
380 | */ |
381 | static int tun_validate(struct nlattr *tb[], struct nlattr *data[]) |
382 | { |
383 | - if (!data) |
384 | - return 0; |
385 | - return -EINVAL; |
386 | + /* NL_SET_ERR_MSG(extack, |
387 | + "tun/tap creation via rtnetlink is not supported."); */ |
388 | + return -EOPNOTSUPP; |
389 | } |
390 | |
391 | static struct rtnl_link_ops tun_link_ops __read_mostly = { |
392 | diff --git a/drivers/staging/speakup/kobjects.c b/drivers/staging/speakup/kobjects.c |
393 | index dea018cba094..1253fe118044 100644 |
394 | --- a/drivers/staging/speakup/kobjects.c |
395 | +++ b/drivers/staging/speakup/kobjects.c |
396 | @@ -387,7 +387,7 @@ static ssize_t synth_store(struct kobject *kobj, struct kobj_attribute *attr, |
397 | len = strlen(buf); |
398 | if (len < 2 || len > 9) |
399 | return -EINVAL; |
400 | - strncpy(new_synth_name, buf, len); |
401 | + memcpy(new_synth_name, buf, len); |
402 | if (new_synth_name[len - 1] == '\n') |
403 | len--; |
404 | new_synth_name[len] = '\0'; |
405 | @@ -517,7 +517,7 @@ static ssize_t punc_store(struct kobject *kobj, struct kobj_attribute *attr, |
406 | return -EINVAL; |
407 | } |
408 | |
409 | - strncpy(punc_buf, buf, x); |
410 | + memcpy(punc_buf, buf, x); |
411 | |
412 | while (x && punc_buf[x - 1] == '\n') |
413 | x--; |
414 | diff --git a/drivers/usb/gadget/udc/omap_udc.c b/drivers/usb/gadget/udc/omap_udc.c |
415 | index a8709f9e5648..9eed4947aad8 100644 |
416 | --- a/drivers/usb/gadget/udc/omap_udc.c |
417 | +++ b/drivers/usb/gadget/udc/omap_udc.c |
418 | @@ -2037,6 +2037,7 @@ static inline int machine_without_vbus_sense(void) |
419 | { |
420 | return machine_is_omap_innovator() |
421 | || machine_is_omap_osk() |
422 | + || machine_is_omap_palmte() |
423 | || machine_is_sx1() |
424 | /* No known omap7xx boards with vbus sense */ |
425 | || cpu_is_omap7xx(); |
426 | @@ -2045,7 +2046,7 @@ static inline int machine_without_vbus_sense(void) |
427 | static int omap_udc_start(struct usb_gadget *g, |
428 | struct usb_gadget_driver *driver) |
429 | { |
430 | - int status = -ENODEV; |
431 | + int status; |
432 | struct omap_ep *ep; |
433 | unsigned long flags; |
434 | |
435 | @@ -2083,6 +2084,7 @@ static int omap_udc_start(struct usb_gadget *g, |
436 | goto done; |
437 | } |
438 | } else { |
439 | + status = 0; |
440 | if (can_pullup(udc)) |
441 | pullup_enable(udc); |
442 | else |
443 | @@ -2612,9 +2614,22 @@ omap_ep_setup(char *name, u8 addr, u8 type, |
444 | |
445 | static void omap_udc_release(struct device *dev) |
446 | { |
447 | - complete(udc->done); |
448 | + pullup_disable(udc); |
449 | + if (!IS_ERR_OR_NULL(udc->transceiver)) { |
450 | + usb_put_phy(udc->transceiver); |
451 | + udc->transceiver = NULL; |
452 | + } |
453 | + omap_writew(0, UDC_SYSCON1); |
454 | + remove_proc_file(); |
455 | + if (udc->dc_clk) { |
456 | + if (udc->clk_requested) |
457 | + omap_udc_enable_clock(0); |
458 | + clk_put(udc->hhc_clk); |
459 | + clk_put(udc->dc_clk); |
460 | + } |
461 | + if (udc->done) |
462 | + complete(udc->done); |
463 | kfree(udc); |
464 | - udc = NULL; |
465 | } |
466 | |
467 | static int |
468 | @@ -2886,8 +2901,8 @@ bad_on_1710: |
469 | udc->clr_halt = UDC_RESET_EP; |
470 | |
471 | /* USB general purpose IRQ: ep0, state changes, dma, etc */ |
472 | - status = request_irq(pdev->resource[1].start, omap_udc_irq, |
473 | - 0, driver_name, udc); |
474 | + status = devm_request_irq(&pdev->dev, pdev->resource[1].start, |
475 | + omap_udc_irq, 0, driver_name, udc); |
476 | if (status != 0) { |
477 | ERR("can't get irq %d, err %d\n", |
478 | (int) pdev->resource[1].start, status); |
479 | @@ -2895,20 +2910,20 @@ bad_on_1710: |
480 | } |
481 | |
482 | /* USB "non-iso" IRQ (PIO for all but ep0) */ |
483 | - status = request_irq(pdev->resource[2].start, omap_udc_pio_irq, |
484 | - 0, "omap_udc pio", udc); |
485 | + status = devm_request_irq(&pdev->dev, pdev->resource[2].start, |
486 | + omap_udc_pio_irq, 0, "omap_udc pio", udc); |
487 | if (status != 0) { |
488 | ERR("can't get irq %d, err %d\n", |
489 | (int) pdev->resource[2].start, status); |
490 | - goto cleanup2; |
491 | + goto cleanup1; |
492 | } |
493 | #ifdef USE_ISO |
494 | - status = request_irq(pdev->resource[3].start, omap_udc_iso_irq, |
495 | - 0, "omap_udc iso", udc); |
496 | + status = devm_request_irq(&pdev->dev, pdev->resource[3].start, |
497 | + omap_udc_iso_irq, 0, "omap_udc iso", udc); |
498 | if (status != 0) { |
499 | ERR("can't get irq %d, err %d\n", |
500 | (int) pdev->resource[3].start, status); |
501 | - goto cleanup3; |
502 | + goto cleanup1; |
503 | } |
504 | #endif |
505 | if (cpu_is_omap16xx() || cpu_is_omap7xx()) { |
506 | @@ -2919,23 +2934,8 @@ bad_on_1710: |
507 | } |
508 | |
509 | create_proc_file(); |
510 | - status = usb_add_gadget_udc_release(&pdev->dev, &udc->gadget, |
511 | - omap_udc_release); |
512 | - if (status) |
513 | - goto cleanup4; |
514 | - |
515 | - return 0; |
516 | - |
517 | -cleanup4: |
518 | - remove_proc_file(); |
519 | - |
520 | -#ifdef USE_ISO |
521 | -cleanup3: |
522 | - free_irq(pdev->resource[2].start, udc); |
523 | -#endif |
524 | - |
525 | -cleanup2: |
526 | - free_irq(pdev->resource[1].start, udc); |
527 | + return usb_add_gadget_udc_release(&pdev->dev, &udc->gadget, |
528 | + omap_udc_release); |
529 | |
530 | cleanup1: |
531 | kfree(udc); |
532 | @@ -2962,42 +2962,15 @@ static int omap_udc_remove(struct platform_device *pdev) |
533 | { |
534 | DECLARE_COMPLETION_ONSTACK(done); |
535 | |
536 | - if (!udc) |
537 | - return -ENODEV; |
538 | - |
539 | - usb_del_gadget_udc(&udc->gadget); |
540 | - if (udc->driver) |
541 | - return -EBUSY; |
542 | - |
543 | udc->done = &done; |
544 | |
545 | - pullup_disable(udc); |
546 | - if (!IS_ERR_OR_NULL(udc->transceiver)) { |
547 | - usb_put_phy(udc->transceiver); |
548 | - udc->transceiver = NULL; |
549 | - } |
550 | - omap_writew(0, UDC_SYSCON1); |
551 | - |
552 | - remove_proc_file(); |
553 | - |
554 | -#ifdef USE_ISO |
555 | - free_irq(pdev->resource[3].start, udc); |
556 | -#endif |
557 | - free_irq(pdev->resource[2].start, udc); |
558 | - free_irq(pdev->resource[1].start, udc); |
559 | + usb_del_gadget_udc(&udc->gadget); |
560 | |
561 | - if (udc->dc_clk) { |
562 | - if (udc->clk_requested) |
563 | - omap_udc_enable_clock(0); |
564 | - clk_put(udc->hhc_clk); |
565 | - clk_put(udc->dc_clk); |
566 | - } |
567 | + wait_for_completion(&done); |
568 | |
569 | release_mem_region(pdev->resource[0].start, |
570 | pdev->resource[0].end - pdev->resource[0].start + 1); |
571 | |
572 | - wait_for_completion(&done); |
573 | - |
574 | return 0; |
575 | } |
576 | |
577 | diff --git a/drivers/xen/xlate_mmu.c b/drivers/xen/xlate_mmu.c |
578 | index 23f1387b3ef7..e7df65d32c91 100644 |
579 | --- a/drivers/xen/xlate_mmu.c |
580 | +++ b/drivers/xen/xlate_mmu.c |
581 | @@ -36,6 +36,7 @@ |
582 | #include <asm/xen/hypervisor.h> |
583 | |
584 | #include <xen/xen.h> |
585 | +#include <xen/xen-ops.h> |
586 | #include <xen/page.h> |
587 | #include <xen/interface/xen.h> |
588 | #include <xen/interface/memory.h> |
589 | diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c |
590 | index 79dc3ee1de58..a45f26ac5da7 100644 |
591 | --- a/fs/btrfs/send.c |
592 | +++ b/fs/btrfs/send.c |
593 | @@ -3349,7 +3349,8 @@ static void free_pending_move(struct send_ctx *sctx, struct pending_dir_move *m) |
594 | kfree(m); |
595 | } |
596 | |
597 | -static void tail_append_pending_moves(struct pending_dir_move *moves, |
598 | +static void tail_append_pending_moves(struct send_ctx *sctx, |
599 | + struct pending_dir_move *moves, |
600 | struct list_head *stack) |
601 | { |
602 | if (list_empty(&moves->list)) { |
603 | @@ -3360,6 +3361,10 @@ static void tail_append_pending_moves(struct pending_dir_move *moves, |
604 | list_add_tail(&moves->list, stack); |
605 | list_splice_tail(&list, stack); |
606 | } |
607 | + if (!RB_EMPTY_NODE(&moves->node)) { |
608 | + rb_erase(&moves->node, &sctx->pending_dir_moves); |
609 | + RB_CLEAR_NODE(&moves->node); |
610 | + } |
611 | } |
612 | |
613 | static int apply_children_dir_moves(struct send_ctx *sctx) |
614 | @@ -3374,7 +3379,7 @@ static int apply_children_dir_moves(struct send_ctx *sctx) |
615 | return 0; |
616 | |
617 | INIT_LIST_HEAD(&stack); |
618 | - tail_append_pending_moves(pm, &stack); |
619 | + tail_append_pending_moves(sctx, pm, &stack); |
620 | |
621 | while (!list_empty(&stack)) { |
622 | pm = list_first_entry(&stack, struct pending_dir_move, list); |
623 | @@ -3385,7 +3390,7 @@ static int apply_children_dir_moves(struct send_ctx *sctx) |
624 | goto out; |
625 | pm = get_pending_dir_moves(sctx, parent_ino); |
626 | if (pm) |
627 | - tail_append_pending_moves(pm, &stack); |
628 | + tail_append_pending_moves(sctx, pm, &stack); |
629 | } |
630 | return 0; |
631 | |
632 | diff --git a/fs/cachefiles/rdwr.c b/fs/cachefiles/rdwr.c |
633 | index 5e3bc9de7a16..799b59d96fe2 100644 |
634 | --- a/fs/cachefiles/rdwr.c |
635 | +++ b/fs/cachefiles/rdwr.c |
636 | @@ -537,7 +537,10 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object, |
637 | netpage->index, cachefiles_gfp); |
638 | if (ret < 0) { |
639 | if (ret == -EEXIST) { |
640 | + put_page(backpage); |
641 | + backpage = NULL; |
642 | put_page(netpage); |
643 | + netpage = NULL; |
644 | fscache_retrieval_complete(op, 1); |
645 | continue; |
646 | } |
647 | @@ -610,7 +613,10 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object, |
648 | netpage->index, cachefiles_gfp); |
649 | if (ret < 0) { |
650 | if (ret == -EEXIST) { |
651 | + put_page(backpage); |
652 | + backpage = NULL; |
653 | put_page(netpage); |
654 | + netpage = NULL; |
655 | fscache_retrieval_complete(op, 1); |
656 | continue; |
657 | } |
658 | @@ -963,11 +969,8 @@ error: |
659 | void cachefiles_uncache_page(struct fscache_object *_object, struct page *page) |
660 | { |
661 | struct cachefiles_object *object; |
662 | - struct cachefiles_cache *cache; |
663 | |
664 | object = container_of(_object, struct cachefiles_object, fscache); |
665 | - cache = container_of(object->fscache.cache, |
666 | - struct cachefiles_cache, cache); |
667 | |
668 | _enter("%p,{%lu}", object, page->index); |
669 | |
670 | diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c |
671 | index a4b531be9168..7a7bba7c2328 100644 |
672 | --- a/fs/exportfs/expfs.c |
673 | +++ b/fs/exportfs/expfs.c |
674 | @@ -76,7 +76,7 @@ static bool dentry_connected(struct dentry *dentry) |
675 | struct dentry *parent = dget_parent(dentry); |
676 | |
677 | dput(dentry); |
678 | - if (IS_ROOT(dentry)) { |
679 | + if (dentry == parent) { |
680 | dput(parent); |
681 | return false; |
682 | } |
683 | diff --git a/fs/fscache/object.c b/fs/fscache/object.c |
684 | index 7a182c87f378..ab1d7f35f6c2 100644 |
685 | --- a/fs/fscache/object.c |
686 | +++ b/fs/fscache/object.c |
687 | @@ -715,6 +715,9 @@ static const struct fscache_state *fscache_drop_object(struct fscache_object *ob |
688 | |
689 | if (awaken) |
690 | wake_up_bit(&cookie->flags, FSCACHE_COOKIE_INVALIDATING); |
691 | + if (test_and_clear_bit(FSCACHE_COOKIE_LOOKING_UP, &cookie->flags)) |
692 | + wake_up_bit(&cookie->flags, FSCACHE_COOKIE_LOOKING_UP); |
693 | + |
694 | |
695 | /* Prevent a race with our last child, which has to signal EV_CLEARED |
696 | * before dropping our spinlock. |
697 | diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c |
698 | index 37cdd955eceb..320f4372f172 100644 |
699 | --- a/fs/hfs/btree.c |
700 | +++ b/fs/hfs/btree.c |
701 | @@ -328,13 +328,14 @@ void hfs_bmap_free(struct hfs_bnode *node) |
702 | |
703 | nidx -= len * 8; |
704 | i = node->next; |
705 | - hfs_bnode_put(node); |
706 | if (!i) { |
707 | /* panic */; |
708 | pr_crit("unable to free bnode %u. bmap not found!\n", |
709 | node->this); |
710 | + hfs_bnode_put(node); |
711 | return; |
712 | } |
713 | + hfs_bnode_put(node); |
714 | node = hfs_bnode_find(tree, i); |
715 | if (IS_ERR(node)) |
716 | return; |
717 | diff --git a/fs/hfsplus/btree.c b/fs/hfsplus/btree.c |
718 | index d9d1a36ba826..8d2256454efe 100644 |
719 | --- a/fs/hfsplus/btree.c |
720 | +++ b/fs/hfsplus/btree.c |
721 | @@ -453,14 +453,15 @@ void hfs_bmap_free(struct hfs_bnode *node) |
722 | |
723 | nidx -= len * 8; |
724 | i = node->next; |
725 | - hfs_bnode_put(node); |
726 | if (!i) { |
727 | /* panic */; |
728 | pr_crit("unable to free bnode %u. " |
729 | "bmap not found!\n", |
730 | node->this); |
731 | + hfs_bnode_put(node); |
732 | return; |
733 | } |
734 | + hfs_bnode_put(node); |
735 | node = hfs_bnode_find(tree, i); |
736 | if (IS_ERR(node)) |
737 | return; |
738 | diff --git a/fs/ocfs2/export.c b/fs/ocfs2/export.c |
739 | index 827fc9809bc2..3494e220b510 100644 |
740 | --- a/fs/ocfs2/export.c |
741 | +++ b/fs/ocfs2/export.c |
742 | @@ -125,10 +125,10 @@ check_err: |
743 | |
744 | check_gen: |
745 | if (handle->ih_generation != inode->i_generation) { |
746 | - iput(inode); |
747 | trace_ocfs2_get_dentry_generation((unsigned long long)blkno, |
748 | handle->ih_generation, |
749 | inode->i_generation); |
750 | + iput(inode); |
751 | result = ERR_PTR(-ESTALE); |
752 | goto bail; |
753 | } |
754 | diff --git a/fs/ocfs2/move_extents.c b/fs/ocfs2/move_extents.c |
755 | index 4e8f32eb0bdb..c179afd0051a 100644 |
756 | --- a/fs/ocfs2/move_extents.c |
757 | +++ b/fs/ocfs2/move_extents.c |
758 | @@ -156,18 +156,14 @@ out: |
759 | } |
760 | |
761 | /* |
762 | - * lock allocators, and reserving appropriate number of bits for |
763 | - * meta blocks and data clusters. |
764 | - * |
765 | - * in some cases, we don't need to reserve clusters, just let data_ac |
766 | - * be NULL. |
767 | + * lock allocator, and reserve appropriate number of bits for |
768 | + * meta blocks. |
769 | */ |
770 | -static int ocfs2_lock_allocators_move_extents(struct inode *inode, |
771 | +static int ocfs2_lock_meta_allocator_move_extents(struct inode *inode, |
772 | struct ocfs2_extent_tree *et, |
773 | u32 clusters_to_move, |
774 | u32 extents_to_split, |
775 | struct ocfs2_alloc_context **meta_ac, |
776 | - struct ocfs2_alloc_context **data_ac, |
777 | int extra_blocks, |
778 | int *credits) |
779 | { |
780 | @@ -192,13 +188,6 @@ static int ocfs2_lock_allocators_move_extents(struct inode *inode, |
781 | goto out; |
782 | } |
783 | |
784 | - if (data_ac) { |
785 | - ret = ocfs2_reserve_clusters(osb, clusters_to_move, data_ac); |
786 | - if (ret) { |
787 | - mlog_errno(ret); |
788 | - goto out; |
789 | - } |
790 | - } |
791 | |
792 | *credits += ocfs2_calc_extend_credits(osb->sb, et->et_root_el); |
793 | |
794 | @@ -260,10 +249,10 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context, |
795 | } |
796 | } |
797 | |
798 | - ret = ocfs2_lock_allocators_move_extents(inode, &context->et, *len, 1, |
799 | - &context->meta_ac, |
800 | - &context->data_ac, |
801 | - extra_blocks, &credits); |
802 | + ret = ocfs2_lock_meta_allocator_move_extents(inode, &context->et, |
803 | + *len, 1, |
804 | + &context->meta_ac, |
805 | + extra_blocks, &credits); |
806 | if (ret) { |
807 | mlog_errno(ret); |
808 | goto out; |
809 | @@ -286,6 +275,21 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context, |
810 | } |
811 | } |
812 | |
813 | + /* |
814 | + * Make sure ocfs2_reserve_cluster is called after |
815 | + * __ocfs2_flush_truncate_log, otherwise, dead lock may happen. |
816 | + * |
817 | + * If ocfs2_reserve_cluster is called |
818 | + * before __ocfs2_flush_truncate_log, dead lock on global bitmap |
819 | + * may happen. |
820 | + * |
821 | + */ |
822 | + ret = ocfs2_reserve_clusters(osb, *len, &context->data_ac); |
823 | + if (ret) { |
824 | + mlog_errno(ret); |
825 | + goto out_unlock_mutex; |
826 | + } |
827 | + |
828 | handle = ocfs2_start_trans(osb, credits); |
829 | if (IS_ERR(handle)) { |
830 | ret = PTR_ERR(handle); |
831 | @@ -606,9 +610,10 @@ static int ocfs2_move_extent(struct ocfs2_move_extents_context *context, |
832 | } |
833 | } |
834 | |
835 | - ret = ocfs2_lock_allocators_move_extents(inode, &context->et, len, 1, |
836 | - &context->meta_ac, |
837 | - NULL, extra_blocks, &credits); |
838 | + ret = ocfs2_lock_meta_allocator_move_extents(inode, &context->et, |
839 | + len, 1, |
840 | + &context->meta_ac, |
841 | + extra_blocks, &credits); |
842 | if (ret) { |
843 | mlog_errno(ret); |
844 | goto out; |
845 | diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c |
846 | index 43033a3d66d5..2434bffbc6dd 100644 |
847 | --- a/fs/pstore/platform.c |
848 | +++ b/fs/pstore/platform.c |
849 | @@ -584,8 +584,8 @@ static void pstore_console_write(struct console *con, const char *s, unsigned c) |
850 | } else { |
851 | spin_lock_irqsave(&psinfo->buf_lock, flags); |
852 | } |
853 | - memcpy(psinfo->buf, s, c); |
854 | - psinfo->write(PSTORE_TYPE_CONSOLE, 0, &id, 0, 0, 0, c, psinfo); |
855 | + psinfo->write_buf(PSTORE_TYPE_CONSOLE, 0, &id, 0, |
856 | + s, 0, c, psinfo); |
857 | spin_unlock_irqrestore(&psinfo->buf_lock, flags); |
858 | s += c; |
859 | c = e - s; |
860 | diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c |
861 | index d62c423a5a2d..7b391b43bcf5 100644 |
862 | --- a/fs/sysv/inode.c |
863 | +++ b/fs/sysv/inode.c |
864 | @@ -275,7 +275,7 @@ static int __sysv_write_inode(struct inode *inode, int wait) |
865 | } |
866 | } |
867 | brelse(bh); |
868 | - return 0; |
869 | + return err; |
870 | } |
871 | |
872 | int sysv_write_inode(struct inode *inode, struct writeback_control *wbc) |
873 | diff --git a/include/net/neighbour.h b/include/net/neighbour.h |
874 | index 8b683841e574..f6017ddc4ded 100644 |
875 | --- a/include/net/neighbour.h |
876 | +++ b/include/net/neighbour.h |
877 | @@ -448,6 +448,7 @@ static inline int neigh_hh_bridge(struct hh_cache *hh, struct sk_buff *skb) |
878 | |
879 | static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb) |
880 | { |
881 | + unsigned int hh_alen = 0; |
882 | unsigned int seq; |
883 | int hh_len; |
884 | |
885 | @@ -455,16 +456,33 @@ static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb |
886 | seq = read_seqbegin(&hh->hh_lock); |
887 | hh_len = hh->hh_len; |
888 | if (likely(hh_len <= HH_DATA_MOD)) { |
889 | - /* this is inlined by gcc */ |
890 | - memcpy(skb->data - HH_DATA_MOD, hh->hh_data, HH_DATA_MOD); |
891 | + hh_alen = HH_DATA_MOD; |
892 | + |
893 | + /* skb_push() would proceed silently if we have room for |
894 | + * the unaligned size but not for the aligned size: |
895 | + * check headroom explicitly. |
896 | + */ |
897 | + if (likely(skb_headroom(skb) >= HH_DATA_MOD)) { |
898 | + /* this is inlined by gcc */ |
899 | + memcpy(skb->data - HH_DATA_MOD, hh->hh_data, |
900 | + HH_DATA_MOD); |
901 | + } |
902 | } else { |
903 | - int hh_alen = HH_DATA_ALIGN(hh_len); |
904 | + hh_alen = HH_DATA_ALIGN(hh_len); |
905 | |
906 | - memcpy(skb->data - hh_alen, hh->hh_data, hh_alen); |
907 | + if (likely(skb_headroom(skb) >= hh_alen)) { |
908 | + memcpy(skb->data - hh_alen, hh->hh_data, |
909 | + hh_alen); |
910 | + } |
911 | } |
912 | } while (read_seqretry(&hh->hh_lock, seq)); |
913 | |
914 | - skb_push(skb, hh_len); |
915 | + if (WARN_ON_ONCE(skb_headroom(skb) < hh_alen)) { |
916 | + kfree_skb(skb); |
917 | + return NET_XMIT_DROP; |
918 | + } |
919 | + |
920 | + __skb_push(skb, hh_len); |
921 | return dev_queue_xmit(skb); |
922 | } |
923 | |
924 | diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c |
925 | index 41805fb3c661..7cc06f267be5 100644 |
926 | --- a/kernel/trace/bpf_trace.c |
927 | +++ b/kernel/trace/bpf_trace.c |
928 | @@ -161,11 +161,13 @@ BPF_CALL_5(bpf_trace_printk, char *, fmt, u32, fmt_size, u64, arg1, |
929 | i++; |
930 | } else if (fmt[i] == 'p' || fmt[i] == 's') { |
931 | mod[fmt_cnt]++; |
932 | - i++; |
933 | - if (!isspace(fmt[i]) && !ispunct(fmt[i]) && fmt[i] != 0) |
934 | + /* disallow any further format extensions */ |
935 | + if (fmt[i + 1] != 0 && |
936 | + !isspace(fmt[i + 1]) && |
937 | + !ispunct(fmt[i + 1])) |
938 | return -EINVAL; |
939 | fmt_cnt++; |
940 | - if (fmt[i - 1] == 's') { |
941 | + if (fmt[i] == 's') { |
942 | if (str_seen) |
943 | /* allow only one '%s' per fmt string */ |
944 | return -EINVAL; |
945 | diff --git a/lib/debugobjects.c b/lib/debugobjects.c |
946 | index 88580e8ee39e..1c43d4c5d2ab 100644 |
947 | --- a/lib/debugobjects.c |
948 | +++ b/lib/debugobjects.c |
949 | @@ -1110,7 +1110,8 @@ void __init debug_objects_mem_init(void) |
950 | |
951 | obj_cache = kmem_cache_create("debug_objects_cache", |
952 | sizeof (struct debug_obj), 0, |
953 | - SLAB_DEBUG_OBJECTS, NULL); |
954 | + SLAB_DEBUG_OBJECTS | SLAB_NOLEAKTRACE, |
955 | + NULL); |
956 | |
957 | if (!obj_cache || debug_objects_replace_static_objects()) { |
958 | debug_objects_enabled = 0; |
959 | diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c |
960 | index 928a0b84469d..ba724576764e 100644 |
961 | --- a/net/core/rtnetlink.c |
962 | +++ b/net/core/rtnetlink.c |
963 | @@ -3186,6 +3186,9 @@ int ndo_dflt_fdb_dump(struct sk_buff *skb, |
964 | { |
965 | int err; |
966 | |
967 | + if (dev->type != ARPHRD_ETHER) |
968 | + return -EINVAL; |
969 | + |
970 | netif_addr_lock_bh(dev); |
971 | err = nlmsg_populate_fdb(skb, cb, dev, idx, &dev->uc); |
972 | if (err) |
973 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c |
974 | index bd68f073570b..6f35cdd5f2f0 100644 |
975 | --- a/net/ipv4/tcp_output.c |
976 | +++ b/net/ipv4/tcp_output.c |
977 | @@ -2346,14 +2346,18 @@ void tcp_send_loss_probe(struct sock *sk) |
978 | skb = tcp_write_queue_tail(sk); |
979 | } |
980 | |
981 | + if (unlikely(!skb)) { |
982 | + WARN_ONCE(tp->packets_out, |
983 | + "invalid inflight: %u state %u cwnd %u mss %d\n", |
984 | + tp->packets_out, sk->sk_state, tp->snd_cwnd, mss); |
985 | + inet_csk(sk)->icsk_pending = 0; |
986 | + return; |
987 | + } |
988 | + |
989 | /* At most one outstanding TLP retransmission. */ |
990 | if (tp->tlp_high_seq) |
991 | goto rearm_timer; |
992 | |
993 | - /* Retransmit last segment. */ |
994 | - if (WARN_ON(!skb)) |
995 | - goto rearm_timer; |
996 | - |
997 | if (skb_still_in_host_queue(sk, skb)) |
998 | goto rearm_timer; |
999 | |
1000 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c |
1001 | index 8e77cecd2165..b723987761be 100644 |
1002 | --- a/net/ipv6/ip6_output.c |
1003 | +++ b/net/ipv6/ip6_output.c |
1004 | @@ -177,37 +177,37 @@ int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, |
1005 | const struct ipv6_pinfo *np = inet6_sk(sk); |
1006 | struct in6_addr *first_hop = &fl6->daddr; |
1007 | struct dst_entry *dst = skb_dst(skb); |
1008 | + unsigned int head_room; |
1009 | struct ipv6hdr *hdr; |
1010 | u8 proto = fl6->flowi6_proto; |
1011 | int seg_len = skb->len; |
1012 | int hlimit = -1; |
1013 | u32 mtu; |
1014 | |
1015 | - if (opt) { |
1016 | - unsigned int head_room; |
1017 | + head_room = sizeof(struct ipv6hdr) + LL_RESERVED_SPACE(dst->dev); |
1018 | + if (opt) |
1019 | + head_room += opt->opt_nflen + opt->opt_flen; |
1020 | |
1021 | - /* First: exthdrs may take lots of space (~8K for now) |
1022 | - MAX_HEADER is not enough. |
1023 | - */ |
1024 | - head_room = opt->opt_nflen + opt->opt_flen; |
1025 | - seg_len += head_room; |
1026 | - head_room += sizeof(struct ipv6hdr) + LL_RESERVED_SPACE(dst->dev); |
1027 | - |
1028 | - if (skb_headroom(skb) < head_room) { |
1029 | - struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room); |
1030 | - if (!skb2) { |
1031 | - IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
1032 | - IPSTATS_MIB_OUTDISCARDS); |
1033 | - kfree_skb(skb); |
1034 | - return -ENOBUFS; |
1035 | - } |
1036 | - if (skb->sk) |
1037 | - skb_set_owner_w(skb2, skb->sk); |
1038 | - consume_skb(skb); |
1039 | - skb = skb2; |
1040 | + if (unlikely(skb_headroom(skb) < head_room)) { |
1041 | + struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room); |
1042 | + if (!skb2) { |
1043 | + IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
1044 | + IPSTATS_MIB_OUTDISCARDS); |
1045 | + kfree_skb(skb); |
1046 | + return -ENOBUFS; |
1047 | } |
1048 | + if (skb->sk) |
1049 | + skb_set_owner_w(skb2, skb->sk); |
1050 | + consume_skb(skb); |
1051 | + skb = skb2; |
1052 | + } |
1053 | + |
1054 | + if (opt) { |
1055 | + seg_len += opt->opt_nflen + opt->opt_flen; |
1056 | + |
1057 | if (opt->opt_flen) |
1058 | ipv6_push_frag_opts(skb, opt, &proto); |
1059 | + |
1060 | if (opt->opt_nflen) |
1061 | ipv6_push_nfrag_opts(skb, opt, &proto, &first_hop); |
1062 | } |
1063 | diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c |
1064 | index 079b3c426720..8382b7880b24 100644 |
1065 | --- a/net/netfilter/ipvs/ip_vs_ctl.c |
1066 | +++ b/net/netfilter/ipvs/ip_vs_ctl.c |
1067 | @@ -4013,6 +4013,9 @@ static void __net_exit ip_vs_control_net_cleanup_sysctl(struct netns_ipvs *ipvs) |
1068 | |
1069 | static struct notifier_block ip_vs_dst_notifier = { |
1070 | .notifier_call = ip_vs_dst_event, |
1071 | +#ifdef CONFIG_IP_VS_IPV6 |
1072 | + .priority = ADDRCONF_NOTIFY_PRIORITY + 5, |
1073 | +#endif |
1074 | }; |
1075 | |
1076 | int __net_init ip_vs_control_net_init(struct netns_ipvs *ipvs) |
1077 | diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c |
1078 | index 3f87ddb1777d..2e417c907a28 100644 |
1079 | --- a/net/sched/sch_netem.c |
1080 | +++ b/net/sched/sch_netem.c |
1081 | @@ -442,6 +442,9 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, |
1082 | int count = 1; |
1083 | int rc = NET_XMIT_SUCCESS; |
1084 | |
1085 | + /* Do not fool qdisc_drop_all() */ |
1086 | + skb->prev = NULL; |
1087 | + |
1088 | /* Random duplication */ |
1089 | if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor)) |
1090 | ++count; |
1091 | diff --git a/sound/soc/omap/omap-abe-twl6040.c b/sound/soc/omap/omap-abe-twl6040.c |
1092 | index 89fe95e877db..07af30017b48 100644 |
1093 | --- a/sound/soc/omap/omap-abe-twl6040.c |
1094 | +++ b/sound/soc/omap/omap-abe-twl6040.c |
1095 | @@ -36,6 +36,8 @@ |
1096 | #include "../codecs/twl6040.h" |
1097 | |
1098 | struct abe_twl6040 { |
1099 | + struct snd_soc_card card; |
1100 | + struct snd_soc_dai_link dai_links[2]; |
1101 | int jack_detection; /* board can detect jack events */ |
1102 | int mclk_freq; /* MCLK frequency speed for twl6040 */ |
1103 | }; |
1104 | @@ -208,40 +210,10 @@ static int omap_abe_dmic_init(struct snd_soc_pcm_runtime *rtd) |
1105 | ARRAY_SIZE(dmic_audio_map)); |
1106 | } |
1107 | |
1108 | -/* Digital audio interface glue - connects codec <--> CPU */ |
1109 | -static struct snd_soc_dai_link abe_twl6040_dai_links[] = { |
1110 | - { |
1111 | - .name = "TWL6040", |
1112 | - .stream_name = "TWL6040", |
1113 | - .codec_dai_name = "twl6040-legacy", |
1114 | - .codec_name = "twl6040-codec", |
1115 | - .init = omap_abe_twl6040_init, |
1116 | - .ops = &omap_abe_ops, |
1117 | - }, |
1118 | - { |
1119 | - .name = "DMIC", |
1120 | - .stream_name = "DMIC Capture", |
1121 | - .codec_dai_name = "dmic-hifi", |
1122 | - .codec_name = "dmic-codec", |
1123 | - .init = omap_abe_dmic_init, |
1124 | - .ops = &omap_abe_dmic_ops, |
1125 | - }, |
1126 | -}; |
1127 | - |
1128 | -/* Audio machine driver */ |
1129 | -static struct snd_soc_card omap_abe_card = { |
1130 | - .owner = THIS_MODULE, |
1131 | - |
1132 | - .dapm_widgets = twl6040_dapm_widgets, |
1133 | - .num_dapm_widgets = ARRAY_SIZE(twl6040_dapm_widgets), |
1134 | - .dapm_routes = audio_map, |
1135 | - .num_dapm_routes = ARRAY_SIZE(audio_map), |
1136 | -}; |
1137 | - |
1138 | static int omap_abe_probe(struct platform_device *pdev) |
1139 | { |
1140 | struct device_node *node = pdev->dev.of_node; |
1141 | - struct snd_soc_card *card = &omap_abe_card; |
1142 | + struct snd_soc_card *card; |
1143 | struct device_node *dai_node; |
1144 | struct abe_twl6040 *priv; |
1145 | int num_links = 0; |
1146 | @@ -252,12 +224,18 @@ static int omap_abe_probe(struct platform_device *pdev) |
1147 | return -ENODEV; |
1148 | } |
1149 | |
1150 | - card->dev = &pdev->dev; |
1151 | - |
1152 | priv = devm_kzalloc(&pdev->dev, sizeof(struct abe_twl6040), GFP_KERNEL); |
1153 | if (priv == NULL) |
1154 | return -ENOMEM; |
1155 | |
1156 | + card = &priv->card; |
1157 | + card->dev = &pdev->dev; |
1158 | + card->owner = THIS_MODULE; |
1159 | + card->dapm_widgets = twl6040_dapm_widgets; |
1160 | + card->num_dapm_widgets = ARRAY_SIZE(twl6040_dapm_widgets); |
1161 | + card->dapm_routes = audio_map; |
1162 | + card->num_dapm_routes = ARRAY_SIZE(audio_map); |
1163 | + |
1164 | if (snd_soc_of_parse_card_name(card, "ti,model")) { |
1165 | dev_err(&pdev->dev, "Card name is not provided\n"); |
1166 | return -ENODEV; |
1167 | @@ -274,14 +252,27 @@ static int omap_abe_probe(struct platform_device *pdev) |
1168 | dev_err(&pdev->dev, "McPDM node is not provided\n"); |
1169 | return -EINVAL; |
1170 | } |
1171 | - abe_twl6040_dai_links[0].cpu_of_node = dai_node; |
1172 | - abe_twl6040_dai_links[0].platform_of_node = dai_node; |
1173 | + |
1174 | + priv->dai_links[0].name = "DMIC"; |
1175 | + priv->dai_links[0].stream_name = "TWL6040"; |
1176 | + priv->dai_links[0].cpu_of_node = dai_node; |
1177 | + priv->dai_links[0].platform_of_node = dai_node; |
1178 | + priv->dai_links[0].codec_dai_name = "twl6040-legacy"; |
1179 | + priv->dai_links[0].codec_name = "twl6040-codec"; |
1180 | + priv->dai_links[0].init = omap_abe_twl6040_init; |
1181 | + priv->dai_links[0].ops = &omap_abe_ops; |
1182 | |
1183 | dai_node = of_parse_phandle(node, "ti,dmic", 0); |
1184 | if (dai_node) { |
1185 | num_links = 2; |
1186 | - abe_twl6040_dai_links[1].cpu_of_node = dai_node; |
1187 | - abe_twl6040_dai_links[1].platform_of_node = dai_node; |
1188 | + priv->dai_links[1].name = "TWL6040"; |
1189 | + priv->dai_links[1].stream_name = "DMIC Capture"; |
1190 | + priv->dai_links[1].cpu_of_node = dai_node; |
1191 | + priv->dai_links[1].platform_of_node = dai_node; |
1192 | + priv->dai_links[1].codec_dai_name = "dmic-hifi"; |
1193 | + priv->dai_links[1].codec_name = "dmic-codec"; |
1194 | + priv->dai_links[1].init = omap_abe_dmic_init; |
1195 | + priv->dai_links[1].ops = &omap_abe_dmic_ops; |
1196 | } else { |
1197 | num_links = 1; |
1198 | } |
1199 | @@ -300,7 +291,7 @@ static int omap_abe_probe(struct platform_device *pdev) |
1200 | return -ENODEV; |
1201 | } |
1202 | |
1203 | - card->dai_link = abe_twl6040_dai_links; |
1204 | + card->dai_link = priv->dai_links; |
1205 | card->num_links = num_links; |
1206 | |
1207 | snd_soc_card_set_drvdata(card, priv); |
1208 | diff --git a/sound/soc/omap/omap-dmic.c b/sound/soc/omap/omap-dmic.c |
1209 | index 09db2aec12a3..776e809a8aab 100644 |
1210 | --- a/sound/soc/omap/omap-dmic.c |
1211 | +++ b/sound/soc/omap/omap-dmic.c |
1212 | @@ -48,6 +48,8 @@ struct omap_dmic { |
1213 | struct device *dev; |
1214 | void __iomem *io_base; |
1215 | struct clk *fclk; |
1216 | + struct pm_qos_request pm_qos_req; |
1217 | + int latency; |
1218 | int fclk_freq; |
1219 | int out_freq; |
1220 | int clk_div; |
1221 | @@ -124,6 +126,8 @@ static void omap_dmic_dai_shutdown(struct snd_pcm_substream *substream, |
1222 | |
1223 | mutex_lock(&dmic->mutex); |
1224 | |
1225 | + pm_qos_remove_request(&dmic->pm_qos_req); |
1226 | + |
1227 | if (!dai->active) |
1228 | dmic->active = 0; |
1229 | |
1230 | @@ -226,6 +230,8 @@ static int omap_dmic_dai_hw_params(struct snd_pcm_substream *substream, |
1231 | /* packet size is threshold * channels */ |
1232 | dma_data = snd_soc_dai_get_dma_data(dai, substream); |
1233 | dma_data->maxburst = dmic->threshold * channels; |
1234 | + dmic->latency = (OMAP_DMIC_THRES_MAX - dmic->threshold) * USEC_PER_SEC / |
1235 | + params_rate(params); |
1236 | |
1237 | return 0; |
1238 | } |
1239 | @@ -236,6 +242,9 @@ static int omap_dmic_dai_prepare(struct snd_pcm_substream *substream, |
1240 | struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); |
1241 | u32 ctrl; |
1242 | |
1243 | + if (pm_qos_request_active(&dmic->pm_qos_req)) |
1244 | + pm_qos_update_request(&dmic->pm_qos_req, dmic->latency); |
1245 | + |
1246 | /* Configure uplink threshold */ |
1247 | omap_dmic_write(dmic, OMAP_DMIC_FIFO_CTRL_REG, dmic->threshold); |
1248 | |
1249 | diff --git a/sound/soc/omap/omap-mcpdm.c b/sound/soc/omap/omap-mcpdm.c |
1250 | index 64609c77a79d..44ffeb71cd1d 100644 |
1251 | --- a/sound/soc/omap/omap-mcpdm.c |
1252 | +++ b/sound/soc/omap/omap-mcpdm.c |
1253 | @@ -54,6 +54,8 @@ struct omap_mcpdm { |
1254 | unsigned long phys_base; |
1255 | void __iomem *io_base; |
1256 | int irq; |
1257 | + struct pm_qos_request pm_qos_req; |
1258 | + int latency[2]; |
1259 | |
1260 | struct mutex mutex; |
1261 | |
1262 | @@ -277,6 +279,9 @@ static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream, |
1263 | struct snd_soc_dai *dai) |
1264 | { |
1265 | struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai); |
1266 | + int tx = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); |
1267 | + int stream1 = tx ? SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE; |
1268 | + int stream2 = tx ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; |
1269 | |
1270 | mutex_lock(&mcpdm->mutex); |
1271 | |
1272 | @@ -289,6 +294,14 @@ static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream, |
1273 | } |
1274 | } |
1275 | |
1276 | + if (mcpdm->latency[stream2]) |
1277 | + pm_qos_update_request(&mcpdm->pm_qos_req, |
1278 | + mcpdm->latency[stream2]); |
1279 | + else if (mcpdm->latency[stream1]) |
1280 | + pm_qos_remove_request(&mcpdm->pm_qos_req); |
1281 | + |
1282 | + mcpdm->latency[stream1] = 0; |
1283 | + |
1284 | mutex_unlock(&mcpdm->mutex); |
1285 | } |
1286 | |
1287 | @@ -300,7 +313,7 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream, |
1288 | int stream = substream->stream; |
1289 | struct snd_dmaengine_dai_dma_data *dma_data; |
1290 | u32 threshold; |
1291 | - int channels; |
1292 | + int channels, latency; |
1293 | int link_mask = 0; |
1294 | |
1295 | channels = params_channels(params); |
1296 | @@ -340,14 +353,25 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream, |
1297 | |
1298 | dma_data->maxburst = |
1299 | (MCPDM_DN_THRES_MAX - threshold) * channels; |
1300 | + latency = threshold; |
1301 | } else { |
1302 | /* If playback is not running assume a stereo stream to come */ |
1303 | if (!mcpdm->config[!stream].link_mask) |
1304 | mcpdm->config[!stream].link_mask = (0x3 << 3); |
1305 | |
1306 | dma_data->maxburst = threshold * channels; |
1307 | + latency = (MCPDM_DN_THRES_MAX - threshold); |
1308 | } |
1309 | |
1310 | + /* |
1311 | + * The DMA must act to a DMA request within latency time (usec) to avoid |
1312 | + * under/overflow |
1313 | + */ |
1314 | + mcpdm->latency[stream] = latency * USEC_PER_SEC / params_rate(params); |
1315 | + |
1316 | + if (!mcpdm->latency[stream]) |
1317 | + mcpdm->latency[stream] = 10; |
1318 | + |
1319 | /* Check if we need to restart McPDM with this stream */ |
1320 | if (mcpdm->config[stream].link_mask && |
1321 | mcpdm->config[stream].link_mask != link_mask) |
1322 | @@ -362,6 +386,20 @@ static int omap_mcpdm_prepare(struct snd_pcm_substream *substream, |
1323 | struct snd_soc_dai *dai) |
1324 | { |
1325 | struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai); |
1326 | + struct pm_qos_request *pm_qos_req = &mcpdm->pm_qos_req; |
1327 | + int tx = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); |
1328 | + int stream1 = tx ? SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE; |
1329 | + int stream2 = tx ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; |
1330 | + int latency = mcpdm->latency[stream2]; |
1331 | + |
1332 | + /* Prevent omap hardware from hitting off between FIFO fills */ |
1333 | + if (!latency || mcpdm->latency[stream1] < latency) |
1334 | + latency = mcpdm->latency[stream1]; |
1335 | + |
1336 | + if (pm_qos_request_active(pm_qos_req)) |
1337 | + pm_qos_update_request(pm_qos_req, latency); |
1338 | + else if (latency) |
1339 | + pm_qos_add_request(pm_qos_req, PM_QOS_CPU_DMA_LATENCY, latency); |
1340 | |
1341 | if (!omap_mcpdm_active(mcpdm)) { |
1342 | omap_mcpdm_start(mcpdm); |
1343 | @@ -423,6 +461,9 @@ static int omap_mcpdm_remove(struct snd_soc_dai *dai) |
1344 | free_irq(mcpdm->irq, (void *)mcpdm); |
1345 | pm_runtime_disable(mcpdm->dev); |
1346 | |
1347 | + if (pm_qos_request_active(&mcpdm->pm_qos_req)) |
1348 | + pm_qos_remove_request(&mcpdm->pm_qos_req); |
1349 | + |
1350 | return 0; |
1351 | } |
1352 | |
1353 | diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c |
1354 | index 4e3de566809c..168559b5e9f3 100644 |
1355 | --- a/sound/soc/soc-core.c |
1356 | +++ b/sound/soc/soc-core.c |
1357 | @@ -2018,6 +2018,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card) |
1358 | } |
1359 | |
1360 | card->instantiated = 1; |
1361 | + dapm_mark_endpoints_dirty(card); |
1362 | snd_soc_dapm_sync(&card->dapm); |
1363 | mutex_unlock(&card->mutex); |
1364 | mutex_unlock(&client_mutex); |
1365 | diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c |
1366 | index 0d1acb704f64..dd4ed7c3c062 100644 |
1367 | --- a/tools/objtool/elf.c |
1368 | +++ b/tools/objtool/elf.c |
1369 | @@ -31,6 +31,8 @@ |
1370 | #include "elf.h" |
1371 | #include "warn.h" |
1372 | |
1373 | +#define MAX_NAME_LEN 128 |
1374 | + |
1375 | struct section *find_section_by_name(struct elf *elf, const char *name) |
1376 | { |
1377 | struct section *sec; |
1378 | @@ -298,6 +300,8 @@ static int read_symbols(struct elf *elf) |
1379 | /* Create parent/child links for any cold subfunctions */ |
1380 | list_for_each_entry(sec, &elf->sections, list) { |
1381 | list_for_each_entry(sym, &sec->symbol_list, list) { |
1382 | + char pname[MAX_NAME_LEN + 1]; |
1383 | + size_t pnamelen; |
1384 | if (sym->type != STT_FUNC) |
1385 | continue; |
1386 | sym->pfunc = sym->cfunc = sym; |
1387 | @@ -305,14 +309,21 @@ static int read_symbols(struct elf *elf) |
1388 | if (!coldstr) |
1389 | continue; |
1390 | |
1391 | - coldstr[0] = '\0'; |
1392 | - pfunc = find_symbol_by_name(elf, sym->name); |
1393 | - coldstr[0] = '.'; |
1394 | + pnamelen = coldstr - sym->name; |
1395 | + if (pnamelen > MAX_NAME_LEN) { |
1396 | + WARN("%s(): parent function name exceeds maximum length of %d characters", |
1397 | + sym->name, MAX_NAME_LEN); |
1398 | + return -1; |
1399 | + } |
1400 | + |
1401 | + strncpy(pname, sym->name, pnamelen); |
1402 | + pname[pnamelen] = '\0'; |
1403 | + pfunc = find_symbol_by_name(elf, pname); |
1404 | |
1405 | if (!pfunc) { |
1406 | WARN("%s(): can't find parent function", |
1407 | sym->name); |
1408 | - goto err; |
1409 | + return -1; |
1410 | } |
1411 | |
1412 | sym->pfunc = pfunc; |
1413 | diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile |
1414 | index 76faf5bf0b32..d37dfc6608c6 100644 |
1415 | --- a/tools/testing/selftests/Makefile |
1416 | +++ b/tools/testing/selftests/Makefile |
1417 | @@ -15,6 +15,7 @@ TARGETS += memory-hotplug |
1418 | TARGETS += mount |
1419 | TARGETS += mqueue |
1420 | TARGETS += net |
1421 | +TARGETS += netfilter |
1422 | TARGETS += nsfs |
1423 | TARGETS += powerpc |
1424 | TARGETS += pstore |
1425 | diff --git a/tools/testing/selftests/netfilter/Makefile b/tools/testing/selftests/netfilter/Makefile |
1426 | new file mode 100644 |
1427 | index 000000000000..47ed6cef93fb |
1428 | --- /dev/null |
1429 | +++ b/tools/testing/selftests/netfilter/Makefile |
1430 | @@ -0,0 +1,6 @@ |
1431 | +# SPDX-License-Identifier: GPL-2.0 |
1432 | +# Makefile for netfilter selftests |
1433 | + |
1434 | +TEST_PROGS := nft_trans_stress.sh |
1435 | + |
1436 | +include ../lib.mk |
1437 | diff --git a/tools/testing/selftests/netfilter/config b/tools/testing/selftests/netfilter/config |
1438 | new file mode 100644 |
1439 | index 000000000000..1017313e41a8 |
1440 | --- /dev/null |
1441 | +++ b/tools/testing/selftests/netfilter/config |
1442 | @@ -0,0 +1,2 @@ |
1443 | +CONFIG_NET_NS=y |
1444 | +NF_TABLES_INET=y |
1445 | diff --git a/tools/testing/selftests/netfilter/nft_trans_stress.sh b/tools/testing/selftests/netfilter/nft_trans_stress.sh |
1446 | new file mode 100755 |
1447 | index 000000000000..f1affd12c4b1 |
1448 | --- /dev/null |
1449 | +++ b/tools/testing/selftests/netfilter/nft_trans_stress.sh |
1450 | @@ -0,0 +1,78 @@ |
1451 | +#!/bin/bash |
1452 | +# |
1453 | +# This test is for stress-testing the nf_tables config plane path vs. |
1454 | +# packet path processing: Make sure we never release rules that are |
1455 | +# still visible to other cpus. |
1456 | +# |
1457 | +# set -e |
1458 | + |
1459 | +# Kselftest framework requirement - SKIP code is 4. |
1460 | +ksft_skip=4 |
1461 | + |
1462 | +testns=testns1 |
1463 | +tables="foo bar baz quux" |
1464 | + |
1465 | +nft --version > /dev/null 2>&1 |
1466 | +if [ $? -ne 0 ];then |
1467 | + echo "SKIP: Could not run test without nft tool" |
1468 | + exit $ksft_skip |
1469 | +fi |
1470 | + |
1471 | +ip -Version > /dev/null 2>&1 |
1472 | +if [ $? -ne 0 ];then |
1473 | + echo "SKIP: Could not run test without ip tool" |
1474 | + exit $ksft_skip |
1475 | +fi |
1476 | + |
1477 | +tmp=$(mktemp) |
1478 | + |
1479 | +for table in $tables; do |
1480 | + echo add table inet "$table" >> "$tmp" |
1481 | + echo flush table inet "$table" >> "$tmp" |
1482 | + |
1483 | + echo "add chain inet $table INPUT { type filter hook input priority 0; }" >> "$tmp" |
1484 | + echo "add chain inet $table OUTPUT { type filter hook output priority 0; }" >> "$tmp" |
1485 | + for c in $(seq 1 400); do |
1486 | + chain=$(printf "chain%03u" "$c") |
1487 | + echo "add chain inet $table $chain" >> "$tmp" |
1488 | + done |
1489 | + |
1490 | + for c in $(seq 1 400); do |
1491 | + chain=$(printf "chain%03u" "$c") |
1492 | + for BASE in INPUT OUTPUT; do |
1493 | + echo "add rule inet $table $BASE counter jump $chain" >> "$tmp" |
1494 | + done |
1495 | + echo "add rule inet $table $chain counter return" >> "$tmp" |
1496 | + done |
1497 | +done |
1498 | + |
1499 | +ip netns add "$testns" |
1500 | +ip -netns "$testns" link set lo up |
1501 | + |
1502 | +lscpu | grep ^CPU\(s\): | ( read cpu cpunum ; |
1503 | +cpunum=$((cpunum-1)) |
1504 | +for i in $(seq 0 $cpunum);do |
1505 | + mask=$(printf 0x%x $((1<<$i))) |
1506 | + ip netns exec "$testns" taskset $mask ping -4 127.0.0.1 -fq > /dev/null & |
1507 | + ip netns exec "$testns" taskset $mask ping -6 ::1 -fq > /dev/null & |
1508 | +done) |
1509 | + |
1510 | +sleep 1 |
1511 | + |
1512 | +for i in $(seq 1 10) ; do ip netns exec "$testns" nft -f "$tmp" & done |
1513 | + |
1514 | +for table in $tables;do |
1515 | + randsleep=$((RANDOM%10)) |
1516 | + sleep $randsleep |
1517 | + ip netns exec "$testns" nft delete table inet $table 2>/dev/null |
1518 | +done |
1519 | + |
1520 | +randsleep=$((RANDOM%10)) |
1521 | +sleep $randsleep |
1522 | + |
1523 | +pkill -9 ping |
1524 | + |
1525 | +wait |
1526 | + |
1527 | +rm -f "$tmp" |
1528 | +ip netns del "$testns" |