Contents of /trunk/kernel-magellan/patches-4.5/0104-4.5.5-all-fixes.patch
Parent Directory | Revision Log
Revision 2789 -
(show annotations)
(download)
Mon May 23 14:57:37 2016 UTC (8 years, 4 months ago) by niro
File size: 161366 byte(s)
Mon May 23 14:57:37 2016 UTC (8 years, 4 months ago) by niro
File size: 161366 byte(s)
-linux-4.5.5
1 | diff --git a/Makefile b/Makefile |
2 | index d64eade37241..a23df411d393 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 5 |
8 | -SUBLEVEL = 4 |
9 | +SUBLEVEL = 5 |
10 | EXTRAVERSION = |
11 | NAME = Blurry Fish Butt |
12 | |
13 | diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi |
14 | index 0827d594b1f0..cd0cd5fd09a3 100644 |
15 | --- a/arch/arm/boot/dts/at91sam9x5.dtsi |
16 | +++ b/arch/arm/boot/dts/at91sam9x5.dtsi |
17 | @@ -106,7 +106,7 @@ |
18 | |
19 | pmc: pmc@fffffc00 { |
20 | compatible = "atmel,at91sam9x5-pmc", "syscon"; |
21 | - reg = <0xfffffc00 0x100>; |
22 | + reg = <0xfffffc00 0x200>; |
23 | interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>; |
24 | interrupt-controller; |
25 | #address-cells = <1>; |
26 | diff --git a/crypto/ahash.c b/crypto/ahash.c |
27 | index d19b52324cf5..dac1c24e9c3e 100644 |
28 | --- a/crypto/ahash.c |
29 | +++ b/crypto/ahash.c |
30 | @@ -69,8 +69,9 @@ static int hash_walk_new_entry(struct crypto_hash_walk *walk) |
31 | struct scatterlist *sg; |
32 | |
33 | sg = walk->sg; |
34 | - walk->pg = sg_page(sg); |
35 | walk->offset = sg->offset; |
36 | + walk->pg = sg_page(walk->sg) + (walk->offset >> PAGE_SHIFT); |
37 | + walk->offset = offset_in_page(walk->offset); |
38 | walk->entrylen = sg->length; |
39 | |
40 | if (walk->entrylen > walk->total) |
41 | diff --git a/crypto/testmgr.c b/crypto/testmgr.c |
42 | index ae8c57fd8bc7..d4944318ca1f 100644 |
43 | --- a/crypto/testmgr.c |
44 | +++ b/crypto/testmgr.c |
45 | @@ -1849,6 +1849,7 @@ static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, |
46 | static int do_test_rsa(struct crypto_akcipher *tfm, |
47 | struct akcipher_testvec *vecs) |
48 | { |
49 | + char *xbuf[XBUFSIZE]; |
50 | struct akcipher_request *req; |
51 | void *outbuf_enc = NULL; |
52 | void *outbuf_dec = NULL; |
53 | @@ -1857,9 +1858,12 @@ static int do_test_rsa(struct crypto_akcipher *tfm, |
54 | int err = -ENOMEM; |
55 | struct scatterlist src, dst, src_tab[2]; |
56 | |
57 | + if (testmgr_alloc_buf(xbuf)) |
58 | + return err; |
59 | + |
60 | req = akcipher_request_alloc(tfm, GFP_KERNEL); |
61 | if (!req) |
62 | - return err; |
63 | + goto free_xbuf; |
64 | |
65 | init_completion(&result.completion); |
66 | |
67 | @@ -1877,9 +1881,14 @@ static int do_test_rsa(struct crypto_akcipher *tfm, |
68 | if (!outbuf_enc) |
69 | goto free_req; |
70 | |
71 | + if (WARN_ON(vecs->m_size > PAGE_SIZE)) |
72 | + goto free_all; |
73 | + |
74 | + memcpy(xbuf[0], vecs->m, vecs->m_size); |
75 | + |
76 | sg_init_table(src_tab, 2); |
77 | - sg_set_buf(&src_tab[0], vecs->m, 8); |
78 | - sg_set_buf(&src_tab[1], vecs->m + 8, vecs->m_size - 8); |
79 | + sg_set_buf(&src_tab[0], xbuf[0], 8); |
80 | + sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8); |
81 | sg_init_one(&dst, outbuf_enc, out_len_max); |
82 | akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, |
83 | out_len_max); |
84 | @@ -1898,7 +1907,7 @@ static int do_test_rsa(struct crypto_akcipher *tfm, |
85 | goto free_all; |
86 | } |
87 | /* verify that encrypted message is equal to expected */ |
88 | - if (memcmp(vecs->c, sg_virt(req->dst), vecs->c_size)) { |
89 | + if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) { |
90 | pr_err("alg: rsa: encrypt test failed. Invalid output\n"); |
91 | err = -EINVAL; |
92 | goto free_all; |
93 | @@ -1913,7 +1922,13 @@ static int do_test_rsa(struct crypto_akcipher *tfm, |
94 | err = -ENOMEM; |
95 | goto free_all; |
96 | } |
97 | - sg_init_one(&src, vecs->c, vecs->c_size); |
98 | + |
99 | + if (WARN_ON(vecs->c_size > PAGE_SIZE)) |
100 | + goto free_all; |
101 | + |
102 | + memcpy(xbuf[0], vecs->c, vecs->c_size); |
103 | + |
104 | + sg_init_one(&src, xbuf[0], vecs->c_size); |
105 | sg_init_one(&dst, outbuf_dec, out_len_max); |
106 | init_completion(&result.completion); |
107 | akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); |
108 | @@ -1940,6 +1955,8 @@ free_all: |
109 | kfree(outbuf_enc); |
110 | free_req: |
111 | akcipher_request_free(req); |
112 | +free_xbuf: |
113 | + testmgr_free_buf(xbuf); |
114 | return err; |
115 | } |
116 | |
117 | diff --git a/drivers/base/regmap/regmap-spmi.c b/drivers/base/regmap/regmap-spmi.c |
118 | index 7e58f6560399..4a36e415e938 100644 |
119 | --- a/drivers/base/regmap/regmap-spmi.c |
120 | +++ b/drivers/base/regmap/regmap-spmi.c |
121 | @@ -142,7 +142,7 @@ static int regmap_spmi_ext_read(void *context, |
122 | while (val_size) { |
123 | len = min_t(size_t, val_size, 8); |
124 | |
125 | - err = spmi_ext_register_readl(context, addr, val, val_size); |
126 | + err = spmi_ext_register_readl(context, addr, val, len); |
127 | if (err) |
128 | goto err_out; |
129 | |
130 | diff --git a/drivers/crypto/qat/qat_common/adf_common_drv.h b/drivers/crypto/qat/qat_common/adf_common_drv.h |
131 | index 0e82ce3c383e..976b01e58afb 100644 |
132 | --- a/drivers/crypto/qat/qat_common/adf_common_drv.h |
133 | +++ b/drivers/crypto/qat/qat_common/adf_common_drv.h |
134 | @@ -236,6 +236,8 @@ void adf_enable_vf2pf_interrupts(struct adf_accel_dev *accel_dev, |
135 | uint32_t vf_mask); |
136 | void adf_enable_pf2vf_interrupts(struct adf_accel_dev *accel_dev); |
137 | void adf_disable_pf2vf_interrupts(struct adf_accel_dev *accel_dev); |
138 | +int adf_init_pf_wq(void); |
139 | +void adf_exit_pf_wq(void); |
140 | #else |
141 | static inline int adf_sriov_configure(struct pci_dev *pdev, int numvfs) |
142 | { |
143 | @@ -253,5 +255,14 @@ static inline void adf_enable_pf2vf_interrupts(struct adf_accel_dev *accel_dev) |
144 | static inline void adf_disable_pf2vf_interrupts(struct adf_accel_dev *accel_dev) |
145 | { |
146 | } |
147 | + |
148 | +static inline int adf_init_pf_wq(void) |
149 | +{ |
150 | + return 0; |
151 | +} |
152 | + |
153 | +static inline void adf_exit_pf_wq(void) |
154 | +{ |
155 | +} |
156 | #endif |
157 | #endif |
158 | diff --git a/drivers/crypto/qat/qat_common/adf_ctl_drv.c b/drivers/crypto/qat/qat_common/adf_ctl_drv.c |
159 | index 5c897e6e7994..3c3f948290ca 100644 |
160 | --- a/drivers/crypto/qat/qat_common/adf_ctl_drv.c |
161 | +++ b/drivers/crypto/qat/qat_common/adf_ctl_drv.c |
162 | @@ -462,12 +462,17 @@ static int __init adf_register_ctl_device_driver(void) |
163 | if (adf_init_aer()) |
164 | goto err_aer; |
165 | |
166 | + if (adf_init_pf_wq()) |
167 | + goto err_pf_wq; |
168 | + |
169 | if (qat_crypto_register()) |
170 | goto err_crypto_register; |
171 | |
172 | return 0; |
173 | |
174 | err_crypto_register: |
175 | + adf_exit_pf_wq(); |
176 | +err_pf_wq: |
177 | adf_exit_aer(); |
178 | err_aer: |
179 | adf_chr_drv_destroy(); |
180 | @@ -480,6 +485,7 @@ static void __exit adf_unregister_ctl_device_driver(void) |
181 | { |
182 | adf_chr_drv_destroy(); |
183 | adf_exit_aer(); |
184 | + adf_exit_pf_wq(); |
185 | qat_crypto_unregister(); |
186 | adf_clean_vf_map(false); |
187 | mutex_destroy(&adf_ctl_lock); |
188 | diff --git a/drivers/crypto/qat/qat_common/adf_sriov.c b/drivers/crypto/qat/qat_common/adf_sriov.c |
189 | index 1117a8b58280..38a0415e767d 100644 |
190 | --- a/drivers/crypto/qat/qat_common/adf_sriov.c |
191 | +++ b/drivers/crypto/qat/qat_common/adf_sriov.c |
192 | @@ -119,11 +119,6 @@ static int adf_enable_sriov(struct adf_accel_dev *accel_dev) |
193 | int i; |
194 | u32 reg; |
195 | |
196 | - /* Workqueue for PF2VF responses */ |
197 | - pf2vf_resp_wq = create_workqueue("qat_pf2vf_resp_wq"); |
198 | - if (!pf2vf_resp_wq) |
199 | - return -ENOMEM; |
200 | - |
201 | for (i = 0, vf_info = accel_dev->pf.vf_info; i < totalvfs; |
202 | i++, vf_info++) { |
203 | /* This ptr will be populated when VFs will be created */ |
204 | @@ -216,11 +211,6 @@ void adf_disable_sriov(struct adf_accel_dev *accel_dev) |
205 | |
206 | kfree(accel_dev->pf.vf_info); |
207 | accel_dev->pf.vf_info = NULL; |
208 | - |
209 | - if (pf2vf_resp_wq) { |
210 | - destroy_workqueue(pf2vf_resp_wq); |
211 | - pf2vf_resp_wq = NULL; |
212 | - } |
213 | } |
214 | EXPORT_SYMBOL_GPL(adf_disable_sriov); |
215 | |
216 | @@ -304,3 +294,19 @@ int adf_sriov_configure(struct pci_dev *pdev, int numvfs) |
217 | return numvfs; |
218 | } |
219 | EXPORT_SYMBOL_GPL(adf_sriov_configure); |
220 | + |
221 | +int __init adf_init_pf_wq(void) |
222 | +{ |
223 | + /* Workqueue for PF2VF responses */ |
224 | + pf2vf_resp_wq = create_workqueue("qat_pf2vf_resp_wq"); |
225 | + |
226 | + return !pf2vf_resp_wq ? -ENOMEM : 0; |
227 | +} |
228 | + |
229 | +void adf_exit_pf_wq(void) |
230 | +{ |
231 | + if (pf2vf_resp_wq) { |
232 | + destroy_workqueue(pf2vf_resp_wq); |
233 | + pf2vf_resp_wq = NULL; |
234 | + } |
235 | +} |
236 | diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c |
237 | index bf731e9f643e..7f85c2c1d681 100644 |
238 | --- a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c |
239 | +++ b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c |
240 | @@ -276,8 +276,8 @@ static int amdgpu_atombios_dp_get_dp_link_config(struct drm_connector *connector |
241 | } |
242 | } |
243 | } else { |
244 | - for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) { |
245 | - for (i = 0; i < ARRAY_SIZE(link_rates) && link_rates[i] <= max_link_rate; i++) { |
246 | + for (i = 0; i < ARRAY_SIZE(link_rates) && link_rates[i] <= max_link_rate; i++) { |
247 | + for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) { |
248 | max_pix_clock = (lane_num * link_rates[i] * 8) / bpp; |
249 | if (max_pix_clock >= pix_clock) { |
250 | *dp_lanes = lane_num; |
251 | diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c |
252 | index cf39ed3133d6..4d0bc2a8843c 100644 |
253 | --- a/drivers/gpu/drm/i915/i915_debugfs.c |
254 | +++ b/drivers/gpu/drm/i915/i915_debugfs.c |
255 | @@ -2860,20 +2860,6 @@ static void intel_dp_info(struct seq_file *m, |
256 | intel_panel_info(m, &intel_connector->panel); |
257 | } |
258 | |
259 | -static void intel_dp_mst_info(struct seq_file *m, |
260 | - struct intel_connector *intel_connector) |
261 | -{ |
262 | - struct intel_encoder *intel_encoder = intel_connector->encoder; |
263 | - struct intel_dp_mst_encoder *intel_mst = |
264 | - enc_to_mst(&intel_encoder->base); |
265 | - struct intel_digital_port *intel_dig_port = intel_mst->primary; |
266 | - struct intel_dp *intel_dp = &intel_dig_port->dp; |
267 | - bool has_audio = drm_dp_mst_port_has_audio(&intel_dp->mst_mgr, |
268 | - intel_connector->port); |
269 | - |
270 | - seq_printf(m, "\taudio support: %s\n", yesno(has_audio)); |
271 | -} |
272 | - |
273 | static void intel_hdmi_info(struct seq_file *m, |
274 | struct intel_connector *intel_connector) |
275 | { |
276 | @@ -2917,8 +2903,6 @@ static void intel_connector_info(struct seq_file *m, |
277 | intel_hdmi_info(m, intel_connector); |
278 | else if (intel_encoder->type == INTEL_OUTPUT_LVDS) |
279 | intel_lvds_info(m, intel_connector); |
280 | - else if (intel_encoder->type == INTEL_OUTPUT_DP_MST) |
281 | - intel_dp_mst_info(m, intel_connector); |
282 | } |
283 | |
284 | seq_printf(m, "\tmodes:\n"); |
285 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h |
286 | index 9b6737c85acb..5672b57e65d5 100644 |
287 | --- a/drivers/gpu/drm/i915/i915_reg.h |
288 | +++ b/drivers/gpu/drm/i915/i915_reg.h |
289 | @@ -7412,6 +7412,8 @@ enum skl_disp_power_wells { |
290 | #define TRANS_CLK_SEL_DISABLED (0x0<<29) |
291 | #define TRANS_CLK_SEL_PORT(x) (((x)+1)<<29) |
292 | |
293 | +#define CDCLK_FREQ _MMIO(0x46200) |
294 | + |
295 | #define _TRANSA_MSA_MISC 0x60410 |
296 | #define _TRANSB_MSA_MISC 0x61410 |
297 | #define _TRANSC_MSA_MISC 0x62410 |
298 | diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c |
299 | index 30f921421b0c..7d281b40064a 100644 |
300 | --- a/drivers/gpu/drm/i915/intel_audio.c |
301 | +++ b/drivers/gpu/drm/i915/intel_audio.c |
302 | @@ -262,8 +262,7 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder) |
303 | tmp |= AUD_CONFIG_N_PROG_ENABLE; |
304 | tmp &= ~AUD_CONFIG_UPPER_N_MASK; |
305 | tmp &= ~AUD_CONFIG_LOWER_N_MASK; |
306 | - if (intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DISPLAYPORT) || |
307 | - intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DP_MST)) |
308 | + if (intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DISPLAYPORT)) |
309 | tmp |= AUD_CONFIG_N_VALUE_INDEX; |
310 | I915_WRITE(HSW_AUD_CFG(pipe), tmp); |
311 | |
312 | @@ -476,8 +475,7 @@ static void ilk_audio_codec_enable(struct drm_connector *connector, |
313 | tmp &= ~AUD_CONFIG_N_VALUE_INDEX; |
314 | tmp &= ~AUD_CONFIG_N_PROG_ENABLE; |
315 | tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK; |
316 | - if (intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DISPLAYPORT) || |
317 | - intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DP_MST)) |
318 | + if (intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DISPLAYPORT)) |
319 | tmp |= AUD_CONFIG_N_VALUE_INDEX; |
320 | else |
321 | tmp |= audio_config_hdmi_pixel_clock(adjusted_mode); |
322 | @@ -515,8 +513,7 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder) |
323 | |
324 | /* ELD Conn_Type */ |
325 | connector->eld[5] &= ~(3 << 2); |
326 | - if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) || |
327 | - intel_pipe_has_type(crtc, INTEL_OUTPUT_DP_MST)) |
328 | + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) |
329 | connector->eld[5] |= (1 << 2); |
330 | |
331 | connector->eld[6] = drm_av_sync_delay(connector, adjusted_mode) / 2; |
332 | diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c |
333 | index a7b4a524fadd..dbacc2901d47 100644 |
334 | --- a/drivers/gpu/drm/i915/intel_crt.c |
335 | +++ b/drivers/gpu/drm/i915/intel_crt.c |
336 | @@ -255,8 +255,14 @@ static bool intel_crt_compute_config(struct intel_encoder *encoder, |
337 | pipe_config->has_pch_encoder = true; |
338 | |
339 | /* LPT FDI RX only supports 8bpc. */ |
340 | - if (HAS_PCH_LPT(dev)) |
341 | + if (HAS_PCH_LPT(dev)) { |
342 | + if (pipe_config->bw_constrained && pipe_config->pipe_bpp < 24) { |
343 | + DRM_DEBUG_KMS("LPT only supports 24bpp\n"); |
344 | + return false; |
345 | + } |
346 | + |
347 | pipe_config->pipe_bpp = 24; |
348 | + } |
349 | |
350 | /* FDI must always be 2.7 GHz */ |
351 | if (HAS_DDI(dev)) { |
352 | diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c |
353 | index 33b8e0a2b3fd..40511493914c 100644 |
354 | --- a/drivers/gpu/drm/i915/intel_ddi.c |
355 | +++ b/drivers/gpu/drm/i915/intel_ddi.c |
356 | @@ -3165,23 +3165,6 @@ void intel_ddi_fdi_disable(struct drm_crtc *crtc) |
357 | I915_WRITE(FDI_RX_CTL(PIPE_A), val); |
358 | } |
359 | |
360 | -bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv, |
361 | - struct intel_crtc *intel_crtc) |
362 | -{ |
363 | - u32 temp; |
364 | - |
365 | - if (intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_AUDIO)) { |
366 | - temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD); |
367 | - |
368 | - intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO); |
369 | - |
370 | - if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe)) |
371 | - return true; |
372 | - } |
373 | - |
374 | - return false; |
375 | -} |
376 | - |
377 | void intel_ddi_get_config(struct intel_encoder *encoder, |
378 | struct intel_crtc_state *pipe_config) |
379 | { |
380 | @@ -3242,8 +3225,11 @@ void intel_ddi_get_config(struct intel_encoder *encoder, |
381 | break; |
382 | } |
383 | |
384 | - pipe_config->has_audio = |
385 | - intel_ddi_is_audio_enabled(dev_priv, intel_crtc); |
386 | + if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) { |
387 | + temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD); |
388 | + if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe)) |
389 | + pipe_config->has_audio = true; |
390 | + } |
391 | |
392 | if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp && |
393 | pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) { |
394 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
395 | index c023a04c44d0..39b00b9daf2d 100644 |
396 | --- a/drivers/gpu/drm/i915/intel_display.c |
397 | +++ b/drivers/gpu/drm/i915/intel_display.c |
398 | @@ -9793,6 +9793,8 @@ static void broadwell_set_cdclk(struct drm_device *dev, int cdclk) |
399 | sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ, data); |
400 | mutex_unlock(&dev_priv->rps.hw_lock); |
401 | |
402 | + I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1); |
403 | + |
404 | intel_update_cdclk(dev); |
405 | |
406 | WARN(cdclk != dev_priv->cdclk_freq, |
407 | diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c |
408 | index db6361b5a6ab..e8e6984b8053 100644 |
409 | --- a/drivers/gpu/drm/i915/intel_dp_mst.c |
410 | +++ b/drivers/gpu/drm/i915/intel_dp_mst.c |
411 | @@ -78,8 +78,6 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, |
412 | return false; |
413 | } |
414 | |
415 | - if (drm_dp_mst_port_has_audio(&intel_dp->mst_mgr, found->port)) |
416 | - pipe_config->has_audio = true; |
417 | mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp); |
418 | |
419 | pipe_config->pbn = mst_pbn; |
420 | @@ -104,11 +102,6 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder) |
421 | struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); |
422 | struct intel_digital_port *intel_dig_port = intel_mst->primary; |
423 | struct intel_dp *intel_dp = &intel_dig_port->dp; |
424 | - struct drm_device *dev = encoder->base.dev; |
425 | - struct drm_i915_private *dev_priv = dev->dev_private; |
426 | - struct drm_crtc *crtc = encoder->base.crtc; |
427 | - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
428 | - |
429 | int ret; |
430 | |
431 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); |
432 | @@ -119,10 +112,6 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder) |
433 | if (ret) { |
434 | DRM_ERROR("failed to update payload %d\n", ret); |
435 | } |
436 | - if (intel_crtc->config->has_audio) { |
437 | - intel_audio_codec_disable(encoder); |
438 | - intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO); |
439 | - } |
440 | } |
441 | |
442 | static void intel_mst_post_disable_dp(struct intel_encoder *encoder) |
443 | @@ -219,7 +208,6 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder) |
444 | struct intel_dp *intel_dp = &intel_dig_port->dp; |
445 | struct drm_device *dev = intel_dig_port->base.base.dev; |
446 | struct drm_i915_private *dev_priv = dev->dev_private; |
447 | - struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); |
448 | enum port port = intel_dig_port->port; |
449 | int ret; |
450 | |
451 | @@ -232,13 +220,6 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder) |
452 | ret = drm_dp_check_act_status(&intel_dp->mst_mgr); |
453 | |
454 | ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr); |
455 | - |
456 | - if (crtc->config->has_audio) { |
457 | - DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n", |
458 | - pipe_name(crtc->pipe)); |
459 | - intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO); |
460 | - intel_audio_codec_enable(encoder); |
461 | - } |
462 | } |
463 | |
464 | static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, |
465 | @@ -264,9 +245,6 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder, |
466 | |
467 | pipe_config->has_dp_encoder = true; |
468 | |
469 | - pipe_config->has_audio = |
470 | - intel_ddi_is_audio_enabled(dev_priv, crtc); |
471 | - |
472 | temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); |
473 | if (temp & TRANS_DDI_PHSYNC) |
474 | flags |= DRM_MODE_FLAG_PHSYNC; |
475 | diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h |
476 | index 3ce3bee368fe..1ae61f488987 100644 |
477 | --- a/drivers/gpu/drm/i915/intel_drv.h |
478 | +++ b/drivers/gpu/drm/i915/intel_drv.h |
479 | @@ -1013,8 +1013,6 @@ void intel_ddi_set_pipe_settings(struct drm_crtc *crtc); |
480 | void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp); |
481 | bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector); |
482 | void intel_ddi_fdi_disable(struct drm_crtc *crtc); |
483 | -bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv, |
484 | - struct intel_crtc *intel_crtc); |
485 | void intel_ddi_get_config(struct intel_encoder *encoder, |
486 | struct intel_crtc_state *pipe_config); |
487 | struct intel_encoder * |
488 | diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c |
489 | index 7e4a9842b9ea..0eae3994e5e3 100644 |
490 | --- a/drivers/gpu/drm/i915/intel_pm.c |
491 | +++ b/drivers/gpu/drm/i915/intel_pm.c |
492 | @@ -6565,6 +6565,12 @@ static void broadwell_init_clock_gating(struct drm_device *dev) |
493 | misccpctl = I915_READ(GEN7_MISCCPCTL); |
494 | I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE); |
495 | I915_WRITE(GEN8_L3SQCREG1, BDW_WA_L3SQCREG1_DEFAULT); |
496 | + /* |
497 | + * Wait at least 100 clocks before re-enabling clock gating. See |
498 | + * the definition of L3SQCREG1 in BSpec. |
499 | + */ |
500 | + POSTING_READ(GEN8_L3SQCREG1); |
501 | + udelay(1); |
502 | I915_WRITE(GEN7_MISCCPCTL, misccpctl); |
503 | |
504 | /* |
505 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c |
506 | index 801dd60ac192..7f52142d37d5 100644 |
507 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c |
508 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c |
509 | @@ -1740,6 +1740,7 @@ static u32 radeon_get_pll_use_mask(struct drm_crtc *crtc) |
510 | static int radeon_get_shared_dp_ppll(struct drm_crtc *crtc) |
511 | { |
512 | struct drm_device *dev = crtc->dev; |
513 | + struct radeon_device *rdev = dev->dev_private; |
514 | struct drm_crtc *test_crtc; |
515 | struct radeon_crtc *test_radeon_crtc; |
516 | |
517 | @@ -1749,6 +1750,10 @@ static int radeon_get_shared_dp_ppll(struct drm_crtc *crtc) |
518 | test_radeon_crtc = to_radeon_crtc(test_crtc); |
519 | if (test_radeon_crtc->encoder && |
520 | ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_radeon_crtc->encoder))) { |
521 | + /* PPLL2 is exclusive to UNIPHYA on DCE61 */ |
522 | + if (ASIC_IS_DCE61(rdev) && !ASIC_IS_DCE8(rdev) && |
523 | + test_radeon_crtc->pll_id == ATOM_PPLL2) |
524 | + continue; |
525 | /* for DP use the same PLL for all */ |
526 | if (test_radeon_crtc->pll_id != ATOM_PPLL_INVALID) |
527 | return test_radeon_crtc->pll_id; |
528 | @@ -1770,6 +1775,7 @@ static int radeon_get_shared_nondp_ppll(struct drm_crtc *crtc) |
529 | { |
530 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
531 | struct drm_device *dev = crtc->dev; |
532 | + struct radeon_device *rdev = dev->dev_private; |
533 | struct drm_crtc *test_crtc; |
534 | struct radeon_crtc *test_radeon_crtc; |
535 | u32 adjusted_clock, test_adjusted_clock; |
536 | @@ -1785,6 +1791,10 @@ static int radeon_get_shared_nondp_ppll(struct drm_crtc *crtc) |
537 | test_radeon_crtc = to_radeon_crtc(test_crtc); |
538 | if (test_radeon_crtc->encoder && |
539 | !ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_radeon_crtc->encoder))) { |
540 | + /* PPLL2 is exclusive to UNIPHYA on DCE61 */ |
541 | + if (ASIC_IS_DCE61(rdev) && !ASIC_IS_DCE8(rdev) && |
542 | + test_radeon_crtc->pll_id == ATOM_PPLL2) |
543 | + continue; |
544 | /* check if we are already driving this connector with another crtc */ |
545 | if (test_radeon_crtc->connector == radeon_crtc->connector) { |
546 | /* if we are, return that pll */ |
547 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c |
548 | index 6af832545bc5..b5760851195c 100644 |
549 | --- a/drivers/gpu/drm/radeon/atombios_dp.c |
550 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c |
551 | @@ -326,8 +326,8 @@ int radeon_dp_get_dp_link_config(struct drm_connector *connector, |
552 | } |
553 | } |
554 | } else { |
555 | - for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) { |
556 | - for (i = 0; i < ARRAY_SIZE(link_rates) && link_rates[i] <= max_link_rate; i++) { |
557 | + for (i = 0; i < ARRAY_SIZE(link_rates) && link_rates[i] <= max_link_rate; i++) { |
558 | + for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) { |
559 | max_pix_clock = (lane_num * link_rates[i] * 8) / bpp; |
560 | if (max_pix_clock >= pix_clock) { |
561 | *dp_lanes = lane_num; |
562 | diff --git a/drivers/gpu/drm/radeon/radeon_dp_auxch.c b/drivers/gpu/drm/radeon/radeon_dp_auxch.c |
563 | index 3b0c229d7dcd..db64e0062689 100644 |
564 | --- a/drivers/gpu/drm/radeon/radeon_dp_auxch.c |
565 | +++ b/drivers/gpu/drm/radeon/radeon_dp_auxch.c |
566 | @@ -105,7 +105,7 @@ radeon_dp_aux_transfer_native(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg |
567 | |
568 | tmp &= AUX_HPD_SEL(0x7); |
569 | tmp |= AUX_HPD_SEL(chan->rec.hpd); |
570 | - tmp |= AUX_EN | AUX_LS_READ_EN; |
571 | + tmp |= AUX_EN | AUX_LS_READ_EN | AUX_HPD_DISCON(0x1); |
572 | |
573 | WREG32(AUX_CONTROL + aux_offset[instance], tmp); |
574 | |
575 | diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c |
576 | index ed9cefa1f6f1..eaed31d04468 100644 |
577 | --- a/drivers/infiniband/hw/mlx5/main.c |
578 | +++ b/drivers/infiniband/hw/mlx5/main.c |
579 | @@ -654,8 +654,8 @@ static int mlx5_query_hca_port(struct ib_device *ibdev, u8 port, |
580 | struct mlx5_ib_dev *dev = to_mdev(ibdev); |
581 | struct mlx5_core_dev *mdev = dev->mdev; |
582 | struct mlx5_hca_vport_context *rep; |
583 | - int max_mtu; |
584 | - int oper_mtu; |
585 | + u16 max_mtu; |
586 | + u16 oper_mtu; |
587 | int err; |
588 | u8 ib_link_width_oper; |
589 | u8 vl_hw_cap; |
590 | diff --git a/drivers/input/misc/max8997_haptic.c b/drivers/input/misc/max8997_haptic.c |
591 | index a806ba3818f7..8d6326d7e7be 100644 |
592 | --- a/drivers/input/misc/max8997_haptic.c |
593 | +++ b/drivers/input/misc/max8997_haptic.c |
594 | @@ -255,12 +255,14 @@ static int max8997_haptic_probe(struct platform_device *pdev) |
595 | struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent); |
596 | const struct max8997_platform_data *pdata = |
597 | dev_get_platdata(iodev->dev); |
598 | - const struct max8997_haptic_platform_data *haptic_pdata = |
599 | - pdata->haptic_pdata; |
600 | + const struct max8997_haptic_platform_data *haptic_pdata = NULL; |
601 | struct max8997_haptic *chip; |
602 | struct input_dev *input_dev; |
603 | int error; |
604 | |
605 | + if (pdata) |
606 | + haptic_pdata = pdata->haptic_pdata; |
607 | + |
608 | if (!haptic_pdata) { |
609 | dev_err(&pdev->dev, "no haptic platform data\n"); |
610 | return -EINVAL; |
611 | diff --git a/drivers/media/v4l2-core/videobuf2-v4l2.c b/drivers/media/v4l2-core/videobuf2-v4l2.c |
612 | index 7f366f1b0377..0b1b8c7b6ce5 100644 |
613 | --- a/drivers/media/v4l2-core/videobuf2-v4l2.c |
614 | +++ b/drivers/media/v4l2-core/videobuf2-v4l2.c |
615 | @@ -74,11 +74,6 @@ static int __verify_planes_array(struct vb2_buffer *vb, const struct v4l2_buffer |
616 | return 0; |
617 | } |
618 | |
619 | -static int __verify_planes_array_core(struct vb2_buffer *vb, const void *pb) |
620 | -{ |
621 | - return __verify_planes_array(vb, pb); |
622 | -} |
623 | - |
624 | /** |
625 | * __verify_length() - Verify that the bytesused value for each plane fits in |
626 | * the plane length and that the data offset doesn't exceed the bytesused value. |
627 | @@ -442,7 +437,6 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, |
628 | } |
629 | |
630 | static const struct vb2_buf_ops v4l2_buf_ops = { |
631 | - .verify_planes_array = __verify_planes_array_core, |
632 | .fill_user_buffer = __fill_v4l2_buffer, |
633 | .fill_vb2_buffer = __fill_vb2_buffer, |
634 | .copy_timestamp = __copy_timestamp, |
635 | diff --git a/drivers/net/ethernet/atheros/atlx/atl2.c b/drivers/net/ethernet/atheros/atlx/atl2.c |
636 | index 8f76f4558a88..2ff465848b65 100644 |
637 | --- a/drivers/net/ethernet/atheros/atlx/atl2.c |
638 | +++ b/drivers/net/ethernet/atheros/atlx/atl2.c |
639 | @@ -1412,7 +1412,7 @@ static int atl2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
640 | |
641 | err = -EIO; |
642 | |
643 | - netdev->hw_features = NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_RX; |
644 | + netdev->hw_features = NETIF_F_HW_VLAN_CTAG_RX; |
645 | netdev->features |= (NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX); |
646 | |
647 | /* Init PHY as early as possible due to power saving issue */ |
648 | diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c |
649 | index 767347b1f631..f50bdbfaae7c 100644 |
650 | --- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c |
651 | +++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c |
652 | @@ -519,6 +519,7 @@ static void nicvf_rcv_queue_config(struct nicvf *nic, struct queue_set *qs, |
653 | nicvf_config_vlan_stripping(nic, nic->netdev->features); |
654 | |
655 | /* Enable Receive queue */ |
656 | + memset(&rq_cfg, 0, sizeof(struct rq_cfg)); |
657 | rq_cfg.ena = 1; |
658 | rq_cfg.tcp_ena = 0; |
659 | nicvf_queue_reg_write(nic, NIC_QSET_RQ_0_7_CFG, qidx, *(u64 *)&rq_cfg); |
660 | @@ -551,6 +552,7 @@ void nicvf_cmp_queue_config(struct nicvf *nic, struct queue_set *qs, |
661 | qidx, (u64)(cq->dmem.phys_base)); |
662 | |
663 | /* Enable Completion queue */ |
664 | + memset(&cq_cfg, 0, sizeof(struct cq_cfg)); |
665 | cq_cfg.ena = 1; |
666 | cq_cfg.reset = 0; |
667 | cq_cfg.caching = 0; |
668 | @@ -599,6 +601,7 @@ static void nicvf_snd_queue_config(struct nicvf *nic, struct queue_set *qs, |
669 | qidx, (u64)(sq->dmem.phys_base)); |
670 | |
671 | /* Enable send queue & set queue size */ |
672 | + memset(&sq_cfg, 0, sizeof(struct sq_cfg)); |
673 | sq_cfg.ena = 1; |
674 | sq_cfg.reset = 0; |
675 | sq_cfg.ldwb = 0; |
676 | @@ -635,6 +638,7 @@ static void nicvf_rbdr_config(struct nicvf *nic, struct queue_set *qs, |
677 | |
678 | /* Enable RBDR & set queue size */ |
679 | /* Buffer size should be in multiples of 128 bytes */ |
680 | + memset(&rbdr_cfg, 0, sizeof(struct rbdr_cfg)); |
681 | rbdr_cfg.ena = 1; |
682 | rbdr_cfg.reset = 0; |
683 | rbdr_cfg.ldwb = 0; |
684 | diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c |
685 | index 41c81f6ec630..0d6e8c177650 100644 |
686 | --- a/drivers/net/ethernet/freescale/fec_main.c |
687 | +++ b/drivers/net/ethernet/freescale/fec_main.c |
688 | @@ -1566,9 +1566,15 @@ fec_enet_rx(struct net_device *ndev, int budget) |
689 | struct fec_enet_private *fep = netdev_priv(ndev); |
690 | |
691 | for_each_set_bit(queue_id, &fep->work_rx, FEC_ENET_MAX_RX_QS) { |
692 | - clear_bit(queue_id, &fep->work_rx); |
693 | - pkt_received += fec_enet_rx_queue(ndev, |
694 | + int ret; |
695 | + |
696 | + ret = fec_enet_rx_queue(ndev, |
697 | budget - pkt_received, queue_id); |
698 | + |
699 | + if (ret < budget - pkt_received) |
700 | + clear_bit(queue_id, &fep->work_rx); |
701 | + |
702 | + pkt_received += ret; |
703 | } |
704 | return pkt_received; |
705 | } |
706 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
707 | index 41440b2b20a3..03ef9aca21e4 100644 |
708 | --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
709 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
710 | @@ -704,7 +704,7 @@ static int get_fixed_ipv6_csum(__wsum hw_checksum, struct sk_buff *skb, |
711 | |
712 | if (ipv6h->nexthdr == IPPROTO_FRAGMENT || ipv6h->nexthdr == IPPROTO_HOPOPTS) |
713 | return -1; |
714 | - hw_checksum = csum_add(hw_checksum, (__force __wsum)(ipv6h->nexthdr << 8)); |
715 | + hw_checksum = csum_add(hw_checksum, (__force __wsum)htons(ipv6h->nexthdr)); |
716 | |
717 | csum_pseudo_hdr = csum_partial(&ipv6h->saddr, |
718 | sizeof(ipv6h->saddr) + sizeof(ipv6h->daddr), 0); |
719 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
720 | index e0946ab22010..0debb611da8b 100644 |
721 | --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
722 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
723 | @@ -402,7 +402,6 @@ static bool mlx4_en_process_tx_cq(struct net_device *dev, |
724 | u32 packets = 0; |
725 | u32 bytes = 0; |
726 | int factor = priv->cqe_factor; |
727 | - u64 timestamp = 0; |
728 | int done = 0; |
729 | int budget = priv->tx_work_limit; |
730 | u32 last_nr_txbb; |
731 | @@ -442,9 +441,12 @@ static bool mlx4_en_process_tx_cq(struct net_device *dev, |
732 | new_index = be16_to_cpu(cqe->wqe_index) & size_mask; |
733 | |
734 | do { |
735 | + u64 timestamp = 0; |
736 | + |
737 | txbbs_skipped += last_nr_txbb; |
738 | ring_index = (ring_index + last_nr_txbb) & size_mask; |
739 | - if (ring->tx_info[ring_index].ts_requested) |
740 | + |
741 | + if (unlikely(ring->tx_info[ring_index].ts_requested)) |
742 | timestamp = mlx4_en_get_cqe_ts(cqe); |
743 | |
744 | /* free next descriptor */ |
745 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
746 | index 402994bf7e16..e293a2ec2775 100644 |
747 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
748 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
749 | @@ -1389,24 +1389,50 @@ static int mlx5e_refresh_tirs_self_loopback_enable(struct mlx5e_priv *priv) |
750 | return 0; |
751 | } |
752 | |
753 | -static int mlx5e_set_dev_port_mtu(struct net_device *netdev) |
754 | +static int mlx5e_set_mtu(struct mlx5e_priv *priv, u16 mtu) |
755 | { |
756 | - struct mlx5e_priv *priv = netdev_priv(netdev); |
757 | struct mlx5_core_dev *mdev = priv->mdev; |
758 | - int hw_mtu; |
759 | + u16 hw_mtu = MLX5E_SW2HW_MTU(mtu); |
760 | int err; |
761 | |
762 | - err = mlx5_set_port_mtu(mdev, MLX5E_SW2HW_MTU(netdev->mtu), 1); |
763 | + err = mlx5_set_port_mtu(mdev, hw_mtu, 1); |
764 | if (err) |
765 | return err; |
766 | |
767 | - mlx5_query_port_oper_mtu(mdev, &hw_mtu, 1); |
768 | + /* Update vport context MTU */ |
769 | + mlx5_modify_nic_vport_mtu(mdev, hw_mtu); |
770 | + return 0; |
771 | +} |
772 | + |
773 | +static void mlx5e_query_mtu(struct mlx5e_priv *priv, u16 *mtu) |
774 | +{ |
775 | + struct mlx5_core_dev *mdev = priv->mdev; |
776 | + u16 hw_mtu = 0; |
777 | + int err; |
778 | + |
779 | + err = mlx5_query_nic_vport_mtu(mdev, &hw_mtu); |
780 | + if (err || !hw_mtu) /* fallback to port oper mtu */ |
781 | + mlx5_query_port_oper_mtu(mdev, &hw_mtu, 1); |
782 | + |
783 | + *mtu = MLX5E_HW2SW_MTU(hw_mtu); |
784 | +} |
785 | + |
786 | +static int mlx5e_set_dev_port_mtu(struct net_device *netdev) |
787 | +{ |
788 | + struct mlx5e_priv *priv = netdev_priv(netdev); |
789 | + u16 mtu; |
790 | + int err; |
791 | |
792 | - if (MLX5E_HW2SW_MTU(hw_mtu) != netdev->mtu) |
793 | - netdev_warn(netdev, "%s: Port MTU %d is different than netdev mtu %d\n", |
794 | - __func__, MLX5E_HW2SW_MTU(hw_mtu), netdev->mtu); |
795 | + err = mlx5e_set_mtu(priv, netdev->mtu); |
796 | + if (err) |
797 | + return err; |
798 | |
799 | - netdev->mtu = MLX5E_HW2SW_MTU(hw_mtu); |
800 | + mlx5e_query_mtu(priv, &mtu); |
801 | + if (mtu != netdev->mtu) |
802 | + netdev_warn(netdev, "%s: VPort MTU %d is different than netdev mtu %d\n", |
803 | + __func__, mtu, netdev->mtu); |
804 | + |
805 | + netdev->mtu = mtu; |
806 | return 0; |
807 | } |
808 | |
809 | @@ -1906,22 +1932,27 @@ static int mlx5e_set_features(struct net_device *netdev, |
810 | return err; |
811 | } |
812 | |
813 | +#define MXL5_HW_MIN_MTU 64 |
814 | +#define MXL5E_MIN_MTU (MXL5_HW_MIN_MTU + ETH_FCS_LEN) |
815 | + |
816 | static int mlx5e_change_mtu(struct net_device *netdev, int new_mtu) |
817 | { |
818 | struct mlx5e_priv *priv = netdev_priv(netdev); |
819 | struct mlx5_core_dev *mdev = priv->mdev; |
820 | bool was_opened; |
821 | - int max_mtu; |
822 | + u16 max_mtu; |
823 | + u16 min_mtu; |
824 | int err = 0; |
825 | |
826 | mlx5_query_port_max_mtu(mdev, &max_mtu, 1); |
827 | |
828 | max_mtu = MLX5E_HW2SW_MTU(max_mtu); |
829 | + min_mtu = MLX5E_HW2SW_MTU(MXL5E_MIN_MTU); |
830 | |
831 | - if (new_mtu > max_mtu) { |
832 | + if (new_mtu > max_mtu || new_mtu < min_mtu) { |
833 | netdev_err(netdev, |
834 | - "%s: Bad MTU (%d) > (%d) Max\n", |
835 | - __func__, new_mtu, max_mtu); |
836 | + "%s: Bad MTU (%d), valid range is: [%d..%d]\n", |
837 | + __func__, new_mtu, min_mtu, max_mtu); |
838 | return -EINVAL; |
839 | } |
840 | |
841 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
842 | index 6f68dba8d7ed..cc901852f1a9 100644 |
843 | --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
844 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
845 | @@ -957,33 +957,6 @@ unlock_fg: |
846 | return rule; |
847 | } |
848 | |
849 | -static struct mlx5_flow_rule *add_rule_to_auto_fg(struct mlx5_flow_table *ft, |
850 | - u8 match_criteria_enable, |
851 | - u32 *match_criteria, |
852 | - u32 *match_value, |
853 | - u8 action, |
854 | - u32 flow_tag, |
855 | - struct mlx5_flow_destination *dest) |
856 | -{ |
857 | - struct mlx5_flow_rule *rule; |
858 | - struct mlx5_flow_group *g; |
859 | - |
860 | - g = create_autogroup(ft, match_criteria_enable, match_criteria); |
861 | - if (IS_ERR(g)) |
862 | - return (void *)g; |
863 | - |
864 | - rule = add_rule_fg(g, match_value, |
865 | - action, flow_tag, dest); |
866 | - if (IS_ERR(rule)) { |
867 | - /* Remove assumes refcount > 0 and autogroup creates a group |
868 | - * with a refcount = 0. |
869 | - */ |
870 | - tree_get_node(&g->node); |
871 | - tree_remove_node(&g->node); |
872 | - } |
873 | - return rule; |
874 | -} |
875 | - |
876 | struct mlx5_flow_rule * |
877 | mlx5_add_flow_rule(struct mlx5_flow_table *ft, |
878 | u8 match_criteria_enable, |
879 | @@ -1008,8 +981,23 @@ mlx5_add_flow_rule(struct mlx5_flow_table *ft, |
880 | goto unlock; |
881 | } |
882 | |
883 | - rule = add_rule_to_auto_fg(ft, match_criteria_enable, match_criteria, |
884 | - match_value, action, flow_tag, dest); |
885 | + g = create_autogroup(ft, match_criteria_enable, match_criteria); |
886 | + if (IS_ERR(g)) { |
887 | + rule = (void *)g; |
888 | + goto unlock; |
889 | + } |
890 | + |
891 | + rule = add_rule_fg(g, match_value, |
892 | + action, flow_tag, dest); |
893 | + if (IS_ERR(rule)) { |
894 | + /* Remove assumes refcount > 0 and autogroup creates a group |
895 | + * with a refcount = 0. |
896 | + */ |
897 | + unlock_ref_node(&ft->node); |
898 | + tree_get_node(&g->node); |
899 | + tree_remove_node(&g->node); |
900 | + return rule; |
901 | + } |
902 | unlock: |
903 | unlock_ref_node(&ft->node); |
904 | return rule; |
905 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/port.c b/drivers/net/ethernet/mellanox/mlx5/core/port.c |
906 | index a87e773e93f3..53a793bc2e3d 100644 |
907 | --- a/drivers/net/ethernet/mellanox/mlx5/core/port.c |
908 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/port.c |
909 | @@ -246,8 +246,8 @@ int mlx5_query_port_admin_status(struct mlx5_core_dev *dev, |
910 | } |
911 | EXPORT_SYMBOL_GPL(mlx5_query_port_admin_status); |
912 | |
913 | -static void mlx5_query_port_mtu(struct mlx5_core_dev *dev, int *admin_mtu, |
914 | - int *max_mtu, int *oper_mtu, u8 port) |
915 | +static void mlx5_query_port_mtu(struct mlx5_core_dev *dev, u16 *admin_mtu, |
916 | + u16 *max_mtu, u16 *oper_mtu, u8 port) |
917 | { |
918 | u32 in[MLX5_ST_SZ_DW(pmtu_reg)]; |
919 | u32 out[MLX5_ST_SZ_DW(pmtu_reg)]; |
920 | @@ -267,7 +267,7 @@ static void mlx5_query_port_mtu(struct mlx5_core_dev *dev, int *admin_mtu, |
921 | *admin_mtu = MLX5_GET(pmtu_reg, out, admin_mtu); |
922 | } |
923 | |
924 | -int mlx5_set_port_mtu(struct mlx5_core_dev *dev, int mtu, u8 port) |
925 | +int mlx5_set_port_mtu(struct mlx5_core_dev *dev, u16 mtu, u8 port) |
926 | { |
927 | u32 in[MLX5_ST_SZ_DW(pmtu_reg)]; |
928 | u32 out[MLX5_ST_SZ_DW(pmtu_reg)]; |
929 | @@ -282,14 +282,14 @@ int mlx5_set_port_mtu(struct mlx5_core_dev *dev, int mtu, u8 port) |
930 | } |
931 | EXPORT_SYMBOL_GPL(mlx5_set_port_mtu); |
932 | |
933 | -void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, int *max_mtu, |
934 | +void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, u16 *max_mtu, |
935 | u8 port) |
936 | { |
937 | mlx5_query_port_mtu(dev, NULL, max_mtu, NULL, port); |
938 | } |
939 | EXPORT_SYMBOL_GPL(mlx5_query_port_max_mtu); |
940 | |
941 | -void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, int *oper_mtu, |
942 | +void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, u16 *oper_mtu, |
943 | u8 port) |
944 | { |
945 | mlx5_query_port_mtu(dev, NULL, NULL, oper_mtu, port); |
946 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/vport.c b/drivers/net/ethernet/mellanox/mlx5/core/vport.c |
947 | index c7398b95aecd..6d5f56e73b5d 100644 |
948 | --- a/drivers/net/ethernet/mellanox/mlx5/core/vport.c |
949 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/vport.c |
950 | @@ -196,6 +196,46 @@ int mlx5_modify_nic_vport_mac_address(struct mlx5_core_dev *mdev, |
951 | } |
952 | EXPORT_SYMBOL_GPL(mlx5_modify_nic_vport_mac_address); |
953 | |
954 | +int mlx5_query_nic_vport_mtu(struct mlx5_core_dev *mdev, u16 *mtu) |
955 | +{ |
956 | + int outlen = MLX5_ST_SZ_BYTES(query_nic_vport_context_out); |
957 | + u32 *out; |
958 | + int err; |
959 | + |
960 | + out = mlx5_vzalloc(outlen); |
961 | + if (!out) |
962 | + return -ENOMEM; |
963 | + |
964 | + err = mlx5_query_nic_vport_context(mdev, 0, out, outlen); |
965 | + if (!err) |
966 | + *mtu = MLX5_GET(query_nic_vport_context_out, out, |
967 | + nic_vport_context.mtu); |
968 | + |
969 | + kvfree(out); |
970 | + return err; |
971 | +} |
972 | +EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_mtu); |
973 | + |
974 | +int mlx5_modify_nic_vport_mtu(struct mlx5_core_dev *mdev, u16 mtu) |
975 | +{ |
976 | + int inlen = MLX5_ST_SZ_BYTES(modify_nic_vport_context_in); |
977 | + void *in; |
978 | + int err; |
979 | + |
980 | + in = mlx5_vzalloc(inlen); |
981 | + if (!in) |
982 | + return -ENOMEM; |
983 | + |
984 | + MLX5_SET(modify_nic_vport_context_in, in, field_select.mtu, 1); |
985 | + MLX5_SET(modify_nic_vport_context_in, in, nic_vport_context.mtu, mtu); |
986 | + |
987 | + err = mlx5_modify_nic_vport_context(mdev, in, inlen); |
988 | + |
989 | + kvfree(in); |
990 | + return err; |
991 | +} |
992 | +EXPORT_SYMBOL_GPL(mlx5_modify_nic_vport_mtu); |
993 | + |
994 | int mlx5_query_nic_vport_mac_list(struct mlx5_core_dev *dev, |
995 | u32 vport, |
996 | enum mlx5_list_type list_type, |
997 | diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c |
998 | index bdd83d95ec0a..96a5028621c8 100644 |
999 | --- a/drivers/net/usb/cdc_mbim.c |
1000 | +++ b/drivers/net/usb/cdc_mbim.c |
1001 | @@ -617,8 +617,13 @@ static const struct usb_device_id mbim_devs[] = { |
1002 | { USB_VENDOR_AND_INTERFACE_INFO(0x0bdb, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), |
1003 | .driver_info = (unsigned long)&cdc_mbim_info, |
1004 | }, |
1005 | - /* Huawei E3372 fails unless NDP comes after the IP packets */ |
1006 | - { USB_DEVICE_AND_INTERFACE_INFO(0x12d1, 0x157d, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), |
1007 | + |
1008 | + /* Some Huawei devices, ME906s-158 (12d1:15c1) and E3372 |
1009 | + * (12d1:157d), are known to fail unless the NDP is placed |
1010 | + * after the IP packets. Applying the quirk to all Huawei |
1011 | + * devices is broader than necessary, but harmless. |
1012 | + */ |
1013 | + { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), |
1014 | .driver_info = (unsigned long)&cdc_mbim_info_ndp_to_end, |
1015 | }, |
1016 | /* default entry */ |
1017 | diff --git a/drivers/pinctrl/pinctrl-at91-pio4.c b/drivers/pinctrl/pinctrl-at91-pio4.c |
1018 | index ee69db6ae1c7..e1c0d4e1bb33 100644 |
1019 | --- a/drivers/pinctrl/pinctrl-at91-pio4.c |
1020 | +++ b/drivers/pinctrl/pinctrl-at91-pio4.c |
1021 | @@ -722,9 +722,11 @@ static int atmel_conf_pin_config_group_set(struct pinctrl_dev *pctldev, |
1022 | break; |
1023 | case PIN_CONFIG_BIAS_PULL_UP: |
1024 | conf |= ATMEL_PIO_PUEN_MASK; |
1025 | + conf &= (~ATMEL_PIO_PDEN_MASK); |
1026 | break; |
1027 | case PIN_CONFIG_BIAS_PULL_DOWN: |
1028 | conf |= ATMEL_PIO_PDEN_MASK; |
1029 | + conf &= (~ATMEL_PIO_PUEN_MASK); |
1030 | break; |
1031 | case PIN_CONFIG_DRIVE_OPEN_DRAIN: |
1032 | if (arg == 0) |
1033 | diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c |
1034 | index f2e1a39ce0f3..5cf4a97e0304 100644 |
1035 | --- a/drivers/regulator/axp20x-regulator.c |
1036 | +++ b/drivers/regulator/axp20x-regulator.c |
1037 | @@ -221,10 +221,10 @@ static const struct regulator_desc axp22x_regulators[] = { |
1038 | AXP22X_ELDO2_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(1)), |
1039 | AXP_DESC(AXP22X, ELDO3, "eldo3", "eldoin", 700, 3300, 100, |
1040 | AXP22X_ELDO3_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(2)), |
1041 | - AXP_DESC_IO(AXP22X, LDO_IO0, "ldo_io0", "ips", 1800, 3300, 100, |
1042 | + AXP_DESC_IO(AXP22X, LDO_IO0, "ldo_io0", "ips", 700, 3300, 100, |
1043 | AXP22X_LDO_IO0_V_OUT, 0x1f, AXP20X_GPIO0_CTRL, 0x07, |
1044 | AXP22X_IO_ENABLED, AXP22X_IO_DISABLED), |
1045 | - AXP_DESC_IO(AXP22X, LDO_IO1, "ldo_io1", "ips", 1800, 3300, 100, |
1046 | + AXP_DESC_IO(AXP22X, LDO_IO1, "ldo_io1", "ips", 700, 3300, 100, |
1047 | AXP22X_LDO_IO1_V_OUT, 0x1f, AXP20X_GPIO1_CTRL, 0x07, |
1048 | AXP22X_IO_ENABLED, AXP22X_IO_DISABLED), |
1049 | AXP_DESC_FIXED(AXP22X, RTC_LDO, "rtc_ldo", "ips", 3000), |
1050 | diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c |
1051 | index 3242ffc0cb25..09dce49609c1 100644 |
1052 | --- a/drivers/regulator/s2mps11.c |
1053 | +++ b/drivers/regulator/s2mps11.c |
1054 | @@ -306,7 +306,7 @@ static struct regulator_ops s2mps11_buck_ops = { |
1055 | .enable_mask = S2MPS11_ENABLE_MASK \ |
1056 | } |
1057 | |
1058 | -#define regulator_desc_s2mps11_buck6_10(num, min, step) { \ |
1059 | +#define regulator_desc_s2mps11_buck67810(num, min, step) { \ |
1060 | .name = "BUCK"#num, \ |
1061 | .id = S2MPS11_BUCK##num, \ |
1062 | .ops = &s2mps11_buck_ops, \ |
1063 | @@ -322,6 +322,22 @@ static struct regulator_ops s2mps11_buck_ops = { |
1064 | .enable_mask = S2MPS11_ENABLE_MASK \ |
1065 | } |
1066 | |
1067 | +#define regulator_desc_s2mps11_buck9 { \ |
1068 | + .name = "BUCK9", \ |
1069 | + .id = S2MPS11_BUCK9, \ |
1070 | + .ops = &s2mps11_buck_ops, \ |
1071 | + .type = REGULATOR_VOLTAGE, \ |
1072 | + .owner = THIS_MODULE, \ |
1073 | + .min_uV = MIN_3000_MV, \ |
1074 | + .uV_step = STEP_25_MV, \ |
1075 | + .n_voltages = S2MPS11_BUCK9_N_VOLTAGES, \ |
1076 | + .ramp_delay = S2MPS11_RAMP_DELAY, \ |
1077 | + .vsel_reg = S2MPS11_REG_B9CTRL2, \ |
1078 | + .vsel_mask = S2MPS11_BUCK9_VSEL_MASK, \ |
1079 | + .enable_reg = S2MPS11_REG_B9CTRL1, \ |
1080 | + .enable_mask = S2MPS11_ENABLE_MASK \ |
1081 | +} |
1082 | + |
1083 | static const struct regulator_desc s2mps11_regulators[] = { |
1084 | regulator_desc_s2mps11_ldo(1, STEP_25_MV), |
1085 | regulator_desc_s2mps11_ldo(2, STEP_50_MV), |
1086 | @@ -366,11 +382,11 @@ static const struct regulator_desc s2mps11_regulators[] = { |
1087 | regulator_desc_s2mps11_buck1_4(3), |
1088 | regulator_desc_s2mps11_buck1_4(4), |
1089 | regulator_desc_s2mps11_buck5, |
1090 | - regulator_desc_s2mps11_buck6_10(6, MIN_600_MV, STEP_6_25_MV), |
1091 | - regulator_desc_s2mps11_buck6_10(7, MIN_600_MV, STEP_6_25_MV), |
1092 | - regulator_desc_s2mps11_buck6_10(8, MIN_600_MV, STEP_6_25_MV), |
1093 | - regulator_desc_s2mps11_buck6_10(9, MIN_3000_MV, STEP_25_MV), |
1094 | - regulator_desc_s2mps11_buck6_10(10, MIN_750_MV, STEP_12_5_MV), |
1095 | + regulator_desc_s2mps11_buck67810(6, MIN_600_MV, STEP_6_25_MV), |
1096 | + regulator_desc_s2mps11_buck67810(7, MIN_600_MV, STEP_6_25_MV), |
1097 | + regulator_desc_s2mps11_buck67810(8, MIN_600_MV, STEP_6_25_MV), |
1098 | + regulator_desc_s2mps11_buck9, |
1099 | + regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV), |
1100 | }; |
1101 | |
1102 | static struct regulator_ops s2mps14_reg_ops; |
1103 | diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c |
1104 | index 5d0ec42a9317..634254a52301 100644 |
1105 | --- a/drivers/scsi/qla1280.c |
1106 | +++ b/drivers/scsi/qla1280.c |
1107 | @@ -4214,7 +4214,7 @@ static struct scsi_host_template qla1280_driver_template = { |
1108 | .eh_bus_reset_handler = qla1280_eh_bus_reset, |
1109 | .eh_host_reset_handler = qla1280_eh_adapter_reset, |
1110 | .bios_param = qla1280_biosparam, |
1111 | - .can_queue = 0xfffff, |
1112 | + .can_queue = MAX_OUTSTANDING_COMMANDS, |
1113 | .this_id = -1, |
1114 | .sg_tablesize = SG_ALL, |
1115 | .use_clustering = ENABLE_CLUSTERING, |
1116 | diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c |
1117 | index ab9914ad8365..64232ecbb821 100644 |
1118 | --- a/drivers/spi/spi-pxa2xx.c |
1119 | +++ b/drivers/spi/spi-pxa2xx.c |
1120 | @@ -111,7 +111,7 @@ static const struct lpss_config lpss_platforms[] = { |
1121 | .reg_general = -1, |
1122 | .reg_ssp = 0x20, |
1123 | .reg_cs_ctrl = 0x24, |
1124 | - .reg_capabilities = 0xfc, |
1125 | + .reg_capabilities = -1, |
1126 | .rx_threshold = 1, |
1127 | .tx_threshold_lo = 32, |
1128 | .tx_threshold_hi = 56, |
1129 | diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c |
1130 | index 64318fcfacf2..5044c6198332 100644 |
1131 | --- a/drivers/spi/spi-ti-qspi.c |
1132 | +++ b/drivers/spi/spi-ti-qspi.c |
1133 | @@ -94,6 +94,7 @@ struct ti_qspi { |
1134 | #define QSPI_FLEN(n) ((n - 1) << 0) |
1135 | #define QSPI_WLEN_MAX_BITS 128 |
1136 | #define QSPI_WLEN_MAX_BYTES 16 |
1137 | +#define QSPI_WLEN_MASK QSPI_WLEN(QSPI_WLEN_MAX_BITS) |
1138 | |
1139 | /* STATUS REGISTER */ |
1140 | #define BUSY 0x01 |
1141 | @@ -224,16 +225,16 @@ static inline int ti_qspi_poll_wc(struct ti_qspi *qspi) |
1142 | return -ETIMEDOUT; |
1143 | } |
1144 | |
1145 | -static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t) |
1146 | +static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t, |
1147 | + int count) |
1148 | { |
1149 | - int wlen, count, xfer_len; |
1150 | + int wlen, xfer_len; |
1151 | unsigned int cmd; |
1152 | const u8 *txbuf; |
1153 | u32 data; |
1154 | |
1155 | txbuf = t->tx_buf; |
1156 | cmd = qspi->cmd | QSPI_WR_SNGL; |
1157 | - count = t->len; |
1158 | wlen = t->bits_per_word >> 3; /* in bytes */ |
1159 | xfer_len = wlen; |
1160 | |
1161 | @@ -293,9 +294,10 @@ static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t) |
1162 | return 0; |
1163 | } |
1164 | |
1165 | -static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t) |
1166 | +static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t, |
1167 | + int count) |
1168 | { |
1169 | - int wlen, count; |
1170 | + int wlen; |
1171 | unsigned int cmd; |
1172 | u8 *rxbuf; |
1173 | |
1174 | @@ -312,7 +314,6 @@ static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t) |
1175 | cmd |= QSPI_RD_SNGL; |
1176 | break; |
1177 | } |
1178 | - count = t->len; |
1179 | wlen = t->bits_per_word >> 3; /* in bytes */ |
1180 | |
1181 | while (count) { |
1182 | @@ -343,12 +344,13 @@ static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t) |
1183 | return 0; |
1184 | } |
1185 | |
1186 | -static int qspi_transfer_msg(struct ti_qspi *qspi, struct spi_transfer *t) |
1187 | +static int qspi_transfer_msg(struct ti_qspi *qspi, struct spi_transfer *t, |
1188 | + int count) |
1189 | { |
1190 | int ret; |
1191 | |
1192 | if (t->tx_buf) { |
1193 | - ret = qspi_write_msg(qspi, t); |
1194 | + ret = qspi_write_msg(qspi, t, count); |
1195 | if (ret) { |
1196 | dev_dbg(qspi->dev, "Error while writing\n"); |
1197 | return ret; |
1198 | @@ -356,7 +358,7 @@ static int qspi_transfer_msg(struct ti_qspi *qspi, struct spi_transfer *t) |
1199 | } |
1200 | |
1201 | if (t->rx_buf) { |
1202 | - ret = qspi_read_msg(qspi, t); |
1203 | + ret = qspi_read_msg(qspi, t, count); |
1204 | if (ret) { |
1205 | dev_dbg(qspi->dev, "Error while reading\n"); |
1206 | return ret; |
1207 | @@ -373,7 +375,8 @@ static int ti_qspi_start_transfer_one(struct spi_master *master, |
1208 | struct spi_device *spi = m->spi; |
1209 | struct spi_transfer *t; |
1210 | int status = 0, ret; |
1211 | - int frame_length; |
1212 | + unsigned int frame_len_words, transfer_len_words; |
1213 | + int wlen; |
1214 | |
1215 | /* setup device control reg */ |
1216 | qspi->dc = 0; |
1217 | @@ -385,30 +388,38 @@ static int ti_qspi_start_transfer_one(struct spi_master *master, |
1218 | if (spi->mode & SPI_CS_HIGH) |
1219 | qspi->dc |= QSPI_CSPOL(spi->chip_select); |
1220 | |
1221 | - frame_length = (m->frame_length << 3) / spi->bits_per_word; |
1222 | - |
1223 | - frame_length = clamp(frame_length, 0, QSPI_FRAME); |
1224 | + frame_len_words = 0; |
1225 | + list_for_each_entry(t, &m->transfers, transfer_list) |
1226 | + frame_len_words += t->len / (t->bits_per_word >> 3); |
1227 | + frame_len_words = min_t(unsigned int, frame_len_words, QSPI_FRAME); |
1228 | |
1229 | /* setup command reg */ |
1230 | qspi->cmd = 0; |
1231 | qspi->cmd |= QSPI_EN_CS(spi->chip_select); |
1232 | - qspi->cmd |= QSPI_FLEN(frame_length); |
1233 | + qspi->cmd |= QSPI_FLEN(frame_len_words); |
1234 | |
1235 | ti_qspi_write(qspi, qspi->dc, QSPI_SPI_DC_REG); |
1236 | |
1237 | mutex_lock(&qspi->list_lock); |
1238 | |
1239 | list_for_each_entry(t, &m->transfers, transfer_list) { |
1240 | - qspi->cmd |= QSPI_WLEN(t->bits_per_word); |
1241 | + qspi->cmd = ((qspi->cmd & ~QSPI_WLEN_MASK) | |
1242 | + QSPI_WLEN(t->bits_per_word)); |
1243 | + |
1244 | + wlen = t->bits_per_word >> 3; |
1245 | + transfer_len_words = min(t->len / wlen, frame_len_words); |
1246 | |
1247 | - ret = qspi_transfer_msg(qspi, t); |
1248 | + ret = qspi_transfer_msg(qspi, t, transfer_len_words * wlen); |
1249 | if (ret) { |
1250 | dev_dbg(qspi->dev, "transfer message failed\n"); |
1251 | mutex_unlock(&qspi->list_lock); |
1252 | return -EINVAL; |
1253 | } |
1254 | |
1255 | - m->actual_length += t->len; |
1256 | + m->actual_length += transfer_len_words * wlen; |
1257 | + frame_len_words -= transfer_len_words; |
1258 | + if (frame_len_words == 0) |
1259 | + break; |
1260 | } |
1261 | |
1262 | mutex_unlock(&qspi->list_lock); |
1263 | diff --git a/drivers/staging/wilc1000/wilc_spi.c b/drivers/staging/wilc1000/wilc_spi.c |
1264 | index 86de50c9f7f5..b3d6541b3896 100644 |
1265 | --- a/drivers/staging/wilc1000/wilc_spi.c |
1266 | +++ b/drivers/staging/wilc1000/wilc_spi.c |
1267 | @@ -120,8 +120,6 @@ static u8 crc7(u8 crc, const u8 *buffer, u32 len) |
1268 | |
1269 | #define USE_SPI_DMA 0 |
1270 | |
1271 | -static const struct wilc1000_ops wilc1000_spi_ops; |
1272 | - |
1273 | static int wilc_bus_probe(struct spi_device *spi) |
1274 | { |
1275 | int ret, gpio; |
1276 | diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c |
1277 | index 769e0ff1b4ce..dea6486a7508 100644 |
1278 | --- a/fs/btrfs/ctree.c |
1279 | +++ b/fs/btrfs/ctree.c |
1280 | @@ -19,6 +19,7 @@ |
1281 | #include <linux/sched.h> |
1282 | #include <linux/slab.h> |
1283 | #include <linux/rbtree.h> |
1284 | +#include <linux/vmalloc.h> |
1285 | #include "ctree.h" |
1286 | #include "disk-io.h" |
1287 | #include "transaction.h" |
1288 | @@ -5361,10 +5362,13 @@ int btrfs_compare_trees(struct btrfs_root *left_root, |
1289 | goto out; |
1290 | } |
1291 | |
1292 | - tmp_buf = kmalloc(left_root->nodesize, GFP_NOFS); |
1293 | + tmp_buf = kmalloc(left_root->nodesize, GFP_KERNEL | __GFP_NOWARN); |
1294 | if (!tmp_buf) { |
1295 | - ret = -ENOMEM; |
1296 | - goto out; |
1297 | + tmp_buf = vmalloc(left_root->nodesize); |
1298 | + if (!tmp_buf) { |
1299 | + ret = -ENOMEM; |
1300 | + goto out; |
1301 | + } |
1302 | } |
1303 | |
1304 | left_path->search_commit_root = 1; |
1305 | @@ -5565,7 +5569,7 @@ int btrfs_compare_trees(struct btrfs_root *left_root, |
1306 | out: |
1307 | btrfs_free_path(left_path); |
1308 | btrfs_free_path(right_path); |
1309 | - kfree(tmp_buf); |
1310 | + kvfree(tmp_buf); |
1311 | return ret; |
1312 | } |
1313 | |
1314 | diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h |
1315 | index bfe4a337fb4d..6661ad8b4088 100644 |
1316 | --- a/fs/btrfs/ctree.h |
1317 | +++ b/fs/btrfs/ctree.h |
1318 | @@ -2252,7 +2252,7 @@ struct btrfs_ioctl_defrag_range_args { |
1319 | #define BTRFS_MOUNT_FREE_SPACE_TREE (1 << 26) |
1320 | |
1321 | #define BTRFS_DEFAULT_COMMIT_INTERVAL (30) |
1322 | -#define BTRFS_DEFAULT_MAX_INLINE (8192) |
1323 | +#define BTRFS_DEFAULT_MAX_INLINE (2048) |
1324 | |
1325 | #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt) |
1326 | #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) |
1327 | diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c |
1328 | index cbb7dbfb3fff..218f51a5dbab 100644 |
1329 | --- a/fs/btrfs/dev-replace.c |
1330 | +++ b/fs/btrfs/dev-replace.c |
1331 | @@ -394,6 +394,8 @@ int btrfs_dev_replace_start(struct btrfs_root *root, |
1332 | dev_replace->cursor_right = 0; |
1333 | dev_replace->is_valid = 1; |
1334 | dev_replace->item_needs_writeback = 1; |
1335 | + atomic64_set(&dev_replace->num_write_errors, 0); |
1336 | + atomic64_set(&dev_replace->num_uncorrectable_read_errors, 0); |
1337 | args->result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR; |
1338 | btrfs_dev_replace_unlock(dev_replace); |
1339 | |
1340 | diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c |
1341 | index d8d68af5aef0..ae6e3e36fdf0 100644 |
1342 | --- a/fs/btrfs/disk-io.c |
1343 | +++ b/fs/btrfs/disk-io.c |
1344 | @@ -303,7 +303,7 @@ static int csum_tree_block(struct btrfs_fs_info *fs_info, |
1345 | err = map_private_extent_buffer(buf, offset, 32, |
1346 | &kaddr, &map_start, &map_len); |
1347 | if (err) |
1348 | - return 1; |
1349 | + return err; |
1350 | cur_len = min(len, map_len - (offset - map_start)); |
1351 | crc = btrfs_csum_data(kaddr + offset - map_start, |
1352 | crc, cur_len); |
1353 | @@ -313,7 +313,7 @@ static int csum_tree_block(struct btrfs_fs_info *fs_info, |
1354 | if (csum_size > sizeof(inline_result)) { |
1355 | result = kzalloc(csum_size, GFP_NOFS); |
1356 | if (!result) |
1357 | - return 1; |
1358 | + return -ENOMEM; |
1359 | } else { |
1360 | result = (char *)&inline_result; |
1361 | } |
1362 | @@ -334,7 +334,7 @@ static int csum_tree_block(struct btrfs_fs_info *fs_info, |
1363 | val, found, btrfs_header_level(buf)); |
1364 | if (result != (char *)&inline_result) |
1365 | kfree(result); |
1366 | - return 1; |
1367 | + return -EUCLEAN; |
1368 | } |
1369 | } else { |
1370 | write_extent_buffer(buf, result, 0, csum_size); |
1371 | @@ -513,11 +513,21 @@ static int csum_dirty_buffer(struct btrfs_fs_info *fs_info, struct page *page) |
1372 | eb = (struct extent_buffer *)page->private; |
1373 | if (page != eb->pages[0]) |
1374 | return 0; |
1375 | + |
1376 | found_start = btrfs_header_bytenr(eb); |
1377 | - if (WARN_ON(found_start != start || !PageUptodate(page))) |
1378 | - return 0; |
1379 | - csum_tree_block(fs_info, eb, 0); |
1380 | - return 0; |
1381 | + /* |
1382 | + * Please do not consolidate these warnings into a single if. |
1383 | + * It is useful to know what went wrong. |
1384 | + */ |
1385 | + if (WARN_ON(found_start != start)) |
1386 | + return -EUCLEAN; |
1387 | + if (WARN_ON(!PageUptodate(page))) |
1388 | + return -EUCLEAN; |
1389 | + |
1390 | + ASSERT(memcmp_extent_buffer(eb, fs_info->fsid, |
1391 | + btrfs_header_fsid(), BTRFS_FSID_SIZE) == 0); |
1392 | + |
1393 | + return csum_tree_block(fs_info, eb, 0); |
1394 | } |
1395 | |
1396 | static int check_tree_block_fsid(struct btrfs_fs_info *fs_info, |
1397 | @@ -660,10 +670,8 @@ static int btree_readpage_end_io_hook(struct btrfs_io_bio *io_bio, |
1398 | eb, found_level); |
1399 | |
1400 | ret = csum_tree_block(root->fs_info, eb, 1); |
1401 | - if (ret) { |
1402 | - ret = -EIO; |
1403 | + if (ret) |
1404 | goto err; |
1405 | - } |
1406 | |
1407 | /* |
1408 | * If this is a leaf block and it is corrupt, set the corrupt bit so |
1409 | diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c |
1410 | index 9a30ca64066b..5d956b869e03 100644 |
1411 | --- a/fs/btrfs/file.c |
1412 | +++ b/fs/btrfs/file.c |
1413 | @@ -1996,10 +1996,11 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) |
1414 | */ |
1415 | smp_mb(); |
1416 | if (btrfs_inode_in_log(inode, root->fs_info->generation) || |
1417 | - (BTRFS_I(inode)->last_trans <= |
1418 | - root->fs_info->last_trans_committed && |
1419 | - (full_sync || |
1420 | - !btrfs_have_ordered_extents_in_range(inode, start, len)))) { |
1421 | + (full_sync && BTRFS_I(inode)->last_trans <= |
1422 | + root->fs_info->last_trans_committed) || |
1423 | + (!btrfs_have_ordered_extents_in_range(inode, start, len) && |
1424 | + BTRFS_I(inode)->last_trans |
1425 | + <= root->fs_info->last_trans_committed)) { |
1426 | /* |
1427 | * We'v had everything committed since the last time we were |
1428 | * modified so clear this flag in case it was set for whatever |
1429 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c |
1430 | index d96f5cf38a2d..f407e487c687 100644 |
1431 | --- a/fs/btrfs/inode.c |
1432 | +++ b/fs/btrfs/inode.c |
1433 | @@ -4211,11 +4211,20 @@ static int truncate_space_check(struct btrfs_trans_handle *trans, |
1434 | { |
1435 | int ret; |
1436 | |
1437 | + /* |
1438 | + * This is only used to apply pressure to the enospc system, we don't |
1439 | + * intend to use this reservation at all. |
1440 | + */ |
1441 | bytes_deleted = btrfs_csum_bytes_to_leaves(root, bytes_deleted); |
1442 | + bytes_deleted *= root->nodesize; |
1443 | ret = btrfs_block_rsv_add(root, &root->fs_info->trans_block_rsv, |
1444 | bytes_deleted, BTRFS_RESERVE_NO_FLUSH); |
1445 | - if (!ret) |
1446 | + if (!ret) { |
1447 | + trace_btrfs_space_reservation(root->fs_info, "transaction", |
1448 | + trans->transid, |
1449 | + bytes_deleted, 1); |
1450 | trans->bytes_reserved += bytes_deleted; |
1451 | + } |
1452 | return ret; |
1453 | |
1454 | } |
1455 | @@ -7414,7 +7423,26 @@ static int lock_extent_direct(struct inode *inode, u64 lockstart, u64 lockend, |
1456 | cached_state, GFP_NOFS); |
1457 | |
1458 | if (ordered) { |
1459 | - btrfs_start_ordered_extent(inode, ordered, 1); |
1460 | + /* |
1461 | + * If we are doing a DIO read and the ordered extent we |
1462 | + * found is for a buffered write, we can not wait for it |
1463 | + * to complete and retry, because if we do so we can |
1464 | + * deadlock with concurrent buffered writes on page |
1465 | + * locks. This happens only if our DIO read covers more |
1466 | + * than one extent map, if at this point has already |
1467 | + * created an ordered extent for a previous extent map |
1468 | + * and locked its range in the inode's io tree, and a |
1469 | + * concurrent write against that previous extent map's |
1470 | + * range and this range started (we unlock the ranges |
1471 | + * in the io tree only when the bios complete and |
1472 | + * buffered writes always lock pages before attempting |
1473 | + * to lock range in the io tree). |
1474 | + */ |
1475 | + if (writing || |
1476 | + test_bit(BTRFS_ORDERED_DIRECT, &ordered->flags)) |
1477 | + btrfs_start_ordered_extent(inode, ordered, 1); |
1478 | + else |
1479 | + ret = -ENOTBLK; |
1480 | btrfs_put_ordered_extent(ordered); |
1481 | } else { |
1482 | /* |
1483 | @@ -7431,9 +7459,11 @@ static int lock_extent_direct(struct inode *inode, u64 lockstart, u64 lockend, |
1484 | * that page. |
1485 | */ |
1486 | ret = -ENOTBLK; |
1487 | - break; |
1488 | } |
1489 | |
1490 | + if (ret) |
1491 | + break; |
1492 | + |
1493 | cond_resched(); |
1494 | } |
1495 | |
1496 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c |
1497 | index 48aee9846329..e3791f268489 100644 |
1498 | --- a/fs/btrfs/ioctl.c |
1499 | +++ b/fs/btrfs/ioctl.c |
1500 | @@ -59,6 +59,7 @@ |
1501 | #include "props.h" |
1502 | #include "sysfs.h" |
1503 | #include "qgroup.h" |
1504 | +#include "tree-log.h" |
1505 | |
1506 | #ifdef CONFIG_64BIT |
1507 | /* If we have a 32-bit userspace and 64-bit kernel, then the UAPI |
1508 | @@ -1656,7 +1657,7 @@ static noinline int btrfs_ioctl_snap_create_transid(struct file *file, |
1509 | |
1510 | src_inode = file_inode(src.file); |
1511 | if (src_inode->i_sb != file_inode(file)->i_sb) { |
1512 | - btrfs_info(BTRFS_I(src_inode)->root->fs_info, |
1513 | + btrfs_info(BTRFS_I(file_inode(file))->root->fs_info, |
1514 | "Snapshot src from another FS"); |
1515 | ret = -EXDEV; |
1516 | } else if (!inode_owner_or_capable(src_inode)) { |
1517 | @@ -2097,8 +2098,6 @@ static noinline int search_ioctl(struct inode *inode, |
1518 | key.offset = (u64)-1; |
1519 | root = btrfs_read_fs_root_no_name(info, &key); |
1520 | if (IS_ERR(root)) { |
1521 | - btrfs_err(info, "could not find root %llu", |
1522 | - sk->tree_id); |
1523 | btrfs_free_path(path); |
1524 | return -ENOENT; |
1525 | } |
1526 | @@ -2476,6 +2475,8 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file, |
1527 | trans->block_rsv = &block_rsv; |
1528 | trans->bytes_reserved = block_rsv.size; |
1529 | |
1530 | + btrfs_record_snapshot_destroy(trans, dir); |
1531 | + |
1532 | ret = btrfs_unlink_subvol(trans, root, dir, |
1533 | dest->root_key.objectid, |
1534 | dentry->d_name.name, |
1535 | @@ -3068,6 +3069,9 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen, |
1536 | ret = extent_same_check_offsets(src, loff, &len, olen); |
1537 | if (ret) |
1538 | goto out_unlock; |
1539 | + ret = extent_same_check_offsets(src, dst_loff, &len, olen); |
1540 | + if (ret) |
1541 | + goto out_unlock; |
1542 | |
1543 | /* |
1544 | * Single inode case wants the same checks, except we |
1545 | diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c |
1546 | index 5279fdae7142..7173360eea7a 100644 |
1547 | --- a/fs/btrfs/qgroup.c |
1548 | +++ b/fs/btrfs/qgroup.c |
1549 | @@ -1842,8 +1842,10 @@ out: |
1550 | } |
1551 | |
1552 | /* |
1553 | - * copy the acounting information between qgroups. This is necessary when a |
1554 | - * snapshot or a subvolume is created |
1555 | + * Copy the acounting information between qgroups. This is necessary |
1556 | + * when a snapshot or a subvolume is created. Throwing an error will |
1557 | + * cause a transaction abort so we take extra care here to only error |
1558 | + * when a readonly fs is a reasonable outcome. |
1559 | */ |
1560 | int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, |
1561 | struct btrfs_fs_info *fs_info, u64 srcid, u64 objectid, |
1562 | @@ -1873,15 +1875,15 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, |
1563 | 2 * inherit->num_excl_copies; |
1564 | for (i = 0; i < nums; ++i) { |
1565 | srcgroup = find_qgroup_rb(fs_info, *i_qgroups); |
1566 | - if (!srcgroup) { |
1567 | - ret = -EINVAL; |
1568 | - goto out; |
1569 | - } |
1570 | |
1571 | - if ((srcgroup->qgroupid >> 48) <= (objectid >> 48)) { |
1572 | - ret = -EINVAL; |
1573 | - goto out; |
1574 | - } |
1575 | + /* |
1576 | + * Zero out invalid groups so we can ignore |
1577 | + * them later. |
1578 | + */ |
1579 | + if (!srcgroup || |
1580 | + ((srcgroup->qgroupid >> 48) <= (objectid >> 48))) |
1581 | + *i_qgroups = 0ULL; |
1582 | + |
1583 | ++i_qgroups; |
1584 | } |
1585 | } |
1586 | @@ -1916,17 +1918,19 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, |
1587 | */ |
1588 | if (inherit) { |
1589 | i_qgroups = (u64 *)(inherit + 1); |
1590 | - for (i = 0; i < inherit->num_qgroups; ++i) { |
1591 | + for (i = 0; i < inherit->num_qgroups; ++i, ++i_qgroups) { |
1592 | + if (*i_qgroups == 0) |
1593 | + continue; |
1594 | ret = add_qgroup_relation_item(trans, quota_root, |
1595 | objectid, *i_qgroups); |
1596 | - if (ret) |
1597 | + if (ret && ret != -EEXIST) |
1598 | goto out; |
1599 | ret = add_qgroup_relation_item(trans, quota_root, |
1600 | *i_qgroups, objectid); |
1601 | - if (ret) |
1602 | + if (ret && ret != -EEXIST) |
1603 | goto out; |
1604 | - ++i_qgroups; |
1605 | } |
1606 | + ret = 0; |
1607 | } |
1608 | |
1609 | |
1610 | @@ -1987,17 +1991,22 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, |
1611 | |
1612 | i_qgroups = (u64 *)(inherit + 1); |
1613 | for (i = 0; i < inherit->num_qgroups; ++i) { |
1614 | - ret = add_relation_rb(quota_root->fs_info, objectid, |
1615 | - *i_qgroups); |
1616 | - if (ret) |
1617 | - goto unlock; |
1618 | + if (*i_qgroups) { |
1619 | + ret = add_relation_rb(quota_root->fs_info, objectid, |
1620 | + *i_qgroups); |
1621 | + if (ret) |
1622 | + goto unlock; |
1623 | + } |
1624 | ++i_qgroups; |
1625 | } |
1626 | |
1627 | - for (i = 0; i < inherit->num_ref_copies; ++i) { |
1628 | + for (i = 0; i < inherit->num_ref_copies; ++i, i_qgroups += 2) { |
1629 | struct btrfs_qgroup *src; |
1630 | struct btrfs_qgroup *dst; |
1631 | |
1632 | + if (!i_qgroups[0] || !i_qgroups[1]) |
1633 | + continue; |
1634 | + |
1635 | src = find_qgroup_rb(fs_info, i_qgroups[0]); |
1636 | dst = find_qgroup_rb(fs_info, i_qgroups[1]); |
1637 | |
1638 | @@ -2008,12 +2017,14 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, |
1639 | |
1640 | dst->rfer = src->rfer - level_size; |
1641 | dst->rfer_cmpr = src->rfer_cmpr - level_size; |
1642 | - i_qgroups += 2; |
1643 | } |
1644 | - for (i = 0; i < inherit->num_excl_copies; ++i) { |
1645 | + for (i = 0; i < inherit->num_excl_copies; ++i, i_qgroups += 2) { |
1646 | struct btrfs_qgroup *src; |
1647 | struct btrfs_qgroup *dst; |
1648 | |
1649 | + if (!i_qgroups[0] || !i_qgroups[1]) |
1650 | + continue; |
1651 | + |
1652 | src = find_qgroup_rb(fs_info, i_qgroups[0]); |
1653 | dst = find_qgroup_rb(fs_info, i_qgroups[1]); |
1654 | |
1655 | @@ -2024,7 +2035,6 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, |
1656 | |
1657 | dst->excl = src->excl + level_size; |
1658 | dst->excl_cmpr = src->excl_cmpr + level_size; |
1659 | - i_qgroups += 2; |
1660 | } |
1661 | |
1662 | unlock: |
1663 | diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c |
1664 | index 619f92963e27..49b3fb73ffbf 100644 |
1665 | --- a/fs/btrfs/reada.c |
1666 | +++ b/fs/btrfs/reada.c |
1667 | @@ -265,7 +265,7 @@ static struct reada_zone *reada_find_zone(struct btrfs_fs_info *fs_info, |
1668 | spin_unlock(&fs_info->reada_lock); |
1669 | |
1670 | if (ret == 1) { |
1671 | - if (logical >= zone->start && logical < zone->end) |
1672 | + if (logical >= zone->start && logical <= zone->end) |
1673 | return zone; |
1674 | spin_lock(&fs_info->reada_lock); |
1675 | kref_put(&zone->refcnt, reada_zone_release); |
1676 | @@ -679,7 +679,7 @@ static int reada_start_machine_dev(struct btrfs_fs_info *fs_info, |
1677 | */ |
1678 | ret = radix_tree_gang_lookup(&dev->reada_extents, (void **)&re, |
1679 | dev->reada_next >> PAGE_CACHE_SHIFT, 1); |
1680 | - if (ret == 0 || re->logical >= dev->reada_curr_zone->end) { |
1681 | + if (ret == 0 || re->logical > dev->reada_curr_zone->end) { |
1682 | ret = reada_pick_zone(dev); |
1683 | if (!ret) { |
1684 | spin_unlock(&fs_info->reada_lock); |
1685 | diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c |
1686 | index 2bd0011450df..5c806f0d443d 100644 |
1687 | --- a/fs/btrfs/relocation.c |
1688 | +++ b/fs/btrfs/relocation.c |
1689 | @@ -1850,6 +1850,7 @@ again: |
1690 | eb = read_tree_block(dest, old_bytenr, old_ptr_gen); |
1691 | if (IS_ERR(eb)) { |
1692 | ret = PTR_ERR(eb); |
1693 | + break; |
1694 | } else if (!extent_buffer_uptodate(eb)) { |
1695 | ret = -EIO; |
1696 | free_extent_buffer(eb); |
1697 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c |
1698 | index 849a30aa117d..58ae0a2ce65c 100644 |
1699 | --- a/fs/btrfs/tree-log.c |
1700 | +++ b/fs/btrfs/tree-log.c |
1701 | @@ -4621,7 +4621,22 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, |
1702 | |
1703 | mutex_lock(&BTRFS_I(inode)->log_mutex); |
1704 | |
1705 | - btrfs_get_logged_extents(inode, &logged_list, start, end); |
1706 | + /* |
1707 | + * Collect ordered extents only if we are logging data. This is to |
1708 | + * ensure a subsequent request to log this inode in LOG_INODE_ALL mode |
1709 | + * will process the ordered extents if they still exists at the time, |
1710 | + * because when we collect them we test and set for the flag |
1711 | + * BTRFS_ORDERED_LOGGED to prevent multiple log requests to process the |
1712 | + * same ordered extents. The consequence for the LOG_INODE_ALL log mode |
1713 | + * not processing the ordered extents is that we end up logging the |
1714 | + * corresponding file extent items, based on the extent maps in the |
1715 | + * inode's extent_map_tree's modified_list, without logging the |
1716 | + * respective checksums (since the may still be only attached to the |
1717 | + * ordered extents and have not been inserted in the csum tree by |
1718 | + * btrfs_finish_ordered_io() yet). |
1719 | + */ |
1720 | + if (inode_only == LOG_INODE_ALL) |
1721 | + btrfs_get_logged_extents(inode, &logged_list, start, end); |
1722 | |
1723 | /* |
1724 | * a brute force approach to making sure we get the most uptodate |
1725 | @@ -4909,6 +4924,42 @@ out_unlock: |
1726 | } |
1727 | |
1728 | /* |
1729 | + * Check if we must fallback to a transaction commit when logging an inode. |
1730 | + * This must be called after logging the inode and is used only in the context |
1731 | + * when fsyncing an inode requires the need to log some other inode - in which |
1732 | + * case we can't lock the i_mutex of each other inode we need to log as that |
1733 | + * can lead to deadlocks with concurrent fsync against other inodes (as we can |
1734 | + * log inodes up or down in the hierarchy) or rename operations for example. So |
1735 | + * we take the log_mutex of the inode after we have logged it and then check for |
1736 | + * its last_unlink_trans value - this is safe because any task setting |
1737 | + * last_unlink_trans must take the log_mutex and it must do this before it does |
1738 | + * the actual unlink operation, so if we do this check before a concurrent task |
1739 | + * sets last_unlink_trans it means we've logged a consistent version/state of |
1740 | + * all the inode items, otherwise we are not sure and must do a transaction |
1741 | + * commit (the concurrent task migth have only updated last_unlink_trans before |
1742 | + * we logged the inode or it might have also done the unlink). |
1743 | + */ |
1744 | +static bool btrfs_must_commit_transaction(struct btrfs_trans_handle *trans, |
1745 | + struct inode *inode) |
1746 | +{ |
1747 | + struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; |
1748 | + bool ret = false; |
1749 | + |
1750 | + mutex_lock(&BTRFS_I(inode)->log_mutex); |
1751 | + if (BTRFS_I(inode)->last_unlink_trans > fs_info->last_trans_committed) { |
1752 | + /* |
1753 | + * Make sure any commits to the log are forced to be full |
1754 | + * commits. |
1755 | + */ |
1756 | + btrfs_set_log_full_commit(fs_info, trans); |
1757 | + ret = true; |
1758 | + } |
1759 | + mutex_unlock(&BTRFS_I(inode)->log_mutex); |
1760 | + |
1761 | + return ret; |
1762 | +} |
1763 | + |
1764 | +/* |
1765 | * follow the dentry parent pointers up the chain and see if any |
1766 | * of the directories in it require a full commit before they can |
1767 | * be logged. Returns zero if nothing special needs to be done or 1 if |
1768 | @@ -4921,7 +4972,6 @@ static noinline int check_parent_dirs_for_sync(struct btrfs_trans_handle *trans, |
1769 | u64 last_committed) |
1770 | { |
1771 | int ret = 0; |
1772 | - struct btrfs_root *root; |
1773 | struct dentry *old_parent = NULL; |
1774 | struct inode *orig_inode = inode; |
1775 | |
1776 | @@ -4953,14 +5003,7 @@ static noinline int check_parent_dirs_for_sync(struct btrfs_trans_handle *trans, |
1777 | BTRFS_I(inode)->logged_trans = trans->transid; |
1778 | smp_mb(); |
1779 | |
1780 | - if (BTRFS_I(inode)->last_unlink_trans > last_committed) { |
1781 | - root = BTRFS_I(inode)->root; |
1782 | - |
1783 | - /* |
1784 | - * make sure any commits to the log are forced |
1785 | - * to be full commits |
1786 | - */ |
1787 | - btrfs_set_log_full_commit(root->fs_info, trans); |
1788 | + if (btrfs_must_commit_transaction(trans, inode)) { |
1789 | ret = 1; |
1790 | break; |
1791 | } |
1792 | @@ -5119,6 +5162,9 @@ process_leaf: |
1793 | btrfs_release_path(path); |
1794 | ret = btrfs_log_inode(trans, root, di_inode, |
1795 | log_mode, 0, LLONG_MAX, ctx); |
1796 | + if (!ret && |
1797 | + btrfs_must_commit_transaction(trans, di_inode)) |
1798 | + ret = 1; |
1799 | iput(di_inode); |
1800 | if (ret) |
1801 | goto next_dir_inode; |
1802 | @@ -5233,6 +5279,9 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans, |
1803 | |
1804 | ret = btrfs_log_inode(trans, root, dir_inode, |
1805 | LOG_INODE_ALL, 0, LLONG_MAX, ctx); |
1806 | + if (!ret && |
1807 | + btrfs_must_commit_transaction(trans, dir_inode)) |
1808 | + ret = 1; |
1809 | iput(dir_inode); |
1810 | if (ret) |
1811 | goto out; |
1812 | @@ -5584,6 +5633,9 @@ error: |
1813 | * They revolve around files there were unlinked from the directory, and |
1814 | * this function updates the parent directory so that a full commit is |
1815 | * properly done if it is fsync'd later after the unlinks are done. |
1816 | + * |
1817 | + * Must be called before the unlink operations (updates to the subvolume tree, |
1818 | + * inodes, etc) are done. |
1819 | */ |
1820 | void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans, |
1821 | struct inode *dir, struct inode *inode, |
1822 | @@ -5599,8 +5651,11 @@ void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans, |
1823 | * into the file. When the file is logged we check it and |
1824 | * don't log the parents if the file is fully on disk. |
1825 | */ |
1826 | - if (S_ISREG(inode->i_mode)) |
1827 | + if (S_ISREG(inode->i_mode)) { |
1828 | + mutex_lock(&BTRFS_I(inode)->log_mutex); |
1829 | BTRFS_I(inode)->last_unlink_trans = trans->transid; |
1830 | + mutex_unlock(&BTRFS_I(inode)->log_mutex); |
1831 | + } |
1832 | |
1833 | /* |
1834 | * if this directory was already logged any new |
1835 | @@ -5631,7 +5686,29 @@ void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans, |
1836 | return; |
1837 | |
1838 | record: |
1839 | + mutex_lock(&BTRFS_I(dir)->log_mutex); |
1840 | + BTRFS_I(dir)->last_unlink_trans = trans->transid; |
1841 | + mutex_unlock(&BTRFS_I(dir)->log_mutex); |
1842 | +} |
1843 | + |
1844 | +/* |
1845 | + * Make sure that if someone attempts to fsync the parent directory of a deleted |
1846 | + * snapshot, it ends up triggering a transaction commit. This is to guarantee |
1847 | + * that after replaying the log tree of the parent directory's root we will not |
1848 | + * see the snapshot anymore and at log replay time we will not see any log tree |
1849 | + * corresponding to the deleted snapshot's root, which could lead to replaying |
1850 | + * it after replaying the log tree of the parent directory (which would replay |
1851 | + * the snapshot delete operation). |
1852 | + * |
1853 | + * Must be called before the actual snapshot destroy operation (updates to the |
1854 | + * parent root and tree of tree roots trees, etc) are done. |
1855 | + */ |
1856 | +void btrfs_record_snapshot_destroy(struct btrfs_trans_handle *trans, |
1857 | + struct inode *dir) |
1858 | +{ |
1859 | + mutex_lock(&BTRFS_I(dir)->log_mutex); |
1860 | BTRFS_I(dir)->last_unlink_trans = trans->transid; |
1861 | + mutex_unlock(&BTRFS_I(dir)->log_mutex); |
1862 | } |
1863 | |
1864 | /* |
1865 | diff --git a/fs/btrfs/tree-log.h b/fs/btrfs/tree-log.h |
1866 | index 6916a781ea02..a9f1b75d080d 100644 |
1867 | --- a/fs/btrfs/tree-log.h |
1868 | +++ b/fs/btrfs/tree-log.h |
1869 | @@ -79,6 +79,8 @@ int btrfs_pin_log_trans(struct btrfs_root *root); |
1870 | void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans, |
1871 | struct inode *dir, struct inode *inode, |
1872 | int for_rename); |
1873 | +void btrfs_record_snapshot_destroy(struct btrfs_trans_handle *trans, |
1874 | + struct inode *dir); |
1875 | int btrfs_log_new_name(struct btrfs_trans_handle *trans, |
1876 | struct inode *inode, struct inode *old_dir, |
1877 | struct dentry *parent); |
1878 | diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c |
1879 | index 5384ceb35b1c..98b3eb7d8eaf 100644 |
1880 | --- a/fs/isofs/rock.c |
1881 | +++ b/fs/isofs/rock.c |
1882 | @@ -203,6 +203,8 @@ int get_rock_ridge_filename(struct iso_directory_record *de, |
1883 | int retnamlen = 0; |
1884 | int truncate = 0; |
1885 | int ret = 0; |
1886 | + char *p; |
1887 | + int len; |
1888 | |
1889 | if (!ISOFS_SB(inode->i_sb)->s_rock) |
1890 | return 0; |
1891 | @@ -267,12 +269,17 @@ repeat: |
1892 | rr->u.NM.flags); |
1893 | break; |
1894 | } |
1895 | - if ((strlen(retname) + rr->len - 5) >= 254) { |
1896 | + len = rr->len - 5; |
1897 | + if (retnamlen + len >= 254) { |
1898 | truncate = 1; |
1899 | break; |
1900 | } |
1901 | - strncat(retname, rr->u.NM.name, rr->len - 5); |
1902 | - retnamlen += rr->len - 5; |
1903 | + p = memchr(rr->u.NM.name, '\0', len); |
1904 | + if (unlikely(p)) |
1905 | + len = p - rr->u.NM.name; |
1906 | + memcpy(retname + retnamlen, rr->u.NM.name, len); |
1907 | + retnamlen += len; |
1908 | + retname[retnamlen] = '\0'; |
1909 | break; |
1910 | case SIG('R', 'E'): |
1911 | kfree(rs.buffer); |
1912 | diff --git a/fs/namei.c b/fs/namei.c |
1913 | index 9c590e0f66e9..7824bfb89ada 100644 |
1914 | --- a/fs/namei.c |
1915 | +++ b/fs/namei.c |
1916 | @@ -2968,22 +2968,10 @@ no_open: |
1917 | dentry = lookup_real(dir, dentry, nd->flags); |
1918 | if (IS_ERR(dentry)) |
1919 | return PTR_ERR(dentry); |
1920 | - |
1921 | - if (create_error) { |
1922 | - int open_flag = op->open_flag; |
1923 | - |
1924 | - error = create_error; |
1925 | - if ((open_flag & O_EXCL)) { |
1926 | - if (!dentry->d_inode) |
1927 | - goto out; |
1928 | - } else if (!dentry->d_inode) { |
1929 | - goto out; |
1930 | - } else if ((open_flag & O_TRUNC) && |
1931 | - d_is_reg(dentry)) { |
1932 | - goto out; |
1933 | - } |
1934 | - /* will fail later, go on to get the right error */ |
1935 | - } |
1936 | + } |
1937 | + if (create_error && !dentry->d_inode) { |
1938 | + error = create_error; |
1939 | + goto out; |
1940 | } |
1941 | looked_up: |
1942 | path->dentry = dentry; |
1943 | @@ -4258,7 +4246,11 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
1944 | bool new_is_dir = false; |
1945 | unsigned max_links = new_dir->i_sb->s_max_links; |
1946 | |
1947 | - if (source == target) |
1948 | + /* |
1949 | + * Check source == target. |
1950 | + * On overlayfs need to look at underlying inodes. |
1951 | + */ |
1952 | + if (vfs_select_inode(old_dentry, 0) == vfs_select_inode(new_dentry, 0)) |
1953 | return 0; |
1954 | |
1955 | error = may_delete(old_dir, old_dentry, is_dir); |
1956 | diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c |
1957 | index 0cdf497c91ef..2162434728c0 100644 |
1958 | --- a/fs/ocfs2/acl.c |
1959 | +++ b/fs/ocfs2/acl.c |
1960 | @@ -322,3 +322,90 @@ struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type) |
1961 | brelse(di_bh); |
1962 | return acl; |
1963 | } |
1964 | + |
1965 | +int ocfs2_acl_chmod(struct inode *inode, struct buffer_head *bh) |
1966 | +{ |
1967 | + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
1968 | + struct posix_acl *acl; |
1969 | + int ret; |
1970 | + |
1971 | + if (S_ISLNK(inode->i_mode)) |
1972 | + return -EOPNOTSUPP; |
1973 | + |
1974 | + if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) |
1975 | + return 0; |
1976 | + |
1977 | + acl = ocfs2_get_acl_nolock(inode, ACL_TYPE_ACCESS, bh); |
1978 | + if (IS_ERR(acl) || !acl) |
1979 | + return PTR_ERR(acl); |
1980 | + ret = __posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
1981 | + if (ret) |
1982 | + return ret; |
1983 | + ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, |
1984 | + acl, NULL, NULL); |
1985 | + posix_acl_release(acl); |
1986 | + return ret; |
1987 | +} |
1988 | + |
1989 | +/* |
1990 | + * Initialize the ACLs of a new inode. If parent directory has default ACL, |
1991 | + * then clone to new inode. Called from ocfs2_mknod. |
1992 | + */ |
1993 | +int ocfs2_init_acl(handle_t *handle, |
1994 | + struct inode *inode, |
1995 | + struct inode *dir, |
1996 | + struct buffer_head *di_bh, |
1997 | + struct buffer_head *dir_bh, |
1998 | + struct ocfs2_alloc_context *meta_ac, |
1999 | + struct ocfs2_alloc_context *data_ac) |
2000 | +{ |
2001 | + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
2002 | + struct posix_acl *acl = NULL; |
2003 | + int ret = 0, ret2; |
2004 | + umode_t mode; |
2005 | + |
2006 | + if (!S_ISLNK(inode->i_mode)) { |
2007 | + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) { |
2008 | + acl = ocfs2_get_acl_nolock(dir, ACL_TYPE_DEFAULT, |
2009 | + dir_bh); |
2010 | + if (IS_ERR(acl)) |
2011 | + return PTR_ERR(acl); |
2012 | + } |
2013 | + if (!acl) { |
2014 | + mode = inode->i_mode & ~current_umask(); |
2015 | + ret = ocfs2_acl_set_mode(inode, di_bh, handle, mode); |
2016 | + if (ret) { |
2017 | + mlog_errno(ret); |
2018 | + goto cleanup; |
2019 | + } |
2020 | + } |
2021 | + } |
2022 | + if ((osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) && acl) { |
2023 | + if (S_ISDIR(inode->i_mode)) { |
2024 | + ret = ocfs2_set_acl(handle, inode, di_bh, |
2025 | + ACL_TYPE_DEFAULT, acl, |
2026 | + meta_ac, data_ac); |
2027 | + if (ret) |
2028 | + goto cleanup; |
2029 | + } |
2030 | + mode = inode->i_mode; |
2031 | + ret = __posix_acl_create(&acl, GFP_NOFS, &mode); |
2032 | + if (ret < 0) |
2033 | + return ret; |
2034 | + |
2035 | + ret2 = ocfs2_acl_set_mode(inode, di_bh, handle, mode); |
2036 | + if (ret2) { |
2037 | + mlog_errno(ret2); |
2038 | + ret = ret2; |
2039 | + goto cleanup; |
2040 | + } |
2041 | + if (ret > 0) { |
2042 | + ret = ocfs2_set_acl(handle, inode, |
2043 | + di_bh, ACL_TYPE_ACCESS, |
2044 | + acl, meta_ac, data_ac); |
2045 | + } |
2046 | + } |
2047 | +cleanup: |
2048 | + posix_acl_release(acl); |
2049 | + return ret; |
2050 | +} |
2051 | diff --git a/fs/ocfs2/acl.h b/fs/ocfs2/acl.h |
2052 | index 3fce68d08625..2783a75b3999 100644 |
2053 | --- a/fs/ocfs2/acl.h |
2054 | +++ b/fs/ocfs2/acl.h |
2055 | @@ -35,5 +35,10 @@ int ocfs2_set_acl(handle_t *handle, |
2056 | struct posix_acl *acl, |
2057 | struct ocfs2_alloc_context *meta_ac, |
2058 | struct ocfs2_alloc_context *data_ac); |
2059 | +extern int ocfs2_acl_chmod(struct inode *, struct buffer_head *); |
2060 | +extern int ocfs2_init_acl(handle_t *, struct inode *, struct inode *, |
2061 | + struct buffer_head *, struct buffer_head *, |
2062 | + struct ocfs2_alloc_context *, |
2063 | + struct ocfs2_alloc_context *); |
2064 | |
2065 | #endif /* OCFS2_ACL_H */ |
2066 | diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c |
2067 | index 7cb38fdca229..3d60fda1cb09 100644 |
2068 | --- a/fs/ocfs2/file.c |
2069 | +++ b/fs/ocfs2/file.c |
2070 | @@ -1268,20 +1268,20 @@ bail_unlock_rw: |
2071 | if (size_change) |
2072 | ocfs2_rw_unlock(inode, 1); |
2073 | bail: |
2074 | - brelse(bh); |
2075 | |
2076 | /* Release quota pointers in case we acquired them */ |
2077 | for (qtype = 0; qtype < OCFS2_MAXQUOTAS; qtype++) |
2078 | dqput(transfer_to[qtype]); |
2079 | |
2080 | if (!status && attr->ia_valid & ATTR_MODE) { |
2081 | - status = posix_acl_chmod(inode, inode->i_mode); |
2082 | + status = ocfs2_acl_chmod(inode, bh); |
2083 | if (status < 0) |
2084 | mlog_errno(status); |
2085 | } |
2086 | if (inode_locked) |
2087 | ocfs2_inode_unlock(inode, 1); |
2088 | |
2089 | + brelse(bh); |
2090 | return status; |
2091 | } |
2092 | |
2093 | diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c |
2094 | index 6b3e87189a64..a8f1225e6d9b 100644 |
2095 | --- a/fs/ocfs2/namei.c |
2096 | +++ b/fs/ocfs2/namei.c |
2097 | @@ -259,7 +259,6 @@ static int ocfs2_mknod(struct inode *dir, |
2098 | struct ocfs2_dir_lookup_result lookup = { NULL, }; |
2099 | sigset_t oldset; |
2100 | int did_block_signals = 0; |
2101 | - struct posix_acl *default_acl = NULL, *acl = NULL; |
2102 | struct ocfs2_dentry_lock *dl = NULL; |
2103 | |
2104 | trace_ocfs2_mknod(dir, dentry, dentry->d_name.len, dentry->d_name.name, |
2105 | @@ -367,12 +366,6 @@ static int ocfs2_mknod(struct inode *dir, |
2106 | goto leave; |
2107 | } |
2108 | |
2109 | - status = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl); |
2110 | - if (status) { |
2111 | - mlog_errno(status); |
2112 | - goto leave; |
2113 | - } |
2114 | - |
2115 | handle = ocfs2_start_trans(osb, ocfs2_mknod_credits(osb->sb, |
2116 | S_ISDIR(mode), |
2117 | xattr_credits)); |
2118 | @@ -421,16 +414,8 @@ static int ocfs2_mknod(struct inode *dir, |
2119 | inc_nlink(dir); |
2120 | } |
2121 | |
2122 | - if (default_acl) { |
2123 | - status = ocfs2_set_acl(handle, inode, new_fe_bh, |
2124 | - ACL_TYPE_DEFAULT, default_acl, |
2125 | - meta_ac, data_ac); |
2126 | - } |
2127 | - if (!status && acl) { |
2128 | - status = ocfs2_set_acl(handle, inode, new_fe_bh, |
2129 | - ACL_TYPE_ACCESS, acl, |
2130 | - meta_ac, data_ac); |
2131 | - } |
2132 | + status = ocfs2_init_acl(handle, inode, dir, new_fe_bh, parent_fe_bh, |
2133 | + meta_ac, data_ac); |
2134 | |
2135 | if (status < 0) { |
2136 | mlog_errno(status); |
2137 | @@ -472,10 +457,6 @@ static int ocfs2_mknod(struct inode *dir, |
2138 | d_instantiate(dentry, inode); |
2139 | status = 0; |
2140 | leave: |
2141 | - if (default_acl) |
2142 | - posix_acl_release(default_acl); |
2143 | - if (acl) |
2144 | - posix_acl_release(acl); |
2145 | if (status < 0 && did_quota_inode) |
2146 | dquot_free_inode(inode); |
2147 | if (handle) |
2148 | diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c |
2149 | index 3eff031aaf26..9919964c5b3b 100644 |
2150 | --- a/fs/ocfs2/refcounttree.c |
2151 | +++ b/fs/ocfs2/refcounttree.c |
2152 | @@ -4248,20 +4248,12 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, |
2153 | struct inode *inode = d_inode(old_dentry); |
2154 | struct buffer_head *old_bh = NULL; |
2155 | struct inode *new_orphan_inode = NULL; |
2156 | - struct posix_acl *default_acl, *acl; |
2157 | - umode_t mode; |
2158 | |
2159 | if (!ocfs2_refcount_tree(OCFS2_SB(inode->i_sb))) |
2160 | return -EOPNOTSUPP; |
2161 | |
2162 | - mode = inode->i_mode; |
2163 | - error = posix_acl_create(dir, &mode, &default_acl, &acl); |
2164 | - if (error) { |
2165 | - mlog_errno(error); |
2166 | - return error; |
2167 | - } |
2168 | |
2169 | - error = ocfs2_create_inode_in_orphan(dir, mode, |
2170 | + error = ocfs2_create_inode_in_orphan(dir, inode->i_mode, |
2171 | &new_orphan_inode); |
2172 | if (error) { |
2173 | mlog_errno(error); |
2174 | @@ -4300,16 +4292,11 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, |
2175 | /* If the security isn't preserved, we need to re-initialize them. */ |
2176 | if (!preserve) { |
2177 | error = ocfs2_init_security_and_acl(dir, new_orphan_inode, |
2178 | - &new_dentry->d_name, |
2179 | - default_acl, acl); |
2180 | + &new_dentry->d_name); |
2181 | if (error) |
2182 | mlog_errno(error); |
2183 | } |
2184 | out: |
2185 | - if (default_acl) |
2186 | - posix_acl_release(default_acl); |
2187 | - if (acl) |
2188 | - posix_acl_release(acl); |
2189 | if (!error) { |
2190 | error = ocfs2_mv_orphaned_inode_to_new(dir, new_orphan_inode, |
2191 | new_dentry); |
2192 | diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c |
2193 | index 7d3d979f57d9..f19b7381a998 100644 |
2194 | --- a/fs/ocfs2/xattr.c |
2195 | +++ b/fs/ocfs2/xattr.c |
2196 | @@ -7216,12 +7216,10 @@ out: |
2197 | */ |
2198 | int ocfs2_init_security_and_acl(struct inode *dir, |
2199 | struct inode *inode, |
2200 | - const struct qstr *qstr, |
2201 | - struct posix_acl *default_acl, |
2202 | - struct posix_acl *acl) |
2203 | + const struct qstr *qstr) |
2204 | { |
2205 | - struct buffer_head *dir_bh = NULL; |
2206 | int ret = 0; |
2207 | + struct buffer_head *dir_bh = NULL; |
2208 | |
2209 | ret = ocfs2_init_security_get(inode, dir, qstr, NULL); |
2210 | if (ret) { |
2211 | @@ -7234,11 +7232,9 @@ int ocfs2_init_security_and_acl(struct inode *dir, |
2212 | mlog_errno(ret); |
2213 | goto leave; |
2214 | } |
2215 | - |
2216 | - if (!ret && default_acl) |
2217 | - ret = ocfs2_iop_set_acl(inode, default_acl, ACL_TYPE_DEFAULT); |
2218 | - if (!ret && acl) |
2219 | - ret = ocfs2_iop_set_acl(inode, acl, ACL_TYPE_ACCESS); |
2220 | + ret = ocfs2_init_acl(NULL, inode, dir, NULL, dir_bh, NULL, NULL); |
2221 | + if (ret) |
2222 | + mlog_errno(ret); |
2223 | |
2224 | ocfs2_inode_unlock(dir, 0); |
2225 | brelse(dir_bh); |
2226 | diff --git a/fs/ocfs2/xattr.h b/fs/ocfs2/xattr.h |
2227 | index f10d5b93c366..1633cc15ea1f 100644 |
2228 | --- a/fs/ocfs2/xattr.h |
2229 | +++ b/fs/ocfs2/xattr.h |
2230 | @@ -94,7 +94,5 @@ int ocfs2_reflink_xattrs(struct inode *old_inode, |
2231 | bool preserve_security); |
2232 | int ocfs2_init_security_and_acl(struct inode *dir, |
2233 | struct inode *inode, |
2234 | - const struct qstr *qstr, |
2235 | - struct posix_acl *default_acl, |
2236 | - struct posix_acl *acl); |
2237 | + const struct qstr *qstr); |
2238 | #endif /* OCFS2_XATTR_H */ |
2239 | diff --git a/fs/open.c b/fs/open.c |
2240 | index 17cb6b1dab75..081d3d6df74b 100644 |
2241 | --- a/fs/open.c |
2242 | +++ b/fs/open.c |
2243 | @@ -840,16 +840,12 @@ EXPORT_SYMBOL(file_path); |
2244 | int vfs_open(const struct path *path, struct file *file, |
2245 | const struct cred *cred) |
2246 | { |
2247 | - struct dentry *dentry = path->dentry; |
2248 | - struct inode *inode = dentry->d_inode; |
2249 | + struct inode *inode = vfs_select_inode(path->dentry, file->f_flags); |
2250 | |
2251 | - file->f_path = *path; |
2252 | - if (dentry->d_flags & DCACHE_OP_SELECT_INODE) { |
2253 | - inode = dentry->d_op->d_select_inode(dentry, file->f_flags); |
2254 | - if (IS_ERR(inode)) |
2255 | - return PTR_ERR(inode); |
2256 | - } |
2257 | + if (IS_ERR(inode)) |
2258 | + return PTR_ERR(inode); |
2259 | |
2260 | + file->f_path = *path; |
2261 | return do_dentry_open(file, inode, NULL, cred); |
2262 | } |
2263 | |
2264 | diff --git a/include/linux/bpf.h b/include/linux/bpf.h |
2265 | index 83d1926c61e4..67bc2da5d233 100644 |
2266 | --- a/include/linux/bpf.h |
2267 | +++ b/include/linux/bpf.h |
2268 | @@ -165,12 +165,13 @@ void bpf_register_prog_type(struct bpf_prog_type_list *tl); |
2269 | void bpf_register_map_type(struct bpf_map_type_list *tl); |
2270 | |
2271 | struct bpf_prog *bpf_prog_get(u32 ufd); |
2272 | +struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog); |
2273 | void bpf_prog_put(struct bpf_prog *prog); |
2274 | void bpf_prog_put_rcu(struct bpf_prog *prog); |
2275 | |
2276 | struct bpf_map *bpf_map_get_with_uref(u32 ufd); |
2277 | struct bpf_map *__bpf_map_get(struct fd f); |
2278 | -void bpf_map_inc(struct bpf_map *map, bool uref); |
2279 | +struct bpf_map *bpf_map_inc(struct bpf_map *map, bool uref); |
2280 | void bpf_map_put_with_uref(struct bpf_map *map); |
2281 | void bpf_map_put(struct bpf_map *map); |
2282 | |
2283 | diff --git a/include/linux/dcache.h b/include/linux/dcache.h |
2284 | index 03dda7ba73ac..96c1a2da92d7 100644 |
2285 | --- a/include/linux/dcache.h |
2286 | +++ b/include/linux/dcache.h |
2287 | @@ -592,4 +592,16 @@ static inline struct dentry *d_real(struct dentry *dentry) |
2288 | return dentry; |
2289 | } |
2290 | |
2291 | +static inline struct inode *vfs_select_inode(struct dentry *dentry, |
2292 | + unsigned open_flags) |
2293 | +{ |
2294 | + struct inode *inode = d_inode(dentry); |
2295 | + |
2296 | + if (inode && unlikely(dentry->d_flags & DCACHE_OP_SELECT_INODE)) |
2297 | + inode = dentry->d_op->d_select_inode(dentry, open_flags); |
2298 | + |
2299 | + return inode; |
2300 | +} |
2301 | + |
2302 | + |
2303 | #endif /* __LINUX_DCACHE_H */ |
2304 | diff --git a/include/linux/mfd/samsung/s2mps11.h b/include/linux/mfd/samsung/s2mps11.h |
2305 | index b288965e8101..2c14eeca46f0 100644 |
2306 | --- a/include/linux/mfd/samsung/s2mps11.h |
2307 | +++ b/include/linux/mfd/samsung/s2mps11.h |
2308 | @@ -173,10 +173,12 @@ enum s2mps11_regulators { |
2309 | |
2310 | #define S2MPS11_LDO_VSEL_MASK 0x3F |
2311 | #define S2MPS11_BUCK_VSEL_MASK 0xFF |
2312 | +#define S2MPS11_BUCK9_VSEL_MASK 0x1F |
2313 | #define S2MPS11_ENABLE_MASK (0x03 << S2MPS11_ENABLE_SHIFT) |
2314 | #define S2MPS11_ENABLE_SHIFT 0x06 |
2315 | #define S2MPS11_LDO_N_VOLTAGES (S2MPS11_LDO_VSEL_MASK + 1) |
2316 | #define S2MPS11_BUCK_N_VOLTAGES (S2MPS11_BUCK_VSEL_MASK + 1) |
2317 | +#define S2MPS11_BUCK9_N_VOLTAGES (S2MPS11_BUCK9_VSEL_MASK + 1) |
2318 | #define S2MPS11_RAMP_DELAY 25000 /* uV/us */ |
2319 | |
2320 | #define S2MPS11_CTRL1_PWRHOLD_MASK BIT(4) |
2321 | diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h |
2322 | index 1e3006dcf35d..46dd88e7071b 100644 |
2323 | --- a/include/linux/mlx5/driver.h |
2324 | +++ b/include/linux/mlx5/driver.h |
2325 | @@ -813,9 +813,9 @@ int mlx5_set_port_admin_status(struct mlx5_core_dev *dev, |
2326 | int mlx5_query_port_admin_status(struct mlx5_core_dev *dev, |
2327 | enum mlx5_port_status *status); |
2328 | |
2329 | -int mlx5_set_port_mtu(struct mlx5_core_dev *dev, int mtu, u8 port); |
2330 | -void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, int *max_mtu, u8 port); |
2331 | -void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, int *oper_mtu, |
2332 | +int mlx5_set_port_mtu(struct mlx5_core_dev *dev, u16 mtu, u8 port); |
2333 | +void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, u16 *max_mtu, u8 port); |
2334 | +void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, u16 *oper_mtu, |
2335 | u8 port); |
2336 | |
2337 | int mlx5_query_port_vl_hw_cap(struct mlx5_core_dev *dev, |
2338 | diff --git a/include/linux/mlx5/vport.h b/include/linux/mlx5/vport.h |
2339 | index 123771003e68..a3f3c71124d3 100644 |
2340 | --- a/include/linux/mlx5/vport.h |
2341 | +++ b/include/linux/mlx5/vport.h |
2342 | @@ -45,6 +45,8 @@ int mlx5_query_nic_vport_mac_address(struct mlx5_core_dev *mdev, |
2343 | u16 vport, u8 *addr); |
2344 | int mlx5_modify_nic_vport_mac_address(struct mlx5_core_dev *dev, |
2345 | u16 vport, u8 *addr); |
2346 | +int mlx5_query_nic_vport_mtu(struct mlx5_core_dev *mdev, u16 *mtu); |
2347 | +int mlx5_modify_nic_vport_mtu(struct mlx5_core_dev *mdev, u16 mtu); |
2348 | int mlx5_query_nic_vport_system_image_guid(struct mlx5_core_dev *mdev, |
2349 | u64 *system_image_guid); |
2350 | int mlx5_query_nic_vport_node_guid(struct mlx5_core_dev *mdev, u64 *node_guid); |
2351 | diff --git a/include/linux/mm.h b/include/linux/mm.h |
2352 | index a6c240e885c0..e4e59f9d82f1 100644 |
2353 | --- a/include/linux/mm.h |
2354 | +++ b/include/linux/mm.h |
2355 | @@ -456,11 +456,20 @@ static inline int page_mapcount(struct page *page) |
2356 | |
2357 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
2358 | int total_mapcount(struct page *page); |
2359 | +int page_trans_huge_mapcount(struct page *page, int *total_mapcount); |
2360 | #else |
2361 | static inline int total_mapcount(struct page *page) |
2362 | { |
2363 | return page_mapcount(page); |
2364 | } |
2365 | +static inline int page_trans_huge_mapcount(struct page *page, |
2366 | + int *total_mapcount) |
2367 | +{ |
2368 | + int mapcount = page_mapcount(page); |
2369 | + if (total_mapcount) |
2370 | + *total_mapcount = mapcount; |
2371 | + return mapcount; |
2372 | +} |
2373 | #endif |
2374 | |
2375 | static inline int page_count(struct page *page) |
2376 | diff --git a/include/linux/net.h b/include/linux/net.h |
2377 | index 0b4ac7da583a..25ef630f1bd6 100644 |
2378 | --- a/include/linux/net.h |
2379 | +++ b/include/linux/net.h |
2380 | @@ -245,7 +245,15 @@ do { \ |
2381 | net_ratelimited_function(pr_warn, fmt, ##__VA_ARGS__) |
2382 | #define net_info_ratelimited(fmt, ...) \ |
2383 | net_ratelimited_function(pr_info, fmt, ##__VA_ARGS__) |
2384 | -#if defined(DEBUG) |
2385 | +#if defined(CONFIG_DYNAMIC_DEBUG) |
2386 | +#define net_dbg_ratelimited(fmt, ...) \ |
2387 | +do { \ |
2388 | + DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \ |
2389 | + if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT) && \ |
2390 | + net_ratelimit()) \ |
2391 | + __dynamic_pr_debug(&descriptor, fmt, ##__VA_ARGS__); \ |
2392 | +} while (0) |
2393 | +#elif defined(DEBUG) |
2394 | #define net_dbg_ratelimited(fmt, ...) \ |
2395 | net_ratelimited_function(pr_debug, fmt, ##__VA_ARGS__) |
2396 | #else |
2397 | diff --git a/include/linux/rculist_nulls.h b/include/linux/rculist_nulls.h |
2398 | index 1c33dd7da4a7..4ae95f7e8597 100644 |
2399 | --- a/include/linux/rculist_nulls.h |
2400 | +++ b/include/linux/rculist_nulls.h |
2401 | @@ -98,6 +98,45 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n, |
2402 | if (!is_a_nulls(first)) |
2403 | first->pprev = &n->next; |
2404 | } |
2405 | + |
2406 | +/** |
2407 | + * hlist_nulls_add_tail_rcu |
2408 | + * @n: the element to add to the hash list. |
2409 | + * @h: the list to add to. |
2410 | + * |
2411 | + * Description: |
2412 | + * Adds the specified element to the end of the specified hlist_nulls, |
2413 | + * while permitting racing traversals. NOTE: tail insertion requires |
2414 | + * list traversal. |
2415 | + * |
2416 | + * The caller must take whatever precautions are necessary |
2417 | + * (such as holding appropriate locks) to avoid racing |
2418 | + * with another list-mutation primitive, such as hlist_nulls_add_head_rcu() |
2419 | + * or hlist_nulls_del_rcu(), running on this same list. |
2420 | + * However, it is perfectly legal to run concurrently with |
2421 | + * the _rcu list-traversal primitives, such as |
2422 | + * hlist_nulls_for_each_entry_rcu(), used to prevent memory-consistency |
2423 | + * problems on Alpha CPUs. Regardless of the type of CPU, the |
2424 | + * list-traversal primitive must be guarded by rcu_read_lock(). |
2425 | + */ |
2426 | +static inline void hlist_nulls_add_tail_rcu(struct hlist_nulls_node *n, |
2427 | + struct hlist_nulls_head *h) |
2428 | +{ |
2429 | + struct hlist_nulls_node *i, *last = NULL; |
2430 | + |
2431 | + for (i = hlist_nulls_first_rcu(h); !is_a_nulls(i); |
2432 | + i = hlist_nulls_next_rcu(i)) |
2433 | + last = i; |
2434 | + |
2435 | + if (last) { |
2436 | + n->next = last->next; |
2437 | + n->pprev = &last->next; |
2438 | + rcu_assign_pointer(hlist_nulls_next_rcu(last), n); |
2439 | + } else { |
2440 | + hlist_nulls_add_head_rcu(n, h); |
2441 | + } |
2442 | +} |
2443 | + |
2444 | /** |
2445 | * hlist_nulls_for_each_entry_rcu - iterate over rcu list of given type |
2446 | * @tpos: the type * to use as a loop cursor. |
2447 | diff --git a/include/linux/swap.h b/include/linux/swap.h |
2448 | index 5fa4aa4ddd05..b974a2106dd7 100644 |
2449 | --- a/include/linux/swap.h |
2450 | +++ b/include/linux/swap.h |
2451 | @@ -418,7 +418,7 @@ extern sector_t swapdev_block(int, pgoff_t); |
2452 | extern int page_swapcount(struct page *); |
2453 | extern int swp_swapcount(swp_entry_t entry); |
2454 | extern struct swap_info_struct *page_swap_info(struct page *); |
2455 | -extern int reuse_swap_page(struct page *); |
2456 | +extern bool reuse_swap_page(struct page *, int *); |
2457 | extern int try_to_free_swap(struct page *); |
2458 | struct backing_dev_info; |
2459 | |
2460 | @@ -513,8 +513,8 @@ static inline int swp_swapcount(swp_entry_t entry) |
2461 | return 0; |
2462 | } |
2463 | |
2464 | -#define reuse_swap_page(page) \ |
2465 | - (!PageTransCompound(page) && page_mapcount(page) == 1) |
2466 | +#define reuse_swap_page(page, total_mapcount) \ |
2467 | + (page_trans_huge_mapcount(page, total_mapcount) == 1) |
2468 | |
2469 | static inline int try_to_free_swap(struct page *page) |
2470 | { |
2471 | diff --git a/include/net/codel.h b/include/net/codel.h |
2472 | index 267e70210061..d168aca115cc 100644 |
2473 | --- a/include/net/codel.h |
2474 | +++ b/include/net/codel.h |
2475 | @@ -162,12 +162,14 @@ struct codel_vars { |
2476 | * struct codel_stats - contains codel shared variables and stats |
2477 | * @maxpacket: largest packet we've seen so far |
2478 | * @drop_count: temp count of dropped packets in dequeue() |
2479 | + * @drop_len: bytes of dropped packets in dequeue() |
2480 | * ecn_mark: number of packets we ECN marked instead of dropping |
2481 | * ce_mark: number of packets CE marked because sojourn time was above ce_threshold |
2482 | */ |
2483 | struct codel_stats { |
2484 | u32 maxpacket; |
2485 | u32 drop_count; |
2486 | + u32 drop_len; |
2487 | u32 ecn_mark; |
2488 | u32 ce_mark; |
2489 | }; |
2490 | @@ -308,6 +310,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch, |
2491 | vars->rec_inv_sqrt); |
2492 | goto end; |
2493 | } |
2494 | + stats->drop_len += qdisc_pkt_len(skb); |
2495 | qdisc_drop(skb, sch); |
2496 | stats->drop_count++; |
2497 | skb = dequeue_func(vars, sch); |
2498 | @@ -330,6 +333,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch, |
2499 | if (params->ecn && INET_ECN_set_ce(skb)) { |
2500 | stats->ecn_mark++; |
2501 | } else { |
2502 | + stats->drop_len += qdisc_pkt_len(skb); |
2503 | qdisc_drop(skb, sch); |
2504 | stats->drop_count++; |
2505 | |
2506 | diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h |
2507 | index 636a362a0e03..e5bba897d206 100644 |
2508 | --- a/include/net/sch_generic.h |
2509 | +++ b/include/net/sch_generic.h |
2510 | @@ -396,7 +396,8 @@ struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue, |
2511 | struct Qdisc *qdisc); |
2512 | void qdisc_reset(struct Qdisc *qdisc); |
2513 | void qdisc_destroy(struct Qdisc *qdisc); |
2514 | -void qdisc_tree_decrease_qlen(struct Qdisc *qdisc, unsigned int n); |
2515 | +void qdisc_tree_reduce_backlog(struct Qdisc *qdisc, unsigned int n, |
2516 | + unsigned int len); |
2517 | struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, |
2518 | const struct Qdisc_ops *ops); |
2519 | struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, |
2520 | @@ -707,6 +708,23 @@ static inline void qdisc_reset_queue(struct Qdisc *sch) |
2521 | sch->qstats.backlog = 0; |
2522 | } |
2523 | |
2524 | +static inline struct Qdisc *qdisc_replace(struct Qdisc *sch, struct Qdisc *new, |
2525 | + struct Qdisc **pold) |
2526 | +{ |
2527 | + struct Qdisc *old; |
2528 | + |
2529 | + sch_tree_lock(sch); |
2530 | + old = *pold; |
2531 | + *pold = new; |
2532 | + if (old != NULL) { |
2533 | + qdisc_tree_reduce_backlog(old, old->q.qlen, old->qstats.backlog); |
2534 | + qdisc_reset(old); |
2535 | + } |
2536 | + sch_tree_unlock(sch); |
2537 | + |
2538 | + return old; |
2539 | +} |
2540 | + |
2541 | static inline unsigned int __qdisc_queue_drop(struct Qdisc *sch, |
2542 | struct sk_buff_head *list) |
2543 | { |
2544 | diff --git a/include/net/sock.h b/include/net/sock.h |
2545 | index f5ea148853e2..3c688ca3456d 100644 |
2546 | --- a/include/net/sock.h |
2547 | +++ b/include/net/sock.h |
2548 | @@ -630,7 +630,11 @@ static inline void sk_add_node_rcu(struct sock *sk, struct hlist_head *list) |
2549 | |
2550 | static inline void __sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list) |
2551 | { |
2552 | - hlist_nulls_add_head_rcu(&sk->sk_nulls_node, list); |
2553 | + if (IS_ENABLED(CONFIG_IPV6) && sk->sk_reuseport && |
2554 | + sk->sk_family == AF_INET6) |
2555 | + hlist_nulls_add_tail_rcu(&sk->sk_nulls_node, list); |
2556 | + else |
2557 | + hlist_nulls_add_head_rcu(&sk->sk_nulls_node, list); |
2558 | } |
2559 | |
2560 | static inline void sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list) |
2561 | diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h |
2562 | index 9cf2394f0bcf..752f5dc040a5 100644 |
2563 | --- a/include/uapi/linux/if.h |
2564 | +++ b/include/uapi/linux/if.h |
2565 | @@ -19,14 +19,20 @@ |
2566 | #ifndef _LINUX_IF_H |
2567 | #define _LINUX_IF_H |
2568 | |
2569 | +#include <linux/libc-compat.h> /* for compatibility with glibc */ |
2570 | #include <linux/types.h> /* for "__kernel_caddr_t" et al */ |
2571 | #include <linux/socket.h> /* for "struct sockaddr" et al */ |
2572 | #include <linux/compiler.h> /* for "__user" et al */ |
2573 | |
2574 | +#if __UAPI_DEF_IF_IFNAMSIZ |
2575 | #define IFNAMSIZ 16 |
2576 | +#endif /* __UAPI_DEF_IF_IFNAMSIZ */ |
2577 | #define IFALIASZ 256 |
2578 | #include <linux/hdlc/ioctl.h> |
2579 | |
2580 | +/* For glibc compatibility. An empty enum does not compile. */ |
2581 | +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 && \ |
2582 | + __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 |
2583 | /** |
2584 | * enum net_device_flags - &struct net_device flags |
2585 | * |
2586 | @@ -68,6 +74,8 @@ |
2587 | * @IFF_ECHO: echo sent packets. Volatile. |
2588 | */ |
2589 | enum net_device_flags { |
2590 | +/* for compatibility with glibc net/if.h */ |
2591 | +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS |
2592 | IFF_UP = 1<<0, /* sysfs */ |
2593 | IFF_BROADCAST = 1<<1, /* volatile */ |
2594 | IFF_DEBUG = 1<<2, /* sysfs */ |
2595 | @@ -84,11 +92,17 @@ enum net_device_flags { |
2596 | IFF_PORTSEL = 1<<13, /* sysfs */ |
2597 | IFF_AUTOMEDIA = 1<<14, /* sysfs */ |
2598 | IFF_DYNAMIC = 1<<15, /* sysfs */ |
2599 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ |
2600 | +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO |
2601 | IFF_LOWER_UP = 1<<16, /* volatile */ |
2602 | IFF_DORMANT = 1<<17, /* volatile */ |
2603 | IFF_ECHO = 1<<18, /* volatile */ |
2604 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ |
2605 | }; |
2606 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 && __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */ |
2607 | |
2608 | +/* for compatibility with glibc net/if.h */ |
2609 | +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS |
2610 | #define IFF_UP IFF_UP |
2611 | #define IFF_BROADCAST IFF_BROADCAST |
2612 | #define IFF_DEBUG IFF_DEBUG |
2613 | @@ -105,9 +119,13 @@ enum net_device_flags { |
2614 | #define IFF_PORTSEL IFF_PORTSEL |
2615 | #define IFF_AUTOMEDIA IFF_AUTOMEDIA |
2616 | #define IFF_DYNAMIC IFF_DYNAMIC |
2617 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ |
2618 | + |
2619 | +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO |
2620 | #define IFF_LOWER_UP IFF_LOWER_UP |
2621 | #define IFF_DORMANT IFF_DORMANT |
2622 | #define IFF_ECHO IFF_ECHO |
2623 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ |
2624 | |
2625 | #define IFF_VOLATILE (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\ |
2626 | IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT) |
2627 | @@ -166,6 +184,8 @@ enum { |
2628 | * being very small might be worth keeping for clean configuration. |
2629 | */ |
2630 | |
2631 | +/* for compatibility with glibc net/if.h */ |
2632 | +#if __UAPI_DEF_IF_IFMAP |
2633 | struct ifmap { |
2634 | unsigned long mem_start; |
2635 | unsigned long mem_end; |
2636 | @@ -175,6 +195,7 @@ struct ifmap { |
2637 | unsigned char port; |
2638 | /* 3 bytes spare */ |
2639 | }; |
2640 | +#endif /* __UAPI_DEF_IF_IFMAP */ |
2641 | |
2642 | struct if_settings { |
2643 | unsigned int type; /* Type of physical device or protocol */ |
2644 | @@ -200,6 +221,8 @@ struct if_settings { |
2645 | * remainder may be interface specific. |
2646 | */ |
2647 | |
2648 | +/* for compatibility with glibc net/if.h */ |
2649 | +#if __UAPI_DEF_IF_IFREQ |
2650 | struct ifreq { |
2651 | #define IFHWADDRLEN 6 |
2652 | union |
2653 | @@ -223,6 +246,7 @@ struct ifreq { |
2654 | struct if_settings ifru_settings; |
2655 | } ifr_ifru; |
2656 | }; |
2657 | +#endif /* __UAPI_DEF_IF_IFREQ */ |
2658 | |
2659 | #define ifr_name ifr_ifrn.ifrn_name /* interface name */ |
2660 | #define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ |
2661 | @@ -249,6 +273,8 @@ struct ifreq { |
2662 | * must know all networks accessible). |
2663 | */ |
2664 | |
2665 | +/* for compatibility with glibc net/if.h */ |
2666 | +#if __UAPI_DEF_IF_IFCONF |
2667 | struct ifconf { |
2668 | int ifc_len; /* size of buffer */ |
2669 | union { |
2670 | @@ -256,6 +282,8 @@ struct ifconf { |
2671 | struct ifreq __user *ifcu_req; |
2672 | } ifc_ifcu; |
2673 | }; |
2674 | +#endif /* __UAPI_DEF_IF_IFCONF */ |
2675 | + |
2676 | #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ |
2677 | #define ifc_req ifc_ifcu.ifcu_req /* array of structures */ |
2678 | |
2679 | diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h |
2680 | index 7d024ceb075d..d5e38c73377c 100644 |
2681 | --- a/include/uapi/linux/libc-compat.h |
2682 | +++ b/include/uapi/linux/libc-compat.h |
2683 | @@ -51,6 +51,40 @@ |
2684 | /* We have included glibc headers... */ |
2685 | #if defined(__GLIBC__) |
2686 | |
2687 | +/* Coordinate with glibc net/if.h header. */ |
2688 | +#if defined(_NET_IF_H) |
2689 | + |
2690 | +/* GLIBC headers included first so don't define anything |
2691 | + * that would already be defined. */ |
2692 | + |
2693 | +#define __UAPI_DEF_IF_IFCONF 0 |
2694 | +#define __UAPI_DEF_IF_IFMAP 0 |
2695 | +#define __UAPI_DEF_IF_IFNAMSIZ 0 |
2696 | +#define __UAPI_DEF_IF_IFREQ 0 |
2697 | +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ |
2698 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0 |
2699 | +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ |
2700 | +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO |
2701 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 |
2702 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ |
2703 | + |
2704 | +#else /* _NET_IF_H */ |
2705 | + |
2706 | +/* Linux headers included first, and we must define everything |
2707 | + * we need. The expectation is that glibc will check the |
2708 | + * __UAPI_DEF_* defines and adjust appropriately. */ |
2709 | + |
2710 | +#define __UAPI_DEF_IF_IFCONF 1 |
2711 | +#define __UAPI_DEF_IF_IFMAP 1 |
2712 | +#define __UAPI_DEF_IF_IFNAMSIZ 1 |
2713 | +#define __UAPI_DEF_IF_IFREQ 1 |
2714 | +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ |
2715 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 |
2716 | +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ |
2717 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 |
2718 | + |
2719 | +#endif /* _NET_IF_H */ |
2720 | + |
2721 | /* Coordinate with glibc netinet/in.h header. */ |
2722 | #if defined(_NETINET_IN_H) |
2723 | |
2724 | @@ -117,6 +151,16 @@ |
2725 | * that we need. */ |
2726 | #else /* !defined(__GLIBC__) */ |
2727 | |
2728 | +/* Definitions for if.h */ |
2729 | +#define __UAPI_DEF_IF_IFCONF 1 |
2730 | +#define __UAPI_DEF_IF_IFMAP 1 |
2731 | +#define __UAPI_DEF_IF_IFNAMSIZ 1 |
2732 | +#define __UAPI_DEF_IF_IFREQ 1 |
2733 | +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ |
2734 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 |
2735 | +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ |
2736 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 |
2737 | + |
2738 | /* Definitions for in.h */ |
2739 | #define __UAPI_DEF_IN_ADDR 1 |
2740 | #define __UAPI_DEF_IN_IPPROTO 1 |
2741 | diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c |
2742 | index f2ece3c174a5..8f94ca1860cf 100644 |
2743 | --- a/kernel/bpf/inode.c |
2744 | +++ b/kernel/bpf/inode.c |
2745 | @@ -31,10 +31,10 @@ static void *bpf_any_get(void *raw, enum bpf_type type) |
2746 | { |
2747 | switch (type) { |
2748 | case BPF_TYPE_PROG: |
2749 | - atomic_inc(&((struct bpf_prog *)raw)->aux->refcnt); |
2750 | + raw = bpf_prog_inc(raw); |
2751 | break; |
2752 | case BPF_TYPE_MAP: |
2753 | - bpf_map_inc(raw, true); |
2754 | + raw = bpf_map_inc(raw, true); |
2755 | break; |
2756 | default: |
2757 | WARN_ON_ONCE(1); |
2758 | @@ -297,7 +297,8 @@ static void *bpf_obj_do_get(const struct filename *pathname, |
2759 | goto out; |
2760 | |
2761 | raw = bpf_any_get(inode->i_private, *type); |
2762 | - touch_atime(&path); |
2763 | + if (!IS_ERR(raw)) |
2764 | + touch_atime(&path); |
2765 | |
2766 | path_put(&path); |
2767 | return raw; |
2768 | diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c |
2769 | index 637397059f76..aa5f39772ac4 100644 |
2770 | --- a/kernel/bpf/syscall.c |
2771 | +++ b/kernel/bpf/syscall.c |
2772 | @@ -201,11 +201,18 @@ struct bpf_map *__bpf_map_get(struct fd f) |
2773 | return f.file->private_data; |
2774 | } |
2775 | |
2776 | -void bpf_map_inc(struct bpf_map *map, bool uref) |
2777 | +/* prog's and map's refcnt limit */ |
2778 | +#define BPF_MAX_REFCNT 32768 |
2779 | + |
2780 | +struct bpf_map *bpf_map_inc(struct bpf_map *map, bool uref) |
2781 | { |
2782 | - atomic_inc(&map->refcnt); |
2783 | + if (atomic_inc_return(&map->refcnt) > BPF_MAX_REFCNT) { |
2784 | + atomic_dec(&map->refcnt); |
2785 | + return ERR_PTR(-EBUSY); |
2786 | + } |
2787 | if (uref) |
2788 | atomic_inc(&map->usercnt); |
2789 | + return map; |
2790 | } |
2791 | |
2792 | struct bpf_map *bpf_map_get_with_uref(u32 ufd) |
2793 | @@ -217,7 +224,7 @@ struct bpf_map *bpf_map_get_with_uref(u32 ufd) |
2794 | if (IS_ERR(map)) |
2795 | return map; |
2796 | |
2797 | - bpf_map_inc(map, true); |
2798 | + map = bpf_map_inc(map, true); |
2799 | fdput(f); |
2800 | |
2801 | return map; |
2802 | @@ -600,6 +607,15 @@ static struct bpf_prog *__bpf_prog_get(struct fd f) |
2803 | return f.file->private_data; |
2804 | } |
2805 | |
2806 | +struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog) |
2807 | +{ |
2808 | + if (atomic_inc_return(&prog->aux->refcnt) > BPF_MAX_REFCNT) { |
2809 | + atomic_dec(&prog->aux->refcnt); |
2810 | + return ERR_PTR(-EBUSY); |
2811 | + } |
2812 | + return prog; |
2813 | +} |
2814 | + |
2815 | /* called by sockets/tracing/seccomp before attaching program to an event |
2816 | * pairs with bpf_prog_put() |
2817 | */ |
2818 | @@ -612,7 +628,7 @@ struct bpf_prog *bpf_prog_get(u32 ufd) |
2819 | if (IS_ERR(prog)) |
2820 | return prog; |
2821 | |
2822 | - atomic_inc(&prog->aux->refcnt); |
2823 | + prog = bpf_prog_inc(prog); |
2824 | fdput(f); |
2825 | |
2826 | return prog; |
2827 | diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c |
2828 | index 2e7f7ab739e4..2cbfba78d3db 100644 |
2829 | --- a/kernel/bpf/verifier.c |
2830 | +++ b/kernel/bpf/verifier.c |
2831 | @@ -239,15 +239,6 @@ static const char * const reg_type_str[] = { |
2832 | [CONST_IMM] = "imm", |
2833 | }; |
2834 | |
2835 | -static const struct { |
2836 | - int map_type; |
2837 | - int func_id; |
2838 | -} func_limit[] = { |
2839 | - {BPF_MAP_TYPE_PROG_ARRAY, BPF_FUNC_tail_call}, |
2840 | - {BPF_MAP_TYPE_PERF_EVENT_ARRAY, BPF_FUNC_perf_event_read}, |
2841 | - {BPF_MAP_TYPE_PERF_EVENT_ARRAY, BPF_FUNC_perf_event_output}, |
2842 | -}; |
2843 | - |
2844 | static void print_verifier_state(struct verifier_env *env) |
2845 | { |
2846 | enum bpf_reg_type t; |
2847 | @@ -898,24 +889,44 @@ static int check_func_arg(struct verifier_env *env, u32 regno, |
2848 | |
2849 | static int check_map_func_compatibility(struct bpf_map *map, int func_id) |
2850 | { |
2851 | - bool bool_map, bool_func; |
2852 | - int i; |
2853 | - |
2854 | if (!map) |
2855 | return 0; |
2856 | |
2857 | - for (i = 0; i < ARRAY_SIZE(func_limit); i++) { |
2858 | - bool_map = (map->map_type == func_limit[i].map_type); |
2859 | - bool_func = (func_id == func_limit[i].func_id); |
2860 | - /* only when map & func pair match it can continue. |
2861 | - * don't allow any other map type to be passed into |
2862 | - * the special func; |
2863 | - */ |
2864 | - if (bool_func && bool_map != bool_func) |
2865 | - return -EINVAL; |
2866 | + /* We need a two way check, first is from map perspective ... */ |
2867 | + switch (map->map_type) { |
2868 | + case BPF_MAP_TYPE_PROG_ARRAY: |
2869 | + if (func_id != BPF_FUNC_tail_call) |
2870 | + goto error; |
2871 | + break; |
2872 | + case BPF_MAP_TYPE_PERF_EVENT_ARRAY: |
2873 | + if (func_id != BPF_FUNC_perf_event_read && |
2874 | + func_id != BPF_FUNC_perf_event_output) |
2875 | + goto error; |
2876 | + break; |
2877 | + default: |
2878 | + break; |
2879 | + } |
2880 | + |
2881 | + /* ... and second from the function itself. */ |
2882 | + switch (func_id) { |
2883 | + case BPF_FUNC_tail_call: |
2884 | + if (map->map_type != BPF_MAP_TYPE_PROG_ARRAY) |
2885 | + goto error; |
2886 | + break; |
2887 | + case BPF_FUNC_perf_event_read: |
2888 | + case BPF_FUNC_perf_event_output: |
2889 | + if (map->map_type != BPF_MAP_TYPE_PERF_EVENT_ARRAY) |
2890 | + goto error; |
2891 | + break; |
2892 | + default: |
2893 | + break; |
2894 | } |
2895 | |
2896 | return 0; |
2897 | +error: |
2898 | + verbose("cannot pass map_type %d into func %d\n", |
2899 | + map->map_type, func_id); |
2900 | + return -EINVAL; |
2901 | } |
2902 | |
2903 | static int check_call(struct verifier_env *env, int func_id) |
2904 | @@ -1348,6 +1359,7 @@ static int check_ld_abs(struct verifier_env *env, struct bpf_insn *insn) |
2905 | } |
2906 | |
2907 | if (insn->dst_reg != BPF_REG_0 || insn->off != 0 || |
2908 | + BPF_SIZE(insn->code) == BPF_DW || |
2909 | (mode == BPF_ABS && insn->src_reg != BPF_REG_0)) { |
2910 | verbose("BPF_LD_ABS uses reserved fields\n"); |
2911 | return -EINVAL; |
2912 | @@ -2003,7 +2015,6 @@ static int replace_map_fd_with_map_ptr(struct verifier_env *env) |
2913 | if (IS_ERR(map)) { |
2914 | verbose("fd %d is not pointing to valid bpf_map\n", |
2915 | insn->imm); |
2916 | - fdput(f); |
2917 | return PTR_ERR(map); |
2918 | } |
2919 | |
2920 | @@ -2023,15 +2034,18 @@ static int replace_map_fd_with_map_ptr(struct verifier_env *env) |
2921 | return -E2BIG; |
2922 | } |
2923 | |
2924 | - /* remember this map */ |
2925 | - env->used_maps[env->used_map_cnt++] = map; |
2926 | - |
2927 | /* hold the map. If the program is rejected by verifier, |
2928 | * the map will be released by release_maps() or it |
2929 | * will be used by the valid program until it's unloaded |
2930 | * and all maps are released in free_bpf_prog_info() |
2931 | */ |
2932 | - bpf_map_inc(map, false); |
2933 | + map = bpf_map_inc(map, false); |
2934 | + if (IS_ERR(map)) { |
2935 | + fdput(f); |
2936 | + return PTR_ERR(map); |
2937 | + } |
2938 | + env->used_maps[env->used_map_cnt++] = map; |
2939 | + |
2940 | fdput(f); |
2941 | next_insn: |
2942 | insn++; |
2943 | diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c |
2944 | index 1faad2cfdb9e..287201a5d12f 100644 |
2945 | --- a/kernel/events/ring_buffer.c |
2946 | +++ b/kernel/events/ring_buffer.c |
2947 | @@ -347,6 +347,7 @@ void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size, |
2948 | bool truncated) |
2949 | { |
2950 | struct ring_buffer *rb = handle->rb; |
2951 | + bool wakeup = truncated; |
2952 | unsigned long aux_head; |
2953 | u64 flags = 0; |
2954 | |
2955 | @@ -375,9 +376,16 @@ void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size, |
2956 | aux_head = rb->user_page->aux_head = local_read(&rb->aux_head); |
2957 | |
2958 | if (aux_head - local_read(&rb->aux_wakeup) >= rb->aux_watermark) { |
2959 | - perf_output_wakeup(handle); |
2960 | + wakeup = true; |
2961 | local_add(rb->aux_watermark, &rb->aux_wakeup); |
2962 | } |
2963 | + |
2964 | + if (wakeup) { |
2965 | + if (truncated) |
2966 | + handle->event->pending_disable = 1; |
2967 | + perf_output_wakeup(handle); |
2968 | + } |
2969 | + |
2970 | handle->event = NULL; |
2971 | |
2972 | local_set(&rb->aux_nest, 0); |
2973 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
2974 | index 9e82d0450fad..f48c80e4ba75 100644 |
2975 | --- a/kernel/workqueue.c |
2976 | +++ b/kernel/workqueue.c |
2977 | @@ -4556,6 +4556,17 @@ static void rebind_workers(struct worker_pool *pool) |
2978 | pool->attrs->cpumask) < 0); |
2979 | |
2980 | spin_lock_irq(&pool->lock); |
2981 | + |
2982 | + /* |
2983 | + * XXX: CPU hotplug notifiers are weird and can call DOWN_FAILED |
2984 | + * w/o preceding DOWN_PREPARE. Work around it. CPU hotplug is |
2985 | + * being reworked and this can go away in time. |
2986 | + */ |
2987 | + if (!(pool->flags & POOL_DISASSOCIATED)) { |
2988 | + spin_unlock_irq(&pool->lock); |
2989 | + return; |
2990 | + } |
2991 | + |
2992 | pool->flags &= ~POOL_DISASSOCIATED; |
2993 | |
2994 | for_each_pool_worker(worker, pool) { |
2995 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c |
2996 | index a7db0a2db1ab..a82a87b3f9c6 100644 |
2997 | --- a/mm/huge_memory.c |
2998 | +++ b/mm/huge_memory.c |
2999 | @@ -1257,15 +1257,9 @@ int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, |
3000 | VM_BUG_ON_PAGE(!PageCompound(page) || !PageHead(page), page); |
3001 | /* |
3002 | * We can only reuse the page if nobody else maps the huge page or it's |
3003 | - * part. We can do it by checking page_mapcount() on each sub-page, but |
3004 | - * it's expensive. |
3005 | - * The cheaper way is to check page_count() to be equal 1: every |
3006 | - * mapcount takes page reference reference, so this way we can |
3007 | - * guarantee, that the PMD is the only mapping. |
3008 | - * This can give false negative if somebody pinned the page, but that's |
3009 | - * fine. |
3010 | + * part. |
3011 | */ |
3012 | - if (page_mapcount(page) == 1 && page_count(page) == 1) { |
3013 | + if (page_trans_huge_mapcount(page, NULL) == 1) { |
3014 | pmd_t entry; |
3015 | entry = pmd_mkyoung(orig_pmd); |
3016 | entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); |
3017 | @@ -2038,7 +2032,8 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma, |
3018 | if (pte_write(pteval)) { |
3019 | writable = true; |
3020 | } else { |
3021 | - if (PageSwapCache(page) && !reuse_swap_page(page)) { |
3022 | + if (PageSwapCache(page) && |
3023 | + !reuse_swap_page(page, NULL)) { |
3024 | unlock_page(page); |
3025 | result = SCAN_SWAP_CACHE_PAGE; |
3026 | goto out; |
3027 | @@ -3338,6 +3333,64 @@ int total_mapcount(struct page *page) |
3028 | } |
3029 | |
3030 | /* |
3031 | + * This calculates accurately how many mappings a transparent hugepage |
3032 | + * has (unlike page_mapcount() which isn't fully accurate). This full |
3033 | + * accuracy is primarily needed to know if copy-on-write faults can |
3034 | + * reuse the page and change the mapping to read-write instead of |
3035 | + * copying them. At the same time this returns the total_mapcount too. |
3036 | + * |
3037 | + * The function returns the highest mapcount any one of the subpages |
3038 | + * has. If the return value is one, even if different processes are |
3039 | + * mapping different subpages of the transparent hugepage, they can |
3040 | + * all reuse it, because each process is reusing a different subpage. |
3041 | + * |
3042 | + * The total_mapcount is instead counting all virtual mappings of the |
3043 | + * subpages. If the total_mapcount is equal to "one", it tells the |
3044 | + * caller all mappings belong to the same "mm" and in turn the |
3045 | + * anon_vma of the transparent hugepage can become the vma->anon_vma |
3046 | + * local one as no other process may be mapping any of the subpages. |
3047 | + * |
3048 | + * It would be more accurate to replace page_mapcount() with |
3049 | + * page_trans_huge_mapcount(), however we only use |
3050 | + * page_trans_huge_mapcount() in the copy-on-write faults where we |
3051 | + * need full accuracy to avoid breaking page pinning, because |
3052 | + * page_trans_huge_mapcount() is slower than page_mapcount(). |
3053 | + */ |
3054 | +int page_trans_huge_mapcount(struct page *page, int *total_mapcount) |
3055 | +{ |
3056 | + int i, ret, _total_mapcount, mapcount; |
3057 | + |
3058 | + /* hugetlbfs shouldn't call it */ |
3059 | + VM_BUG_ON_PAGE(PageHuge(page), page); |
3060 | + |
3061 | + if (likely(!PageTransCompound(page))) { |
3062 | + mapcount = atomic_read(&page->_mapcount) + 1; |
3063 | + if (total_mapcount) |
3064 | + *total_mapcount = mapcount; |
3065 | + return mapcount; |
3066 | + } |
3067 | + |
3068 | + page = compound_head(page); |
3069 | + |
3070 | + _total_mapcount = ret = 0; |
3071 | + for (i = 0; i < HPAGE_PMD_NR; i++) { |
3072 | + mapcount = atomic_read(&page[i]._mapcount) + 1; |
3073 | + ret = max(ret, mapcount); |
3074 | + _total_mapcount += mapcount; |
3075 | + } |
3076 | + if (PageDoubleMap(page)) { |
3077 | + ret -= 1; |
3078 | + _total_mapcount -= HPAGE_PMD_NR; |
3079 | + } |
3080 | + mapcount = compound_mapcount(page); |
3081 | + ret += mapcount; |
3082 | + _total_mapcount += mapcount; |
3083 | + if (total_mapcount) |
3084 | + *total_mapcount = _total_mapcount; |
3085 | + return ret; |
3086 | +} |
3087 | + |
3088 | +/* |
3089 | * This function splits huge page into normal pages. @page can point to any |
3090 | * subpage of huge page to split. Split doesn't change the position of @page. |
3091 | * |
3092 | diff --git a/mm/memory.c b/mm/memory.c |
3093 | index 3345dcf862cf..c1aa0e4b4096 100644 |
3094 | --- a/mm/memory.c |
3095 | +++ b/mm/memory.c |
3096 | @@ -2357,6 +2357,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, |
3097 | * not dirty accountable. |
3098 | */ |
3099 | if (PageAnon(old_page) && !PageKsm(old_page)) { |
3100 | + int total_mapcount; |
3101 | if (!trylock_page(old_page)) { |
3102 | page_cache_get(old_page); |
3103 | pte_unmap_unlock(page_table, ptl); |
3104 | @@ -2371,13 +2372,18 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, |
3105 | } |
3106 | page_cache_release(old_page); |
3107 | } |
3108 | - if (reuse_swap_page(old_page)) { |
3109 | - /* |
3110 | - * The page is all ours. Move it to our anon_vma so |
3111 | - * the rmap code will not search our parent or siblings. |
3112 | - * Protected against the rmap code by the page lock. |
3113 | - */ |
3114 | - page_move_anon_rmap(old_page, vma, address); |
3115 | + if (reuse_swap_page(old_page, &total_mapcount)) { |
3116 | + if (total_mapcount == 1) { |
3117 | + /* |
3118 | + * The page is all ours. Move it to |
3119 | + * our anon_vma so the rmap code will |
3120 | + * not search our parent or siblings. |
3121 | + * Protected against the rmap code by |
3122 | + * the page lock. |
3123 | + */ |
3124 | + page_move_anon_rmap(compound_head(old_page), |
3125 | + vma, address); |
3126 | + } |
3127 | unlock_page(old_page); |
3128 | return wp_page_reuse(mm, vma, address, page_table, ptl, |
3129 | orig_pte, old_page, 0, 0); |
3130 | @@ -2602,7 +2608,7 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, |
3131 | inc_mm_counter_fast(mm, MM_ANONPAGES); |
3132 | dec_mm_counter_fast(mm, MM_SWAPENTS); |
3133 | pte = mk_pte(page, vma->vm_page_prot); |
3134 | - if ((flags & FAULT_FLAG_WRITE) && reuse_swap_page(page)) { |
3135 | + if ((flags & FAULT_FLAG_WRITE) && reuse_swap_page(page, NULL)) { |
3136 | pte = maybe_mkwrite(pte_mkdirty(pte), vma); |
3137 | flags &= ~FAULT_FLAG_WRITE; |
3138 | ret |= VM_FAULT_WRITE; |
3139 | diff --git a/mm/swapfile.c b/mm/swapfile.c |
3140 | index d2c37365e2d6..954fd8f72b79 100644 |
3141 | --- a/mm/swapfile.c |
3142 | +++ b/mm/swapfile.c |
3143 | @@ -916,18 +916,19 @@ out: |
3144 | * to it. And as a side-effect, free up its swap: because the old content |
3145 | * on disk will never be read, and seeking back there to write new content |
3146 | * later would only waste time away from clustering. |
3147 | + * |
3148 | + * NOTE: total_mapcount should not be relied upon by the caller if |
3149 | + * reuse_swap_page() returns false, but it may be always overwritten |
3150 | + * (see the other implementation for CONFIG_SWAP=n). |
3151 | */ |
3152 | -int reuse_swap_page(struct page *page) |
3153 | +bool reuse_swap_page(struct page *page, int *total_mapcount) |
3154 | { |
3155 | int count; |
3156 | |
3157 | VM_BUG_ON_PAGE(!PageLocked(page), page); |
3158 | if (unlikely(PageKsm(page))) |
3159 | - return 0; |
3160 | - /* The page is part of THP and cannot be reused */ |
3161 | - if (PageTransCompound(page)) |
3162 | - return 0; |
3163 | - count = page_mapcount(page); |
3164 | + return false; |
3165 | + count = page_trans_huge_mapcount(page, total_mapcount); |
3166 | if (count <= 1 && PageSwapCache(page)) { |
3167 | count += page_swapcount(page); |
3168 | if (count == 1 && !PageWriteback(page)) { |
3169 | diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c |
3170 | index 2d7c4c11fc63..336149ffd07d 100644 |
3171 | --- a/mm/zsmalloc.c |
3172 | +++ b/mm/zsmalloc.c |
3173 | @@ -1732,10 +1732,13 @@ static struct page *isolate_source_page(struct size_class *class) |
3174 | static unsigned long zs_can_compact(struct size_class *class) |
3175 | { |
3176 | unsigned long obj_wasted; |
3177 | + unsigned long obj_allocated = zs_stat_get(class, OBJ_ALLOCATED); |
3178 | + unsigned long obj_used = zs_stat_get(class, OBJ_USED); |
3179 | |
3180 | - obj_wasted = zs_stat_get(class, OBJ_ALLOCATED) - |
3181 | - zs_stat_get(class, OBJ_USED); |
3182 | + if (obj_allocated <= obj_used) |
3183 | + return 0; |
3184 | |
3185 | + obj_wasted = obj_allocated - obj_used; |
3186 | obj_wasted /= get_maxobj_per_zspage(class->size, |
3187 | class->pages_per_zspage); |
3188 | |
3189 | diff --git a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c |
3190 | index 263b4de4de57..60a3dbfca8a1 100644 |
3191 | --- a/net/bridge/br_ioctl.c |
3192 | +++ b/net/bridge/br_ioctl.c |
3193 | @@ -21,18 +21,19 @@ |
3194 | #include <asm/uaccess.h> |
3195 | #include "br_private.h" |
3196 | |
3197 | -/* called with RTNL */ |
3198 | static int get_bridge_ifindices(struct net *net, int *indices, int num) |
3199 | { |
3200 | struct net_device *dev; |
3201 | int i = 0; |
3202 | |
3203 | - for_each_netdev(net, dev) { |
3204 | + rcu_read_lock(); |
3205 | + for_each_netdev_rcu(net, dev) { |
3206 | if (i >= num) |
3207 | break; |
3208 | if (dev->priv_flags & IFF_EBRIDGE) |
3209 | indices[i++] = dev->ifindex; |
3210 | } |
3211 | + rcu_read_unlock(); |
3212 | |
3213 | return i; |
3214 | } |
3215 | diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c |
3216 | index 03661d97463c..ea9893743a0f 100644 |
3217 | --- a/net/bridge/br_multicast.c |
3218 | +++ b/net/bridge/br_multicast.c |
3219 | @@ -1270,6 +1270,7 @@ static int br_ip4_multicast_query(struct net_bridge *br, |
3220 | struct br_ip saddr; |
3221 | unsigned long max_delay; |
3222 | unsigned long now = jiffies; |
3223 | + unsigned int offset = skb_transport_offset(skb); |
3224 | __be32 group; |
3225 | int err = 0; |
3226 | |
3227 | @@ -1280,14 +1281,14 @@ static int br_ip4_multicast_query(struct net_bridge *br, |
3228 | |
3229 | group = ih->group; |
3230 | |
3231 | - if (skb->len == sizeof(*ih)) { |
3232 | + if (skb->len == offset + sizeof(*ih)) { |
3233 | max_delay = ih->code * (HZ / IGMP_TIMER_SCALE); |
3234 | |
3235 | if (!max_delay) { |
3236 | max_delay = 10 * HZ; |
3237 | group = 0; |
3238 | } |
3239 | - } else if (skb->len >= sizeof(*ih3)) { |
3240 | + } else if (skb->len >= offset + sizeof(*ih3)) { |
3241 | ih3 = igmpv3_query_hdr(skb); |
3242 | if (ih3->nsrcs) |
3243 | goto out; |
3244 | @@ -1348,6 +1349,7 @@ static int br_ip6_multicast_query(struct net_bridge *br, |
3245 | struct br_ip saddr; |
3246 | unsigned long max_delay; |
3247 | unsigned long now = jiffies; |
3248 | + unsigned int offset = skb_transport_offset(skb); |
3249 | const struct in6_addr *group = NULL; |
3250 | bool is_general_query; |
3251 | int err = 0; |
3252 | @@ -1357,8 +1359,8 @@ static int br_ip6_multicast_query(struct net_bridge *br, |
3253 | (port && port->state == BR_STATE_DISABLED)) |
3254 | goto out; |
3255 | |
3256 | - if (skb->len == sizeof(*mld)) { |
3257 | - if (!pskb_may_pull(skb, sizeof(*mld))) { |
3258 | + if (skb->len == offset + sizeof(*mld)) { |
3259 | + if (!pskb_may_pull(skb, offset + sizeof(*mld))) { |
3260 | err = -EINVAL; |
3261 | goto out; |
3262 | } |
3263 | @@ -1367,7 +1369,7 @@ static int br_ip6_multicast_query(struct net_bridge *br, |
3264 | if (max_delay) |
3265 | group = &mld->mld_mca; |
3266 | } else { |
3267 | - if (!pskb_may_pull(skb, sizeof(*mld2q))) { |
3268 | + if (!pskb_may_pull(skb, offset + sizeof(*mld2q))) { |
3269 | err = -EINVAL; |
3270 | goto out; |
3271 | } |
3272 | diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c |
3273 | index 215e6137f6ff..482c3717a45e 100644 |
3274 | --- a/net/core/rtnetlink.c |
3275 | +++ b/net/core/rtnetlink.c |
3276 | @@ -1176,14 +1176,16 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb, |
3277 | |
3278 | static int rtnl_fill_link_ifmap(struct sk_buff *skb, struct net_device *dev) |
3279 | { |
3280 | - struct rtnl_link_ifmap map = { |
3281 | - .mem_start = dev->mem_start, |
3282 | - .mem_end = dev->mem_end, |
3283 | - .base_addr = dev->base_addr, |
3284 | - .irq = dev->irq, |
3285 | - .dma = dev->dma, |
3286 | - .port = dev->if_port, |
3287 | - }; |
3288 | + struct rtnl_link_ifmap map; |
3289 | + |
3290 | + memset(&map, 0, sizeof(map)); |
3291 | + map.mem_start = dev->mem_start; |
3292 | + map.mem_end = dev->mem_end; |
3293 | + map.base_addr = dev->base_addr; |
3294 | + map.irq = dev->irq; |
3295 | + map.dma = dev->dma; |
3296 | + map.port = dev->if_port; |
3297 | + |
3298 | if (nla_put(skb, IFLA_MAP, sizeof(map), &map)) |
3299 | return -EMSGSIZE; |
3300 | |
3301 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c |
3302 | index 8616d1147c93..9835d9a8a7a4 100644 |
3303 | --- a/net/core/skbuff.c |
3304 | +++ b/net/core/skbuff.c |
3305 | @@ -4427,15 +4427,16 @@ int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci) |
3306 | __skb_push(skb, offset); |
3307 | err = __vlan_insert_tag(skb, skb->vlan_proto, |
3308 | skb_vlan_tag_get(skb)); |
3309 | - if (err) |
3310 | + if (err) { |
3311 | + __skb_pull(skb, offset); |
3312 | return err; |
3313 | + } |
3314 | + |
3315 | skb->protocol = skb->vlan_proto; |
3316 | skb->mac_len += VLAN_HLEN; |
3317 | - __skb_pull(skb, offset); |
3318 | |
3319 | - if (skb->ip_summed == CHECKSUM_COMPLETE) |
3320 | - skb->csum = csum_add(skb->csum, csum_partial(skb->data |
3321 | - + (2 * ETH_ALEN), VLAN_HLEN, 0)); |
3322 | + skb_postpush_rcsum(skb, skb->data + (2 * ETH_ALEN), VLAN_HLEN); |
3323 | + __skb_pull(skb, offset); |
3324 | } |
3325 | __vlan_hwaccel_put_tag(skb, vlan_proto, vlan_tci); |
3326 | return 0; |
3327 | diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c |
3328 | index 607a14f20d88..b1dc096d22f8 100644 |
3329 | --- a/net/decnet/dn_route.c |
3330 | +++ b/net/decnet/dn_route.c |
3331 | @@ -1034,10 +1034,13 @@ source_ok: |
3332 | if (!fld.daddr) { |
3333 | fld.daddr = fld.saddr; |
3334 | |
3335 | - err = -EADDRNOTAVAIL; |
3336 | if (dev_out) |
3337 | dev_put(dev_out); |
3338 | + err = -EINVAL; |
3339 | dev_out = init_net.loopback_dev; |
3340 | + if (!dev_out->dn_ptr) |
3341 | + goto out; |
3342 | + err = -EADDRNOTAVAIL; |
3343 | dev_hold(dev_out); |
3344 | if (!fld.daddr) { |
3345 | fld.daddr = |
3346 | @@ -1110,6 +1113,8 @@ source_ok: |
3347 | if (dev_out == NULL) |
3348 | goto out; |
3349 | dn_db = rcu_dereference_raw(dev_out->dn_ptr); |
3350 | + if (!dn_db) |
3351 | + goto e_inval; |
3352 | /* Possible improvement - check all devices for local addr */ |
3353 | if (dn_dev_islocal(dev_out, fld.daddr)) { |
3354 | dev_put(dev_out); |
3355 | @@ -1151,6 +1156,8 @@ select_source: |
3356 | dev_put(dev_out); |
3357 | dev_out = init_net.loopback_dev; |
3358 | dev_hold(dev_out); |
3359 | + if (!dev_out->dn_ptr) |
3360 | + goto e_inval; |
3361 | fld.flowidn_oif = dev_out->ifindex; |
3362 | if (res.fi) |
3363 | dn_fib_info_put(res.fi); |
3364 | diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c |
3365 | index 8a9246deccfe..63566ec54794 100644 |
3366 | --- a/net/ipv4/fib_frontend.c |
3367 | +++ b/net/ipv4/fib_frontend.c |
3368 | @@ -904,7 +904,11 @@ void fib_del_ifaddr(struct in_ifaddr *ifa, struct in_ifaddr *iprim) |
3369 | if (ifa->ifa_flags & IFA_F_SECONDARY) { |
3370 | prim = inet_ifa_byprefix(in_dev, any, ifa->ifa_mask); |
3371 | if (!prim) { |
3372 | - pr_warn("%s: bug: prim == NULL\n", __func__); |
3373 | + /* if the device has been deleted, we don't perform |
3374 | + * address promotion |
3375 | + */ |
3376 | + if (!in_dev->dead) |
3377 | + pr_warn("%s: bug: prim == NULL\n", __func__); |
3378 | return; |
3379 | } |
3380 | if (iprim && iprim != prim) { |
3381 | diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c |
3382 | index d97268e8ff10..2b68418c7198 100644 |
3383 | --- a/net/ipv4/fib_semantics.c |
3384 | +++ b/net/ipv4/fib_semantics.c |
3385 | @@ -975,6 +975,8 @@ fib_convert_metrics(struct fib_info *fi, const struct fib_config *cfg) |
3386 | val = 65535 - 40; |
3387 | if (type == RTAX_MTU && val > 65535 - 15) |
3388 | val = 65535 - 15; |
3389 | + if (type == RTAX_HOPLIMIT && val > 255) |
3390 | + val = 255; |
3391 | if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK)) |
3392 | return -EINVAL; |
3393 | fi->fib_metrics[type - 1] = val; |
3394 | diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c |
3395 | index 41ba68de46d8..d0c1e7766214 100644 |
3396 | --- a/net/ipv4/ip_gre.c |
3397 | +++ b/net/ipv4/ip_gre.c |
3398 | @@ -179,6 +179,7 @@ static __be16 tnl_flags_to_gre_flags(__be16 tflags) |
3399 | return flags; |
3400 | } |
3401 | |
3402 | +/* Fills in tpi and returns header length to be pulled. */ |
3403 | static int parse_gre_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, |
3404 | bool *csum_err) |
3405 | { |
3406 | @@ -238,7 +239,7 @@ static int parse_gre_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, |
3407 | return -EINVAL; |
3408 | } |
3409 | } |
3410 | - return iptunnel_pull_header(skb, hdr_len, tpi->proto); |
3411 | + return hdr_len; |
3412 | } |
3413 | |
3414 | static void ipgre_err(struct sk_buff *skb, u32 info, |
3415 | @@ -341,7 +342,7 @@ static void gre_err(struct sk_buff *skb, u32 info) |
3416 | struct tnl_ptk_info tpi; |
3417 | bool csum_err = false; |
3418 | |
3419 | - if (parse_gre_header(skb, &tpi, &csum_err)) { |
3420 | + if (parse_gre_header(skb, &tpi, &csum_err) < 0) { |
3421 | if (!csum_err) /* ignore csum errors. */ |
3422 | return; |
3423 | } |
3424 | @@ -419,6 +420,7 @@ static int gre_rcv(struct sk_buff *skb) |
3425 | { |
3426 | struct tnl_ptk_info tpi; |
3427 | bool csum_err = false; |
3428 | + int hdr_len; |
3429 | |
3430 | #ifdef CONFIG_NET_IPGRE_BROADCAST |
3431 | if (ipv4_is_multicast(ip_hdr(skb)->daddr)) { |
3432 | @@ -428,7 +430,10 @@ static int gre_rcv(struct sk_buff *skb) |
3433 | } |
3434 | #endif |
3435 | |
3436 | - if (parse_gre_header(skb, &tpi, &csum_err) < 0) |
3437 | + hdr_len = parse_gre_header(skb, &tpi, &csum_err); |
3438 | + if (hdr_len < 0) |
3439 | + goto drop; |
3440 | + if (iptunnel_pull_header(skb, hdr_len, tpi.proto) < 0) |
3441 | goto drop; |
3442 | |
3443 | if (ipgre_rcv(skb, &tpi) == PACKET_RCVD) |
3444 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c |
3445 | index 02c62299d717..b050cf980a57 100644 |
3446 | --- a/net/ipv4/route.c |
3447 | +++ b/net/ipv4/route.c |
3448 | @@ -2045,6 +2045,18 @@ static struct rtable *__mkroute_output(const struct fib_result *res, |
3449 | */ |
3450 | if (fi && res->prefixlen < 4) |
3451 | fi = NULL; |
3452 | + } else if ((type == RTN_LOCAL) && (orig_oif != 0) && |
3453 | + (orig_oif != dev_out->ifindex)) { |
3454 | + /* For local routes that require a particular output interface |
3455 | + * we do not want to cache the result. Caching the result |
3456 | + * causes incorrect behaviour when there are multiple source |
3457 | + * addresses on the interface, the end result being that if the |
3458 | + * intended recipient is waiting on that interface for the |
3459 | + * packet he won't receive it because it will be delivered on |
3460 | + * the loopback interface and the IP_PKTINFO ipi_ifindex will |
3461 | + * be set to the loopback interface as well. |
3462 | + */ |
3463 | + fi = NULL; |
3464 | } |
3465 | |
3466 | fnhe = NULL; |
3467 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c |
3468 | index fda379cd600d..b6876f2f4cf2 100644 |
3469 | --- a/net/ipv4/tcp_output.c |
3470 | +++ b/net/ipv4/tcp_output.c |
3471 | @@ -2625,8 +2625,10 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) |
3472 | */ |
3473 | if (unlikely((NET_IP_ALIGN && ((unsigned long)skb->data & 3)) || |
3474 | skb_headroom(skb) >= 0xFFFF)) { |
3475 | - struct sk_buff *nskb = __pskb_copy(skb, MAX_TCP_HEADER, |
3476 | - GFP_ATOMIC); |
3477 | + struct sk_buff *nskb; |
3478 | + |
3479 | + skb_mstamp_get(&skb->skb_mstamp); |
3480 | + nskb = __pskb_copy(skb, MAX_TCP_HEADER, GFP_ATOMIC); |
3481 | err = nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : |
3482 | -ENOBUFS; |
3483 | } else { |
3484 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c |
3485 | index eb8933bc0e6e..56218ff388c7 100644 |
3486 | --- a/net/ipv4/udp.c |
3487 | +++ b/net/ipv4/udp.c |
3488 | @@ -339,8 +339,13 @@ found: |
3489 | |
3490 | hslot2 = udp_hashslot2(udptable, udp_sk(sk)->udp_portaddr_hash); |
3491 | spin_lock(&hslot2->lock); |
3492 | - hlist_nulls_add_head_rcu(&udp_sk(sk)->udp_portaddr_node, |
3493 | - &hslot2->head); |
3494 | + if (IS_ENABLED(CONFIG_IPV6) && sk->sk_reuseport && |
3495 | + sk->sk_family == AF_INET6) |
3496 | + hlist_nulls_add_tail_rcu(&udp_sk(sk)->udp_portaddr_node, |
3497 | + &hslot2->head); |
3498 | + else |
3499 | + hlist_nulls_add_head_rcu(&udp_sk(sk)->udp_portaddr_node, |
3500 | + &hslot2->head); |
3501 | hslot2->count++; |
3502 | spin_unlock(&hslot2->lock); |
3503 | } |
3504 | diff --git a/net/ipv6/ila/ila_lwt.c b/net/ipv6/ila/ila_lwt.c |
3505 | index 2ae3c4fd8aab..41f18de5dcc2 100644 |
3506 | --- a/net/ipv6/ila/ila_lwt.c |
3507 | +++ b/net/ipv6/ila/ila_lwt.c |
3508 | @@ -120,8 +120,7 @@ nla_put_failure: |
3509 | |
3510 | static int ila_encap_nlsize(struct lwtunnel_state *lwtstate) |
3511 | { |
3512 | - /* No encapsulation overhead */ |
3513 | - return 0; |
3514 | + return nla_total_size(sizeof(u64)); /* ILA_ATTR_LOCATOR */ |
3515 | } |
3516 | |
3517 | static int ila_encap_cmp(struct lwtunnel_state *a, struct lwtunnel_state *b) |
3518 | diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c |
3519 | index 18f3498a6c80..e2ea31175ef9 100644 |
3520 | --- a/net/ipv6/reassembly.c |
3521 | +++ b/net/ipv6/reassembly.c |
3522 | @@ -496,10 +496,8 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, |
3523 | IP6CB(head)->flags |= IP6SKB_FRAGMENTED; |
3524 | |
3525 | /* Yes, and fold redundant checksum back. 8) */ |
3526 | - if (head->ip_summed == CHECKSUM_COMPLETE) |
3527 | - head->csum = csum_partial(skb_network_header(head), |
3528 | - skb_network_header_len(head), |
3529 | - head->csum); |
3530 | + skb_postpush_rcsum(head, skb_network_header(head), |
3531 | + skb_network_header_len(head)); |
3532 | |
3533 | rcu_read_lock(); |
3534 | IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMOKS); |
3535 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
3536 | index ed446639219c..18e29e2f8877 100644 |
3537 | --- a/net/ipv6/route.c |
3538 | +++ b/net/ipv6/route.c |
3539 | @@ -1737,6 +1737,8 @@ static int ip6_convert_metrics(struct mx6_config *mxc, |
3540 | } else { |
3541 | val = nla_get_u32(nla); |
3542 | } |
3543 | + if (type == RTAX_HOPLIMIT && val > 255) |
3544 | + val = 255; |
3545 | if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK)) |
3546 | goto err; |
3547 | |
3548 | diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c |
3549 | index 8dab4e569571..bb8edb9ef506 100644 |
3550 | --- a/net/llc/af_llc.c |
3551 | +++ b/net/llc/af_llc.c |
3552 | @@ -626,6 +626,7 @@ static void llc_cmsg_rcv(struct msghdr *msg, struct sk_buff *skb) |
3553 | if (llc->cmsg_flags & LLC_CMSG_PKTINFO) { |
3554 | struct llc_pktinfo info; |
3555 | |
3556 | + memset(&info, 0, sizeof(info)); |
3557 | info.lpi_ifindex = llc_sk(skb->sk)->dev->ifindex; |
3558 | llc_pdu_decode_dsap(skb, &info.lpi_sap); |
3559 | llc_pdu_decode_da(skb, info.lpi_mac); |
3560 | diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c |
3561 | index f60b4fdeeb8c..6b94f0bc11b8 100644 |
3562 | --- a/net/netfilter/nf_conntrack_core.c |
3563 | +++ b/net/netfilter/nf_conntrack_core.c |
3564 | @@ -1780,6 +1780,7 @@ void nf_conntrack_init_end(void) |
3565 | |
3566 | int nf_conntrack_init_net(struct net *net) |
3567 | { |
3568 | + static atomic64_t unique_id; |
3569 | int ret = -ENOMEM; |
3570 | int cpu; |
3571 | |
3572 | @@ -1802,7 +1803,8 @@ int nf_conntrack_init_net(struct net *net) |
3573 | if (!net->ct.stat) |
3574 | goto err_pcpu_lists; |
3575 | |
3576 | - net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%p", net); |
3577 | + net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%llu", |
3578 | + (u64)atomic64_inc_return(&unique_id)); |
3579 | if (!net->ct.slabname) |
3580 | goto err_slabname; |
3581 | |
3582 | diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c |
3583 | index 2d59df521915..879185fe183f 100644 |
3584 | --- a/net/openvswitch/actions.c |
3585 | +++ b/net/openvswitch/actions.c |
3586 | @@ -158,9 +158,7 @@ static int push_mpls(struct sk_buff *skb, struct sw_flow_key *key, |
3587 | new_mpls_lse = (__be32 *)skb_mpls_header(skb); |
3588 | *new_mpls_lse = mpls->mpls_lse; |
3589 | |
3590 | - if (skb->ip_summed == CHECKSUM_COMPLETE) |
3591 | - skb->csum = csum_add(skb->csum, csum_partial(new_mpls_lse, |
3592 | - MPLS_HLEN, 0)); |
3593 | + skb_postpush_rcsum(skb, new_mpls_lse, MPLS_HLEN); |
3594 | |
3595 | hdr = eth_hdr(skb); |
3596 | hdr->h_proto = mpls->mpls_ethertype; |
3597 | @@ -280,7 +278,7 @@ static int set_eth_addr(struct sk_buff *skb, struct sw_flow_key *flow_key, |
3598 | ether_addr_copy_masked(eth_hdr(skb)->h_dest, key->eth_dst, |
3599 | mask->eth_dst); |
3600 | |
3601 | - ovs_skb_postpush_rcsum(skb, eth_hdr(skb), ETH_ALEN * 2); |
3602 | + skb_postpush_rcsum(skb, eth_hdr(skb), ETH_ALEN * 2); |
3603 | |
3604 | ether_addr_copy(flow_key->eth.src, eth_hdr(skb)->h_source); |
3605 | ether_addr_copy(flow_key->eth.dst, eth_hdr(skb)->h_dest); |
3606 | @@ -463,7 +461,7 @@ static int set_ipv6(struct sk_buff *skb, struct sw_flow_key *flow_key, |
3607 | mask_ipv6_addr(saddr, key->ipv6_src, mask->ipv6_src, masked); |
3608 | |
3609 | if (unlikely(memcmp(saddr, masked, sizeof(masked)))) { |
3610 | - set_ipv6_addr(skb, key->ipv6_proto, saddr, masked, |
3611 | + set_ipv6_addr(skb, flow_key->ip.proto, saddr, masked, |
3612 | true); |
3613 | memcpy(&flow_key->ipv6.addr.src, masked, |
3614 | sizeof(flow_key->ipv6.addr.src)); |
3615 | @@ -485,7 +483,7 @@ static int set_ipv6(struct sk_buff *skb, struct sw_flow_key *flow_key, |
3616 | NULL, &flags) |
3617 | != NEXTHDR_ROUTING); |
3618 | |
3619 | - set_ipv6_addr(skb, key->ipv6_proto, daddr, masked, |
3620 | + set_ipv6_addr(skb, flow_key->ip.proto, daddr, masked, |
3621 | recalc_csum); |
3622 | memcpy(&flow_key->ipv6.addr.dst, masked, |
3623 | sizeof(flow_key->ipv6.addr.dst)); |
3624 | @@ -639,7 +637,7 @@ static int ovs_vport_output(struct net *net, struct sock *sk, struct sk_buff *sk |
3625 | /* Reconstruct the MAC header. */ |
3626 | skb_push(skb, data->l2_len); |
3627 | memcpy(skb->data, &data->l2_data, data->l2_len); |
3628 | - ovs_skb_postpush_rcsum(skb, skb->data, data->l2_len); |
3629 | + skb_postpush_rcsum(skb, skb->data, data->l2_len); |
3630 | skb_reset_mac_header(skb); |
3631 | |
3632 | ovs_vport_send(vport, skb); |
3633 | diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c |
3634 | index ee6ff8ffc12d..9e5b9fc805fb 100644 |
3635 | --- a/net/openvswitch/conntrack.c |
3636 | +++ b/net/openvswitch/conntrack.c |
3637 | @@ -320,6 +320,7 @@ static int handle_fragments(struct net *net, struct sw_flow_key *key, |
3638 | } else if (key->eth.type == htons(ETH_P_IPV6)) { |
3639 | enum ip6_defrag_users user = IP6_DEFRAG_CONNTRACK_IN + zone; |
3640 | |
3641 | + skb_orphan(skb); |
3642 | memset(IP6CB(skb), 0, sizeof(struct inet6_skb_parm)); |
3643 | err = nf_ct_frag6_gather(net, skb, user); |
3644 | if (err) |
3645 | diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c |
3646 | index 6a6adf314363..4e3972344aa6 100644 |
3647 | --- a/net/openvswitch/vport-netdev.c |
3648 | +++ b/net/openvswitch/vport-netdev.c |
3649 | @@ -58,7 +58,7 @@ static void netdev_port_receive(struct sk_buff *skb) |
3650 | return; |
3651 | |
3652 | skb_push(skb, ETH_HLEN); |
3653 | - ovs_skb_postpush_rcsum(skb, skb->data, ETH_HLEN); |
3654 | + skb_postpush_rcsum(skb, skb->data, ETH_HLEN); |
3655 | ovs_vport_receive(vport, skb, skb_tunnel_info(skb)); |
3656 | return; |
3657 | error: |
3658 | diff --git a/net/openvswitch/vport.h b/net/openvswitch/vport.h |
3659 | index c10899cb9040..f01f28a567ad 100644 |
3660 | --- a/net/openvswitch/vport.h |
3661 | +++ b/net/openvswitch/vport.h |
3662 | @@ -185,13 +185,6 @@ static inline struct vport *vport_from_priv(void *priv) |
3663 | int ovs_vport_receive(struct vport *, struct sk_buff *, |
3664 | const struct ip_tunnel_info *); |
3665 | |
3666 | -static inline void ovs_skb_postpush_rcsum(struct sk_buff *skb, |
3667 | - const void *start, unsigned int len) |
3668 | -{ |
3669 | - if (skb->ip_summed == CHECKSUM_COMPLETE) |
3670 | - skb->csum = csum_add(skb->csum, csum_partial(start, len, 0)); |
3671 | -} |
3672 | - |
3673 | static inline const char *ovs_vport_name(struct vport *vport) |
3674 | { |
3675 | return vport->dev->name; |
3676 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
3677 | index da1ae0e13cb5..9cc7b512b472 100644 |
3678 | --- a/net/packet/af_packet.c |
3679 | +++ b/net/packet/af_packet.c |
3680 | @@ -3436,6 +3436,7 @@ static int packet_mc_add(struct sock *sk, struct packet_mreq_max *mreq) |
3681 | i->ifindex = mreq->mr_ifindex; |
3682 | i->alen = mreq->mr_alen; |
3683 | memcpy(i->addr, mreq->mr_address, i->alen); |
3684 | + memset(i->addr + i->alen, 0, sizeof(i->addr) - i->alen); |
3685 | i->count = 1; |
3686 | i->next = po->mclist; |
3687 | po->mclist = i; |
3688 | diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c |
3689 | index af1acf009866..95b560f0b253 100644 |
3690 | --- a/net/sched/sch_api.c |
3691 | +++ b/net/sched/sch_api.c |
3692 | @@ -744,14 +744,15 @@ static u32 qdisc_alloc_handle(struct net_device *dev) |
3693 | return 0; |
3694 | } |
3695 | |
3696 | -void qdisc_tree_decrease_qlen(struct Qdisc *sch, unsigned int n) |
3697 | +void qdisc_tree_reduce_backlog(struct Qdisc *sch, unsigned int n, |
3698 | + unsigned int len) |
3699 | { |
3700 | const struct Qdisc_class_ops *cops; |
3701 | unsigned long cl; |
3702 | u32 parentid; |
3703 | int drops; |
3704 | |
3705 | - if (n == 0) |
3706 | + if (n == 0 && len == 0) |
3707 | return; |
3708 | drops = max_t(int, n, 0); |
3709 | rcu_read_lock(); |
3710 | @@ -774,11 +775,12 @@ void qdisc_tree_decrease_qlen(struct Qdisc *sch, unsigned int n) |
3711 | cops->put(sch, cl); |
3712 | } |
3713 | sch->q.qlen -= n; |
3714 | + sch->qstats.backlog -= len; |
3715 | __qdisc_qstats_drop(sch, drops); |
3716 | } |
3717 | rcu_read_unlock(); |
3718 | } |
3719 | -EXPORT_SYMBOL(qdisc_tree_decrease_qlen); |
3720 | +EXPORT_SYMBOL(qdisc_tree_reduce_backlog); |
3721 | |
3722 | static void notify_and_destroy(struct net *net, struct sk_buff *skb, |
3723 | struct nlmsghdr *n, u32 clid, |
3724 | diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c |
3725 | index c538d9e4a8f6..baafddf229ce 100644 |
3726 | --- a/net/sched/sch_cbq.c |
3727 | +++ b/net/sched/sch_cbq.c |
3728 | @@ -1624,13 +1624,8 @@ static int cbq_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, |
3729 | new->reshape_fail = cbq_reshape_fail; |
3730 | #endif |
3731 | } |
3732 | - sch_tree_lock(sch); |
3733 | - *old = cl->q; |
3734 | - cl->q = new; |
3735 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); |
3736 | - qdisc_reset(*old); |
3737 | - sch_tree_unlock(sch); |
3738 | |
3739 | + *old = qdisc_replace(sch, new, &cl->q); |
3740 | return 0; |
3741 | } |
3742 | |
3743 | @@ -1914,7 +1909,7 @@ static int cbq_delete(struct Qdisc *sch, unsigned long arg) |
3744 | { |
3745 | struct cbq_sched_data *q = qdisc_priv(sch); |
3746 | struct cbq_class *cl = (struct cbq_class *)arg; |
3747 | - unsigned int qlen; |
3748 | + unsigned int qlen, backlog; |
3749 | |
3750 | if (cl->filters || cl->children || cl == &q->link) |
3751 | return -EBUSY; |
3752 | @@ -1922,8 +1917,9 @@ static int cbq_delete(struct Qdisc *sch, unsigned long arg) |
3753 | sch_tree_lock(sch); |
3754 | |
3755 | qlen = cl->q->q.qlen; |
3756 | + backlog = cl->q->qstats.backlog; |
3757 | qdisc_reset(cl->q); |
3758 | - qdisc_tree_decrease_qlen(cl->q, qlen); |
3759 | + qdisc_tree_reduce_backlog(cl->q, qlen, backlog); |
3760 | |
3761 | if (cl->next_alive) |
3762 | cbq_deactivate_class(cl); |
3763 | diff --git a/net/sched/sch_choke.c b/net/sched/sch_choke.c |
3764 | index 5ffb8b8337c7..0a08c860eee4 100644 |
3765 | --- a/net/sched/sch_choke.c |
3766 | +++ b/net/sched/sch_choke.c |
3767 | @@ -128,8 +128,8 @@ static void choke_drop_by_idx(struct Qdisc *sch, unsigned int idx) |
3768 | choke_zap_tail_holes(q); |
3769 | |
3770 | qdisc_qstats_backlog_dec(sch, skb); |
3771 | + qdisc_tree_reduce_backlog(sch, 1, qdisc_pkt_len(skb)); |
3772 | qdisc_drop(skb, sch); |
3773 | - qdisc_tree_decrease_qlen(sch, 1); |
3774 | --sch->q.qlen; |
3775 | } |
3776 | |
3777 | @@ -456,6 +456,7 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt) |
3778 | old = q->tab; |
3779 | if (old) { |
3780 | unsigned int oqlen = sch->q.qlen, tail = 0; |
3781 | + unsigned dropped = 0; |
3782 | |
3783 | while (q->head != q->tail) { |
3784 | struct sk_buff *skb = q->tab[q->head]; |
3785 | @@ -467,11 +468,12 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt) |
3786 | ntab[tail++] = skb; |
3787 | continue; |
3788 | } |
3789 | + dropped += qdisc_pkt_len(skb); |
3790 | qdisc_qstats_backlog_dec(sch, skb); |
3791 | --sch->q.qlen; |
3792 | qdisc_drop(skb, sch); |
3793 | } |
3794 | - qdisc_tree_decrease_qlen(sch, oqlen - sch->q.qlen); |
3795 | + qdisc_tree_reduce_backlog(sch, oqlen - sch->q.qlen, dropped); |
3796 | q->head = 0; |
3797 | q->tail = tail; |
3798 | } |
3799 | diff --git a/net/sched/sch_codel.c b/net/sched/sch_codel.c |
3800 | index 535007d5f0b5..9b7e2980ee5c 100644 |
3801 | --- a/net/sched/sch_codel.c |
3802 | +++ b/net/sched/sch_codel.c |
3803 | @@ -79,12 +79,13 @@ static struct sk_buff *codel_qdisc_dequeue(struct Qdisc *sch) |
3804 | |
3805 | skb = codel_dequeue(sch, &q->params, &q->vars, &q->stats, dequeue); |
3806 | |
3807 | - /* We cant call qdisc_tree_decrease_qlen() if our qlen is 0, |
3808 | + /* We cant call qdisc_tree_reduce_backlog() if our qlen is 0, |
3809 | * or HTB crashes. Defer it for next round. |
3810 | */ |
3811 | if (q->stats.drop_count && sch->q.qlen) { |
3812 | - qdisc_tree_decrease_qlen(sch, q->stats.drop_count); |
3813 | + qdisc_tree_reduce_backlog(sch, q->stats.drop_count, q->stats.drop_len); |
3814 | q->stats.drop_count = 0; |
3815 | + q->stats.drop_len = 0; |
3816 | } |
3817 | if (skb) |
3818 | qdisc_bstats_update(sch, skb); |
3819 | @@ -116,7 +117,7 @@ static int codel_change(struct Qdisc *sch, struct nlattr *opt) |
3820 | { |
3821 | struct codel_sched_data *q = qdisc_priv(sch); |
3822 | struct nlattr *tb[TCA_CODEL_MAX + 1]; |
3823 | - unsigned int qlen; |
3824 | + unsigned int qlen, dropped = 0; |
3825 | int err; |
3826 | |
3827 | if (!opt) |
3828 | @@ -156,10 +157,11 @@ static int codel_change(struct Qdisc *sch, struct nlattr *opt) |
3829 | while (sch->q.qlen > sch->limit) { |
3830 | struct sk_buff *skb = __skb_dequeue(&sch->q); |
3831 | |
3832 | + dropped += qdisc_pkt_len(skb); |
3833 | qdisc_qstats_backlog_dec(sch, skb); |
3834 | qdisc_drop(skb, sch); |
3835 | } |
3836 | - qdisc_tree_decrease_qlen(sch, qlen - sch->q.qlen); |
3837 | + qdisc_tree_reduce_backlog(sch, qlen - sch->q.qlen, dropped); |
3838 | |
3839 | sch_tree_unlock(sch); |
3840 | return 0; |
3841 | diff --git a/net/sched/sch_drr.c b/net/sched/sch_drr.c |
3842 | index a1cd778240cd..a63e879e8975 100644 |
3843 | --- a/net/sched/sch_drr.c |
3844 | +++ b/net/sched/sch_drr.c |
3845 | @@ -53,9 +53,10 @@ static struct drr_class *drr_find_class(struct Qdisc *sch, u32 classid) |
3846 | static void drr_purge_queue(struct drr_class *cl) |
3847 | { |
3848 | unsigned int len = cl->qdisc->q.qlen; |
3849 | + unsigned int backlog = cl->qdisc->qstats.backlog; |
3850 | |
3851 | qdisc_reset(cl->qdisc); |
3852 | - qdisc_tree_decrease_qlen(cl->qdisc, len); |
3853 | + qdisc_tree_reduce_backlog(cl->qdisc, len, backlog); |
3854 | } |
3855 | |
3856 | static const struct nla_policy drr_policy[TCA_DRR_MAX + 1] = { |
3857 | @@ -226,11 +227,7 @@ static int drr_graft_class(struct Qdisc *sch, unsigned long arg, |
3858 | new = &noop_qdisc; |
3859 | } |
3860 | |
3861 | - sch_tree_lock(sch); |
3862 | - drr_purge_queue(cl); |
3863 | - *old = cl->qdisc; |
3864 | - cl->qdisc = new; |
3865 | - sch_tree_unlock(sch); |
3866 | + *old = qdisc_replace(sch, new, &cl->qdisc); |
3867 | return 0; |
3868 | } |
3869 | |
3870 | diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c |
3871 | index f357f34d02d2..d0dff0cd8186 100644 |
3872 | --- a/net/sched/sch_dsmark.c |
3873 | +++ b/net/sched/sch_dsmark.c |
3874 | @@ -73,13 +73,7 @@ static int dsmark_graft(struct Qdisc *sch, unsigned long arg, |
3875 | new = &noop_qdisc; |
3876 | } |
3877 | |
3878 | - sch_tree_lock(sch); |
3879 | - *old = p->q; |
3880 | - p->q = new; |
3881 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); |
3882 | - qdisc_reset(*old); |
3883 | - sch_tree_unlock(sch); |
3884 | - |
3885 | + *old = qdisc_replace(sch, new, &p->q); |
3886 | return 0; |
3887 | } |
3888 | |
3889 | @@ -264,6 +258,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
3890 | return err; |
3891 | } |
3892 | |
3893 | + qdisc_qstats_backlog_inc(sch, skb); |
3894 | sch->q.qlen++; |
3895 | |
3896 | return NET_XMIT_SUCCESS; |
3897 | @@ -286,6 +281,7 @@ static struct sk_buff *dsmark_dequeue(struct Qdisc *sch) |
3898 | return NULL; |
3899 | |
3900 | qdisc_bstats_update(sch, skb); |
3901 | + qdisc_qstats_backlog_dec(sch, skb); |
3902 | sch->q.qlen--; |
3903 | |
3904 | index = skb->tc_index & (p->indices - 1); |
3905 | @@ -401,6 +397,7 @@ static void dsmark_reset(struct Qdisc *sch) |
3906 | |
3907 | pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p); |
3908 | qdisc_reset(p->q); |
3909 | + sch->qstats.backlog = 0; |
3910 | sch->q.qlen = 0; |
3911 | } |
3912 | |
3913 | diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c |
3914 | index 109b2322778f..3c6a47d66a04 100644 |
3915 | --- a/net/sched/sch_fq.c |
3916 | +++ b/net/sched/sch_fq.c |
3917 | @@ -662,6 +662,7 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt) |
3918 | struct fq_sched_data *q = qdisc_priv(sch); |
3919 | struct nlattr *tb[TCA_FQ_MAX + 1]; |
3920 | int err, drop_count = 0; |
3921 | + unsigned drop_len = 0; |
3922 | u32 fq_log; |
3923 | |
3924 | if (!opt) |
3925 | @@ -736,10 +737,11 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt) |
3926 | |
3927 | if (!skb) |
3928 | break; |
3929 | + drop_len += qdisc_pkt_len(skb); |
3930 | kfree_skb(skb); |
3931 | drop_count++; |
3932 | } |
3933 | - qdisc_tree_decrease_qlen(sch, drop_count); |
3934 | + qdisc_tree_reduce_backlog(sch, drop_count, drop_len); |
3935 | |
3936 | sch_tree_unlock(sch); |
3937 | return err; |
3938 | diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c |
3939 | index 4c834e93dafb..d3fc8f9dd3d4 100644 |
3940 | --- a/net/sched/sch_fq_codel.c |
3941 | +++ b/net/sched/sch_fq_codel.c |
3942 | @@ -175,7 +175,7 @@ static unsigned int fq_codel_qdisc_drop(struct Qdisc *sch) |
3943 | static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
3944 | { |
3945 | struct fq_codel_sched_data *q = qdisc_priv(sch); |
3946 | - unsigned int idx; |
3947 | + unsigned int idx, prev_backlog; |
3948 | struct fq_codel_flow *flow; |
3949 | int uninitialized_var(ret); |
3950 | |
3951 | @@ -203,6 +203,7 @@ static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
3952 | if (++sch->q.qlen <= sch->limit) |
3953 | return NET_XMIT_SUCCESS; |
3954 | |
3955 | + prev_backlog = sch->qstats.backlog; |
3956 | q->drop_overlimit++; |
3957 | /* Return Congestion Notification only if we dropped a packet |
3958 | * from this flow. |
3959 | @@ -211,7 +212,7 @@ static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
3960 | return NET_XMIT_CN; |
3961 | |
3962 | /* As we dropped a packet, better let upper stack know this */ |
3963 | - qdisc_tree_decrease_qlen(sch, 1); |
3964 | + qdisc_tree_reduce_backlog(sch, 1, prev_backlog - sch->qstats.backlog); |
3965 | return NET_XMIT_SUCCESS; |
3966 | } |
3967 | |
3968 | @@ -241,6 +242,7 @@ static struct sk_buff *fq_codel_dequeue(struct Qdisc *sch) |
3969 | struct fq_codel_flow *flow; |
3970 | struct list_head *head; |
3971 | u32 prev_drop_count, prev_ecn_mark; |
3972 | + unsigned int prev_backlog; |
3973 | |
3974 | begin: |
3975 | head = &q->new_flows; |
3976 | @@ -259,6 +261,7 @@ begin: |
3977 | |
3978 | prev_drop_count = q->cstats.drop_count; |
3979 | prev_ecn_mark = q->cstats.ecn_mark; |
3980 | + prev_backlog = sch->qstats.backlog; |
3981 | |
3982 | skb = codel_dequeue(sch, &q->cparams, &flow->cvars, &q->cstats, |
3983 | dequeue); |
3984 | @@ -276,12 +279,14 @@ begin: |
3985 | } |
3986 | qdisc_bstats_update(sch, skb); |
3987 | flow->deficit -= qdisc_pkt_len(skb); |
3988 | - /* We cant call qdisc_tree_decrease_qlen() if our qlen is 0, |
3989 | + /* We cant call qdisc_tree_reduce_backlog() if our qlen is 0, |
3990 | * or HTB crashes. Defer it for next round. |
3991 | */ |
3992 | if (q->cstats.drop_count && sch->q.qlen) { |
3993 | - qdisc_tree_decrease_qlen(sch, q->cstats.drop_count); |
3994 | + qdisc_tree_reduce_backlog(sch, q->cstats.drop_count, |
3995 | + q->cstats.drop_len); |
3996 | q->cstats.drop_count = 0; |
3997 | + q->cstats.drop_len = 0; |
3998 | } |
3999 | return skb; |
4000 | } |
4001 | @@ -372,11 +377,13 @@ static int fq_codel_change(struct Qdisc *sch, struct nlattr *opt) |
4002 | while (sch->q.qlen > sch->limit) { |
4003 | struct sk_buff *skb = fq_codel_dequeue(sch); |
4004 | |
4005 | + q->cstats.drop_len += qdisc_pkt_len(skb); |
4006 | kfree_skb(skb); |
4007 | q->cstats.drop_count++; |
4008 | } |
4009 | - qdisc_tree_decrease_qlen(sch, q->cstats.drop_count); |
4010 | + qdisc_tree_reduce_backlog(sch, q->cstats.drop_count, q->cstats.drop_len); |
4011 | q->cstats.drop_count = 0; |
4012 | + q->cstats.drop_len = 0; |
4013 | |
4014 | sch_tree_unlock(sch); |
4015 | return 0; |
4016 | diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c |
4017 | index 16bc83b2842a..aa4725038f94 100644 |
4018 | --- a/net/sched/sch_generic.c |
4019 | +++ b/net/sched/sch_generic.c |
4020 | @@ -159,12 +159,15 @@ int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, |
4021 | if (validate) |
4022 | skb = validate_xmit_skb_list(skb, dev); |
4023 | |
4024 | - if (skb) { |
4025 | + if (likely(skb)) { |
4026 | HARD_TX_LOCK(dev, txq, smp_processor_id()); |
4027 | if (!netif_xmit_frozen_or_stopped(txq)) |
4028 | skb = dev_hard_start_xmit(skb, dev, txq, &ret); |
4029 | |
4030 | HARD_TX_UNLOCK(dev, txq); |
4031 | + } else { |
4032 | + spin_lock(root_lock); |
4033 | + return qdisc_qlen(q); |
4034 | } |
4035 | spin_lock(root_lock); |
4036 | |
4037 | diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c |
4038 | index b7ebe2c87586..d783d7cc3348 100644 |
4039 | --- a/net/sched/sch_hfsc.c |
4040 | +++ b/net/sched/sch_hfsc.c |
4041 | @@ -895,9 +895,10 @@ static void |
4042 | hfsc_purge_queue(struct Qdisc *sch, struct hfsc_class *cl) |
4043 | { |
4044 | unsigned int len = cl->qdisc->q.qlen; |
4045 | + unsigned int backlog = cl->qdisc->qstats.backlog; |
4046 | |
4047 | qdisc_reset(cl->qdisc); |
4048 | - qdisc_tree_decrease_qlen(cl->qdisc, len); |
4049 | + qdisc_tree_reduce_backlog(cl->qdisc, len, backlog); |
4050 | } |
4051 | |
4052 | static void |
4053 | @@ -1215,11 +1216,7 @@ hfsc_graft_class(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, |
4054 | new = &noop_qdisc; |
4055 | } |
4056 | |
4057 | - sch_tree_lock(sch); |
4058 | - hfsc_purge_queue(sch, cl); |
4059 | - *old = cl->qdisc; |
4060 | - cl->qdisc = new; |
4061 | - sch_tree_unlock(sch); |
4062 | + *old = qdisc_replace(sch, new, &cl->qdisc); |
4063 | return 0; |
4064 | } |
4065 | |
4066 | diff --git a/net/sched/sch_hhf.c b/net/sched/sch_hhf.c |
4067 | index 86b04e31e60b..13d6f83ec491 100644 |
4068 | --- a/net/sched/sch_hhf.c |
4069 | +++ b/net/sched/sch_hhf.c |
4070 | @@ -382,6 +382,7 @@ static int hhf_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
4071 | struct hhf_sched_data *q = qdisc_priv(sch); |
4072 | enum wdrr_bucket_idx idx; |
4073 | struct wdrr_bucket *bucket; |
4074 | + unsigned int prev_backlog; |
4075 | |
4076 | idx = hhf_classify(skb, sch); |
4077 | |
4078 | @@ -409,6 +410,7 @@ static int hhf_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
4079 | if (++sch->q.qlen <= sch->limit) |
4080 | return NET_XMIT_SUCCESS; |
4081 | |
4082 | + prev_backlog = sch->qstats.backlog; |
4083 | q->drop_overlimit++; |
4084 | /* Return Congestion Notification only if we dropped a packet from this |
4085 | * bucket. |
4086 | @@ -417,7 +419,7 @@ static int hhf_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
4087 | return NET_XMIT_CN; |
4088 | |
4089 | /* As we dropped a packet, better let upper stack know this. */ |
4090 | - qdisc_tree_decrease_qlen(sch, 1); |
4091 | + qdisc_tree_reduce_backlog(sch, 1, prev_backlog - sch->qstats.backlog); |
4092 | return NET_XMIT_SUCCESS; |
4093 | } |
4094 | |
4095 | @@ -527,7 +529,7 @@ static int hhf_change(struct Qdisc *sch, struct nlattr *opt) |
4096 | { |
4097 | struct hhf_sched_data *q = qdisc_priv(sch); |
4098 | struct nlattr *tb[TCA_HHF_MAX + 1]; |
4099 | - unsigned int qlen; |
4100 | + unsigned int qlen, prev_backlog; |
4101 | int err; |
4102 | u64 non_hh_quantum; |
4103 | u32 new_quantum = q->quantum; |
4104 | @@ -577,12 +579,14 @@ static int hhf_change(struct Qdisc *sch, struct nlattr *opt) |
4105 | } |
4106 | |
4107 | qlen = sch->q.qlen; |
4108 | + prev_backlog = sch->qstats.backlog; |
4109 | while (sch->q.qlen > sch->limit) { |
4110 | struct sk_buff *skb = hhf_dequeue(sch); |
4111 | |
4112 | kfree_skb(skb); |
4113 | } |
4114 | - qdisc_tree_decrease_qlen(sch, qlen - sch->q.qlen); |
4115 | + qdisc_tree_reduce_backlog(sch, qlen - sch->q.qlen, |
4116 | + prev_backlog - sch->qstats.backlog); |
4117 | |
4118 | sch_tree_unlock(sch); |
4119 | return 0; |
4120 | diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c |
4121 | index 15ccd7f8fb2a..87b02ed3d5f2 100644 |
4122 | --- a/net/sched/sch_htb.c |
4123 | +++ b/net/sched/sch_htb.c |
4124 | @@ -600,6 +600,7 @@ static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
4125 | htb_activate(q, cl); |
4126 | } |
4127 | |
4128 | + qdisc_qstats_backlog_inc(sch, skb); |
4129 | sch->q.qlen++; |
4130 | return NET_XMIT_SUCCESS; |
4131 | } |
4132 | @@ -889,6 +890,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch) |
4133 | ok: |
4134 | qdisc_bstats_update(sch, skb); |
4135 | qdisc_unthrottled(sch); |
4136 | + qdisc_qstats_backlog_dec(sch, skb); |
4137 | sch->q.qlen--; |
4138 | return skb; |
4139 | } |
4140 | @@ -955,6 +957,7 @@ static unsigned int htb_drop(struct Qdisc *sch) |
4141 | unsigned int len; |
4142 | if (cl->un.leaf.q->ops->drop && |
4143 | (len = cl->un.leaf.q->ops->drop(cl->un.leaf.q))) { |
4144 | + sch->qstats.backlog -= len; |
4145 | sch->q.qlen--; |
4146 | if (!cl->un.leaf.q->q.qlen) |
4147 | htb_deactivate(q, cl); |
4148 | @@ -984,12 +987,12 @@ static void htb_reset(struct Qdisc *sch) |
4149 | } |
4150 | cl->prio_activity = 0; |
4151 | cl->cmode = HTB_CAN_SEND; |
4152 | - |
4153 | } |
4154 | } |
4155 | qdisc_watchdog_cancel(&q->watchdog); |
4156 | __skb_queue_purge(&q->direct_queue); |
4157 | sch->q.qlen = 0; |
4158 | + sch->qstats.backlog = 0; |
4159 | memset(q->hlevel, 0, sizeof(q->hlevel)); |
4160 | memset(q->row_mask, 0, sizeof(q->row_mask)); |
4161 | for (i = 0; i < TC_HTB_NUMPRIO; i++) |
4162 | @@ -1163,14 +1166,7 @@ static int htb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, |
4163 | cl->common.classid)) == NULL) |
4164 | return -ENOBUFS; |
4165 | |
4166 | - sch_tree_lock(sch); |
4167 | - *old = cl->un.leaf.q; |
4168 | - cl->un.leaf.q = new; |
4169 | - if (*old != NULL) { |
4170 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); |
4171 | - qdisc_reset(*old); |
4172 | - } |
4173 | - sch_tree_unlock(sch); |
4174 | + *old = qdisc_replace(sch, new, &cl->un.leaf.q); |
4175 | return 0; |
4176 | } |
4177 | |
4178 | @@ -1272,7 +1268,6 @@ static int htb_delete(struct Qdisc *sch, unsigned long arg) |
4179 | { |
4180 | struct htb_sched *q = qdisc_priv(sch); |
4181 | struct htb_class *cl = (struct htb_class *)arg; |
4182 | - unsigned int qlen; |
4183 | struct Qdisc *new_q = NULL; |
4184 | int last_child = 0; |
4185 | |
4186 | @@ -1292,9 +1287,11 @@ static int htb_delete(struct Qdisc *sch, unsigned long arg) |
4187 | sch_tree_lock(sch); |
4188 | |
4189 | if (!cl->level) { |
4190 | - qlen = cl->un.leaf.q->q.qlen; |
4191 | + unsigned int qlen = cl->un.leaf.q->q.qlen; |
4192 | + unsigned int backlog = cl->un.leaf.q->qstats.backlog; |
4193 | + |
4194 | qdisc_reset(cl->un.leaf.q); |
4195 | - qdisc_tree_decrease_qlen(cl->un.leaf.q, qlen); |
4196 | + qdisc_tree_reduce_backlog(cl->un.leaf.q, qlen, backlog); |
4197 | } |
4198 | |
4199 | /* delete from hash and active; remainder in destroy_class */ |
4200 | @@ -1428,10 +1425,11 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, |
4201 | sch_tree_lock(sch); |
4202 | if (parent && !parent->level) { |
4203 | unsigned int qlen = parent->un.leaf.q->q.qlen; |
4204 | + unsigned int backlog = parent->un.leaf.q->qstats.backlog; |
4205 | |
4206 | /* turn parent into inner node */ |
4207 | qdisc_reset(parent->un.leaf.q); |
4208 | - qdisc_tree_decrease_qlen(parent->un.leaf.q, qlen); |
4209 | + qdisc_tree_reduce_backlog(parent->un.leaf.q, qlen, backlog); |
4210 | qdisc_destroy(parent->un.leaf.q); |
4211 | if (parent->prio_activity) |
4212 | htb_deactivate(q, parent); |
4213 | diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c |
4214 | index 4e904ca0af9d..bcdd54bb101c 100644 |
4215 | --- a/net/sched/sch_multiq.c |
4216 | +++ b/net/sched/sch_multiq.c |
4217 | @@ -218,7 +218,8 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt) |
4218 | if (q->queues[i] != &noop_qdisc) { |
4219 | struct Qdisc *child = q->queues[i]; |
4220 | q->queues[i] = &noop_qdisc; |
4221 | - qdisc_tree_decrease_qlen(child, child->q.qlen); |
4222 | + qdisc_tree_reduce_backlog(child, child->q.qlen, |
4223 | + child->qstats.backlog); |
4224 | qdisc_destroy(child); |
4225 | } |
4226 | } |
4227 | @@ -238,8 +239,9 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt) |
4228 | q->queues[i] = child; |
4229 | |
4230 | if (old != &noop_qdisc) { |
4231 | - qdisc_tree_decrease_qlen(old, |
4232 | - old->q.qlen); |
4233 | + qdisc_tree_reduce_backlog(old, |
4234 | + old->q.qlen, |
4235 | + old->qstats.backlog); |
4236 | qdisc_destroy(old); |
4237 | } |
4238 | sch_tree_unlock(sch); |
4239 | @@ -303,13 +305,7 @@ static int multiq_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, |
4240 | if (new == NULL) |
4241 | new = &noop_qdisc; |
4242 | |
4243 | - sch_tree_lock(sch); |
4244 | - *old = q->queues[band]; |
4245 | - q->queues[band] = new; |
4246 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); |
4247 | - qdisc_reset(*old); |
4248 | - sch_tree_unlock(sch); |
4249 | - |
4250 | + *old = qdisc_replace(sch, new, &q->queues[band]); |
4251 | return 0; |
4252 | } |
4253 | |
4254 | diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c |
4255 | index 5abd1d9de989..4befe97a9034 100644 |
4256 | --- a/net/sched/sch_netem.c |
4257 | +++ b/net/sched/sch_netem.c |
4258 | @@ -395,6 +395,25 @@ static void tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch) |
4259 | sch->q.qlen++; |
4260 | } |
4261 | |
4262 | +/* netem can't properly corrupt a megapacket (like we get from GSO), so instead |
4263 | + * when we statistically choose to corrupt one, we instead segment it, returning |
4264 | + * the first packet to be corrupted, and re-enqueue the remaining frames |
4265 | + */ |
4266 | +static struct sk_buff *netem_segment(struct sk_buff *skb, struct Qdisc *sch) |
4267 | +{ |
4268 | + struct sk_buff *segs; |
4269 | + netdev_features_t features = netif_skb_features(skb); |
4270 | + |
4271 | + segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); |
4272 | + |
4273 | + if (IS_ERR_OR_NULL(segs)) { |
4274 | + qdisc_reshape_fail(skb, sch); |
4275 | + return NULL; |
4276 | + } |
4277 | + consume_skb(skb); |
4278 | + return segs; |
4279 | +} |
4280 | + |
4281 | /* |
4282 | * Insert one skb into qdisc. |
4283 | * Note: parent depends on return value to account for queue length. |
4284 | @@ -407,7 +426,11 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
4285 | /* We don't fill cb now as skb_unshare() may invalidate it */ |
4286 | struct netem_skb_cb *cb; |
4287 | struct sk_buff *skb2; |
4288 | + struct sk_buff *segs = NULL; |
4289 | + unsigned int len = 0, last_len, prev_len = qdisc_pkt_len(skb); |
4290 | + int nb = 0; |
4291 | int count = 1; |
4292 | + int rc = NET_XMIT_SUCCESS; |
4293 | |
4294 | /* Random duplication */ |
4295 | if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor)) |
4296 | @@ -453,10 +476,23 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
4297 | * do it now in software before we mangle it. |
4298 | */ |
4299 | if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { |
4300 | + if (skb_is_gso(skb)) { |
4301 | + segs = netem_segment(skb, sch); |
4302 | + if (!segs) |
4303 | + return NET_XMIT_DROP; |
4304 | + } else { |
4305 | + segs = skb; |
4306 | + } |
4307 | + |
4308 | + skb = segs; |
4309 | + segs = segs->next; |
4310 | + |
4311 | if (!(skb = skb_unshare(skb, GFP_ATOMIC)) || |
4312 | (skb->ip_summed == CHECKSUM_PARTIAL && |
4313 | - skb_checksum_help(skb))) |
4314 | - return qdisc_drop(skb, sch); |
4315 | + skb_checksum_help(skb))) { |
4316 | + rc = qdisc_drop(skb, sch); |
4317 | + goto finish_segs; |
4318 | + } |
4319 | |
4320 | skb->data[prandom_u32() % skb_headlen(skb)] ^= |
4321 | 1<<(prandom_u32() % 8); |
4322 | @@ -516,6 +552,27 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
4323 | sch->qstats.requeues++; |
4324 | } |
4325 | |
4326 | +finish_segs: |
4327 | + if (segs) { |
4328 | + while (segs) { |
4329 | + skb2 = segs->next; |
4330 | + segs->next = NULL; |
4331 | + qdisc_skb_cb(segs)->pkt_len = segs->len; |
4332 | + last_len = segs->len; |
4333 | + rc = qdisc_enqueue(segs, sch); |
4334 | + if (rc != NET_XMIT_SUCCESS) { |
4335 | + if (net_xmit_drop_count(rc)) |
4336 | + qdisc_qstats_drop(sch); |
4337 | + } else { |
4338 | + nb++; |
4339 | + len += last_len; |
4340 | + } |
4341 | + segs = skb2; |
4342 | + } |
4343 | + sch->q.qlen += nb; |
4344 | + if (nb > 1) |
4345 | + qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len); |
4346 | + } |
4347 | return NET_XMIT_SUCCESS; |
4348 | } |
4349 | |
4350 | @@ -598,7 +655,8 @@ deliver: |
4351 | if (unlikely(err != NET_XMIT_SUCCESS)) { |
4352 | if (net_xmit_drop_count(err)) { |
4353 | qdisc_qstats_drop(sch); |
4354 | - qdisc_tree_decrease_qlen(sch, 1); |
4355 | + qdisc_tree_reduce_backlog(sch, 1, |
4356 | + qdisc_pkt_len(skb)); |
4357 | } |
4358 | } |
4359 | goto tfifo_dequeue; |
4360 | @@ -1037,15 +1095,7 @@ static int netem_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, |
4361 | { |
4362 | struct netem_sched_data *q = qdisc_priv(sch); |
4363 | |
4364 | - sch_tree_lock(sch); |
4365 | - *old = q->qdisc; |
4366 | - q->qdisc = new; |
4367 | - if (*old) { |
4368 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); |
4369 | - qdisc_reset(*old); |
4370 | - } |
4371 | - sch_tree_unlock(sch); |
4372 | - |
4373 | + *old = qdisc_replace(sch, new, &q->qdisc); |
4374 | return 0; |
4375 | } |
4376 | |
4377 | diff --git a/net/sched/sch_pie.c b/net/sched/sch_pie.c |
4378 | index b783a446d884..71ae3b9629f9 100644 |
4379 | --- a/net/sched/sch_pie.c |
4380 | +++ b/net/sched/sch_pie.c |
4381 | @@ -183,7 +183,7 @@ static int pie_change(struct Qdisc *sch, struct nlattr *opt) |
4382 | { |
4383 | struct pie_sched_data *q = qdisc_priv(sch); |
4384 | struct nlattr *tb[TCA_PIE_MAX + 1]; |
4385 | - unsigned int qlen; |
4386 | + unsigned int qlen, dropped = 0; |
4387 | int err; |
4388 | |
4389 | if (!opt) |
4390 | @@ -232,10 +232,11 @@ static int pie_change(struct Qdisc *sch, struct nlattr *opt) |
4391 | while (sch->q.qlen > sch->limit) { |
4392 | struct sk_buff *skb = __skb_dequeue(&sch->q); |
4393 | |
4394 | + dropped += qdisc_pkt_len(skb); |
4395 | qdisc_qstats_backlog_dec(sch, skb); |
4396 | qdisc_drop(skb, sch); |
4397 | } |
4398 | - qdisc_tree_decrease_qlen(sch, qlen - sch->q.qlen); |
4399 | + qdisc_tree_reduce_backlog(sch, qlen - sch->q.qlen, dropped); |
4400 | |
4401 | sch_tree_unlock(sch); |
4402 | return 0; |
4403 | diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c |
4404 | index ba6487f2741f..fee1b15506b2 100644 |
4405 | --- a/net/sched/sch_prio.c |
4406 | +++ b/net/sched/sch_prio.c |
4407 | @@ -191,7 +191,7 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt) |
4408 | struct Qdisc *child = q->queues[i]; |
4409 | q->queues[i] = &noop_qdisc; |
4410 | if (child != &noop_qdisc) { |
4411 | - qdisc_tree_decrease_qlen(child, child->q.qlen); |
4412 | + qdisc_tree_reduce_backlog(child, child->q.qlen, child->qstats.backlog); |
4413 | qdisc_destroy(child); |
4414 | } |
4415 | } |
4416 | @@ -210,8 +210,9 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt) |
4417 | q->queues[i] = child; |
4418 | |
4419 | if (old != &noop_qdisc) { |
4420 | - qdisc_tree_decrease_qlen(old, |
4421 | - old->q.qlen); |
4422 | + qdisc_tree_reduce_backlog(old, |
4423 | + old->q.qlen, |
4424 | + old->qstats.backlog); |
4425 | qdisc_destroy(old); |
4426 | } |
4427 | sch_tree_unlock(sch); |
4428 | @@ -268,13 +269,7 @@ static int prio_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, |
4429 | if (new == NULL) |
4430 | new = &noop_qdisc; |
4431 | |
4432 | - sch_tree_lock(sch); |
4433 | - *old = q->queues[band]; |
4434 | - q->queues[band] = new; |
4435 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); |
4436 | - qdisc_reset(*old); |
4437 | - sch_tree_unlock(sch); |
4438 | - |
4439 | + *old = qdisc_replace(sch, new, &q->queues[band]); |
4440 | return 0; |
4441 | } |
4442 | |
4443 | diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c |
4444 | index 3dc3a6e56052..8d2d8d953432 100644 |
4445 | --- a/net/sched/sch_qfq.c |
4446 | +++ b/net/sched/sch_qfq.c |
4447 | @@ -220,9 +220,10 @@ static struct qfq_class *qfq_find_class(struct Qdisc *sch, u32 classid) |
4448 | static void qfq_purge_queue(struct qfq_class *cl) |
4449 | { |
4450 | unsigned int len = cl->qdisc->q.qlen; |
4451 | + unsigned int backlog = cl->qdisc->qstats.backlog; |
4452 | |
4453 | qdisc_reset(cl->qdisc); |
4454 | - qdisc_tree_decrease_qlen(cl->qdisc, len); |
4455 | + qdisc_tree_reduce_backlog(cl->qdisc, len, backlog); |
4456 | } |
4457 | |
4458 | static const struct nla_policy qfq_policy[TCA_QFQ_MAX + 1] = { |
4459 | @@ -617,11 +618,7 @@ static int qfq_graft_class(struct Qdisc *sch, unsigned long arg, |
4460 | new = &noop_qdisc; |
4461 | } |
4462 | |
4463 | - sch_tree_lock(sch); |
4464 | - qfq_purge_queue(cl); |
4465 | - *old = cl->qdisc; |
4466 | - cl->qdisc = new; |
4467 | - sch_tree_unlock(sch); |
4468 | + *old = qdisc_replace(sch, new, &cl->qdisc); |
4469 | return 0; |
4470 | } |
4471 | |
4472 | diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c |
4473 | index 6c0534cc7758..8c0508c0e287 100644 |
4474 | --- a/net/sched/sch_red.c |
4475 | +++ b/net/sched/sch_red.c |
4476 | @@ -210,7 +210,8 @@ static int red_change(struct Qdisc *sch, struct nlattr *opt) |
4477 | q->flags = ctl->flags; |
4478 | q->limit = ctl->limit; |
4479 | if (child) { |
4480 | - qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen); |
4481 | + qdisc_tree_reduce_backlog(q->qdisc, q->qdisc->q.qlen, |
4482 | + q->qdisc->qstats.backlog); |
4483 | qdisc_destroy(q->qdisc); |
4484 | q->qdisc = child; |
4485 | } |
4486 | @@ -313,12 +314,7 @@ static int red_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, |
4487 | if (new == NULL) |
4488 | new = &noop_qdisc; |
4489 | |
4490 | - sch_tree_lock(sch); |
4491 | - *old = q->qdisc; |
4492 | - q->qdisc = new; |
4493 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); |
4494 | - qdisc_reset(*old); |
4495 | - sch_tree_unlock(sch); |
4496 | + *old = qdisc_replace(sch, new, &q->qdisc); |
4497 | return 0; |
4498 | } |
4499 | |
4500 | diff --git a/net/sched/sch_sfb.c b/net/sched/sch_sfb.c |
4501 | index 5bbb6332ec57..c69611640fa5 100644 |
4502 | --- a/net/sched/sch_sfb.c |
4503 | +++ b/net/sched/sch_sfb.c |
4504 | @@ -510,7 +510,8 @@ static int sfb_change(struct Qdisc *sch, struct nlattr *opt) |
4505 | |
4506 | sch_tree_lock(sch); |
4507 | |
4508 | - qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen); |
4509 | + qdisc_tree_reduce_backlog(q->qdisc, q->qdisc->q.qlen, |
4510 | + q->qdisc->qstats.backlog); |
4511 | qdisc_destroy(q->qdisc); |
4512 | q->qdisc = child; |
4513 | |
4514 | @@ -606,12 +607,7 @@ static int sfb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, |
4515 | if (new == NULL) |
4516 | new = &noop_qdisc; |
4517 | |
4518 | - sch_tree_lock(sch); |
4519 | - *old = q->qdisc; |
4520 | - q->qdisc = new; |
4521 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); |
4522 | - qdisc_reset(*old); |
4523 | - sch_tree_unlock(sch); |
4524 | + *old = qdisc_replace(sch, new, &q->qdisc); |
4525 | return 0; |
4526 | } |
4527 | |
4528 | diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c |
4529 | index 3abab534eb5c..498f0a2cb47f 100644 |
4530 | --- a/net/sched/sch_sfq.c |
4531 | +++ b/net/sched/sch_sfq.c |
4532 | @@ -346,7 +346,7 @@ static int |
4533 | sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
4534 | { |
4535 | struct sfq_sched_data *q = qdisc_priv(sch); |
4536 | - unsigned int hash; |
4537 | + unsigned int hash, dropped; |
4538 | sfq_index x, qlen; |
4539 | struct sfq_slot *slot; |
4540 | int uninitialized_var(ret); |
4541 | @@ -461,7 +461,7 @@ enqueue: |
4542 | return NET_XMIT_SUCCESS; |
4543 | |
4544 | qlen = slot->qlen; |
4545 | - sfq_drop(sch); |
4546 | + dropped = sfq_drop(sch); |
4547 | /* Return Congestion Notification only if we dropped a packet |
4548 | * from this flow. |
4549 | */ |
4550 | @@ -469,7 +469,7 @@ enqueue: |
4551 | return NET_XMIT_CN; |
4552 | |
4553 | /* As we dropped a packet, better let upper stack know this */ |
4554 | - qdisc_tree_decrease_qlen(sch, 1); |
4555 | + qdisc_tree_reduce_backlog(sch, 1, dropped); |
4556 | return NET_XMIT_SUCCESS; |
4557 | } |
4558 | |
4559 | @@ -537,6 +537,7 @@ static void sfq_rehash(struct Qdisc *sch) |
4560 | struct sfq_slot *slot; |
4561 | struct sk_buff_head list; |
4562 | int dropped = 0; |
4563 | + unsigned int drop_len = 0; |
4564 | |
4565 | __skb_queue_head_init(&list); |
4566 | |
4567 | @@ -565,6 +566,7 @@ static void sfq_rehash(struct Qdisc *sch) |
4568 | if (x >= SFQ_MAX_FLOWS) { |
4569 | drop: |
4570 | qdisc_qstats_backlog_dec(sch, skb); |
4571 | + drop_len += qdisc_pkt_len(skb); |
4572 | kfree_skb(skb); |
4573 | dropped++; |
4574 | continue; |
4575 | @@ -594,7 +596,7 @@ drop: |
4576 | } |
4577 | } |
4578 | sch->q.qlen -= dropped; |
4579 | - qdisc_tree_decrease_qlen(sch, dropped); |
4580 | + qdisc_tree_reduce_backlog(sch, dropped, drop_len); |
4581 | } |
4582 | |
4583 | static void sfq_perturbation(unsigned long arg) |
4584 | @@ -618,7 +620,7 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt) |
4585 | struct sfq_sched_data *q = qdisc_priv(sch); |
4586 | struct tc_sfq_qopt *ctl = nla_data(opt); |
4587 | struct tc_sfq_qopt_v1 *ctl_v1 = NULL; |
4588 | - unsigned int qlen; |
4589 | + unsigned int qlen, dropped = 0; |
4590 | struct red_parms *p = NULL; |
4591 | |
4592 | if (opt->nla_len < nla_attr_size(sizeof(*ctl))) |
4593 | @@ -667,8 +669,8 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt) |
4594 | |
4595 | qlen = sch->q.qlen; |
4596 | while (sch->q.qlen > q->limit) |
4597 | - sfq_drop(sch); |
4598 | - qdisc_tree_decrease_qlen(sch, qlen - sch->q.qlen); |
4599 | + dropped += sfq_drop(sch); |
4600 | + qdisc_tree_reduce_backlog(sch, qlen - sch->q.qlen, dropped); |
4601 | |
4602 | del_timer(&q->perturb_timer); |
4603 | if (q->perturb_period) { |
4604 | diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c |
4605 | index a4afde14e865..c2fbde742f37 100644 |
4606 | --- a/net/sched/sch_tbf.c |
4607 | +++ b/net/sched/sch_tbf.c |
4608 | @@ -160,6 +160,7 @@ static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch) |
4609 | struct tbf_sched_data *q = qdisc_priv(sch); |
4610 | struct sk_buff *segs, *nskb; |
4611 | netdev_features_t features = netif_skb_features(skb); |
4612 | + unsigned int len = 0, prev_len = qdisc_pkt_len(skb); |
4613 | int ret, nb; |
4614 | |
4615 | segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); |
4616 | @@ -172,6 +173,7 @@ static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch) |
4617 | nskb = segs->next; |
4618 | segs->next = NULL; |
4619 | qdisc_skb_cb(segs)->pkt_len = segs->len; |
4620 | + len += segs->len; |
4621 | ret = qdisc_enqueue(segs, q->qdisc); |
4622 | if (ret != NET_XMIT_SUCCESS) { |
4623 | if (net_xmit_drop_count(ret)) |
4624 | @@ -183,7 +185,7 @@ static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch) |
4625 | } |
4626 | sch->q.qlen += nb; |
4627 | if (nb > 1) |
4628 | - qdisc_tree_decrease_qlen(sch, 1 - nb); |
4629 | + qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len); |
4630 | consume_skb(skb); |
4631 | return nb > 0 ? NET_XMIT_SUCCESS : NET_XMIT_DROP; |
4632 | } |
4633 | @@ -399,7 +401,8 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt) |
4634 | |
4635 | sch_tree_lock(sch); |
4636 | if (child) { |
4637 | - qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen); |
4638 | + qdisc_tree_reduce_backlog(q->qdisc, q->qdisc->q.qlen, |
4639 | + q->qdisc->qstats.backlog); |
4640 | qdisc_destroy(q->qdisc); |
4641 | q->qdisc = child; |
4642 | } |
4643 | @@ -502,13 +505,7 @@ static int tbf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, |
4644 | if (new == NULL) |
4645 | new = &noop_qdisc; |
4646 | |
4647 | - sch_tree_lock(sch); |
4648 | - *old = q->qdisc; |
4649 | - q->qdisc = new; |
4650 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); |
4651 | - qdisc_reset(*old); |
4652 | - sch_tree_unlock(sch); |
4653 | - |
4654 | + *old = qdisc_replace(sch, new, &q->qdisc); |
4655 | return 0; |
4656 | } |
4657 | |
4658 | diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c |
4659 | index bbe65dcb9738..c93e67beaea7 100644 |
4660 | --- a/net/vmw_vsock/af_vsock.c |
4661 | +++ b/net/vmw_vsock/af_vsock.c |
4662 | @@ -1789,27 +1789,8 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, |
4663 | else if (sk->sk_shutdown & RCV_SHUTDOWN) |
4664 | err = 0; |
4665 | |
4666 | - if (copied > 0) { |
4667 | - /* We only do these additional bookkeeping/notification steps |
4668 | - * if we actually copied something out of the queue pair |
4669 | - * instead of just peeking ahead. |
4670 | - */ |
4671 | - |
4672 | - if (!(flags & MSG_PEEK)) { |
4673 | - /* If the other side has shutdown for sending and there |
4674 | - * is nothing more to read, then modify the socket |
4675 | - * state. |
4676 | - */ |
4677 | - if (vsk->peer_shutdown & SEND_SHUTDOWN) { |
4678 | - if (vsock_stream_has_data(vsk) <= 0) { |
4679 | - sk->sk_state = SS_UNCONNECTED; |
4680 | - sock_set_flag(sk, SOCK_DONE); |
4681 | - sk->sk_state_change(sk); |
4682 | - } |
4683 | - } |
4684 | - } |
4685 | + if (copied > 0) |
4686 | err = copied; |
4687 | - } |
4688 | |
4689 | out: |
4690 | release_sock(sk); |
4691 | diff --git a/net/x25/x25_facilities.c b/net/x25/x25_facilities.c |
4692 | index 7ecd04c21360..997ff7b2509b 100644 |
4693 | --- a/net/x25/x25_facilities.c |
4694 | +++ b/net/x25/x25_facilities.c |
4695 | @@ -277,6 +277,7 @@ int x25_negotiate_facilities(struct sk_buff *skb, struct sock *sk, |
4696 | |
4697 | memset(&theirs, 0, sizeof(theirs)); |
4698 | memcpy(new, ours, sizeof(*new)); |
4699 | + memset(dte, 0, sizeof(*dte)); |
4700 | |
4701 | len = x25_parse_facilities(skb, &theirs, dte, &x25->vc_facil_mask); |
4702 | if (len < 0) |
4703 | diff --git a/samples/bpf/trace_output_kern.c b/samples/bpf/trace_output_kern.c |
4704 | index 8d8d1ec429eb..9b96f4fb8cea 100644 |
4705 | --- a/samples/bpf/trace_output_kern.c |
4706 | +++ b/samples/bpf/trace_output_kern.c |
4707 | @@ -18,7 +18,6 @@ int bpf_prog1(struct pt_regs *ctx) |
4708 | u64 cookie; |
4709 | } data; |
4710 | |
4711 | - memset(&data, 0, sizeof(data)); |
4712 | data.pid = bpf_get_current_pid_tgid(); |
4713 | data.cookie = 0x12345678; |
4714 | |
4715 | diff --git a/sound/pci/hda/hda_sysfs.c b/sound/pci/hda/hda_sysfs.c |
4716 | index 64e0d1d81ca5..9739fce9e032 100644 |
4717 | --- a/sound/pci/hda/hda_sysfs.c |
4718 | +++ b/sound/pci/hda/hda_sysfs.c |
4719 | @@ -141,14 +141,6 @@ static int reconfig_codec(struct hda_codec *codec) |
4720 | err = snd_hda_codec_configure(codec); |
4721 | if (err < 0) |
4722 | goto error; |
4723 | - /* rebuild PCMs */ |
4724 | - err = snd_hda_codec_build_pcms(codec); |
4725 | - if (err < 0) |
4726 | - goto error; |
4727 | - /* rebuild mixers */ |
4728 | - err = snd_hda_codec_build_controls(codec); |
4729 | - if (err < 0) |
4730 | - goto error; |
4731 | err = snd_card_register(codec->card); |
4732 | error: |
4733 | snd_hda_power_down(codec); |
4734 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
4735 | index ac4490a96863..4918ffa5ba68 100644 |
4736 | --- a/sound/pci/hda/patch_realtek.c |
4737 | +++ b/sound/pci/hda/patch_realtek.c |
4738 | @@ -6426,6 +6426,7 @@ enum { |
4739 | ALC668_FIXUP_DELL_DISABLE_AAMIX, |
4740 | ALC668_FIXUP_DELL_XPS13, |
4741 | ALC662_FIXUP_ASUS_Nx50, |
4742 | + ALC668_FIXUP_ASUS_Nx51, |
4743 | }; |
4744 | |
4745 | static const struct hda_fixup alc662_fixups[] = { |
4746 | @@ -6672,6 +6673,15 @@ static const struct hda_fixup alc662_fixups[] = { |
4747 | .chained = true, |
4748 | .chain_id = ALC662_FIXUP_BASS_1A |
4749 | }, |
4750 | + [ALC668_FIXUP_ASUS_Nx51] = { |
4751 | + .type = HDA_FIXUP_PINS, |
4752 | + .v.pins = (const struct hda_pintbl[]) { |
4753 | + {0x1a, 0x90170151}, /* bass speaker */ |
4754 | + {} |
4755 | + }, |
4756 | + .chained = true, |
4757 | + .chain_id = ALC662_FIXUP_BASS_CHMAP, |
4758 | + }, |
4759 | }; |
4760 | |
4761 | static const struct snd_pci_quirk alc662_fixup_tbl[] = { |
4762 | @@ -6694,11 +6704,14 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { |
4763 | SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
4764 | SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
4765 | SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), |
4766 | + SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE), |
4767 | SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50), |
4768 | SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A), |
4769 | SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50), |
4770 | SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP), |
4771 | SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16), |
4772 | + SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51), |
4773 | + SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51), |
4774 | SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16), |
4775 | SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP), |
4776 | SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT), |
4777 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c |
4778 | index 001fb4dc0722..db11ecf0b74d 100644 |
4779 | --- a/sound/usb/quirks.c |
4780 | +++ b/sound/usb/quirks.c |
4781 | @@ -1138,8 +1138,11 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) |
4782 | case USB_ID(0x047F, 0x0415): /* Plantronics BT-300 */ |
4783 | case USB_ID(0x047F, 0xAA05): /* Plantronics DA45 */ |
4784 | case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */ |
4785 | + case USB_ID(0x0556, 0x0014): /* Phoenix Audio TMX320VC */ |
4786 | case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */ |
4787 | + case USB_ID(0x1de7, 0x0013): /* Phoenix Audio MT202exe */ |
4788 | case USB_ID(0x1de7, 0x0014): /* Phoenix Audio TMX320 */ |
4789 | + case USB_ID(0x1de7, 0x0114): /* Phoenix Audio MT202pcs */ |
4790 | case USB_ID(0x21B4, 0x0081): /* AudioQuest DragonFly */ |
4791 | return true; |
4792 | } |
4793 | diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c |
4794 | index 0144b3d1bb77..88cccea3ca99 100644 |
4795 | --- a/tools/lib/traceevent/parse-filter.c |
4796 | +++ b/tools/lib/traceevent/parse-filter.c |
4797 | @@ -1164,11 +1164,11 @@ process_filter(struct event_format *event, struct filter_arg **parg, |
4798 | current_op = current_exp; |
4799 | |
4800 | ret = collapse_tree(current_op, parg, error_str); |
4801 | + /* collapse_tree() may free current_op, and updates parg accordingly */ |
4802 | + current_op = NULL; |
4803 | if (ret < 0) |
4804 | goto fail; |
4805 | |
4806 | - *parg = current_op; |
4807 | - |
4808 | free(token); |
4809 | return 0; |
4810 | |
4811 | diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c |
4812 | index ec722346e6ff..16892a7ca27e 100644 |
4813 | --- a/tools/perf/util/sort.c |
4814 | +++ b/tools/perf/util/sort.c |
4815 | @@ -2272,6 +2272,9 @@ static char *prefix_if_not_in(const char *pre, char *str) |
4816 | |
4817 | static char *setup_overhead(char *keys) |
4818 | { |
4819 | + if (sort__mode == SORT_MODE__DIFF) |
4820 | + return keys; |
4821 | + |
4822 | keys = prefix_if_not_in("overhead", keys); |
4823 | |
4824 | if (symbol_conf.cumulate_callchain) |