1 |
commit: bec52827cf3c1f86493edb9c70f3fce11cc81512 |
2 |
Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
3 |
AuthorDate: Mon Sep 16 12:21:53 2019 +0000 |
4 |
Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Sep 16 12:21:53 2019 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=bec52827 |
7 |
|
8 |
Linux patch 4.9.193 |
9 |
|
10 |
Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> |
11 |
|
12 |
0000_README | 4 + |
13 |
1192_linux-4.9.193.patch | 399 +++++++++++++++++++++++++++++++++++++++++++++++ |
14 |
2 files changed, 403 insertions(+) |
15 |
|
16 |
diff --git a/0000_README b/0000_README |
17 |
index 9e9b006..5442280 100644 |
18 |
--- a/0000_README |
19 |
+++ b/0000_README |
20 |
@@ -811,6 +811,10 @@ Patch: 1191_linux-4.9.192.patch |
21 |
From: http://www.kernel.org |
22 |
Desc: Linux 4.9.192 |
23 |
|
24 |
+Patch: 1192_linux-4.9.193.patch |
25 |
+From: http://www.kernel.org |
26 |
+Desc: Linux 4.9.193 |
27 |
+ |
28 |
Patch: 1500_XATTR_USER_PREFIX.patch |
29 |
From: https://bugs.gentoo.org/show_bug.cgi?id=470644 |
30 |
Desc: Support for namespace user.pax.* on tmpfs. |
31 |
|
32 |
diff --git a/1192_linux-4.9.193.patch b/1192_linux-4.9.193.patch |
33 |
new file mode 100644 |
34 |
index 0000000..3a1c1b1 |
35 |
--- /dev/null |
36 |
+++ b/1192_linux-4.9.193.patch |
37 |
@@ -0,0 +1,399 @@ |
38 |
+diff --git a/Makefile b/Makefile |
39 |
+index 946951930f62..48f79c6729ad 100644 |
40 |
+--- a/Makefile |
41 |
++++ b/Makefile |
42 |
+@@ -1,6 +1,6 @@ |
43 |
+ VERSION = 4 |
44 |
+ PATCHLEVEL = 9 |
45 |
+-SUBLEVEL = 192 |
46 |
++SUBLEVEL = 193 |
47 |
+ EXTRAVERSION = |
48 |
+ NAME = Roaring Lionus |
49 |
+ |
50 |
+diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c |
51 |
+index 609f0e87ced7..47c6c0401b3a 100644 |
52 |
+--- a/arch/powerpc/kernel/process.c |
53 |
++++ b/arch/powerpc/kernel/process.c |
54 |
+@@ -476,13 +476,14 @@ void giveup_all(struct task_struct *tsk) |
55 |
+ if (!tsk->thread.regs) |
56 |
+ return; |
57 |
+ |
58 |
++ check_if_tm_restore_required(tsk); |
59 |
++ |
60 |
+ usermsr = tsk->thread.regs->msr; |
61 |
+ |
62 |
+ if ((usermsr & msr_all_available) == 0) |
63 |
+ return; |
64 |
+ |
65 |
+ msr_check_and_set(msr_all_available); |
66 |
+- check_if_tm_restore_required(tsk); |
67 |
+ |
68 |
+ #ifdef CONFIG_PPC_FPU |
69 |
+ if (usermsr & MSR_FP) |
70 |
+diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c |
71 |
+index 14071a57c926..f5d74e8db432 100644 |
72 |
+--- a/drivers/clk/clk-s2mps11.c |
73 |
++++ b/drivers/clk/clk-s2mps11.c |
74 |
+@@ -255,7 +255,7 @@ MODULE_DEVICE_TABLE(platform, s2mps11_clk_id); |
75 |
+ * This requires of_device_id table. In the same time this will not change the |
76 |
+ * actual *device* matching so do not add .of_match_table. |
77 |
+ */ |
78 |
+-static const struct of_device_id s2mps11_dt_match[] = { |
79 |
++static const struct of_device_id s2mps11_dt_match[] __used = { |
80 |
+ { |
81 |
+ .compatible = "samsung,s2mps11-clk", |
82 |
+ .data = (void *)S2MPS11X, |
83 |
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c |
84 |
+index 77df50dd6d30..123d85de80d6 100644 |
85 |
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c |
86 |
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c |
87 |
+@@ -264,7 +264,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg, |
88 |
+ |
89 |
+ if ((HIGH_WORD(ebx) & MESSAGE_STATUS_SUCCESS) == 0) { |
90 |
+ kfree(reply); |
91 |
+- |
92 |
++ reply = NULL; |
93 |
+ if ((HIGH_WORD(ebx) & MESSAGE_STATUS_CPT) != 0) { |
94 |
+ /* A checkpoint occurred. Retry. */ |
95 |
+ continue; |
96 |
+@@ -288,7 +288,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg, |
97 |
+ |
98 |
+ if ((HIGH_WORD(ecx) & MESSAGE_STATUS_SUCCESS) == 0) { |
99 |
+ kfree(reply); |
100 |
+- |
101 |
++ reply = NULL; |
102 |
+ if ((HIGH_WORD(ecx) & MESSAGE_STATUS_CPT) != 0) { |
103 |
+ /* A checkpoint occurred. Retry. */ |
104 |
+ continue; |
105 |
+@@ -300,10 +300,8 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg, |
106 |
+ break; |
107 |
+ } |
108 |
+ |
109 |
+- if (retries == RETRIES) { |
110 |
+- kfree(reply); |
111 |
++ if (!reply) |
112 |
+ return -EINVAL; |
113 |
+- } |
114 |
+ |
115 |
+ *msg_len = reply_len; |
116 |
+ *msg = reply; |
117 |
+diff --git a/drivers/vhost/test.c b/drivers/vhost/test.c |
118 |
+index 3cc98c07dcd3..682fc58e1f75 100644 |
119 |
+--- a/drivers/vhost/test.c |
120 |
++++ b/drivers/vhost/test.c |
121 |
+@@ -23,6 +23,12 @@ |
122 |
+ * Using this limit prevents one virtqueue from starving others. */ |
123 |
+ #define VHOST_TEST_WEIGHT 0x80000 |
124 |
+ |
125 |
++/* Max number of packets transferred before requeueing the job. |
126 |
++ * Using this limit prevents one virtqueue from starving others with |
127 |
++ * pkts. |
128 |
++ */ |
129 |
++#define VHOST_TEST_PKT_WEIGHT 256 |
130 |
++ |
131 |
+ enum { |
132 |
+ VHOST_TEST_VQ = 0, |
133 |
+ VHOST_TEST_VQ_MAX = 1, |
134 |
+@@ -81,10 +87,8 @@ static void handle_vq(struct vhost_test *n) |
135 |
+ } |
136 |
+ vhost_add_used_and_signal(&n->dev, vq, head, 0); |
137 |
+ total_len += len; |
138 |
+- if (unlikely(total_len >= VHOST_TEST_WEIGHT)) { |
139 |
+- vhost_poll_queue(&vq->poll); |
140 |
++ if (unlikely(vhost_exceeds_weight(vq, 0, total_len))) |
141 |
+ break; |
142 |
+- } |
143 |
+ } |
144 |
+ |
145 |
+ mutex_unlock(&vq->mutex); |
146 |
+@@ -116,7 +120,8 @@ static int vhost_test_open(struct inode *inode, struct file *f) |
147 |
+ dev = &n->dev; |
148 |
+ vqs[VHOST_TEST_VQ] = &n->vqs[VHOST_TEST_VQ]; |
149 |
+ n->vqs[VHOST_TEST_VQ].handle_kick = handle_vq_kick; |
150 |
+- vhost_dev_init(dev, vqs, VHOST_TEST_VQ_MAX); |
151 |
++ vhost_dev_init(dev, vqs, VHOST_TEST_VQ_MAX, |
152 |
++ VHOST_TEST_PKT_WEIGHT, VHOST_TEST_WEIGHT); |
153 |
+ |
154 |
+ f->private_data = n; |
155 |
+ |
156 |
+diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c |
157 |
+index 8da95d4ac4b7..b14e62f11075 100644 |
158 |
+--- a/drivers/vhost/vhost.c |
159 |
++++ b/drivers/vhost/vhost.c |
160 |
+@@ -1987,7 +1987,7 @@ static int get_indirect(struct vhost_virtqueue *vq, |
161 |
+ /* If this is an input descriptor, increment that count. */ |
162 |
+ if (access == VHOST_ACCESS_WO) { |
163 |
+ *in_num += ret; |
164 |
+- if (unlikely(log)) { |
165 |
++ if (unlikely(log && ret)) { |
166 |
+ log[*log_num].addr = vhost64_to_cpu(vq, desc.addr); |
167 |
+ log[*log_num].len = vhost32_to_cpu(vq, desc.len); |
168 |
+ ++*log_num; |
169 |
+@@ -2123,7 +2123,7 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq, |
170 |
+ /* If this is an input descriptor, |
171 |
+ * increment that count. */ |
172 |
+ *in_num += ret; |
173 |
+- if (unlikely(log)) { |
174 |
++ if (unlikely(log && ret)) { |
175 |
+ log[*log_num].addr = vhost64_to_cpu(vq, desc.addr); |
176 |
+ log[*log_num].len = vhost32_to_cpu(vq, desc.len); |
177 |
+ ++*log_num; |
178 |
+diff --git a/include/net/ipv6_frag.h b/include/net/ipv6_frag.h |
179 |
+index 28aa9b30aece..1f77fb4dc79d 100644 |
180 |
+--- a/include/net/ipv6_frag.h |
181 |
++++ b/include/net/ipv6_frag.h |
182 |
+@@ -94,7 +94,6 @@ ip6frag_expire_frag_queue(struct net *net, struct frag_queue *fq) |
183 |
+ goto out; |
184 |
+ |
185 |
+ head->dev = dev; |
186 |
+- skb_get(head); |
187 |
+ spin_unlock(&fq->q.lock); |
188 |
+ |
189 |
+ icmpv6_send(head, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0); |
190 |
+diff --git a/include/net/xfrm.h b/include/net/xfrm.h |
191 |
+index 835c30e491c8..9e2f260cbb51 100644 |
192 |
+--- a/include/net/xfrm.h |
193 |
++++ b/include/net/xfrm.h |
194 |
+@@ -1297,6 +1297,23 @@ static inline int xfrm_state_kern(const struct xfrm_state *x) |
195 |
+ return atomic_read(&x->tunnel_users); |
196 |
+ } |
197 |
+ |
198 |
++static inline bool xfrm_id_proto_valid(u8 proto) |
199 |
++{ |
200 |
++ switch (proto) { |
201 |
++ case IPPROTO_AH: |
202 |
++ case IPPROTO_ESP: |
203 |
++ case IPPROTO_COMP: |
204 |
++#if IS_ENABLED(CONFIG_IPV6) |
205 |
++ case IPPROTO_ROUTING: |
206 |
++ case IPPROTO_DSTOPTS: |
207 |
++#endif |
208 |
++ return true; |
209 |
++ default: |
210 |
++ return false; |
211 |
++ } |
212 |
++} |
213 |
++ |
214 |
++/* IPSEC_PROTO_ANY only matches 3 IPsec protocols, 0 could match all. */ |
215 |
+ static inline int xfrm_id_proto_match(u8 proto, u8 userproto) |
216 |
+ { |
217 |
+ return (!userproto || proto == userproto || |
218 |
+diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c |
219 |
+index 924bb307c0fa..b314feaf91f4 100644 |
220 |
+--- a/kernel/sched/fair.c |
221 |
++++ b/kernel/sched/fair.c |
222 |
+@@ -3882,6 +3882,8 @@ static void __account_cfs_rq_runtime(struct cfs_rq *cfs_rq, u64 delta_exec) |
223 |
+ if (likely(cfs_rq->runtime_remaining > 0)) |
224 |
+ return; |
225 |
+ |
226 |
++ if (cfs_rq->throttled) |
227 |
++ return; |
228 |
+ /* |
229 |
+ * if we're unable to extend our runtime we resched so that the active |
230 |
+ * hierarchy can be throttled |
231 |
+@@ -4077,6 +4079,9 @@ static u64 distribute_cfs_runtime(struct cfs_bandwidth *cfs_b, |
232 |
+ if (!cfs_rq_throttled(cfs_rq)) |
233 |
+ goto next; |
234 |
+ |
235 |
++ /* By the above check, this should never be true */ |
236 |
++ SCHED_WARN_ON(cfs_rq->runtime_remaining > 0); |
237 |
++ |
238 |
+ runtime = -cfs_rq->runtime_remaining + 1; |
239 |
+ if (runtime > remaining) |
240 |
+ runtime = remaining; |
241 |
+diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c |
242 |
+index 1ae8c59fcb2d..780700fcbe63 100644 |
243 |
+--- a/net/batman-adv/bat_iv_ogm.c |
244 |
++++ b/net/batman-adv/bat_iv_ogm.c |
245 |
+@@ -450,17 +450,23 @@ static u8 batadv_hop_penalty(u8 tq, const struct batadv_priv *bat_priv) |
246 |
+ * batadv_iv_ogm_aggr_packet - checks if there is another OGM attached |
247 |
+ * @buff_pos: current position in the skb |
248 |
+ * @packet_len: total length of the skb |
249 |
+- * @tvlv_len: tvlv length of the previously considered OGM |
250 |
++ * @ogm_packet: potential OGM in buffer |
251 |
+ * |
252 |
+ * Return: true if there is enough space for another OGM, false otherwise. |
253 |
+ */ |
254 |
+-static bool batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len, |
255 |
+- __be16 tvlv_len) |
256 |
++static bool |
257 |
++batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len, |
258 |
++ const struct batadv_ogm_packet *ogm_packet) |
259 |
+ { |
260 |
+ int next_buff_pos = 0; |
261 |
+ |
262 |
+- next_buff_pos += buff_pos + BATADV_OGM_HLEN; |
263 |
+- next_buff_pos += ntohs(tvlv_len); |
264 |
++ /* check if there is enough space for the header */ |
265 |
++ next_buff_pos += buff_pos + sizeof(*ogm_packet); |
266 |
++ if (next_buff_pos > packet_len) |
267 |
++ return false; |
268 |
++ |
269 |
++ /* check if there is enough space for the optional TVLV */ |
270 |
++ next_buff_pos += ntohs(ogm_packet->tvlv_len); |
271 |
+ |
272 |
+ return (next_buff_pos <= packet_len) && |
273 |
+ (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES); |
274 |
+@@ -488,7 +494,7 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet, |
275 |
+ |
276 |
+ /* adjust all flags and log packets */ |
277 |
+ while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len, |
278 |
+- batadv_ogm_packet->tvlv_len)) { |
279 |
++ batadv_ogm_packet)) { |
280 |
+ /* we might have aggregated direct link packets with an |
281 |
+ * ordinary base packet |
282 |
+ */ |
283 |
+@@ -1841,7 +1847,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, |
284 |
+ |
285 |
+ /* unpack the aggregated packets and process them one by one */ |
286 |
+ while (batadv_iv_ogm_aggr_packet(ogm_offset, skb_headlen(skb), |
287 |
+- ogm_packet->tvlv_len)) { |
288 |
++ ogm_packet)) { |
289 |
+ batadv_iv_ogm_process(skb, ogm_offset, if_incoming); |
290 |
+ |
291 |
+ ogm_offset += BATADV_OGM_HLEN; |
292 |
+diff --git a/net/batman-adv/netlink.c b/net/batman-adv/netlink.c |
293 |
+index 64cb6acbe0a6..d7ba4fd24e3d 100644 |
294 |
+--- a/net/batman-adv/netlink.c |
295 |
++++ b/net/batman-adv/netlink.c |
296 |
+@@ -114,7 +114,7 @@ batadv_netlink_get_ifindex(const struct nlmsghdr *nlh, int attrtype) |
297 |
+ { |
298 |
+ struct nlattr *attr = nlmsg_find_attr(nlh, GENL_HDRLEN, attrtype); |
299 |
+ |
300 |
+- return attr ? nla_get_u32(attr) : 0; |
301 |
++ return (attr && nla_len(attr) == sizeof(u32)) ? nla_get_u32(attr) : 0; |
302 |
+ } |
303 |
+ |
304 |
+ /** |
305 |
+diff --git a/net/key/af_key.c b/net/key/af_key.c |
306 |
+index 36db179d848e..d2ec620319d7 100644 |
307 |
+--- a/net/key/af_key.c |
308 |
++++ b/net/key/af_key.c |
309 |
+@@ -1969,8 +1969,10 @@ parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_ipsecrequest *rq) |
310 |
+ |
311 |
+ if (rq->sadb_x_ipsecrequest_mode == 0) |
312 |
+ return -EINVAL; |
313 |
++ if (!xfrm_id_proto_valid(rq->sadb_x_ipsecrequest_proto)) |
314 |
++ return -EINVAL; |
315 |
+ |
316 |
+- t->id.proto = rq->sadb_x_ipsecrequest_proto; /* XXX check proto */ |
317 |
++ t->id.proto = rq->sadb_x_ipsecrequest_proto; |
318 |
+ if ((mode = pfkey_mode_to_xfrm(rq->sadb_x_ipsecrequest_mode)) < 0) |
319 |
+ return -EINVAL; |
320 |
+ t->mode = mode; |
321 |
+diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c |
322 |
+index 884f2136b34b..3734ad56b456 100644 |
323 |
+--- a/net/xfrm/xfrm_state.c |
324 |
++++ b/net/xfrm/xfrm_state.c |
325 |
+@@ -2168,7 +2168,7 @@ void xfrm_state_fini(struct net *net) |
326 |
+ unsigned int sz; |
327 |
+ |
328 |
+ flush_work(&net->xfrm.state_hash_work); |
329 |
+- xfrm_state_flush(net, IPSEC_PROTO_ANY, false); |
330 |
++ xfrm_state_flush(net, 0, false); |
331 |
+ flush_work(&xfrm_state_gc_work); |
332 |
+ |
333 |
+ WARN_ON(!list_empty(&net->xfrm.state_all)); |
334 |
+diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c |
335 |
+index f3e9d500fa5a..ff641b2e1577 100644 |
336 |
+--- a/net/xfrm/xfrm_user.c |
337 |
++++ b/net/xfrm/xfrm_user.c |
338 |
+@@ -1452,20 +1452,8 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family) |
339 |
+ return -EINVAL; |
340 |
+ } |
341 |
+ |
342 |
+- switch (ut[i].id.proto) { |
343 |
+- case IPPROTO_AH: |
344 |
+- case IPPROTO_ESP: |
345 |
+- case IPPROTO_COMP: |
346 |
+-#if IS_ENABLED(CONFIG_IPV6) |
347 |
+- case IPPROTO_ROUTING: |
348 |
+- case IPPROTO_DSTOPTS: |
349 |
+-#endif |
350 |
+- case IPSEC_PROTO_ANY: |
351 |
+- break; |
352 |
+- default: |
353 |
++ if (!xfrm_id_proto_valid(ut[i].id.proto)) |
354 |
+ return -EINVAL; |
355 |
+- } |
356 |
+- |
357 |
+ } |
358 |
+ |
359 |
+ return 0; |
360 |
+diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh |
361 |
+index 381acfc4c59d..98cf6343afcd 100755 |
362 |
+--- a/scripts/decode_stacktrace.sh |
363 |
++++ b/scripts/decode_stacktrace.sh |
364 |
+@@ -77,7 +77,7 @@ parse_symbol() { |
365 |
+ fi |
366 |
+ |
367 |
+ # Strip out the base of the path |
368 |
+- code=${code//^$basepath/""} |
369 |
++ code=${code#$basepath/} |
370 |
+ |
371 |
+ # In the case of inlines, move everything to same line |
372 |
+ code=${code//$'\n'/' '} |
373 |
+diff --git a/sound/pci/hda/hda_auto_parser.c b/sound/pci/hda/hda_auto_parser.c |
374 |
+index a03cf68d0bcd..12d87204e373 100644 |
375 |
+--- a/sound/pci/hda/hda_auto_parser.c |
376 |
++++ b/sound/pci/hda/hda_auto_parser.c |
377 |
+@@ -827,6 +827,8 @@ static void apply_fixup(struct hda_codec *codec, int id, int action, int depth) |
378 |
+ while (id >= 0) { |
379 |
+ const struct hda_fixup *fix = codec->fixup_list + id; |
380 |
+ |
381 |
++ if (++depth > 10) |
382 |
++ break; |
383 |
+ if (fix->chained_before) |
384 |
+ apply_fixup(codec, fix->chain_id, action, depth + 1); |
385 |
+ |
386 |
+@@ -866,8 +868,6 @@ static void apply_fixup(struct hda_codec *codec, int id, int action, int depth) |
387 |
+ } |
388 |
+ if (!fix->chained || fix->chained_before) |
389 |
+ break; |
390 |
+- if (++depth > 10) |
391 |
+- break; |
392 |
+ id = fix->chain_id; |
393 |
+ } |
394 |
+ } |
395 |
+diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c |
396 |
+index 98594cbe34c8..949c90a859fa 100644 |
397 |
+--- a/sound/pci/hda/hda_generic.c |
398 |
++++ b/sound/pci/hda/hda_generic.c |
399 |
+@@ -5807,7 +5807,8 @@ int snd_hda_gen_init(struct hda_codec *codec) |
400 |
+ if (spec->init_hook) |
401 |
+ spec->init_hook(codec); |
402 |
+ |
403 |
+- snd_hda_apply_verbs(codec); |
404 |
++ if (!spec->skip_verbs) |
405 |
++ snd_hda_apply_verbs(codec); |
406 |
+ |
407 |
+ init_multi_out(codec); |
408 |
+ init_extra_out(codec); |
409 |
+diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h |
410 |
+index 932b533feb48..6d1cb2fb447d 100644 |
411 |
+--- a/sound/pci/hda/hda_generic.h |
412 |
++++ b/sound/pci/hda/hda_generic.h |
413 |
+@@ -236,6 +236,7 @@ struct hda_gen_spec { |
414 |
+ unsigned int indep_hp_enabled:1; /* independent HP enabled */ |
415 |
+ unsigned int have_aamix_ctl:1; |
416 |
+ unsigned int hp_mic_jack_modes:1; |
417 |
++ unsigned int skip_verbs:1; /* don't apply verbs at snd_hda_gen_init() */ |
418 |
+ |
419 |
+ /* additional mute flags (only effective with auto_mute_via_amp=1) */ |
420 |
+ u64 mute_bits; |
421 |
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
422 |
+index 8e995fb27312..31322aeebcff 100644 |
423 |
+--- a/sound/pci/hda/patch_realtek.c |
424 |
++++ b/sound/pci/hda/patch_realtek.c |
425 |
+@@ -773,9 +773,11 @@ static int alc_init(struct hda_codec *codec) |
426 |
+ if (spec->init_hook) |
427 |
+ spec->init_hook(codec); |
428 |
+ |
429 |
++ spec->gen.skip_verbs = 1; /* applied in below */ |
430 |
+ snd_hda_gen_init(codec); |
431 |
+ alc_fix_pll(codec); |
432 |
+ alc_auto_init_amp(codec, spec->init_amp); |
433 |
++ snd_hda_apply_verbs(codec); /* apply verbs here after own init */ |
434 |
+ |
435 |
+ snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT); |
436 |
+ |