Annotation of /trunk/kernel-alx-legacy/patches-4.9/0245-4.9.146-all-fixes.patch
Parent Directory | Revision Log
Revision 3608 -
(hide annotations)
(download)
Fri Aug 14 07:34:29 2020 UTC (4 years, 1 month ago) by niro
File size: 48129 byte(s)
Fri Aug 14 07:34:29 2020 UTC (4 years, 1 month ago) by niro
File size: 48129 byte(s)
-added kerenl-alx-legacy pkg
1 | niro | 3608 | 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" |