From 06c368d01904e22fd8d94efe47cba52cf30af3d6 Mon Sep 17 00:00:00 2001 From: "Justin M. Forbes" Date: Mon, 9 Dec 2013 09:28:52 -0600 Subject: [PATCH] Linux v3.12.4 --- ...ent-outgoing-reassembled-skb-properl.patch | 39 -- ...easm-skb-through-instead-of-original.patch | 499 ------------------ drm-radeon-24hz-audio-fixes.patch | 173 ------ ...-a-race-in-elevator-switching-and-md.patch | 163 ------ ...uire-q-sysfs_lock-in-elevator_change.patch | 122 ----- ...t-in-recv_error-and-rxpmtu-functions.patch | 253 --------- ...kage-of-uninitialized-memory-to-user.patch | 256 --------- ...ce-from-broken-irq-remapping-warning.patch | 50 -- ...oom-calculation-in-udp6_ufo_fragment.patch | 43 -- kernel.spec | 77 +-- ...ke-periodic-RTC-update-more-reliable.patch | 47 -- rt2800-add-support-for-rf3070.patch | 87 --- sources | 2 +- ...et-fix-status-interrupt-urb-handling.patch | 40 -- ...ed-interaction-of-VFIO_IOMMU_MAP_DMA.patch | 42 -- ...netif_receive_skb-use-in-irq-disable.patch | 121 ----- 16 files changed, 5 insertions(+), 2009 deletions(-) delete mode 100644 0001-ip6_output-fragment-outgoing-reassembled-skb-properl.patch delete mode 100644 0002-netfilter-push-reasm-skb-through-instead-of-original.patch delete mode 100644 drm-radeon-24hz-audio-fixes.patch delete mode 100644 elevator-Fix-a-race-in-elevator-switching-and-md.patch delete mode 100644 elevator-acquire-q-sysfs_lock-in-elevator_change.patch delete mode 100644 inet-fix-addr_len-msg_namelen-assignment-in-recv_error-and-rxpmtu-functions.patch delete mode 100644 inet-prevent-leakage-of-uninitialized-memory-to-user.patch delete mode 100644 iommu-Remove-stack-trace-from-broken-irq-remapping-warning.patch delete mode 100644 ipv6-fix-headroom-calculation-in-udp6_ufo_fragment.patch delete mode 100644 ntp-Make-periodic-RTC-update-more-reliable.patch delete mode 100644 rt2800-add-support-for-rf3070.patch delete mode 100644 usbnet-fix-status-interrupt-urb-handling.patch delete mode 100644 vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch delete mode 100644 via-velocity-fix-netif_receive_skb-use-in-irq-disable.patch diff --git a/0001-ip6_output-fragment-outgoing-reassembled-skb-properl.patch b/0001-ip6_output-fragment-outgoing-reassembled-skb-properl.patch deleted file mode 100644 index a19217d12..000000000 --- a/0001-ip6_output-fragment-outgoing-reassembled-skb-properl.patch +++ /dev/null @@ -1,39 +0,0 @@ -Bugzilla: 1015905 -Upstream-status: 3.13 (should hit stable) - -From 90e4e23d52fd04f228eed2c3d341136c50058b37 Mon Sep 17 00:00:00 2001 -From: Jiri Pirko -Date: Wed, 6 Nov 2013 17:52:19 +0100 -Subject: [PATCH 1/2] ip6_output: fragment outgoing reassembled skb properly - -If reassembled packet would fit into outdev MTU, it is not fragmented -according the original frag size and it is send as single big packet. - -The second case is if skb is gso. In that case fragmentation does not happen -according to the original frag size. - -This patch fixes these. - -Signed-off-by: Jiri Pirko -Signed-off-by: David S. Miller ---- - net/ipv6/ip6_output.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c -index 5b25f85..f80f2fa 100644 ---- a/net/ipv6/ip6_output.c -+++ b/net/ipv6/ip6_output.c -@@ -150,7 +150,8 @@ static int ip6_finish_output2(struct sk_buff *skb) - static int ip6_finish_output(struct sk_buff *skb) - { - if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) || -- dst_allfrag(skb_dst(skb))) -+ dst_allfrag(skb_dst(skb)) || -+ (IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size)) - return ip6_fragment(skb, ip6_finish_output2); - else - return ip6_finish_output2(skb); --- -1.8.3.1 - diff --git a/0002-netfilter-push-reasm-skb-through-instead-of-original.patch b/0002-netfilter-push-reasm-skb-through-instead-of-original.patch deleted file mode 100644 index 27fee5173..000000000 --- a/0002-netfilter-push-reasm-skb-through-instead-of-original.patch +++ /dev/null @@ -1,499 +0,0 @@ -Bugzilla: 1015905 -Upstream-status: 3.13 (should hit stable) - -From 5c0df04613dd39fba5d2a43eaf90a2dc1dcd8899 Mon Sep 17 00:00:00 2001 -From: Jiri Pirko -Date: Wed, 6 Nov 2013 17:52:20 +0100 -Subject: [PATCH 2/2] netfilter: push reasm skb through instead of original - frag skbs - -Pushing original fragments through causes several problems. For example -for matching, frags may not be matched correctly. Take following -example: - - -On HOSTA do: -ip6tables -I INPUT -p icmpv6 -j DROP -ip6tables -I INPUT -p icmpv6 -m icmp6 --icmpv6-type 128 -j ACCEPT - -and on HOSTB you do: -ping6 HOSTA -s2000 (MTU is 1500) - -Incoming echo requests will be filtered out on HOSTA. This issue does -not occur with smaller packets than MTU (where fragmentation does not happen) - - -As was discussed previously, the only correct solution seems to be to use -reassembled skb instead of separete frags. Doing this has positive side -effects in reducing sk_buff by one pointer (nfct_reasm) and also the reams -dances in ipvs and conntrack can be removed. - -Future plan is to remove net/ipv6/netfilter/nf_conntrack_reasm.c -entirely and use code in net/ipv6/reassembly.c instead. - -Signed-off-by: Jiri Pirko -Acked-by: Julian Anastasov -Signed-off-by: Marcelo Ricardo Leitner -Signed-off-by: David S. Miller - -Conflicts: - include/net/netfilter/ipv6/nf_defrag_ipv6.h - net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c - net/ipv6/netfilter/nf_defrag_ipv6_hooks.c - net/netfilter/ipvs/ip_vs_core.c ---- - include/linux/skbuff.h | 32 --------------- - include/net/ip_vs.h | 32 +-------------- - include/net/netfilter/ipv6/nf_defrag_ipv6.h | 5 +-- - net/core/skbuff.c | 3 -- - net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | 54 +------------------------ - net/ipv6/netfilter/nf_conntrack_reasm.c | 19 +-------- - net/ipv6/netfilter/nf_defrag_ipv6_hooks.c | 7 +++- - net/netfilter/ipvs/ip_vs_core.c | 55 +------------------------- - net/netfilter/ipvs/ip_vs_pe_sip.c | 8 +--- - 9 files changed, 13 insertions(+), 202 deletions(-) - -diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h -index 6bd165b..37b4517 100644 ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -333,11 +333,6 @@ typedef unsigned int sk_buff_data_t; - typedef unsigned char *sk_buff_data_t; - #endif - --#if defined(CONFIG_NF_DEFRAG_IPV4) || defined(CONFIG_NF_DEFRAG_IPV4_MODULE) || \ -- defined(CONFIG_NF_DEFRAG_IPV6) || defined(CONFIG_NF_DEFRAG_IPV6_MODULE) --#define NET_SKBUFF_NF_DEFRAG_NEEDED 1 --#endif -- - /** - * struct sk_buff - socket buffer - * @next: Next buffer in list -@@ -370,7 +365,6 @@ typedef unsigned char *sk_buff_data_t; - * @protocol: Packet protocol from driver - * @destructor: Destruct function - * @nfct: Associated connection, if any -- * @nfct_reasm: netfilter conntrack re-assembly pointer - * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c - * @skb_iif: ifindex of device we arrived on - * @tc_index: Traffic control index -@@ -459,9 +453,6 @@ struct sk_buff { - #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) - struct nf_conntrack *nfct; - #endif --#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED -- struct sk_buff *nfct_reasm; --#endif - #ifdef CONFIG_BRIDGE_NETFILTER - struct nf_bridge_info *nf_bridge; - #endif -@@ -2603,18 +2594,6 @@ static inline void nf_conntrack_get(struct nf_conntrack *nfct) - atomic_inc(&nfct->use); - } - #endif --#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED --static inline void nf_conntrack_get_reasm(struct sk_buff *skb) --{ -- if (skb) -- atomic_inc(&skb->users); --} --static inline void nf_conntrack_put_reasm(struct sk_buff *skb) --{ -- if (skb) -- kfree_skb(skb); --} --#endif - #ifdef CONFIG_BRIDGE_NETFILTER - static inline void nf_bridge_put(struct nf_bridge_info *nf_bridge) - { -@@ -2633,10 +2612,6 @@ static inline void nf_reset(struct sk_buff *skb) - nf_conntrack_put(skb->nfct); - skb->nfct = NULL; - #endif --#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED -- nf_conntrack_put_reasm(skb->nfct_reasm); -- skb->nfct_reasm = NULL; --#endif - #ifdef CONFIG_BRIDGE_NETFILTER - nf_bridge_put(skb->nf_bridge); - skb->nf_bridge = NULL; -@@ -2658,10 +2633,6 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src) - nf_conntrack_get(src->nfct); - dst->nfctinfo = src->nfctinfo; - #endif --#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED -- dst->nfct_reasm = src->nfct_reasm; -- nf_conntrack_get_reasm(src->nfct_reasm); --#endif - #ifdef CONFIG_BRIDGE_NETFILTER - dst->nf_bridge = src->nf_bridge; - nf_bridge_get(src->nf_bridge); -@@ -2673,9 +2644,6 @@ static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src) - #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) - nf_conntrack_put(dst->nfct); - #endif --#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED -- nf_conntrack_put_reasm(dst->nfct_reasm); --#endif - #ifdef CONFIG_BRIDGE_NETFILTER - nf_bridge_put(dst->nf_bridge); - #endif -diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h -index f0d70f0..ff21521 100644 ---- a/include/net/ip_vs.h -+++ b/include/net/ip_vs.h -@@ -109,7 +109,6 @@ extern int ip_vs_conn_tab_size; - struct ip_vs_iphdr { - __u32 len; /* IPv4 simply where L4 starts - IPv6 where L4 Transport Header starts */ -- __u32 thoff_reasm; /* Transport Header Offset in nfct_reasm skb */ - __u16 fragoffs; /* IPv6 fragment offset, 0 if first frag (or not frag)*/ - __s16 protocol; - __s32 flags; -@@ -117,34 +116,12 @@ struct ip_vs_iphdr { - union nf_inet_addr daddr; - }; - --/* Dependency to module: nf_defrag_ipv6 */ --#if defined(CONFIG_NF_DEFRAG_IPV6) || defined(CONFIG_NF_DEFRAG_IPV6_MODULE) --static inline struct sk_buff *skb_nfct_reasm(const struct sk_buff *skb) --{ -- return skb->nfct_reasm; --} --static inline void *frag_safe_skb_hp(const struct sk_buff *skb, int offset, -- int len, void *buffer, -- const struct ip_vs_iphdr *ipvsh) --{ -- if (unlikely(ipvsh->fragoffs && skb_nfct_reasm(skb))) -- return skb_header_pointer(skb_nfct_reasm(skb), -- ipvsh->thoff_reasm, len, buffer); -- -- return skb_header_pointer(skb, offset, len, buffer); --} --#else --static inline struct sk_buff *skb_nfct_reasm(const struct sk_buff *skb) --{ -- return NULL; --} - static inline void *frag_safe_skb_hp(const struct sk_buff *skb, int offset, - int len, void *buffer, - const struct ip_vs_iphdr *ipvsh) - { - return skb_header_pointer(skb, offset, len, buffer); - } --#endif - - static inline void - ip_vs_fill_ip4hdr(const void *nh, struct ip_vs_iphdr *iphdr) -@@ -171,19 +148,12 @@ ip_vs_fill_iph_skb(int af, const struct sk_buff *skb, struct ip_vs_iphdr *iphdr) - (struct ipv6hdr *)skb_network_header(skb); - iphdr->saddr.in6 = iph->saddr; - iphdr->daddr.in6 = iph->daddr; -- /* ipv6_find_hdr() updates len, flags, thoff_reasm */ -- iphdr->thoff_reasm = 0; -+ /* ipv6_find_hdr() updates len, flags */ - iphdr->len = 0; - iphdr->flags = 0; - iphdr->protocol = ipv6_find_hdr(skb, &iphdr->len, -1, - &iphdr->fragoffs, - &iphdr->flags); -- /* get proto from re-assembled packet and it's offset */ -- if (skb_nfct_reasm(skb)) -- iphdr->protocol = ipv6_find_hdr(skb_nfct_reasm(skb), -- &iphdr->thoff_reasm, -- -1, NULL, NULL); -- - } else - #endif - { -diff --git a/include/net/netfilter/ipv6/nf_defrag_ipv6.h b/include/net/netfilter/ipv6/nf_defrag_ipv6.h -index fd79c9a..17920d8 100644 ---- a/include/net/netfilter/ipv6/nf_defrag_ipv6.h -+++ b/include/net/netfilter/ipv6/nf_defrag_ipv6.h -@@ -6,10 +6,7 @@ extern void nf_defrag_ipv6_enable(void); - extern int nf_ct_frag6_init(void); - extern void nf_ct_frag6_cleanup(void); - extern struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user); --extern void nf_ct_frag6_output(unsigned int hooknum, struct sk_buff *skb, -- struct net_device *in, -- struct net_device *out, -- int (*okfn)(struct sk_buff *)); -+extern void nf_ct_frag6_consume_orig(struct sk_buff *skb); - - struct inet_frags_ctl; - -diff --git a/net/core/skbuff.c b/net/core/skbuff.c -index 2c3d0f5..a75022e 100644 ---- a/net/core/skbuff.c -+++ b/net/core/skbuff.c -@@ -580,9 +580,6 @@ static void skb_release_head_state(struct sk_buff *skb) - #if IS_ENABLED(CONFIG_NF_CONNTRACK) - nf_conntrack_put(skb->nfct); - #endif --#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED -- nf_conntrack_put_reasm(skb->nfct_reasm); --#endif - #ifdef CONFIG_BRIDGE_NETFILTER - nf_bridge_put(skb->nf_bridge); - #endif -diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c -index c9b6a6e..97cd750 100644 ---- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c -+++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c -@@ -172,63 +172,13 @@ out: - return nf_conntrack_confirm(skb); - } - --static unsigned int __ipv6_conntrack_in(struct net *net, -- unsigned int hooknum, -- struct sk_buff *skb, -- const struct net_device *in, -- const struct net_device *out, -- int (*okfn)(struct sk_buff *)) --{ -- struct sk_buff *reasm = skb->nfct_reasm; -- const struct nf_conn_help *help; -- struct nf_conn *ct; -- enum ip_conntrack_info ctinfo; -- -- /* This packet is fragmented and has reassembled packet. */ -- if (reasm) { -- /* Reassembled packet isn't parsed yet ? */ -- if (!reasm->nfct) { -- unsigned int ret; -- -- ret = nf_conntrack_in(net, PF_INET6, hooknum, reasm); -- if (ret != NF_ACCEPT) -- return ret; -- } -- -- /* Conntrack helpers need the entire reassembled packet in the -- * POST_ROUTING hook. In case of unconfirmed connections NAT -- * might reassign a helper, so the entire packet is also -- * required. -- */ -- ct = nf_ct_get(reasm, &ctinfo); -- if (ct != NULL && !nf_ct_is_untracked(ct)) { -- help = nfct_help(ct); -- if ((help && help->helper) || !nf_ct_is_confirmed(ct)) { -- nf_conntrack_get_reasm(reasm); -- NF_HOOK_THRESH(NFPROTO_IPV6, hooknum, reasm, -- (struct net_device *)in, -- (struct net_device *)out, -- okfn, NF_IP6_PRI_CONNTRACK + 1); -- return NF_DROP_ERR(-ECANCELED); -- } -- } -- -- nf_conntrack_get(reasm->nfct); -- skb->nfct = reasm->nfct; -- skb->nfctinfo = reasm->nfctinfo; -- return NF_ACCEPT; -- } -- -- return nf_conntrack_in(net, PF_INET6, hooknum, skb); --} -- - static unsigned int ipv6_conntrack_in(unsigned int hooknum, - struct sk_buff *skb, - const struct net_device *in, - const struct net_device *out, - int (*okfn)(struct sk_buff *)) - { -- return __ipv6_conntrack_in(dev_net(in), hooknum, skb, in, out, okfn); -+ return nf_conntrack_in(dev_net(in), PF_INET6, hooknum, skb); - } - - static unsigned int ipv6_conntrack_local(unsigned int hooknum, -@@ -242,7 +192,7 @@ static unsigned int ipv6_conntrack_local(unsigned int hooknum, - net_notice_ratelimited("ipv6_conntrack_local: packet too short\n"); - return NF_ACCEPT; - } -- return __ipv6_conntrack_in(dev_net(out), hooknum, skb, in, out, okfn); -+ return nf_conntrack_in(dev_net(out), PF_INET6, hooknum, skb); - } - - static struct nf_hook_ops ipv6_conntrack_ops[] __read_mostly = { -diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c -index dffdc1a..253566a 100644 ---- a/net/ipv6/netfilter/nf_conntrack_reasm.c -+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c -@@ -621,31 +621,16 @@ ret_orig: - return skb; - } - --void nf_ct_frag6_output(unsigned int hooknum, struct sk_buff *skb, -- struct net_device *in, struct net_device *out, -- int (*okfn)(struct sk_buff *)) -+void nf_ct_frag6_consume_orig(struct sk_buff *skb) - { - struct sk_buff *s, *s2; -- unsigned int ret = 0; - - for (s = NFCT_FRAG6_CB(skb)->orig; s;) { -- nf_conntrack_put_reasm(s->nfct_reasm); -- nf_conntrack_get_reasm(skb); -- s->nfct_reasm = skb; -- - s2 = s->next; - s->next = NULL; -- -- if (ret != -ECANCELED) -- ret = NF_HOOK_THRESH(NFPROTO_IPV6, hooknum, s, -- in, out, okfn, -- NF_IP6_PRI_CONNTRACK_DEFRAG + 1); -- else -- kfree_skb(s); -- -+ consume_skb(s); - s = s2; - } -- nf_conntrack_put_reasm(skb); - } - - static int nf_ct_net_init(struct net *net) -diff --git a/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c b/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c -index aacd121..581dd9e 100644 ---- a/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c -+++ b/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c -@@ -75,8 +75,11 @@ static unsigned int ipv6_defrag(unsigned int hooknum, - if (reasm == skb) - return NF_ACCEPT; - -- nf_ct_frag6_output(hooknum, reasm, (struct net_device *)in, -- (struct net_device *)out, okfn); -+ nf_ct_frag6_consume_orig(reasm); -+ -+ NF_HOOK_THRESH(NFPROTO_IPV6, hooknum, reasm, -+ (struct net_device *) in, (struct net_device *) out, -+ okfn, NF_IP6_PRI_CONNTRACK_DEFRAG + 1); - - return NF_STOLEN; - } -diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c -index 4f69e83..1517b50 100644 ---- a/net/netfilter/ipvs/ip_vs_core.c -+++ b/net/netfilter/ipvs/ip_vs_core.c -@@ -1131,12 +1131,6 @@ ip_vs_out(unsigned int hooknum, struct sk_buff *skb, int af) - ip_vs_fill_iph_skb(af, skb, &iph); - #ifdef CONFIG_IP_VS_IPV6 - if (af == AF_INET6) { -- if (!iph.fragoffs && skb_nfct_reasm(skb)) { -- struct sk_buff *reasm = skb_nfct_reasm(skb); -- /* Save fw mark for coming frags */ -- reasm->ipvs_property = 1; -- reasm->mark = skb->mark; -- } - if (unlikely(iph.protocol == IPPROTO_ICMPV6)) { - int related; - int verdict = ip_vs_out_icmp_v6(skb, &related, -@@ -1606,12 +1600,6 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af) - - #ifdef CONFIG_IP_VS_IPV6 - if (af == AF_INET6) { -- if (!iph.fragoffs && skb_nfct_reasm(skb)) { -- struct sk_buff *reasm = skb_nfct_reasm(skb); -- /* Save fw mark for coming frags. */ -- reasm->ipvs_property = 1; -- reasm->mark = skb->mark; -- } - if (unlikely(iph.protocol == IPPROTO_ICMPV6)) { - int related; - int verdict = ip_vs_in_icmp_v6(skb, &related, hooknum, -@@ -1663,9 +1651,8 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af) - /* sorry, all this trouble for a no-hit :) */ - IP_VS_DBG_PKT(12, af, pp, skb, 0, - "ip_vs_in: packet continues traversal as normal"); -- if (iph.fragoffs && !skb_nfct_reasm(skb)) { -+ if (iph.fragoffs) { - /* Fragment that couldn't be mapped to a conn entry -- * and don't have any pointer to a reasm skb - * is missing module nf_defrag_ipv6 - */ - IP_VS_DBG_RL("Unhandled frag, load nf_defrag_ipv6\n"); -@@ -1748,38 +1735,6 @@ ip_vs_local_request4(unsigned int hooknum, struct sk_buff *skb, - #ifdef CONFIG_IP_VS_IPV6 - - /* -- * AF_INET6 fragment handling -- * Copy info from first fragment, to the rest of them. -- */ --static unsigned int --ip_vs_preroute_frag6(unsigned int hooknum, struct sk_buff *skb, -- const struct net_device *in, -- const struct net_device *out, -- int (*okfn)(struct sk_buff *)) --{ -- struct sk_buff *reasm = skb_nfct_reasm(skb); -- struct net *net; -- -- /* Skip if not a "replay" from nf_ct_frag6_output or first fragment. -- * ipvs_property is set when checking first fragment -- * in ip_vs_in() and ip_vs_out(). -- */ -- if (reasm) -- IP_VS_DBG(2, "Fragment recv prop:%d\n", reasm->ipvs_property); -- if (!reasm || !reasm->ipvs_property) -- return NF_ACCEPT; -- -- net = skb_net(skb); -- if (!net_ipvs(net)->enable) -- return NF_ACCEPT; -- -- /* Copy stored fw mark, saved in ip_vs_{in,out} */ -- skb->mark = reasm->mark; -- -- return NF_ACCEPT; --} -- --/* - * AF_INET6 handler in NF_INET_LOCAL_IN chain - * Schedule and forward packets from remote clients - */ -@@ -1916,14 +1871,6 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = { - .priority = 100, - }, - #ifdef CONFIG_IP_VS_IPV6 -- /* After mangle & nat fetch 2:nd fragment and following */ -- { -- .hook = ip_vs_preroute_frag6, -- .owner = THIS_MODULE, -- .pf = NFPROTO_IPV6, -- .hooknum = NF_INET_PRE_ROUTING, -- .priority = NF_IP6_PRI_NAT_DST + 1, -- }, - /* After packet filtering, change source only for VS/NAT */ - { - .hook = ip_vs_reply6, -diff --git a/net/netfilter/ipvs/ip_vs_pe_sip.c b/net/netfilter/ipvs/ip_vs_pe_sip.c -index 9ef22bd..bed5f70 100644 ---- a/net/netfilter/ipvs/ip_vs_pe_sip.c -+++ b/net/netfilter/ipvs/ip_vs_pe_sip.c -@@ -65,7 +65,6 @@ static int get_callid(const char *dptr, unsigned int dataoff, - static int - ip_vs_sip_fill_param(struct ip_vs_conn_param *p, struct sk_buff *skb) - { -- struct sk_buff *reasm = skb_nfct_reasm(skb); - struct ip_vs_iphdr iph; - unsigned int dataoff, datalen, matchoff, matchlen; - const char *dptr; -@@ -79,15 +78,10 @@ ip_vs_sip_fill_param(struct ip_vs_conn_param *p, struct sk_buff *skb) - /* todo: IPv6 fragments: - * I think this only should be done for the first fragment. /HS - */ -- if (reasm) { -- skb = reasm; -- dataoff = iph.thoff_reasm + sizeof(struct udphdr); -- } else -- dataoff = iph.len + sizeof(struct udphdr); -+ dataoff = iph.len + sizeof(struct udphdr); - - if (dataoff >= skb->len) - return -EINVAL; -- /* todo: Check if this will mess-up the reasm skb !!! /HS */ - retc = skb_linearize(skb); - if (retc < 0) - return retc; --- -1.8.3.1 - diff --git a/drm-radeon-24hz-audio-fixes.patch b/drm-radeon-24hz-audio-fixes.patch deleted file mode 100644 index 4fd8341ed..000000000 --- a/drm-radeon-24hz-audio-fixes.patch +++ /dev/null @@ -1,173 +0,0 @@ -Bugzilla: 1010679 -Upstream-status: 3.13 - -From 908171aa738b5bbcc6241cec46f73fcd57dd00d4 Mon Sep 17 00:00:00 2001 -From: Pierre Ossman -Date: Wed, 6 Nov 2013 20:00:32 +0100 -Subject: [PATCH 1/2] drm/radeon/audio: correct ACR table - -The values were taken from the HDMI spec, but they assumed -exact x/1.001 clocks. Since we round the clocks, we also need -to calculate different N and CTS values. - -Note that the N for 25.2/1.001 MHz at 44.1 kHz audio is out of -spec. Hopefully this mode is rarely used and/or HDMI sinks -tolerate overly large values of N. - -bug: -https://bugs.freedesktop.org/show_bug.cgi?id=69675 - -Signed-off-by: Pierre Ossman -Signed-off-by: Alex Deucher ---- - drivers/gpu/drm/radeon/r600_hdmi.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c -index 4140fe8..e8ca095 100644 ---- a/drivers/gpu/drm/radeon/r600_hdmi.c -+++ b/drivers/gpu/drm/radeon/r600_hdmi.c -@@ -57,15 +57,15 @@ enum r600_hdmi_iec_status_bits { - static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = { - /* 32kHz 44.1kHz 48kHz */ - /* Clock N CTS N CTS N CTS */ -- { 25175, 4576, 28125, 7007, 31250, 6864, 28125 }, /* 25,20/1.001 MHz */ -+ { 25175, 4096, 25175, 28224, 125875, 6144, 25175 }, /* 25,20/1.001 MHz */ - { 25200, 4096, 25200, 6272, 28000, 6144, 25200 }, /* 25.20 MHz */ - { 27000, 4096, 27000, 6272, 30000, 6144, 27000 }, /* 27.00 MHz */ - { 27027, 4096, 27027, 6272, 30030, 6144, 27027 }, /* 27.00*1.001 MHz */ - { 54000, 4096, 54000, 6272, 60000, 6144, 54000 }, /* 54.00 MHz */ - { 54054, 4096, 54054, 6272, 60060, 6144, 54054 }, /* 54.00*1.001 MHz */ -- { 74176, 11648, 210937, 17836, 234375, 11648, 140625 }, /* 74.25/1.001 MHz */ -+ { 74176, 4096, 74176, 5733, 75335, 6144, 74176 }, /* 74.25/1.001 MHz */ - { 74250, 4096, 74250, 6272, 82500, 6144, 74250 }, /* 74.25 MHz */ -- { 148352, 11648, 421875, 8918, 234375, 5824, 140625 }, /* 148.50/1.001 MHz */ -+ { 148352, 4096, 148352, 5733, 150670, 6144, 148352 }, /* 148.50/1.001 MHz */ - { 148500, 4096, 148500, 6272, 165000, 6144, 148500 }, /* 148.50 MHz */ - { 0, 4096, 0, 6272, 0, 6144, 0 } /* Other */ - }; --- -1.8.3.1 - - -From 05e4776357fe7217e531cbaaa163e24f688d10ce Mon Sep 17 00:00:00 2001 -From: Pierre Ossman -Date: Wed, 6 Nov 2013 20:09:08 +0100 -Subject: [PATCH 2/2] drm/radeon/audio: improve ACR calculation - -In order to have any realistic chance of calculating proper -ACR values, we need to be able to calculate both N and CTS, -not just CTS. We still aim for the ideal N as specified in -the HDMI spec though. - -bug: -https://bugs.freedesktop.org/show_bug.cgi?id=69675 - -Signed-off-by: Pierre Ossman -Signed-off-by: Alex Deucher ---- - drivers/gpu/drm/radeon/r600_hdmi.c | 68 ++++++++++++++++++++++++++------------ - 1 file changed, 46 insertions(+), 22 deletions(-) - -diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c -index e8ca095..92c6df7 100644 ---- a/drivers/gpu/drm/radeon/r600_hdmi.c -+++ b/drivers/gpu/drm/radeon/r600_hdmi.c -@@ -24,6 +24,7 @@ - * Authors: Christian König - */ - #include -+#include - #include - #include - #include "radeon.h" -@@ -67,25 +68,47 @@ static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = { - { 74250, 4096, 74250, 6272, 82500, 6144, 74250 }, /* 74.25 MHz */ - { 148352, 4096, 148352, 5733, 150670, 6144, 148352 }, /* 148.50/1.001 MHz */ - { 148500, 4096, 148500, 6272, 165000, 6144, 148500 }, /* 148.50 MHz */ -- { 0, 4096, 0, 6272, 0, 6144, 0 } /* Other */ - }; - -+ - /* -- * calculate CTS value if it's not found in the table -+ * calculate CTS and N values if they are not found in the table - */ --static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int N, int freq) -+static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int *N, int freq) - { -- u64 n; -- u32 d; -- -- if (*CTS == 0) { -- n = (u64)clock * (u64)N * 1000ULL; -- d = 128 * freq; -- do_div(n, d); -- *CTS = n; -- } -- DRM_DEBUG("Using ACR timing N=%d CTS=%d for frequency %d\n", -- N, *CTS, freq); -+ int n, cts; -+ unsigned long div, mul; -+ -+ /* Safe, but overly large values */ -+ n = 128 * freq; -+ cts = clock * 1000; -+ -+ /* Smallest valid fraction */ -+ div = gcd(n, cts); -+ -+ n /= div; -+ cts /= div; -+ -+ /* -+ * The optimal N is 128*freq/1000. Calculate the closest larger -+ * value that doesn't truncate any bits. -+ */ -+ mul = ((128*freq/1000) + (n-1))/n; -+ -+ n *= mul; -+ cts *= mul; -+ -+ /* Check that we are in spec (not always possible) */ -+ if (n < (128*freq/1500)) -+ printk(KERN_WARNING "Calculated ACR N value is too small. You may experience audio problems.\n"); -+ if (n > (128*freq/300)) -+ printk(KERN_WARNING "Calculated ACR N value is too large. You may experience audio problems.\n"); -+ -+ *N = n; -+ *CTS = cts; -+ -+ DRM_DEBUG("Calculated ACR timing N=%d CTS=%d for frequency %d\n", -+ *N, *CTS, freq); - } - - struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock) -@@ -93,15 +116,16 @@ struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock) - struct radeon_hdmi_acr res; - u8 i; - -- for (i = 0; r600_hdmi_predefined_acr[i].clock != clock && -- r600_hdmi_predefined_acr[i].clock != 0; i++) -- ; -- res = r600_hdmi_predefined_acr[i]; -+ /* Precalculated values for common clocks */ -+ for (i = 0; i < ARRAY_SIZE(r600_hdmi_predefined_acr); i++) { -+ if (r600_hdmi_predefined_acr[i].clock == clock) -+ return r600_hdmi_predefined_acr[i]; -+ } - -- /* In case some CTS are missing */ -- r600_hdmi_calc_cts(clock, &res.cts_32khz, res.n_32khz, 32000); -- r600_hdmi_calc_cts(clock, &res.cts_44_1khz, res.n_44_1khz, 44100); -- r600_hdmi_calc_cts(clock, &res.cts_48khz, res.n_48khz, 48000); -+ /* And odd clocks get manually calculated */ -+ r600_hdmi_calc_cts(clock, &res.cts_32khz, &res.n_32khz, 32000); -+ r600_hdmi_calc_cts(clock, &res.cts_44_1khz, &res.n_44_1khz, 44100); -+ r600_hdmi_calc_cts(clock, &res.cts_48khz, &res.n_48khz, 48000); - - return res; - } --- -1.8.3.1 - diff --git a/elevator-Fix-a-race-in-elevator-switching-and-md.patch b/elevator-Fix-a-race-in-elevator-switching-and-md.patch deleted file mode 100644 index f8d8cca2b..000000000 --- a/elevator-Fix-a-race-in-elevator-switching-and-md.patch +++ /dev/null @@ -1,163 +0,0 @@ -Bugzilla: 902012 -Upstream-status: 3.13 -Delivered-To: jwboyer@gmail.com -Received: by 10.76.168.104 with SMTP id zv8csp55663oab; - Fri, 30 Aug 2013 15:52:46 -0700 (PDT) -X-Received: by 10.68.244.168 with SMTP id xh8mr12419215pbc.3.1377903166373; - Fri, 30 Aug 2013 15:52:46 -0700 (PDT) -Return-Path: -Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) - by mx.google.com with ESMTP id qc9si280431pac.269.1969.12.31.16.00.00; - Fri, 30 Aug 2013 15:52:46 -0700 (PDT) -Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; -Authentication-Results: mx.google.com; - spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=linux-kernel-owner@vger.kernel.org; - dkim=neutral (bad format) header.i=@hds.com -Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand - id S1753535Ab3H3WrV (ORCPT - + 99 others); Fri, 30 Aug 2013 18:47:21 -0400 -Received: from usindpps04.hds.com ([207.126.252.17]:35636 "EHLO - usindpps04.hds.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org - with ESMTP id S1752650Ab3H3WrU (ORCPT - ); - Fri, 30 Aug 2013 18:47:20 -0400 -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hds.com; h=subject : to : from : cc - : date : message-id : mime-version : content-type : - content-transfer-encoding; s=mail1; - bh=VofHN8IMnygn2hbqnFjLmX0PPEPbvpzE377u1RxpGOY=; - b=piW6J78W57qDXBPJJuodWw/tvf0T//JbxKX6sLPvpuaOG2nBLMHzDqUeTYwFEQqUvdmf - ZTkiwsKi0WEku3MKcxJ7veR7wvTZcQ4fGMETFTf1c2J/1JOKpXLnft4ERuW89/FAxw25 - wQM1ulsuQ3Cncl0I/sIaqMlaMOtvuQ/C8rsHorp+75eFiL6yx1jU5wMbuti4D/NprIET - 3r57cPZ0YCh6sLjvOgjay6mKyktMToyjHPx6X1TWCSWcwes33Popc1hpadxUdFI/0npL - mN3Tttbe7e2RcmkXAZbwg8xj+FwSu3nIRC4G9UpFCsMz518C/AWZj4puwWE6VHZWVvVZ Rg== -Received: from usindmail01.hds.com (usindmail03 [207.126.252.22]) - by usindpps04.hds.com (8.14.5/8.14.5) with ESMTP id r7UMlBjr025492; - Fri, 30 Aug 2013 18:47:11 -0400 -Received: from hds.com (usindnetf5d-vlan47float.corp.hds.com [10.74.73.11]) - by usindmail01.hds.com (8.14.1/8.14.1) with ESMTP id r7UMl8SG058466; - Fri, 30 Aug 2013 18:47:10 -0400 (EDT) -Subject: [PATCH v2 1/2] elevator: Fix a race in elevator switching and md - device initialization -To: linux-kernel@vger.kernel.org -From: Tomoki Sekiyama -Cc: axboe@kernel.dk, tj@kernel.org, seiji.aguchi@hds.com, - vgoyal@redhat.com, majianpeng@gmail.com -Date: Fri, 30 Aug 2013 18:47:07 -0400 -Message-ID: <20130830224707.21812.63516.stgit@hds.com> -User-Agent: StGit/0.16 -MIME-Version: 1.0 -Content-Type: text/plain; charset="utf-8" -Content-Transfer-Encoding: 7bit -X-Proofpoint-SPF-Result: pass -X-Proofpoint-SPF-Record: v=spf1 mx ip4:207.126.244.0/26 ip4:207.126.252.0/25 include:mktomail.com - include:cloud.hds.com ~all -X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.10.8794,1.0.431,0.0.0000 - definitions=2013-08-30_09:2013-08-30,2013-08-30,1970-01-01 signatures=0 -X-Proofpoint-Spam-Details: rule=notspam policy=outbound_policy score=0 spamscore=0 suspectscore=1 - phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx - scancount=1 engine=7.0.1-1305240000 definitions=main-1308300162 -Sender: linux-kernel-owner@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-kernel@vger.kernel.org - -The soft lockup below happens at the boot time of the system using dm -multipath and the udev rules to switch scheduler. - -[ 356.127001] BUG: soft lockup - CPU#3 stuck for 22s! [sh:483] -[ 356.127001] RIP: 0010:[] [] lock_timer_base.isra.35+0x1d/0x50 -... -[ 356.127001] Call Trace: -[ 356.127001] [] try_to_del_timer_sync+0x20/0x70 -[ 356.127001] [] ? kmem_cache_alloc_node_trace+0x20a/0x230 -[ 356.127001] [] del_timer_sync+0x52/0x60 -[ 356.127001] [] cfq_exit_queue+0x32/0xf0 -[ 356.127001] [] elevator_exit+0x2f/0x50 -[ 356.127001] [] elevator_change+0xf1/0x1c0 -[ 356.127001] [] elv_iosched_store+0x20/0x50 -[ 356.127001] [] queue_attr_store+0x59/0xb0 -[ 356.127001] [] sysfs_write_file+0xc6/0x140 -[ 356.127001] [] vfs_write+0xbd/0x1e0 -[ 356.127001] [] SyS_write+0x49/0xa0 -[ 356.127001] [] system_call_fastpath+0x16/0x1b - -This is caused by a race between md device initialization by multipathd and -shell script to switch the scheduler using sysfs. - - - multipathd: - SyS_ioctl -> do_vfs_ioctl -> dm_ctl_ioctl -> ctl_ioctl -> table_load - -> dm_setup_md_queue -> blk_init_allocated_queue -> elevator_init - q->elevator = elevator_alloc(q, e); // not yet initialized - - - sh -c 'echo deadline > /sys/$DEVPATH/queue/scheduler': - elevator_switch (in the call trace above) - struct elevator_queue *old = q->elevator; - q->elevator = elevator_alloc(q, new_e); - elevator_exit(old); // lockup! (*) - - - multipathd: (cont.) - err = e->ops.elevator_init_fn(q); // init fails; q->elevator is modified - -(*) When del_timer_sync() is called, lock_timer_base() will loop infinitely -while timer->base == NULL. In this case, as timer will never initialized, -it results in lockup. - -This patch introduces acquisition of q->sysfs_lock around elevator_init() -into blk_init_allocated_queue(), to provide mutual exclusion between -initialization of the q->scheduler and switching of the scheduler. - -This should fix this bugzilla: -https://bugzilla.redhat.com/show_bug.cgi?id=902012 - -Signed-off-by: Tomoki Sekiyama ---- - block/blk-core.c | 10 +++++++++- - block/elevator.c | 6 ++++++ - 2 files changed, 15 insertions(+), 1 deletion(-) - -diff --git a/block/blk-core.c b/block/blk-core.c -index 93a18d1..2f6275f 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -739,9 +739,17 @@ blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn, - - q->sg_reserved_size = INT_MAX; - -+ /* Protect q->elevator from elevator_change */ -+ mutex_lock(&q->sysfs_lock); -+ - /* init elevator */ -- if (elevator_init(q, NULL)) -+ if (elevator_init(q, NULL)) { -+ mutex_unlock(&q->sysfs_lock); - return NULL; -+ } -+ -+ mutex_unlock(&q->sysfs_lock); -+ - return q; - } - EXPORT_SYMBOL(blk_init_allocated_queue); -diff --git a/block/elevator.c b/block/elevator.c -index 668394d..02d4390 100644 ---- a/block/elevator.c -+++ b/block/elevator.c -@@ -186,6 +186,12 @@ int elevator_init(struct request_queue *q, char *name) - struct elevator_type *e = NULL; - int err; - -+ /* -+ * q->sysfs_lock must be held to provide mutual exclusion between -+ * elevator_switch() and here. -+ */ -+ lockdep_assert_held(&q->sysfs_lock); -+ - if (unlikely(q->elevator)) - return 0; - - --- -To unsubscribe from this list: send the line "unsubscribe linux-kernel" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html -Please read the FAQ at http://www.tux.org/lkml/ diff --git a/elevator-acquire-q-sysfs_lock-in-elevator_change.patch b/elevator-acquire-q-sysfs_lock-in-elevator_change.patch deleted file mode 100644 index 02c767c67..000000000 --- a/elevator-acquire-q-sysfs_lock-in-elevator_change.patch +++ /dev/null @@ -1,122 +0,0 @@ -Bugzilla: 902012 -Upstream-status: 3.13 -Delivered-To: jwboyer@gmail.com -Received: by 10.76.168.104 with SMTP id zv8csp55623oab; - Fri, 30 Aug 2013 15:51:42 -0700 (PDT) -X-Received: by 10.67.30.70 with SMTP id kc6mr13149193pad.32.1377903101609; - Fri, 30 Aug 2013 15:51:41 -0700 (PDT) -Return-Path: -Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) - by mx.google.com with ESMTP id gg2si304840pac.217.1969.12.31.16.00.00; - Fri, 30 Aug 2013 15:51:41 -0700 (PDT) -Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; -Authentication-Results: mx.google.com; - spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=linux-kernel-owner@vger.kernel.org; - dkim=neutral (bad format) header.i=@hds.com -Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand - id S1756106Ab3H3WrX (ORCPT - + 99 others); Fri, 30 Aug 2013 18:47:23 -0400 -Received: from usindpps04.hds.com ([207.126.252.17]:35640 "EHLO - usindpps04.hds.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org - with ESMTP id S1752650Ab3H3WrW (ORCPT - ); - Fri, 30 Aug 2013 18:47:22 -0400 -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hds.com; h=subject : to : from : cc - : date : message-id : in-reply-to : references : mime-version : - content-type : content-transfer-encoding; s=mail1; - bh=xbQuWVaSJrPfWG5E7bXFAbOFjf/sBaRZsPmpVgy0CYk=; - b=NW/A8Imu32MXoBi5FLrQ0FsK66RTWMQo1bFRtgQplVEQQIAXyf1XhCaAZyTkTplc0iEx - ovyGZHvLbmGL6w3I3pxkCFz1BPJCqoZtvQITir/WvfzyadYOK1cz+vuBUQSCmfkacvS/ - w37h1jLAjsvWXkl0GY7pxB9HJMXdeLnhhuWxtNU8m8rKZ7t3LSByMeQi5/3OTkNojDEe - 70cKeZXCPQ/UIDJAF4cpSVXia5FwoJISjXvQIrvqkYhFelzq3OHMcC482PdpqNB475h3 - yHHJ83HFOLRulUQdOG5ZVTB9qRg0zxRx/oedeXwzturFke68noRRa4f4izQ8sCwsWOCI Dw== -Received: from usindmail01.hds.com (usindmail03 [207.126.252.22]) - by usindpps04.hds.com (8.14.5/8.14.5) with ESMTP id r7UMlHIc025543; - Fri, 30 Aug 2013 18:47:17 -0400 -Received: from hds.com (usindnetf5d-vlan47float.corp.hds.com [10.74.73.11]) - by usindmail01.hds.com (8.14.1/8.14.1) with ESMTP id r7UMlGiC058545; - Fri, 30 Aug 2013 18:47:17 -0400 (EDT) -Subject: [PATCH v2 2/2] elevator: acquire q->sysfs_lock in elevator_change() -To: linux-kernel@vger.kernel.org -From: Tomoki Sekiyama -Cc: axboe@kernel.dk, tj@kernel.org, seiji.aguchi@hds.com, - vgoyal@redhat.com, majianpeng@gmail.com -Date: Fri, 30 Aug 2013 18:47:16 -0400 -Message-ID: <20130830224716.21812.99333.stgit@hds.com> -In-Reply-To: <20130830224707.21812.63516.stgit@hds.com> -References: <20130830224707.21812.63516.stgit@hds.com> -User-Agent: StGit/0.16 -MIME-Version: 1.0 -Content-Type: text/plain; charset="utf-8" -Content-Transfer-Encoding: 7bit -X-Proofpoint-SPF-Result: pass -X-Proofpoint-SPF-Record: v=spf1 mx ip4:207.126.244.0/26 ip4:207.126.252.0/25 include:mktomail.com - include:cloud.hds.com ~all -X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.10.8794,1.0.431,0.0.0000 - definitions=2013-08-30_09:2013-08-30,2013-08-30,1970-01-01 signatures=0 -X-Proofpoint-Spam-Details: rule=notspam policy=outbound_policy score=0 spamscore=0 suspectscore=1 - phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx - scancount=1 engine=7.0.1-1305240000 definitions=main-1308300162 -Sender: linux-kernel-owner@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-kernel@vger.kernel.org - -Add locking of q->sysfs_lock into elevator_change() (an exported function) -to ensure it is held to protect q->elevator from elevator_init(), even if -elevator_change() is called from non-sysfs paths. -sysfs path (elv_iosched_store) uses __elevator_change(), non-locking -version, as the lock is already taken by elv_iosched_store(). - -Signed-off-by: Tomoki Sekiyama ---- - block/elevator.c | 16 ++++++++++++++-- - 1 file changed, 14 insertions(+), 2 deletions(-) - -diff --git a/block/elevator.c b/block/elevator.c -index 02d4390..6d765f7 100644 ---- a/block/elevator.c -+++ b/block/elevator.c -@@ -965,7 +965,7 @@ fail_init: - /* - * Switch this queue to the given IO scheduler. - */ --int elevator_change(struct request_queue *q, const char *name) -+static int __elevator_change(struct request_queue *q, const char *name) - { - char elevator_name[ELV_NAME_MAX]; - struct elevator_type *e; -@@ -987,6 +987,18 @@ int elevator_change(struct request_queue *q, const char *name) - - return elevator_switch(q, e); - } -+ -+int elevator_change(struct request_queue *q, const char *name) -+{ -+ int ret; -+ -+ /* Protect q->elevator from elevator_init() */ -+ mutex_lock(&q->sysfs_lock); -+ ret = __elevator_change(q, name); -+ mutex_unlock(&q->sysfs_lock); -+ -+ return ret; -+} - EXPORT_SYMBOL(elevator_change); - - ssize_t elv_iosched_store(struct request_queue *q, const char *name, -@@ -997,7 +1009,7 @@ ssize_t elv_iosched_store(struct request_queue *q, const char *name, - if (!q->elevator) - return count; - -- ret = elevator_change(q, name); -+ ret = __elevator_change(q, name); - if (!ret) - return count; - - --- -To unsubscribe from this list: send the line "unsubscribe linux-kernel" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html -Please read the FAQ at http://www.tux.org/lkml/ diff --git a/inet-fix-addr_len-msg_namelen-assignment-in-recv_error-and-rxpmtu-functions.patch b/inet-fix-addr_len-msg_namelen-assignment-in-recv_error-and-rxpmtu-functions.patch deleted file mode 100644 index b76fd2a36..000000000 --- a/inet-fix-addr_len-msg_namelen-assignment-in-recv_error-and-rxpmtu-functions.patch +++ /dev/null @@ -1,253 +0,0 @@ -Bugzilla: 1035887 -Upstream-status: 3.13 - -From 4be402ba6158068d53ab0268f1affa9d82dae2ec Mon Sep 17 00:00:00 2001 -From: Hannes Frederic Sowa -Date: Fri, 22 Nov 2013 23:46:12 +0000 -Subject: [PATCH] inet: fix addr_len/msg->msg_namelen assignment in recv_error - and rxpmtu functions - -Commit bceaa90240b6019ed73b49965eac7d167610be69 ("inet: prevent leakage -of uninitialized memory to user in recv syscalls") conditionally updated -addr_len if the msg_name is written to. The recv_error and rxpmtu -functions relied on the recvmsg functions to set up addr_len before. - -As this does not happen any more we have to pass addr_len to those -functions as well and set it to the size of the corresponding sockaddr -length. - -This broke traceroute and such. - -Fixes: bceaa90240b6 ("inet: prevent leakage of uninitialized memory to user in recv syscalls") -Reported-by: Brad Spengler -Reported-by: Tom Labanowski -Cc: mpb -Cc: David S. Miller -Cc: Eric Dumazet -Signed-off-by: Hannes Frederic Sowa -Signed-off-by: David S. Miller ---- - include/net/ip.h | 2 +- - include/net/ipv6.h | 4 ++-- - include/net/ping.h | 3 ++- - net/ipv4/ip_sockglue.c | 3 ++- - net/ipv4/ping.c | 5 +++-- - net/ipv4/raw.c | 2 +- - net/ipv4/udp.c | 2 +- - net/ipv6/datagram.c | 7 +++++-- - net/ipv6/ping.c | 3 ++- - net/ipv6/raw.c | 4 ++-- - net/ipv6/udp.c | 4 ++-- - net/l2tp/l2tp_ip6.c | 2 +- - 12 files changed, 24 insertions(+), 17 deletions(-) - -diff --git a/include/net/ip.h b/include/net/ip.h -index 5e52688..301f10c 100644 ---- a/include/net/ip.h -+++ b/include/net/ip.h -@@ -464,7 +464,7 @@ extern int compat_ip_getsockopt(struct sock *sk, int level, - int optname, char __user *optval, int __user *optlen); - extern int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct sock *)); - --extern int ip_recv_error(struct sock *sk, struct msghdr *msg, int len); -+extern int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len); - extern void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err, - __be16 port, u32 info, u8 *payload); - extern void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport, -diff --git a/include/net/ipv6.h b/include/net/ipv6.h -index bbf1c8f..5529d79 100644 ---- a/include/net/ipv6.h -+++ b/include/net/ipv6.h -@@ -802,8 +802,8 @@ extern int compat_ipv6_getsockopt(struct sock *sk, - extern int ip6_datagram_connect(struct sock *sk, - struct sockaddr *addr, int addr_len); - --extern int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len); --extern int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len); -+extern int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len); -+extern int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len, int *addr_len); - extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, - u32 info, u8 *payload); - extern void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info); -diff --git a/include/net/ping.h b/include/net/ping.h -index 5db0224..2b496e9 100644 ---- a/include/net/ping.h -+++ b/include/net/ping.h -@@ -31,7 +31,8 @@ - - /* Compatibility glue so we can support IPv6 when it's compiled as a module */ - struct pingv6_ops { -- int (*ipv6_recv_error)(struct sock *sk, struct msghdr *msg, int len); -+ int (*ipv6_recv_error)(struct sock *sk, struct msghdr *msg, int len, -+ int *addr_len); - int (*ip6_datagram_recv_ctl)(struct sock *sk, struct msghdr *msg, - struct sk_buff *skb); - int (*icmpv6_err_convert)(u8 type, u8 code, int *err); -diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c -index d9c4f11..23e6ab0 100644 ---- a/net/ipv4/ip_sockglue.c -+++ b/net/ipv4/ip_sockglue.c -@@ -368,7 +368,7 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf - /* - * Handle MSG_ERRQUEUE - */ --int ip_recv_error(struct sock *sk, struct msghdr *msg, int len) -+int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) - { - struct sock_exterr_skb *serr; - struct sk_buff *skb, *skb2; -@@ -405,6 +405,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len) - serr->addr_offset); - sin->sin_port = serr->port; - memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); -+ *addr_len = sizeof(*sin); - } - - memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); -diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c -index 92fb6ff..ac31877 100644 ---- a/net/ipv4/ping.c -+++ b/net/ipv4/ping.c -@@ -838,10 +838,11 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - - if (flags & MSG_ERRQUEUE) { - if (family == AF_INET) { -- return ip_recv_error(sk, msg, len); -+ return ip_recv_error(sk, msg, len, addr_len); - #if IS_ENABLED(CONFIG_IPV6) - } else if (family == AF_INET6) { -- return pingv6_ops.ipv6_recv_error(sk, msg, len); -+ return pingv6_ops.ipv6_recv_error(sk, msg, len, -+ addr_len); - #endif - } - } -diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c -index ca4c3f1..7d3db78 100644 ---- a/net/ipv4/raw.c -+++ b/net/ipv4/raw.c -@@ -695,7 +695,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - goto out; - - if (flags & MSG_ERRQUEUE) { -- err = ip_recv_error(sk, msg, len); -+ err = ip_recv_error(sk, msg, len, addr_len); - goto out; - } - -diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c -index a7003de..1ef8794 100644 ---- a/net/ipv4/udp.c -+++ b/net/ipv4/udp.c -@@ -1210,7 +1210,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - bool slow; - - if (flags & MSG_ERRQUEUE) -- return ip_recv_error(sk, msg, len); -+ return ip_recv_error(sk, msg, len, addr_len); - - try_again: - skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0), -diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c -index 48b6bd2..7a0fd80 100644 ---- a/net/ipv6/datagram.c -+++ b/net/ipv6/datagram.c -@@ -318,7 +318,7 @@ void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu) - /* - * Handle MSG_ERRQUEUE - */ --int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) -+int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) - { - struct ipv6_pinfo *np = inet6_sk(sk); - struct sock_exterr_skb *serr; -@@ -369,6 +369,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) - &sin->sin6_addr); - sin->sin6_scope_id = 0; - } -+ *addr_len = sizeof(*sin); - } - - memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); -@@ -423,7 +424,8 @@ EXPORT_SYMBOL_GPL(ipv6_recv_error); - /* - * Handle IPV6_RECVPATHMTU - */ --int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len) -+int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len, -+ int *addr_len) - { - struct ipv6_pinfo *np = inet6_sk(sk); - struct sk_buff *skb; -@@ -457,6 +459,7 @@ int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len) - sin->sin6_port = 0; - sin->sin6_scope_id = mtu_info.ip6m_addr.sin6_scope_id; - sin->sin6_addr = mtu_info.ip6m_addr.sin6_addr; -+ *addr_len = sizeof(*sin); - } - - put_cmsg(msg, SOL_IPV6, IPV6_PATHMTU, sizeof(mtu_info), &mtu_info); -diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c -index 18f19df..7856e96 100644 ---- a/net/ipv6/ping.c -+++ b/net/ipv6/ping.c -@@ -57,7 +57,8 @@ static struct inet_protosw pingv6_protosw = { - - - /* Compatibility glue so we can support IPv6 when it's compiled as a module */ --static int dummy_ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) -+static int dummy_ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, -+ int *addr_len) - { - return -EAFNOSUPPORT; - } -diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c -index 2f303bf..430067c 100644 ---- a/net/ipv6/raw.c -+++ b/net/ipv6/raw.c -@@ -467,10 +467,10 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, - return -EOPNOTSUPP; - - if (flags & MSG_ERRQUEUE) -- return ipv6_recv_error(sk, msg, len); -+ return ipv6_recv_error(sk, msg, len, addr_len); - - if (np->rxpmtu && np->rxopt.bits.rxpmtu) -- return ipv6_recv_rxpmtu(sk, msg, len); -+ return ipv6_recv_rxpmtu(sk, msg, len, addr_len); - - skb = skb_recv_datagram(sk, flags, noblock, &err); - if (!skb) -diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c -index a59beed..3d2758d 100644 ---- a/net/ipv6/udp.c -+++ b/net/ipv6/udp.c -@@ -375,10 +375,10 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, - bool slow; - - if (flags & MSG_ERRQUEUE) -- return ipv6_recv_error(sk, msg, len); -+ return ipv6_recv_error(sk, msg, len, addr_len); - - if (np->rxpmtu && np->rxopt.bits.rxpmtu) -- return ipv6_recv_rxpmtu(sk, msg, len); -+ return ipv6_recv_rxpmtu(sk, msg, len, addr_len); - - try_again: - skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0), -diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c -index b8a6039..e6e8408 100644 ---- a/net/l2tp/l2tp_ip6.c -+++ b/net/l2tp/l2tp_ip6.c -@@ -665,7 +665,7 @@ static int l2tp_ip6_recvmsg(struct kiocb *iocb, struct sock *sk, - *addr_len = sizeof(*lsa); - - if (flags & MSG_ERRQUEUE) -- return ipv6_recv_error(sk, msg, len); -+ return ipv6_recv_error(sk, msg, len, addr_len); - - skb = skb_recv_datagram(sk, flags, noblock, &err); - if (!skb) --- -1.8.3.1 - diff --git a/inet-prevent-leakage-of-uninitialized-memory-to-user.patch b/inet-prevent-leakage-of-uninitialized-memory-to-user.patch deleted file mode 100644 index c5b941134..000000000 --- a/inet-prevent-leakage-of-uninitialized-memory-to-user.patch +++ /dev/null @@ -1,256 +0,0 @@ -Bugzilla: 1035887 -Upstream-status: 3.13 - -From bceaa90240b6019ed73b49965eac7d167610be69 Mon Sep 17 00:00:00 2001 -From: Hannes Frederic Sowa -Date: Mon, 18 Nov 2013 04:20:45 +0100 -Subject: [PATCH] inet: prevent leakage of uninitialized memory to user in recv - syscalls - -Only update *addr_len when we actually fill in sockaddr, otherwise we -can return uninitialized memory from the stack to the caller in the -recvfrom, recvmmsg and recvmsg syscalls. Drop the the (addr_len == NULL) -checks because we only get called with a valid addr_len pointer either -from sock_common_recvmsg or inet_recvmsg. - -If a blocking read waits on a socket which is concurrently shut down we -now return zero and set msg_msgnamelen to 0. - -Reported-by: mpb -Suggested-by: Eric Dumazet -Signed-off-by: Hannes Frederic Sowa -Signed-off-by: David S. Miller ---- - net/ieee802154/dgram.c | 3 +-- - net/ipv4/ping.c | 19 +++++++------------ - net/ipv4/raw.c | 4 +--- - net/ipv4/udp.c | 7 +------ - net/ipv6/raw.c | 4 +--- - net/ipv6/udp.c | 5 +---- - net/l2tp/l2tp_ip.c | 4 +--- - net/phonet/datagram.c | 9 ++++----- - 8 files changed, 17 insertions(+), 38 deletions(-) - -diff --git a/net/ieee802154/dgram.c b/net/ieee802154/dgram.c -index 581a595..1865fdf 100644 ---- a/net/ieee802154/dgram.c -+++ b/net/ieee802154/dgram.c -@@ -315,9 +315,8 @@ static int dgram_recvmsg(struct kiocb *iocb, struct sock *sk, - if (saddr) { - saddr->family = AF_IEEE802154; - saddr->addr = mac_cb(skb)->sa; -- } -- if (addr_len) - *addr_len = sizeof(*saddr); -+ } - - if (flags & MSG_TRUNC) - copied = skb->len; -diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c -index 9afbdb1..aacefa0 100644 ---- a/net/ipv4/ping.c -+++ b/net/ipv4/ping.c -@@ -830,8 +830,6 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - { - struct inet_sock *isk = inet_sk(sk); - int family = sk->sk_family; -- struct sockaddr_in *sin; -- struct sockaddr_in6 *sin6; - struct sk_buff *skb; - int copied, err; - -@@ -841,13 +839,6 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - if (flags & MSG_OOB) - goto out; - -- if (addr_len) { -- if (family == AF_INET) -- *addr_len = sizeof(*sin); -- else if (family == AF_INET6 && addr_len) -- *addr_len = sizeof(*sin6); -- } -- - if (flags & MSG_ERRQUEUE) { - if (family == AF_INET) { - return ip_recv_error(sk, msg, len); -@@ -877,11 +868,13 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - - /* Copy the address and add cmsg data. */ - if (family == AF_INET) { -- sin = (struct sockaddr_in *) msg->msg_name; -+ struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name; -+ - sin->sin_family = AF_INET; - sin->sin_port = 0 /* skb->h.uh->source */; - sin->sin_addr.s_addr = ip_hdr(skb)->saddr; - memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); -+ *addr_len = sizeof(*sin); - - if (isk->cmsg_flags) - ip_cmsg_recv(msg, skb); -@@ -890,17 +883,19 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - } else if (family == AF_INET6) { - struct ipv6_pinfo *np = inet6_sk(sk); - struct ipv6hdr *ip6 = ipv6_hdr(skb); -- sin6 = (struct sockaddr_in6 *) msg->msg_name; -+ struct sockaddr_in6 *sin6 = -+ (struct sockaddr_in6 *)msg->msg_name; -+ - sin6->sin6_family = AF_INET6; - sin6->sin6_port = 0; - sin6->sin6_addr = ip6->saddr; -- - sin6->sin6_flowinfo = 0; - if (np->sndflow) - sin6->sin6_flowinfo = ip6_flowinfo(ip6); - - sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr, - IP6CB(skb)->iif); -+ *addr_len = sizeof(*sin6); - - if (inet6_sk(sk)->rxopt.all) - pingv6_ops.ip6_datagram_recv_ctl(sk, msg, skb); -diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c -index 41e1d28..5cb8ddb 100644 ---- a/net/ipv4/raw.c -+++ b/net/ipv4/raw.c -@@ -696,9 +696,6 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - if (flags & MSG_OOB) - goto out; - -- if (addr_len) -- *addr_len = sizeof(*sin); -- - if (flags & MSG_ERRQUEUE) { - err = ip_recv_error(sk, msg, len); - goto out; -@@ -726,6 +723,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - sin->sin_addr.s_addr = ip_hdr(skb)->saddr; - sin->sin_port = 0; - memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); -+ *addr_len = sizeof(*sin); - } - if (inet->cmsg_flags) - ip_cmsg_recv(msg, skb); -diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c -index 89909dd..998431c 100644 ---- a/net/ipv4/udp.c -+++ b/net/ipv4/udp.c -@@ -1235,12 +1235,6 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, - int is_udplite = IS_UDPLITE(sk); - bool slow; - -- /* -- * Check any passed addresses -- */ -- if (addr_len) -- *addr_len = sizeof(*sin); -- - if (flags & MSG_ERRQUEUE) - return ip_recv_error(sk, msg, len); - -@@ -1302,6 +1296,7 @@ try_again: - sin->sin_port = udp_hdr(skb)->source; - sin->sin_addr.s_addr = ip_hdr(skb)->saddr; - memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); -+ *addr_len = sizeof(*sin); - } - if (inet->cmsg_flags) - ip_cmsg_recv(msg, skb); -diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c -index 3c00842..e24ff1d 100644 ---- a/net/ipv6/raw.c -+++ b/net/ipv6/raw.c -@@ -465,9 +465,6 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, - if (flags & MSG_OOB) - return -EOPNOTSUPP; - -- if (addr_len) -- *addr_len=sizeof(*sin6); -- - if (flags & MSG_ERRQUEUE) - return ipv6_recv_error(sk, msg, len); - -@@ -506,6 +503,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, - sin6->sin6_flowinfo = 0; - sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr, - IP6CB(skb)->iif); -+ *addr_len = sizeof(*sin6); - } - - sock_recv_ts_and_drops(msg, sk, skb); -diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c -index f3893e8..81eb8cf 100644 ---- a/net/ipv6/udp.c -+++ b/net/ipv6/udp.c -@@ -392,9 +392,6 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, - int is_udp4; - bool slow; - -- if (addr_len) -- *addr_len = sizeof(struct sockaddr_in6); -- - if (flags & MSG_ERRQUEUE) - return ipv6_recv_error(sk, msg, len); - -@@ -480,7 +477,7 @@ try_again: - ipv6_iface_scope_id(&sin6->sin6_addr, - IP6CB(skb)->iif); - } -- -+ *addr_len = sizeof(*sin6); - } - if (is_udp4) { - if (inet->cmsg_flags) -diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c -index 571db8d..da1a1ce 100644 ---- a/net/l2tp/l2tp_ip.c -+++ b/net/l2tp/l2tp_ip.c -@@ -518,9 +518,6 @@ static int l2tp_ip_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m - if (flags & MSG_OOB) - goto out; - -- if (addr_len) -- *addr_len = sizeof(*sin); -- - skb = skb_recv_datagram(sk, flags, noblock, &err); - if (!skb) - goto out; -@@ -543,6 +540,7 @@ static int l2tp_ip_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m - sin->sin_addr.s_addr = ip_hdr(skb)->saddr; - sin->sin_port = 0; - memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); -+ *addr_len = sizeof(*sin); - } - if (inet->cmsg_flags) - ip_cmsg_recv(msg, skb); -diff --git a/net/phonet/datagram.c b/net/phonet/datagram.c -index 12c30f3..38946b2 100644 ---- a/net/phonet/datagram.c -+++ b/net/phonet/datagram.c -@@ -139,9 +139,6 @@ static int pn_recvmsg(struct kiocb *iocb, struct sock *sk, - MSG_CMSG_COMPAT)) - goto out_nofree; - -- if (addr_len) -- *addr_len = sizeof(sa); -- - skb = skb_recv_datagram(sk, flags, noblock, &rval); - if (skb == NULL) - goto out_nofree; -@@ -162,8 +159,10 @@ static int pn_recvmsg(struct kiocb *iocb, struct sock *sk, - - rval = (flags & MSG_TRUNC) ? skb->len : copylen; - -- if (msg->msg_name != NULL) -- memcpy(msg->msg_name, &sa, sizeof(struct sockaddr_pn)); -+ if (msg->msg_name != NULL) { -+ memcpy(msg->msg_name, &sa, sizeof(sa)); -+ *addr_len = sizeof(sa); -+ } - - out: - skb_free_datagram(sk, skb); --- -1.8.3.1 - diff --git a/iommu-Remove-stack-trace-from-broken-irq-remapping-warning.patch b/iommu-Remove-stack-trace-from-broken-irq-remapping-warning.patch deleted file mode 100644 index 235f514b6..000000000 --- a/iommu-Remove-stack-trace-from-broken-irq-remapping-warning.patch +++ /dev/null @@ -1,50 +0,0 @@ -Bugzilla: 982153 -Upstream-status: 3.13 - -From 05104a4e8713b27291c7bb49c1e7e68b4e243571 Mon Sep 17 00:00:00 2001 -From: Neil Horman -Date: Fri, 27 Sep 2013 16:53:35 +0000 -Subject: iommu: Remove stack trace from broken irq remapping warning - -The warning for the irq remapping broken check in intel_irq_remapping.c is -pretty pointless. We need the warning, but we know where its comming from, the -stack trace will always be the same, and it needlessly triggers things like -Abrt. This changes the warning to just print a text warning about BIOS being -broken, without the stack trace, then sets the appropriate taint bit. Since we -automatically disable irq remapping, theres no need to contiue making Abrt jump -at this problem - -Signed-off-by: Neil Horman -CC: Joerg Roedel -CC: Bjorn Helgaas -CC: Andy Lutomirski -CC: Konrad Rzeszutek Wilk -CC: Sebastian Andrzej Siewior -Signed-off-by: Joerg Roedel ---- -diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c -index f71673d..b97d70b 100644 ---- a/drivers/iommu/intel_irq_remapping.c -+++ b/drivers/iommu/intel_irq_remapping.c -@@ -525,12 +525,13 @@ static int __init intel_irq_remapping_supported(void) - if (disable_irq_remap) - return 0; - if (irq_remap_broken) { -- WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND, -- "This system BIOS has enabled interrupt remapping\n" -- "on a chipset that contains an erratum making that\n" -- "feature unstable. To maintain system stability\n" -- "interrupt remapping is being disabled. Please\n" -- "contact your BIOS vendor for an update\n"); -+ printk(KERN_WARNING -+ "This system BIOS has enabled interrupt remapping\n" -+ "on a chipset that contains an erratum making that\n" -+ "feature unstable. To maintain system stability\n" -+ "interrupt remapping is being disabled. Please\n" -+ "contact your BIOS vendor for an update\n"); -+ add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); - disable_irq_remap = 1; - return 0; - } --- -cgit v0.9.2 diff --git a/ipv6-fix-headroom-calculation-in-udp6_ufo_fragment.patch b/ipv6-fix-headroom-calculation-in-udp6_ufo_fragment.patch deleted file mode 100644 index 0895c0930..000000000 --- a/ipv6-fix-headroom-calculation-in-udp6_ufo_fragment.patch +++ /dev/null @@ -1,43 +0,0 @@ -Bugzilla: 1030015 -Upstream-status: 3.13 - -From 0e033e04c2678dbbe74a46b23fffb7bb918c288e Mon Sep 17 00:00:00 2001 -From: Hannes Frederic Sowa -Date: Tue, 5 Nov 2013 02:41:27 +0100 -Subject: [PATCH] ipv6: fix headroom calculation in udp6_ufo_fragment - -Commit 1e2bd517c108816220f262d7954b697af03b5f9c ("udp6: Fix udp -fragmentation for tunnel traffic.") changed the calculation if -there is enough space to include a fragment header in the skb from a -skb->mac_header dervived one to skb_headroom. Because we already peeled -off the skb to transport_header this is wrong. Change this back to check -if we have enough room before the mac_header. - -This fixes a panic Saran Neti reported. He used the tbf scheduler which -skb_gso_segments the skb. The offsets get negative and we panic in memcpy -because the skb was erroneously not expanded at the head. - -Reported-by: Saran Neti -Cc: Pravin B Shelar -Signed-off-by: Hannes Frederic Sowa -Signed-off-by: David S. Miller ---- - net/ipv6/udp_offload.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c -index 08e23b0..e7359f9 100644 ---- a/net/ipv6/udp_offload.c -+++ b/net/ipv6/udp_offload.c -@@ -90,7 +90,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, - - /* Check if there is enough headroom to insert fragment header. */ - tnl_hlen = skb_tnl_header_len(skb); -- if (skb_headroom(skb) < (tnl_hlen + frag_hdr_sz)) { -+ if (skb->mac_header < (tnl_hlen + frag_hdr_sz)) { - if (gso_pskb_expand_head(skb, tnl_hlen + frag_hdr_sz)) - goto out; - } --- -1.8.3.1 - diff --git a/kernel.spec b/kernel.spec index cc293e143..9b6e62caa 100644 --- a/kernel.spec +++ b/kernel.spec @@ -74,7 +74,7 @@ Summary: The Linux kernel %if 0%{?released_kernel} # Do we have a -stable update to apply? -%define stable_update 3 +%define stable_update 4 # Is it a -stable RC? %define stable_rc 0 # Set rpm version accordingly @@ -708,22 +708,6 @@ Patch22000: weird-root-dentry-name-debug.patch Patch25047: drm-radeon-Disable-writeback-by-default-on-ppc.patch -#rhbz 985522 -Patch25107: ntp-Make-periodic-RTC-update-more-reliable.patch - -#rhbz 902012 -Patch25114: elevator-Fix-a-race-in-elevator-switching-and-md.patch -Patch25115: elevator-acquire-q-sysfs_lock-in-elevator_change.patch - -#rhbz 974072 -Patch25116: rt2800-add-support-for-rf3070.patch - -#rhbz 982153 -Patch25123: iommu-Remove-stack-trace-from-broken-irq-remapping-warning.patch - -#rhbz 998732 -Patch25124: vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch - #rhbz 896695 Patch25127: 0002-iwlwifi-don-t-WARN-on-bad-firmware-state.patch @@ -735,19 +719,9 @@ Patch25129: cpupower-Fix-segfault-due-to-incorrect-getopt_long-a.patch Patch25140: drm-qxl-backport-fixes-for-Fedora.patch -#CVE-2013-4563 rhbz 1030015 1030017 -Patch25145: ipv6-fix-headroom-calculation-in-udp6_ufo_fragment.patch - -#rhbz 1015905 -Patch25146: 0001-ip6_output-fragment-outgoing-reassembled-skb-properl.patch -Patch25147: 0002-netfilter-push-reasm-skb-through-instead-of-original.patch - #rhbz 1011362 Patch25148: alx-Reset-phy-speed-after-resume.patch -#rhbz 1010679 -Patch25149: drm-radeon-24hz-audio-fixes.patch - # Fix 15sec NFS mount delay Patch25152: sunrpc-create-a-new-dummy-pipe-for-gssd-to-hold-open.patch Patch25153: sunrpc-replace-gssd_running-with-more-reliable-check.patch @@ -756,16 +730,6 @@ Patch25154: nfs-check-gssd-running-before-krb5i-auth.patch #CVE-2013-6382 rhbz 1033603 1034670 Patch25157: xfs-underflow-bug-in-xfs_attrlist_by_handle.patch -#rhbz 1022733 -Patch25158: via-velocity-fix-netif_receive_skb-use-in-irq-disable.patch - -#rhbz 998342 -Patch25159: usbnet-fix-status-interrupt-urb-handling.patch - -#CVE-2013-6405 rhbz 1035875 1035887 -Patch25161: inet-prevent-leakage-of-uninitialized-memory-to-user.patch -Patch25162: inet-fix-addr_len-msg_namelen-assignment-in-recv_error-and-rxpmtu-functions.patch - #rhbz 958826 Patch25164: dell-laptop.patch @@ -1441,22 +1405,6 @@ ApplyPatch ath9k_rx_dma_stop_check.patch ApplyPatch drm-radeon-Disable-writeback-by-default-on-ppc.patch -#rhbz 985522 -ApplyPatch ntp-Make-periodic-RTC-update-more-reliable.patch - -#rhbz 902012 -ApplyPatch elevator-Fix-a-race-in-elevator-switching-and-md.patch -ApplyPatch elevator-acquire-q-sysfs_lock-in-elevator_change.patch - -#rhbz 974072 -ApplyPatch rt2800-add-support-for-rf3070.patch - -#rhbz 982153 -ApplyPatch iommu-Remove-stack-trace-from-broken-irq-remapping-warning.patch - -#rhbz 998732 -ApplyPatch vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch - #rhbz 896695 ApplyPatch 0002-iwlwifi-don-t-WARN-on-bad-firmware-state.patch @@ -1468,19 +1416,9 @@ ApplyPatch cpupower-Fix-segfault-due-to-incorrect-getopt_long-a.patch ApplyPatch drm-qxl-backport-fixes-for-Fedora.patch -#CVE-2013-4563 rhbz 1030015 1030017 -ApplyPatch ipv6-fix-headroom-calculation-in-udp6_ufo_fragment.patch - -#rhbz 1015905 -ApplyPatch 0001-ip6_output-fragment-outgoing-reassembled-skb-properl.patch -ApplyPatch 0002-netfilter-push-reasm-skb-through-instead-of-original.patch - #rhbz 1011362 ApplyPatch alx-Reset-phy-speed-after-resume.patch -#rhbz 1010679 -ApplyPatch drm-radeon-24hz-audio-fixes.patch - # Fix 15sec NFS mount delay ApplyPatch sunrpc-create-a-new-dummy-pipe-for-gssd-to-hold-open.patch ApplyPatch sunrpc-replace-gssd_running-with-more-reliable-check.patch @@ -1489,16 +1427,6 @@ ApplyPatch nfs-check-gssd-running-before-krb5i-auth.patch #CVE-2013-6382 rhbz 1033603 1034670 ApplyPatch xfs-underflow-bug-in-xfs_attrlist_by_handle.patch -#rhbz 1022733 -ApplyPatch via-velocity-fix-netif_receive_skb-use-in-irq-disable.patch - -#rhbz 998342 -ApplyPatch usbnet-fix-status-interrupt-urb-handling.patch - -#CVE-2013-6405 rhbz 1035875 1035887 -ApplyPatch inet-prevent-leakage-of-uninitialized-memory-to-user.patch -ApplyPatch inet-fix-addr_len-msg_namelen-assignment-in-recv_error-and-rxpmtu-functions.patch - #rhbz 958826 ApplyPatch dell-laptop.patch @@ -2305,6 +2233,9 @@ fi # ||----w | # || || %changelog +* Mon Dec 09 2013 Justin M. Forbes - 3.12.4-1 +- Linux v3.12.4 + * Thu Dec 05 2013 Josh Boyer - Add various fixes for keys crashes and an SELinux issue (rhbz 1035000) diff --git a/ntp-Make-periodic-RTC-update-more-reliable.patch b/ntp-Make-periodic-RTC-update-more-reliable.patch deleted file mode 100644 index a2f6cea47..000000000 --- a/ntp-Make-periodic-RTC-update-more-reliable.patch +++ /dev/null @@ -1,47 +0,0 @@ -Bugzilla: 985522 -Upstream-status: 3.13 - -From a97ad0c4b447a132a322cedc3a5f7fa4cab4b304 Mon Sep 17 00:00:00 2001 -From: Miroslav Lichvar -Date: Thu, 1 Aug 2013 19:31:35 +0200 -Subject: [PATCH] ntp: Make periodic RTC update more reliable - -The current code requires that the scheduled update of the RTC happens -in the closest tick to the half of the second. This seems to be -difficult to achieve reliably. The scheduled work may be missing the -target time by a tick or two and be constantly rescheduled every second. - -Relax the limit to 10 ticks. As a typical RTC drifts in the 11-minute -update interval by several milliseconds, this shouldn't affect the -overall accuracy of the RTC much. - -Signed-off-by: Miroslav Lichvar -Signed-off-by: John Stultz ---- - kernel/time/ntp.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c -index 8f5b3b9..ab1fa7c 100644 ---- a/kernel/time/ntp.c -+++ b/kernel/time/ntp.c -@@ -475,6 +475,7 @@ static void sync_cmos_clock(struct work_struct *work) - * called as close as possible to 500 ms before the new second starts. - * This code is run on a timer. If the clock is set, that timer - * may not expire at the correct time. Thus, we adjust... -+ * We want the clock to be within a couple of ticks from the target. - */ - if (!ntp_synced()) { - /* -@@ -485,7 +486,7 @@ static void sync_cmos_clock(struct work_struct *work) - } - - getnstimeofday(&now); -- if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) { -+ if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec * 5) { - struct timespec adjust = now; - - fail = -ENODEV; --- -1.7.9.5 - diff --git a/rt2800-add-support-for-rf3070.patch b/rt2800-add-support-for-rf3070.patch deleted file mode 100644 index dba9860bd..000000000 --- a/rt2800-add-support-for-rf3070.patch +++ /dev/null @@ -1,87 +0,0 @@ -Bugzilla: 974072 -Upstream-status: 3.13 - -Add support for new RF chip ID: 3070. It seems to be the same as 5370, -maybe vendor just put wrong value on the eeprom, but add this id anyway -since devices with it showed on the marked. - -Signed-off-by: Stanislaw Gruszka - -diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h -index fa33b5e..e3eb952 100644 ---- a/drivers/net/wireless/rt2x00/rt2800.h -+++ b/drivers/net/wireless/rt2x00/rt2800.h -@@ -52,6 +52,7 @@ - * RF3322 2.4G 2T2R(RT3352/RT3371/RT3372/RT3391/RT3392) - * RF3053 2.4G/5G 3T3R(RT3883/RT3563/RT3573/RT3593/RT3662) - * RF5592 2.4G/5G 2T2R -+ * RF3070 2.4G 1T1R - * RF5360 2.4G 1T1R - * RF5370 2.4G 1T1R - * RF5390 2.4G 1T1R -@@ -70,6 +71,7 @@ - #define RF3322 0x000c - #define RF3053 0x000d - #define RF5592 0x000f -+#define RF3070 0x3070 - #define RF3290 0x3290 - #define RF5360 0x5360 - #define RF5370 0x5370 -diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c -index 88ce656..d2f638f 100644 ---- a/drivers/net/wireless/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/rt2x00/rt2800lib.c -@@ -3152,6 +3152,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - case RF3322: - rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info); - break; -+ case RF3070: - case RF5360: - case RF5370: - case RF5372: -@@ -3166,7 +3167,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info); - } - -- if (rt2x00_rf(rt2x00dev, RF3290) || -+ if (rt2x00_rf(rt2x00dev, RF3070) || -+ rt2x00_rf(rt2x00dev, RF3290) || - rt2x00_rf(rt2x00dev, RF3322) || - rt2x00_rf(rt2x00dev, RF5360) || - rt2x00_rf(rt2x00dev, RF5370) || -@@ -4264,6 +4266,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) - rt2800_rfcsr_write(rt2x00dev, 7, rfcsr); - break; - case RF3053: -+ case RF3070: - case RF3290: - case RF5360: - case RF5370: -@@ -7021,6 +7024,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) - case RF3022: - case RF3052: - case RF3053: -+ case RF3070: - case RF3290: - case RF3320: - case RF3322: -@@ -7543,6 +7547,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - rt2x00_rf(rt2x00dev, RF2020) || - rt2x00_rf(rt2x00dev, RF3021) || - rt2x00_rf(rt2x00dev, RF3022) || -+ rt2x00_rf(rt2x00dev, RF3070) || - rt2x00_rf(rt2x00dev, RF3290) || - rt2x00_rf(rt2x00dev, RF3320) || - rt2x00_rf(rt2x00dev, RF3322) || -@@ -7671,6 +7676,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - case RF3320: - case RF3052: - case RF3053: -+ case RF3070: - case RF3290: - case RF5360: - case RF5370: --- -To unsubscribe from this list: send the line "unsubscribe linux-wireless" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/sources b/sources index dfd21ab0b..838437cbf 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ cc6ee608854e0da4b64f6c1ff8b6398c linux-3.12.tar.xz -b7a603bf67e69936cf049fc6b37d9085 patch-3.12.3.xz +511b5a2f0de55b5e91fd293766ce182b patch-3.12.4.xz diff --git a/usbnet-fix-status-interrupt-urb-handling.patch b/usbnet-fix-status-interrupt-urb-handling.patch deleted file mode 100644 index 2e60e0727..000000000 --- a/usbnet-fix-status-interrupt-urb-handling.patch +++ /dev/null @@ -1,40 +0,0 @@ -Bugzilla: 998342 -Upstream-status: 3.13 - -From 52f48d0d9aaa621ffa5e08d79da99a3f8c93b848 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Tue, 12 Nov 2013 16:34:41 +0100 -Subject: [PATCH] usbnet: fix status interrupt urb handling - -Since commit 7b0c5f21f348a66de495868b8df0284e8dfd6bbf -"sierra_net: keep status interrupt URB active", sierra_net triggers -status interrupt polling before the net_device is opened (in order to -properly receive the sync message response). - -To be able to receive further interrupts, the interrupt urb needs to be -re-submitted, so this patch removes the bogus check for netif_running(). - -Signed-off-by: Felix Fietkau -Tested-by: Dan Williams -Signed-off-by: David S. Miller ---- - drivers/net/usb/usbnet.c | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c -index 90a429b..8494bb5 100644 ---- a/drivers/net/usb/usbnet.c -+++ b/drivers/net/usb/usbnet.c -@@ -204,9 +204,6 @@ static void intr_complete (struct urb *urb) - break; - } - -- if (!netif_running (dev->net)) -- return; -- - status = usb_submit_urb (urb, GFP_ATOMIC); - if (status != 0) - netif_err(dev, timer, dev->net, --- -1.8.3.1 - diff --git a/vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch b/vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch deleted file mode 100644 index 7cced5a81..000000000 --- a/vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch +++ /dev/null @@ -1,42 +0,0 @@ -Bugzilla: 998732 -Upstream-status: 3.13 - -From: Julian Stecklina -Subject: [PATCH] vfio, iommu: Fixed interaction of VFIO_IOMMU_MAP_DMA with IOMMU address limits - -The BUG_ON in drivers/iommu/intel-iommu.c:785 can be triggered from userspace via -VFIO by calling the VFIO_IOMMU_MAP_DMA ioctl on a vfio device with any address -beyond the addressing capabilities of the IOMMU. The problem is that the ioctl code -calls iommu_iova_to_phys before it calls iommu_map. iommu_map handles the case that -it gets addresses beyond the addressing capabilities of its IOMMU. -intel_iommu_iova_to_phys does not. - -This patch fixes iommu_iova_to_phys to return NULL for addresses beyond what the -IOMMU can handle. This in turn causes the ioctl call to fail in iommu_map and -(correctly) return EFAULT to the user with a helpful warning message in the kernel -log. - -Signed-off-by: Julian Stecklina ---- - drivers/iommu/intel-iommu.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c -index eec0d3e..61303db 100644 ---- a/drivers/iommu/intel-iommu.c -+++ b/drivers/iommu/intel-iommu.c -@@ -782,7 +782,11 @@ static struct dma_pte *pfn_to_dma_pte(struct dmar_domain *domain, - int offset; - - BUG_ON(!domain->pgd); -- BUG_ON(addr_width < BITS_PER_LONG && pfn >> addr_width); -+ -+ if (addr_width < BITS_PER_LONG && pfn >> addr_width) -+ /* Address beyond IOMMU's addressing capabilities. */ -+ return NULL; -+ - parent = domain->pgd; - - while (level > 0) { --- -1.8.3.1 diff --git a/via-velocity-fix-netif_receive_skb-use-in-irq-disable.patch b/via-velocity-fix-netif_receive_skb-use-in-irq-disable.patch deleted file mode 100644 index 820f47056..000000000 --- a/via-velocity-fix-netif_receive_skb-use-in-irq-disable.patch +++ /dev/null @@ -1,121 +0,0 @@ -Bugzilla: 1022733 -Upstream: Submitted for 3.13 and 3.12.y stable -Delivered-To: jwboyer@gmail.com -Received: by 10.76.104.107 with SMTP id gd11csp116929oab; - Mon, 25 Nov 2013 15:45:36 -0800 (PST) -X-Received: by 10.68.254.105 with SMTP id ah9mr20726084pbd.87.1385423136297; - Mon, 25 Nov 2013 15:45:36 -0800 (PST) -Return-Path: -Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) - by mx.google.com with ESMTP id am2si28999873pad.96.2013.11.25.15.44.53 - for ; - Mon, 25 Nov 2013 15:45:36 -0800 (PST) -Received-SPF: pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; -Authentication-Results: mx.google.com; - spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=netdev-owner@vger.kernel.org -Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand - id S1753536Ab3KYXl6 (ORCPT + 99 others); - Mon, 25 Nov 2013 18:41:58 -0500 -Received: from violet.fr.zoreil.com ([92.243.8.30]:57806 "EHLO - violet.fr.zoreil.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org - with ESMTP id S1751913Ab3KYXlz (ORCPT - ); Mon, 25 Nov 2013 18:41:55 -0500 -Received: from violet.fr.zoreil.com (localhost [127.0.0.1]) - by violet.fr.zoreil.com (8.14.5/8.14.5) with ESMTP id rAPNewrt012676; - Tue, 26 Nov 2013 00:40:58 +0100 -Received: (from romieu@localhost) - by violet.fr.zoreil.com (8.14.5/8.14.5/Submit) id rAPNewbX012675; - Tue, 26 Nov 2013 00:40:58 +0100 -Date: Tue, 26 Nov 2013 00:40:58 +0100 -From: Francois Romieu -To: netdev@vger.kernel.org -Cc: David Miller , - "Alex A. Schmidt" , - Michele Baldessari , - Jamie Heilman , - Julia Lawall -Subject: [PATCH net 1/1] via-velocity: fix netif_receive_skb use in irq - disabled section. -Message-ID: <20131125234058.GA12566@electric-eye.fr.zoreil.com> -MIME-Version: 1.0 -Content-Type: text/plain; charset=us-ascii -Content-Disposition: inline -X-Organisation: Land of Sunshine Inc. -User-Agent: Mutt/1.5.21 (2010-09-15) -Sender: netdev-owner@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: netdev@vger.kernel.org - -2fdac010bdcf10a30711b6924612dfc40daf19b8 ("via-velocity.c: update napi -implementation") overlooked an irq disabling spinlock when the Rx part -of the NAPI poll handler was converted from netif_rx to netif_receive_skb. - -NAPI Rx processing can be taken out of the locked section with a pair of -napi_{disable / enable} since it only races with the MTU change function. - -An heavier rework of the NAPI locking would be able to perform NAPI Tx -before Rx where I simply removed one of velocity_tx_srv calls. - -References: https://bugzilla.redhat.com/show_bug.cgi?id=1022733 -Fixes: 2fdac010bdcf (via-velocity.c: update napi implementation) -Signed-off-by: Francois Romieu -Tested-by: Alex A. Schmidt -Cc: Jamie Heilman -Cc: Michele Baldessari -Cc: Julia Lawall ---- - - It is relevant for stable 3.11.x and 3.12.y. - - drivers/net/ethernet/via/via-velocity.c | 11 ++++++----- - 1 file changed, 6 insertions(+), 5 deletions(-) - -diff --git a/drivers/net/ethernet/via/via-velocity.c b/drivers/net/ethernet/via/via-velocity.c -index d022bf9..ad61d26 100644 ---- a/drivers/net/ethernet/via/via-velocity.c -+++ b/drivers/net/ethernet/via/via-velocity.c -@@ -2172,16 +2172,13 @@ static int velocity_poll(struct napi_struct *napi, int budget) - unsigned int rx_done; - unsigned long flags; - -- spin_lock_irqsave(&vptr->lock, flags); - /* - * Do rx and tx twice for performance (taken from the VIA - * out-of-tree driver). - */ -- rx_done = velocity_rx_srv(vptr, budget / 2); -- velocity_tx_srv(vptr); -- rx_done += velocity_rx_srv(vptr, budget - rx_done); -+ rx_done = velocity_rx_srv(vptr, budget); -+ spin_lock_irqsave(&vptr->lock, flags); - velocity_tx_srv(vptr); -- - /* If budget not fully consumed, exit the polling mode */ - if (rx_done < budget) { - napi_complete(napi); -@@ -2342,6 +2339,8 @@ static int velocity_change_mtu(struct net_device *dev, int new_mtu) - if (ret < 0) - goto out_free_tmp_vptr_1; - -+ napi_disable(&vptr->napi); -+ - spin_lock_irqsave(&vptr->lock, flags); - - netif_stop_queue(dev); -@@ -2362,6 +2361,8 @@ static int velocity_change_mtu(struct net_device *dev, int new_mtu) - - velocity_give_many_rx_descs(vptr); - -+ napi_enable(&vptr->napi); -+ - mac_enable_int(vptr->mac_regs); - netif_start_queue(dev); - --- -1.8.3.1 - --- -To unsubscribe from this list: send the line "unsubscribe netdev" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html