Annotation of /trunk/kernel-alx/patches-3.18/0124-3.18.25-all-fixes.patch
Parent Directory | Revision Log
Revision 2742 -
(hide annotations)
(download)
Wed Dec 16 09:44:19 2015 UTC (8 years, 9 months ago) by niro
File size: 146967 byte(s)
Wed Dec 16 09:44:19 2015 UTC (8 years, 9 months ago) by niro
File size: 146967 byte(s)
-linux-3.18.25
1 | niro | 2742 | diff --git a/Makefile b/Makefile |
2 | index 9769e3bce6a2..6df25277ea44 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 3 | ||
7 | PATCHLEVEL = 18 | ||
8 | -SUBLEVEL = 24 | ||
9 | +SUBLEVEL = 25 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Diseased Newt | ||
12 | |||
13 | diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c | ||
14 | index f5b00f41c4f6..b8b6e22f9987 100644 | ||
15 | --- a/arch/arm/plat-orion/common.c | ||
16 | +++ b/arch/arm/plat-orion/common.c | ||
17 | @@ -499,7 +499,7 @@ void __init orion_ge00_switch_init(struct dsa_platform_data *d, int irq) | ||
18 | |||
19 | d->netdev = &orion_ge00.dev; | ||
20 | for (i = 0; i < d->nr_chips; i++) | ||
21 | - d->chip[i].host_dev = &orion_ge00_shared.dev; | ||
22 | + d->chip[i].host_dev = &orion_ge_mvmdio.dev; | ||
23 | orion_switch_device.dev.platform_data = d; | ||
24 | |||
25 | platform_device_register(&orion_switch_device); | ||
26 | diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile | ||
27 | index e7391aef5433..2d54c55400ed 100644 | ||
28 | --- a/arch/arm64/Makefile | ||
29 | +++ b/arch/arm64/Makefile | ||
30 | @@ -33,7 +33,7 @@ endif | ||
31 | CHECKFLAGS += -D__aarch64__ | ||
32 | |||
33 | ifeq ($(CONFIG_ARM64_ERRATUM_843419), y) | ||
34 | -CFLAGS_MODULE += -mcmodel=large | ||
35 | +KBUILD_CFLAGS_MODULE += -mcmodel=large | ||
36 | endif | ||
37 | |||
38 | # Default value | ||
39 | diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c | ||
40 | index 407991bf79f5..ccb6078ed9f2 100644 | ||
41 | --- a/arch/arm64/kernel/stacktrace.c | ||
42 | +++ b/arch/arm64/kernel/stacktrace.c | ||
43 | @@ -48,11 +48,7 @@ int notrace unwind_frame(struct stackframe *frame) | ||
44 | |||
45 | frame->sp = fp + 0x10; | ||
46 | frame->fp = *(unsigned long *)(fp); | ||
47 | - /* | ||
48 | - * -4 here because we care about the PC at time of bl, | ||
49 | - * not where the return will go. | ||
50 | - */ | ||
51 | - frame->pc = *(unsigned long *)(fp + 8) - 4; | ||
52 | + frame->pc = *(unsigned long *)(fp + 8); | ||
53 | |||
54 | return 0; | ||
55 | } | ||
56 | diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c | ||
57 | index af0dafab5807..79c459a2b684 100644 | ||
58 | --- a/arch/powerpc/kernel/rtas.c | ||
59 | +++ b/arch/powerpc/kernel/rtas.c | ||
60 | @@ -1045,6 +1045,9 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs) | ||
61 | if (!capable(CAP_SYS_ADMIN)) | ||
62 | return -EPERM; | ||
63 | |||
64 | + if (!rtas.entry) | ||
65 | + return -EINVAL; | ||
66 | + | ||
67 | if (copy_from_user(&args, uargs, 3 * sizeof(u32)) != 0) | ||
68 | return -EFAULT; | ||
69 | |||
70 | diff --git a/arch/sparc/crypto/aes_glue.c b/arch/sparc/crypto/aes_glue.c | ||
71 | index 705408766ab0..ef0870500240 100644 | ||
72 | --- a/arch/sparc/crypto/aes_glue.c | ||
73 | +++ b/arch/sparc/crypto/aes_glue.c | ||
74 | @@ -433,6 +433,7 @@ static struct crypto_alg algs[] = { { | ||
75 | .blkcipher = { | ||
76 | .min_keysize = AES_MIN_KEY_SIZE, | ||
77 | .max_keysize = AES_MAX_KEY_SIZE, | ||
78 | + .ivsize = AES_BLOCK_SIZE, | ||
79 | .setkey = aes_set_key, | ||
80 | .encrypt = cbc_encrypt, | ||
81 | .decrypt = cbc_decrypt, | ||
82 | @@ -452,6 +453,7 @@ static struct crypto_alg algs[] = { { | ||
83 | .blkcipher = { | ||
84 | .min_keysize = AES_MIN_KEY_SIZE, | ||
85 | .max_keysize = AES_MAX_KEY_SIZE, | ||
86 | + .ivsize = AES_BLOCK_SIZE, | ||
87 | .setkey = aes_set_key, | ||
88 | .encrypt = ctr_crypt, | ||
89 | .decrypt = ctr_crypt, | ||
90 | diff --git a/arch/sparc/crypto/camellia_glue.c b/arch/sparc/crypto/camellia_glue.c | ||
91 | index 641f55cb61c3..eb87d6dd86b1 100644 | ||
92 | --- a/arch/sparc/crypto/camellia_glue.c | ||
93 | +++ b/arch/sparc/crypto/camellia_glue.c | ||
94 | @@ -274,6 +274,7 @@ static struct crypto_alg algs[] = { { | ||
95 | .blkcipher = { | ||
96 | .min_keysize = CAMELLIA_MIN_KEY_SIZE, | ||
97 | .max_keysize = CAMELLIA_MAX_KEY_SIZE, | ||
98 | + .ivsize = CAMELLIA_BLOCK_SIZE, | ||
99 | .setkey = camellia_set_key, | ||
100 | .encrypt = cbc_encrypt, | ||
101 | .decrypt = cbc_decrypt, | ||
102 | diff --git a/arch/sparc/crypto/des_glue.c b/arch/sparc/crypto/des_glue.c | ||
103 | index d11500972994..1359bfc544e4 100644 | ||
104 | --- a/arch/sparc/crypto/des_glue.c | ||
105 | +++ b/arch/sparc/crypto/des_glue.c | ||
106 | @@ -429,6 +429,7 @@ static struct crypto_alg algs[] = { { | ||
107 | .blkcipher = { | ||
108 | .min_keysize = DES_KEY_SIZE, | ||
109 | .max_keysize = DES_KEY_SIZE, | ||
110 | + .ivsize = DES_BLOCK_SIZE, | ||
111 | .setkey = des_set_key, | ||
112 | .encrypt = cbc_encrypt, | ||
113 | .decrypt = cbc_decrypt, | ||
114 | @@ -485,6 +486,7 @@ static struct crypto_alg algs[] = { { | ||
115 | .blkcipher = { | ||
116 | .min_keysize = DES3_EDE_KEY_SIZE, | ||
117 | .max_keysize = DES3_EDE_KEY_SIZE, | ||
118 | + .ivsize = DES3_EDE_BLOCK_SIZE, | ||
119 | .setkey = des3_ede_set_key, | ||
120 | .encrypt = cbc3_encrypt, | ||
121 | .decrypt = cbc3_decrypt, | ||
122 | diff --git a/arch/x86/include/uapi/asm/svm.h b/arch/x86/include/uapi/asm/svm.h | ||
123 | index b5d7640abc5d..8a4add8e4639 100644 | ||
124 | --- a/arch/x86/include/uapi/asm/svm.h | ||
125 | +++ b/arch/x86/include/uapi/asm/svm.h | ||
126 | @@ -100,6 +100,7 @@ | ||
127 | { SVM_EXIT_EXCP_BASE + UD_VECTOR, "UD excp" }, \ | ||
128 | { SVM_EXIT_EXCP_BASE + PF_VECTOR, "PF excp" }, \ | ||
129 | { SVM_EXIT_EXCP_BASE + NM_VECTOR, "NM excp" }, \ | ||
130 | + { SVM_EXIT_EXCP_BASE + AC_VECTOR, "AC excp" }, \ | ||
131 | { SVM_EXIT_EXCP_BASE + MC_VECTOR, "MC excp" }, \ | ||
132 | { SVM_EXIT_INTR, "interrupt" }, \ | ||
133 | { SVM_EXIT_NMI, "nmi" }, \ | ||
134 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c | ||
135 | index 974e4d98ed29..852572c971c4 100644 | ||
136 | --- a/arch/x86/kvm/emulate.c | ||
137 | +++ b/arch/x86/kvm/emulate.c | ||
138 | @@ -658,7 +658,7 @@ static int __linearize(struct x86_emulate_ctxt *ctxt, | ||
139 | *max_size = 0; | ||
140 | switch (ctxt->mode) { | ||
141 | case X86EMUL_MODE_PROT64: | ||
142 | - if (((signed long)la << 16) >> 16 != la) | ||
143 | + if (is_noncanonical_address(la)) | ||
144 | return emulate_gp(ctxt, 0); | ||
145 | |||
146 | *max_size = min_t(u64, ~0u, (1ull << 48) - la); | ||
147 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c | ||
148 | index f98baebfa9a7..9dc0aa0dae96 100644 | ||
149 | --- a/arch/x86/kvm/svm.c | ||
150 | +++ b/arch/x86/kvm/svm.c | ||
151 | @@ -1103,6 +1103,7 @@ static void init_vmcb(struct vcpu_svm *svm) | ||
152 | set_exception_intercept(svm, PF_VECTOR); | ||
153 | set_exception_intercept(svm, UD_VECTOR); | ||
154 | set_exception_intercept(svm, MC_VECTOR); | ||
155 | + set_exception_intercept(svm, AC_VECTOR); | ||
156 | |||
157 | set_intercept(svm, INTERCEPT_INTR); | ||
158 | set_intercept(svm, INTERCEPT_NMI); | ||
159 | @@ -1789,6 +1790,12 @@ static int ud_interception(struct vcpu_svm *svm) | ||
160 | return 1; | ||
161 | } | ||
162 | |||
163 | +static int ac_interception(struct vcpu_svm *svm) | ||
164 | +{ | ||
165 | + kvm_queue_exception_e(&svm->vcpu, AC_VECTOR, 0); | ||
166 | + return 1; | ||
167 | +} | ||
168 | + | ||
169 | static void svm_fpu_activate(struct kvm_vcpu *vcpu) | ||
170 | { | ||
171 | struct vcpu_svm *svm = to_svm(vcpu); | ||
172 | @@ -3350,6 +3357,7 @@ static int (*const svm_exit_handlers[])(struct vcpu_svm *svm) = { | ||
173 | [SVM_EXIT_EXCP_BASE + PF_VECTOR] = pf_interception, | ||
174 | [SVM_EXIT_EXCP_BASE + NM_VECTOR] = nm_interception, | ||
175 | [SVM_EXIT_EXCP_BASE + MC_VECTOR] = mc_interception, | ||
176 | + [SVM_EXIT_EXCP_BASE + AC_VECTOR] = ac_interception, | ||
177 | [SVM_EXIT_INTR] = intr_interception, | ||
178 | [SVM_EXIT_NMI] = nmi_interception, | ||
179 | [SVM_EXIT_SMI] = nop_on_interception, | ||
180 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
181 | index 0d7f1dcfcdac..84de207a8848 100644 | ||
182 | --- a/arch/x86/kvm/vmx.c | ||
183 | +++ b/arch/x86/kvm/vmx.c | ||
184 | @@ -1493,7 +1493,7 @@ static void update_exception_bitmap(struct kvm_vcpu *vcpu) | ||
185 | u32 eb; | ||
186 | |||
187 | eb = (1u << PF_VECTOR) | (1u << UD_VECTOR) | (1u << MC_VECTOR) | | ||
188 | - (1u << NM_VECTOR) | (1u << DB_VECTOR); | ||
189 | + (1u << NM_VECTOR) | (1u << DB_VECTOR) | (1u << AC_VECTOR); | ||
190 | if ((vcpu->guest_debug & | ||
191 | (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP)) == | ||
192 | (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP)) | ||
193 | @@ -4933,6 +4933,9 @@ static int handle_exception(struct kvm_vcpu *vcpu) | ||
194 | return handle_rmode_exception(vcpu, ex_no, error_code); | ||
195 | |||
196 | switch (ex_no) { | ||
197 | + case AC_VECTOR: | ||
198 | + kvm_queue_exception_e(vcpu, AC_VECTOR, error_code); | ||
199 | + return 1; | ||
200 | case DB_VECTOR: | ||
201 | dr6 = vmcs_readl(EXIT_QUALIFICATION); | ||
202 | if (!(vcpu->guest_debug & | ||
203 | diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c | ||
204 | index 40886c489903..520729d898fe 100644 | ||
205 | --- a/crypto/ablkcipher.c | ||
206 | +++ b/crypto/ablkcipher.c | ||
207 | @@ -695,7 +695,7 @@ struct crypto_ablkcipher *crypto_alloc_ablkcipher(const char *alg_name, | ||
208 | err: | ||
209 | if (err != -EAGAIN) | ||
210 | break; | ||
211 | - if (signal_pending(current)) { | ||
212 | + if (fatal_signal_pending(current)) { | ||
213 | err = -EINTR; | ||
214 | break; | ||
215 | } | ||
216 | diff --git a/crypto/ahash.c b/crypto/ahash.c | ||
217 | index f6a36a52d738..c1d8591913e9 100644 | ||
218 | --- a/crypto/ahash.c | ||
219 | +++ b/crypto/ahash.c | ||
220 | @@ -543,7 +543,8 @@ static int ahash_prepare_alg(struct ahash_alg *alg) | ||
221 | struct crypto_alg *base = &alg->halg.base; | ||
222 | |||
223 | if (alg->halg.digestsize > PAGE_SIZE / 8 || | ||
224 | - alg->halg.statesize > PAGE_SIZE / 8) | ||
225 | + alg->halg.statesize > PAGE_SIZE / 8 || | ||
226 | + alg->halg.statesize == 0) | ||
227 | return -EINVAL; | ||
228 | |||
229 | base->cra_type = &crypto_ahash_type; | ||
230 | diff --git a/crypto/algapi.c b/crypto/algapi.c | ||
231 | index 71a8143e23b1..314cc745f2f8 100644 | ||
232 | --- a/crypto/algapi.c | ||
233 | +++ b/crypto/algapi.c | ||
234 | @@ -337,7 +337,7 @@ static void crypto_wait_for_test(struct crypto_larval *larval) | ||
235 | crypto_alg_tested(larval->alg.cra_driver_name, 0); | ||
236 | } | ||
237 | |||
238 | - err = wait_for_completion_interruptible(&larval->completion); | ||
239 | + err = wait_for_completion_killable(&larval->completion); | ||
240 | WARN_ON(err); | ||
241 | |||
242 | out: | ||
243 | diff --git a/crypto/api.c b/crypto/api.c | ||
244 | index 2a81e98a0021..7db2e89a3114 100644 | ||
245 | --- a/crypto/api.c | ||
246 | +++ b/crypto/api.c | ||
247 | @@ -172,7 +172,7 @@ static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg) | ||
248 | struct crypto_larval *larval = (void *)alg; | ||
249 | long timeout; | ||
250 | |||
251 | - timeout = wait_for_completion_interruptible_timeout( | ||
252 | + timeout = wait_for_completion_killable_timeout( | ||
253 | &larval->completion, 60 * HZ); | ||
254 | |||
255 | alg = larval->adult; | ||
256 | @@ -435,7 +435,7 @@ struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask) | ||
257 | err: | ||
258 | if (err != -EAGAIN) | ||
259 | break; | ||
260 | - if (signal_pending(current)) { | ||
261 | + if (fatal_signal_pending(current)) { | ||
262 | err = -EINTR; | ||
263 | break; | ||
264 | } | ||
265 | @@ -552,7 +552,7 @@ void *crypto_alloc_tfm(const char *alg_name, | ||
266 | err: | ||
267 | if (err != -EAGAIN) | ||
268 | break; | ||
269 | - if (signal_pending(current)) { | ||
270 | + if (fatal_signal_pending(current)) { | ||
271 | err = -EINTR; | ||
272 | break; | ||
273 | } | ||
274 | diff --git a/crypto/crypto_user.c b/crypto/crypto_user.c | ||
275 | index e2a34feec7a4..c90af2537d24 100644 | ||
276 | --- a/crypto/crypto_user.c | ||
277 | +++ b/crypto/crypto_user.c | ||
278 | @@ -367,7 +367,7 @@ static struct crypto_alg *crypto_user_aead_alg(const char *name, u32 type, | ||
279 | err = PTR_ERR(alg); | ||
280 | if (err != -EAGAIN) | ||
281 | break; | ||
282 | - if (signal_pending(current)) { | ||
283 | + if (fatal_signal_pending(current)) { | ||
284 | err = -EINTR; | ||
285 | break; | ||
286 | } | ||
287 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c | ||
288 | index dc1ca84e90f1..8f51d6e3883e 100644 | ||
289 | --- a/drivers/block/rbd.c | ||
290 | +++ b/drivers/block/rbd.c | ||
291 | @@ -3780,6 +3780,9 @@ static int rbd_init_disk(struct rbd_device *rbd_dev) | ||
292 | q->limits.discard_zeroes_data = 1; | ||
293 | |||
294 | blk_queue_merge_bvec(q, rbd_merge_bvec); | ||
295 | + if (!ceph_test_opt(rbd_dev->rbd_client->client, NOCRC)) | ||
296 | + q->backing_dev_info.capabilities |= BDI_CAP_STABLE_WRITES; | ||
297 | + | ||
298 | disk->queue = q; | ||
299 | |||
300 | q->queuedata = rbd_dev; | ||
301 | @@ -5198,7 +5201,6 @@ static int rbd_dev_probe_parent(struct rbd_device *rbd_dev) | ||
302 | out_err: | ||
303 | if (parent) { | ||
304 | rbd_dev_unparent(rbd_dev); | ||
305 | - kfree(rbd_dev->header_name); | ||
306 | rbd_dev_destroy(parent); | ||
307 | } else { | ||
308 | rbd_put_client(rbdc); | ||
309 | diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c | ||
310 | index 218c4858f494..34a01f191b33 100644 | ||
311 | --- a/drivers/block/xen-blkfront.c | ||
312 | +++ b/drivers/block/xen-blkfront.c | ||
313 | @@ -1911,7 +1911,8 @@ static void blkback_changed(struct xenbus_device *dev, | ||
314 | break; | ||
315 | /* Missed the backend's Closing state -- fallthrough */ | ||
316 | case XenbusStateClosing: | ||
317 | - blkfront_closing(info); | ||
318 | + if (info) | ||
319 | + blkfront_closing(info); | ||
320 | break; | ||
321 | } | ||
322 | } | ||
323 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | ||
324 | index 448327fe4d85..60c68e3cedeb 100644 | ||
325 | --- a/drivers/gpu/drm/i915/intel_display.c | ||
326 | +++ b/drivers/gpu/drm/i915/intel_display.c | ||
327 | @@ -1650,6 +1650,8 @@ static void i9xx_enable_pll(struct intel_crtc *crtc) | ||
328 | I915_READ(DPLL(!crtc->pipe)) | DPLL_DVO_2X_MODE); | ||
329 | } | ||
330 | |||
331 | + I915_WRITE(reg, dpll); | ||
332 | + | ||
333 | /* Wait for the clocks to stabilize. */ | ||
334 | POSTING_READ(reg); | ||
335 | udelay(150); | ||
336 | diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | ||
337 | index 593ef8a2a069..ddcfc1d2544b 100644 | ||
338 | --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c | ||
339 | +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | ||
340 | @@ -178,8 +178,30 @@ nouveau_fbcon_sync(struct fb_info *info) | ||
341 | return 0; | ||
342 | } | ||
343 | |||
344 | +static int | ||
345 | +nouveau_fbcon_open(struct fb_info *info, int user) | ||
346 | +{ | ||
347 | + struct nouveau_fbdev *fbcon = info->par; | ||
348 | + struct nouveau_drm *drm = nouveau_drm(fbcon->dev); | ||
349 | + int ret = pm_runtime_get_sync(drm->dev->dev); | ||
350 | + if (ret < 0 && ret != -EACCES) | ||
351 | + return ret; | ||
352 | + return 0; | ||
353 | +} | ||
354 | + | ||
355 | +static int | ||
356 | +nouveau_fbcon_release(struct fb_info *info, int user) | ||
357 | +{ | ||
358 | + struct nouveau_fbdev *fbcon = info->par; | ||
359 | + struct nouveau_drm *drm = nouveau_drm(fbcon->dev); | ||
360 | + pm_runtime_put(drm->dev->dev); | ||
361 | + return 0; | ||
362 | +} | ||
363 | + | ||
364 | static struct fb_ops nouveau_fbcon_ops = { | ||
365 | .owner = THIS_MODULE, | ||
366 | + .fb_open = nouveau_fbcon_open, | ||
367 | + .fb_release = nouveau_fbcon_release, | ||
368 | .fb_check_var = drm_fb_helper_check_var, | ||
369 | .fb_set_par = drm_fb_helper_set_par, | ||
370 | .fb_fillrect = nouveau_fbcon_fillrect, | ||
371 | @@ -195,6 +217,8 @@ static struct fb_ops nouveau_fbcon_ops = { | ||
372 | |||
373 | static struct fb_ops nouveau_fbcon_sw_ops = { | ||
374 | .owner = THIS_MODULE, | ||
375 | + .fb_open = nouveau_fbcon_open, | ||
376 | + .fb_release = nouveau_fbcon_release, | ||
377 | .fb_check_var = drm_fb_helper_check_var, | ||
378 | .fb_set_par = drm_fb_helper_set_par, | ||
379 | .fb_fillrect = cfb_fillrect, | ||
380 | diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c | ||
381 | index 36951ee4b157..9fcc77d5923e 100644 | ||
382 | --- a/drivers/gpu/drm/nouveau/nouveau_gem.c | ||
383 | +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | ||
384 | @@ -199,11 +199,12 @@ nouveau_gem_info(struct drm_file *file_priv, struct drm_gem_object *gem, | ||
385 | struct nouveau_bo *nvbo = nouveau_gem_object(gem); | ||
386 | struct nouveau_vma *vma; | ||
387 | |||
388 | - if (nvbo->bo.mem.mem_type == TTM_PL_TT) | ||
389 | + if (is_power_of_2(nvbo->valid_domains)) | ||
390 | + rep->domain = nvbo->valid_domains; | ||
391 | + else if (nvbo->bo.mem.mem_type == TTM_PL_TT) | ||
392 | rep->domain = NOUVEAU_GEM_DOMAIN_GART; | ||
393 | else | ||
394 | rep->domain = NOUVEAU_GEM_DOMAIN_VRAM; | ||
395 | - | ||
396 | rep->offset = nvbo->bo.offset; | ||
397 | if (cli->vm) { | ||
398 | vma = nouveau_bo_vma_find(nvbo, cli->vm); | ||
399 | diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h | ||
400 | index d6f0e40db81d..ee38f9aba391 100644 | ||
401 | --- a/drivers/gpu/drm/radeon/radeon.h | ||
402 | +++ b/drivers/gpu/drm/radeon/radeon.h | ||
403 | @@ -1628,6 +1628,7 @@ struct radeon_pm { | ||
404 | struct device *int_hwmon_dev; | ||
405 | /* dpm */ | ||
406 | bool dpm_enabled; | ||
407 | + bool sysfs_initialized; | ||
408 | struct radeon_dpm dpm; | ||
409 | }; | ||
410 | |||
411 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c | ||
412 | index 2e1e9aa79cea..21e6e9745d00 100644 | ||
413 | --- a/drivers/gpu/drm/radeon/radeon_display.c | ||
414 | +++ b/drivers/gpu/drm/radeon/radeon_display.c | ||
415 | @@ -1619,18 +1619,8 @@ int radeon_modeset_init(struct radeon_device *rdev) | ||
416 | radeon_fbdev_init(rdev); | ||
417 | drm_kms_helper_poll_init(rdev->ddev); | ||
418 | |||
419 | - if (rdev->pm.dpm_enabled) { | ||
420 | - /* do dpm late init */ | ||
421 | - ret = radeon_pm_late_init(rdev); | ||
422 | - if (ret) { | ||
423 | - rdev->pm.dpm_enabled = false; | ||
424 | - DRM_ERROR("radeon_pm_late_init failed, disabling dpm\n"); | ||
425 | - } | ||
426 | - /* set the dpm state for PX since there won't be | ||
427 | - * a modeset to call this. | ||
428 | - */ | ||
429 | - radeon_pm_compute_clocks(rdev); | ||
430 | - } | ||
431 | + /* do pm late init */ | ||
432 | + ret = radeon_pm_late_init(rdev); | ||
433 | |||
434 | return 0; | ||
435 | } | ||
436 | diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c | ||
437 | index 1d94b542cd82..fa537c0602e8 100644 | ||
438 | --- a/drivers/gpu/drm/radeon/radeon_pm.c | ||
439 | +++ b/drivers/gpu/drm/radeon/radeon_pm.c | ||
440 | @@ -1192,14 +1192,6 @@ static int radeon_pm_init_old(struct radeon_device *rdev) | ||
441 | INIT_DELAYED_WORK(&rdev->pm.dynpm_idle_work, radeon_dynpm_idle_work_handler); | ||
442 | |||
443 | if (rdev->pm.num_power_states > 1) { | ||
444 | - /* where's the best place to put these? */ | ||
445 | - ret = device_create_file(rdev->dev, &dev_attr_power_profile); | ||
446 | - if (ret) | ||
447 | - DRM_ERROR("failed to create device file for power profile\n"); | ||
448 | - ret = device_create_file(rdev->dev, &dev_attr_power_method); | ||
449 | - if (ret) | ||
450 | - DRM_ERROR("failed to create device file for power method\n"); | ||
451 | - | ||
452 | if (radeon_debugfs_pm_init(rdev)) { | ||
453 | DRM_ERROR("Failed to register debugfs file for PM!\n"); | ||
454 | } | ||
455 | @@ -1257,20 +1249,6 @@ static int radeon_pm_init_dpm(struct radeon_device *rdev) | ||
456 | goto dpm_failed; | ||
457 | rdev->pm.dpm_enabled = true; | ||
458 | |||
459 | - ret = device_create_file(rdev->dev, &dev_attr_power_dpm_state); | ||
460 | - if (ret) | ||
461 | - DRM_ERROR("failed to create device file for dpm state\n"); | ||
462 | - ret = device_create_file(rdev->dev, &dev_attr_power_dpm_force_performance_level); | ||
463 | - if (ret) | ||
464 | - DRM_ERROR("failed to create device file for dpm state\n"); | ||
465 | - /* XXX: these are noops for dpm but are here for backwards compat */ | ||
466 | - ret = device_create_file(rdev->dev, &dev_attr_power_profile); | ||
467 | - if (ret) | ||
468 | - DRM_ERROR("failed to create device file for power profile\n"); | ||
469 | - ret = device_create_file(rdev->dev, &dev_attr_power_method); | ||
470 | - if (ret) | ||
471 | - DRM_ERROR("failed to create device file for power method\n"); | ||
472 | - | ||
473 | if (radeon_debugfs_pm_init(rdev)) { | ||
474 | DRM_ERROR("Failed to register debugfs file for dpm!\n"); | ||
475 | } | ||
476 | @@ -1411,9 +1389,51 @@ int radeon_pm_late_init(struct radeon_device *rdev) | ||
477 | int ret = 0; | ||
478 | |||
479 | if (rdev->pm.pm_method == PM_METHOD_DPM) { | ||
480 | - mutex_lock(&rdev->pm.mutex); | ||
481 | - ret = radeon_dpm_late_enable(rdev); | ||
482 | - mutex_unlock(&rdev->pm.mutex); | ||
483 | + if (rdev->pm.dpm_enabled) { | ||
484 | + if (!rdev->pm.sysfs_initialized) { | ||
485 | + ret = device_create_file(rdev->dev, &dev_attr_power_dpm_state); | ||
486 | + if (ret) | ||
487 | + DRM_ERROR("failed to create device file for dpm state\n"); | ||
488 | + ret = device_create_file(rdev->dev, &dev_attr_power_dpm_force_performance_level); | ||
489 | + if (ret) | ||
490 | + DRM_ERROR("failed to create device file for dpm state\n"); | ||
491 | + /* XXX: these are noops for dpm but are here for backwards compat */ | ||
492 | + ret = device_create_file(rdev->dev, &dev_attr_power_profile); | ||
493 | + if (ret) | ||
494 | + DRM_ERROR("failed to create device file for power profile\n"); | ||
495 | + ret = device_create_file(rdev->dev, &dev_attr_power_method); | ||
496 | + if (ret) | ||
497 | + DRM_ERROR("failed to create device file for power method\n"); | ||
498 | + if (!ret) | ||
499 | + rdev->pm.sysfs_initialized = true; | ||
500 | + } | ||
501 | + | ||
502 | + mutex_lock(&rdev->pm.mutex); | ||
503 | + ret = radeon_dpm_late_enable(rdev); | ||
504 | + mutex_unlock(&rdev->pm.mutex); | ||
505 | + if (ret) { | ||
506 | + rdev->pm.dpm_enabled = false; | ||
507 | + DRM_ERROR("radeon_pm_late_init failed, disabling dpm\n"); | ||
508 | + } else { | ||
509 | + /* set the dpm state for PX since there won't be | ||
510 | + * a modeset to call this. | ||
511 | + */ | ||
512 | + radeon_pm_compute_clocks(rdev); | ||
513 | + } | ||
514 | + } | ||
515 | + } else { | ||
516 | + if ((rdev->pm.num_power_states > 1) && | ||
517 | + (!rdev->pm.sysfs_initialized)) { | ||
518 | + /* where's the best place to put these? */ | ||
519 | + ret = device_create_file(rdev->dev, &dev_attr_power_profile); | ||
520 | + if (ret) | ||
521 | + DRM_ERROR("failed to create device file for power profile\n"); | ||
522 | + ret = device_create_file(rdev->dev, &dev_attr_power_method); | ||
523 | + if (ret) | ||
524 | + DRM_ERROR("failed to create device file for power method\n"); | ||
525 | + if (!ret) | ||
526 | + rdev->pm.sysfs_initialized = true; | ||
527 | + } | ||
528 | } | ||
529 | return ret; | ||
530 | } | ||
531 | diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c | ||
532 | index f822fd2a1ada..884d82f9190e 100644 | ||
533 | --- a/drivers/hid/hid-apple.c | ||
534 | +++ b/drivers/hid/hid-apple.c | ||
535 | @@ -546,6 +546,12 @@ static const struct hid_device_id apple_devices[] = { | ||
536 | .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, | ||
537 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS), | ||
538 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | ||
539 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI), | ||
540 | + .driver_data = APPLE_HAS_FN }, | ||
541 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ISO), | ||
542 | + .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, | ||
543 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_JIS), | ||
544 | + .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | ||
545 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI), | ||
546 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | ||
547 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO), | ||
548 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c | ||
549 | index 737d18c924bc..ab52d1b30161 100644 | ||
550 | --- a/drivers/hid/hid-core.c | ||
551 | +++ b/drivers/hid/hid-core.c | ||
552 | @@ -1751,6 +1751,9 @@ static const struct hid_device_id hid_have_special_driver[] = { | ||
553 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI) }, | ||
554 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO) }, | ||
555 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS) }, | ||
556 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI) }, | ||
557 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ISO) }, | ||
558 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_JIS) }, | ||
559 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) }, | ||
560 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) }, | ||
561 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) }, | ||
562 | @@ -2434,6 +2437,9 @@ static const struct hid_device_id hid_mouse_ignore_list[] = { | ||
563 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI) }, | ||
564 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO) }, | ||
565 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS) }, | ||
566 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI) }, | ||
567 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ISO) }, | ||
568 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_JIS) }, | ||
569 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, | ||
570 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | ||
571 | { } | ||
572 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | ||
573 | index ef984eba8396..984e43cb83f0 100644 | ||
574 | --- a/drivers/hid/hid-ids.h | ||
575 | +++ b/drivers/hid/hid-ids.h | ||
576 | @@ -142,6 +142,9 @@ | ||
577 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0290 | ||
578 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0291 | ||
579 | #define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0292 | ||
580 | +#define USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI 0x0272 | ||
581 | +#define USB_DEVICE_ID_APPLE_WELLSPRING9_ISO 0x0273 | ||
582 | +#define USB_DEVICE_ID_APPLE_WELLSPRING9_JIS 0x0274 | ||
583 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a | ||
584 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b | ||
585 | #define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240 | ||
586 | @@ -918,7 +921,8 @@ | ||
587 | #define USB_DEVICE_ID_TOUCHPACK_RTS 0x1688 | ||
588 | |||
589 | #define USB_VENDOR_ID_TPV 0x25aa | ||
590 | -#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN 0x8883 | ||
591 | +#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882 0x8882 | ||
592 | +#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883 0x8883 | ||
593 | |||
594 | #define USB_VENDOR_ID_TURBOX 0x062a | ||
595 | #define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201 | ||
596 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c | ||
597 | index a4d1fe64c925..f7dd36e4fcb3 100644 | ||
598 | --- a/drivers/hid/usbhid/hid-quirks.c | ||
599 | +++ b/drivers/hid/usbhid/hid-quirks.c | ||
600 | @@ -111,7 +111,8 @@ static const struct hid_blacklist { | ||
601 | { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, | ||
602 | { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_1, HID_QUIRK_NOGET }, | ||
603 | { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_2, HID_QUIRK_NOGET }, | ||
604 | - { USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN, HID_QUIRK_NOGET }, | ||
605 | + { USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882, HID_QUIRK_NOGET }, | ||
606 | + { USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883, HID_QUIRK_NOGET }, | ||
607 | { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET }, | ||
608 | { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5, HID_QUIRK_MULTI_INPUT }, | ||
609 | { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60, HID_QUIRK_MULTI_INPUT }, | ||
610 | diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c | ||
611 | index 373dd4d47765..76babdb800f9 100644 | ||
612 | --- a/drivers/i2c/busses/i2c-designware-platdrv.c | ||
613 | +++ b/drivers/i2c/busses/i2c-designware-platdrv.c | ||
614 | @@ -24,6 +24,7 @@ | ||
615 | #include <linux/kernel.h> | ||
616 | #include <linux/module.h> | ||
617 | #include <linux/delay.h> | ||
618 | +#include <linux/dmi.h> | ||
619 | #include <linux/i2c.h> | ||
620 | #include <linux/clk.h> | ||
621 | #include <linux/clk-provider.h> | ||
622 | @@ -51,6 +52,22 @@ static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev) | ||
623 | } | ||
624 | |||
625 | #ifdef CONFIG_ACPI | ||
626 | +/* | ||
627 | + * The HCNT/LCNT information coming from ACPI should be the most accurate | ||
628 | + * for given platform. However, some systems get it wrong. On such systems | ||
629 | + * we get better results by calculating those based on the input clock. | ||
630 | + */ | ||
631 | +static const struct dmi_system_id dw_i2c_no_acpi_params[] = { | ||
632 | + { | ||
633 | + .ident = "Dell Inspiron 7348", | ||
634 | + .matches = { | ||
635 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
636 | + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7348"), | ||
637 | + }, | ||
638 | + }, | ||
639 | + { } | ||
640 | +}; | ||
641 | + | ||
642 | static void dw_i2c_acpi_params(struct platform_device *pdev, char method[], | ||
643 | u16 *hcnt, u16 *lcnt, u32 *sda_hold) | ||
644 | { | ||
645 | @@ -58,6 +75,9 @@ static void dw_i2c_acpi_params(struct platform_device *pdev, char method[], | ||
646 | acpi_handle handle = ACPI_HANDLE(&pdev->dev); | ||
647 | union acpi_object *obj; | ||
648 | |||
649 | + if (dmi_check_system(dw_i2c_no_acpi_params)) | ||
650 | + return; | ||
651 | + | ||
652 | if (ACPI_FAILURE(acpi_evaluate_object(handle, method, NULL, &buf))) | ||
653 | return; | ||
654 | |||
655 | diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c | ||
656 | index d826e82dd997..47bd421f2750 100644 | ||
657 | --- a/drivers/i2c/busses/i2c-rcar.c | ||
658 | +++ b/drivers/i2c/busses/i2c-rcar.c | ||
659 | @@ -584,15 +584,16 @@ static int rcar_i2c_probe(struct platform_device *pdev) | ||
660 | return ret; | ||
661 | } | ||
662 | |||
663 | + pm_runtime_enable(dev); | ||
664 | + platform_set_drvdata(pdev, priv); | ||
665 | + | ||
666 | ret = i2c_add_numbered_adapter(adap); | ||
667 | if (ret < 0) { | ||
668 | dev_err(dev, "reg adap failed: %d\n", ret); | ||
669 | + pm_runtime_disable(dev); | ||
670 | return ret; | ||
671 | } | ||
672 | |||
673 | - pm_runtime_enable(dev); | ||
674 | - platform_set_drvdata(pdev, priv); | ||
675 | - | ||
676 | dev_info(dev, "probed\n"); | ||
677 | |||
678 | return 0; | ||
679 | diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c | ||
680 | index c127af99a0e0..b928e7a62f59 100644 | ||
681 | --- a/drivers/i2c/busses/i2c-s3c2410.c | ||
682 | +++ b/drivers/i2c/busses/i2c-s3c2410.c | ||
683 | @@ -1219,17 +1219,19 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | ||
684 | i2c->adap.nr = i2c->pdata->bus_num; | ||
685 | i2c->adap.dev.of_node = pdev->dev.of_node; | ||
686 | |||
687 | + platform_set_drvdata(pdev, i2c); | ||
688 | + | ||
689 | + pm_runtime_enable(&pdev->dev); | ||
690 | + | ||
691 | ret = i2c_add_numbered_adapter(&i2c->adap); | ||
692 | if (ret < 0) { | ||
693 | dev_err(&pdev->dev, "failed to add bus to i2c core\n"); | ||
694 | + pm_runtime_disable(&pdev->dev); | ||
695 | s3c24xx_i2c_deregister_cpufreq(i2c); | ||
696 | clk_unprepare(i2c->clk); | ||
697 | return ret; | ||
698 | } | ||
699 | |||
700 | - platform_set_drvdata(pdev, i2c); | ||
701 | - | ||
702 | - pm_runtime_enable(&pdev->dev); | ||
703 | pm_runtime_enable(&i2c->adap.dev); | ||
704 | |||
705 | dev_info(&pdev->dev, "%s: S3C I2C adapter\n", dev_name(&i2c->adap.dev)); | ||
706 | diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c | ||
707 | index e28a494e2a3a..c3a83f7aa096 100644 | ||
708 | --- a/drivers/infiniband/core/cm.c | ||
709 | +++ b/drivers/infiniband/core/cm.c | ||
710 | @@ -860,6 +860,11 @@ retest: | ||
711 | case IB_CM_SIDR_REQ_RCVD: | ||
712 | spin_unlock_irq(&cm_id_priv->lock); | ||
713 | cm_reject_sidr_req(cm_id_priv, IB_SIDR_REJECT); | ||
714 | + spin_lock_irq(&cm.lock); | ||
715 | + if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node)) | ||
716 | + rb_erase(&cm_id_priv->sidr_id_node, | ||
717 | + &cm.remote_sidr_table); | ||
718 | + spin_unlock_irq(&cm.lock); | ||
719 | break; | ||
720 | case IB_CM_REQ_SENT: | ||
721 | ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg); | ||
722 | @@ -3099,7 +3104,10 @@ int ib_send_cm_sidr_rep(struct ib_cm_id *cm_id, | ||
723 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | ||
724 | |||
725 | spin_lock_irqsave(&cm.lock, flags); | ||
726 | - rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table); | ||
727 | + if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node)) { | ||
728 | + rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table); | ||
729 | + RB_CLEAR_NODE(&cm_id_priv->sidr_id_node); | ||
730 | + } | ||
731 | spin_unlock_irqrestore(&cm.lock, flags); | ||
732 | return 0; | ||
733 | |||
734 | diff --git a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig | ||
735 | index 56eb471b5576..4215b5382092 100644 | ||
736 | --- a/drivers/input/joystick/Kconfig | ||
737 | +++ b/drivers/input/joystick/Kconfig | ||
738 | @@ -196,6 +196,7 @@ config JOYSTICK_TWIDJOY | ||
739 | config JOYSTICK_ZHENHUA | ||
740 | tristate "5-byte Zhenhua RC transmitter" | ||
741 | select SERIO | ||
742 | + select BITREVERSE | ||
743 | help | ||
744 | Say Y here if you have a Zhen Hua PPM-4CH transmitter which is | ||
745 | supplied with a ready to fly micro electric indoor helicopters | ||
746 | diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c | ||
747 | index 024b7bdffe5b..3ab045369c0c 100644 | ||
748 | --- a/drivers/input/keyboard/omap4-keypad.c | ||
749 | +++ b/drivers/input/keyboard/omap4-keypad.c | ||
750 | @@ -266,7 +266,7 @@ static int omap4_keypad_probe(struct platform_device *pdev) | ||
751 | |||
752 | error = omap4_keypad_parse_dt(&pdev->dev, keypad_data); | ||
753 | if (error) | ||
754 | - return error; | ||
755 | + goto err_free_keypad; | ||
756 | |||
757 | res = request_mem_region(res->start, resource_size(res), pdev->name); | ||
758 | if (!res) { | ||
759 | diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c | ||
760 | index 95a3a6e2faf6..51a61e28b89e 100644 | ||
761 | --- a/drivers/input/mouse/psmouse-base.c | ||
762 | +++ b/drivers/input/mouse/psmouse-base.c | ||
763 | @@ -1473,6 +1473,10 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv) | ||
764 | if (error) | ||
765 | goto err_clear_drvdata; | ||
766 | |||
767 | + /* give PT device some time to settle down before probing */ | ||
768 | + if (serio->id.type == SERIO_PS_PSTHRU) | ||
769 | + usleep_range(10000, 15000); | ||
770 | + | ||
771 | if (psmouse_probe(psmouse) < 0) { | ||
772 | error = -ENODEV; | ||
773 | goto err_close_serio; | ||
774 | diff --git a/drivers/input/serio/parkbd.c b/drivers/input/serio/parkbd.c | ||
775 | index 26b45936f9fd..1e8cd6f1fe9e 100644 | ||
776 | --- a/drivers/input/serio/parkbd.c | ||
777 | +++ b/drivers/input/serio/parkbd.c | ||
778 | @@ -194,6 +194,7 @@ static int __init parkbd_init(void) | ||
779 | parkbd_port = parkbd_allocate_serio(); | ||
780 | if (!parkbd_port) { | ||
781 | parport_release(parkbd_dev); | ||
782 | + parport_unregister_device(parkbd_dev); | ||
783 | return -ENOMEM; | ||
784 | } | ||
785 | |||
786 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c | ||
787 | index fab0ea1a46d1..af3daf89c77d 100644 | ||
788 | --- a/drivers/iommu/amd_iommu.c | ||
789 | +++ b/drivers/iommu/amd_iommu.c | ||
790 | @@ -1705,14 +1705,16 @@ static unsigned long dma_ops_area_alloc(struct device *dev, | ||
791 | unsigned long next_bit = dom->next_address % APERTURE_RANGE_SIZE; | ||
792 | int max_index = dom->aperture_size >> APERTURE_RANGE_SHIFT; | ||
793 | int i = start >> APERTURE_RANGE_SHIFT; | ||
794 | - unsigned long boundary_size; | ||
795 | + unsigned long boundary_size, mask; | ||
796 | unsigned long address = -1; | ||
797 | unsigned long limit; | ||
798 | |||
799 | next_bit >>= PAGE_SHIFT; | ||
800 | |||
801 | - boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1, | ||
802 | - PAGE_SIZE) >> PAGE_SHIFT; | ||
803 | + mask = dma_get_seg_boundary(dev); | ||
804 | + | ||
805 | + boundary_size = mask + 1 ? ALIGN(mask + 1, PAGE_SIZE) >> PAGE_SHIFT : | ||
806 | + 1UL << (BITS_PER_LONG - PAGE_SHIFT); | ||
807 | |||
808 | for (;i < max_index; ++i) { | ||
809 | unsigned long offset = dom->aperture[i]->offset >> PAGE_SHIFT; | ||
810 | @@ -2100,8 +2102,8 @@ static void set_dte_entry(u16 devid, struct protection_domain *domain, bool ats) | ||
811 | static void clear_dte_entry(u16 devid) | ||
812 | { | ||
813 | /* remove entry from the device table seen by the hardware */ | ||
814 | - amd_iommu_dev_table[devid].data[0] = IOMMU_PTE_P | IOMMU_PTE_TV; | ||
815 | - amd_iommu_dev_table[devid].data[1] = 0; | ||
816 | + amd_iommu_dev_table[devid].data[0] = IOMMU_PTE_P | IOMMU_PTE_TV; | ||
817 | + amd_iommu_dev_table[devid].data[1] &= DTE_FLAG_MASK; | ||
818 | |||
819 | amd_iommu_apply_erratum_63(devid); | ||
820 | } | ||
821 | diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h | ||
822 | index cec51a8ba844..791442af1fba 100644 | ||
823 | --- a/drivers/iommu/amd_iommu_types.h | ||
824 | +++ b/drivers/iommu/amd_iommu_types.h | ||
825 | @@ -289,6 +289,7 @@ | ||
826 | #define IOMMU_PTE_IR (1ULL << 61) | ||
827 | #define IOMMU_PTE_IW (1ULL << 62) | ||
828 | |||
829 | +#define DTE_FLAG_MASK (0x3ffULL << 32) | ||
830 | #define DTE_FLAG_IOTLB (0x01UL << 32) | ||
831 | #define DTE_FLAG_GV (0x01ULL << 55) | ||
832 | #define DTE_GLX_SHIFT (56) | ||
833 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c | ||
834 | index 0801e35b9940..a7c9685c52f6 100644 | ||
835 | --- a/drivers/md/dm-thin.c | ||
836 | +++ b/drivers/md/dm-thin.c | ||
837 | @@ -2596,7 +2596,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) | ||
838 | metadata_low_callback, | ||
839 | pool); | ||
840 | if (r) | ||
841 | - goto out_free_pt; | ||
842 | + goto out_flags_changed; | ||
843 | |||
844 | pt->callbacks.congested_fn = pool_is_congested; | ||
845 | dm_table_add_target_callbacks(ti->table, &pt->callbacks); | ||
846 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
847 | index 9c5d53f3e4c6..6c169f18aab8 100644 | ||
848 | --- a/drivers/md/md.c | ||
849 | +++ b/drivers/md/md.c | ||
850 | @@ -7560,8 +7560,7 @@ static int remove_and_add_spares(struct mddev *mddev, | ||
851 | !test_bit(Bitmap_sync, &rdev->flags))) | ||
852 | continue; | ||
853 | |||
854 | - if (rdev->saved_raid_disk < 0) | ||
855 | - rdev->recovery_offset = 0; | ||
856 | + rdev->recovery_offset = 0; | ||
857 | if (mddev->pers-> | ||
858 | hot_add_disk(mddev, rdev) == 0) { | ||
859 | if (sysfs_link_rdev(mddev, rdev)) | ||
860 | diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c | ||
861 | index 7c0d75547ccf..92cd09f3c69b 100644 | ||
862 | --- a/drivers/md/persistent-data/dm-btree-remove.c | ||
863 | +++ b/drivers/md/persistent-data/dm-btree-remove.c | ||
864 | @@ -301,11 +301,16 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent, | ||
865 | { | ||
866 | int s; | ||
867 | uint32_t max_entries = le32_to_cpu(left->header.max_entries); | ||
868 | - unsigned target = (nr_left + nr_center + nr_right) / 3; | ||
869 | - BUG_ON(target > max_entries); | ||
870 | + unsigned total = nr_left + nr_center + nr_right; | ||
871 | + unsigned target_right = total / 3; | ||
872 | + unsigned remainder = (target_right * 3) != total; | ||
873 | + unsigned target_left = target_right + remainder; | ||
874 | + | ||
875 | + BUG_ON(target_left > max_entries); | ||
876 | + BUG_ON(target_right > max_entries); | ||
877 | |||
878 | if (nr_left < nr_right) { | ||
879 | - s = nr_left - target; | ||
880 | + s = nr_left - target_left; | ||
881 | |||
882 | if (s < 0 && nr_center < -s) { | ||
883 | /* not enough in central node */ | ||
884 | @@ -316,10 +321,10 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent, | ||
885 | } else | ||
886 | shift(left, center, s); | ||
887 | |||
888 | - shift(center, right, target - nr_right); | ||
889 | + shift(center, right, target_right - nr_right); | ||
890 | |||
891 | } else { | ||
892 | - s = target - nr_right; | ||
893 | + s = target_right - nr_right; | ||
894 | if (s > 0 && nr_center < s) { | ||
895 | /* not enough in central node */ | ||
896 | shift(center, right, nr_center); | ||
897 | @@ -329,7 +334,7 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent, | ||
898 | } else | ||
899 | shift(center, right, s); | ||
900 | |||
901 | - shift(left, center, nr_left - target); | ||
902 | + shift(left, center, nr_left - target_left); | ||
903 | } | ||
904 | |||
905 | *key_ptr(parent, c->index) = center->keys[0]; | ||
906 | diff --git a/drivers/md/persistent-data/dm-btree.c b/drivers/md/persistent-data/dm-btree.c | ||
907 | index c7726cebc495..d6e47033b5e0 100644 | ||
908 | --- a/drivers/md/persistent-data/dm-btree.c | ||
909 | +++ b/drivers/md/persistent-data/dm-btree.c | ||
910 | @@ -523,7 +523,7 @@ static int btree_split_beneath(struct shadow_spine *s, uint64_t key) | ||
911 | |||
912 | r = new_block(s->info, &right); | ||
913 | if (r < 0) { | ||
914 | - /* FIXME: put left */ | ||
915 | + unlock_block(s->info, left); | ||
916 | return r; | ||
917 | } | ||
918 | |||
919 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c | ||
920 | index d24245c7b94a..3c8ada48ca76 100644 | ||
921 | --- a/drivers/md/raid1.c | ||
922 | +++ b/drivers/md/raid1.c | ||
923 | @@ -2245,7 +2245,7 @@ static int narrow_write_error(struct r1bio *r1_bio, int i) | ||
924 | bio_trim(wbio, sector - r1_bio->sector, sectors); | ||
925 | wbio->bi_iter.bi_sector += rdev->data_offset; | ||
926 | wbio->bi_bdev = rdev->bdev; | ||
927 | - if (submit_bio_wait(WRITE, wbio) == 0) | ||
928 | + if (submit_bio_wait(WRITE, wbio) < 0) | ||
929 | /* failure! */ | ||
930 | ok = rdev_set_badblocks(rdev, sector, | ||
931 | sectors, 0) | ||
932 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
933 | index 17eb76760bf5..644f9e576736 100644 | ||
934 | --- a/drivers/md/raid10.c | ||
935 | +++ b/drivers/md/raid10.c | ||
936 | @@ -2599,7 +2599,7 @@ static int narrow_write_error(struct r10bio *r10_bio, int i) | ||
937 | choose_data_offset(r10_bio, rdev) + | ||
938 | (sector - r10_bio->sector)); | ||
939 | wbio->bi_bdev = rdev->bdev; | ||
940 | - if (submit_bio_wait(WRITE, wbio) == 0) | ||
941 | + if (submit_bio_wait(WRITE, wbio) < 0) | ||
942 | /* Failure! */ | ||
943 | ok = rdev_set_badblocks(rdev, sector, | ||
944 | sectors, 0) | ||
945 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c | ||
946 | index e421016bab77..5fa7549ba409 100644 | ||
947 | --- a/drivers/md/raid5.c | ||
948 | +++ b/drivers/md/raid5.c | ||
949 | @@ -3060,6 +3060,8 @@ static void handle_stripe_clean_event(struct r5conf *conf, | ||
950 | } | ||
951 | if (!discard_pending && | ||
952 | test_bit(R5_Discard, &sh->dev[sh->pd_idx].flags)) { | ||
953 | + int hash = sh->hash_lock_index; | ||
954 | + | ||
955 | clear_bit(R5_Discard, &sh->dev[sh->pd_idx].flags); | ||
956 | clear_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags); | ||
957 | if (sh->qd_idx >= 0) { | ||
958 | @@ -3073,9 +3075,9 @@ static void handle_stripe_clean_event(struct r5conf *conf, | ||
959 | * no updated data, so remove it from hash list and the stripe | ||
960 | * will be reinitialized | ||
961 | */ | ||
962 | - spin_lock_irq(&conf->device_lock); | ||
963 | + spin_lock_irq(conf->hash_locks + hash); | ||
964 | remove_hash(sh); | ||
965 | - spin_unlock_irq(&conf->device_lock); | ||
966 | + spin_unlock_irq(conf->hash_locks + hash); | ||
967 | if (test_bit(STRIPE_SYNC_REQUESTED, &sh->state)) | ||
968 | set_bit(STRIPE_HANDLE, &sh->state); | ||
969 | |||
970 | diff --git a/drivers/media/platform/vsp1/vsp1_regs.h b/drivers/media/platform/vsp1/vsp1_regs.h | ||
971 | index 55f163d32d15..8bf802ca16ac 100644 | ||
972 | --- a/drivers/media/platform/vsp1/vsp1_regs.h | ||
973 | +++ b/drivers/media/platform/vsp1/vsp1_regs.h | ||
974 | @@ -238,7 +238,7 @@ | ||
975 | #define VI6_WPF_SZCLIP_EN (1 << 28) | ||
976 | #define VI6_WPF_SZCLIP_OFST_MASK (0xff << 16) | ||
977 | #define VI6_WPF_SZCLIP_OFST_SHIFT 16 | ||
978 | -#define VI6_WPF_SZCLIP_SIZE_MASK (0x1fff << 0) | ||
979 | +#define VI6_WPF_SZCLIP_SIZE_MASK (0xfff << 0) | ||
980 | #define VI6_WPF_SZCLIP_SIZE_SHIFT 0 | ||
981 | |||
982 | #define VI6_WPF_OUTFMT 0x100c | ||
983 | @@ -304,9 +304,9 @@ | ||
984 | #define VI6_DPR_HST_ROUTE 0x2044 | ||
985 | #define VI6_DPR_HSI_ROUTE 0x2048 | ||
986 | #define VI6_DPR_BRU_ROUTE 0x204c | ||
987 | -#define VI6_DPR_ROUTE_FXA_MASK (0xff << 8) | ||
988 | +#define VI6_DPR_ROUTE_FXA_MASK (0xff << 16) | ||
989 | #define VI6_DPR_ROUTE_FXA_SHIFT 16 | ||
990 | -#define VI6_DPR_ROUTE_FP_MASK (0xff << 8) | ||
991 | +#define VI6_DPR_ROUTE_FP_MASK (0x3f << 8) | ||
992 | #define VI6_DPR_ROUTE_FP_SHIFT 8 | ||
993 | #define VI6_DPR_ROUTE_RT_MASK (0x3f << 0) | ||
994 | #define VI6_DPR_ROUTE_RT_SHIFT 0 | ||
995 | diff --git a/drivers/media/usb/gspca/m5602/m5602_s5k83a.c b/drivers/media/usb/gspca/m5602/m5602_s5k83a.c | ||
996 | index 7cbc3a00bda8..bf6b215438e3 100644 | ||
997 | --- a/drivers/media/usb/gspca/m5602/m5602_s5k83a.c | ||
998 | +++ b/drivers/media/usb/gspca/m5602/m5602_s5k83a.c | ||
999 | @@ -177,7 +177,7 @@ static int rotation_thread_function(void *data) | ||
1000 | __s32 vflip, hflip; | ||
1001 | |||
1002 | set_current_state(TASK_INTERRUPTIBLE); | ||
1003 | - while (!schedule_timeout(100)) { | ||
1004 | + while (!schedule_timeout(msecs_to_jiffies(100))) { | ||
1005 | if (mutex_lock_interruptible(&sd->gspca_dev.usb_lock)) | ||
1006 | break; | ||
1007 | |||
1008 | diff --git a/drivers/media/usb/usbvision/usbvision-video.c b/drivers/media/usb/usbvision/usbvision-video.c | ||
1009 | index 9bfa041e3316..d78689831aea 100644 | ||
1010 | --- a/drivers/media/usb/usbvision/usbvision-video.c | ||
1011 | +++ b/drivers/media/usb/usbvision/usbvision-video.c | ||
1012 | @@ -435,6 +435,7 @@ static int usbvision_v4l2_close(struct file *file) | ||
1013 | usbvision_scratch_free(usbvision); | ||
1014 | |||
1015 | usbvision->user--; | ||
1016 | + mutex_unlock(&usbvision->v4l2_lock); | ||
1017 | |||
1018 | if (power_on_at_open) { | ||
1019 | /* power off in a little while | ||
1020 | @@ -448,7 +449,6 @@ static int usbvision_v4l2_close(struct file *file) | ||
1021 | usbvision_release(usbvision); | ||
1022 | return 0; | ||
1023 | } | ||
1024 | - mutex_unlock(&usbvision->v4l2_lock); | ||
1025 | |||
1026 | PDEBUG(DBG_IO, "success"); | ||
1027 | return 0; | ||
1028 | diff --git a/drivers/message/fusion/mptctl.c b/drivers/message/fusion/mptctl.c | ||
1029 | index 70bb7530b22c..fc7393729081 100644 | ||
1030 | --- a/drivers/message/fusion/mptctl.c | ||
1031 | +++ b/drivers/message/fusion/mptctl.c | ||
1032 | @@ -1859,6 +1859,15 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr) | ||
1033 | } | ||
1034 | spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); | ||
1035 | |||
1036 | + /* Basic sanity checks to prevent underflows or integer overflows */ | ||
1037 | + if (karg.maxReplyBytes < 0 || | ||
1038 | + karg.dataInSize < 0 || | ||
1039 | + karg.dataOutSize < 0 || | ||
1040 | + karg.dataSgeOffset < 0 || | ||
1041 | + karg.maxSenseBytes < 0 || | ||
1042 | + karg.dataSgeOffset > ioc->req_sz / 4) | ||
1043 | + return -EINVAL; | ||
1044 | + | ||
1045 | /* Verify that the final request frame will not be too large. | ||
1046 | */ | ||
1047 | sz = karg.dataSgeOffset * 4; | ||
1048 | diff --git a/drivers/mfd/wm5110-tables.c b/drivers/mfd/wm5110-tables.c | ||
1049 | index 4642b5b816a0..6ccc0fdab767 100644 | ||
1050 | --- a/drivers/mfd/wm5110-tables.c | ||
1051 | +++ b/drivers/mfd/wm5110-tables.c | ||
1052 | @@ -249,6 +249,16 @@ static const struct reg_default wm5110_revd_patch[] = { | ||
1053 | { 0x80, 0x0 }, | ||
1054 | }; | ||
1055 | |||
1056 | +/* Add extra headphone write sequence locations */ | ||
1057 | +static const struct reg_default wm5110_reve_patch[] = { | ||
1058 | + { 0x80, 0x3 }, | ||
1059 | + { 0x80, 0x3 }, | ||
1060 | + { 0x4b, 0x138 }, | ||
1061 | + { 0x4c, 0x13d }, | ||
1062 | + { 0x80, 0x0 }, | ||
1063 | + { 0x80, 0x0 }, | ||
1064 | +}; | ||
1065 | + | ||
1066 | /* We use a function so we can use ARRAY_SIZE() */ | ||
1067 | int wm5110_patch(struct arizona *arizona) | ||
1068 | { | ||
1069 | @@ -266,7 +276,9 @@ int wm5110_patch(struct arizona *arizona) | ||
1070 | wm5110_revd_patch, | ||
1071 | ARRAY_SIZE(wm5110_revd_patch)); | ||
1072 | default: | ||
1073 | - return 0; | ||
1074 | + return regmap_register_patch(arizona->regmap, | ||
1075 | + wm5110_reve_patch, | ||
1076 | + ARRAY_SIZE(wm5110_reve_patch)); | ||
1077 | } | ||
1078 | } | ||
1079 | EXPORT_SYMBOL_GPL(wm5110_patch); | ||
1080 | diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
1081 | index 61ebb038fb75..2a6b149d7da3 100644 | ||
1082 | --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
1083 | +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
1084 | @@ -2047,7 +2047,7 @@ int mlx4_multi_func_init(struct mlx4_dev *dev) | ||
1085 | spin_lock_init(&s_state->lock); | ||
1086 | } | ||
1087 | |||
1088 | - memset(&priv->mfunc.master.cmd_eqe, 0, dev->caps.eqe_size); | ||
1089 | + memset(&priv->mfunc.master.cmd_eqe, 0, sizeof(struct mlx4_eqe)); | ||
1090 | priv->mfunc.master.cmd_eqe.type = MLX4_EVENT_TYPE_CMD; | ||
1091 | INIT_WORK(&priv->mfunc.master.comm_work, | ||
1092 | mlx4_master_comm_channel); | ||
1093 | diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c | ||
1094 | index af67e7d410eb..11ef2c2af9bf 100644 | ||
1095 | --- a/drivers/net/ethernet/mellanox/mlx4/eq.c | ||
1096 | +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c | ||
1097 | @@ -185,7 +185,7 @@ static void slave_event(struct mlx4_dev *dev, u8 slave, struct mlx4_eqe *eqe) | ||
1098 | return; | ||
1099 | } | ||
1100 | |||
1101 | - memcpy(s_eqe, eqe, dev->caps.eqe_size - 1); | ||
1102 | + memcpy(s_eqe, eqe, sizeof(struct mlx4_eqe) - 1); | ||
1103 | s_eqe->slave_id = slave; | ||
1104 | /* ensure all information is written before setting the ownersip bit */ | ||
1105 | wmb(); | ||
1106 | diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c | ||
1107 | index a77f05ce8325..63ec209cdfd3 100644 | ||
1108 | --- a/drivers/net/ethernet/sfc/ef10.c | ||
1109 | +++ b/drivers/net/ethernet/sfc/ef10.c | ||
1110 | @@ -1344,7 +1344,9 @@ static void efx_ef10_tx_write(struct efx_tx_queue *tx_queue) | ||
1111 | unsigned int write_ptr; | ||
1112 | efx_qword_t *txd; | ||
1113 | |||
1114 | - BUG_ON(tx_queue->write_count == tx_queue->insert_count); | ||
1115 | + tx_queue->xmit_more_available = false; | ||
1116 | + if (unlikely(tx_queue->write_count == tx_queue->insert_count)) | ||
1117 | + return; | ||
1118 | |||
1119 | do { | ||
1120 | write_ptr = tx_queue->write_count & tx_queue->ptr_mask; | ||
1121 | diff --git a/drivers/net/ethernet/sfc/farch.c b/drivers/net/ethernet/sfc/farch.c | ||
1122 | index 6859437b59fb..b70b865fd19b 100644 | ||
1123 | --- a/drivers/net/ethernet/sfc/farch.c | ||
1124 | +++ b/drivers/net/ethernet/sfc/farch.c | ||
1125 | @@ -316,7 +316,9 @@ void efx_farch_tx_write(struct efx_tx_queue *tx_queue) | ||
1126 | unsigned write_ptr; | ||
1127 | unsigned old_write_count = tx_queue->write_count; | ||
1128 | |||
1129 | - BUG_ON(tx_queue->write_count == tx_queue->insert_count); | ||
1130 | + tx_queue->xmit_more_available = false; | ||
1131 | + if (unlikely(tx_queue->write_count == tx_queue->insert_count)) | ||
1132 | + return; | ||
1133 | |||
1134 | do { | ||
1135 | write_ptr = tx_queue->write_count & tx_queue->ptr_mask; | ||
1136 | diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h | ||
1137 | index 9ede32064685..eda39c82f7e7 100644 | ||
1138 | --- a/drivers/net/ethernet/sfc/net_driver.h | ||
1139 | +++ b/drivers/net/ethernet/sfc/net_driver.h | ||
1140 | @@ -218,6 +218,7 @@ struct efx_tx_buffer { | ||
1141 | * @tso_packets: Number of packets via the TSO xmit path | ||
1142 | * @pushes: Number of times the TX push feature has been used | ||
1143 | * @pio_packets: Number of times the TX PIO feature has been used | ||
1144 | + * @xmit_more_available: Are any packets waiting to be pushed to the NIC | ||
1145 | * @empty_read_count: If the completion path has seen the queue as empty | ||
1146 | * and the transmission path has not yet checked this, the value of | ||
1147 | * @read_count bitwise-added to %EFX_EMPTY_COUNT_VALID; otherwise 0. | ||
1148 | @@ -250,6 +251,7 @@ struct efx_tx_queue { | ||
1149 | unsigned int tso_packets; | ||
1150 | unsigned int pushes; | ||
1151 | unsigned int pio_packets; | ||
1152 | + bool xmit_more_available; | ||
1153 | /* Statistics to supplement MAC stats */ | ||
1154 | unsigned long tx_packets; | ||
1155 | |||
1156 | diff --git a/drivers/net/ethernet/sfc/selftest.c b/drivers/net/ethernet/sfc/selftest.c | ||
1157 | index 10b6173d557d..b605dfd5c7bc 100644 | ||
1158 | --- a/drivers/net/ethernet/sfc/selftest.c | ||
1159 | +++ b/drivers/net/ethernet/sfc/selftest.c | ||
1160 | @@ -46,7 +46,7 @@ struct efx_loopback_payload { | ||
1161 | struct iphdr ip; | ||
1162 | struct udphdr udp; | ||
1163 | __be16 iteration; | ||
1164 | - const char msg[64]; | ||
1165 | + char msg[64]; | ||
1166 | } __packed; | ||
1167 | |||
1168 | /* Loopback test source MAC address */ | ||
1169 | diff --git a/drivers/net/ethernet/sfc/tx.c b/drivers/net/ethernet/sfc/tx.c | ||
1170 | index aaf2987512b5..e70edc3dea7e 100644 | ||
1171 | --- a/drivers/net/ethernet/sfc/tx.c | ||
1172 | +++ b/drivers/net/ethernet/sfc/tx.c | ||
1173 | @@ -431,8 +431,20 @@ finish_packet: | ||
1174 | efx_tx_maybe_stop_queue(tx_queue); | ||
1175 | |||
1176 | /* Pass off to hardware */ | ||
1177 | - if (!skb->xmit_more || netif_xmit_stopped(tx_queue->core_txq)) | ||
1178 | + if (!skb->xmit_more || netif_xmit_stopped(tx_queue->core_txq)) { | ||
1179 | + struct efx_tx_queue *txq2 = efx_tx_queue_partner(tx_queue); | ||
1180 | + | ||
1181 | + /* There could be packets left on the partner queue if those | ||
1182 | + * SKBs had skb->xmit_more set. If we do not push those they | ||
1183 | + * could be left for a long time and cause a netdev watchdog. | ||
1184 | + */ | ||
1185 | + if (txq2->xmit_more_available) | ||
1186 | + efx_nic_push_buffers(txq2); | ||
1187 | + | ||
1188 | efx_nic_push_buffers(tx_queue); | ||
1189 | + } else { | ||
1190 | + tx_queue->xmit_more_available = skb->xmit_more; | ||
1191 | + } | ||
1192 | |||
1193 | tx_queue->tx_packets++; | ||
1194 | |||
1195 | @@ -721,6 +733,7 @@ void efx_init_tx_queue(struct efx_tx_queue *tx_queue) | ||
1196 | tx_queue->read_count = 0; | ||
1197 | tx_queue->old_read_count = 0; | ||
1198 | tx_queue->empty_read_count = 0 | EFX_EMPTY_COUNT_VALID; | ||
1199 | + tx_queue->xmit_more_available = false; | ||
1200 | |||
1201 | /* Set up TX descriptor ring */ | ||
1202 | efx_nic_init_tx(tx_queue); | ||
1203 | @@ -746,6 +759,7 @@ void efx_fini_tx_queue(struct efx_tx_queue *tx_queue) | ||
1204 | |||
1205 | ++tx_queue->read_count; | ||
1206 | } | ||
1207 | + tx_queue->xmit_more_available = false; | ||
1208 | netdev_tx_reset_queue(tx_queue->core_txq); | ||
1209 | } | ||
1210 | |||
1211 | @@ -1301,8 +1315,20 @@ static int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue, | ||
1212 | efx_tx_maybe_stop_queue(tx_queue); | ||
1213 | |||
1214 | /* Pass off to hardware */ | ||
1215 | - if (!skb->xmit_more || netif_xmit_stopped(tx_queue->core_txq)) | ||
1216 | + if (!skb->xmit_more || netif_xmit_stopped(tx_queue->core_txq)) { | ||
1217 | + struct efx_tx_queue *txq2 = efx_tx_queue_partner(tx_queue); | ||
1218 | + | ||
1219 | + /* There could be packets left on the partner queue if those | ||
1220 | + * SKBs had skb->xmit_more set. If we do not push those they | ||
1221 | + * could be left for a long time and cause a netdev watchdog. | ||
1222 | + */ | ||
1223 | + if (txq2->xmit_more_available) | ||
1224 | + efx_nic_push_buffers(txq2); | ||
1225 | + | ||
1226 | efx_nic_push_buffers(tx_queue); | ||
1227 | + } else { | ||
1228 | + tx_queue->xmit_more_available = skb->xmit_more; | ||
1229 | + } | ||
1230 | |||
1231 | tx_queue->tso_bursts++; | ||
1232 | return NETDEV_TX_OK; | ||
1233 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c | ||
1234 | index 3a08a1f78c73..11edb2c9e572 100644 | ||
1235 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c | ||
1236 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c | ||
1237 | @@ -721,10 +721,13 @@ static int stmmac_get_ts_info(struct net_device *dev, | ||
1238 | { | ||
1239 | struct stmmac_priv *priv = netdev_priv(dev); | ||
1240 | |||
1241 | - if ((priv->hwts_tx_en) && (priv->hwts_rx_en)) { | ||
1242 | + if ((priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp)) { | ||
1243 | |||
1244 | - info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | | ||
1245 | + info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE | | ||
1246 | + SOF_TIMESTAMPING_TX_HARDWARE | | ||
1247 | + SOF_TIMESTAMPING_RX_SOFTWARE | | ||
1248 | SOF_TIMESTAMPING_RX_HARDWARE | | ||
1249 | + SOF_TIMESTAMPING_SOFTWARE | | ||
1250 | SOF_TIMESTAMPING_RAW_HARDWARE; | ||
1251 | |||
1252 | if (priv->ptp_clock) | ||
1253 | diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c | ||
1254 | index 91d0c6a86e37..91120f0ed98c 100644 | ||
1255 | --- a/drivers/net/macvtap.c | ||
1256 | +++ b/drivers/net/macvtap.c | ||
1257 | @@ -68,7 +68,7 @@ static const struct proto_ops macvtap_socket_ops; | ||
1258 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ | ||
1259 | NETIF_F_TSO6) | ||
1260 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) | ||
1261 | -#define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG) | ||
1262 | +#define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG | NETIF_F_FRAGLIST) | ||
1263 | |||
1264 | static struct macvlan_dev *macvtap_get_vlan_rcu(const struct net_device *dev) | ||
1265 | { | ||
1266 | diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c | ||
1267 | index 854f2c9a7b2b..64860c041745 100644 | ||
1268 | --- a/drivers/net/phy/broadcom.c | ||
1269 | +++ b/drivers/net/phy/broadcom.c | ||
1270 | @@ -674,7 +674,7 @@ static struct mdio_device_id __maybe_unused broadcom_tbl[] = { | ||
1271 | { PHY_ID_BCM5421, 0xfffffff0 }, | ||
1272 | { PHY_ID_BCM5461, 0xfffffff0 }, | ||
1273 | { PHY_ID_BCM5464, 0xfffffff0 }, | ||
1274 | - { PHY_ID_BCM5482, 0xfffffff0 }, | ||
1275 | + { PHY_ID_BCM5481, 0xfffffff0 }, | ||
1276 | { PHY_ID_BCM5482, 0xfffffff0 }, | ||
1277 | { PHY_ID_BCM50610, 0xfffffff0 }, | ||
1278 | { PHY_ID_BCM50610M, 0xfffffff0 }, | ||
1279 | diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c | ||
1280 | index 6c9c16d76935..5aa563136373 100644 | ||
1281 | --- a/drivers/net/ppp/pppoe.c | ||
1282 | +++ b/drivers/net/ppp/pppoe.c | ||
1283 | @@ -313,7 +313,6 @@ static void pppoe_flush_dev(struct net_device *dev) | ||
1284 | if (po->pppoe_dev == dev && | ||
1285 | sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) { | ||
1286 | pppox_unbind_sock(sk); | ||
1287 | - sk->sk_state = PPPOX_ZOMBIE; | ||
1288 | sk->sk_state_change(sk); | ||
1289 | po->pppoe_dev = NULL; | ||
1290 | dev_put(dev); | ||
1291 | @@ -570,7 +569,7 @@ static int pppoe_release(struct socket *sock) | ||
1292 | |||
1293 | po = pppox_sk(sk); | ||
1294 | |||
1295 | - if (sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) { | ||
1296 | + if (po->pppoe_dev) { | ||
1297 | dev_put(po->pppoe_dev); | ||
1298 | po->pppoe_dev = NULL; | ||
1299 | } | ||
1300 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c | ||
1301 | index b8a82b86f909..a5771515d9ab 100644 | ||
1302 | --- a/drivers/net/usb/qmi_wwan.c | ||
1303 | +++ b/drivers/net/usb/qmi_wwan.c | ||
1304 | @@ -535,6 +535,10 @@ static const struct usb_device_id products[] = { | ||
1305 | USB_CDC_PROTO_NONE), | ||
1306 | .driver_info = (unsigned long)&qmi_wwan_info, | ||
1307 | }, | ||
1308 | + { /* HP lt4112 LTE/HSPA+ Gobi 4G Module (Huawei me906e) */ | ||
1309 | + USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0x581d, USB_CLASS_VENDOR_SPEC, 1, 7), | ||
1310 | + .driver_info = (unsigned long)&qmi_wwan_info, | ||
1311 | + }, | ||
1312 | |||
1313 | /* 3. Combined interface devices matching on interface number */ | ||
1314 | {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ | ||
1315 | @@ -760,12 +764,17 @@ static const struct usb_device_id products[] = { | ||
1316 | {QMI_FIXED_INTF(0x1199, 0x9056, 8)}, /* Sierra Wireless Modem */ | ||
1317 | {QMI_FIXED_INTF(0x1199, 0x9057, 8)}, | ||
1318 | {QMI_FIXED_INTF(0x1199, 0x9061, 8)}, /* Sierra Wireless Modem */ | ||
1319 | + {QMI_FIXED_INTF(0x1199, 0x9070, 8)}, /* Sierra Wireless MC74xx/EM74xx */ | ||
1320 | + {QMI_FIXED_INTF(0x1199, 0x9070, 10)}, /* Sierra Wireless MC74xx/EM74xx */ | ||
1321 | + {QMI_FIXED_INTF(0x1199, 0x9071, 8)}, /* Sierra Wireless MC74xx/EM74xx */ | ||
1322 | + {QMI_FIXED_INTF(0x1199, 0x9071, 10)}, /* Sierra Wireless MC74xx/EM74xx */ | ||
1323 | {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ | ||
1324 | {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ | ||
1325 | {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ | ||
1326 | {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ | ||
1327 | {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */ | ||
1328 | {QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */ | ||
1329 | + {QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */ | ||
1330 | {QMI_FIXED_INTF(0x0b3c, 0xc000, 4)}, /* Olivetti Olicard 100 */ | ||
1331 | {QMI_FIXED_INTF(0x0b3c, 0xc001, 4)}, /* Olivetti Olicard 120 */ | ||
1332 | {QMI_FIXED_INTF(0x0b3c, 0xc002, 4)}, /* Olivetti Olicard 140 */ | ||
1333 | @@ -780,7 +789,6 @@ static const struct usb_device_id products[] = { | ||
1334 | {QMI_FIXED_INTF(0x413c, 0x81a4, 8)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ | ||
1335 | {QMI_FIXED_INTF(0x413c, 0x81a8, 8)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card */ | ||
1336 | {QMI_FIXED_INTF(0x413c, 0x81a9, 8)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */ | ||
1337 | - {QMI_FIXED_INTF(0x03f0, 0x581d, 4)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Module (Huawei me906e) */ | ||
1338 | |||
1339 | /* 4. Gobi 1000 devices */ | ||
1340 | {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | ||
1341 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c | ||
1342 | index 484ecce78025..ce2a29971230 100644 | ||
1343 | --- a/drivers/net/virtio_net.c | ||
1344 | +++ b/drivers/net/virtio_net.c | ||
1345 | @@ -1746,9 +1746,9 @@ static int virtnet_probe(struct virtio_device *vdev) | ||
1346 | /* Do we support "hardware" checksums? */ | ||
1347 | if (virtio_has_feature(vdev, VIRTIO_NET_F_CSUM)) { | ||
1348 | /* This opens up the world of extra features. */ | ||
1349 | - dev->hw_features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST; | ||
1350 | + dev->hw_features |= NETIF_F_HW_CSUM | NETIF_F_SG; | ||
1351 | if (csum) | ||
1352 | - dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST; | ||
1353 | + dev->features |= NETIF_F_HW_CSUM | NETIF_F_SG; | ||
1354 | |||
1355 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) { | ||
1356 | dev->hw_features |= NETIF_F_TSO | ||
1357 | diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c | ||
1358 | index 3bd030494986..ee15a579ec70 100644 | ||
1359 | --- a/drivers/net/wireless/ath/ath9k/init.c | ||
1360 | +++ b/drivers/net/wireless/ath/ath9k/init.c | ||
1361 | @@ -821,6 +821,7 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | ||
1362 | hw->max_rate_tries = 10; | ||
1363 | hw->sta_data_size = sizeof(struct ath_node); | ||
1364 | hw->vif_data_size = sizeof(struct ath_vif); | ||
1365 | + hw->extra_tx_headroom = 4; | ||
1366 | |||
1367 | hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1; | ||
1368 | hw->wiphy->available_antennas_tx = BIT(ah->caps.max_txchains) - 1; | ||
1369 | diff --git a/drivers/net/wireless/iwlwifi/dvm/lib.c b/drivers/net/wireless/iwlwifi/dvm/lib.c | ||
1370 | index cfe1293692fc..b51fb8977104 100644 | ||
1371 | --- a/drivers/net/wireless/iwlwifi/dvm/lib.c | ||
1372 | +++ b/drivers/net/wireless/iwlwifi/dvm/lib.c | ||
1373 | @@ -1022,7 +1022,7 @@ static void iwlagn_wowlan_program_keys(struct ieee80211_hw *hw, | ||
1374 | u8 *pn = seq.ccmp.pn; | ||
1375 | |||
1376 | ieee80211_get_key_rx_seq(key, i, &seq); | ||
1377 | - aes_sc->pn = cpu_to_le64( | ||
1378 | + aes_sc[i].pn = cpu_to_le64( | ||
1379 | (u64)pn[5] | | ||
1380 | ((u64)pn[4] << 8) | | ||
1381 | ((u64)pn[3] << 16) | | ||
1382 | diff --git a/drivers/net/wireless/iwlwifi/iwl-7000.c b/drivers/net/wireless/iwlwifi/iwl-7000.c | ||
1383 | index b04b8858c690..9dfd1d1106d7 100644 | ||
1384 | --- a/drivers/net/wireless/iwlwifi/iwl-7000.c | ||
1385 | +++ b/drivers/net/wireless/iwlwifi/iwl-7000.c | ||
1386 | @@ -102,6 +102,9 @@ | ||
1387 | #define IWL7265_FW_PRE "iwlwifi-7265-" | ||
1388 | #define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" | ||
1389 | |||
1390 | +#define IWL7265D_FW_PRE "iwlwifi-7265D-" | ||
1391 | +#define IWL7265D_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" | ||
1392 | + | ||
1393 | #define NVM_HW_SECTION_NUM_FAMILY_7000 0 | ||
1394 | |||
1395 | static const struct iwl_base_params iwl7000_base_params = { | ||
1396 | @@ -267,7 +270,37 @@ const struct iwl_cfg iwl7265_n_cfg = { | ||
1397 | .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, | ||
1398 | }; | ||
1399 | |||
1400 | +const struct iwl_cfg iwl7265d_2ac_cfg = { | ||
1401 | + .name = "Intel(R) Dual Band Wireless AC 7265", | ||
1402 | + .fw_name_pre = IWL7265D_FW_PRE, | ||
1403 | + IWL_DEVICE_7000, | ||
1404 | + .ht_params = &iwl7265_ht_params, | ||
1405 | + .nvm_ver = IWL7265_NVM_VERSION, | ||
1406 | + .nvm_calib_ver = IWL7265_TX_POWER_VERSION, | ||
1407 | + .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, | ||
1408 | +}; | ||
1409 | + | ||
1410 | +const struct iwl_cfg iwl7265d_2n_cfg = { | ||
1411 | + .name = "Intel(R) Dual Band Wireless N 7265", | ||
1412 | + .fw_name_pre = IWL7265D_FW_PRE, | ||
1413 | + IWL_DEVICE_7000, | ||
1414 | + .ht_params = &iwl7265_ht_params, | ||
1415 | + .nvm_ver = IWL7265_NVM_VERSION, | ||
1416 | + .nvm_calib_ver = IWL7265_TX_POWER_VERSION, | ||
1417 | + .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, | ||
1418 | +}; | ||
1419 | + | ||
1420 | +const struct iwl_cfg iwl7265d_n_cfg = { | ||
1421 | + .name = "Intel(R) Wireless N 7265", | ||
1422 | + .fw_name_pre = IWL7265D_FW_PRE, | ||
1423 | + IWL_DEVICE_7000, | ||
1424 | + .ht_params = &iwl7265_ht_params, | ||
1425 | + .nvm_ver = IWL7265_NVM_VERSION, | ||
1426 | + .nvm_calib_ver = IWL7265_TX_POWER_VERSION, | ||
1427 | + .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, | ||
1428 | +}; | ||
1429 | + | ||
1430 | MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); | ||
1431 | -MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL3160_UCODE_API_OK)); | ||
1432 | -MODULE_FIRMWARE(IWL3165_MODULE_FIRMWARE(IWL3160_UCODE_API_OK)); | ||
1433 | +MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); | ||
1434 | MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); | ||
1435 | +MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); | ||
1436 | diff --git a/drivers/net/wireless/iwlwifi/iwl-config.h b/drivers/net/wireless/iwlwifi/iwl-config.h | ||
1437 | index 2ef83a39ff10..6cc051cace5d 100644 | ||
1438 | --- a/drivers/net/wireless/iwlwifi/iwl-config.h | ||
1439 | +++ b/drivers/net/wireless/iwlwifi/iwl-config.h | ||
1440 | @@ -346,6 +346,9 @@ extern const struct iwl_cfg iwl3165_2ac_cfg; | ||
1441 | extern const struct iwl_cfg iwl7265_2ac_cfg; | ||
1442 | extern const struct iwl_cfg iwl7265_2n_cfg; | ||
1443 | extern const struct iwl_cfg iwl7265_n_cfg; | ||
1444 | +extern const struct iwl_cfg iwl7265d_2ac_cfg; | ||
1445 | +extern const struct iwl_cfg iwl7265d_2n_cfg; | ||
1446 | +extern const struct iwl_cfg iwl7265d_n_cfg; | ||
1447 | extern const struct iwl_cfg iwl8260_2n_cfg; | ||
1448 | extern const struct iwl_cfg iwl8260_2ac_cfg; | ||
1449 | extern const struct iwl_cfg iwl8260_2ac_sdio_cfg; | ||
1450 | diff --git a/drivers/net/wireless/iwlwifi/iwl-csr.h b/drivers/net/wireless/iwlwifi/iwl-csr.h | ||
1451 | index 3f6f015285e5..671bdbca33ee 100644 | ||
1452 | --- a/drivers/net/wireless/iwlwifi/iwl-csr.h | ||
1453 | +++ b/drivers/net/wireless/iwlwifi/iwl-csr.h | ||
1454 | @@ -305,23 +305,24 @@ enum { | ||
1455 | }; | ||
1456 | |||
1457 | |||
1458 | -#define CSR_HW_REV_TYPE_MSK (0x000FFF0) | ||
1459 | -#define CSR_HW_REV_TYPE_5300 (0x0000020) | ||
1460 | -#define CSR_HW_REV_TYPE_5350 (0x0000030) | ||
1461 | -#define CSR_HW_REV_TYPE_5100 (0x0000050) | ||
1462 | -#define CSR_HW_REV_TYPE_5150 (0x0000040) | ||
1463 | -#define CSR_HW_REV_TYPE_1000 (0x0000060) | ||
1464 | -#define CSR_HW_REV_TYPE_6x00 (0x0000070) | ||
1465 | -#define CSR_HW_REV_TYPE_6x50 (0x0000080) | ||
1466 | -#define CSR_HW_REV_TYPE_6150 (0x0000084) | ||
1467 | -#define CSR_HW_REV_TYPE_6x05 (0x00000B0) | ||
1468 | -#define CSR_HW_REV_TYPE_6x30 CSR_HW_REV_TYPE_6x05 | ||
1469 | -#define CSR_HW_REV_TYPE_6x35 CSR_HW_REV_TYPE_6x05 | ||
1470 | -#define CSR_HW_REV_TYPE_2x30 (0x00000C0) | ||
1471 | -#define CSR_HW_REV_TYPE_2x00 (0x0000100) | ||
1472 | -#define CSR_HW_REV_TYPE_105 (0x0000110) | ||
1473 | -#define CSR_HW_REV_TYPE_135 (0x0000120) | ||
1474 | -#define CSR_HW_REV_TYPE_NONE (0x00001F0) | ||
1475 | +#define CSR_HW_REV_TYPE_MSK (0x000FFF0) | ||
1476 | +#define CSR_HW_REV_TYPE_5300 (0x0000020) | ||
1477 | +#define CSR_HW_REV_TYPE_5350 (0x0000030) | ||
1478 | +#define CSR_HW_REV_TYPE_5100 (0x0000050) | ||
1479 | +#define CSR_HW_REV_TYPE_5150 (0x0000040) | ||
1480 | +#define CSR_HW_REV_TYPE_1000 (0x0000060) | ||
1481 | +#define CSR_HW_REV_TYPE_6x00 (0x0000070) | ||
1482 | +#define CSR_HW_REV_TYPE_6x50 (0x0000080) | ||
1483 | +#define CSR_HW_REV_TYPE_6150 (0x0000084) | ||
1484 | +#define CSR_HW_REV_TYPE_6x05 (0x00000B0) | ||
1485 | +#define CSR_HW_REV_TYPE_6x30 CSR_HW_REV_TYPE_6x05 | ||
1486 | +#define CSR_HW_REV_TYPE_6x35 CSR_HW_REV_TYPE_6x05 | ||
1487 | +#define CSR_HW_REV_TYPE_2x30 (0x00000C0) | ||
1488 | +#define CSR_HW_REV_TYPE_2x00 (0x0000100) | ||
1489 | +#define CSR_HW_REV_TYPE_105 (0x0000110) | ||
1490 | +#define CSR_HW_REV_TYPE_135 (0x0000120) | ||
1491 | +#define CSR_HW_REV_TYPE_7265D (0x0000210) | ||
1492 | +#define CSR_HW_REV_TYPE_NONE (0x00001F0) | ||
1493 | |||
1494 | /* EEPROM REG */ | ||
1495 | #define CSR_EEPROM_REG_READ_VALID_MSK (0x00000001) | ||
1496 | diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c | ||
1497 | index c17be0fb7283..8da34a5d024f 100644 | ||
1498 | --- a/drivers/net/wireless/iwlwifi/mvm/d3.c | ||
1499 | +++ b/drivers/net/wireless/iwlwifi/mvm/d3.c | ||
1500 | @@ -298,12 +298,12 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, | ||
1501 | u8 *pn = seq.ccmp.pn; | ||
1502 | |||
1503 | ieee80211_get_key_rx_seq(key, i, &seq); | ||
1504 | - aes_sc->pn = cpu_to_le64((u64)pn[5] | | ||
1505 | - ((u64)pn[4] << 8) | | ||
1506 | - ((u64)pn[3] << 16) | | ||
1507 | - ((u64)pn[2] << 24) | | ||
1508 | - ((u64)pn[1] << 32) | | ||
1509 | - ((u64)pn[0] << 40)); | ||
1510 | + aes_sc[i].pn = cpu_to_le64((u64)pn[5] | | ||
1511 | + ((u64)pn[4] << 8) | | ||
1512 | + ((u64)pn[3] << 16) | | ||
1513 | + ((u64)pn[2] << 24) | | ||
1514 | + ((u64)pn[1] << 32) | | ||
1515 | + ((u64)pn[0] << 40)); | ||
1516 | } | ||
1517 | data->use_rsc_tsc = true; | ||
1518 | break; | ||
1519 | diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c | ||
1520 | index 05cba8c05d3f..a2f624d5771d 100644 | ||
1521 | --- a/drivers/net/wireless/iwlwifi/pcie/drv.c | ||
1522 | +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c | ||
1523 | @@ -410,6 +410,11 @@ static const struct pci_device_id iwl_hw_card_ids[] = { | ||
1524 | {IWL_PCI_DEVICE(0x095A, 0x5590, iwl7265_2ac_cfg)}, | ||
1525 | {IWL_PCI_DEVICE(0x095B, 0x5290, iwl7265_2ac_cfg)}, | ||
1526 | {IWL_PCI_DEVICE(0x095A, 0x5490, iwl7265_2ac_cfg)}, | ||
1527 | + {IWL_PCI_DEVICE(0x095A, 0x5F10, iwl7265_2ac_cfg)}, | ||
1528 | + {IWL_PCI_DEVICE(0x095B, 0x5212, iwl7265_2ac_cfg)}, | ||
1529 | + {IWL_PCI_DEVICE(0x095B, 0x520A, iwl7265_2ac_cfg)}, | ||
1530 | + {IWL_PCI_DEVICE(0x095A, 0x9000, iwl7265_2ac_cfg)}, | ||
1531 | + {IWL_PCI_DEVICE(0x095A, 0x9400, iwl7265_2ac_cfg)}, | ||
1532 | |||
1533 | /* 8000 Series */ | ||
1534 | {IWL_PCI_DEVICE(0x24F3, 0x0010, iwl8260_2ac_cfg)}, | ||
1535 | @@ -503,6 +508,7 @@ static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev) {} | ||
1536 | static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
1537 | { | ||
1538 | const struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data); | ||
1539 | + const struct iwl_cfg *cfg_7265d __maybe_unused = NULL; | ||
1540 | struct iwl_trans *iwl_trans; | ||
1541 | struct iwl_trans_pcie *trans_pcie; | ||
1542 | int ret; | ||
1543 | @@ -511,6 +517,25 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
1544 | if (IS_ERR(iwl_trans)) | ||
1545 | return PTR_ERR(iwl_trans); | ||
1546 | |||
1547 | +#if IS_ENABLED(CONFIG_IWLMVM) | ||
1548 | + /* | ||
1549 | + * special-case 7265D, it has the same PCI IDs. | ||
1550 | + * | ||
1551 | + * Note that because we already pass the cfg to the transport above, | ||
1552 | + * all the parameters that the transport uses must, until that is | ||
1553 | + * changed, be identical to the ones in the 7265D configuration. | ||
1554 | + */ | ||
1555 | + if (cfg == &iwl7265_2ac_cfg) | ||
1556 | + cfg_7265d = &iwl7265d_2ac_cfg; | ||
1557 | + else if (cfg == &iwl7265_2n_cfg) | ||
1558 | + cfg_7265d = &iwl7265d_2n_cfg; | ||
1559 | + else if (cfg == &iwl7265_n_cfg) | ||
1560 | + cfg_7265d = &iwl7265d_n_cfg; | ||
1561 | + if (cfg_7265d && | ||
1562 | + (iwl_trans->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_7265D) | ||
1563 | + cfg = cfg_7265d; | ||
1564 | +#endif | ||
1565 | + | ||
1566 | pci_set_drvdata(pdev, iwl_trans); | ||
1567 | |||
1568 | trans_pcie = IWL_TRANS_GET_PCIE_TRANS(iwl_trans); | ||
1569 | diff --git a/drivers/pci/access.c b/drivers/pci/access.c | ||
1570 | index 49dd766852ba..7f249b9ab2ce 100644 | ||
1571 | --- a/drivers/pci/access.c | ||
1572 | +++ b/drivers/pci/access.c | ||
1573 | @@ -352,6 +352,56 @@ static const struct pci_vpd_ops pci_vpd_pci22_ops = { | ||
1574 | .release = pci_vpd_pci22_release, | ||
1575 | }; | ||
1576 | |||
1577 | +static ssize_t pci_vpd_f0_read(struct pci_dev *dev, loff_t pos, size_t count, | ||
1578 | + void *arg) | ||
1579 | +{ | ||
1580 | + struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn)); | ||
1581 | + ssize_t ret; | ||
1582 | + | ||
1583 | + if (!tdev) | ||
1584 | + return -ENODEV; | ||
1585 | + | ||
1586 | + ret = pci_read_vpd(tdev, pos, count, arg); | ||
1587 | + pci_dev_put(tdev); | ||
1588 | + return ret; | ||
1589 | +} | ||
1590 | + | ||
1591 | +static ssize_t pci_vpd_f0_write(struct pci_dev *dev, loff_t pos, size_t count, | ||
1592 | + const void *arg) | ||
1593 | +{ | ||
1594 | + struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn)); | ||
1595 | + ssize_t ret; | ||
1596 | + | ||
1597 | + if (!tdev) | ||
1598 | + return -ENODEV; | ||
1599 | + | ||
1600 | + ret = pci_write_vpd(tdev, pos, count, arg); | ||
1601 | + pci_dev_put(tdev); | ||
1602 | + return ret; | ||
1603 | +} | ||
1604 | + | ||
1605 | +static const struct pci_vpd_ops pci_vpd_f0_ops = { | ||
1606 | + .read = pci_vpd_f0_read, | ||
1607 | + .write = pci_vpd_f0_write, | ||
1608 | + .release = pci_vpd_pci22_release, | ||
1609 | +}; | ||
1610 | + | ||
1611 | +static int pci_vpd_f0_dev_check(struct pci_dev *dev) | ||
1612 | +{ | ||
1613 | + struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn)); | ||
1614 | + int ret = 0; | ||
1615 | + | ||
1616 | + if (!tdev) | ||
1617 | + return -ENODEV; | ||
1618 | + if (!tdev->vpd || !tdev->multifunction || | ||
1619 | + dev->class != tdev->class || dev->vendor != tdev->vendor || | ||
1620 | + dev->device != tdev->device) | ||
1621 | + ret = -ENODEV; | ||
1622 | + | ||
1623 | + pci_dev_put(tdev); | ||
1624 | + return ret; | ||
1625 | +} | ||
1626 | + | ||
1627 | int pci_vpd_pci22_init(struct pci_dev *dev) | ||
1628 | { | ||
1629 | struct pci_vpd_pci22 *vpd; | ||
1630 | @@ -360,12 +410,21 @@ int pci_vpd_pci22_init(struct pci_dev *dev) | ||
1631 | cap = pci_find_capability(dev, PCI_CAP_ID_VPD); | ||
1632 | if (!cap) | ||
1633 | return -ENODEV; | ||
1634 | + if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0) { | ||
1635 | + int ret = pci_vpd_f0_dev_check(dev); | ||
1636 | + | ||
1637 | + if (ret) | ||
1638 | + return ret; | ||
1639 | + } | ||
1640 | vpd = kzalloc(sizeof(*vpd), GFP_ATOMIC); | ||
1641 | if (!vpd) | ||
1642 | return -ENOMEM; | ||
1643 | |||
1644 | vpd->base.len = PCI_VPD_PCI22_SIZE; | ||
1645 | - vpd->base.ops = &pci_vpd_pci22_ops; | ||
1646 | + if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0) | ||
1647 | + vpd->base.ops = &pci_vpd_f0_ops; | ||
1648 | + else | ||
1649 | + vpd->base.ops = &pci_vpd_pci22_ops; | ||
1650 | mutex_init(&vpd->lock); | ||
1651 | vpd->cap = cap; | ||
1652 | vpd->busy = false; | ||
1653 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c | ||
1654 | index ff7af33f2353..ce0aa47222f6 100644 | ||
1655 | --- a/drivers/pci/pci.c | ||
1656 | +++ b/drivers/pci/pci.c | ||
1657 | @@ -3206,7 +3206,7 @@ static int pci_pm_reset(struct pci_dev *dev, int probe) | ||
1658 | { | ||
1659 | u16 csr; | ||
1660 | |||
1661 | - if (!dev->pm_cap) | ||
1662 | + if (!dev->pm_cap || dev->dev_flags & PCI_DEV_FLAGS_NO_PM_RESET) | ||
1663 | return -ENOTTY; | ||
1664 | |||
1665 | pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &csr); | ||
1666 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c | ||
1667 | index 00b1cd32a4b1..b6d646a97494 100644 | ||
1668 | --- a/drivers/pci/quirks.c | ||
1669 | +++ b/drivers/pci/quirks.c | ||
1670 | @@ -1883,6 +1883,15 @@ static void quirk_netmos(struct pci_dev *dev) | ||
1671 | DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, | ||
1672 | PCI_CLASS_COMMUNICATION_SERIAL, 8, quirk_netmos); | ||
1673 | |||
1674 | +static void quirk_f0_vpd_link(struct pci_dev *dev) | ||
1675 | +{ | ||
1676 | + if (!dev->multifunction || !PCI_FUNC(dev->devfn)) | ||
1677 | + return; | ||
1678 | + dev->dev_flags |= PCI_DEV_FLAGS_VPD_REF_F0; | ||
1679 | +} | ||
1680 | +DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, | ||
1681 | + PCI_CLASS_NETWORK_ETHERNET, 8, quirk_f0_vpd_link); | ||
1682 | + | ||
1683 | static void quirk_e100_interrupt(struct pci_dev *dev) | ||
1684 | { | ||
1685 | u16 command, pmcsr; | ||
1686 | diff --git a/drivers/power/bq24190_charger.c b/drivers/power/bq24190_charger.c | ||
1687 | index e4c95e1a6733..d0e8236a6404 100644 | ||
1688 | --- a/drivers/power/bq24190_charger.c | ||
1689 | +++ b/drivers/power/bq24190_charger.c | ||
1690 | @@ -1208,7 +1208,7 @@ static irqreturn_t bq24190_irq_handler_thread(int irq, void *data) | ||
1691 | { | ||
1692 | struct bq24190_dev_info *bdi = data; | ||
1693 | bool alert_userspace = false; | ||
1694 | - u8 ss_reg, f_reg; | ||
1695 | + u8 ss_reg = 0, f_reg = 0; | ||
1696 | int ret; | ||
1697 | |||
1698 | pm_runtime_get_sync(bdi->dev); | ||
1699 | diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c | ||
1700 | index 75ffe9980c3e..7c511add5aa7 100644 | ||
1701 | --- a/drivers/s390/char/con3270.c | ||
1702 | +++ b/drivers/s390/char/con3270.c | ||
1703 | @@ -413,6 +413,10 @@ con3270_irq(struct con3270 *cp, struct raw3270_request *rq, struct irb *irb) | ||
1704 | else | ||
1705 | /* Normal end. Copy residual count. */ | ||
1706 | rq->rescnt = irb->scsw.cmd.count; | ||
1707 | + } else if (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) { | ||
1708 | + /* Interrupt without an outstanding request -> update all */ | ||
1709 | + cp->update_flags = CON_UPDATE_ALL; | ||
1710 | + con3270_set_timer(cp, 1); | ||
1711 | } | ||
1712 | return RAW3270_IO_DONE; | ||
1713 | } | ||
1714 | diff --git a/drivers/s390/char/tty3270.c b/drivers/s390/char/tty3270.c | ||
1715 | index e91b89dc6d1f..e96fc7fd9498 100644 | ||
1716 | --- a/drivers/s390/char/tty3270.c | ||
1717 | +++ b/drivers/s390/char/tty3270.c | ||
1718 | @@ -659,6 +659,10 @@ tty3270_irq(struct tty3270 *tp, struct raw3270_request *rq, struct irb *irb) | ||
1719 | else | ||
1720 | /* Normal end. Copy residual count. */ | ||
1721 | rq->rescnt = irb->scsw.cmd.count; | ||
1722 | + } else if (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) { | ||
1723 | + /* Interrupt without an outstanding request -> update all */ | ||
1724 | + tp->update_flags = TTY_UPDATE_ALL; | ||
1725 | + tty3270_set_timer(tp, 1); | ||
1726 | } | ||
1727 | return RAW3270_IO_DONE; | ||
1728 | } | ||
1729 | diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c | ||
1730 | index 0eb2da8a696f..89215d44d83f 100644 | ||
1731 | --- a/drivers/scsi/mvsas/mv_sas.c | ||
1732 | +++ b/drivers/scsi/mvsas/mv_sas.c | ||
1733 | @@ -988,6 +988,8 @@ static void mvs_slot_free(struct mvs_info *mvi, u32 rx_desc) | ||
1734 | static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task, | ||
1735 | struct mvs_slot_info *slot, u32 slot_idx) | ||
1736 | { | ||
1737 | + if (!slot) | ||
1738 | + return; | ||
1739 | if (!slot->task) | ||
1740 | return; | ||
1741 | if (!sas_protocol_ata(task->task_proto)) | ||
1742 | diff --git a/drivers/staging/iio/adc/mxs-lradc.c b/drivers/staging/iio/adc/mxs-lradc.c | ||
1743 | index ffd42071a12e..6050c58db682 100644 | ||
1744 | --- a/drivers/staging/iio/adc/mxs-lradc.c | ||
1745 | +++ b/drivers/staging/iio/adc/mxs-lradc.c | ||
1746 | @@ -910,11 +910,12 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev, | ||
1747 | case IIO_CHAN_INFO_OFFSET: | ||
1748 | if (chan->type == IIO_TEMP) { | ||
1749 | /* The calculated value from the ADC is in Kelvin, we | ||
1750 | - * want Celsius for hwmon so the offset is | ||
1751 | - * -272.15 * scale | ||
1752 | + * want Celsius for hwmon so the offset is -273.15 | ||
1753 | + * The offset is applied before scaling so it is | ||
1754 | + * actually -213.15 * 4 / 1.012 = -1079.644268 | ||
1755 | */ | ||
1756 | - *val = -1075; | ||
1757 | - *val2 = 691699; | ||
1758 | + *val = -1079; | ||
1759 | + *val2 = 644268; | ||
1760 | |||
1761 | return IIO_VAL_INT_PLUS_MICRO; | ||
1762 | } | ||
1763 | diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c | ||
1764 | index 439bd1a5d00c..422773242917 100644 | ||
1765 | --- a/drivers/tty/serial/8250/8250_pci.c | ||
1766 | +++ b/drivers/tty/serial/8250/8250_pci.c | ||
1767 | @@ -1815,6 +1815,9 @@ pci_wch_ch353_setup(struct serial_private *priv, | ||
1768 | #define PCI_DEVICE_ID_SUNIX_1999 0x1999 | ||
1769 | |||
1770 | |||
1771 | +#define PCI_DEVICE_ID_EXAR_XR17V4358 0x4358 | ||
1772 | +#define PCI_DEVICE_ID_EXAR_XR17V8358 0x8358 | ||
1773 | + | ||
1774 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ | ||
1775 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 | ||
1776 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588 | ||
1777 | @@ -2323,6 +2326,20 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { | ||
1778 | .subdevice = PCI_ANY_ID, | ||
1779 | .setup = pci_xr17v35x_setup, | ||
1780 | }, | ||
1781 | + { | ||
1782 | + .vendor = PCI_VENDOR_ID_EXAR, | ||
1783 | + .device = PCI_DEVICE_ID_EXAR_XR17V4358, | ||
1784 | + .subvendor = PCI_ANY_ID, | ||
1785 | + .subdevice = PCI_ANY_ID, | ||
1786 | + .setup = pci_xr17v35x_setup, | ||
1787 | + }, | ||
1788 | + { | ||
1789 | + .vendor = PCI_VENDOR_ID_EXAR, | ||
1790 | + .device = PCI_DEVICE_ID_EXAR_XR17V8358, | ||
1791 | + .subvendor = PCI_ANY_ID, | ||
1792 | + .subdevice = PCI_ANY_ID, | ||
1793 | + .setup = pci_xr17v35x_setup, | ||
1794 | + }, | ||
1795 | /* | ||
1796 | * Xircom cards | ||
1797 | */ | ||
1798 | @@ -2771,6 +2788,8 @@ enum pci_board_num_t { | ||
1799 | pbn_exar_XR17V352, | ||
1800 | pbn_exar_XR17V354, | ||
1801 | pbn_exar_XR17V358, | ||
1802 | + pbn_exar_XR17V4358, | ||
1803 | + pbn_exar_XR17V8358, | ||
1804 | pbn_exar_ibm_saturn, | ||
1805 | pbn_pasemi_1682M, | ||
1806 | pbn_ni8430_2, | ||
1807 | @@ -3440,6 +3459,22 @@ static struct pciserial_board pci_boards[] = { | ||
1808 | .reg_shift = 0, | ||
1809 | .first_offset = 0, | ||
1810 | }, | ||
1811 | + [pbn_exar_XR17V4358] = { | ||
1812 | + .flags = FL_BASE0, | ||
1813 | + .num_ports = 12, | ||
1814 | + .base_baud = 7812500, | ||
1815 | + .uart_offset = 0x400, | ||
1816 | + .reg_shift = 0, | ||
1817 | + .first_offset = 0, | ||
1818 | + }, | ||
1819 | + [pbn_exar_XR17V8358] = { | ||
1820 | + .flags = FL_BASE0, | ||
1821 | + .num_ports = 16, | ||
1822 | + .base_baud = 7812500, | ||
1823 | + .uart_offset = 0x400, | ||
1824 | + .reg_shift = 0, | ||
1825 | + .first_offset = 0, | ||
1826 | + }, | ||
1827 | [pbn_exar_ibm_saturn] = { | ||
1828 | .flags = FL_BASE0, | ||
1829 | .num_ports = 1, | ||
1830 | @@ -4808,7 +4843,7 @@ static struct pci_device_id serial_pci_tbl[] = { | ||
1831 | 0, | ||
1832 | 0, pbn_exar_XR17C158 }, | ||
1833 | /* | ||
1834 | - * Exar Corp. XR17V35[248] Dual/Quad/Octal PCIe UARTs | ||
1835 | + * Exar Corp. XR17V[48]35[248] Dual/Quad/Octal/Hexa PCIe UARTs | ||
1836 | */ | ||
1837 | { PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17V352, | ||
1838 | PCI_ANY_ID, PCI_ANY_ID, | ||
1839 | @@ -4822,7 +4857,14 @@ static struct pci_device_id serial_pci_tbl[] = { | ||
1840 | PCI_ANY_ID, PCI_ANY_ID, | ||
1841 | 0, | ||
1842 | 0, pbn_exar_XR17V358 }, | ||
1843 | - | ||
1844 | + { PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17V4358, | ||
1845 | + PCI_ANY_ID, PCI_ANY_ID, | ||
1846 | + 0, | ||
1847 | + 0, pbn_exar_XR17V4358 }, | ||
1848 | + { PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17V8358, | ||
1849 | + PCI_ANY_ID, PCI_ANY_ID, | ||
1850 | + 0, | ||
1851 | + 0, pbn_exar_XR17V8358 }, | ||
1852 | /* | ||
1853 | * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke) | ||
1854 | */ | ||
1855 | diff --git a/drivers/usb/chipidea/debug.c b/drivers/usb/chipidea/debug.c | ||
1856 | index 795d6538d630..4188cacaf100 100644 | ||
1857 | --- a/drivers/usb/chipidea/debug.c | ||
1858 | +++ b/drivers/usb/chipidea/debug.c | ||
1859 | @@ -66,9 +66,11 @@ static int ci_port_test_show(struct seq_file *s, void *data) | ||
1860 | unsigned long flags; | ||
1861 | unsigned mode; | ||
1862 | |||
1863 | + pm_runtime_get_sync(ci->dev); | ||
1864 | spin_lock_irqsave(&ci->lock, flags); | ||
1865 | mode = hw_port_test_get(ci); | ||
1866 | spin_unlock_irqrestore(&ci->lock, flags); | ||
1867 | + pm_runtime_put_sync(ci->dev); | ||
1868 | |||
1869 | seq_printf(s, "mode = %u\n", mode); | ||
1870 | |||
1871 | @@ -94,9 +96,11 @@ static ssize_t ci_port_test_write(struct file *file, const char __user *ubuf, | ||
1872 | if (sscanf(buf, "%u", &mode) != 1) | ||
1873 | return -EINVAL; | ||
1874 | |||
1875 | + pm_runtime_get_sync(ci->dev); | ||
1876 | spin_lock_irqsave(&ci->lock, flags); | ||
1877 | ret = hw_port_test_set(ci, mode); | ||
1878 | spin_unlock_irqrestore(&ci->lock, flags); | ||
1879 | + pm_runtime_put_sync(ci->dev); | ||
1880 | |||
1881 | return ret ? ret : count; | ||
1882 | } | ||
1883 | @@ -312,8 +316,10 @@ static ssize_t ci_role_write(struct file *file, const char __user *ubuf, | ||
1884 | if (role == CI_ROLE_END || role == ci->role) | ||
1885 | return -EINVAL; | ||
1886 | |||
1887 | + pm_runtime_get_sync(ci->dev); | ||
1888 | ci_role_stop(ci); | ||
1889 | ret = ci_role_start(ci, role); | ||
1890 | + pm_runtime_put_sync(ci->dev); | ||
1891 | |||
1892 | return ret ? ret : count; | ||
1893 | } | ||
1894 | diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c | ||
1895 | index ec978408a2ee..49978cc495e9 100644 | ||
1896 | --- a/drivers/usb/class/usbtmc.c | ||
1897 | +++ b/drivers/usb/class/usbtmc.c | ||
1898 | @@ -109,6 +109,7 @@ struct usbtmc_ID_rigol_quirk { | ||
1899 | |||
1900 | static const struct usbtmc_ID_rigol_quirk usbtmc_id_quirk[] = { | ||
1901 | { 0x1ab1, 0x0588 }, | ||
1902 | + { 0x1ab1, 0x04b0 }, | ||
1903 | { 0, 0 } | ||
1904 | }; | ||
1905 | |||
1906 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
1907 | index 2af32e26fafc..7e5c90eebb9c 100644 | ||
1908 | --- a/drivers/usb/host/xhci-pci.c | ||
1909 | +++ b/drivers/usb/host/xhci-pci.c | ||
1910 | @@ -135,6 +135,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
1911 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && | ||
1912 | pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI) { | ||
1913 | xhci->quirks |= XHCI_SPURIOUS_REBOOT; | ||
1914 | + xhci->quirks |= XHCI_SPURIOUS_WAKEUP; | ||
1915 | } | ||
1916 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && | ||
1917 | (pdev->device == PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI || | ||
1918 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
1919 | index 136259bc93b8..1e5fb8cfc9e3 100644 | ||
1920 | --- a/drivers/usb/host/xhci-ring.c | ||
1921 | +++ b/drivers/usb/host/xhci-ring.c | ||
1922 | @@ -2238,6 +2238,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, | ||
1923 | u32 trb_comp_code; | ||
1924 | int ret = 0; | ||
1925 | int td_num = 0; | ||
1926 | + bool handling_skipped_tds = false; | ||
1927 | |||
1928 | slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags)); | ||
1929 | xdev = xhci->devs[slot_id]; | ||
1930 | @@ -2371,6 +2372,10 @@ static int handle_tx_event(struct xhci_hcd *xhci, | ||
1931 | ep->skip = true; | ||
1932 | xhci_dbg(xhci, "Miss service interval error, set skip flag\n"); | ||
1933 | goto cleanup; | ||
1934 | + case COMP_PING_ERR: | ||
1935 | + ep->skip = true; | ||
1936 | + xhci_dbg(xhci, "No Ping response error, Skip one Isoc TD\n"); | ||
1937 | + goto cleanup; | ||
1938 | default: | ||
1939 | if (xhci_is_vendor_info_code(xhci, trb_comp_code)) { | ||
1940 | status = 0; | ||
1941 | @@ -2507,13 +2512,18 @@ static int handle_tx_event(struct xhci_hcd *xhci, | ||
1942 | ep, &status); | ||
1943 | |||
1944 | cleanup: | ||
1945 | + | ||
1946 | + | ||
1947 | + handling_skipped_tds = ep->skip && | ||
1948 | + trb_comp_code != COMP_MISSED_INT && | ||
1949 | + trb_comp_code != COMP_PING_ERR; | ||
1950 | + | ||
1951 | /* | ||
1952 | - * Do not update event ring dequeue pointer if ep->skip is set. | ||
1953 | - * Will roll back to continue process missed tds. | ||
1954 | + * Do not update event ring dequeue pointer if we're in a loop | ||
1955 | + * processing missed tds. | ||
1956 | */ | ||
1957 | - if (trb_comp_code == COMP_MISSED_INT || !ep->skip) { | ||
1958 | + if (!handling_skipped_tds) | ||
1959 | inc_deq(xhci, xhci->event_ring); | ||
1960 | - } | ||
1961 | |||
1962 | if (ret) { | ||
1963 | urb = td->urb; | ||
1964 | @@ -2548,7 +2558,7 @@ cleanup: | ||
1965 | * Process them as short transfer until reach the td pointed by | ||
1966 | * the event. | ||
1967 | */ | ||
1968 | - } while (ep->skip && trb_comp_code != COMP_MISSED_INT); | ||
1969 | + } while (handling_skipped_tds); | ||
1970 | |||
1971 | return 0; | ||
1972 | } | ||
1973 | diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c | ||
1974 | index d59b232614d5..8dfd86771fac 100644 | ||
1975 | --- a/drivers/usb/musb/musb_cppi41.c | ||
1976 | +++ b/drivers/usb/musb/musb_cppi41.c | ||
1977 | @@ -541,10 +541,18 @@ static int cppi41_dma_channel_abort(struct dma_channel *channel) | ||
1978 | csr &= ~MUSB_TXCSR_DMAENAB; | ||
1979 | musb_writew(epio, MUSB_TXCSR, csr); | ||
1980 | } else { | ||
1981 | + cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREQ_NONE); | ||
1982 | + | ||
1983 | + /* delay to drain to cppi dma pipeline for isoch */ | ||
1984 | + udelay(250); | ||
1985 | + | ||
1986 | csr = musb_readw(epio, MUSB_RXCSR); | ||
1987 | csr &= ~(MUSB_RXCSR_H_REQPKT | MUSB_RXCSR_DMAENAB); | ||
1988 | musb_writew(epio, MUSB_RXCSR, csr); | ||
1989 | |||
1990 | + /* wait to drain cppi dma pipe line */ | ||
1991 | + udelay(50); | ||
1992 | + | ||
1993 | csr = musb_readw(epio, MUSB_RXCSR); | ||
1994 | if (csr & MUSB_RXCSR_RXPKTRDY) { | ||
1995 | csr |= MUSB_RXCSR_FLUSHFIFO; | ||
1996 | @@ -558,13 +566,14 @@ static int cppi41_dma_channel_abort(struct dma_channel *channel) | ||
1997 | tdbit <<= 16; | ||
1998 | |||
1999 | do { | ||
2000 | - musb_writel(musb->ctrl_base, USB_TDOWN, tdbit); | ||
2001 | + if (is_tx) | ||
2002 | + musb_writel(musb->ctrl_base, USB_TDOWN, tdbit); | ||
2003 | ret = dmaengine_terminate_all(cppi41_channel->dc); | ||
2004 | } while (ret == -EAGAIN); | ||
2005 | |||
2006 | - musb_writel(musb->ctrl_base, USB_TDOWN, tdbit); | ||
2007 | - | ||
2008 | if (is_tx) { | ||
2009 | + musb_writel(musb->ctrl_base, USB_TDOWN, tdbit); | ||
2010 | + | ||
2011 | csr = musb_readw(epio, MUSB_TXCSR); | ||
2012 | if (csr & MUSB_TXCSR_TXPKTRDY) { | ||
2013 | csr |= MUSB_TXCSR_FLUSHFIFO; | ||
2014 | diff --git a/drivers/usb/serial/symbolserial.c b/drivers/usb/serial/symbolserial.c | ||
2015 | index 6ed804450a5a..37f3ad15ed06 100644 | ||
2016 | --- a/drivers/usb/serial/symbolserial.c | ||
2017 | +++ b/drivers/usb/serial/symbolserial.c | ||
2018 | @@ -60,17 +60,15 @@ static void symbol_int_callback(struct urb *urb) | ||
2019 | |||
2020 | usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data); | ||
2021 | |||
2022 | + /* | ||
2023 | + * Data from the device comes with a 1 byte header: | ||
2024 | + * | ||
2025 | + * <size of data> <data>... | ||
2026 | + */ | ||
2027 | if (urb->actual_length > 1) { | ||
2028 | - data_length = urb->actual_length - 1; | ||
2029 | - | ||
2030 | - /* | ||
2031 | - * Data from the device comes with a 1 byte header: | ||
2032 | - * | ||
2033 | - * <size of data>data... | ||
2034 | - * This is real data to be sent to the tty layer | ||
2035 | - * we pretty much just ignore the size and send everything | ||
2036 | - * else to the tty layer. | ||
2037 | - */ | ||
2038 | + data_length = data[0]; | ||
2039 | + if (data_length > (urb->actual_length - 1)) | ||
2040 | + data_length = urb->actual_length - 1; | ||
2041 | tty_insert_flip_string(&port->port, &data[1], data_length); | ||
2042 | tty_flip_buffer_push(&port->port); | ||
2043 | } else { | ||
2044 | diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c | ||
2045 | index cb84f69f76ad..313f09a73624 100644 | ||
2046 | --- a/drivers/vhost/scsi.c | ||
2047 | +++ b/drivers/vhost/scsi.c | ||
2048 | @@ -1251,7 +1251,7 @@ tcm_vhost_send_evt(struct vhost_scsi *vs, | ||
2049 | * lun[4-7] need to be zero according to virtio-scsi spec. | ||
2050 | */ | ||
2051 | evt->event.lun[0] = 0x01; | ||
2052 | - evt->event.lun[1] = tpg->tport_tpgt & 0xFF; | ||
2053 | + evt->event.lun[1] = tpg->tport_tpgt; | ||
2054 | if (lun->unpacked_lun >= 256) | ||
2055 | evt->event.lun[2] = lun->unpacked_lun >> 8 | 0x40 ; | ||
2056 | evt->event.lun[3] = lun->unpacked_lun & 0xFF; | ||
2057 | @@ -2122,12 +2122,12 @@ tcm_vhost_make_tpg(struct se_wwn *wwn, | ||
2058 | struct tcm_vhost_tport, tport_wwn); | ||
2059 | |||
2060 | struct tcm_vhost_tpg *tpg; | ||
2061 | - unsigned long tpgt; | ||
2062 | + u16 tpgt; | ||
2063 | int ret; | ||
2064 | |||
2065 | if (strstr(name, "tpgt_") != name) | ||
2066 | return ERR_PTR(-EINVAL); | ||
2067 | - if (kstrtoul(name + 5, 10, &tpgt) || tpgt > UINT_MAX) | ||
2068 | + if (kstrtou16(name + 5, 10, &tpgt) || tpgt >= VHOST_SCSI_MAX_TARGET) | ||
2069 | return ERR_PTR(-EINVAL); | ||
2070 | |||
2071 | tpg = kzalloc(sizeof(struct tcm_vhost_tpg), GFP_KERNEL); | ||
2072 | diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c | ||
2073 | index 2d3e32ebfd15..cfd1e6f6ac64 100644 | ||
2074 | --- a/fs/btrfs/backref.c | ||
2075 | +++ b/fs/btrfs/backref.c | ||
2076 | @@ -1778,7 +1778,6 @@ static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root, | ||
2077 | int found = 0; | ||
2078 | struct extent_buffer *eb; | ||
2079 | struct btrfs_inode_extref *extref; | ||
2080 | - struct extent_buffer *leaf; | ||
2081 | u32 item_size; | ||
2082 | u32 cur_offset; | ||
2083 | unsigned long ptr; | ||
2084 | @@ -1806,9 +1805,8 @@ static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root, | ||
2085 | btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK); | ||
2086 | btrfs_release_path(path); | ||
2087 | |||
2088 | - leaf = path->nodes[0]; | ||
2089 | - item_size = btrfs_item_size_nr(leaf, slot); | ||
2090 | - ptr = btrfs_item_ptr_offset(leaf, slot); | ||
2091 | + item_size = btrfs_item_size_nr(eb, slot); | ||
2092 | + ptr = btrfs_item_ptr_offset(eb, slot); | ||
2093 | cur_offset = 0; | ||
2094 | |||
2095 | while (cur_offset < item_size) { | ||
2096 | @@ -1822,7 +1820,7 @@ static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root, | ||
2097 | if (ret) | ||
2098 | break; | ||
2099 | |||
2100 | - cur_offset += btrfs_inode_extref_name_len(leaf, extref); | ||
2101 | + cur_offset += btrfs_inode_extref_name_len(eb, extref); | ||
2102 | cur_offset += sizeof(*extref); | ||
2103 | } | ||
2104 | btrfs_tree_read_unlock_blocking(eb); | ||
2105 | diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c | ||
2106 | index 61d00a6e398f..4ae04561be88 100644 | ||
2107 | --- a/fs/cifs/cifssmb.c | ||
2108 | +++ b/fs/cifs/cifssmb.c | ||
2109 | @@ -625,9 +625,8 @@ CIFSSMBNegotiate(const unsigned int xid, struct cifs_ses *ses) | ||
2110 | server->negflavor = CIFS_NEGFLAVOR_UNENCAP; | ||
2111 | memcpy(ses->server->cryptkey, pSMBr->u.EncryptionKey, | ||
2112 | CIFS_CRYPTO_KEY_SIZE); | ||
2113 | - } else if ((pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC || | ||
2114 | - server->capabilities & CAP_EXTENDED_SECURITY) && | ||
2115 | - (pSMBr->EncryptionKeyLength == 0)) { | ||
2116 | + } else if (pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC || | ||
2117 | + server->capabilities & CAP_EXTENDED_SECURITY) { | ||
2118 | server->negflavor = CIFS_NEGFLAVOR_EXTENDED; | ||
2119 | rc = decode_ext_sec_blob(ses, pSMBr); | ||
2120 | } else if (server->sec_mode & SECMODE_PW_ENCRYPT) { | ||
2121 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
2122 | index b5fcb1ac0dd7..b95c32096a68 100644 | ||
2123 | --- a/fs/ext4/extents.c | ||
2124 | +++ b/fs/ext4/extents.c | ||
2125 | @@ -4792,12 +4792,6 @@ static long ext4_zero_range(struct file *file, loff_t offset, | ||
2126 | else | ||
2127 | max_blocks -= lblk; | ||
2128 | |||
2129 | - flags = EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT | | ||
2130 | - EXT4_GET_BLOCKS_CONVERT_UNWRITTEN | | ||
2131 | - EXT4_EX_NOCACHE; | ||
2132 | - if (mode & FALLOC_FL_KEEP_SIZE) | ||
2133 | - flags |= EXT4_GET_BLOCKS_KEEP_SIZE; | ||
2134 | - | ||
2135 | mutex_lock(&inode->i_mutex); | ||
2136 | |||
2137 | /* | ||
2138 | @@ -4814,15 +4808,28 @@ static long ext4_zero_range(struct file *file, loff_t offset, | ||
2139 | ret = inode_newsize_ok(inode, new_size); | ||
2140 | if (ret) | ||
2141 | goto out_mutex; | ||
2142 | - /* | ||
2143 | - * If we have a partial block after EOF we have to allocate | ||
2144 | - * the entire block. | ||
2145 | - */ | ||
2146 | - if (partial_end) | ||
2147 | - max_blocks += 1; | ||
2148 | } | ||
2149 | |||
2150 | + flags = EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT; | ||
2151 | + if (mode & FALLOC_FL_KEEP_SIZE) | ||
2152 | + flags |= EXT4_GET_BLOCKS_KEEP_SIZE; | ||
2153 | + | ||
2154 | + /* Preallocate the range including the unaligned edges */ | ||
2155 | + if (partial_begin || partial_end) { | ||
2156 | + ret = ext4_alloc_file_blocks(file, | ||
2157 | + round_down(offset, 1 << blkbits) >> blkbits, | ||
2158 | + (round_up((offset + len), 1 << blkbits) - | ||
2159 | + round_down(offset, 1 << blkbits)) >> blkbits, | ||
2160 | + new_size, flags, mode); | ||
2161 | + if (ret) | ||
2162 | + goto out_mutex; | ||
2163 | + | ||
2164 | + } | ||
2165 | + | ||
2166 | + /* Zero range excluding the unaligned edges */ | ||
2167 | if (max_blocks > 0) { | ||
2168 | + flags |= (EXT4_GET_BLOCKS_CONVERT_UNWRITTEN | | ||
2169 | + EXT4_EX_NOCACHE); | ||
2170 | |||
2171 | /* Now release the pages and zero block aligned part of pages*/ | ||
2172 | truncate_pagecache_range(inode, start, end - 1); | ||
2173 | @@ -4836,19 +4843,6 @@ static long ext4_zero_range(struct file *file, loff_t offset, | ||
2174 | flags, mode); | ||
2175 | if (ret) | ||
2176 | goto out_dio; | ||
2177 | - /* | ||
2178 | - * Remove entire range from the extent status tree. | ||
2179 | - * | ||
2180 | - * ext4_es_remove_extent(inode, lblk, max_blocks) is | ||
2181 | - * NOT sufficient. I'm not sure why this is the case, | ||
2182 | - * but let's be conservative and remove the extent | ||
2183 | - * status tree for the entire inode. There should be | ||
2184 | - * no outstanding delalloc extents thanks to the | ||
2185 | - * filemap_write_and_wait_range() call above. | ||
2186 | - */ | ||
2187 | - ret = ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS); | ||
2188 | - if (ret) | ||
2189 | - goto out_dio; | ||
2190 | } | ||
2191 | if (!partial_begin && !partial_end) | ||
2192 | goto out_dio; | ||
2193 | diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c | ||
2194 | index 4227dc4f7437..8c44654ce274 100644 | ||
2195 | --- a/fs/jbd2/checkpoint.c | ||
2196 | +++ b/fs/jbd2/checkpoint.c | ||
2197 | @@ -417,12 +417,12 @@ int jbd2_cleanup_journal_tail(journal_t *journal) | ||
2198 | * journal_clean_one_cp_list | ||
2199 | * | ||
2200 | * Find all the written-back checkpoint buffers in the given list and | ||
2201 | - * release them. | ||
2202 | + * release them. If 'destroy' is set, clean all buffers unconditionally. | ||
2203 | * | ||
2204 | * Called with j_list_lock held. | ||
2205 | * Returns 1 if we freed the transaction, 0 otherwise. | ||
2206 | */ | ||
2207 | -static int journal_clean_one_cp_list(struct journal_head *jh) | ||
2208 | +static int journal_clean_one_cp_list(struct journal_head *jh, bool destroy) | ||
2209 | { | ||
2210 | struct journal_head *last_jh; | ||
2211 | struct journal_head *next_jh = jh; | ||
2212 | @@ -436,7 +436,10 @@ static int journal_clean_one_cp_list(struct journal_head *jh) | ||
2213 | do { | ||
2214 | jh = next_jh; | ||
2215 | next_jh = jh->b_cpnext; | ||
2216 | - ret = __try_to_free_cp_buf(jh); | ||
2217 | + if (!destroy) | ||
2218 | + ret = __try_to_free_cp_buf(jh); | ||
2219 | + else | ||
2220 | + ret = __jbd2_journal_remove_checkpoint(jh) + 1; | ||
2221 | if (!ret) | ||
2222 | return freed; | ||
2223 | if (ret == 2) | ||
2224 | @@ -459,10 +462,11 @@ static int journal_clean_one_cp_list(struct journal_head *jh) | ||
2225 | * journal_clean_checkpoint_list | ||
2226 | * | ||
2227 | * Find all the written-back checkpoint buffers in the journal and release them. | ||
2228 | + * If 'destroy' is set, release all buffers unconditionally. | ||
2229 | * | ||
2230 | * Called with j_list_lock held. | ||
2231 | */ | ||
2232 | -void __jbd2_journal_clean_checkpoint_list(journal_t *journal) | ||
2233 | +void __jbd2_journal_clean_checkpoint_list(journal_t *journal, bool destroy) | ||
2234 | { | ||
2235 | transaction_t *transaction, *last_transaction, *next_transaction; | ||
2236 | int ret; | ||
2237 | @@ -476,7 +480,8 @@ void __jbd2_journal_clean_checkpoint_list(journal_t *journal) | ||
2238 | do { | ||
2239 | transaction = next_transaction; | ||
2240 | next_transaction = transaction->t_cpnext; | ||
2241 | - ret = journal_clean_one_cp_list(transaction->t_checkpoint_list); | ||
2242 | + ret = journal_clean_one_cp_list(transaction->t_checkpoint_list, | ||
2243 | + destroy); | ||
2244 | /* | ||
2245 | * This function only frees up some memory if possible so we | ||
2246 | * dont have an obligation to finish processing. Bail out if | ||
2247 | @@ -492,7 +497,7 @@ void __jbd2_journal_clean_checkpoint_list(journal_t *journal) | ||
2248 | * we can possibly see not yet submitted buffers on io_list | ||
2249 | */ | ||
2250 | ret = journal_clean_one_cp_list(transaction-> | ||
2251 | - t_checkpoint_io_list); | ||
2252 | + t_checkpoint_io_list, destroy); | ||
2253 | if (need_resched()) | ||
2254 | return; | ||
2255 | /* | ||
2256 | @@ -506,6 +511,28 @@ void __jbd2_journal_clean_checkpoint_list(journal_t *journal) | ||
2257 | } | ||
2258 | |||
2259 | /* | ||
2260 | + * Remove buffers from all checkpoint lists as journal is aborted and we just | ||
2261 | + * need to free memory | ||
2262 | + */ | ||
2263 | +void jbd2_journal_destroy_checkpoint(journal_t *journal) | ||
2264 | +{ | ||
2265 | + /* | ||
2266 | + * We loop because __jbd2_journal_clean_checkpoint_list() may abort | ||
2267 | + * early due to a need of rescheduling. | ||
2268 | + */ | ||
2269 | + while (1) { | ||
2270 | + spin_lock(&journal->j_list_lock); | ||
2271 | + if (!journal->j_checkpoint_transactions) { | ||
2272 | + spin_unlock(&journal->j_list_lock); | ||
2273 | + break; | ||
2274 | + } | ||
2275 | + __jbd2_journal_clean_checkpoint_list(journal, true); | ||
2276 | + spin_unlock(&journal->j_list_lock); | ||
2277 | + cond_resched(); | ||
2278 | + } | ||
2279 | +} | ||
2280 | + | ||
2281 | +/* | ||
2282 | * journal_remove_checkpoint: called after a buffer has been committed | ||
2283 | * to disk (either by being write-back flushed to disk, or being | ||
2284 | * committed to the log). | ||
2285 | diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c | ||
2286 | index b73e0215baa7..362e5f614450 100644 | ||
2287 | --- a/fs/jbd2/commit.c | ||
2288 | +++ b/fs/jbd2/commit.c | ||
2289 | @@ -510,7 +510,7 @@ void jbd2_journal_commit_transaction(journal_t *journal) | ||
2290 | * frees some memory | ||
2291 | */ | ||
2292 | spin_lock(&journal->j_list_lock); | ||
2293 | - __jbd2_journal_clean_checkpoint_list(journal); | ||
2294 | + __jbd2_journal_clean_checkpoint_list(journal, false); | ||
2295 | spin_unlock(&journal->j_list_lock); | ||
2296 | |||
2297 | jbd_debug(3, "JBD2: commit phase 1\n"); | ||
2298 | diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c | ||
2299 | index be6f7178d23a..2540324f084b 100644 | ||
2300 | --- a/fs/jbd2/journal.c | ||
2301 | +++ b/fs/jbd2/journal.c | ||
2302 | @@ -1708,8 +1708,17 @@ int jbd2_journal_destroy(journal_t *journal) | ||
2303 | while (journal->j_checkpoint_transactions != NULL) { | ||
2304 | spin_unlock(&journal->j_list_lock); | ||
2305 | mutex_lock(&journal->j_checkpoint_mutex); | ||
2306 | - jbd2_log_do_checkpoint(journal); | ||
2307 | + err = jbd2_log_do_checkpoint(journal); | ||
2308 | mutex_unlock(&journal->j_checkpoint_mutex); | ||
2309 | + /* | ||
2310 | + * If checkpointing failed, just free the buffers to avoid | ||
2311 | + * looping forever | ||
2312 | + */ | ||
2313 | + if (err) { | ||
2314 | + jbd2_journal_destroy_checkpoint(journal); | ||
2315 | + spin_lock(&journal->j_list_lock); | ||
2316 | + break; | ||
2317 | + } | ||
2318 | spin_lock(&journal->j_list_lock); | ||
2319 | } | ||
2320 | |||
2321 | diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h | ||
2322 | index ff560537dd61..2725b03b4ae2 100644 | ||
2323 | --- a/include/linux/ipv6.h | ||
2324 | +++ b/include/linux/ipv6.h | ||
2325 | @@ -212,7 +212,7 @@ struct ipv6_pinfo { | ||
2326 | struct ipv6_ac_socklist *ipv6_ac_list; | ||
2327 | struct ipv6_fl_socklist __rcu *ipv6_fl_list; | ||
2328 | |||
2329 | - struct ipv6_txoptions *opt; | ||
2330 | + struct ipv6_txoptions __rcu *opt; | ||
2331 | struct sk_buff *pktoptions; | ||
2332 | struct sk_buff *rxpmtu; | ||
2333 | struct { | ||
2334 | diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h | ||
2335 | index dadb42109dec..4caf8acfef11 100644 | ||
2336 | --- a/include/linux/jbd2.h | ||
2337 | +++ b/include/linux/jbd2.h | ||
2338 | @@ -1042,8 +1042,9 @@ void jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block); | ||
2339 | extern void jbd2_journal_commit_transaction(journal_t *); | ||
2340 | |||
2341 | /* Checkpoint list management */ | ||
2342 | -void __jbd2_journal_clean_checkpoint_list(journal_t *journal); | ||
2343 | +void __jbd2_journal_clean_checkpoint_list(journal_t *journal, bool destroy); | ||
2344 | int __jbd2_journal_remove_checkpoint(struct journal_head *); | ||
2345 | +void jbd2_journal_destroy_checkpoint(journal_t *journal); | ||
2346 | void __jbd2_journal_insert_checkpoint(struct journal_head *, transaction_t *); | ||
2347 | |||
2348 | |||
2349 | diff --git a/include/linux/pci.h b/include/linux/pci.h | ||
2350 | index e92cdad3240d..7a3484490867 100644 | ||
2351 | --- a/include/linux/pci.h | ||
2352 | +++ b/include/linux/pci.h | ||
2353 | @@ -177,6 +177,10 @@ enum pci_dev_flags { | ||
2354 | PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = (__force pci_dev_flags_t) (1 << 5), | ||
2355 | /* Do not use bus resets for device */ | ||
2356 | PCI_DEV_FLAGS_NO_BUS_RESET = (__force pci_dev_flags_t) (1 << 6), | ||
2357 | + /* Do not use PM reset even if device advertises NoSoftRst- */ | ||
2358 | + PCI_DEV_FLAGS_NO_PM_RESET = (__force pci_dev_flags_t) (1 << 7), | ||
2359 | + /* Get VPD from function 0 VPD */ | ||
2360 | + PCI_DEV_FLAGS_VPD_REF_F0 = (__force pci_dev_flags_t) (1 << 8), | ||
2361 | }; | ||
2362 | |||
2363 | enum pci_irq_reroute_variant { | ||
2364 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h | ||
2365 | index 522d83731709..3b57c6712495 100644 | ||
2366 | --- a/include/linux/skbuff.h | ||
2367 | +++ b/include/linux/skbuff.h | ||
2368 | @@ -2549,6 +2549,9 @@ static inline void skb_postpull_rcsum(struct sk_buff *skb, | ||
2369 | { | ||
2370 | if (skb->ip_summed == CHECKSUM_COMPLETE) | ||
2371 | skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0)); | ||
2372 | + else if (skb->ip_summed == CHECKSUM_PARTIAL && | ||
2373 | + skb_checksum_start_offset(skb) < 0) | ||
2374 | + skb->ip_summed = CHECKSUM_NONE; | ||
2375 | } | ||
2376 | |||
2377 | unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len); | ||
2378 | diff --git a/include/net/af_unix.h b/include/net/af_unix.h | ||
2379 | index a175ba4a7adb..dfe4ddfbb43c 100644 | ||
2380 | --- a/include/net/af_unix.h | ||
2381 | +++ b/include/net/af_unix.h | ||
2382 | @@ -64,7 +64,11 @@ struct unix_sock { | ||
2383 | #define UNIX_GC_MAYBE_CYCLE 1 | ||
2384 | struct socket_wq peer_wq; | ||
2385 | }; | ||
2386 | -#define unix_sk(__sk) ((struct unix_sock *)__sk) | ||
2387 | + | ||
2388 | +static inline struct unix_sock *unix_sk(struct sock *sk) | ||
2389 | +{ | ||
2390 | + return (struct unix_sock *)sk; | ||
2391 | +} | ||
2392 | |||
2393 | #define peer_wait peer_wq.wait | ||
2394 | |||
2395 | diff --git a/include/net/inet_common.h b/include/net/inet_common.h | ||
2396 | index b2828a06a5a6..a7d812d05fba 100644 | ||
2397 | --- a/include/net/inet_common.h | ||
2398 | +++ b/include/net/inet_common.h | ||
2399 | @@ -42,7 +42,8 @@ int inet_recv_error(struct sock *sk, struct msghdr *msg, int len, | ||
2400 | |||
2401 | static inline void inet_ctl_sock_destroy(struct sock *sk) | ||
2402 | { | ||
2403 | - sk_release_kernel(sk); | ||
2404 | + if (sk) | ||
2405 | + sk_release_kernel(sk); | ||
2406 | } | ||
2407 | |||
2408 | #endif | ||
2409 | diff --git a/include/net/ip6_tunnel.h b/include/net/ip6_tunnel.h | ||
2410 | index a5593dab6af7..ef9557683fec 100644 | ||
2411 | --- a/include/net/ip6_tunnel.h | ||
2412 | +++ b/include/net/ip6_tunnel.h | ||
2413 | @@ -79,11 +79,12 @@ static inline void ip6tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | ||
2414 | err = ip6_local_out(skb); | ||
2415 | |||
2416 | if (net_xmit_eval(err) == 0) { | ||
2417 | - struct pcpu_sw_netstats *tstats = this_cpu_ptr(dev->tstats); | ||
2418 | + struct pcpu_sw_netstats *tstats = get_cpu_ptr(dev->tstats); | ||
2419 | u64_stats_update_begin(&tstats->syncp); | ||
2420 | tstats->tx_bytes += pkt_len; | ||
2421 | tstats->tx_packets++; | ||
2422 | u64_stats_update_end(&tstats->syncp); | ||
2423 | + put_cpu_ptr(tstats); | ||
2424 | } else { | ||
2425 | stats->tx_errors++; | ||
2426 | stats->tx_aborted_errors++; | ||
2427 | diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h | ||
2428 | index 5bc6edeb7143..a3f2f8005126 100644 | ||
2429 | --- a/include/net/ip_tunnels.h | ||
2430 | +++ b/include/net/ip_tunnels.h | ||
2431 | @@ -186,12 +186,13 @@ static inline void iptunnel_xmit_stats(int err, | ||
2432 | struct pcpu_sw_netstats __percpu *stats) | ||
2433 | { | ||
2434 | if (err > 0) { | ||
2435 | - struct pcpu_sw_netstats *tstats = this_cpu_ptr(stats); | ||
2436 | + struct pcpu_sw_netstats *tstats = get_cpu_ptr(stats); | ||
2437 | |||
2438 | u64_stats_update_begin(&tstats->syncp); | ||
2439 | tstats->tx_bytes += err; | ||
2440 | tstats->tx_packets++; | ||
2441 | u64_stats_update_end(&tstats->syncp); | ||
2442 | + put_cpu_ptr(tstats); | ||
2443 | } else if (err < 0) { | ||
2444 | err_stats->tx_errors++; | ||
2445 | err_stats->tx_aborted_errors++; | ||
2446 | diff --git a/include/net/ipv6.h b/include/net/ipv6.h | ||
2447 | index 4292929392b0..a5169a4e9ef7 100644 | ||
2448 | --- a/include/net/ipv6.h | ||
2449 | +++ b/include/net/ipv6.h | ||
2450 | @@ -207,6 +207,7 @@ extern rwlock_t ip6_ra_lock; | ||
2451 | */ | ||
2452 | |||
2453 | struct ipv6_txoptions { | ||
2454 | + atomic_t refcnt; | ||
2455 | /* Length of this structure */ | ||
2456 | int tot_len; | ||
2457 | |||
2458 | @@ -219,7 +220,7 @@ struct ipv6_txoptions { | ||
2459 | struct ipv6_opt_hdr *dst0opt; | ||
2460 | struct ipv6_rt_hdr *srcrt; /* Routing Header */ | ||
2461 | struct ipv6_opt_hdr *dst1opt; | ||
2462 | - | ||
2463 | + struct rcu_head rcu; | ||
2464 | /* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */ | ||
2465 | }; | ||
2466 | |||
2467 | @@ -252,6 +253,24 @@ struct ipv6_fl_socklist { | ||
2468 | struct rcu_head rcu; | ||
2469 | }; | ||
2470 | |||
2471 | +static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np) | ||
2472 | +{ | ||
2473 | + struct ipv6_txoptions *opt; | ||
2474 | + | ||
2475 | + rcu_read_lock(); | ||
2476 | + opt = rcu_dereference(np->opt); | ||
2477 | + if (opt && !atomic_inc_not_zero(&opt->refcnt)) | ||
2478 | + opt = NULL; | ||
2479 | + rcu_read_unlock(); | ||
2480 | + return opt; | ||
2481 | +} | ||
2482 | + | ||
2483 | +static inline void txopt_put(struct ipv6_txoptions *opt) | ||
2484 | +{ | ||
2485 | + if (opt && atomic_dec_and_test(&opt->refcnt)) | ||
2486 | + kfree_rcu(opt, rcu); | ||
2487 | +} | ||
2488 | + | ||
2489 | struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk, __be32 label); | ||
2490 | struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions *opt_space, | ||
2491 | struct ip6_flowlabel *fl, | ||
2492 | @@ -490,6 +509,7 @@ struct ip6_create_arg { | ||
2493 | u32 user; | ||
2494 | const struct in6_addr *src; | ||
2495 | const struct in6_addr *dst; | ||
2496 | + int iif; | ||
2497 | u8 ecn; | ||
2498 | }; | ||
2499 | |||
2500 | diff --git a/include/net/sock.h b/include/net/sock.h | ||
2501 | index 4406dbe491f0..a098ce3cd242 100644 | ||
2502 | --- a/include/net/sock.h | ||
2503 | +++ b/include/net/sock.h | ||
2504 | @@ -819,6 +819,14 @@ static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *s | ||
2505 | if (sk_rcvqueues_full(sk, limit)) | ||
2506 | return -ENOBUFS; | ||
2507 | |||
2508 | + /* | ||
2509 | + * If the skb was allocated from pfmemalloc reserves, only | ||
2510 | + * allow SOCK_MEMALLOC sockets to use it as this socket is | ||
2511 | + * helping free memory | ||
2512 | + */ | ||
2513 | + if (skb_pfmemalloc(skb) && !sock_flag(sk, SOCK_MEMALLOC)) | ||
2514 | + return -ENOMEM; | ||
2515 | + | ||
2516 | __sk_add_backlog(sk, skb); | ||
2517 | sk->sk_backlog.len += skb->truesize; | ||
2518 | return 0; | ||
2519 | diff --git a/include/sound/wm8904.h b/include/sound/wm8904.h | ||
2520 | index 898be3a8db9a..6d8f8fba3341 100644 | ||
2521 | --- a/include/sound/wm8904.h | ||
2522 | +++ b/include/sound/wm8904.h | ||
2523 | @@ -119,7 +119,7 @@ | ||
2524 | #define WM8904_MIC_REGS 2 | ||
2525 | #define WM8904_GPIO_REGS 4 | ||
2526 | #define WM8904_DRC_REGS 4 | ||
2527 | -#define WM8904_EQ_REGS 25 | ||
2528 | +#define WM8904_EQ_REGS 24 | ||
2529 | |||
2530 | /** | ||
2531 | * DRC configurations are specified with a label and a set of register | ||
2532 | diff --git a/kernel/auditsc.c b/kernel/auditsc.c | ||
2533 | index e420a0c41b5f..cc3416f0deda 100644 | ||
2534 | --- a/kernel/auditsc.c | ||
2535 | +++ b/kernel/auditsc.c | ||
2536 | @@ -72,6 +72,8 @@ | ||
2537 | #include <linux/fs_struct.h> | ||
2538 | #include <linux/compat.h> | ||
2539 | #include <linux/ctype.h> | ||
2540 | +#include <linux/string.h> | ||
2541 | +#include <uapi/linux/limits.h> | ||
2542 | |||
2543 | #include "audit.h" | ||
2544 | |||
2545 | @@ -1861,8 +1863,7 @@ void __audit_inode(struct filename *name, const struct dentry *dentry, | ||
2546 | } | ||
2547 | |||
2548 | list_for_each_entry_reverse(n, &context->names_list, list) { | ||
2549 | - /* does the name pointer match? */ | ||
2550 | - if (!n->name || n->name->name != name->name) | ||
2551 | + if (!n->name || strcmp(n->name->name, name->name)) | ||
2552 | continue; | ||
2553 | |||
2554 | /* match the correct record type */ | ||
2555 | @@ -1877,12 +1878,48 @@ void __audit_inode(struct filename *name, const struct dentry *dentry, | ||
2556 | } | ||
2557 | |||
2558 | out_alloc: | ||
2559 | - /* unable to find the name from a previous getname(). Allocate a new | ||
2560 | - * anonymous entry. | ||
2561 | - */ | ||
2562 | - n = audit_alloc_name(context, AUDIT_TYPE_NORMAL); | ||
2563 | + /* unable to find an entry with both a matching name and type */ | ||
2564 | + n = audit_alloc_name(context, AUDIT_TYPE_UNKNOWN); | ||
2565 | if (!n) | ||
2566 | return; | ||
2567 | + /* unfortunately, while we may have a path name to record with the | ||
2568 | + * inode, we can't always rely on the string lasting until the end of | ||
2569 | + * the syscall so we need to create our own copy, it may fail due to | ||
2570 | + * memory allocation issues, but we do our best */ | ||
2571 | + if (name) { | ||
2572 | + /* we can't use getname_kernel() due to size limits */ | ||
2573 | + size_t len = strlen(name->name) + 1; | ||
2574 | + struct filename *new = __getname(); | ||
2575 | + | ||
2576 | + if (unlikely(!new)) | ||
2577 | + goto out; | ||
2578 | + | ||
2579 | + if (len <= (PATH_MAX - sizeof(*new))) { | ||
2580 | + new->name = (char *)(new) + sizeof(*new); | ||
2581 | + new->separate = false; | ||
2582 | + } else if (len <= PATH_MAX) { | ||
2583 | + /* this looks odd, but is due to final_putname() */ | ||
2584 | + struct filename *new2; | ||
2585 | + | ||
2586 | + new2 = kmalloc(sizeof(*new2), GFP_KERNEL); | ||
2587 | + if (unlikely(!new2)) { | ||
2588 | + __putname(new); | ||
2589 | + goto out; | ||
2590 | + } | ||
2591 | + new2->name = (char *)new; | ||
2592 | + new2->separate = true; | ||
2593 | + new = new2; | ||
2594 | + } else { | ||
2595 | + /* we should never get here, but let's be safe */ | ||
2596 | + __putname(new); | ||
2597 | + goto out; | ||
2598 | + } | ||
2599 | + strlcpy((char *)new->name, name->name, len); | ||
2600 | + new->uptr = NULL; | ||
2601 | + new->aname = n; | ||
2602 | + n->name = new; | ||
2603 | + n->name_put = true; | ||
2604 | + } | ||
2605 | out: | ||
2606 | if (parent) { | ||
2607 | n->name_len = n->name ? parent_len(n->name->name) : AUDIT_NAME_FULL; | ||
2608 | diff --git a/kernel/module.c b/kernel/module.c | ||
2609 | index c353707bbbd5..3da0c001d985 100644 | ||
2610 | --- a/kernel/module.c | ||
2611 | +++ b/kernel/module.c | ||
2612 | @@ -914,11 +914,15 @@ void symbol_put_addr(void *addr) | ||
2613 | if (core_kernel_text(a)) | ||
2614 | return; | ||
2615 | |||
2616 | - /* module_text_address is safe here: we're supposed to have reference | ||
2617 | - * to module from symbol_get, so it can't go away. */ | ||
2618 | + /* | ||
2619 | + * Even though we hold a reference on the module; we still need to | ||
2620 | + * disable preemption in order to safely traverse the data structure. | ||
2621 | + */ | ||
2622 | + preempt_disable(); | ||
2623 | modaddr = __module_text_address(a); | ||
2624 | BUG_ON(!modaddr); | ||
2625 | module_put(modaddr); | ||
2626 | + preempt_enable(); | ||
2627 | } | ||
2628 | EXPORT_SYMBOL_GPL(symbol_put_addr); | ||
2629 | |||
2630 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
2631 | index a882dd91722d..d650e1e593b8 100644 | ||
2632 | --- a/kernel/sched/core.c | ||
2633 | +++ b/kernel/sched/core.c | ||
2634 | @@ -5284,6 +5284,14 @@ static int sched_cpu_active(struct notifier_block *nfb, | ||
2635 | case CPU_STARTING: | ||
2636 | set_cpu_rq_start_time(); | ||
2637 | return NOTIFY_OK; | ||
2638 | + case CPU_ONLINE: | ||
2639 | + /* | ||
2640 | + * At this point a starting CPU has marked itself as online via | ||
2641 | + * set_cpu_online(). But it might not yet have marked itself | ||
2642 | + * as active, which is essential from here on. | ||
2643 | + * | ||
2644 | + * Thus, fall-through and help the starting CPU along. | ||
2645 | + */ | ||
2646 | case CPU_DOWN_FAILED: | ||
2647 | set_cpu_active((long)hcpu, true); | ||
2648 | return NOTIFY_OK; | ||
2649 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c | ||
2650 | index 2273f534b01a..bd3c41d4ec07 100644 | ||
2651 | --- a/kernel/workqueue.c | ||
2652 | +++ b/kernel/workqueue.c | ||
2653 | @@ -1442,13 +1442,13 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq, | ||
2654 | timer_stats_timer_set_start_info(&dwork->timer); | ||
2655 | |||
2656 | dwork->wq = wq; | ||
2657 | + /* timer isn't guaranteed to run in this cpu, record earlier */ | ||
2658 | + if (cpu == WORK_CPU_UNBOUND) | ||
2659 | + cpu = raw_smp_processor_id(); | ||
2660 | dwork->cpu = cpu; | ||
2661 | timer->expires = jiffies + delay; | ||
2662 | |||
2663 | - if (unlikely(cpu != WORK_CPU_UNBOUND)) | ||
2664 | - add_timer_on(timer, cpu); | ||
2665 | - else | ||
2666 | - add_timer(timer); | ||
2667 | + add_timer_on(timer, cpu); | ||
2668 | } | ||
2669 | |||
2670 | /** | ||
2671 | diff --git a/lib/radix-tree.c b/lib/radix-tree.c | ||
2672 | index 3291a8e37490..3d2aa27b845b 100644 | ||
2673 | --- a/lib/radix-tree.c | ||
2674 | +++ b/lib/radix-tree.c | ||
2675 | @@ -33,7 +33,7 @@ | ||
2676 | #include <linux/string.h> | ||
2677 | #include <linux/bitops.h> | ||
2678 | #include <linux/rcupdate.h> | ||
2679 | -#include <linux/hardirq.h> /* in_interrupt() */ | ||
2680 | +#include <linux/preempt_mask.h> /* in_interrupt() */ | ||
2681 | |||
2682 | |||
2683 | /* | ||
2684 | diff --git a/mm/filemap.c b/mm/filemap.c | ||
2685 | index 37beab98b416..7e6ab98d4d3c 100644 | ||
2686 | --- a/mm/filemap.c | ||
2687 | +++ b/mm/filemap.c | ||
2688 | @@ -2489,6 +2489,11 @@ again: | ||
2689 | break; | ||
2690 | } | ||
2691 | |||
2692 | + if (fatal_signal_pending(current)) { | ||
2693 | + status = -EINTR; | ||
2694 | + break; | ||
2695 | + } | ||
2696 | + | ||
2697 | status = a_ops->write_begin(file, mapping, pos, bytes, flags, | ||
2698 | &page, &fsdata); | ||
2699 | if (unlikely(status < 0)) | ||
2700 | @@ -2526,10 +2531,6 @@ again: | ||
2701 | written += copied; | ||
2702 | |||
2703 | balance_dirty_pages_ratelimited(mapping); | ||
2704 | - if (fatal_signal_pending(current)) { | ||
2705 | - status = -EINTR; | ||
2706 | - break; | ||
2707 | - } | ||
2708 | } while (iov_iter_count(i)); | ||
2709 | |||
2710 | return written ? written : status; | ||
2711 | diff --git a/net/core/datagram.c b/net/core/datagram.c | ||
2712 | index 61e99f315ed9..3a402a7b20e9 100644 | ||
2713 | --- a/net/core/datagram.c | ||
2714 | +++ b/net/core/datagram.c | ||
2715 | @@ -130,35 +130,6 @@ out_noerr: | ||
2716 | goto out; | ||
2717 | } | ||
2718 | |||
2719 | -static int skb_set_peeked(struct sk_buff *skb) | ||
2720 | -{ | ||
2721 | - struct sk_buff *nskb; | ||
2722 | - | ||
2723 | - if (skb->peeked) | ||
2724 | - return 0; | ||
2725 | - | ||
2726 | - /* We have to unshare an skb before modifying it. */ | ||
2727 | - if (!skb_shared(skb)) | ||
2728 | - goto done; | ||
2729 | - | ||
2730 | - nskb = skb_clone(skb, GFP_ATOMIC); | ||
2731 | - if (!nskb) | ||
2732 | - return -ENOMEM; | ||
2733 | - | ||
2734 | - skb->prev->next = nskb; | ||
2735 | - skb->next->prev = nskb; | ||
2736 | - nskb->prev = skb->prev; | ||
2737 | - nskb->next = skb->next; | ||
2738 | - | ||
2739 | - consume_skb(skb); | ||
2740 | - skb = nskb; | ||
2741 | - | ||
2742 | -done: | ||
2743 | - skb->peeked = 1; | ||
2744 | - | ||
2745 | - return 0; | ||
2746 | -} | ||
2747 | - | ||
2748 | /** | ||
2749 | * __skb_recv_datagram - Receive a datagram skbuff | ||
2750 | * @sk: socket | ||
2751 | @@ -193,9 +164,7 @@ done: | ||
2752 | struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, | ||
2753 | int *peeked, int *off, int *err) | ||
2754 | { | ||
2755 | - struct sk_buff_head *queue = &sk->sk_receive_queue; | ||
2756 | struct sk_buff *skb, *last; | ||
2757 | - unsigned long cpu_flags; | ||
2758 | long timeo; | ||
2759 | /* | ||
2760 | * Caller is allowed not to check sk->sk_err before skb_recv_datagram() | ||
2761 | @@ -214,6 +183,8 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, | ||
2762 | * Look at current nfs client by the way... | ||
2763 | * However, this function was correct in any case. 8) | ||
2764 | */ | ||
2765 | + unsigned long cpu_flags; | ||
2766 | + struct sk_buff_head *queue = &sk->sk_receive_queue; | ||
2767 | int _off = *off; | ||
2768 | |||
2769 | last = (struct sk_buff *)queue; | ||
2770 | @@ -227,11 +198,7 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, | ||
2771 | _off -= skb->len; | ||
2772 | continue; | ||
2773 | } | ||
2774 | - | ||
2775 | - error = skb_set_peeked(skb); | ||
2776 | - if (error) | ||
2777 | - goto unlock_err; | ||
2778 | - | ||
2779 | + skb->peeked = 1; | ||
2780 | atomic_inc(&skb->users); | ||
2781 | } else | ||
2782 | __skb_unlink(skb, queue); | ||
2783 | @@ -255,8 +222,6 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, | ||
2784 | |||
2785 | return NULL; | ||
2786 | |||
2787 | -unlock_err: | ||
2788 | - spin_unlock_irqrestore(&queue->lock, cpu_flags); | ||
2789 | no_packet: | ||
2790 | *err = error; | ||
2791 | return NULL; | ||
2792 | diff --git a/net/core/dst.c b/net/core/dst.c | ||
2793 | index a028409ee438..a80e92346b9b 100644 | ||
2794 | --- a/net/core/dst.c | ||
2795 | +++ b/net/core/dst.c | ||
2796 | @@ -285,7 +285,7 @@ void dst_release(struct dst_entry *dst) | ||
2797 | |||
2798 | newrefcnt = atomic_dec_return(&dst->__refcnt); | ||
2799 | WARN_ON(newrefcnt < 0); | ||
2800 | - if (unlikely(dst->flags & DST_NOCACHE) && !newrefcnt) | ||
2801 | + if (!newrefcnt && unlikely(dst->flags & DST_NOCACHE)) | ||
2802 | call_rcu(&dst->rcu_head, dst_destroy_rcu); | ||
2803 | } | ||
2804 | } | ||
2805 | diff --git a/net/core/ethtool.c b/net/core/ethtool.c | ||
2806 | index 06dfb293e5aa..14bb1583947e 100644 | ||
2807 | --- a/net/core/ethtool.c | ||
2808 | +++ b/net/core/ethtool.c | ||
2809 | @@ -1257,7 +1257,7 @@ static int ethtool_get_strings(struct net_device *dev, void __user *useraddr) | ||
2810 | |||
2811 | gstrings.len = ret; | ||
2812 | |||
2813 | - data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER); | ||
2814 | + data = kcalloc(gstrings.len, ETH_GSTRING_LEN, GFP_USER); | ||
2815 | if (!data) | ||
2816 | return -ENOMEM; | ||
2817 | |||
2818 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c | ||
2819 | index 2b0d99dad8be..0478423afd29 100644 | ||
2820 | --- a/net/core/neighbour.c | ||
2821 | +++ b/net/core/neighbour.c | ||
2822 | @@ -2263,7 +2263,7 @@ static int pneigh_fill_info(struct sk_buff *skb, struct pneigh_entry *pn, | ||
2823 | ndm->ndm_pad2 = 0; | ||
2824 | ndm->ndm_flags = pn->flags | NTF_PROXY; | ||
2825 | ndm->ndm_type = RTN_UNICAST; | ||
2826 | - ndm->ndm_ifindex = pn->dev->ifindex; | ||
2827 | + ndm->ndm_ifindex = pn->dev ? pn->dev->ifindex : 0; | ||
2828 | ndm->ndm_state = NUD_NONE; | ||
2829 | |||
2830 | if (nla_put(skb, NDA_DST, tbl->key_len, pn->key)) | ||
2831 | @@ -2337,7 +2337,7 @@ static int pneigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb, | ||
2832 | if (h > s_h) | ||
2833 | s_idx = 0; | ||
2834 | for (n = tbl->phash_buckets[h], idx = 0; n; n = n->next) { | ||
2835 | - if (dev_net(n->dev) != net) | ||
2836 | + if (pneigh_net(n) != net) | ||
2837 | continue; | ||
2838 | if (idx < s_idx) | ||
2839 | goto next; | ||
2840 | diff --git a/net/core/scm.c b/net/core/scm.c | ||
2841 | index b442e7e25e60..d30eb057fa7b 100644 | ||
2842 | --- a/net/core/scm.c | ||
2843 | +++ b/net/core/scm.c | ||
2844 | @@ -306,6 +306,8 @@ void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm) | ||
2845 | err = put_user(cmlen, &cm->cmsg_len); | ||
2846 | if (!err) { | ||
2847 | cmlen = CMSG_SPACE(i*sizeof(int)); | ||
2848 | + if (msg->msg_controllen < cmlen) | ||
2849 | + cmlen = msg->msg_controllen; | ||
2850 | msg->msg_control += cmlen; | ||
2851 | msg->msg_controllen -= cmlen; | ||
2852 | } | ||
2853 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c | ||
2854 | index 72400a1bb439..ea0bcc4a9657 100644 | ||
2855 | --- a/net/core/skbuff.c | ||
2856 | +++ b/net/core/skbuff.c | ||
2857 | @@ -2881,11 +2881,12 @@ EXPORT_SYMBOL(skb_append_datato_frags); | ||
2858 | */ | ||
2859 | unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len) | ||
2860 | { | ||
2861 | + unsigned char *data = skb->data; | ||
2862 | + | ||
2863 | BUG_ON(len > skb->len); | ||
2864 | - skb->len -= len; | ||
2865 | - BUG_ON(skb->len < skb->data_len); | ||
2866 | - skb_postpull_rcsum(skb, skb->data, len); | ||
2867 | - return skb->data += len; | ||
2868 | + __skb_pull(skb, len); | ||
2869 | + skb_postpull_rcsum(skb, data, len); | ||
2870 | + return skb->data; | ||
2871 | } | ||
2872 | EXPORT_SYMBOL_GPL(skb_pull_rcsum); | ||
2873 | |||
2874 | diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c | ||
2875 | index 6bcaa33cd804..7bcb22317841 100644 | ||
2876 | --- a/net/dccp/ipv6.c | ||
2877 | +++ b/net/dccp/ipv6.c | ||
2878 | @@ -238,7 +238,9 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req) | ||
2879 | security_req_classify_flow(req, flowi6_to_flowi(&fl6)); | ||
2880 | |||
2881 | |||
2882 | - final_p = fl6_update_dst(&fl6, np->opt, &final); | ||
2883 | + rcu_read_lock(); | ||
2884 | + final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt), &final); | ||
2885 | + rcu_read_unlock(); | ||
2886 | |||
2887 | dst = ip6_dst_lookup_flow(sk, &fl6, final_p); | ||
2888 | if (IS_ERR(dst)) { | ||
2889 | @@ -255,7 +257,10 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req) | ||
2890 | &ireq->ir_v6_loc_addr, | ||
2891 | &ireq->ir_v6_rmt_addr); | ||
2892 | fl6.daddr = ireq->ir_v6_rmt_addr; | ||
2893 | - err = ip6_xmit(sk, skb, &fl6, np->opt, np->tclass); | ||
2894 | + rcu_read_lock(); | ||
2895 | + err = ip6_xmit(sk, skb, &fl6, rcu_dereference(np->opt), | ||
2896 | + np->tclass); | ||
2897 | + rcu_read_unlock(); | ||
2898 | err = net_xmit_eval(err); | ||
2899 | } | ||
2900 | |||
2901 | @@ -450,6 +455,7 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, | ||
2902 | { | ||
2903 | struct inet_request_sock *ireq = inet_rsk(req); | ||
2904 | struct ipv6_pinfo *newnp, *np = inet6_sk(sk); | ||
2905 | + struct ipv6_txoptions *opt; | ||
2906 | struct inet_sock *newinet; | ||
2907 | struct dccp6_sock *newdp6; | ||
2908 | struct sock *newsk; | ||
2909 | @@ -573,13 +579,15 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, | ||
2910 | * Yes, keeping reference count would be much more clever, but we make | ||
2911 | * one more one thing there: reattach optmem to newsk. | ||
2912 | */ | ||
2913 | - if (np->opt != NULL) | ||
2914 | - newnp->opt = ipv6_dup_options(newsk, np->opt); | ||
2915 | - | ||
2916 | + opt = rcu_dereference(np->opt); | ||
2917 | + if (opt) { | ||
2918 | + opt = ipv6_dup_options(newsk, opt); | ||
2919 | + RCU_INIT_POINTER(newnp->opt, opt); | ||
2920 | + } | ||
2921 | inet_csk(newsk)->icsk_ext_hdr_len = 0; | ||
2922 | - if (newnp->opt != NULL) | ||
2923 | - inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen + | ||
2924 | - newnp->opt->opt_flen); | ||
2925 | + if (opt) | ||
2926 | + inet_csk(newsk)->icsk_ext_hdr_len = opt->opt_nflen + | ||
2927 | + opt->opt_flen; | ||
2928 | |||
2929 | dccp_sync_mss(newsk, dst_mtu(dst)); | ||
2930 | |||
2931 | @@ -832,6 +840,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | ||
2932 | struct ipv6_pinfo *np = inet6_sk(sk); | ||
2933 | struct dccp_sock *dp = dccp_sk(sk); | ||
2934 | struct in6_addr *saddr = NULL, *final_p, final; | ||
2935 | + struct ipv6_txoptions *opt; | ||
2936 | struct flowi6 fl6; | ||
2937 | struct dst_entry *dst; | ||
2938 | int addr_type; | ||
2939 | @@ -933,7 +942,8 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | ||
2940 | fl6.fl6_sport = inet->inet_sport; | ||
2941 | security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); | ||
2942 | |||
2943 | - final_p = fl6_update_dst(&fl6, np->opt, &final); | ||
2944 | + opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk)); | ||
2945 | + final_p = fl6_update_dst(&fl6, opt, &final); | ||
2946 | |||
2947 | dst = ip6_dst_lookup_flow(sk, &fl6, final_p); | ||
2948 | if (IS_ERR(dst)) { | ||
2949 | @@ -953,9 +963,8 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | ||
2950 | __ip6_dst_store(sk, dst, NULL, NULL); | ||
2951 | |||
2952 | icsk->icsk_ext_hdr_len = 0; | ||
2953 | - if (np->opt != NULL) | ||
2954 | - icsk->icsk_ext_hdr_len = (np->opt->opt_flen + | ||
2955 | - np->opt->opt_nflen); | ||
2956 | + if (opt) | ||
2957 | + icsk->icsk_ext_hdr_len = opt->opt_flen + opt->opt_nflen; | ||
2958 | |||
2959 | inet->inet_dport = usin->sin6_port; | ||
2960 | |||
2961 | diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c | ||
2962 | index 51973ddc05a6..abc50b41bc39 100644 | ||
2963 | --- a/net/ipv4/gre_offload.c | ||
2964 | +++ b/net/ipv4/gre_offload.c | ||
2965 | @@ -36,7 +36,8 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb, | ||
2966 | SKB_GSO_TCP_ECN | | ||
2967 | SKB_GSO_GRE | | ||
2968 | SKB_GSO_GRE_CSUM | | ||
2969 | - SKB_GSO_IPIP))) | ||
2970 | + SKB_GSO_IPIP | | ||
2971 | + SKB_GSO_SIT))) | ||
2972 | goto out; | ||
2973 | |||
2974 | if (!skb->encapsulation) | ||
2975 | diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c | ||
2976 | index c8034587859d..1b7f6da99ef4 100644 | ||
2977 | --- a/net/ipv4/ipmr.c | ||
2978 | +++ b/net/ipv4/ipmr.c | ||
2979 | @@ -136,7 +136,7 @@ static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, | ||
2980 | struct mfc_cache *c, struct rtmsg *rtm); | ||
2981 | static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc, | ||
2982 | int cmd); | ||
2983 | -static void mroute_clean_tables(struct mr_table *mrt); | ||
2984 | +static void mroute_clean_tables(struct mr_table *mrt, bool all); | ||
2985 | static void ipmr_expire_process(unsigned long arg); | ||
2986 | |||
2987 | #ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES | ||
2988 | @@ -348,7 +348,7 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id) | ||
2989 | static void ipmr_free_table(struct mr_table *mrt) | ||
2990 | { | ||
2991 | del_timer_sync(&mrt->ipmr_expire_timer); | ||
2992 | - mroute_clean_tables(mrt); | ||
2993 | + mroute_clean_tables(mrt, true); | ||
2994 | kfree(mrt); | ||
2995 | } | ||
2996 | |||
2997 | @@ -1201,7 +1201,7 @@ static int ipmr_mfc_add(struct net *net, struct mr_table *mrt, | ||
2998 | * Close the multicast socket, and clear the vif tables etc | ||
2999 | */ | ||
3000 | |||
3001 | -static void mroute_clean_tables(struct mr_table *mrt) | ||
3002 | +static void mroute_clean_tables(struct mr_table *mrt, bool all) | ||
3003 | { | ||
3004 | int i; | ||
3005 | LIST_HEAD(list); | ||
3006 | @@ -1210,8 +1210,9 @@ static void mroute_clean_tables(struct mr_table *mrt) | ||
3007 | /* Shut down all active vif entries */ | ||
3008 | |||
3009 | for (i = 0; i < mrt->maxvif; i++) { | ||
3010 | - if (!(mrt->vif_table[i].flags & VIFF_STATIC)) | ||
3011 | - vif_delete(mrt, i, 0, &list); | ||
3012 | + if (!all && (mrt->vif_table[i].flags & VIFF_STATIC)) | ||
3013 | + continue; | ||
3014 | + vif_delete(mrt, i, 0, &list); | ||
3015 | } | ||
3016 | unregister_netdevice_many(&list); | ||
3017 | |||
3018 | @@ -1219,7 +1220,7 @@ static void mroute_clean_tables(struct mr_table *mrt) | ||
3019 | |||
3020 | for (i = 0; i < MFC_LINES; i++) { | ||
3021 | list_for_each_entry_safe(c, next, &mrt->mfc_cache_array[i], list) { | ||
3022 | - if (c->mfc_flags & MFC_STATIC) | ||
3023 | + if (!all && (c->mfc_flags & MFC_STATIC)) | ||
3024 | continue; | ||
3025 | list_del_rcu(&c->list); | ||
3026 | mroute_netlink_event(mrt, c, RTM_DELROUTE); | ||
3027 | @@ -1254,7 +1255,7 @@ static void mrtsock_destruct(struct sock *sk) | ||
3028 | NETCONFA_IFINDEX_ALL, | ||
3029 | net->ipv4.devconf_all); | ||
3030 | RCU_INIT_POINTER(mrt->mroute_sk, NULL); | ||
3031 | - mroute_clean_tables(mrt); | ||
3032 | + mroute_clean_tables(mrt, false); | ||
3033 | } | ||
3034 | } | ||
3035 | rtnl_unlock(); | ||
3036 | @@ -1674,8 +1675,8 @@ static inline int ipmr_forward_finish(struct sk_buff *skb) | ||
3037 | { | ||
3038 | struct ip_options *opt = &(IPCB(skb)->opt); | ||
3039 | |||
3040 | - IP_INC_STATS_BH(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTFORWDATAGRAMS); | ||
3041 | - IP_ADD_STATS_BH(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTOCTETS, skb->len); | ||
3042 | + IP_INC_STATS(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTFORWDATAGRAMS); | ||
3043 | + IP_ADD_STATS(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTOCTETS, skb->len); | ||
3044 | |||
3045 | if (unlikely(opt->optlen)) | ||
3046 | ip_forward_options(skb); | ||
3047 | @@ -1737,7 +1738,7 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt, | ||
3048 | * to blackhole. | ||
3049 | */ | ||
3050 | |||
3051 | - IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_FRAGFAILS); | ||
3052 | + IP_INC_STATS(dev_net(dev), IPSTATS_MIB_FRAGFAILS); | ||
3053 | ip_rt_put(rt); | ||
3054 | goto out_free; | ||
3055 | } | ||
3056 | diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c | ||
3057 | index b3c53c8b331e..633cd34f57ec 100644 | ||
3058 | --- a/net/ipv4/sysctl_net_ipv4.c | ||
3059 | +++ b/net/ipv4/sysctl_net_ipv4.c | ||
3060 | @@ -45,10 +45,10 @@ static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX }; | ||
3061 | /* Update system visible IP port range */ | ||
3062 | static void set_local_port_range(struct net *net, int range[2]) | ||
3063 | { | ||
3064 | - write_seqlock(&net->ipv4.ip_local_ports.lock); | ||
3065 | + write_seqlock_bh(&net->ipv4.ip_local_ports.lock); | ||
3066 | net->ipv4.ip_local_ports.range[0] = range[0]; | ||
3067 | net->ipv4.ip_local_ports.range[1] = range[1]; | ||
3068 | - write_sequnlock(&net->ipv4.ip_local_ports.lock); | ||
3069 | + write_sequnlock_bh(&net->ipv4.ip_local_ports.lock); | ||
3070 | } | ||
3071 | |||
3072 | /* Validate changes from /proc interface. */ | ||
3073 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c | ||
3074 | index 6f46cde58e54..0c96055b2382 100644 | ||
3075 | --- a/net/ipv4/tcp_input.c | ||
3076 | +++ b/net/ipv4/tcp_input.c | ||
3077 | @@ -4356,19 +4356,34 @@ static int __must_check tcp_queue_rcv(struct sock *sk, struct sk_buff *skb, int | ||
3078 | int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size) | ||
3079 | { | ||
3080 | struct sk_buff *skb; | ||
3081 | + int err = -ENOMEM; | ||
3082 | + int data_len = 0; | ||
3083 | bool fragstolen; | ||
3084 | |||
3085 | if (size == 0) | ||
3086 | return 0; | ||
3087 | |||
3088 | - skb = alloc_skb(size, sk->sk_allocation); | ||
3089 | + if (size > PAGE_SIZE) { | ||
3090 | + int npages = min_t(size_t, size >> PAGE_SHIFT, MAX_SKB_FRAGS); | ||
3091 | + | ||
3092 | + data_len = npages << PAGE_SHIFT; | ||
3093 | + size = data_len + (size & ~PAGE_MASK); | ||
3094 | + } | ||
3095 | + skb = alloc_skb_with_frags(size - data_len, data_len, | ||
3096 | + PAGE_ALLOC_COSTLY_ORDER, | ||
3097 | + &err, sk->sk_allocation); | ||
3098 | if (!skb) | ||
3099 | goto err; | ||
3100 | |||
3101 | + skb_put(skb, size - data_len); | ||
3102 | + skb->data_len = data_len; | ||
3103 | + skb->len = size; | ||
3104 | + | ||
3105 | if (tcp_try_rmem_schedule(sk, skb, skb->truesize)) | ||
3106 | goto err_free; | ||
3107 | |||
3108 | - if (memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size)) | ||
3109 | + err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, size); | ||
3110 | + if (err) | ||
3111 | goto err_free; | ||
3112 | |||
3113 | TCP_SKB_CB(skb)->seq = tcp_sk(sk)->rcv_nxt; | ||
3114 | @@ -4384,7 +4399,8 @@ int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size) | ||
3115 | err_free: | ||
3116 | kfree_skb(skb); | ||
3117 | err: | ||
3118 | - return -ENOMEM; | ||
3119 | + return err; | ||
3120 | + | ||
3121 | } | ||
3122 | |||
3123 | static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) | ||
3124 | @@ -5524,6 +5540,7 @@ discard: | ||
3125 | } | ||
3126 | |||
3127 | tp->rcv_nxt = TCP_SKB_CB(skb)->seq + 1; | ||
3128 | + tp->copied_seq = tp->rcv_nxt; | ||
3129 | tp->rcv_wup = TCP_SKB_CB(skb)->seq + 1; | ||
3130 | |||
3131 | /* RFC1323: The window in SYN & SYN/ACK segments is | ||
3132 | diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c | ||
3133 | index a5fdfe9fa542..6cd9f696d9c6 100644 | ||
3134 | --- a/net/ipv4/tcp_ipv4.c | ||
3135 | +++ b/net/ipv4/tcp_ipv4.c | ||
3136 | @@ -959,7 +959,8 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr, | ||
3137 | } | ||
3138 | |||
3139 | md5sig = rcu_dereference_protected(tp->md5sig_info, | ||
3140 | - sock_owned_by_user(sk)); | ||
3141 | + sock_owned_by_user(sk) || | ||
3142 | + lockdep_is_held(&sk->sk_lock.slock)); | ||
3143 | if (!md5sig) { | ||
3144 | md5sig = kmalloc(sizeof(*md5sig), gfp); | ||
3145 | if (!md5sig) | ||
3146 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c | ||
3147 | index 17a025847999..e34efa766031 100644 | ||
3148 | --- a/net/ipv6/addrconf.c | ||
3149 | +++ b/net/ipv6/addrconf.c | ||
3150 | @@ -396,6 +396,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev) | ||
3151 | if (err) { | ||
3152 | ipv6_mc_destroy_dev(ndev); | ||
3153 | del_timer(&ndev->regen_timer); | ||
3154 | + snmp6_unregister_dev(ndev); | ||
3155 | goto err_release; | ||
3156 | } | ||
3157 | /* protected by rtnl_lock */ | ||
3158 | @@ -4843,6 +4844,21 @@ int addrconf_sysctl_forward(struct ctl_table *ctl, int write, | ||
3159 | return ret; | ||
3160 | } | ||
3161 | |||
3162 | +static | ||
3163 | +int addrconf_sysctl_mtu(struct ctl_table *ctl, int write, | ||
3164 | + void __user *buffer, size_t *lenp, loff_t *ppos) | ||
3165 | +{ | ||
3166 | + struct inet6_dev *idev = ctl->extra1; | ||
3167 | + int min_mtu = IPV6_MIN_MTU; | ||
3168 | + struct ctl_table lctl; | ||
3169 | + | ||
3170 | + lctl = *ctl; | ||
3171 | + lctl.extra1 = &min_mtu; | ||
3172 | + lctl.extra2 = idev ? &idev->dev->mtu : NULL; | ||
3173 | + | ||
3174 | + return proc_dointvec_minmax(&lctl, write, buffer, lenp, ppos); | ||
3175 | +} | ||
3176 | + | ||
3177 | static void dev_disable_change(struct inet6_dev *idev) | ||
3178 | { | ||
3179 | struct netdev_notifier_info info; | ||
3180 | @@ -4994,7 +5010,7 @@ static struct addrconf_sysctl_table | ||
3181 | .data = &ipv6_devconf.mtu6, | ||
3182 | .maxlen = sizeof(int), | ||
3183 | .mode = 0644, | ||
3184 | - .proc_handler = proc_dointvec, | ||
3185 | + .proc_handler = addrconf_sysctl_mtu, | ||
3186 | }, | ||
3187 | { | ||
3188 | .procname = "accept_ra", | ||
3189 | diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c | ||
3190 | index e8c4400f23e9..05417c330f4e 100644 | ||
3191 | --- a/net/ipv6/af_inet6.c | ||
3192 | +++ b/net/ipv6/af_inet6.c | ||
3193 | @@ -425,9 +425,11 @@ void inet6_destroy_sock(struct sock *sk) | ||
3194 | |||
3195 | /* Free tx options */ | ||
3196 | |||
3197 | - opt = xchg(&np->opt, NULL); | ||
3198 | - if (opt != NULL) | ||
3199 | - sock_kfree_s(sk, opt, opt->tot_len); | ||
3200 | + opt = xchg((__force struct ipv6_txoptions **)&np->opt, NULL); | ||
3201 | + if (opt) { | ||
3202 | + atomic_sub(opt->tot_len, &sk->sk_omem_alloc); | ||
3203 | + txopt_put(opt); | ||
3204 | + } | ||
3205 | } | ||
3206 | EXPORT_SYMBOL_GPL(inet6_destroy_sock); | ||
3207 | |||
3208 | @@ -656,7 +658,10 @@ int inet6_sk_rebuild_header(struct sock *sk) | ||
3209 | fl6.fl6_sport = inet->inet_sport; | ||
3210 | security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); | ||
3211 | |||
3212 | - final_p = fl6_update_dst(&fl6, np->opt, &final); | ||
3213 | + rcu_read_lock(); | ||
3214 | + final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt), | ||
3215 | + &final); | ||
3216 | + rcu_read_unlock(); | ||
3217 | |||
3218 | dst = ip6_dst_lookup_flow(sk, &fl6, final_p); | ||
3219 | if (IS_ERR(dst)) { | ||
3220 | diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c | ||
3221 | index e069aeb2cf72..9e3b0b66a4f3 100644 | ||
3222 | --- a/net/ipv6/datagram.c | ||
3223 | +++ b/net/ipv6/datagram.c | ||
3224 | @@ -167,8 +167,10 @@ ipv4_connected: | ||
3225 | |||
3226 | security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); | ||
3227 | |||
3228 | - opt = flowlabel ? flowlabel->opt : np->opt; | ||
3229 | + rcu_read_lock(); | ||
3230 | + opt = flowlabel ? flowlabel->opt : rcu_dereference(np->opt); | ||
3231 | final_p = fl6_update_dst(&fl6, opt, &final); | ||
3232 | + rcu_read_unlock(); | ||
3233 | |||
3234 | dst = ip6_dst_lookup_flow(sk, &fl6, final_p); | ||
3235 | err = 0; | ||
3236 | diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c | ||
3237 | index bfde361b6134..4f08a0f452eb 100644 | ||
3238 | --- a/net/ipv6/exthdrs.c | ||
3239 | +++ b/net/ipv6/exthdrs.c | ||
3240 | @@ -727,6 +727,7 @@ ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt) | ||
3241 | *((char **)&opt2->dst1opt) += dif; | ||
3242 | if (opt2->srcrt) | ||
3243 | *((char **)&opt2->srcrt) += dif; | ||
3244 | + atomic_set(&opt2->refcnt, 1); | ||
3245 | } | ||
3246 | return opt2; | ||
3247 | } | ||
3248 | @@ -790,7 +791,7 @@ ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, | ||
3249 | return ERR_PTR(-ENOBUFS); | ||
3250 | |||
3251 | memset(opt2, 0, tot_len); | ||
3252 | - | ||
3253 | + atomic_set(&opt2->refcnt, 1); | ||
3254 | opt2->tot_len = tot_len; | ||
3255 | p = (char *)(opt2 + 1); | ||
3256 | |||
3257 | diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c | ||
3258 | index 29b32206e494..6cc516c825b6 100644 | ||
3259 | --- a/net/ipv6/inet6_connection_sock.c | ||
3260 | +++ b/net/ipv6/inet6_connection_sock.c | ||
3261 | @@ -77,7 +77,9 @@ struct dst_entry *inet6_csk_route_req(struct sock *sk, | ||
3262 | memset(fl6, 0, sizeof(*fl6)); | ||
3263 | fl6->flowi6_proto = IPPROTO_TCP; | ||
3264 | fl6->daddr = ireq->ir_v6_rmt_addr; | ||
3265 | - final_p = fl6_update_dst(fl6, np->opt, &final); | ||
3266 | + rcu_read_lock(); | ||
3267 | + final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final); | ||
3268 | + rcu_read_unlock(); | ||
3269 | fl6->saddr = ireq->ir_v6_loc_addr; | ||
3270 | fl6->flowi6_oif = ireq->ir_iif; | ||
3271 | fl6->flowi6_mark = ireq->ir_mark; | ||
3272 | @@ -208,7 +210,9 @@ static struct dst_entry *inet6_csk_route_socket(struct sock *sk, | ||
3273 | fl6->fl6_dport = inet->inet_dport; | ||
3274 | security_sk_classify_flow(sk, flowi6_to_flowi(fl6)); | ||
3275 | |||
3276 | - final_p = fl6_update_dst(fl6, np->opt, &final); | ||
3277 | + rcu_read_lock(); | ||
3278 | + final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final); | ||
3279 | + rcu_read_unlock(); | ||
3280 | |||
3281 | dst = __inet6_csk_dst_check(sk, np->dst_cookie); | ||
3282 | if (!dst) { | ||
3283 | @@ -241,7 +245,8 @@ int inet6_csk_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl_unused | ||
3284 | /* Restore final destination back after routing done */ | ||
3285 | fl6.daddr = sk->sk_v6_daddr; | ||
3286 | |||
3287 | - res = ip6_xmit(sk, skb, &fl6, np->opt, np->tclass); | ||
3288 | + res = ip6_xmit(sk, skb, &fl6, rcu_dereference(np->opt), | ||
3289 | + np->tclass); | ||
3290 | rcu_read_unlock(); | ||
3291 | return res; | ||
3292 | } | ||
3293 | diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c | ||
3294 | index 0d58542f9db0..4ca7cdd15aad 100644 | ||
3295 | --- a/net/ipv6/ip6mr.c | ||
3296 | +++ b/net/ipv6/ip6mr.c | ||
3297 | @@ -120,7 +120,7 @@ static void mr6_netlink_event(struct mr6_table *mrt, struct mfc6_cache *mfc, | ||
3298 | int cmd); | ||
3299 | static int ip6mr_rtm_dumproute(struct sk_buff *skb, | ||
3300 | struct netlink_callback *cb); | ||
3301 | -static void mroute_clean_tables(struct mr6_table *mrt); | ||
3302 | +static void mroute_clean_tables(struct mr6_table *mrt, bool all); | ||
3303 | static void ipmr_expire_process(unsigned long arg); | ||
3304 | |||
3305 | #ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES | ||
3306 | @@ -337,7 +337,7 @@ static struct mr6_table *ip6mr_new_table(struct net *net, u32 id) | ||
3307 | static void ip6mr_free_table(struct mr6_table *mrt) | ||
3308 | { | ||
3309 | del_timer(&mrt->ipmr_expire_timer); | ||
3310 | - mroute_clean_tables(mrt); | ||
3311 | + mroute_clean_tables(mrt, true); | ||
3312 | kfree(mrt); | ||
3313 | } | ||
3314 | |||
3315 | @@ -1540,7 +1540,7 @@ static int ip6mr_mfc_add(struct net *net, struct mr6_table *mrt, | ||
3316 | * Close the multicast socket, and clear the vif tables etc | ||
3317 | */ | ||
3318 | |||
3319 | -static void mroute_clean_tables(struct mr6_table *mrt) | ||
3320 | +static void mroute_clean_tables(struct mr6_table *mrt, bool all) | ||
3321 | { | ||
3322 | int i; | ||
3323 | LIST_HEAD(list); | ||
3324 | @@ -1550,8 +1550,9 @@ static void mroute_clean_tables(struct mr6_table *mrt) | ||
3325 | * Shut down all active vif entries | ||
3326 | */ | ||
3327 | for (i = 0; i < mrt->maxvif; i++) { | ||
3328 | - if (!(mrt->vif6_table[i].flags & VIFF_STATIC)) | ||
3329 | - mif6_delete(mrt, i, &list); | ||
3330 | + if (!all && (mrt->vif6_table[i].flags & VIFF_STATIC)) | ||
3331 | + continue; | ||
3332 | + mif6_delete(mrt, i, &list); | ||
3333 | } | ||
3334 | unregister_netdevice_many(&list); | ||
3335 | |||
3336 | @@ -1560,7 +1561,7 @@ static void mroute_clean_tables(struct mr6_table *mrt) | ||
3337 | */ | ||
3338 | for (i = 0; i < MFC6_LINES; i++) { | ||
3339 | list_for_each_entry_safe(c, next, &mrt->mfc6_cache_array[i], list) { | ||
3340 | - if (c->mfc_flags & MFC_STATIC) | ||
3341 | + if (!all && (c->mfc_flags & MFC_STATIC)) | ||
3342 | continue; | ||
3343 | write_lock_bh(&mrt_lock); | ||
3344 | list_del(&c->list); | ||
3345 | @@ -1623,7 +1624,7 @@ int ip6mr_sk_done(struct sock *sk) | ||
3346 | net->ipv6.devconf_all); | ||
3347 | write_unlock_bh(&mrt_lock); | ||
3348 | |||
3349 | - mroute_clean_tables(mrt); | ||
3350 | + mroute_clean_tables(mrt, false); | ||
3351 | err = 0; | ||
3352 | break; | ||
3353 | } | ||
3354 | diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c | ||
3355 | index e1a9583bb419..f81fcc09ea6c 100644 | ||
3356 | --- a/net/ipv6/ipv6_sockglue.c | ||
3357 | +++ b/net/ipv6/ipv6_sockglue.c | ||
3358 | @@ -110,10 +110,12 @@ struct ipv6_txoptions *ipv6_update_options(struct sock *sk, | ||
3359 | icsk->icsk_ext_hdr_len = opt->opt_flen + opt->opt_nflen; | ||
3360 | icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie); | ||
3361 | } | ||
3362 | - opt = xchg(&inet6_sk(sk)->opt, opt); | ||
3363 | + opt = xchg((__force struct ipv6_txoptions **)&inet6_sk(sk)->opt, | ||
3364 | + opt); | ||
3365 | } else { | ||
3366 | spin_lock(&sk->sk_dst_lock); | ||
3367 | - opt = xchg(&inet6_sk(sk)->opt, opt); | ||
3368 | + opt = xchg((__force struct ipv6_txoptions **)&inet6_sk(sk)->opt, | ||
3369 | + opt); | ||
3370 | spin_unlock(&sk->sk_dst_lock); | ||
3371 | } | ||
3372 | sk_dst_reset(sk); | ||
3373 | @@ -213,9 +215,12 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, | ||
3374 | sk->sk_socket->ops = &inet_dgram_ops; | ||
3375 | sk->sk_family = PF_INET; | ||
3376 | } | ||
3377 | - opt = xchg(&np->opt, NULL); | ||
3378 | - if (opt) | ||
3379 | - sock_kfree_s(sk, opt, opt->tot_len); | ||
3380 | + opt = xchg((__force struct ipv6_txoptions **)&np->opt, | ||
3381 | + NULL); | ||
3382 | + if (opt) { | ||
3383 | + atomic_sub(opt->tot_len, &sk->sk_omem_alloc); | ||
3384 | + txopt_put(opt); | ||
3385 | + } | ||
3386 | pktopt = xchg(&np->pktoptions, NULL); | ||
3387 | kfree_skb(pktopt); | ||
3388 | |||
3389 | @@ -385,7 +390,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, | ||
3390 | if (optname != IPV6_RTHDR && !ns_capable(net->user_ns, CAP_NET_RAW)) | ||
3391 | break; | ||
3392 | |||
3393 | - opt = ipv6_renew_options(sk, np->opt, optname, | ||
3394 | + opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk)); | ||
3395 | + opt = ipv6_renew_options(sk, opt, optname, | ||
3396 | (struct ipv6_opt_hdr __user *)optval, | ||
3397 | optlen); | ||
3398 | if (IS_ERR(opt)) { | ||
3399 | @@ -414,8 +420,10 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, | ||
3400 | retv = 0; | ||
3401 | opt = ipv6_update_options(sk, opt); | ||
3402 | sticky_done: | ||
3403 | - if (opt) | ||
3404 | - sock_kfree_s(sk, opt, opt->tot_len); | ||
3405 | + if (opt) { | ||
3406 | + atomic_sub(opt->tot_len, &sk->sk_omem_alloc); | ||
3407 | + txopt_put(opt); | ||
3408 | + } | ||
3409 | break; | ||
3410 | } | ||
3411 | |||
3412 | @@ -468,6 +476,7 @@ sticky_done: | ||
3413 | break; | ||
3414 | |||
3415 | memset(opt, 0, sizeof(*opt)); | ||
3416 | + atomic_set(&opt->refcnt, 1); | ||
3417 | opt->tot_len = sizeof(*opt) + optlen; | ||
3418 | retv = -EFAULT; | ||
3419 | if (copy_from_user(opt+1, optval, optlen)) | ||
3420 | @@ -484,8 +493,10 @@ update: | ||
3421 | retv = 0; | ||
3422 | opt = ipv6_update_options(sk, opt); | ||
3423 | done: | ||
3424 | - if (opt) | ||
3425 | - sock_kfree_s(sk, opt, opt->tot_len); | ||
3426 | + if (opt) { | ||
3427 | + atomic_sub(opt->tot_len, &sk->sk_omem_alloc); | ||
3428 | + txopt_put(opt); | ||
3429 | + } | ||
3430 | break; | ||
3431 | } | ||
3432 | case IPV6_UNICAST_HOPS: | ||
3433 | @@ -1092,10 +1103,11 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, | ||
3434 | case IPV6_RTHDR: | ||
3435 | case IPV6_DSTOPTS: | ||
3436 | { | ||
3437 | + struct ipv6_txoptions *opt; | ||
3438 | |||
3439 | lock_sock(sk); | ||
3440 | - len = ipv6_getsockopt_sticky(sk, np->opt, | ||
3441 | - optname, optval, len); | ||
3442 | + opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk)); | ||
3443 | + len = ipv6_getsockopt_sticky(sk, opt, optname, optval, len); | ||
3444 | release_sock(sk); | ||
3445 | /* check if ipv6_getsockopt_sticky() returns err code */ | ||
3446 | if (len < 0) | ||
3447 | diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c | ||
3448 | index ed2c4e400b46..5aedf76fe287 100644 | ||
3449 | --- a/net/ipv6/mcast.c | ||
3450 | +++ b/net/ipv6/mcast.c | ||
3451 | @@ -1652,7 +1652,6 @@ out: | ||
3452 | if (!err) { | ||
3453 | ICMP6MSGOUT_INC_STATS(net, idev, ICMPV6_MLD2_REPORT); | ||
3454 | ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); | ||
3455 | - IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUTMCAST, payload_len); | ||
3456 | } else { | ||
3457 | IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); | ||
3458 | } | ||
3459 | @@ -2015,7 +2014,6 @@ out: | ||
3460 | if (!err) { | ||
3461 | ICMP6MSGOUT_INC_STATS(net, idev, type); | ||
3462 | ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); | ||
3463 | - IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUTMCAST, full_len); | ||
3464 | } else | ||
3465 | IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); | ||
3466 | |||
3467 | diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
3468 | index 6f187c8d8a1b..d235ed7f47ab 100644 | ||
3469 | --- a/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
3470 | +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
3471 | @@ -190,7 +190,7 @@ static void nf_ct_frag6_expire(unsigned long data) | ||
3472 | /* Creation primitives. */ | ||
3473 | static inline struct frag_queue *fq_find(struct net *net, __be32 id, | ||
3474 | u32 user, struct in6_addr *src, | ||
3475 | - struct in6_addr *dst, u8 ecn) | ||
3476 | + struct in6_addr *dst, int iif, u8 ecn) | ||
3477 | { | ||
3478 | struct inet_frag_queue *q; | ||
3479 | struct ip6_create_arg arg; | ||
3480 | @@ -200,6 +200,7 @@ static inline struct frag_queue *fq_find(struct net *net, __be32 id, | ||
3481 | arg.user = user; | ||
3482 | arg.src = src; | ||
3483 | arg.dst = dst; | ||
3484 | + arg.iif = iif; | ||
3485 | arg.ecn = ecn; | ||
3486 | |||
3487 | local_bh_disable(); | ||
3488 | @@ -603,7 +604,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user) | ||
3489 | fhdr = (struct frag_hdr *)skb_transport_header(clone); | ||
3490 | |||
3491 | fq = fq_find(net, fhdr->identification, user, &hdr->saddr, &hdr->daddr, | ||
3492 | - ip6_frag_ecn(hdr)); | ||
3493 | + skb->dev ? skb->dev->ifindex : 0, ip6_frag_ecn(hdr)); | ||
3494 | if (fq == NULL) { | ||
3495 | pr_debug("Can't find and can't create new queue\n"); | ||
3496 | goto ret_orig; | ||
3497 | diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c | ||
3498 | index 896af8807979..a66a67d17ed6 100644 | ||
3499 | --- a/net/ipv6/raw.c | ||
3500 | +++ b/net/ipv6/raw.c | ||
3501 | @@ -735,6 +735,7 @@ static int rawv6_probe_proto_opt(struct flowi6 *fl6, struct msghdr *msg) | ||
3502 | static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | ||
3503 | struct msghdr *msg, size_t len) | ||
3504 | { | ||
3505 | + struct ipv6_txoptions *opt_to_free = NULL; | ||
3506 | struct ipv6_txoptions opt_space; | ||
3507 | DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name); | ||
3508 | struct in6_addr *daddr, *final_p, final; | ||
3509 | @@ -840,8 +841,10 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | ||
3510 | if (!(opt->opt_nflen|opt->opt_flen)) | ||
3511 | opt = NULL; | ||
3512 | } | ||
3513 | - if (opt == NULL) | ||
3514 | - opt = np->opt; | ||
3515 | + if (!opt) { | ||
3516 | + opt = txopt_get(np); | ||
3517 | + opt_to_free = opt; | ||
3518 | + } | ||
3519 | if (flowlabel) | ||
3520 | opt = fl6_merge_options(&opt_space, flowlabel, opt); | ||
3521 | opt = ipv6_fixup_options(&opt_space, opt); | ||
3522 | @@ -902,6 +905,7 @@ done: | ||
3523 | dst_release(dst); | ||
3524 | out: | ||
3525 | fl6_sock_release(flowlabel); | ||
3526 | + txopt_put(opt_to_free); | ||
3527 | return err < 0 ? err : len; | ||
3528 | do_confirm: | ||
3529 | dst_confirm(dst); | ||
3530 | diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c | ||
3531 | index 1a157ca2ebc1..28e72f396fde 100644 | ||
3532 | --- a/net/ipv6/reassembly.c | ||
3533 | +++ b/net/ipv6/reassembly.c | ||
3534 | @@ -108,7 +108,10 @@ bool ip6_frag_match(const struct inet_frag_queue *q, const void *a) | ||
3535 | return fq->id == arg->id && | ||
3536 | fq->user == arg->user && | ||
3537 | ipv6_addr_equal(&fq->saddr, arg->src) && | ||
3538 | - ipv6_addr_equal(&fq->daddr, arg->dst); | ||
3539 | + ipv6_addr_equal(&fq->daddr, arg->dst) && | ||
3540 | + (arg->iif == fq->iif || | ||
3541 | + !(ipv6_addr_type(arg->dst) & (IPV6_ADDR_MULTICAST | | ||
3542 | + IPV6_ADDR_LINKLOCAL))); | ||
3543 | } | ||
3544 | EXPORT_SYMBOL(ip6_frag_match); | ||
3545 | |||
3546 | @@ -180,7 +183,7 @@ static void ip6_frag_expire(unsigned long data) | ||
3547 | |||
3548 | static __inline__ struct frag_queue * | ||
3549 | fq_find(struct net *net, __be32 id, const struct in6_addr *src, | ||
3550 | - const struct in6_addr *dst, u8 ecn) | ||
3551 | + const struct in6_addr *dst, int iif, u8 ecn) | ||
3552 | { | ||
3553 | struct inet_frag_queue *q; | ||
3554 | struct ip6_create_arg arg; | ||
3555 | @@ -190,6 +193,7 @@ fq_find(struct net *net, __be32 id, const struct in6_addr *src, | ||
3556 | arg.user = IP6_DEFRAG_LOCAL_DELIVER; | ||
3557 | arg.src = src; | ||
3558 | arg.dst = dst; | ||
3559 | + arg.iif = iif; | ||
3560 | arg.ecn = ecn; | ||
3561 | |||
3562 | hash = inet6_hash_frag(id, src, dst); | ||
3563 | @@ -550,7 +554,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb) | ||
3564 | } | ||
3565 | |||
3566 | fq = fq_find(net, fhdr->identification, &hdr->saddr, &hdr->daddr, | ||
3567 | - ip6_frag_ecn(hdr)); | ||
3568 | + skb->dev ? skb->dev->ifindex : 0, ip6_frag_ecn(hdr)); | ||
3569 | if (fq != NULL) { | ||
3570 | int ret; | ||
3571 | |||
3572 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c | ||
3573 | index a24557a1c1d8..45eae1e609d6 100644 | ||
3574 | --- a/net/ipv6/sit.c | ||
3575 | +++ b/net/ipv6/sit.c | ||
3576 | @@ -1394,34 +1394,20 @@ static int ipip6_tunnel_init(struct net_device *dev) | ||
3577 | return 0; | ||
3578 | } | ||
3579 | |||
3580 | -static int __net_init ipip6_fb_tunnel_init(struct net_device *dev) | ||
3581 | +static void __net_init ipip6_fb_tunnel_init(struct net_device *dev) | ||
3582 | { | ||
3583 | struct ip_tunnel *tunnel = netdev_priv(dev); | ||
3584 | struct iphdr *iph = &tunnel->parms.iph; | ||
3585 | struct net *net = dev_net(dev); | ||
3586 | struct sit_net *sitn = net_generic(net, sit_net_id); | ||
3587 | |||
3588 | - tunnel->dev = dev; | ||
3589 | - tunnel->net = dev_net(dev); | ||
3590 | - | ||
3591 | iph->version = 4; | ||
3592 | iph->protocol = IPPROTO_IPV6; | ||
3593 | iph->ihl = 5; | ||
3594 | iph->ttl = 64; | ||
3595 | |||
3596 | - dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); | ||
3597 | - if (!dev->tstats) | ||
3598 | - return -ENOMEM; | ||
3599 | - | ||
3600 | - tunnel->dst_cache = alloc_percpu(struct ip_tunnel_dst); | ||
3601 | - if (!tunnel->dst_cache) { | ||
3602 | - free_percpu(dev->tstats); | ||
3603 | - return -ENOMEM; | ||
3604 | - } | ||
3605 | - | ||
3606 | dev_hold(dev); | ||
3607 | rcu_assign_pointer(sitn->tunnels_wc[0], tunnel); | ||
3608 | - return 0; | ||
3609 | } | ||
3610 | |||
3611 | static int ipip6_validate(struct nlattr *tb[], struct nlattr *data[]) | ||
3612 | @@ -1831,23 +1817,18 @@ static int __net_init sit_init_net(struct net *net) | ||
3613 | */ | ||
3614 | sitn->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL; | ||
3615 | |||
3616 | - err = ipip6_fb_tunnel_init(sitn->fb_tunnel_dev); | ||
3617 | - if (err) | ||
3618 | - goto err_dev_free; | ||
3619 | - | ||
3620 | - ipip6_tunnel_clone_6rd(sitn->fb_tunnel_dev, sitn); | ||
3621 | - | ||
3622 | if ((err = register_netdev(sitn->fb_tunnel_dev))) | ||
3623 | goto err_reg_dev; | ||
3624 | |||
3625 | + ipip6_tunnel_clone_6rd(sitn->fb_tunnel_dev, sitn); | ||
3626 | + ipip6_fb_tunnel_init(sitn->fb_tunnel_dev); | ||
3627 | + | ||
3628 | t = netdev_priv(sitn->fb_tunnel_dev); | ||
3629 | |||
3630 | strcpy(t->parms.name, sitn->fb_tunnel_dev->name); | ||
3631 | return 0; | ||
3632 | |||
3633 | err_reg_dev: | ||
3634 | - dev_put(sitn->fb_tunnel_dev); | ||
3635 | -err_dev_free: | ||
3636 | ipip6_dev_free(sitn->fb_tunnel_dev); | ||
3637 | err_alloc_dev: | ||
3638 | return err; | ||
3639 | diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c | ||
3640 | index 2f25cb6347ca..aa9699301ea8 100644 | ||
3641 | --- a/net/ipv6/syncookies.c | ||
3642 | +++ b/net/ipv6/syncookies.c | ||
3643 | @@ -241,7 +241,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) | ||
3644 | memset(&fl6, 0, sizeof(fl6)); | ||
3645 | fl6.flowi6_proto = IPPROTO_TCP; | ||
3646 | fl6.daddr = ireq->ir_v6_rmt_addr; | ||
3647 | - final_p = fl6_update_dst(&fl6, np->opt, &final); | ||
3648 | + final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt), &final); | ||
3649 | fl6.saddr = ireq->ir_v6_loc_addr; | ||
3650 | fl6.flowi6_oif = sk->sk_bound_dev_if; | ||
3651 | fl6.flowi6_mark = ireq->ir_mark; | ||
3652 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c | ||
3653 | index a3f9f11abf4c..26feadd0b763 100644 | ||
3654 | --- a/net/ipv6/tcp_ipv6.c | ||
3655 | +++ b/net/ipv6/tcp_ipv6.c | ||
3656 | @@ -134,6 +134,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | ||
3657 | struct ipv6_pinfo *np = inet6_sk(sk); | ||
3658 | struct tcp_sock *tp = tcp_sk(sk); | ||
3659 | struct in6_addr *saddr = NULL, *final_p, final; | ||
3660 | + struct ipv6_txoptions *opt; | ||
3661 | struct rt6_info *rt; | ||
3662 | struct flowi6 fl6; | ||
3663 | struct dst_entry *dst; | ||
3664 | @@ -253,7 +254,8 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | ||
3665 | fl6.fl6_dport = usin->sin6_port; | ||
3666 | fl6.fl6_sport = inet->inet_sport; | ||
3667 | |||
3668 | - final_p = fl6_update_dst(&fl6, np->opt, &final); | ||
3669 | + opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk)); | ||
3670 | + final_p = fl6_update_dst(&fl6, opt, &final); | ||
3671 | |||
3672 | security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); | ||
3673 | |||
3674 | @@ -282,9 +284,9 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | ||
3675 | tcp_fetch_timewait_stamp(sk, dst); | ||
3676 | |||
3677 | icsk->icsk_ext_hdr_len = 0; | ||
3678 | - if (np->opt) | ||
3679 | - icsk->icsk_ext_hdr_len = (np->opt->opt_flen + | ||
3680 | - np->opt->opt_nflen); | ||
3681 | + if (opt) | ||
3682 | + icsk->icsk_ext_hdr_len = opt->opt_flen + | ||
3683 | + opt->opt_nflen; | ||
3684 | |||
3685 | tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr); | ||
3686 | |||
3687 | @@ -501,7 +503,8 @@ static int tcp_v6_send_synack(struct sock *sk, struct dst_entry *dst, | ||
3688 | fl6->flowlabel = ip6_flowlabel(ipv6_hdr(ireq->pktopts)); | ||
3689 | |||
3690 | skb_set_queue_mapping(skb, queue_mapping); | ||
3691 | - err = ip6_xmit(sk, skb, fl6, np->opt, np->tclass); | ||
3692 | + err = ip6_xmit(sk, skb, fl6, rcu_dereference(np->opt), | ||
3693 | + np->tclass); | ||
3694 | err = net_xmit_eval(err); | ||
3695 | } | ||
3696 | |||
3697 | @@ -1052,6 +1055,7 @@ static struct sock *tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | ||
3698 | struct inet_request_sock *ireq; | ||
3699 | struct ipv6_pinfo *newnp, *np = inet6_sk(sk); | ||
3700 | struct tcp6_sock *newtcp6sk; | ||
3701 | + struct ipv6_txoptions *opt; | ||
3702 | struct inet_sock *newinet; | ||
3703 | struct tcp_sock *newtp; | ||
3704 | struct sock *newsk; | ||
3705 | @@ -1191,13 +1195,15 @@ static struct sock *tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | ||
3706 | but we make one more one thing there: reattach optmem | ||
3707 | to newsk. | ||
3708 | */ | ||
3709 | - if (np->opt) | ||
3710 | - newnp->opt = ipv6_dup_options(newsk, np->opt); | ||
3711 | - | ||
3712 | + opt = rcu_dereference(np->opt); | ||
3713 | + if (opt) { | ||
3714 | + opt = ipv6_dup_options(newsk, opt); | ||
3715 | + RCU_INIT_POINTER(newnp->opt, opt); | ||
3716 | + } | ||
3717 | inet_csk(newsk)->icsk_ext_hdr_len = 0; | ||
3718 | - if (newnp->opt) | ||
3719 | - inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen + | ||
3720 | - newnp->opt->opt_flen); | ||
3721 | + if (opt) | ||
3722 | + inet_csk(newsk)->icsk_ext_hdr_len = opt->opt_nflen + | ||
3723 | + opt->opt_flen; | ||
3724 | |||
3725 | tcp_sync_mss(newsk, dst_mtu(dst)); | ||
3726 | newtp->advmss = dst_metric_advmss(dst); | ||
3727 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c | ||
3728 | index dd530f0e5a8a..a5ce70502699 100644 | ||
3729 | --- a/net/ipv6/udp.c | ||
3730 | +++ b/net/ipv6/udp.c | ||
3731 | @@ -1082,6 +1082,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk, | ||
3732 | DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name); | ||
3733 | struct in6_addr *daddr, *final_p, final; | ||
3734 | struct ipv6_txoptions *opt = NULL; | ||
3735 | + struct ipv6_txoptions *opt_to_free = NULL; | ||
3736 | struct ip6_flowlabel *flowlabel = NULL; | ||
3737 | struct flowi6 fl6; | ||
3738 | struct dst_entry *dst; | ||
3739 | @@ -1234,8 +1235,10 @@ do_udp_sendmsg: | ||
3740 | opt = NULL; | ||
3741 | connected = 0; | ||
3742 | } | ||
3743 | - if (opt == NULL) | ||
3744 | - opt = np->opt; | ||
3745 | + if (!opt) { | ||
3746 | + opt = txopt_get(np); | ||
3747 | + opt_to_free = opt; | ||
3748 | + } | ||
3749 | if (flowlabel) | ||
3750 | opt = fl6_merge_options(&opt_space, flowlabel, opt); | ||
3751 | opt = ipv6_fixup_options(&opt_space, opt); | ||
3752 | @@ -1329,6 +1332,7 @@ do_append_data: | ||
3753 | out: | ||
3754 | dst_release(dst); | ||
3755 | fl6_sock_release(flowlabel); | ||
3756 | + txopt_put(opt_to_free); | ||
3757 | if (!err) | ||
3758 | return len; | ||
3759 | /* | ||
3760 | diff --git a/net/irda/irlmp.c b/net/irda/irlmp.c | ||
3761 | index a5f28d421ea8..c3a939d7848f 100644 | ||
3762 | --- a/net/irda/irlmp.c | ||
3763 | +++ b/net/irda/irlmp.c | ||
3764 | @@ -1877,7 +1877,7 @@ static void *irlmp_seq_hb_idx(struct irlmp_iter_state *iter, loff_t *off) | ||
3765 | for (element = hashbin_get_first(iter->hashbin); | ||
3766 | element != NULL; | ||
3767 | element = hashbin_get_next(iter->hashbin)) { | ||
3768 | - if (!off || *off-- == 0) { | ||
3769 | + if (!off || (*off)-- == 0) { | ||
3770 | /* NB: hashbin left locked */ | ||
3771 | return element; | ||
3772 | } | ||
3773 | diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c | ||
3774 | index 895348e44c7d..508154a04558 100644 | ||
3775 | --- a/net/l2tp/l2tp_core.c | ||
3776 | +++ b/net/l2tp/l2tp_core.c | ||
3777 | @@ -1319,7 +1319,7 @@ static void l2tp_tunnel_del_work(struct work_struct *work) | ||
3778 | tunnel = container_of(work, struct l2tp_tunnel, del_work); | ||
3779 | sk = l2tp_tunnel_sock_lookup(tunnel); | ||
3780 | if (!sk) | ||
3781 | - return; | ||
3782 | + goto out; | ||
3783 | |||
3784 | sock = sk->sk_socket; | ||
3785 | |||
3786 | @@ -1340,6 +1340,8 @@ static void l2tp_tunnel_del_work(struct work_struct *work) | ||
3787 | } | ||
3788 | |||
3789 | l2tp_tunnel_sock_put(sk); | ||
3790 | +out: | ||
3791 | + l2tp_tunnel_dec_refcount(tunnel); | ||
3792 | } | ||
3793 | |||
3794 | /* Create a socket for the tunnel, if one isn't set up by | ||
3795 | @@ -1639,8 +1641,13 @@ EXPORT_SYMBOL_GPL(l2tp_tunnel_create); | ||
3796 | */ | ||
3797 | int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel) | ||
3798 | { | ||
3799 | + l2tp_tunnel_inc_refcount(tunnel); | ||
3800 | l2tp_tunnel_closeall(tunnel); | ||
3801 | - return (false == queue_work(l2tp_wq, &tunnel->del_work)); | ||
3802 | + if (false == queue_work(l2tp_wq, &tunnel->del_work)) { | ||
3803 | + l2tp_tunnel_dec_refcount(tunnel); | ||
3804 | + return 1; | ||
3805 | + } | ||
3806 | + return 0; | ||
3807 | } | ||
3808 | EXPORT_SYMBOL_GPL(l2tp_tunnel_delete); | ||
3809 | |||
3810 | diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c | ||
3811 | index 0edb263cc002..38658826175c 100644 | ||
3812 | --- a/net/l2tp/l2tp_ip6.c | ||
3813 | +++ b/net/l2tp/l2tp_ip6.c | ||
3814 | @@ -487,6 +487,7 @@ static int l2tp_ip6_sendmsg(struct kiocb *iocb, struct sock *sk, | ||
3815 | DECLARE_SOCKADDR(struct sockaddr_l2tpip6 *, lsa, msg->msg_name); | ||
3816 | struct in6_addr *daddr, *final_p, final; | ||
3817 | struct ipv6_pinfo *np = inet6_sk(sk); | ||
3818 | + struct ipv6_txoptions *opt_to_free = NULL; | ||
3819 | struct ipv6_txoptions *opt = NULL; | ||
3820 | struct ip6_flowlabel *flowlabel = NULL; | ||
3821 | struct dst_entry *dst = NULL; | ||
3822 | @@ -576,8 +577,10 @@ static int l2tp_ip6_sendmsg(struct kiocb *iocb, struct sock *sk, | ||
3823 | opt = NULL; | ||
3824 | } | ||
3825 | |||
3826 | - if (opt == NULL) | ||
3827 | - opt = np->opt; | ||
3828 | + if (!opt) { | ||
3829 | + opt = txopt_get(np); | ||
3830 | + opt_to_free = opt; | ||
3831 | + } | ||
3832 | if (flowlabel) | ||
3833 | opt = fl6_merge_options(&opt_space, flowlabel, opt); | ||
3834 | opt = ipv6_fixup_options(&opt_space, opt); | ||
3835 | @@ -632,6 +635,7 @@ done: | ||
3836 | dst_release(dst); | ||
3837 | out: | ||
3838 | fl6_sock_release(flowlabel); | ||
3839 | + txopt_put(opt_to_free); | ||
3840 | |||
3841 | return err < 0 ? err : len; | ||
3842 | |||
3843 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c | ||
3844 | index bf6097793170..22853af1b6b7 100644 | ||
3845 | --- a/net/packet/af_packet.c | ||
3846 | +++ b/net/packet/af_packet.c | ||
3847 | @@ -1507,6 +1507,20 @@ static void fanout_release(struct sock *sk) | ||
3848 | mutex_unlock(&fanout_mutex); | ||
3849 | } | ||
3850 | |||
3851 | +static bool packet_extra_vlan_len_allowed(const struct net_device *dev, | ||
3852 | + struct sk_buff *skb) | ||
3853 | +{ | ||
3854 | + /* Earlier code assumed this would be a VLAN pkt, double-check | ||
3855 | + * this now that we have the actual packet in hand. We can only | ||
3856 | + * do this check on Ethernet devices. | ||
3857 | + */ | ||
3858 | + if (unlikely(dev->type != ARPHRD_ETHER)) | ||
3859 | + return false; | ||
3860 | + | ||
3861 | + skb_reset_mac_header(skb); | ||
3862 | + return likely(eth_hdr(skb)->h_proto == htons(ETH_P_8021Q)); | ||
3863 | +} | ||
3864 | + | ||
3865 | static const struct proto_ops packet_ops; | ||
3866 | |||
3867 | static const struct proto_ops packet_ops_spkt; | ||
3868 | @@ -1668,18 +1682,10 @@ retry: | ||
3869 | goto retry; | ||
3870 | } | ||
3871 | |||
3872 | - if (len > (dev->mtu + dev->hard_header_len + extra_len)) { | ||
3873 | - /* Earlier code assumed this would be a VLAN pkt, | ||
3874 | - * double-check this now that we have the actual | ||
3875 | - * packet in hand. | ||
3876 | - */ | ||
3877 | - struct ethhdr *ehdr; | ||
3878 | - skb_reset_mac_header(skb); | ||
3879 | - ehdr = eth_hdr(skb); | ||
3880 | - if (ehdr->h_proto != htons(ETH_P_8021Q)) { | ||
3881 | - err = -EMSGSIZE; | ||
3882 | - goto out_unlock; | ||
3883 | - } | ||
3884 | + if (len > (dev->mtu + dev->hard_header_len + extra_len) && | ||
3885 | + !packet_extra_vlan_len_allowed(dev, skb)) { | ||
3886 | + err = -EMSGSIZE; | ||
3887 | + goto out_unlock; | ||
3888 | } | ||
3889 | |||
3890 | skb->protocol = proto; | ||
3891 | @@ -2081,6 +2087,15 @@ static void tpacket_destruct_skb(struct sk_buff *skb) | ||
3892 | sock_wfree(skb); | ||
3893 | } | ||
3894 | |||
3895 | +static void tpacket_set_protocol(const struct net_device *dev, | ||
3896 | + struct sk_buff *skb) | ||
3897 | +{ | ||
3898 | + if (dev->type == ARPHRD_ETHER) { | ||
3899 | + skb_reset_mac_header(skb); | ||
3900 | + skb->protocol = eth_hdr(skb)->h_proto; | ||
3901 | + } | ||
3902 | +} | ||
3903 | + | ||
3904 | static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb, | ||
3905 | void *frame, struct net_device *dev, int size_max, | ||
3906 | __be16 proto, unsigned char *addr, int hlen) | ||
3907 | @@ -2117,8 +2132,6 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb, | ||
3908 | skb_reserve(skb, hlen); | ||
3909 | skb_reset_network_header(skb); | ||
3910 | |||
3911 | - if (!packet_use_direct_xmit(po)) | ||
3912 | - skb_probe_transport_header(skb, 0); | ||
3913 | if (unlikely(po->tp_tx_has_off)) { | ||
3914 | int off_min, off_max, off; | ||
3915 | off_min = po->tp_hdrlen - sizeof(struct sockaddr_ll); | ||
3916 | @@ -2168,6 +2181,8 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb, | ||
3917 | dev->hard_header_len); | ||
3918 | if (unlikely(err)) | ||
3919 | return err; | ||
3920 | + if (!skb->protocol) | ||
3921 | + tpacket_set_protocol(dev, skb); | ||
3922 | |||
3923 | data += dev->hard_header_len; | ||
3924 | to_write -= dev->hard_header_len; | ||
3925 | @@ -2202,6 +2217,8 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb, | ||
3926 | len = ((to_write > len_max) ? len_max : to_write); | ||
3927 | } | ||
3928 | |||
3929 | + skb_probe_transport_header(skb, 0); | ||
3930 | + | ||
3931 | return tp_len; | ||
3932 | } | ||
3933 | |||
3934 | @@ -2246,12 +2263,13 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | ||
3935 | if (unlikely(!(dev->flags & IFF_UP))) | ||
3936 | goto out_put; | ||
3937 | |||
3938 | - reserve = dev->hard_header_len + VLAN_HLEN; | ||
3939 | + if (po->sk.sk_socket->type == SOCK_RAW) | ||
3940 | + reserve = dev->hard_header_len; | ||
3941 | size_max = po->tx_ring.frame_size | ||
3942 | - (po->tp_hdrlen - sizeof(struct sockaddr_ll)); | ||
3943 | |||
3944 | - if (size_max > dev->mtu + reserve) | ||
3945 | - size_max = dev->mtu + reserve; | ||
3946 | + if (size_max > dev->mtu + reserve + VLAN_HLEN) | ||
3947 | + size_max = dev->mtu + reserve + VLAN_HLEN; | ||
3948 | |||
3949 | do { | ||
3950 | ph = packet_current_frame(po, &po->tx_ring, | ||
3951 | @@ -2274,18 +2292,11 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | ||
3952 | |||
3953 | tp_len = tpacket_fill_skb(po, skb, ph, dev, size_max, proto, | ||
3954 | addr, hlen); | ||
3955 | - if (tp_len > dev->mtu + dev->hard_header_len) { | ||
3956 | - struct ethhdr *ehdr; | ||
3957 | - /* Earlier code assumed this would be a VLAN pkt, | ||
3958 | - * double-check this now that we have the actual | ||
3959 | - * packet in hand. | ||
3960 | - */ | ||
3961 | + if (likely(tp_len >= 0) && | ||
3962 | + tp_len > dev->mtu + reserve && | ||
3963 | + !packet_extra_vlan_len_allowed(dev, skb)) | ||
3964 | + tp_len = -EMSGSIZE; | ||
3965 | |||
3966 | - skb_reset_mac_header(skb); | ||
3967 | - ehdr = eth_hdr(skb); | ||
3968 | - if (ehdr->h_proto != htons(ETH_P_8021Q)) | ||
3969 | - tp_len = -EMSGSIZE; | ||
3970 | - } | ||
3971 | if (unlikely(tp_len < 0)) { | ||
3972 | if (po->tp_loss) { | ||
3973 | __packet_set_status(po, ph, | ||
3974 | @@ -2497,18 +2508,10 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | ||
3975 | |||
3976 | sock_tx_timestamp(sk, &skb_shinfo(skb)->tx_flags); | ||
3977 | |||
3978 | - if (!gso_type && (len > dev->mtu + reserve + extra_len)) { | ||
3979 | - /* Earlier code assumed this would be a VLAN pkt, | ||
3980 | - * double-check this now that we have the actual | ||
3981 | - * packet in hand. | ||
3982 | - */ | ||
3983 | - struct ethhdr *ehdr; | ||
3984 | - skb_reset_mac_header(skb); | ||
3985 | - ehdr = eth_hdr(skb); | ||
3986 | - if (ehdr->h_proto != htons(ETH_P_8021Q)) { | ||
3987 | - err = -EMSGSIZE; | ||
3988 | - goto out_free; | ||
3989 | - } | ||
3990 | + if (!gso_type && (len > dev->mtu + reserve + extra_len) && | ||
3991 | + !packet_extra_vlan_len_allowed(dev, skb)) { | ||
3992 | + err = -EMSGSIZE; | ||
3993 | + goto out_free; | ||
3994 | } | ||
3995 | |||
3996 | skb->protocol = proto; | ||
3997 | @@ -2537,8 +2540,8 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | ||
3998 | len += vnet_hdr_len; | ||
3999 | } | ||
4000 | |||
4001 | - if (!packet_use_direct_xmit(po)) | ||
4002 | - skb_probe_transport_header(skb, reserve); | ||
4003 | + skb_probe_transport_header(skb, reserve); | ||
4004 | + | ||
4005 | if (unlikely(extra_len == 4)) | ||
4006 | skb->no_fcs = 1; | ||
4007 | |||
4008 | @@ -2642,22 +2645,40 @@ static int packet_release(struct socket *sock) | ||
4009 | * Attach a packet hook. | ||
4010 | */ | ||
4011 | |||
4012 | -static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 proto) | ||
4013 | +static int packet_do_bind(struct sock *sk, const char *name, int ifindex, | ||
4014 | + __be16 proto) | ||
4015 | { | ||
4016 | struct packet_sock *po = pkt_sk(sk); | ||
4017 | struct net_device *dev_curr; | ||
4018 | __be16 proto_curr; | ||
4019 | bool need_rehook; | ||
4020 | + struct net_device *dev = NULL; | ||
4021 | + int ret = 0; | ||
4022 | + bool unlisted = false; | ||
4023 | |||
4024 | - if (po->fanout) { | ||
4025 | - if (dev) | ||
4026 | - dev_put(dev); | ||
4027 | - | ||
4028 | + if (po->fanout) | ||
4029 | return -EINVAL; | ||
4030 | - } | ||
4031 | |||
4032 | lock_sock(sk); | ||
4033 | spin_lock(&po->bind_lock); | ||
4034 | + rcu_read_lock(); | ||
4035 | + | ||
4036 | + if (name) { | ||
4037 | + dev = dev_get_by_name_rcu(sock_net(sk), name); | ||
4038 | + if (!dev) { | ||
4039 | + ret = -ENODEV; | ||
4040 | + goto out_unlock; | ||
4041 | + } | ||
4042 | + } else if (ifindex) { | ||
4043 | + dev = dev_get_by_index_rcu(sock_net(sk), ifindex); | ||
4044 | + if (!dev) { | ||
4045 | + ret = -ENODEV; | ||
4046 | + goto out_unlock; | ||
4047 | + } | ||
4048 | + } | ||
4049 | + | ||
4050 | + if (dev) | ||
4051 | + dev_hold(dev); | ||
4052 | |||
4053 | proto_curr = po->prot_hook.type; | ||
4054 | dev_curr = po->prot_hook.dev; | ||
4055 | @@ -2665,14 +2686,29 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 proto) | ||
4056 | need_rehook = proto_curr != proto || dev_curr != dev; | ||
4057 | |||
4058 | if (need_rehook) { | ||
4059 | - unregister_prot_hook(sk, true); | ||
4060 | + if (po->running) { | ||
4061 | + rcu_read_unlock(); | ||
4062 | + __unregister_prot_hook(sk, true); | ||
4063 | + rcu_read_lock(); | ||
4064 | + dev_curr = po->prot_hook.dev; | ||
4065 | + if (dev) | ||
4066 | + unlisted = !dev_get_by_index_rcu(sock_net(sk), | ||
4067 | + dev->ifindex); | ||
4068 | + } | ||
4069 | |||
4070 | po->num = proto; | ||
4071 | po->prot_hook.type = proto; | ||
4072 | - po->prot_hook.dev = dev; | ||
4073 | |||
4074 | - po->ifindex = dev ? dev->ifindex : 0; | ||
4075 | - packet_cached_dev_assign(po, dev); | ||
4076 | + if (unlikely(unlisted)) { | ||
4077 | + dev_put(dev); | ||
4078 | + po->prot_hook.dev = NULL; | ||
4079 | + po->ifindex = -1; | ||
4080 | + packet_cached_dev_reset(po); | ||
4081 | + } else { | ||
4082 | + po->prot_hook.dev = dev; | ||
4083 | + po->ifindex = dev ? dev->ifindex : 0; | ||
4084 | + packet_cached_dev_assign(po, dev); | ||
4085 | + } | ||
4086 | } | ||
4087 | if (dev_curr) | ||
4088 | dev_put(dev_curr); | ||
4089 | @@ -2680,7 +2716,7 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 proto) | ||
4090 | if (proto == 0 || !need_rehook) | ||
4091 | goto out_unlock; | ||
4092 | |||
4093 | - if (!dev || (dev->flags & IFF_UP)) { | ||
4094 | + if (!unlisted && (!dev || (dev->flags & IFF_UP))) { | ||
4095 | register_prot_hook(sk); | ||
4096 | } else { | ||
4097 | sk->sk_err = ENETDOWN; | ||
4098 | @@ -2689,9 +2725,10 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 proto) | ||
4099 | } | ||
4100 | |||
4101 | out_unlock: | ||
4102 | + rcu_read_unlock(); | ||
4103 | spin_unlock(&po->bind_lock); | ||
4104 | release_sock(sk); | ||
4105 | - return 0; | ||
4106 | + return ret; | ||
4107 | } | ||
4108 | |||
4109 | /* | ||
4110 | @@ -2703,8 +2740,6 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, | ||
4111 | { | ||
4112 | struct sock *sk = sock->sk; | ||
4113 | char name[15]; | ||
4114 | - struct net_device *dev; | ||
4115 | - int err = -ENODEV; | ||
4116 | |||
4117 | /* | ||
4118 | * Check legality | ||
4119 | @@ -2714,19 +2749,13 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, | ||
4120 | return -EINVAL; | ||
4121 | strlcpy(name, uaddr->sa_data, sizeof(name)); | ||
4122 | |||
4123 | - dev = dev_get_by_name(sock_net(sk), name); | ||
4124 | - if (dev) | ||
4125 | - err = packet_do_bind(sk, dev, pkt_sk(sk)->num); | ||
4126 | - return err; | ||
4127 | + return packet_do_bind(sk, name, 0, pkt_sk(sk)->num); | ||
4128 | } | ||
4129 | |||
4130 | static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | ||
4131 | { | ||
4132 | struct sockaddr_ll *sll = (struct sockaddr_ll *)uaddr; | ||
4133 | struct sock *sk = sock->sk; | ||
4134 | - struct net_device *dev = NULL; | ||
4135 | - int err; | ||
4136 | - | ||
4137 | |||
4138 | /* | ||
4139 | * Check legality | ||
4140 | @@ -2737,16 +2766,8 @@ static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len | ||
4141 | if (sll->sll_family != AF_PACKET) | ||
4142 | return -EINVAL; | ||
4143 | |||
4144 | - if (sll->sll_ifindex) { | ||
4145 | - err = -ENODEV; | ||
4146 | - dev = dev_get_by_index(sock_net(sk), sll->sll_ifindex); | ||
4147 | - if (dev == NULL) | ||
4148 | - goto out; | ||
4149 | - } | ||
4150 | - err = packet_do_bind(sk, dev, sll->sll_protocol ? : pkt_sk(sk)->num); | ||
4151 | - | ||
4152 | -out: | ||
4153 | - return err; | ||
4154 | + return packet_do_bind(sk, NULL, sll->sll_ifindex, | ||
4155 | + sll->sll_protocol ? : pkt_sk(sk)->num); | ||
4156 | } | ||
4157 | |||
4158 | static struct proto packet_proto = { | ||
4159 | diff --git a/net/rds/connection.c b/net/rds/connection.c | ||
4160 | index 378c3a6acf84..f5fb7d6b7c41 100644 | ||
4161 | --- a/net/rds/connection.c | ||
4162 | +++ b/net/rds/connection.c | ||
4163 | @@ -183,6 +183,12 @@ static struct rds_connection *__rds_conn_create(__be32 laddr, __be32 faddr, | ||
4164 | } | ||
4165 | } | ||
4166 | |||
4167 | + if (trans == NULL) { | ||
4168 | + kmem_cache_free(rds_conn_slab, conn); | ||
4169 | + conn = ERR_PTR(-ENODEV); | ||
4170 | + goto out; | ||
4171 | + } | ||
4172 | + | ||
4173 | conn->c_trans = trans; | ||
4174 | |||
4175 | ret = trans->conn_alloc(conn, gfp); | ||
4176 | diff --git a/net/rds/tcp_recv.c b/net/rds/tcp_recv.c | ||
4177 | index 9ae6e0a264ec..2dd88db4a1a2 100644 | ||
4178 | --- a/net/rds/tcp_recv.c | ||
4179 | +++ b/net/rds/tcp_recv.c | ||
4180 | @@ -234,8 +234,15 @@ static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb, | ||
4181 | } | ||
4182 | |||
4183 | to_copy = min(tc->t_tinc_data_rem, left); | ||
4184 | - pskb_pull(clone, offset); | ||
4185 | - pskb_trim(clone, to_copy); | ||
4186 | + if (!pskb_pull(clone, offset) || | ||
4187 | + pskb_trim(clone, to_copy)) { | ||
4188 | + pr_warn("rds_tcp_data_recv: pull/trim failed " | ||
4189 | + "left %zu data_rem %zu skb_len %d\n", | ||
4190 | + left, tc->t_tinc_data_rem, skb->len); | ||
4191 | + kfree_skb(clone); | ||
4192 | + desc->error = -ENOMEM; | ||
4193 | + goto out; | ||
4194 | + } | ||
4195 | skb_queue_tail(&tinc->ti_skb_list, clone); | ||
4196 | |||
4197 | rdsdebug("skb %p data %p len %d off %u to_copy %zu -> " | ||
4198 | diff --git a/net/sctp/auth.c b/net/sctp/auth.c | ||
4199 | index fb7976aee61c..603c3bbc5923 100644 | ||
4200 | --- a/net/sctp/auth.c | ||
4201 | +++ b/net/sctp/auth.c | ||
4202 | @@ -800,8 +800,8 @@ int sctp_auth_ep_set_hmacs(struct sctp_endpoint *ep, | ||
4203 | if (!has_sha1) | ||
4204 | return -EINVAL; | ||
4205 | |||
4206 | - memcpy(ep->auth_hmacs_list->hmac_ids, &hmacs->shmac_idents[0], | ||
4207 | - hmacs->shmac_num_idents * sizeof(__u16)); | ||
4208 | + for (i = 0; i < hmacs->shmac_num_idents; i++) | ||
4209 | + ep->auth_hmacs_list->hmac_ids[i] = htons(hmacs->shmac_idents[i]); | ||
4210 | ep->auth_hmacs_list->param_hdr.length = htons(sizeof(sctp_paramhdr_t) + | ||
4211 | hmacs->shmac_num_idents * sizeof(__u16)); | ||
4212 | return 0; | ||
4213 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c | ||
4214 | index 99e640c46ab2..fb082aa4d656 100644 | ||
4215 | --- a/net/sctp/socket.c | ||
4216 | +++ b/net/sctp/socket.c | ||
4217 | @@ -7393,6 +7393,13 @@ struct proto sctp_prot = { | ||
4218 | |||
4219 | #if IS_ENABLED(CONFIG_IPV6) | ||
4220 | |||
4221 | +#include <net/transp_v6.h> | ||
4222 | +static void sctp_v6_destroy_sock(struct sock *sk) | ||
4223 | +{ | ||
4224 | + sctp_destroy_sock(sk); | ||
4225 | + inet6_destroy_sock(sk); | ||
4226 | +} | ||
4227 | + | ||
4228 | struct proto sctpv6_prot = { | ||
4229 | .name = "SCTPv6", | ||
4230 | .owner = THIS_MODULE, | ||
4231 | @@ -7402,7 +7409,7 @@ struct proto sctpv6_prot = { | ||
4232 | .accept = sctp_accept, | ||
4233 | .ioctl = sctp_ioctl, | ||
4234 | .init = sctp_init_sock, | ||
4235 | - .destroy = sctp_destroy_sock, | ||
4236 | + .destroy = sctp_v6_destroy_sock, | ||
4237 | .shutdown = sctp_shutdown, | ||
4238 | .setsockopt = sctp_setsockopt, | ||
4239 | .getsockopt = sctp_getsockopt, | ||
4240 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c | ||
4241 | index 8232118b3f82..2ae4a5915aa7 100644 | ||
4242 | --- a/net/unix/af_unix.c | ||
4243 | +++ b/net/unix/af_unix.c | ||
4244 | @@ -1962,6 +1962,11 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | ||
4245 | goto out; | ||
4246 | } | ||
4247 | |||
4248 | + if (flags & MSG_PEEK) | ||
4249 | + skip = sk_peek_offset(sk, flags); | ||
4250 | + else | ||
4251 | + skip = 0; | ||
4252 | + | ||
4253 | do { | ||
4254 | int chunk; | ||
4255 | struct sk_buff *skb, *last; | ||
4256 | @@ -2008,7 +2013,6 @@ again: | ||
4257 | break; | ||
4258 | } | ||
4259 | |||
4260 | - skip = sk_peek_offset(sk, flags); | ||
4261 | while (skip >= unix_skb_len(skb)) { | ||
4262 | skip -= unix_skb_len(skb); | ||
4263 | last = skb; | ||
4264 | @@ -2072,6 +2076,16 @@ again: | ||
4265 | |||
4266 | sk_peek_offset_fwd(sk, chunk); | ||
4267 | |||
4268 | + if (UNIXCB(skb).fp) | ||
4269 | + break; | ||
4270 | + | ||
4271 | + skip = 0; | ||
4272 | + last = skb; | ||
4273 | + unix_state_lock(sk); | ||
4274 | + skb = skb_peek_next(skb, &sk->sk_receive_queue); | ||
4275 | + if (skb) | ||
4276 | + goto again; | ||
4277 | + unix_state_unlock(sk); | ||
4278 | break; | ||
4279 | } | ||
4280 | } while (size); | ||
4281 | diff --git a/security/keys/gc.c b/security/keys/gc.c | ||
4282 | index c7952375ac53..addf060399e0 100644 | ||
4283 | --- a/security/keys/gc.c | ||
4284 | +++ b/security/keys/gc.c | ||
4285 | @@ -134,6 +134,12 @@ static noinline void key_gc_unused_keys(struct list_head *keys) | ||
4286 | kdebug("- %u", key->serial); | ||
4287 | key_check(key); | ||
4288 | |||
4289 | + /* Throw away the key data if the key is instantiated */ | ||
4290 | + if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags) && | ||
4291 | + !test_bit(KEY_FLAG_NEGATIVE, &key->flags) && | ||
4292 | + key->type->destroy) | ||
4293 | + key->type->destroy(key); | ||
4294 | + | ||
4295 | security_key_free(key); | ||
4296 | |||
4297 | /* deal with the user's key tracking and quota */ | ||
4298 | @@ -148,10 +154,6 @@ static noinline void key_gc_unused_keys(struct list_head *keys) | ||
4299 | if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) | ||
4300 | atomic_dec(&key->user->nikeys); | ||
4301 | |||
4302 | - /* now throw away the key memory */ | ||
4303 | - if (key->type->destroy) | ||
4304 | - key->type->destroy(key); | ||
4305 | - | ||
4306 | key_user_put(key->user); | ||
4307 | |||
4308 | kfree(key->description); | ||
4309 | diff --git a/tools/net/Makefile b/tools/net/Makefile | ||
4310 | index ee577ea03ba5..ddf888010652 100644 | ||
4311 | --- a/tools/net/Makefile | ||
4312 | +++ b/tools/net/Makefile | ||
4313 | @@ -4,6 +4,9 @@ CC = gcc | ||
4314 | LEX = flex | ||
4315 | YACC = bison | ||
4316 | |||
4317 | +CFLAGS += -Wall -O2 | ||
4318 | +CFLAGS += -D__EXPORTED_HEADERS__ -I../../include/uapi -I../../include | ||
4319 | + | ||
4320 | %.yacc.c: %.y | ||
4321 | $(YACC) -o $@ -d $< | ||
4322 | |||
4323 | @@ -12,15 +15,13 @@ YACC = bison | ||
4324 | |||
4325 | all : bpf_jit_disasm bpf_dbg bpf_asm | ||
4326 | |||
4327 | -bpf_jit_disasm : CFLAGS = -Wall -O2 -DPACKAGE='bpf_jit_disasm' | ||
4328 | +bpf_jit_disasm : CFLAGS += -DPACKAGE='bpf_jit_disasm' | ||
4329 | bpf_jit_disasm : LDLIBS = -lopcodes -lbfd -ldl | ||
4330 | bpf_jit_disasm : bpf_jit_disasm.o | ||
4331 | |||
4332 | -bpf_dbg : CFLAGS = -Wall -O2 | ||
4333 | bpf_dbg : LDLIBS = -lreadline | ||
4334 | bpf_dbg : bpf_dbg.o | ||
4335 | |||
4336 | -bpf_asm : CFLAGS = -Wall -O2 -I. | ||
4337 | bpf_asm : LDLIBS = | ||
4338 | bpf_asm : bpf_asm.o bpf_exp.yacc.o bpf_exp.lex.o | ||
4339 | bpf_exp.lex.o : bpf_exp.yacc.c |