4.8.10-stable review
Greg Kroah-Hartman
maintainercover 4.8.10-stable review
This is the start of the stable review cycle for the 4.8.10 release. There are 49 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon Nov 21 09:20:18 UTC 2016. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.8.10-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.8.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.8.10-rc1
Michal Nazarewicz <[email protected]>
usb: gadget: f_fs: stop sleeping in ffs_func_eps_disable
Michal Nazarewicz <[email protected]>
usb: gadget: f_fs: edit epfile->ep under lock
David S. Miller <[email protected]>
sparc64: Delete now unused user copy fixup functions.
David S. Miller <[email protected]>
sparc64: Delete now unused user copy assembler helpers.
David S. Miller <[email protected]>
sparc64: Convert U3copy_{from,to}_user to accurate exception reporting.
David S. Miller <[email protected]>
sparc64: Convert NG2copy_{from,to}_user to accurate exception reporting.
David S. Miller <[email protected]>
sparc64: Convert NGcopy_{from,to}_user to accurate exception reporting.
David S. Miller <[email protected]>
sparc64: Convert NG4copy_{from,to}_user to accurate exception reporting.
David S. Miller <[email protected]>
sparc64: Convert U1copy_{from,to}_user to accurate exception reporting.
David S. Miller <[email protected]>
sparc64: Convert GENcopy_{from,to}_user to accurate exception reporting.
David S. Miller <[email protected]>
sparc64: Convert copy_in_user to accurate exception reporting.
David S. Miller <[email protected]>
sparc64: Prepare to move to more saner user copy exception handling.
David S. Miller <[email protected]>
sparc64: Delete __ret_efault.
David S. Miller <[email protected]>
sparc64: Handle extremely large kernel TLB range flushes more gracefully.
David S. Miller <[email protected]>
sparc64: Fix illegal relative branches in hypervisor patched TLB cross-call code.
David S. Miller <[email protected]>
sparc64: Fix instruction count in comment for __hypervisor_flush_tlb_pending.
David S. Miller <[email protected]>
sparc64: Fix illegal relative branches in hypervisor patched TLB code.
David S. Miller <[email protected]>
sparc64: Handle extremely large kernel TSB range flushes sanely.
James Clarke <[email protected]>
sparc: Handle negative offsets in arch_jump_label_transform
Baruch Siach <[email protected]>
spi: spidev_test: fix build with musl libc
Florian Fainelli <[email protected]>
net: stmmac: Fix lack of link transition for fixed PHYs
Xin Long <[email protected]>
sctp: change sk state only when it has assocs in sctp_shutdown
Baoquan He <[email protected]>
bnx2: Wait for in-flight DMA to complete at probe stage
Baoquan He <[email protected]>
Revert "bnx2: Reset device during driver initialization"
Arkadi Sharshevsky <[email protected]>
mlxsw: spectrum_router: Correctly dump neighbour activity
Yotam Gigi <[email protected]>
mlxsw: spectrum: Fix refcount bug on span entries
Mike Frysinger <[email protected]>
Revert "include/uapi/linux/atm_zatm.h: include linux/time.h"
Eric Dumazet <[email protected]>
tcp: take care of truncations done by sk_filter()
Stephen Suryaputra Lin <[email protected]>
ipv4: use new_gw for redirect neigh lookup
Eric Dumazet <[email protected]>
net: __skb_flow_dissect() must cap its return value
David Ahern <[email protected]>
net: icmp_route_lookup should use rt dev to determine L3 domain
Soheil Hassas Yeganeh <[email protected]>
sock: fix sendmmsg for partial sendmsg
Alexander Duyck <[email protected]>
fib_trie: Correct /proc/net/route off by one error
David Ahern <[email protected]>
net: icmp6_send should use dst dev to determine L3 domain
Daniel Borkmann <[email protected]>
bpf: fix htab map destruction when extra reserve is in use
Marcelo Ricardo Leitner <[email protected]>
sctp: assign assoc_id earlier in __sctp_connect
Eric Dumazet <[email protected]>
ipv6: dccp: add missing bind_conflict to dccp_ipv6_mapped
Eric Dumazet <[email protected]>
ipv6: dccp: fix out of bound access in dccp_v6_err()
Eric Dumazet <[email protected]>
dccp: fix out of bound access in dccp_v4_err()
Eric Dumazet <[email protected]>
dccp: do not send reset to already closed sockets
Eric Dumazet <[email protected]>
dccp: do not release listeners too soon
Eric Dumazet <[email protected]>
tcp: fix return value for partial writes
Lance Richardson <[email protected]>
ipv4: allow local fragmentation in ip_finish_output_gso()
Eric Dumazet <[email protected]>
tcp: fix potential memory corruption
Eli Cooper <[email protected]>
ip6_tunnel: Clear IP6CB in ip6tunnel_xmit()
Andy Gospodarek <[email protected]>
bgmac: stop clearing DMA receive control register right after it is set
Eric Dumazet <[email protected]>
net: mangle zero checksum in skb_checksum_help()
Eric Dumazet <[email protected]>
net: clear sk_err_soft in sk_clone_lock()
Florian Westphal <[email protected]>
dctcp: avoid bogus doubling of cwnd after loss
-------------
Diffstat:
Makefile | 4 +- arch/sparc/include/asm/uaccess_64.h | 28 +- arch/sparc/kernel/head_64.S | 36 -- arch/sparc/kernel/jump_label.c | 23 +- arch/sparc/kernel/sparc_ksyms_64.c | 1 - arch/sparc/lib/GENcopy_from_user.S | 4 +- arch/sparc/lib/GENcopy_to_user.S | 4 +- arch/sparc/lib/GENmemcpy.S | 48 ++- arch/sparc/lib/Makefile | 2 +- arch/sparc/lib/NG2copy_from_user.S | 8 +- arch/sparc/lib/NG2copy_to_user.S | 8 +- arch/sparc/lib/NG2memcpy.S | 228 ++++++++----- arch/sparc/lib/NG4copy_from_user.S | 8 +- arch/sparc/lib/NG4copy_to_user.S | 8 +- arch/sparc/lib/NG4memcpy.S | 294 ++++++++++++---- arch/sparc/lib/NGcopy_from_user.S | 4 +- arch/sparc/lib/NGcopy_to_user.S | 4 +- arch/sparc/lib/NGmemcpy.S | 233 ++++++++----- arch/sparc/lib/U1copy_from_user.S | 8 +- arch/sparc/lib/U1copy_to_user.S | 8 +- arch/sparc/lib/U1memcpy.S | 345 ++++++++++++------- arch/sparc/lib/U3copy_from_user.S | 8 +- arch/sparc/lib/U3copy_to_user.S | 8 +- arch/sparc/lib/U3memcpy.S | 227 +++++++++---- arch/sparc/lib/copy_in_user.S | 35 +- arch/sparc/lib/user_fixup.c | 71 ---- arch/sparc/mm/tsb.c | 17 + arch/sparc/mm/ultra.S | 374 +++++++++++++++++---- drivers/net/ethernet/broadcom/bgmac.c | 5 +- drivers/net/ethernet/broadcom/bnx2.c | 48 ++- drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 4 +- .../net/ethernet/mellanox/mlxsw/spectrum_router.c | 22 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 7 + drivers/usb/gadget/function/f_fs.c | 107 +++++- include/net/ip.h | 1 - include/net/ip6_tunnel.h | 1 + include/net/sock.h | 4 +- include/net/tcp.h | 1 + include/uapi/linux/atm_zatm.h | 1 - kernel/bpf/hashtab.c | 3 +- net/core/dev.c | 2 +- net/core/flow_dissector.c | 11 +- net/core/sock.c | 6 +- net/dccp/ipv4.c | 16 +- net/dccp/ipv6.c | 19 +- net/dccp/proto.c | 4 + net/ipv4/fib_trie.c | 21 +- net/ipv4/icmp.c | 4 +- net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_output.c | 6 +- net/ipv4/ip_tunnel_core.c | 11 - net/ipv4/ipmr.c | 2 +- net/ipv4/route.c | 4 +- net/ipv4/tcp.c | 4 +- net/ipv4/tcp_dctcp.c | 13 +- net/ipv4/tcp_ipv4.c | 19 +- net/ipv6/icmp.c | 2 +- net/ipv6/tcp_ipv6.c | 6 +- net/sctp/socket.c | 22 +- net/socket.c | 2 + tools/spi/spidev_test.c | 1 + 61 files changed, 1625 insertions(+), 802 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/49 dctcp: avoid bogus doubling of cwnd after loss
4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit ce6dd23329b1ee6a794acf5f7e40f8e89b8317ee ]
If a congestion control module doesn't provide .undo_cwnd function, tcp_undo_cwnd_reduction() will set cwnd to
tp->snd_cwnd = max(tp->snd_cwnd, tp->snd_ssthresh << 1);
... which makes sense for reno (it sets ssthresh to half the current cwnd), but it makes no sense for dctcp, which sets ssthresh based on the current congestion estimate.
This can cause severe growth of cwnd (eventually overflowing u32).
Fix this by saving last cwnd on loss and restore cwnd based on that, similar to cubic and other algorithms.
--- net/ipv4/tcp_dctcp.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
net/ipv4/tcp_dctcp.c +12 -1
@@ -56,6 +56,7 @@ struct dctcp {u32 next_seq;u32 ce_state;u32 delayed_ack_reserved; +u32 loss_cwnd; };static unsigned int dctcp_shift_g__read_mostly =4 ;/* g = 1/2^4 */
@@ -96,6 +97,7 @@ static void dctcp_init(struct sock *sk) ca->dctcp_alpha =min (dctcp_alpha_on_init,DCTCP_MAX_ALPHA ); ca->delayed_ack_reserved =0 ; + ca->loss_cwnd =0 ; ca->ce_state =0 ;dctcp_reset (tp, ca);
@@ -111,9 +113,10 @@ static void dctcp_init(struct sock *sk)static u32 dctcp_ssthresh (struct sock *sk) { -const struct dctcp *ca =inet_csk_ca (sk); +struct dctcp *ca =inet_csk_ca (sk);struct tcp_sock *tp =tcp_sk (sk); + ca->loss_cwnd = tp->snd_cwnd;return max (tp->snd_cwnd - ((tp->snd_cwnd * ca->dctcp_alpha) >>11U ),2U ); }
@@ -308,12 +311,20 @@ static size_t dctcp_get_info(struct sockreturn 0 ; } +static u32 dctcp_cwnd_undo (struct sock *sk) +{ +const struct dctcp *ca =inet_csk_ca (sk); + +return max (tcp_sk (sk)->snd_cwnd, ca->loss_cwnd); +} +static struct tcp_congestion_ops dctcp__read_mostly = { .init = dctcp_init, .in_ack_event = dctcp_update_alpha, .cwnd_event = dctcp_cwnd_event, .ssthresh = dctcp_ssthresh, .cong_avoid = tcp_reno_cong_avoid, + .undo_cwnd = dctcp_cwnd_undo, .set_state = dctcp_state, .get_info = dctcp_get_info, .flags =TCP_CONG_NEEDS_ECN ,
Greg Kroah-Hartman
maintainerPATCH 2/49 net: clear sk_err_soft in sk_clone_lock()
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit e551c32d57c88923f99f8f010e89ca7ed0735e83 ]
At accept() time, it is possible the parent has a non zero sk_err_soft, leftover from a prior error.
Make sure we do not leave this value in the child, as it makes future getsockopt(SO_ERROR) calls quite unreliable.
--- net/core/sock.c | 1 + 1 file changed, 1 insertion(+)
net/core/sock.c +1 -0
@@ -1563,6 +1563,7 @@ struct sock *sk_clone_lock(const structRCU_INIT_POINTER (newsk->sk_reuseport_cb,NULL ); newsk->sk_err =0 ; + newsk->sk_err_soft =0 ; newsk->sk_priority =0 ; newsk->sk_incoming_cpu =raw_smp_processor_id ();atomic64_set (&newsk->sk_cookie,0 );
Greg Kroah-Hartman
maintainerPATCH 4/49 bgmac: stop clearing DMA receive control register right after it is set
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Gospodarek <[email protected]>
[ Upstream commit fcdefccac976ee51dd6071832b842d8fb41c479c ]
Current bgmac code initializes some DMA settings in the receive control register for some hardware and then immediately clears those settings. Not clearing those settings results in ~420Mbps *improvement* in throughput; this system can now receive frames at line-rate on Broadcom 5871x hardware compared to ~520Mbps today. I also tested a few other values but found there to be no discernible difference in CPU utilization even if burst size and prefetching values are different.
On the hardware tested there was no need to keep the code that cleared all but bits 16-17, but since there is a wide variety of hardware that used this driver (I did not look at all hardware docs for hardware using this IP block), I find it wise to move this call up and clear bits just after reading the default value from the hardware rather than completely removing it.
This is a good candidate for -stable >=3.14 since that is when the code that was supposed to improve performance (but did not) was introduced.
--- drivers/net/ethernet/broadcom/bgmac.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bgmac.c +4 -1
@@ -307,6 +307,10 @@ static void bgmac_dma_rx_enable(struct bu32 ctl; ctl =bgmac_read (bgmac, ring->mmio_base +BGMAC_DMA_RX_CTL ); + +/* preserve ONLY bits 16-17 from current hardware value */ + ctl &=BGMAC_DMA_RX_ADDREXT_MASK ; +if (bgmac->feature_flags &BGMAC_FEAT_RX_MASK_SETUP ) { ctl &= ~BGMAC_DMA_RX_BL_MASK ; ctl |=BGMAC_DMA_RX_BL_128 <<BGMAC_DMA_RX_BL_SHIFT ;
@@ -317,7 +321,6 @@ static void bgmac_dma_rx_enable(struct b ctl &= ~BGMAC_DMA_RX_PT_MASK ; ctl |=BGMAC_DMA_RX_PT_1 <<BGMAC_DMA_RX_PT_SHIFT ; } - ctl &=BGMAC_DMA_RX_ADDREXT_MASK ; ctl |=BGMAC_DMA_RX_ENABLE ; ctl |=BGMAC_DMA_RX_PARITY_DISABLE ; ctl |=BGMAC_DMA_RX_OVERFLOW_CONT ;
Greg Kroah-Hartman
maintainerPATCH 5/49 ip6_tunnel: Clear IP6CB in ip6tunnel_xmit()
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eli Cooper <[email protected]>
[ Upstream commit 23f4ffedb7d751c7e298732ba91ca75d224bc1a6 ]
skb->cb may contain data from previous layers. In the observed scenario, the garbage data were misinterpreted as IP6CB(skb)->frag_max_size, so that small packets sent through the tunnel are mistakenly fragmented.
This patch unconditionally clears the control buffer in ip6tunnel_xmit(), which affects ip6_tunnel, ip6_udp_tunnel and ip6_gre. Currently none of these tunnels set IP6CB(skb)->flags, otherwise it needs to be done earlier.
--- include/net/ip6_tunnel.h | 1 + 1 file changed, 1 insertion(+)
include/net/ip6_tunnel.h +1 -0
@@ -145,6 +145,7 @@ static inline void ip6tunnel_xmit(struct {int pkt_len, err; +memset (skb->cb,0 ,sizeof (struct inet6_skb_parm )); pkt_len = skb->len -skb_inner_network_offset (skb); err =ip6_local_out (dev_net (skb_dst (skb)->dev), sk, skb);if (unlikely (net_xmit_eval (err)))
Greg Kroah-Hartman
maintainerPATCH 7/49 ipv4: allow local fragmentation in ip_finish_output_gso()
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lance Richardson <[email protected]>
[ Upstream commit 9ee6c5dc816aa8256257f2cd4008a9291ec7e985 ]
Some configurations (e.g. geneve interface with default MTU of 1500 over an ethernet interface with 1500 MTU) result in the transmission of packets that exceed the configured MTU. While this should be considered to be a "bad" configuration, it is still allowed and should not result in the sending of packets that exceed the configured MTU.
Fix by dropping the assumption in ip_finish_output_gso() that locally originated gso packets will never need fragmentation. Basic testing using iperf (observing CPU usage and bandwidth) have shown no measurable performance impact for traffic not requiring fragmentation.
--- include/net/ip.h | 1 - net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_output.c | 6 ++---- net/ipv4/ip_tunnel_core.c | 11 ----------- net/ipv4/ipmr.c | 2 +- 5 files changed, 4 insertions(+), 18 deletions(-)
include/net/ip.h +0 -1
@@ -47,7 +47,6 @@ struct inet_skb_parm {#define IPSKB_REROUTED BIT(4)#define IPSKB_DOREDIRECT BIT(5)#define IPSKB_FRAG_PMTU BIT(6) -#define IPSKB_FRAG_SEGS BIT(7)u16 frag_max_size; };
net/ipv4/ip_forward.c +1 -1
@@ -117,7 +117,7 @@ int ip_forward(struct sk_buff *skb)if (opt->is_strictroute && rt->rt_uses_gateway) goto sr_failed; -IPCB (skb)->flags |=IPSKB_FORWARDED |IPSKB_FRAG_SEGS ; +IPCB (skb)->flags |=IPSKB_FORWARDED ; mtu =ip_dst_mtu_maybe_forward (&rt->dst, true);if (ip_exceeds_mtu (skb, mtu)) {IP_INC_STATS (net,IPSTATS_MIB_FRAGFAILS );
net/ipv4/ip_output.c +2 -4
@@ -223,11 +223,9 @@ static int ip_finish_output_gso(struct nstruct sk_buff *segs;int ret =0 ; -/* common case: fragmentation of segments is not allowed, -* or seglen is <= mtu +/* common case: seglen is <= mtu */ -if (((IPCB (skb)->flags &IPSKB_FRAG_SEGS ) ==0 ) || -skb_gso_validate_mtu (skb, mtu)) +if (skb_gso_validate_mtu (skb, mtu))return ip_finish_output2 (net, sk, skb);/* Slowpath - GSO segment length is exceeding the dst MTU.
net/ipv4/ip_tunnel_core.c +0 -11
@@ -63,7 +63,6 @@ void iptunnel_xmit(struct sock *sk, struint pkt_len = skb->len -skb_inner_network_offset (skb);struct net *net =dev_net (rt->dst.dev);struct net_device *dev = skb->dev; -int skb_iif = skb->skb_iif;struct iphdr *iph;int err;
@@ -73,16 +72,6 @@ void iptunnel_xmit(struct sock *sk, struskb_dst_set (skb, &rt->dst);memset (IPCB (skb),0 ,sizeof (*IPCB (skb))); -if (skb_iif && !(df &htons (IP_DF ))) { -/* Arrived from an ingress interface, got encapsulated, with -* fragmentation of encapulating frames allowed. -* If skb is gso, the resulting encapsulated network segments -* may exceed dst mtu. -* Allow IP Fragmentation of segments. -*/ -IPCB (skb)->flags |=IPSKB_FRAG_SEGS ; - } -/* Push down and install the IP header. */ skb_push (skb,sizeof (struct iphdr ));skb_reset_network_header (skb);
net/ipv4/ipmr.c +1 -1
@@ -1749,7 +1749,7 @@ static void ipmr_queue_xmit(struct net * vif->dev->stats.tx_bytes += skb->len; } -IPCB (skb)->flags |=IPSKB_FORWARDED |IPSKB_FRAG_SEGS ; +IPCB (skb)->flags |=IPSKB_FORWARDED ;/* RFC1584 teaches, that DVMRP/PIM router must deliver packets locally * not only before forwarding, but after forwarding on all output
Greg Kroah-Hartman
maintainerPATCH 8/49 tcp: fix return value for partial writes
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 79d8665b9545e128637c51cf7febde9c493b6481 ]
After my commit, tcp_sendmsg() might restart its loop after processing socket backlog.
If sk_err is set, we blindly return an error, even though we copied data to user space before.
We should instead return number of bytes that could be copied, otherwise user space might resend data and corrupt the stream.
This might happen if another thread is using recvmsg(MSG_ERRQUEUE) to process timestamps.
Issue was diagnosed by Soheil and Willem, big kudos to them !
--- net/ipv4/tcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp.c +1 -1
@@ -1145,7 +1145,7 @@ restart: err = -EPIPE ;if (sk->sk_err || (sk->sk_shutdown &SEND_SHUTDOWN )) - goto out_err; + goto do_error; sg = !!(sk->sk_route_caps &NETIF_F_SG );
Greg Kroah-Hartman
maintainerPATCH 9/49 dccp: do not release listeners too soon
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit c3f24cfb3e508c70c26ee8569d537c8ca67a36c6 ]
Andrey Konovalov reported following error while fuzzing with syzkaller :
IPv4: Attempt to release alive inet socket ffff880068e98940
kasan: CONFIG_KASAN_INLINE enabled
kasan: GPF could be caused by NULL-ptr deref or user memory access
general protection fault: 0000 [#1] SMP KASAN Modules linked in: CPU: 1 PID: 3905 Comm: a.out Not tainted 4.9.0-rc3+ #333 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011 task: ffff88006b9e0000 task.stack: ffff880068770000 RIP: 0010:[<ffffffff819ead5f>] [<ffffffff819ead5f>] selinux_socket_sock_rcv_skb+0xff/0x6a0 security/selinux/hooks.c:4639 RSP: 0018:ffff8800687771c8 EFLAGS: 00010202 RAX: ffff88006b9e0000 RBX: 1ffff1000d0eee3f RCX: 1ffff1000d1d312a RDX: 1ffff1000d1d31a6 RSI: dffffc0000000000 RDI: 0000000000000010 RBP: ffff880068777360 R08: 0000000000000000 R09: 0000000000000002 R10: dffffc0000000000 R11: 0000000000000006 R12: ffff880068e98940 R13: 0000000000000002 R14: ffff880068777338 R15: 0000000000000000 FS: 00007f00ff760700(0000) GS:ffff88006cd00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000020008000 CR3: 000000006a308000 CR4: 00000000000006e0 Stack: ffff8800687771e0 ffffffff812508a5 ffff8800686f3168 0000000000000007 ffff88006ac8cdfc ffff8800665ea500 0000000041b58ab3 ffffffff847b5480 ffffffff819eac60 ffff88006b9e0860 ffff88006b9e0868 ffff88006b9e07f0 Call Trace: [<ffffffff819c8dd5>] security_sock_rcv_skb+0x75/0xb0 security/security.c:1317 [<ffffffff82c2a9e7>] sk_filter_trim_cap+0x67/0x10e0 net/core/filter.c:81 [<ffffffff82b81e60>] __sk_receive_skb+0x30/0xa00 net/core/sock.c:460 [<ffffffff838bbf12>] dccp_v4_rcv+0xdb2/0x1910 net/dccp/ipv4.c:873 [<ffffffff83069d22>] ip_local_deliver_finish+0x332/0xad0 net/ipv4/ip_input.c:216 [< inline >] NF_HOOK_THRESH ./include/linux/netfilter.h:232 [< inline >] NF_HOOK ./include/linux/netfilter.h:255 [<ffffffff8306abd2>] ip_local_deliver+0x1c2/0x4b0 net/ipv4/ip_input.c:257 [< inline >] dst_input ./include/net/dst.h:507 [<ffffffff83068500>] ip_rcv_finish+0x750/0x1c40 net/ipv4/ip_input.c:396 [< inline >] NF_HOOK_THRESH ./include/linux/netfilter.h:232 [< inline >] NF_HOOK ./include/linux/netfilter.h:255 [<ffffffff8306b82f>] ip_rcv+0x96f/0x12f0 net/ipv4/ip_input.c:487 [<ffffffff82bd9fb7>] __netif_receive_skb_core+0x1897/0x2a50 net/core/dev.c:4213 [<ffffffff82bdb19a>] __netif_receive_skb+0x2a/0x170 net/core/dev.c:4251 [<ffffffff82bdb493>] netif_receive_skb_internal+0x1b3/0x390 net/core/dev.c:4279 [<ffffffff82bdb6b8>] netif_receive_skb+0x48/0x250 net/core/dev.c:4303 [<ffffffff8241fc75>] tun_get_user+0xbd5/0x28a0 drivers/net/tun.c:1308 [<ffffffff82421b5a>] tun_chr_write_iter+0xda/0x190 drivers/net/tun.c:1332 [< inline >] new_sync_write fs/read_write.c:499 [<ffffffff8151bd44>] __vfs_write+0x334/0x570 fs/read_write.c:512 [<ffffffff8151f85b>] vfs_write+0x17b/0x500 fs/read_write.c:560 [< inline >] SYSC_write fs/read_write.c:607 [<ffffffff81523184>] SyS_write+0xd4/0x1a0 fs/read_write.c:599 [<ffffffff83fc02c1>] entry_SYSCALL_64_fastpath+0x1f/0xc2
It turns out DCCP calls __sk_receive_skb(), and this broke when lookups no longer took a reference on listeners.
Fix this issue by adding a @refcounted parameter to __sk_receive_skb(), so that sock_put() is used only when needed.
--- include/net/sock.h | 4 ++-- net/core/sock.c | 5 +++-- net/dccp/ipv4.c | 2 +- net/dccp/ipv6.c | 3 ++- 4 files changed, 8 insertions(+), 6 deletions(-)
include/net/sock.h +2 -2
@@ -1587,11 +1587,11 @@ static inline void sock_put(struct sockvoid sock_gen_put (struct sock *sk);int __sk_receive_skb (struct sock *sk,struct sk_buff *skb,const int nested, -unsigned int trim_cap); +unsigned int trim_cap,bool refcounted);static inline int sk_receive_skb (struct sock *sk,struct sk_buff *skb,const int nested) { -return __sk_receive_skb (sk, skb, nested,1 ); +return __sk_receive_skb (sk, skb, nested,1 , true); }static inline void sk_tx_queue_set (struct sock *sk,int tx_queue)
net/core/sock.c +3 -2
@@ -453,7 +453,7 @@ int sock_queue_rcv_skb(struct sock *sk,EXPORT_SYMBOL (sock_queue_rcv_skb);int __sk_receive_skb (struct sock *sk,struct sk_buff *skb, -const int nested,unsigned int trim_cap) +const int nested,unsigned int trim_cap,bool refcounted) {int rc =NET_RX_SUCCESS ;
@@ -487,7 +487,8 @@ int __sk_receive_skb(struct sock *sk, stbh_unlock_sock (sk); out: -sock_put (sk); +if (refcounted) +sock_put (sk);return rc; discard_and_relse:kfree_skb (skb);
net/dccp/ipv4.c +1 -1
@@ -868,7 +868,7 @@ lookup: goto discard_and_relse;nf_reset (skb); -return __sk_receive_skb (sk, skb,1 , dh->dccph_doff *4 ); +return __sk_receive_skb (sk, skb,1 , dh->dccph_doff *4 , refcounted); no_dccp_socket:if (!xfrm4_policy_check (NULL ,XFRM_POLICY_IN , skb))
net/dccp/ipv6.c +2 -1
@@ -738,7 +738,8 @@ lookup:if (!xfrm6_policy_check (sk,XFRM_POLICY_IN , skb)) goto discard_and_relse; -return __sk_receive_skb (sk, skb,1 , dh->dccph_doff *4 ) ?-1 :0 ; +return __sk_receive_skb (sk, skb,1 , dh->dccph_doff *4 , + refcounted) ?-1 :0 ; no_dccp_socket:if (!xfrm6_policy_check (NULL ,XFRM_POLICY_IN , skb))
Greg Kroah-Hartman
maintainerPATCH 10/49 dccp: do not send reset to already closed sockets
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 346da62cc186c4b4b1ac59f87f4482b47a047388 ]
Andrey reported following warning while fuzzing with syzkaller
WARNING: CPU: 1 PID: 21072 at net/dccp/proto.c:83 dccp_set_state+0x229/0x290 Kernel panic - not syncing: panic_on_warn set ... CPU: 1 PID: 21072 Comm: syz-executor Not tainted 4.9.0-rc1+ #293 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011 ffff88003d4c7738 ffffffff81b474f4 0000000000000003 dffffc0000000000 ffffffff844f8b00 ffff88003d4c7804 ffff88003d4c7800 ffffffff8140c06a 0000000041b58ab3 ffffffff8479ab7d ffffffff8140beae ffffffff8140cd00 Call Trace: [< inline >] __dump_stack lib/dump_stack.c:15 [<ffffffff81b474f4>] dump_stack+0xb3/0x10f lib/dump_stack.c:51 [<ffffffff8140c06a>] panic+0x1bc/0x39d kernel/panic.c:179 [<ffffffff8111125c>] __warn+0x1cc/0x1f0 kernel/panic.c:542 [<ffffffff8111144c>] warn_slowpath_null+0x2c/0x40 kernel/panic.c:585 [<ffffffff8389e5d9>] dccp_set_state+0x229/0x290 net/dccp/proto.c:83 [<ffffffff838a0aa2>] dccp_close+0x612/0xc10 net/dccp/proto.c:1016 [<ffffffff8316bf1f>] inet_release+0xef/0x1c0 net/ipv4/af_inet.c:415 [<ffffffff82b6e89e>] sock_release+0x8e/0x1d0 net/socket.c:570 [<ffffffff82b6e9f6>] sock_close+0x16/0x20 net/socket.c:1017 [<ffffffff815256ad>] __fput+0x29d/0x720 fs/file_table.c:208 [<ffffffff81525bb5>] ____fput+0x15/0x20 fs/file_table.c:244 [<ffffffff811727d8>] task_work_run+0xf8/0x170 kernel/task_work.c:116 [< inline >] exit_task_work include/linux/task_work.h:21 [<ffffffff8111bc53>] do_exit+0x883/0x2ac0 kernel/exit.c:828 [<ffffffff811221fe>] do_group_exit+0x10e/0x340 kernel/exit.c:931 [<ffffffff81143c94>] get_signal+0x634/0x15a0 kernel/signal.c:2307 [<ffffffff81054aad>] do_signal+0x8d/0x1a30 arch/x86/kernel/signal.c:807 [<ffffffff81003a05>] exit_to_usermode_loop+0xe5/0x130 arch/x86/entry/common.c:156 [< inline >] prepare_exit_to_usermode arch/x86/entry/common.c:190 [<ffffffff81006298>] syscall_return_slowpath+0x1a8/0x1e0
arch/x86/entry/common.c:259
[<ffffffff83fc1a62>] entry_SYSCALL_64_fastpath+0xc0/0xc2
Dumping ftrace buffer:
(ftrace buffer empty)
Kernel Offset: disabled
Fix this the same way we did for TCP in commit 565b7b2d2e63 ("tcp: do not send reset to already closed sockets")
--- net/dccp/proto.c | 4 ++++ 1 file changed, 4 insertions(+)
net/dccp/proto.c +4 -0
@@ -1009,6 +1009,10 @@ void dccp_close(struct sock *sk, long ti__kfree_skb (skb); } +/* If socket has been already reset kill it. */ +if (sk->sk_state ==DCCP_CLOSED ) + goto adjudge_to_death; +if (data_was_unread) {/* Unread data was tossed, send an appropriate Reset Code */ DCCP_WARN ("ABORT with %u bytes unread\n" , data_was_unread);
Greg Kroah-Hartman
maintainerPATCH 11/49 dccp: fix out of bound access in dccp_v4_err()
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 6706a97fec963d6cb3f7fc2978ec1427b4651214 ]
dccp_v4_err() does not use pskb_may_pull() and might access garbage.
We only need 4 bytes at the beginning of the DCCP header, like TCP, so the 8 bytes pulled in icmp_socket_deliver() are more than enough.
This patch might allow to process more ICMP messages, as some routers are still limiting the size of reflected bytes to 28 (RFC 792), instead of extended lengths (RFC 1812 4.3.2.3)
--- net/dccp/ipv4.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
net/dccp/ipv4.c +8 -6
@@ -235,7 +235,7 @@ static void dccp_v4_err(struct sk_buff * {const struct iphdr *iph = (struct iphdr *)skb->data;const u8 offset = iph->ihl <<2 ; -const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + offset); +const struct dccp_hdr *dh;struct dccp_sock *dp;struct inet_sock *inet;const int type =icmp_hdr (skb)->type;
@@ -245,11 +245,13 @@ static void dccp_v4_err(struct sk_buff *int err;struct net *net =dev_net (skb->dev); -if (skb->len < offset +sizeof (*dh) || - skb->len < offset +__dccp_basic_hdr_len (dh)) { -__ICMP_INC_STATS (net,ICMP_MIB_INERRORS ); -return ; - } +/* Only need dccph_dport & dccph_sport which are the first +* 4 bytes in dccp header. +* Our caller (icmp_socket_deliver()) already pulled 8 bytes for us. +*/ + BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_sport) > 8); + BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_dport) > 8); + dh = (struct dccp_hdr *)(skb->data + offset); sk = __inet_lookup_established(net, &dccp_hashinfo, iph->daddr, dh->dccph_dport,
Greg Kroah-Hartman
maintainerPATCH 12/49 ipv6: dccp: fix out of bound access in dccp_v6_err()
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 1aa9d1a0e7eefcc61696e147d123453fc0016005 ]
dccp_v6_err() does not use pskb_may_pull() and might access garbage.
We only need 4 bytes at the beginning of the DCCP header, like TCP, so the 8 bytes pulled in icmpv6_notify() are more than enough.
--- net/dccp/ipv6.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
net/dccp/ipv6.c +8 -7
@@ -70,7 +70,7 @@ static void dccp_v6_err(struct sk_buff * u8 type, u8 code, int offset, __be32 info) { const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data; -const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + offset); +const struct dccp_hdr *dh;struct dccp_sock *dp;struct ipv6_pinfo *np;struct sock *sk;
@@ -78,12 +78,13 @@ static void dccp_v6_err(struct sk_buff *__u64 seq;struct net *net =dev_net (skb->dev); -if (skb->len < offset +sizeof (*dh) || - skb->len < offset +__dccp_basic_hdr_len (dh)) { -__ICMP6_INC_STATS (net,__in6_dev_get (skb->dev), -ICMP6_MIB_INERRORS ); -return ; - } +/* Only need dccph_dport & dccph_sport which are the first +* 4 bytes in dccp header. +* Our caller (icmpv6_notify()) already pulled 8 bytes for us. +*/ + BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_sport) > 8); + BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_dport) > 8); + dh = (struct dccp_hdr *)(skb->data + offset); sk = __inet6_lookup_established(net, &dccp_hashinfo, &hdr->daddr, dh->dccph_dport,
Greg Kroah-Hartman
maintainerPATCH 13/49 ipv6: dccp: add missing bind_conflict to dccp_ipv6_mapped
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 990ff4d84408fc55942ca6644f67e361737b3d8e ]
While fuzzing kernel with syzkaller, Andrey reported a nasty crash in inet6_bind() caused by DCCP lacking a required method.
--- net/dccp/ipv6.c | 1 + 1 file changed, 1 insertion(+)
net/dccp/ipv6.c +1 -0
@@ -958,6 +958,7 @@ static const struct inet_connection_sock .getsockopt = ipv6_getsockopt, .addr2sockaddr = inet6_csk_addr2sockaddr, .sockaddr_len = sizeof(struct sockaddr_in6), + .bind_conflict = inet6_csk_bind_conflict, #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ipv6_setsockopt, .compat_getsockopt = compat_ipv6_getsockopt,
Greg Kroah-Hartman
maintainerPATCH 14/49 sctp: assign assoc_id earlier in __sctp_connect
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcelo Ricardo Leitner <[email protected]>
[ Upstream commit 7233bc84a3aeda835d334499dc00448373caf5c0 ]
sctp_wait_for_connect() currently already holds the asoc to keep it alive during the sleep, in case another thread release it. But Andrey Konovalov and Dmitry Vyukov reported an use-after-free in such situation.
Problem is that __sctp_connect() doesn't get a ref on the asoc and will do a read on the asoc after calling sctp_wait_for_connect(), but by then another thread may have closed it and the _put on sctp_wait_for_connect will actually release it, causing the use-after-free.
Fix is, instead of doing the read after waiting for the connect, do it before so, and avoid this issue as the socket is still locked by then. There should be no issue on returning the asoc id in case of failure as the application shouldn't trust on that number in such situations anyway.
This issue doesn't exist in sctp_sendmsg() path.
--- net/sctp/socket.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/sctp/socket.c +5 -2
@@ -1214,9 +1214,12 @@ static int __sctp_connect(struct sock *s timeo =sock_sndtimeo (sk, f_flags &O_NONBLOCK ); - err =sctp_wait_for_connect (asoc, &timeo); -if ((err ==0 || err == -EINPROGRESS ) && assoc_id) +if (assoc_id) *assoc_id = asoc->assoc_id; + err =sctp_wait_for_connect (asoc, &timeo); +/* Note: the asoc may be freed after the return of +* sctp_wait_for_connect. +*/ /* Don't free association on exit. */ asoc =NULL ;
Greg Kroah-Hartman
maintainerPATCH 15/49 bpf: fix htab map destruction when extra reserve is in use
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 483bed2b0ddd12ec33fc9407e0c6e1088e77a97c ]
Commit a6ed3ea65d98 ("bpf: restore behavior of bpf_map_update_elem") added an extra per-cpu reserve to the hash table map to restore old behaviour from pre prealloc times. When non-prealloc is in use for a map, then problem is that once a hash table extra element has been linked into the hash-table, and the hash table is destroyed due to refcount dropping to zero, then htab_map_free() -> delete_all_elements() will walk the whole hash table and drop all elements via htab_elem_free(). The problem is that the element from the extra reserve is first fed to the wrong backend allocator and eventually freed twice.
--- kernel/bpf/hashtab.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/bpf/hashtab.c +2 -1
@@ -687,7 +687,8 @@ static void delete_all_elements(struct bhlist_for_each_entry_safe (l, n, head, hash_node) {hlist_del_rcu (&l->hash_node); -htab_elem_free (htab, l); +if (l->state !=HTAB_EXTRA_ELEM_USED ) +htab_elem_free (htab, l); } } }
Greg Kroah-Hartman
maintainerPATCH 16/49 net: icmp6_send should use dst dev to determine L3 domain
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Ahern <[email protected]>
[ Upstream commit 5d41ce29e3b91ef305f88d23f72b3359de329cec ]
icmp6_send is called in response to some event. The skb may not have the device set (skb->dev is NULL), but it is expected to have a dst set. Update icmp6_send to use the dst on the skb to determine L3 domain.
--- net/ipv6/icmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/icmp.c +1 -1
@@ -448,7 +448,7 @@ static void icmp6_send(struct sk_buff *sif (__ipv6_addr_needs_scope_id (addr_type)) iif = skb->dev->ifindex;else - iif =l3mdev_master_ifindex (skb->dev); + iif =l3mdev_master_ifindex (skb_dst (skb)->dev);/* * Must not send error if the source does not uniquely
Greg Kroah-Hartman
maintainerPATCH 17/49 fib_trie: Correct /proc/net/route off by one error
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Duyck <[email protected]>
[ Upstream commit fd0285a39b1cb496f60210a9a00ad33a815603e7 ]
The display of /proc/net/route has had a couple issues due to the fact that when I originally rewrote most of fib_trie I made it so that the iterator was tracking the next value to use instead of the current.
In addition it had an off by 1 error where I was tracking the first piece of data as position 0, even though in reality that belonged to the SEQ_START_TOKEN.
This patch updates the code so the iterator tracks the last reported position and key instead of the next expected position and key. In addition it shifts things so that all of the leaves start at 1 instead of trying to report leaves starting with offset 0 as being valid. With these two issues addressed this should resolve any off by one errors that were present in the display of /proc/net/route.
--- net/ipv4/fib_trie.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-)
net/ipv4/fib_trie.c +9 -12
@@ -2455,22 +2455,19 @@ static struct key_vector *fib_route_get_struct key_vector *l, **tp = &iter->tnode;t_key key; -/* use cache location of next-to-find key */ +/* use cached location of previously found key */ if (iter->pos >0 && pos >= iter->pos) { - pos -= iter->pos; key = iter->key; }else { - iter->pos =0 ; + iter->pos =1 ; key =0 ; } -while ((l =leaf_walk_rcu (tp, key)) !=NULL ) { + pos -= iter->pos; + +while ((l =leaf_walk_rcu (tp, key)) && (pos-- >0 )) { key = l->key +1 ; iter->pos++; - -if (--pos <=0 ) -break ; - l =NULL ;/* handle unlikely case of a key wrap */
@@ -2479,7 +2476,7 @@ static struct key_vector *fib_route_get_ }if (l) - iter->key = key;/* remember it */ + iter->key = l->key;/* remember it */ else iter->pos =0 ;/* forget it */
@@ -2507,7 +2504,7 @@ static void *fib_route_seq_start(structreturn fib_route_get_idx (iter, *pos); iter->pos =0 ; - iter->key =0 ; + iter->key =KEY_MAX ;return SEQ_START_TOKEN ; }
@@ -2516,7 +2513,7 @@ static void *fib_route_seq_next(struct s {struct fib_route_iter *iter = seq->private;struct key_vector *l =NULL ; -t_key key = iter->key; +t_key key = iter->key +1 ; ++*pos;
@@ -2525,7 +2522,7 @@ static void *fib_route_seq_next(struct s l =leaf_walk_rcu (&iter->tnode, key);if (l) { - iter->key = l->key +1 ; + iter->key = l->key; iter->pos++; }else { iter->pos =0 ;
Greg Kroah-Hartman
maintainerPATCH 19/49 net: icmp_route_lookup should use rt dev to determine L3 domain
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Ahern <[email protected]>
[ Upstream commit 9d1a6c4ea43e48c7880c85971c17939b56832d8a ]
icmp_send is called in response to some event. The skb may not have the device set (skb->dev is NULL), but it is expected to have an rt. Update icmp_route_lookup to use the rt on the skb to determine L3 domain.
--- net/ipv4/icmp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/icmp.c +2 -2
@@ -477,7 +477,7 @@ static struct rtable *icmp_route_lookup( fl4->flowi4_proto =IPPROTO_ICMP ; fl4->fl4_icmp_type = type; fl4->fl4_icmp_code = code; - fl4->flowi4_oif =l3mdev_master_ifindex (skb_in->dev); + fl4->flowi4_oif =l3mdev_master_ifindex (skb_dst (skb_in)->dev);security_skb_classify_flow (skb_in,flowi4_to_flowi (fl4)); rt = __ip_route_output_key_hash(net, fl4,
@@ -502,7 +502,7 @@ static struct rtable *icmp_route_lookup(if (err) goto relookup_failed; -if (inet_addr_type_dev_table (net, skb_in->dev, +if (inet_addr_type_dev_table (net,skb_dst (skb_in)->dev, fl4_dec.saddr) ==RTN_LOCAL ) { rt2 =__ip_route_output_key (net, &fl4_dec);if (IS_ERR (rt2))
Greg Kroah-Hartman
maintainerPATCH 20/49 net: __skb_flow_dissect() must cap its return value
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 34fad54c2537f7c99d07375e50cb30aa3c23bd83 ]
After Tom patch, thoff field could point past the end of the buffer, this could fool some callers.
If an skb was provided, skb->len should be the upper limit. If not, hlen is supposed to be the upper limit.
--- net/core/flow_dissector.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
net/core/flow_dissector.c +8 -3
@@ -118,7 +118,7 @@ bool __skb_flow_dissect(const struct sk_struct flow_dissector_key_tags *key_tags;struct flow_dissector_key_keyid *key_keyid;u8 ip_proto =0 ; -bool ret = false; +bool ret;if (!data) { data = skb->data;
@@ -481,12 +481,17 @@ ip_proto_again: out_good: ret = true; -out_bad: + key_control->thoff = (u16 )nhoff; +out: key_basic->n_proto = proto; key_basic->ip_proto = ip_proto; - key_control->thoff = (u16 )nhoff;return ret; + +out_bad: + ret = false; + key_control->thoff =min_t (u16, nhoff, skb ? skb->len : hlen); + goto out; }EXPORT_SYMBOL (__skb_flow_dissect);
Greg Kroah-Hartman
maintainerPATCH 21/49 ipv4: use new_gw for redirect neigh lookup
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Suryaputra Lin <[email protected]>
[ Upstream commit 969447f226b451c453ddc83cac6144eaeac6f2e3 ]
In v2.6, ip_rt_redirect() calls arp_bind_neighbour() which returns 0 and then the state of the neigh for the new_gw is checked. If the state isn't valid then the redirected route is deleted. This behavior is maintained up to v3.5.7 by check_peer_redirect() because rt->rt_gateway is assigned to peer->redirect_learned.a4 before calling ipv4_neigh_lookup().
After commit 5943634fc559 ("ipv4: Maintain redirect and PMTU info in struct rtable again."), ipv4_neigh_lookup() is performed without the rt_gateway assigned to the new_gw. In the case when rt_gateway (old_gw) isn't zero, the function uses it as the key. The neigh is most likely valid since the old_gw is the one that sends the ICMP redirect message. Then the new_gw is assigned to fib_nh_exception. The problem is: the new_gw ARP may never gets resolved and the traffic is blackholed.
So, use the new_gw for neigh lookup.
Changes from v1:
- use __ipv4_neigh_lookup instead (per Eric Dumazet).
--- net/ipv4/route.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/ipv4/route.c +3 -1
@@ -753,7 +753,9 @@ static void __ip_do_redirect(struct rtab goto reject_redirect; } - n =ipv4_neigh_lookup (&rt->dst,NULL , &new_gw); + n =__ipv4_neigh_lookup (rt->dst.dev, new_gw); +if (!n) + n =neigh_create (&arp_tbl, &new_gw, rt->dst.dev);if (!IS_ERR (n)) {if (!(n->nud_state &NUD_VALID )) {neigh_event_send (n,NULL );
Greg Kroah-Hartman
maintainerPATCH 22/49 tcp: take care of truncations done by sk_filter()
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit ac6e780070e30e4c35bd395acfe9191e6268bdd3 ]
With syzkaller help, Marco Grassi found a bug in TCP stack, crashing in tcp_collapse()
Root cause is that sk_filter() can truncate the incoming skb, but TCP stack was not really expecting this to happen. It probably was expecting a simple DROP or ACCEPT behavior.
We first need to make sure no part of TCP header could be removed. Then we need to adjust TCP_SKB_CB(skb)->end_seq
Many thanks to syzkaller team and Marco for giving us a reproducer.
--- include/net/tcp.h | 1 + net/ipv4/tcp_ipv4.c | 19 ++++++++++++++++++- net/ipv6/tcp_ipv6.c | 6 ++++-- 3 files changed, 23 insertions(+), 3 deletions(-)
include/net/tcp.h +1 -0
@@ -1164,6 +1164,7 @@ static inline void tcp_prequeue_init(str }bool tcp_prequeue (struct sock *sk,struct sk_buff *skb); +int tcp_filter (struct sock *sk,struct sk_buff *skb);#undef STATE_TRACE
net/ipv4/tcp_ipv4.c +18 -1
@@ -1537,6 +1537,21 @@ bool tcp_prequeue(struct sock *sk, struc }EXPORT_SYMBOL (tcp_prequeue); +int tcp_filter (struct sock *sk,struct sk_buff *skb) +{ +struct tcphdr *th = (struct tcphdr *)skb->data; +unsigned int eaten = skb->len; +int err; + + err =sk_filter_trim_cap (sk, skb, th->doff *4 ); +if (!err) { + eaten -= skb->len; +TCP_SKB_CB (skb)->end_seq -= eaten; + } +return err; +} +EXPORT_SYMBOL (tcp_filter); +/* * From tcp_input.c */
@@ -1648,8 +1663,10 @@ process:nf_reset (skb); -if (sk_filter (sk, skb)) +if (tcp_filter (sk, skb)) goto discard_and_relse; + th = (const struct tcphdr *)skb->data; + iph =ip_hdr (skb); skb->dev =NULL ;
net/ipv6/tcp_ipv6.c +4 -2
@@ -1228,7 +1228,7 @@ static int tcp_v6_do_rcv(struct sock *skif (skb->protocol ==htons (ETH_P_IP ))return tcp_v4_do_rcv (sk, skb); -if (sk_filter (sk, skb)) +if (tcp_filter (sk, skb)) goto discard;/*
@@ -1455,8 +1455,10 @@ process:if (tcp_v6_inbound_md5_hash (sk, skb)) goto discard_and_relse; -if (sk_filter (sk, skb)) +if (tcp_filter (sk, skb)) goto discard_and_relse; + th = (const struct tcphdr *)skb->data; + hdr =ipv6_hdr (skb); skb->dev =NULL ;
Greg Kroah-Hartman
maintainerPATCH 24/49 mlxsw: spectrum: Fix refcount bug on span entries
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yotam Gigi <[email protected]>
[ Upstream commit 2d644d4c7506646f9c4a2afceb7fd5f030bc0c9f ]
When binding port to a newly created span entry, its refcount is initialized to zero even though it has a bound port. That leads to unexpected behaviour when the user tries to delete that port from the span entry.
Fix this by initializing the reference count to 1.
Also add a warning to put function.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum.c +3 -1
@@ -231,7 +231,7 @@ mlxsw_sp_span_entry_create(struct mlxsw_ span_entry->used = true; span_entry->id = index; - span_entry->ref_count =0 ; + span_entry->ref_count =1 ; span_entry->local_port = local_port;return span_entry; }
@@ -268,6 +268,7 @@ struct mlxsw_sp_span_entry *mlxsw_sp_spa span_entry =mlxsw_sp_span_entry_find (port);if (span_entry) { +/* Already exists, just take a reference */ span_entry->ref_count++;return span_entry; }
@@ -278,6 +279,7 @@ struct mlxsw_sp_span_entry *mlxsw_sp_spastatic int mlxsw_sp_span_entry_put (struct mlxsw_sp *mlxsw_sp,struct mlxsw_sp_span_entry *span_entry) { +WARN_ON (!span_entry->ref_count);if (--span_entry->ref_count ==0 )mlxsw_sp_span_entry_destroy (mlxsw_sp, span_entry);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 25/49 mlxsw: spectrum_router: Correctly dump neighbour activity
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arkadi Sharshevsky <[email protected]>
[ Upstream commit 42cdb338f40a98e6558bae35456fe86b6e90e1ef ]
The device's neighbour table is periodically dumped in order to update the kernel about active neighbours. A single dump session may span multiple queries, until the response carries less records than requested or when a record (can contain up to four neighbour entries) is not full. Current code stops the session when the number of returned records is zero, which can result in infinite loop in case of high packet rate.
Fix this by stopping the session according to the above logic.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 22 +++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +21 -1
@@ -777,6 +777,26 @@ static void mlxsw_sp_router_neigh_rec_pr } } +static bool mlxsw_sp_router_rauhtd_is_full (char *rauhtd_pl) +{ +u8 num_rec, last_rec_index, num_entries; + + num_rec =mlxsw_reg_rauhtd_num_rec_get (rauhtd_pl); + last_rec_index = num_rec -1 ; + +if (num_rec <MLXSW_REG_RAUHTD_REC_MAX_NUM ) +return false; +if (mlxsw_reg_rauhtd_rec_type_get (rauhtd_pl, last_rec_index) == +MLXSW_REG_RAUHTD_TYPE_IPV6 ) +return true; + + num_entries =mlxsw_reg_rauhtd_ipv4_rec_num_entries_get (rauhtd_pl, + last_rec_index); +if (++num_entries ==MLXSW_REG_RAUHTD_IPV4_ENT_PER_REC ) +return true; +return false; +} +static int mlxsw_sp_router_neighs_update_rauhtd (struct mlxsw_sp *mlxsw_sp) {char *rauhtd_pl;
@@ -803,7 +823,7 @@ static int mlxsw_sp_router_neighs_updatefor (i =0 ; i < num_rec; i++)mlxsw_sp_router_neigh_rec_process (mlxsw_sp, rauhtd_pl, i); - }while (num_rec); + }while (mlxsw_sp_router_rauhtd_is_full (rauhtd_pl));rtnl_unlock ();kfree (rauhtd_pl);
Greg Kroah-Hartman
maintainerPATCH 26/49 Revert "bnx2: Reset device during driver initialization"
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baoquan He <[email protected]>
[ Upstream commit 5d0d4b91bf627f14f95167b738d524156c9d440b ]
This reverts commit 3e1be7ad2d38c6bd6aeef96df9bd0a7822f4e51c.
When people build bnx2 driver into kernel, it will fail to detect and load firmware because firmware is contained in initramfs and initramfs has not been uncompressed yet during do_initcalls. So revert commit 3e1be7a and work out a new way in the later patch.
--- drivers/net/ethernet/broadcom/bnx2.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
drivers/net/ethernet/broadcom/bnx2.c +5 -7
@@ -6356,6 +6356,10 @@ bnx2_open(struct net_device *dev)struct bnx2 *bp =netdev_priv (dev);int rc; + rc =bnx2_request_firmware (bp); +if (rc <0 ) + goto out; +netif_carrier_off (dev);bnx2_disable_int (bp);
@@ -6424,6 +6428,7 @@ open_err:bnx2_free_irq (bp);bnx2_free_mem (bp);bnx2_del_napi (bp); +bnx2_release_firmware (bp); goto out; }
@@ -8570,12 +8575,6 @@ bnx2_init_one(struct pci_dev *pdev, conspci_set_drvdata (pdev, dev); - rc =bnx2_request_firmware (bp); -if (rc <0 ) - goto error; - - -bnx2_reset_chip (bp,BNX2_DRV_MSG_CODE_RESET );memcpy (dev->dev_addr, bp->mac_addr,ETH_ALEN ); dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
@@ -8608,7 +8607,6 @@ bnx2_init_one(struct pci_dev *pdev, consreturn 0 ; error: -bnx2_release_firmware (bp);pci_iounmap (pdev, bp->regview);pci_release_regions (pdev);pci_disable_device (pdev);
Greg Kroah-Hartman
maintainerPATCH 27/49 bnx2: Wait for in-flight DMA to complete at probe stage
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baoquan He <[email protected]>
[ Upstream commit 6df77862f63f389df3b1ad879738e04440d7385d ]
In-flight DMA from 1st kernel could continue going in kdump kernel. New io-page table has been created before bnx2 does reset at open stage. We have to wait for the in-flight DMA to complete to avoid it look up into the newly created io-page table at probe stage.
--- drivers/net/ethernet/broadcom/bnx2.c | 38 +++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-)
drivers/net/ethernet/broadcom/bnx2.c +32 -6
@@ -49,6 +49,7 @@#include <linux/firmware.h> #include <linux/log2.h> #include <linux/aer.h> +#include <linux/crash_dump.h> #if defined(CONFIG_CNIC ) || defined(CONFIG_CNIC_MODULE )#define BCM_CNIC 1
@@ -4759,15 +4760,16 @@ bnx2_setup_msix_tbl(struct bnx2 *bp)BNX2_WR (bp,BNX2_PCI_GRC_WINDOW3_ADDR ,BNX2_MSIX_PBA_ADDR ); } -static int -bnx2_reset_chip (struct bnx2 *bp,u32 reset_code) +static void +bnx2_wait_dma_complete (struct bnx2 *bp) {u32 val; -int i, rc =0 ; -u8 old_port; +int i; -/* Wait for the current PCI transaction to complete before -* issuing a reset. */ +/* +* Wait for the current PCI transaction to complete before +* issuing a reset. +*/ if ((BNX2_CHIP (bp) ==BNX2_CHIP_5706 ) || (BNX2_CHIP (bp) ==BNX2_CHIP_5708 )) { BNX2_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
@@ -4791,6 +4793,21 @@ bnx2_reset_chip(struct bnx2 *bp, u32 res } } +return ; +} + + +static int +bnx2_reset_chip (struct bnx2 *bp,u32 reset_code) +{ +u32 val; +int i, rc =0 ; +u8 old_port; + +/* Wait for the current PCI transaction to complete before +* issuing a reset. */ +bnx2_wait_dma_complete (bp); +/* Wait for the firmware to tell us it is ok to issue a reset. */ bnx2_fw_sync (bp,BNX2_DRV_MSG_DATA_WAIT0 | reset_code,1 ,1 );
@@ -8575,6 +8592,15 @@ bnx2_init_one(struct pci_dev *pdev, conspci_set_drvdata (pdev, dev); +/* +* In-flight DMA from 1st kernel could continue going in kdump kernel. +* New io-page table has been created before bnx2 does reset at open stage. +* We have to wait for the in-flight DMA to complete to avoid it look up +* into the newly created io-page table. +*/ +if (is_kdump_kernel ()) +bnx2_wait_dma_complete (bp); +memcpy (dev->dev_addr, bp->mac_addr,ETH_ALEN ); dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
Greg Kroah-Hartman
maintainerPATCH 28/49 sctp: change sk state only when it has assocs in sctp_shutdown
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
[ Upstream commit 5bf35ddfee052d44f39ebaa395d87101c8918405 ]
Now when users shutdown a sock with SEND_SHUTDOWN in sctp, even if this sock has no connection (assoc), sk state would be changed to SCTP_SS_CLOSING, which is not as we expect.
Besides, after that if users try to listen on this sock, kernel could even panic when it dereference sctp_sk(sk)->bind_hash in sctp_inet_listen, as bind_hash is null when sock has no assoc.
This patch is to move sk state change after checking sk assocs is not empty, and also merge these two if() conditions and reduce indent level.
--- net/sctp/socket.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
net/sctp/socket.c +7 -8
@@ -4281,19 +4281,18 @@ static void sctp_shutdown(struct sock *s {struct net *net =sock_net (sk);struct sctp_endpoint *ep; -struct sctp_association *asoc;if (!sctp_style (sk,TCP ))return ; -if (how &SEND_SHUTDOWN ) { + ep =sctp_sk (sk)->ep; +if (how &SEND_SHUTDOWN && !list_empty (&ep->asocs)) { +struct sctp_association *asoc; + sk->sk_state =SCTP_SS_CLOSING ; - ep =sctp_sk (sk)->ep; -if (!list_empty (&ep->asocs)) { - asoc =list_entry (ep->asocs.next, - struct sctp_association, asocs); -sctp_primitive_SHUTDOWN (net, asoc,NULL ); - } + asoc =list_entry (ep->asocs.next, + struct sctp_association, asocs); +sctp_primitive_SHUTDOWN (net, asoc,NULL ); } }
Greg Kroah-Hartman
maintainerPATCH 29/49 net: stmmac: Fix lack of link transition for fixed PHYs
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Fainelli <[email protected]>
[ Upstream commit c51e424dc79e1428afc4d697cdb6a07f7af70cbf ]
Commit 52f95bbfcf72 ("stmmac: fix adjust link call in case of a switch is attached") added some logic to avoid polling the fixed PHY and therefore invoking the adjust_link callback more than once, since this is a fixed PHY and link events won't be generated.
This works fine the first time, because we start with phydev->irq = PHY_POLL, so we call adjust_link, then we set phydev->irq = PHY_IGNORE_INTERRUPT and we stop polling the PHY.
Now, if we called ndo_close(), which calls both phy_stop() and does an explicit netif_carrier_off(), we end up with a link down. Upon calling ndo_open() again, despite starting the PHY state machine, we have PHY_IGNORE_INTERRUPT set, and we generate no link event at all, so the link is permanently down.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +7 -0
@@ -871,6 +871,13 @@ static int stmmac_init_phy(struct net_dereturn -ENODEV ; } +/* stmmac_adjust_link will change this to PHY_IGNORE_INTERRUPT to avoid +* subsequent PHY polling, make sure we force a link transition if +* we have a UP/DOWN/UP transition +*/ +if (phydev->is_pseudo_fixed_link) + phydev->irq =PHY_POLL ; +pr_debug ("stmmac_init_phy: %s: attached to PHY (UID 0x%x)" " Link = %d\n" , dev->name, phydev->phy_id, phydev->link);
Greg Kroah-Hartman
maintainerPATCH 31/49 sparc: Handle negative offsets in arch_jump_label_transform
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clarke <[email protected]>
[ Upstream commit 9d9fa230206a3aea6ef451646c97122f04777983 ]
Additionally, if the offset will overflow the immediate for a ba,pt instruction, fall back on a standard ba to get an extra 3 bits.
--- arch/sparc/kernel/jump_label.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-)
arch/sparc/kernel/jump_label.c +17 -6
@@ -13,19 +13,30 @@void arch_jump_label_transform (struct jump_entry *entry,enum jump_label_type type) { -u32 val;u32 *insn = (u32 *) (unsigned long ) entry->code; +u32 val;if (type ==JUMP_LABEL_JMP ) {s32 off = (s32 )entry->target - (s32 )entry->code; +bool use_v9_branch = false; + +BUG_ON (off &3 );#ifdef CONFIG_SPARC64 -/* ba,pt %xcc, . + (off << 2) */ - val =0x10680000 | ((u32 ) off >>2 ); -#else -/* ba . + (off << 2) */ - val =0x10800000 | ((u32 ) off >>2 ); +if (off <=0xfffff && off >=-0x100000 ) + use_v9_branch = true;#endif +if (use_v9_branch) { +/* WDISP19 - target is . + immed << 2 */ +/* ba,pt %xcc, . + off */ + val =0x10680000 | (((u32 ) off >>2 ) &0x7ffff ); + }else { +/* WDISP22 - target is . + immed << 2 */ +BUG_ON (off >0x7fffff ); +BUG_ON (off <-0x800000 ); +/* ba . + off */ + val =0x10800000 | (((u32 ) off >>2 ) &0x3fffff ); + } }else { val =0x01000000 ; }
Greg Kroah-Hartman
maintainerPATCH 32/49 sparc64: Handle extremely large kernel TSB range flushes sanely.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 849c498766060a16aad5b0e0d03206726e7d2fa4 ]
If the number of pages we are flushing is more than twice the number of entries in the TSB, just scan the TSB table for matches rather than probing each and every page in the range.
Based upon a patch and report by James Clarke.
--- arch/sparc/mm/tsb.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
arch/sparc/mm/tsb.c +17 -0
@@ -27,6 +27,20 @@ static inline int tag_compare(unsigned lreturn (tag == (vaddr >>22 )); } +static void flush_tsb_kernel_range_scan (unsigned long start,unsigned long end) +{ +unsigned long idx; + +for (idx =0 ; idx <KERNEL_TSB_NENTRIES ; idx++) { +struct tsb *ent = &swapper_tsb[idx]; +unsigned long match = idx <<13 ; + + match |= (ent->tag <<22 ); +if (match >= start && match < end) + ent->tag = (1UL <<TSB_TAG_INVALID_BIT ); + } +} +/* TSB flushes need only occur on the processor initiating the address * space modification, not on each cpu the address space has run on. * Only the TLB flush needs that treatment.
@@ -36,6 +50,9 @@ void flush_tsb_kernel_range(unsigned lon {unsigned long v; +if ((end - start) >>PAGE_SHIFT >=2 *KERNEL_TSB_NENTRIES ) +return flush_tsb_kernel_range_scan (start, end); +for (v = start; v < end; v +=PAGE_SIZE ) {unsigned long hash =tsb_hash (v,PAGE_SHIFT ,KERNEL_TSB_NENTRIES );
Greg Kroah-Hartman
maintainerPATCH 33/49 sparc64: Fix illegal relative branches in hypervisor patched TLB code.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit b429ae4d5b565a71dfffd759dfcd4f6c093ced94 ]
When we copy code over to patch another piece of code, we can only use PC-relative branches that target code within that piece of code.
Such PC-relative branches cannot be made to external symbols because the patch moves the location of the code and thus modifies the relative address of external symbols.
Use an absolute jmpl to fix this problem.
--- arch/sparc/mm/ultra.S | 65 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 14 deletions(-)
arch/sparc/mm/ultra.S +51 -14
@@ -30,7 +30,7 @@ .text .align 32 .globl __flush_tlb_mm -__flush_tlb_mm: /* 18 insns */ +__flush_tlb_mm: /* 19 insns */ /* %o0=(ctx & TAG_CONTEXT_BITS), %o1=SECONDARY_CONTEXT */ ldxa [%o1] ASI_DMMU, %g2 cmp %g2, %o0
@@ -81,7 +81,7 @@ __flush_tlb_page: /* 22 insns */ .align 32 .globl __flush_tlb_pending -__flush_tlb_pending: /* 26 insns */ +__flush_tlb_pending: /* 27 insns */ /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */ rdpr %pstate, %g7 sllx %o1, 3, %o1
@@ -113,7 +113,7 @@ __flush_tlb_pending: /* 26 insns */ .align 32 .globl __flush_tlb_kernel_range -__flush_tlb_kernel_range: /* 16 insns */ +__flush_tlb_kernel_range: /* 19 insns */ /* %o0=start, %o1=end */ cmp %o0, %o1 be,pn %xcc, 2f
@@ -131,6 +131,9 @@ __flush_tlb_kernel_range: /* 16 insns */ retl nop nop + nop + nop + nop __spitfire_flush_tlb_mm_slow: rdpr %pstate, %g1
@@ -309,19 +312,28 @@ __hypervisor_tlb_tl0_error: ret restore -__hypervisor_flush_tlb_mm: /* 10 insns */ +__hypervisor_flush_tlb_mm: /* 19 insns */ mov %o0, %o2 /* ARG2: mmu context */ mov 0, %o0 /* ARG0: CPU lists unimplemented */ mov 0, %o1 /* ARG1: CPU lists unimplemented */ mov HV_MMU_ALL, %o3 /* ARG3: flags */ mov HV_FAST_MMU_DEMAP_CTX, %o5 ta HV_FAST_TRAP - brnz,pn %o0, __hypervisor_tlb_tl0_error + brnz,pn %o0, 1f mov HV_FAST_MMU_DEMAP_CTX, %o1 retl nop +1: sethi %hi(__hypervisor_tlb_tl0_error), %o5 + jmpl %o5 + %lo(__hypervisor_tlb_tl0_error), %g0 + nop + nop + nop + nop + nop + nop + nop -__hypervisor_flush_tlb_page: /* 11 insns */ +__hypervisor_flush_tlb_page: /* 22 insns */ /* %o0 = context, %o1 = vaddr */ mov %o0, %g2 mov %o1, %o0 /* ARG0: vaddr + IMMU-bit */
@@ -330,10 +342,21 @@ __hypervisor_flush_tlb_page: /* 11 insns srlx %o0, PAGE_SHIFT, %o0 sllx %o0, PAGE_SHIFT, %o0 ta HV_MMU_UNMAP_ADDR_TRAP - brnz,pn %o0, __hypervisor_tlb_tl0_error + brnz,pn %o0, 1f mov HV_MMU_UNMAP_ADDR_TRAP, %o1 retl nop +1: sethi %hi(__hypervisor_tlb_tl0_error), %o2 + jmpl %o2 + %lo(__hypervisor_tlb_tl0_error), %g0 + nop + nop + nop + nop + nop + nop + nop + nop + nop __hypervisor_flush_tlb_pending: /* 16 insns */ /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
@@ -347,14 +370,25 @@ __hypervisor_flush_tlb_pending: /* 16 in srlx %o0, PAGE_SHIFT, %o0 sllx %o0, PAGE_SHIFT, %o0 ta HV_MMU_UNMAP_ADDR_TRAP - brnz,pn %o0, __hypervisor_tlb_tl0_error + brnz,pn %o0, 1f mov HV_MMU_UNMAP_ADDR_TRAP, %o1 brnz,pt %g1, 1b nop retl nop +1: sethi %hi(__hypervisor_tlb_tl0_error), %o2 + jmpl %o2 + %lo(__hypervisor_tlb_tl0_error), %g0 + nop + nop + nop + nop + nop + nop + nop + nop + nop -__hypervisor_flush_tlb_kernel_range: /* 16 insns */ +__hypervisor_flush_tlb_kernel_range: /* 19 insns */ /* %o0=start, %o1=end */ cmp %o0, %o1 be,pn %xcc, 2f
@@ -366,12 +400,15 @@ __hypervisor_flush_tlb_kernel_range: /* mov 0, %o1 /* ARG1: mmu context */ mov HV_MMU_ALL, %o2 /* ARG2: flags */ ta HV_MMU_UNMAP_ADDR_TRAP - brnz,pn %o0, __hypervisor_tlb_tl0_error + brnz,pn %o0, 3f mov HV_MMU_UNMAP_ADDR_TRAP, %o1 brnz,pt %g2, 1b sub %g2, %g3, %g2 2: retl nop +3: sethi %hi(__hypervisor_tlb_tl0_error), %o2 + jmpl %o2 + %lo(__hypervisor_tlb_tl0_error), %g0 + nop #ifdef DCACHE_ALIASING_POSSIBLE /* XXX Niagara and friends have an 8K cache, so no aliasing is
@@ -819,28 +856,28 @@ hypervisor_patch_cachetlbops: sethi %hi(__hypervisor_flush_tlb_mm), %o1 or %o1, %lo(__hypervisor_flush_tlb_mm), %o1 call tlb_patch_one - mov 10, %o2 + mov 19, %o2 sethi %hi(__flush_tlb_page), %o0 or %o0, %lo(__flush_tlb_page), %o0 sethi %hi(__hypervisor_flush_tlb_page), %o1 or %o1, %lo(__hypervisor_flush_tlb_page), %o1 call tlb_patch_one - mov 11, %o2 + mov 22, %o2 sethi %hi(__flush_tlb_pending), %o0 or %o0, %lo(__flush_tlb_pending), %o0 sethi %hi(__hypervisor_flush_tlb_pending), %o1 or %o1, %lo(__hypervisor_flush_tlb_pending), %o1 call tlb_patch_one - mov 16, %o2 + mov 27, %o2 sethi %hi(__flush_tlb_kernel_range), %o0 or %o0, %lo(__flush_tlb_kernel_range), %o0 sethi %hi(__hypervisor_flush_tlb_kernel_range), %o1 or %o1, %lo(__hypervisor_flush_tlb_kernel_range), %o1 call tlb_patch_one - mov 16, %o2 + mov 19, %o2 #ifdef DCACHE_ALIASING_POSSIBLE sethi %hi(__flush_dcache_page), %o0
Greg Kroah-Hartman
maintainerPATCH 34/49 sparc64: Fix instruction count in comment for __hypervisor_flush_tlb_pending.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 830cda3f9855ff092b0e9610346d110846fc497c ]
Noticed by James Clarke.
--- arch/sparc/mm/ultra.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/sparc/mm/ultra.S +1 -1
@@ -358,7 +358,7 @@ __hypervisor_flush_tlb_page: /* 22 insns nop nop -__hypervisor_flush_tlb_pending: /* 16 insns */ +__hypervisor_flush_tlb_pending: /* 27 insns */ /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */ sllx %o1, 3, %g1 mov %o2, %g2
Greg Kroah-Hartman
maintainerPATCH 35/49 sparc64: Fix illegal relative branches in hypervisor patched TLB cross-call code.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit a236441bb69723032db94128761a469030c3fe6d ]
Just like the non-cross-call TLB flush handlers, the cross-call ones need to avoid doing PC-relative branches outside of their code blocks.
--- arch/sparc/mm/ultra.S | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-)
arch/sparc/mm/ultra.S +30 -12
@@ -484,7 +484,7 @@ cheetah_patch_cachetlbops: */ .align 32 .globl xcall_flush_tlb_mm -xcall_flush_tlb_mm: /* 21 insns */ +xcall_flush_tlb_mm: /* 24 insns */ mov PRIMARY_CONTEXT, %g2 ldxa [%g2] ASI_DMMU, %g3 srlx %g3, CTX_PGSZ1_NUC_SHIFT, %g4
@@ -506,9 +506,12 @@ xcall_flush_tlb_mm: /* 21 insns */ nop nop nop + nop + nop + nop .globl xcall_flush_tlb_page -xcall_flush_tlb_page: /* 17 insns */ +xcall_flush_tlb_page: /* 20 insns */ /* %g5=context, %g1=vaddr */ mov PRIMARY_CONTEXT, %g4 ldxa [%g4] ASI_DMMU, %g2
@@ -527,9 +530,12 @@ xcall_flush_tlb_page: /* 17 insns */ retry nop nop + nop + nop + nop .globl xcall_flush_tlb_kernel_range -xcall_flush_tlb_kernel_range: /* 25 insns */ +xcall_flush_tlb_kernel_range: /* 28 insns */ sethi %hi(PAGE_SIZE - 1), %g2 or %g2, %lo(PAGE_SIZE - 1), %g2 andn %g1, %g2, %g1
@@ -555,6 +561,9 @@ xcall_flush_tlb_kernel_range: /* 25 insn nop nop nop + nop + nop + nop /* This runs in a very controlled environment, so we do * not need to worry about BH races etc.
@@ -737,7 +746,7 @@ __hypervisor_tlb_xcall_error: ba,a,pt %xcc, rtrap .globl __hypervisor_xcall_flush_tlb_mm -__hypervisor_xcall_flush_tlb_mm: /* 21 insns */ +__hypervisor_xcall_flush_tlb_mm: /* 24 insns */ /* %g5=ctx, g1,g2,g3,g4,g7=scratch, %g6=unusable */ mov %o0, %g2 mov %o1, %g3
@@ -751,7 +760,7 @@ __hypervisor_xcall_flush_tlb_mm: /* 21 i mov HV_FAST_MMU_DEMAP_CTX, %o5 ta HV_FAST_TRAP mov HV_FAST_MMU_DEMAP_CTX, %g6 - brnz,pn %o0, __hypervisor_tlb_xcall_error + brnz,pn %o0, 1f mov %o0, %g5 mov %g2, %o0 mov %g3, %o1
@@ -760,9 +769,12 @@ __hypervisor_xcall_flush_tlb_mm: /* 21 i mov %g7, %o5 membar #Sync retry +1: sethi %hi(__hypervisor_tlb_xcall_error), %g4 + jmpl %g4 + %lo(__hypervisor_tlb_xcall_error), %g0 + nop .globl __hypervisor_xcall_flush_tlb_page -__hypervisor_xcall_flush_tlb_page: /* 17 insns */ +__hypervisor_xcall_flush_tlb_page: /* 20 insns */ /* %g5=ctx, %g1=vaddr */ mov %o0, %g2 mov %o1, %g3
@@ -774,16 +786,19 @@ __hypervisor_xcall_flush_tlb_page: /* 17 sllx %o0, PAGE_SHIFT, %o0 ta HV_MMU_UNMAP_ADDR_TRAP mov HV_MMU_UNMAP_ADDR_TRAP, %g6 - brnz,a,pn %o0, __hypervisor_tlb_xcall_error + brnz,a,pn %o0, 1f mov %o0, %g5 mov %g2, %o0 mov %g3, %o1 mov %g4, %o2 membar #Sync retry +1: sethi %hi(__hypervisor_tlb_xcall_error), %g4 + jmpl %g4 + %lo(__hypervisor_tlb_xcall_error), %g0 + nop .globl __hypervisor_xcall_flush_tlb_kernel_range -__hypervisor_xcall_flush_tlb_kernel_range: /* 25 insns */ +__hypervisor_xcall_flush_tlb_kernel_range: /* 28 insns */ /* %g1=start, %g7=end, g2,g3,g4,g5,g6=scratch */ sethi %hi(PAGE_SIZE - 1), %g2 or %g2, %lo(PAGE_SIZE - 1), %g2
@@ -800,7 +815,7 @@ __hypervisor_xcall_flush_tlb_kernel_rang mov HV_MMU_ALL, %o2 /* ARG2: flags */ ta HV_MMU_UNMAP_ADDR_TRAP mov HV_MMU_UNMAP_ADDR_TRAP, %g6 - brnz,pn %o0, __hypervisor_tlb_xcall_error + brnz,pn %o0, 1f mov %o0, %g5 sethi %hi(PAGE_SIZE), %o2 brnz,pt %g3, 1b
@@ -810,6 +825,9 @@ __hypervisor_xcall_flush_tlb_kernel_rang mov %g7, %o2 membar #Sync retry +1: sethi %hi(__hypervisor_tlb_xcall_error), %g4 + jmpl %g4 + %lo(__hypervisor_tlb_xcall_error), %g0 + nop /* These just get rescheduled to PIL vectors. */ .globl xcall_call_function
@@ -894,21 +912,21 @@ hypervisor_patch_cachetlbops: sethi %hi(__hypervisor_xcall_flush_tlb_mm), %o1 or %o1, %lo(__hypervisor_xcall_flush_tlb_mm), %o1 call tlb_patch_one - mov 21, %o2 + mov 24, %o2 sethi %hi(xcall_flush_tlb_page), %o0 or %o0, %lo(xcall_flush_tlb_page), %o0 sethi %hi(__hypervisor_xcall_flush_tlb_page), %o1 or %o1, %lo(__hypervisor_xcall_flush_tlb_page), %o1 call tlb_patch_one - mov 17, %o2 + mov 20, %o2 sethi %hi(xcall_flush_tlb_kernel_range), %o0 or %o0, %lo(xcall_flush_tlb_kernel_range), %o0 sethi %hi(__hypervisor_xcall_flush_tlb_kernel_range), %o1 or %o1, %lo(__hypervisor_xcall_flush_tlb_kernel_range), %o1 call tlb_patch_one - mov 25, %o2 + mov 28, %o2 #endif /* CONFIG_SMP */ ret
Greg Kroah-Hartman
maintainerPATCH 36/49 sparc64: Handle extremely large kernel TLB range flushes more gracefully.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit a74ad5e660a9ee1d071665e7e8ad822784a2dc7f ]
When the vmalloc area gets fragmented, and because the firmware mapping area sits between where modules live and the vmalloc area, we can sometimes receive requests for enormous kernel TLB range flushes.
When this happens the cpu just spins flushing billions of pages and this triggers the NMI watchdog and other problems.
We took care of this on the TSB side by doing a linear scan of the table once we pass a certain threshold.
Do something similar for the TLB flush, however we are limited by the TLB flush facilities provided by the different chip variants.
First of all we use an (mostly arbitrary) cut-off of 256K which is about 32 pages. This can be tuned in the future.
The huge range code path for each chip works as follows:
1) On spitfire we flush all non-locked TLB entries using diagnostic acceses.
2) On cheetah we use the "flush all" TLB flush.
3) On sun4v/hypervisor we do a TLB context flush on context 0, which unlike previous chips does not remove "permanent" or locked entries.
We could probably do something better on spitfire, such as limiting the flush to kernel TLB entries or even doing range comparisons. However that probably isn't worth it since those chips are old and the TLB only had 64 entries.
--- arch/sparc/mm/ultra.S | 283 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 228 insertions(+), 55 deletions(-)
arch/sparc/mm/ultra.S +228 -55
@@ -113,12 +113,14 @@ __flush_tlb_pending: /* 27 insns */ .align 32 .globl __flush_tlb_kernel_range -__flush_tlb_kernel_range: /* 19 insns */ +__flush_tlb_kernel_range: /* 31 insns */ /* %o0=start, %o1=end */ cmp %o0, %o1 be,pn %xcc, 2f + sub %o1, %o0, %o3 + srlx %o3, 18, %o4 + brnz,pn %o4, __spitfire_flush_tlb_kernel_range_slow sethi %hi(PAGE_SIZE), %o4 - sub %o1, %o0, %o3 sub %o3, %o4, %o3 or %o0, 0x20, %o0 ! Nucleus 1: stxa %g0, [%o0 + %o3] ASI_DMMU_DEMAP
@@ -134,6 +136,38 @@ __flush_tlb_kernel_range: /* 19 insns */ nop nop nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + +__spitfire_flush_tlb_kernel_range_slow: + mov 63 * 8, %o4 +1: ldxa [%o4] ASI_ITLB_DATA_ACCESS, %o3 + andcc %o3, 0x40, %g0 /* _PAGE_L_4U */ + bne,pn %xcc, 2f + mov TLB_TAG_ACCESS, %o3 + stxa %g0, [%o3] ASI_IMMU + stxa %g0, [%o4] ASI_ITLB_DATA_ACCESS + membar #Sync +2: ldxa [%o4] ASI_DTLB_DATA_ACCESS, %o3 + andcc %o3, 0x40, %g0 + bne,pn %xcc, 2f + mov TLB_TAG_ACCESS, %o3 + stxa %g0, [%o3] ASI_DMMU + stxa %g0, [%o4] ASI_DTLB_DATA_ACCESS + membar #Sync +2: sub %o4, 8, %o4 + brgez,pt %o4, 1b + nop + retl + nop __spitfire_flush_tlb_mm_slow: rdpr %pstate, %g1
@@ -288,6 +322,40 @@ __cheetah_flush_tlb_pending: /* 27 insns retl wrpr %g7, 0x0, %pstate +__cheetah_flush_tlb_kernel_range: /* 31 insns */ + /* %o0=start, %o1=end */ + cmp %o0, %o1 + be,pn %xcc, 2f + sub %o1, %o0, %o3 + srlx %o3, 18, %o4 + brnz,pn %o4, 3f + sethi %hi(PAGE_SIZE), %o4 + sub %o3, %o4, %o3 + or %o0, 0x20, %o0 ! Nucleus +1: stxa %g0, [%o0 + %o3] ASI_DMMU_DEMAP + stxa %g0, [%o0 + %o3] ASI_IMMU_DEMAP + membar #Sync + brnz,pt %o3, 1b + sub %o3, %o4, %o3 +2: sethi %hi(KERNBASE), %o3 + flush %o3 + retl + nop +3: mov 0x80, %o4 + stxa %g0, [%o4] ASI_DMMU_DEMAP + membar #Sync + stxa %g0, [%o4] ASI_IMMU_DEMAP + membar #Sync + retl + nop + nop + nop + nop + nop + nop + nop + nop + #ifdef DCACHE_ALIASING_POSSIBLE __cheetah_flush_dcache_page: /* 11 insns */ sethi %hi(PAGE_OFFSET), %g1
@@ -388,13 +456,15 @@ __hypervisor_flush_tlb_pending: /* 27 in nop nop -__hypervisor_flush_tlb_kernel_range: /* 19 insns */ +__hypervisor_flush_tlb_kernel_range: /* 31 insns */ /* %o0=start, %o1=end */ cmp %o0, %o1 be,pn %xcc, 2f - sethi %hi(PAGE_SIZE), %g3 - mov %o0, %g1 - sub %o1, %g1, %g2 + sub %o1, %o0, %g2 + srlx %g2, 18, %g3 + brnz,pn %g3, 4f + mov %o0, %g1 + sethi %hi(PAGE_SIZE), %g3 sub %g2, %g3, %g2 1: add %g1, %g2, %o0 /* ARG0: virtual address */ mov 0, %o1 /* ARG1: mmu context */
@@ -409,6 +479,16 @@ __hypervisor_flush_tlb_kernel_range: /* 3: sethi %hi(__hypervisor_tlb_tl0_error), %o2 jmpl %o2 + %lo(__hypervisor_tlb_tl0_error), %g0 nop +4: mov 0, %o0 /* ARG0: CPU lists unimplemented */ + mov 0, %o1 /* ARG1: CPU lists unimplemented */ + mov 0, %o2 /* ARG2: mmu context == nucleus */ + mov HV_MMU_ALL, %o3 /* ARG3: flags */ + mov HV_FAST_MMU_DEMAP_CTX, %o5 + ta HV_FAST_TRAP + brnz,pn %o0, 3b + mov HV_FAST_MMU_DEMAP_CTX, %o1 + retl + nop #ifdef DCACHE_ALIASING_POSSIBLE /* XXX Niagara and friends have an 8K cache, so no aliasing is
@@ -431,43 +511,6 @@ tlb_patch_one: retl nop - .globl cheetah_patch_cachetlbops -cheetah_patch_cachetlbops: - save %sp, -128, %sp - - sethi %hi(__flush_tlb_mm), %o0 - or %o0, %lo(__flush_tlb_mm), %o0 - sethi %hi(__cheetah_flush_tlb_mm), %o1 - or %o1, %lo(__cheetah_flush_tlb_mm), %o1 - call tlb_patch_one - mov 19, %o2 - - sethi %hi(__flush_tlb_page), %o0 - or %o0, %lo(__flush_tlb_page), %o0 - sethi %hi(__cheetah_flush_tlb_page), %o1 - or %o1, %lo(__cheetah_flush_tlb_page), %o1 - call tlb_patch_one - mov 22, %o2 - - sethi %hi(__flush_tlb_pending), %o0 - or %o0, %lo(__flush_tlb_pending), %o0 - sethi %hi(__cheetah_flush_tlb_pending), %o1 - or %o1, %lo(__cheetah_flush_tlb_pending), %o1 - call tlb_patch_one - mov 27, %o2 - -#ifdef DCACHE_ALIASING_POSSIBLE - sethi %hi(__flush_dcache_page), %o0 - or %o0, %lo(__flush_dcache_page), %o0 - sethi %hi(__cheetah_flush_dcache_page), %o1 - or %o1, %lo(__cheetah_flush_dcache_page), %o1 - call tlb_patch_one - mov 11, %o2 -#endif /* DCACHE_ALIASING_POSSIBLE */ - - ret - restore - #ifdef CONFIG_SMP /* These are all called by the slaves of a cross call, at * trap level 1, with interrupts fully disabled.
@@ -535,13 +578,15 @@ xcall_flush_tlb_page: /* 20 insns */ nop .globl xcall_flush_tlb_kernel_range -xcall_flush_tlb_kernel_range: /* 28 insns */ +xcall_flush_tlb_kernel_range: /* 44 insns */ sethi %hi(PAGE_SIZE - 1), %g2 or %g2, %lo(PAGE_SIZE - 1), %g2 andn %g1, %g2, %g1 andn %g7, %g2, %g7 sub %g7, %g1, %g3 - add %g2, 1, %g2 + srlx %g3, 18, %g2 + brnz,pn %g2, 2f + add %g2, 1, %g2 sub %g3, %g2, %g3 or %g1, 0x20, %g1 ! Nucleus 1: stxa %g0, [%g1 + %g3] ASI_DMMU_DEMAP
@@ -550,11 +595,25 @@ xcall_flush_tlb_kernel_range: /* 28 insn brnz,pt %g3, 1b sub %g3, %g2, %g3 retry - nop - nop - nop - nop - nop +2: mov 63 * 8, %g1 +1: ldxa [%g1] ASI_ITLB_DATA_ACCESS, %g2 + andcc %g2, 0x40, %g0 /* _PAGE_L_4U */ + bne,pn %xcc, 2f + mov TLB_TAG_ACCESS, %g2 + stxa %g0, [%g2] ASI_IMMU + stxa %g0, [%g1] ASI_ITLB_DATA_ACCESS + membar #Sync +2: ldxa [%g1] ASI_DTLB_DATA_ACCESS, %g2 + andcc %g2, 0x40, %g0 + bne,pn %xcc, 2f + mov TLB_TAG_ACCESS, %g2 + stxa %g0, [%g2] ASI_DMMU + stxa %g0, [%g1] ASI_DTLB_DATA_ACCESS + membar #Sync +2: sub %g1, 8, %g1 + brgez,pt %g1, 1b + nop + retry nop nop nop
@@ -683,6 +742,52 @@ xcall_fetch_glob_pmu_n4: retry +__cheetah_xcall_flush_tlb_kernel_range: /* 44 insns */ + sethi %hi(PAGE_SIZE - 1), %g2 + or %g2, %lo(PAGE_SIZE - 1), %g2 + andn %g1, %g2, %g1 + andn %g7, %g2, %g7 + sub %g7, %g1, %g3 + srlx %g3, 18, %g2 + brnz,pn %g2, 2f + add %g2, 1, %g2 + sub %g3, %g2, %g3 + or %g1, 0x20, %g1 ! Nucleus +1: stxa %g0, [%g1 + %g3] ASI_DMMU_DEMAP + stxa %g0, [%g1 + %g3] ASI_IMMU_DEMAP + membar #Sync + brnz,pt %g3, 1b + sub %g3, %g2, %g3 + retry +2: mov 0x80, %g2 + stxa %g0, [%g2] ASI_DMMU_DEMAP + membar #Sync + stxa %g0, [%g2] ASI_IMMU_DEMAP + membar #Sync + retry + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + #ifdef DCACHE_ALIASING_POSSIBLE .align 32 .globl xcall_flush_dcache_page_cheetah
@@ -798,18 +903,20 @@ __hypervisor_xcall_flush_tlb_page: /* 20 nop .globl __hypervisor_xcall_flush_tlb_kernel_range -__hypervisor_xcall_flush_tlb_kernel_range: /* 28 insns */ +__hypervisor_xcall_flush_tlb_kernel_range: /* 44 insns */ /* %g1=start, %g7=end, g2,g3,g4,g5,g6=scratch */ sethi %hi(PAGE_SIZE - 1), %g2 or %g2, %lo(PAGE_SIZE - 1), %g2 andn %g1, %g2, %g1 andn %g7, %g2, %g7 sub %g7, %g1, %g3 + srlx %g3, 18, %g7 add %g2, 1, %g2 sub %g3, %g2, %g3 mov %o0, %g2 mov %o1, %g4 - mov %o2, %g7 + brnz,pn %g7, 2f + mov %o2, %g7 1: add %g1, %g3, %o0 /* ARG0: virtual address */ mov 0, %o1 /* ARG1: mmu context */ mov HV_MMU_ALL, %o2 /* ARG2: flags */
@@ -820,7 +927,7 @@ __hypervisor_xcall_flush_tlb_kernel_rang sethi %hi(PAGE_SIZE), %o2 brnz,pt %g3, 1b sub %g3, %o2, %g3 - mov %g2, %o0 +5: mov %g2, %o0 mov %g4, %o1 mov %g7, %o2 membar #Sync
@@ -828,6 +935,20 @@ __hypervisor_xcall_flush_tlb_kernel_rang 1: sethi %hi(__hypervisor_tlb_xcall_error), %g4 jmpl %g4 + %lo(__hypervisor_tlb_xcall_error), %g0 nop +2: mov %o3, %g1 + mov %o5, %g3 + mov 0, %o0 /* ARG0: CPU lists unimplemented */ + mov 0, %o1 /* ARG1: CPU lists unimplemented */ + mov 0, %o2 /* ARG2: mmu context == nucleus */ + mov HV_MMU_ALL, %o3 /* ARG3: flags */ + mov HV_FAST_MMU_DEMAP_CTX, %o5 + ta HV_FAST_TRAP + mov %g1, %o3 + brz,pt %o0, 5b + mov %g3, %o5 + mov HV_FAST_MMU_DEMAP_CTX, %g6 + ba,pt %xcc, 1b + clr %g5 /* These just get rescheduled to PIL vectors. */ .globl xcall_call_function
@@ -864,6 +985,58 @@ xcall_kgdb_capture: #endif /* CONFIG_SMP */ + .globl cheetah_patch_cachetlbops +cheetah_patch_cachetlbops: + save %sp, -128, %sp + + sethi %hi(__flush_tlb_mm), %o0 + or %o0, %lo(__flush_tlb_mm), %o0 + sethi %hi(__cheetah_flush_tlb_mm), %o1 + or %o1, %lo(__cheetah_flush_tlb_mm), %o1 + call tlb_patch_one + mov 19, %o2 + + sethi %hi(__flush_tlb_page), %o0 + or %o0, %lo(__flush_tlb_page), %o0 + sethi %hi(__cheetah_flush_tlb_page), %o1 + or %o1, %lo(__cheetah_flush_tlb_page), %o1 + call tlb_patch_one + mov 22, %o2 + + sethi %hi(__flush_tlb_pending), %o0 + or %o0, %lo(__flush_tlb_pending), %o0 + sethi %hi(__cheetah_flush_tlb_pending), %o1 + or %o1, %lo(__cheetah_flush_tlb_pending), %o1 + call tlb_patch_one + mov 27, %o2 + + sethi %hi(__flush_tlb_kernel_range), %o0 + or %o0, %lo(__flush_tlb_kernel_range), %o0 + sethi %hi(__cheetah_flush_tlb_kernel_range), %o1 + or %o1, %lo(__cheetah_flush_tlb_kernel_range), %o1 + call tlb_patch_one + mov 31, %o2 + +#ifdef DCACHE_ALIASING_POSSIBLE + sethi %hi(__flush_dcache_page), %o0 + or %o0, %lo(__flush_dcache_page), %o0 + sethi %hi(__cheetah_flush_dcache_page), %o1 + or %o1, %lo(__cheetah_flush_dcache_page), %o1 + call tlb_patch_one + mov 11, %o2 +#endif /* DCACHE_ALIASING_POSSIBLE */ + +#ifdef CONFIG_SMP + sethi %hi(xcall_flush_tlb_kernel_range), %o0 + or %o0, %lo(xcall_flush_tlb_kernel_range), %o0 + sethi %hi(__cheetah_xcall_flush_tlb_kernel_range), %o1 + or %o1, %lo(__cheetah_xcall_flush_tlb_kernel_range), %o1 + call tlb_patch_one + mov 44, %o2 +#endif /* CONFIG_SMP */ + + ret + restore .globl hypervisor_patch_cachetlbops hypervisor_patch_cachetlbops:
@@ -895,7 +1068,7 @@ hypervisor_patch_cachetlbops: sethi %hi(__hypervisor_flush_tlb_kernel_range), %o1 or %o1, %lo(__hypervisor_flush_tlb_kernel_range), %o1 call tlb_patch_one - mov 19, %o2 + mov 31, %o2 #ifdef DCACHE_ALIASING_POSSIBLE sethi %hi(__flush_dcache_page), %o0
@@ -926,7 +1099,7 @@ hypervisor_patch_cachetlbops: sethi %hi(__hypervisor_xcall_flush_tlb_kernel_range), %o1 or %o1, %lo(__hypervisor_xcall_flush_tlb_kernel_range), %o1 call tlb_patch_one - mov 28, %o2 + mov 44, %o2 #endif /* CONFIG_SMP */ ret
Greg Kroah-Hartman
maintainerPATCH 37/49 sparc64: Delete __ret_efault.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit aa95ce361ed95c72ac42dcb315166bce5cf1a014 ]
It is completely unused.
--- arch/sparc/include/asm/uaccess_64.h | 1 - arch/sparc/kernel/head_64.S | 7 +------ arch/sparc/kernel/sparc_ksyms_64.c | 1 - 3 files changed, 1 insertion(+), 8 deletions(-)
arch/sparc/include/asm/uaccess_64.h +0 -1
@@ -98,7 +98,6 @@ struct exception_table_entry {unsigned int insn, fixup; }; -void __ret_efault (void );void __retl_efault (void );/* Uh, these should become the main single-value transfer routines..
arch/sparc/kernel/head_64.S +1 -6
@@ -922,12 +922,7 @@ prom_tba: .xword 0 tlb_type: .word 0 /* Must NOT end up in BSS */ .section ".fixup",#alloc,#execinstr - .globl __ret_efault, __retl_efault, __ret_one, __retl_one -ENTRY(__ret_efault) - ret - restore %g0, -EFAULT, %o0 -ENDPROC(__ret_efault) - + .globl __retl_efault, __ret_one, __retl_one ENTRY(__retl_efault) retl mov -EFAULT, %o0
arch/sparc/kernel/sparc_ksyms_64.c +0 -1
@@ -27,7 +27,6 @@ EXPORT_SYMBOL(__flushw_user);EXPORT_SYMBOL_GPL (real_hard_smp_processor_id);/* from head_64.S */ -EXPORT_SYMBOL (__ret_efault);EXPORT_SYMBOL (tlb_type);EXPORT_SYMBOL (sun4v_chip_type);EXPORT_SYMBOL (prom_root_node);
Greg Kroah-Hartman
maintainerPATCH 38/49 sparc64: Prepare to move to more saner user copy exception handling.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 83a17d2661674d8c198adc0e183418f72aabab79 ]
The fixup helper function mechanism for handling user copy fault handling is not %100 accurrate, and can never be made so.
We are going to transition the code to return the running return return length, which is always kept track in one or more registers of each of these routines.
In order to convert them one by one, we have to allow the existing behavior to continue functioning.
Therefore make all the copy code that wants the fixup helper to be used return negative one.
After all of the user copy routines have been converted, this logic and the fixup helpers themselves can be removed completely.
--- arch/sparc/include/asm/uaccess_64.h | 21 +++++++++++++++------ arch/sparc/kernel/head_64.S | 23 +++++++++++------------ arch/sparc/lib/GENcopy_from_user.S | 2 +- arch/sparc/lib/GENcopy_to_user.S | 2 +- arch/sparc/lib/NG2copy_from_user.S | 4 ++-- arch/sparc/lib/NG2copy_to_user.S | 4 ++-- arch/sparc/lib/NG4copy_from_user.S | 4 ++-- arch/sparc/lib/NG4copy_to_user.S | 4 ++-- arch/sparc/lib/NGcopy_from_user.S | 2 +- arch/sparc/lib/NGcopy_to_user.S | 2 +- arch/sparc/lib/U1copy_from_user.S | 4 ++-- arch/sparc/lib/U1copy_to_user.S | 4 ++-- arch/sparc/lib/U3copy_from_user.S | 4 ++-- arch/sparc/lib/U3copy_to_user.S | 4 ++-- arch/sparc/lib/copy_in_user.S | 2 +- 15 files changed, 47 insertions(+), 39 deletions(-)
arch/sparc/include/asm/uaccess_64.h +15 -6
@@ -214,8 +214,11 @@ copy_from_user(void *to, const void __uscheck_object_size (to, size, false); ret =___copy_from_user (to, from, size); -if (unlikely (ret)) - ret =copy_from_user_fixup (to, from, size); +if (unlikely (ret)) { +if ((long )ret <0 ) + ret =copy_from_user_fixup (to, from, size); +return ret; + }return ret; }
@@ -234,8 +237,11 @@ copy_to_user(void __user *to, const voidcheck_object_size (from, size, true); ret =___copy_to_user (to, from, size); -if (unlikely (ret)) - ret =copy_to_user_fixup (to, from, size); +if (unlikely (ret)) { +if ((long )ret <0 ) + ret =copy_to_user_fixup (to, from, size); +return ret; + }return ret; }#define __copy_to_user copy_to_user
@@ -250,8 +256,11 @@ copy_in_user(void __user *to, void __use {unsigned long ret =___copy_in_user (to, from, size); -if (unlikely (ret)) - ret =copy_in_user_fixup (to, from, size); +if (unlikely (ret)) { +if ((long )ret <0 ) + ret =copy_in_user_fixup (to, from, size); +return ret; + }return ret; }#define __copy_in_user copy_in_user
arch/sparc/kernel/head_64.S +11 -12
@@ -922,41 +922,40 @@ prom_tba: .xword 0 tlb_type: .word 0 /* Must NOT end up in BSS */ .section ".fixup",#alloc,#execinstr - .globl __retl_efault, __ret_one, __retl_one ENTRY(__retl_efault) retl mov -EFAULT, %o0 ENDPROC(__retl_efault) -ENTRY(__retl_one) +ENTRY(__retl_mone) retl - mov 1, %o0 -ENDPROC(__retl_one) + mov -1, %o0 +ENDPROC(__retl_mone) -ENTRY(__retl_one_fp) +ENTRY(__retl_mone_fp) VISExitHalf retl mov 1, %o0 -ENDPROC(__retl_one_fp) +ENDPROC(__retl_mone_fp) -ENTRY(__ret_one_asi) +ENTRY(__ret_mone_asi) wr %g0, ASI_AIUS, %asi ret restore %g0, 1, %o0 -ENDPROC(__ret_one_asi) +ENDPROC(__ret_mone_asi) -ENTRY(__retl_one_asi) +ENTRY(__retl_mone_asi) wr %g0, ASI_AIUS, %asi retl mov 1, %o0 -ENDPROC(__retl_one_asi) +ENDPROC(__retl_mone_asi) -ENTRY(__retl_one_asi_fp) +ENTRY(__retl_mone_asi_fp) wr %g0, ASI_AIUS, %asi VISExitHalf retl mov 1, %o0 -ENDPROC(__retl_one_asi_fp) +ENDPROC(__retl_mone_asi_fp) ENTRY(__retl_o1) retl
arch/sparc/lib/GENcopy_from_user.S +1 -1
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one; \ + .word 98b, __retl_mone; \ .text; \ .align 4;
arch/sparc/lib/GENcopy_to_user.S +1 -1
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one; \ + .word 98b, __retl_mone; \ .text; \ .align 4;
arch/sparc/lib/NG2copy_from_user.S +2 -2
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_asi;\ + .word 98b, __retl_mone_asi;\ .text; \ .align 4;
@@ -15,7 +15,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_asi_fp;\ + .word 98b, __retl_mone_asi_fp;\ .text; \ .align 4;
arch/sparc/lib/NG2copy_to_user.S +2 -2
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_asi;\ + .word 98b, __retl_mone_asi;\ .text; \ .align 4;
@@ -15,7 +15,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_asi_fp;\ + .word 98b, __retl_mone_asi_fp;\ .text; \ .align 4;
arch/sparc/lib/NG4copy_from_user.S +2 -2
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_asi;\ + .word 98b, __retl_mone_asi;\ .text; \ .align 4;
@@ -15,7 +15,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_asi_fp;\ + .word 98b, __retl_mone_asi_fp;\ .text; \ .align 4;
arch/sparc/lib/NG4copy_to_user.S +2 -2
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_asi;\ + .word 98b, __retl_mone_asi;\ .text; \ .align 4;
@@ -15,7 +15,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_asi_fp;\ + .word 98b, __retl_mone_asi_fp;\ .text; \ .align 4;
arch/sparc/lib/NGcopy_from_user.S +1 -1
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __ret_one_asi;\ + .word 98b, __ret_mone_asi;\ .text; \ .align 4;
arch/sparc/lib/NGcopy_to_user.S +1 -1
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __ret_one_asi;\ + .word 98b, __ret_mone_asi;\ .text; \ .align 4;
arch/sparc/lib/U1copy_from_user.S +2 -2
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one; \ + .word 98b, __retl_mone; \ .text; \ .align 4;
@@ -15,7 +15,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_fp;\ + .word 98b, __retl_mone_fp;\ .text; \ .align 4;
arch/sparc/lib/U1copy_to_user.S +2 -2
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one; \ + .word 98b, __retl_mone; \ .text; \ .align 4;
@@ -15,7 +15,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_fp;\ + .word 98b, __retl_mone_fp;\ .text; \ .align 4;
arch/sparc/lib/U3copy_from_user.S +2 -2
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one; \ + .word 98b, __retl_mone; \ .text; \ .align 4;
@@ -15,7 +15,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_fp;\ + .word 98b, __retl_mone_fp;\ .text; \ .align 4;
arch/sparc/lib/U3copy_to_user.S +2 -2
@@ -7,7 +7,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one; \ + .word 98b, __retl_mone; \ .text; \ .align 4;
@@ -15,7 +15,7 @@ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one_fp;\ + .word 98b, __retl_mone_fp;\ .text; \ .align 4;
arch/sparc/lib/copy_in_user.S +1 -1
@@ -12,7 +12,7 @@ 98: x,y; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_one; \ + .word 98b, __retl_mone; \ .text; \ .align 4;
Greg Kroah-Hartman
maintainerPATCH 39/49 sparc64: Convert copy_in_user to accurate exception reporting.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 0096ac9f47b1a2e851b3165d44065d18e5f13d58 ]
Report the exact number of bytes which have not been successfully copied when an exception occurs, using the running remaining length.
--- arch/sparc/lib/copy_in_user.S | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-)
arch/sparc/lib/copy_in_user.S +25 -10
@@ -8,18 +8,33 @@ #define XCC xcc -#define EX(x,y) \ +#define EX(x,y,z) \ 98: x,y; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone; \ + .word 98b, z; \ .text; \ .align 4; +#define EX_O4(x,y) EX(x,y,__retl_o4_plus_8) +#define EX_O2_4(x,y) EX(x,y,__retl_o2_plus_4) +#define EX_O2_1(x,y) EX(x,y,__retl_o2_plus_1) + .register %g2,#scratch .register %g3,#scratch .text +__retl_o4_plus_8: + add %o4, %o2, %o4 + retl + add %o4, 8, %o0 +__retl_o2_plus_4: + retl + add %o2, 4, %o0 +__retl_o2_plus_1: + retl + add %o2, 1, %o0 + .align 32 /* Don't try to get too fancy here, just nice and
@@ -44,8 +59,8 @@ ENTRY(___copy_in_user) /* %o0=dst, %o1=s andn %o2, 0x7, %o4 and %o2, 0x7, %o2 1: subcc %o4, 0x8, %o4 - EX(ldxa [%o1] %asi, %o5) - EX(stxa %o5, [%o0] %asi) + EX_O4(ldxa [%o1] %asi, %o5) + EX_O4(stxa %o5, [%o0] %asi) add %o1, 0x8, %o1 bgu,pt %XCC, 1b add %o0, 0x8, %o0
@@ -53,8 +68,8 @@ ENTRY(___copy_in_user) /* %o0=dst, %o1=s be,pt %XCC, 1f nop sub %o2, 0x4, %o2 - EX(lduwa [%o1] %asi, %o5) - EX(stwa %o5, [%o0] %asi) + EX_O2_4(lduwa [%o1] %asi, %o5) + EX_O2_4(stwa %o5, [%o0] %asi) add %o1, 0x4, %o1 add %o0, 0x4, %o0 1: cmp %o2, 0
@@ -70,8 +85,8 @@ ENTRY(___copy_in_user) /* %o0=dst, %o1=s 82: subcc %o2, 4, %o2 - EX(lduwa [%o1] %asi, %g1) - EX(stwa %g1, [%o0] %asi) + EX_O2_4(lduwa [%o1] %asi, %g1) + EX_O2_4(stwa %g1, [%o0] %asi) add %o1, 4, %o1 bgu,pt %XCC, 82b add %o0, 4, %o0
@@ -82,8 +97,8 @@ ENTRY(___copy_in_user) /* %o0=dst, %o1=s .align 32 90: subcc %o2, 1, %o2 - EX(lduba [%o1] %asi, %g1) - EX(stba %g1, [%o0] %asi) + EX_O2_1(lduba [%o1] %asi, %g1) + EX_O2_1(stba %g1, [%o0] %asi) add %o1, 1, %o1 bgu,pt %XCC, 90b add %o0, 1, %o0
Greg Kroah-Hartman
maintainerPATCH 40/49 sparc64: Convert GENcopy_{from,to}_user to accurate exception reporting.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit d0796b555ba60c22eb41ae39a8362156cb08eee9 ]
Report the exact number of bytes which have not been successfully copied when an exception occurs, using the running remaining length.
--- arch/sparc/lib/GENcopy_from_user.S | 4 +-- arch/sparc/lib/GENcopy_to_user.S | 4 +-- arch/sparc/lib/GENmemcpy.S | 48 ++++++++++++++++++++++++++----------- 3 files changed, 38 insertions(+), 18 deletions(-)
arch/sparc/lib/GENcopy_from_user.S +2 -2
@@ -3,11 +3,11 @@ * Copyright (C) 2007 David S. Miller ([email protected]) */ -#define EX_LD(x) \ +#define EX_LD(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone; \ + .word 98b, y; \ .text; \ .align 4;
arch/sparc/lib/GENcopy_to_user.S +2 -2
@@ -3,11 +3,11 @@ * Copyright (C) 2007 David S. Miller ([email protected]) */ -#define EX_ST(x) \ +#define EX_ST(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone; \ + .word 98b, y; \ .text; \ .align 4;
arch/sparc/lib/GENmemcpy.S +34 -14
93 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 41/49 sparc64: Convert U1copy_{from,to}_user to accurate exception reporting.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit cb736fdbb208eb3420f1a2eb2bfc024a6e9dcada ]
Report the exact number of bytes which have not been successfully copied when an exception occurs, using the running remaining length.
--- arch/sparc/lib/U1copy_from_user.S | 8 arch/sparc/lib/U1copy_to_user.S | 8 arch/sparc/lib/U1memcpy.S | 343 +++++++++++++++++++++++++------------- 3 files changed, 236 insertions(+), 123 deletions(-)
arch/sparc/lib/U1copy_from_user.S +4 -4
@@ -3,19 +3,19 @@ * Copyright (C) 1999, 2000, 2004 David S. Miller ([email protected]) */ -#define EX_LD(x) \ +#define EX_LD(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone; \ + .word 98b, y; \ .text; \ .align 4; -#define EX_LD_FP(x) \ +#define EX_LD_FP(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_fp;\ + .word 98b, y; \ .text; \ .align 4;
arch/sparc/lib/U1copy_to_user.S +4 -4
@@ -3,19 +3,19 @@ * Copyright (C) 1999, 2000, 2004 David S. Miller ([email protected]) */ -#define EX_ST(x) \ +#define EX_ST(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone; \ + .word 98b, y; \ .text; \ .align 4; -#define EX_ST_FP(x) \ +#define EX_ST_FP(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_fp;\ + .word 98b, y; \ .text; \ .align 4;
arch/sparc/lib/U1memcpy.S +228 -115
560 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 42/49 sparc64: Convert NG4copy_{from,to}_user to accurate exception reporting.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 95707704800988093a9b9a27e0f2f67f5b4bf2fa ]
Report the exact number of bytes which have not been successfully copied when an exception occurs, using the running remaining length.
--- arch/sparc/lib/NG4copy_from_user.S | 8 - arch/sparc/lib/NG4copy_to_user.S | 8 - arch/sparc/lib/NG4memcpy.S | 294 ++++++++++++++++++++++++++++--------- 3 files changed, 231 insertions(+), 79 deletions(-)
arch/sparc/lib/NG4copy_from_user.S +4 -4
@@ -3,19 +3,19 @@ * Copyright (C) 2012 David S. Miller ([email protected]) */ -#define EX_LD(x) \ +#define EX_LD(x, y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_asi;\ + .word 98b, y; \ .text; \ .align 4; -#define EX_LD_FP(x) \ +#define EX_LD_FP(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_asi_fp;\ + .word 98b, y##_fp; \ .text; \ .align 4;
arch/sparc/lib/NG4copy_to_user.S +4 -4
@@ -3,19 +3,19 @@ * Copyright (C) 2012 David S. Miller ([email protected]) */ -#define EX_ST(x) \ +#define EX_ST(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_asi;\ + .word 98b, y; \ .text; \ .align 4; -#define EX_ST_FP(x) \ +#define EX_ST_FP(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_asi_fp;\ + .word 98b, y##_fp; \ .text; \ .align 4;
arch/sparc/lib/NG4memcpy.S +223 -71
447 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 43/49 sparc64: Convert NGcopy_{from,to}_user to accurate exception reporting.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 7ae3aaf53f1695877ccd5ebbc49ea65991e41f1e ]
Report the exact number of bytes which have not been successfully copied when an exception occurs, using the running remaining length.
--- arch/sparc/lib/NGcopy_from_user.S | 4 arch/sparc/lib/NGcopy_to_user.S | 4 arch/sparc/lib/NGmemcpy.S | 233 +++++++++++++++++++++++++------------- 3 files changed, 162 insertions(+), 79 deletions(-)
arch/sparc/lib/NGcopy_from_user.S +2 -2
@@ -3,11 +3,11 @@ * Copyright (C) 2006, 2007 David S. Miller ([email protected]) */ -#define EX_LD(x) \ +#define EX_LD(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __ret_mone_asi;\ + .word 98b, y; \ .text; \ .align 4;
arch/sparc/lib/NGcopy_to_user.S +2 -2
@@ -3,11 +3,11 @@ * Copyright (C) 2006, 2007 David S. Miller ([email protected]) */ -#define EX_ST(x) \ +#define EX_ST(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __ret_mone_asi;\ + .word 98b, y; \ .text; \ .align 4;
arch/sparc/lib/NGmemcpy.S +158 -75
375 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 44/49 sparc64: Convert NG2copy_{from,to}_user to accurate exception reporting.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit e93704e4464fdc191f73fce35129c18de2ebf95d ]
Report the exact number of bytes which have not been successfully copied when an exception occurs, using the running remaining length.
--- arch/sparc/lib/NG2copy_from_user.S | 8 - arch/sparc/lib/NG2copy_to_user.S | 8 - arch/sparc/lib/NG2memcpy.S | 228 +++++++++++++++++++++++-------------- 3 files changed, 153 insertions(+), 91 deletions(-)
arch/sparc/lib/NG2copy_from_user.S +4 -4
@@ -3,19 +3,19 @@ * Copyright (C) 2007 David S. Miller ([email protected]) */ -#define EX_LD(x) \ +#define EX_LD(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_asi;\ + .word 98b, y; \ .text; \ .align 4; -#define EX_LD_FP(x) \ +#define EX_LD_FP(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_asi_fp;\ + .word 98b, y##_fp; \ .text; \ .align 4;
arch/sparc/lib/NG2copy_to_user.S +4 -4
@@ -3,19 +3,19 @@ * Copyright (C) 2007 David S. Miller ([email protected]) */ -#define EX_ST(x) \ +#define EX_ST(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_asi;\ + .word 98b, y; \ .text; \ .align 4; -#define EX_ST_FP(x) \ +#define EX_ST_FP(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_asi_fp;\ + .word 98b, y##_fp; \ .text; \ .align 4;
arch/sparc/lib/NG2memcpy.S +145 -83
384 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 45/49 sparc64: Convert U3copy_{from,to}_user to accurate exception reporting.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit ee841d0aff649164080e445e84885015958d8ff4 ]
Report the exact number of bytes which have not been successfully copied when an exception occurs, using the running remaining length.
--- arch/sparc/lib/U3copy_from_user.S | 8 - arch/sparc/lib/U3copy_to_user.S | 8 - arch/sparc/lib/U3memcpy.S | 227 +++++++++++++++++++++++++------------- 3 files changed, 162 insertions(+), 81 deletions(-)
arch/sparc/lib/U3copy_from_user.S +4 -4
@@ -3,19 +3,19 @@ * Copyright (C) 1999, 2000, 2004 David S. Miller ([email protected]) */ -#define EX_LD(x) \ +#define EX_LD(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone; \ + .word 98b, y; \ .text; \ .align 4; -#define EX_LD_FP(x) \ +#define EX_LD_FP(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_fp;\ + .word 98b, y##_fp; \ .text; \ .align 4;
arch/sparc/lib/U3copy_to_user.S +4 -4
@@ -3,19 +3,19 @@ * Copyright (C) 1999, 2000, 2004 David S. Miller ([email protected]) */ -#define EX_ST(x) \ +#define EX_ST(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone; \ + .word 98b, y; \ .text; \ .align 4; -#define EX_ST_FP(x) \ +#define EX_ST_FP(x,y) \ 98: x; \ .section __ex_table,"a";\ .align 4; \ - .word 98b, __retl_mone_fp;\ + .word 98b, y##_fp; \ .text; \ .align 4;
arch/sparc/lib/U3memcpy.S +154 -73
411 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 46/49 sparc64: Delete now unused user copy assembler helpers.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 614da3d9685b67917cab48c8452fd8bf93de0867 ]
All of __ret{,l}_mone{_asi,_fp,_asi_fpu} are now unused.
--- arch/sparc/kernel/head_64.S | 30 ------------------------------ 1 file changed, 30 deletions(-)
arch/sparc/kernel/head_64.S +0 -30
@@ -927,36 +927,6 @@ ENTRY(__retl_efault) mov -EFAULT, %o0 ENDPROC(__retl_efault) -ENTRY(__retl_mone) - retl - mov -1, %o0 -ENDPROC(__retl_mone) - -ENTRY(__retl_mone_fp) - VISExitHalf - retl - mov 1, %o0 -ENDPROC(__retl_mone_fp) - -ENTRY(__ret_mone_asi) - wr %g0, ASI_AIUS, %asi - ret - restore %g0, 1, %o0 -ENDPROC(__ret_mone_asi) - -ENTRY(__retl_mone_asi) - wr %g0, ASI_AIUS, %asi - retl - mov 1, %o0 -ENDPROC(__retl_mone_asi) - -ENTRY(__retl_mone_asi_fp) - wr %g0, ASI_AIUS, %asi - VISExitHalf - retl - mov 1, %o0 -ENDPROC(__retl_mone_asi_fp) - ENTRY(__retl_o1) retl mov %o1, %o0
Greg Kroah-Hartman
maintainerPATCH 47/49 sparc64: Delete now unused user copy fixup functions.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 0fd0ff01d4c3c01e7fe69b762ee1a13236639acc ]
Now that all of the user copy routines are converted to return accurate residual lengths when an exception occurs, we no longer need the broken fixup routines.
--- arch/sparc/include/asm/uaccess_64.h | 36 +----------------- arch/sparc/lib/Makefile | 2 - arch/sparc/lib/user_fixup.c | 71 ------------------------------------ 3 files changed, 4 insertions(+), 105 deletions(-) delete mode 100644 arch/sparc/lib/user_fixup.c
arch/sparc/include/asm/uaccess_64.h +3 -33
@@ -204,64 +204,34 @@ int __get_user_bad(void);unsigned long __must_check ___copy_from_user (void *to,const void __user *from,unsigned long size); -unsigned long copy_from_user_fixup (void *to,const void __user *from, -unsigned long size);static inline unsigned long __must_check copy_from_user (void *to,const void __user *from,unsigned long size) { -unsigned long ret; -check_object_size (to, size, false); - ret =___copy_from_user (to, from, size); -if (unlikely (ret)) { -if ((long )ret <0 ) - ret =copy_from_user_fixup (to, from, size); -return ret; - } - -return ret; +return ___copy_from_user (to, from, size); }#define __copy_from_user copy_from_userunsigned long __must_check ___copy_to_user (void __user *to,const void *from,unsigned long size); -unsigned long copy_to_user_fixup (void __user *to,const void *from, -unsigned long size);static inline unsigned long __must_check copy_to_user (void __user *to,const void *from,unsigned long size) { -unsigned long ret; -check_object_size (from, size, true); - ret =___copy_to_user (to, from, size); -if (unlikely (ret)) { -if ((long )ret <0 ) - ret =copy_to_user_fixup (to, from, size); -return ret; - } -return ret; +return ___copy_to_user (to, from, size); }#define __copy_to_user copy_to_userunsigned long __must_check ___copy_in_user (void __user *to,const void __user *from,unsigned long size); -unsigned long copy_in_user_fixup (void __user *to,void __user *from, -unsigned long size);static inline unsigned long __must_check copy_in_user (void __user *to,void __user *from,unsigned long size) { -unsigned long ret =___copy_in_user (to, from, size); - -if (unlikely (ret)) { -if ((long )ret <0 ) - ret =copy_in_user_fixup (to, from, size); -return ret; - } -return ret; +return ___copy_in_user (to, from, size); }#define __copy_in_user copy_in_user
arch/sparc/lib/Makefile +1 -1
@@ -38,7 +38,7 @@ lib-$(CONFIG_SPARC64) += NG4patch.o NG4 lib-$(CONFIG_SPARC64) += GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o -lib-$(CONFIG_SPARC64) += copy_in_user.o user_fixup.o memmove.o +lib-$(CONFIG_SPARC64) += copy_in_user.o memmove.o lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o hweight.o ffs.o obj-$(CONFIG_SPARC64) += iomap.o
arch/sparc/lib/user_fixup.c deleted +0 -71
71 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 48/49 usb: gadget: f_fs: edit epfile->ep under lock
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Nazarewicz <[email protected]>
commit 454915dde06a51133750c6745f0ba57361ba209d upstream.
epfile->ep is protected by ffs->eps_lock (not epfile->mutex) so clear it while holding the spin lock.
--- drivers/usb/gadget/function/f_fs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/usb/gadget/function/f_fs.c +3 -3
@@ -1722,17 +1722,17 @@ static void ffs_func_eps_disable(structunsigned long flags; do { - if (epfile) - mutex_lock(&epfile->mutex); spin_lock_irqsave(&func->ffs->eps_lock, flags); /* pending requests get nuked */ if (likely(ep->ep)) usb_ep_disable(ep->ep); ++ep; + if (epfile) + epfile->ep = NULL; spin_unlock_irqrestore(&func->ffs->eps_lock, flags); if (epfile) { - epfile->ep = NULL; + mutex_lock(&epfile->mutex); kfree(epfile->read_buffer); epfile->read_buffer = NULL; mutex_unlock(&epfile->mutex);
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.8.10 release. There are 49 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon Nov 21 09:20:18 UTC 2016. Anything received after that time might be too late.
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 114 pass: 114 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
Greg Kroah-Hartman
maintainerQuoted 10 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.8.10 release. There are 49 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon Nov 21 09:20:18 UTC 2016. Anything received after that time might be too late.
Quoted 6 lines
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 114 pass: 114 fail: 0Details are available at http://kerneltests.org/builders.
Great, thanks for testing and letting me know.
greg k-h
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.8.10 release. There are 49 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon Nov 21 09:20:18 UTC 2016. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.8.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.8.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America(Silicon Valley) [email protected]