Eric Dumazet
518fbf9cdf
net: fix sk_sockets_allocated_read_positive
Denys Fedoryshchenko reported frequent crashes on a proxy server and kindly
provided a lockdep report that explains it all :
[ 762.903868]
[ 762.903880] =================================
[ 762.903890] [ INFO: inconsistent lock state ]
[ 762.903903] 3.3.4-build-0061 #8 Not tainted
[ 762.904133] ---------------------------------
[ 762.904344] inconsistent {IN-SOFTIRQ-W} -> {SOFTIRQ-ON-W} usage.
[ 762.904542] squid/1603 [HC0[0]:SC0[0]:HE1:SE1] takes:
[ 762.904542] (key#3){+.?...}, at: [<c0232cc4>]
__percpu_counter_sum+0xd/0x58
[ 762.904542] {IN-SOFTIRQ-W} state was registered at:
[ 762.904542] [<c0158b84>] __lock_acquire+0x284/0xc26
[ 762.904542] [<c01598e8>] lock_acquire+0x71/0x85
[ 762.904542] [<c0349765>] _raw_spin_lock+0x33/0x40
[ 762.904542] [<c0232c93>] __percpu_counter_add+0x58/0x7c
[ 762.904542] [<c02cfde1>] sk_clone_lock+0x1e5/0x200
[ 762.904542] [<c0303ee4>] inet_csk_clone_lock+0xe/0x78
[ 762.904542] [<c0315778>] tcp_create_openreq_child+0x1b/0x404
[ 762.904542] [<c031339c>] tcp_v4_syn_recv_sock+0x32/0x1c1
[ 762.904542] [<c031615a>] tcp_check_req+0x1fd/0x2d7
[ 762.904542] [<c0313f77>] tcp_v4_do_rcv+0xab/0x194
[ 762.904542] [<c03153bb>] tcp_v4_rcv+0x3b3/0x5cc
[ 762.904542] [<c02fc0c4>] ip_local_deliver_finish+0x13a/0x1e9
[ 762.904542] [<c02fc539>] NF_HOOK.clone.11+0x46/0x4d
[ 762.904542] [<c02fc652>] ip_local_deliver+0x41/0x45
[ 762.904542] [<c02fc4d1>] ip_rcv_finish+0x31a/0x33c
[ 762.904542] [<c02fc539>] NF_HOOK.clone.11+0x46/0x4d
[ 762.904542] [<c02fc857>] ip_rcv+0x201/0x23e
[ 762.904542] [<c02daa3a>] __netif_receive_skb+0x319/0x368
[ 762.904542] [<c02dac07>] netif_receive_skb+0x4e/0x7d
[ 762.904542] [<c02dacf6>] napi_skb_finish+0x1e/0x34
[ 762.904542] [<c02db122>] napi_gro_receive+0x20/0x24
[ 762.904542] [<f85d1743>] e1000_receive_skb+0x3f/0x45 [e1000e]
[ 762.904542] [<f85d3464>] e1000_clean_rx_irq+0x1f9/0x284 [e1000e]
[ 762.904542] [<f85d3926>] e1000_clean+0x62/0x1f4 [e1000e]
[ 762.904542] [<c02db228>] net_rx_action+0x90/0x160
[ 762.904542] [<c012a445>] __do_softirq+0x7b/0x118
[ 762.904542] irq event stamp: 156915469
[ 762.904542] hardirqs last enabled at (156915469): [<c019b4f4>]
__slab_alloc.clone.58.clone.63+0xc4/0x2de
[ 762.904542] hardirqs last disabled at (156915468): [<c019b452>]
__slab_alloc.clone.58.clone.63+0x22/0x2de
[ 762.904542] softirqs last enabled at (156915466): [<c02ce677>]
lock_sock_nested+0x64/0x6c
[ 762.904542] softirqs last disabled at (156915464): [<c0349914>]
_raw_spin_lock_bh+0xe/0x45
[ 762.904542]
[ 762.904542] other info that might help us debug this:
[ 762.904542] Possible unsafe locking scenario:
[ 762.904542]
[ 762.904542] CPU0
[ 762.904542] ----
[ 762.904542] lock(key#3);
[ 762.904542] <Interrupt>
[ 762.904542] lock(key#3);
[ 762.904542]
[ 762.904542] *** DEADLOCK ***
[ 762.904542]
[ 762.904542] 1 lock held by squid/1603:
[ 762.904542] #0: (sk_lock-AF_INET){+.+.+.}, at: [<c03055c0>]
lock_sock+0xa/0xc
[ 762.904542]
[ 762.904542] stack backtrace:
[ 762.904542] Pid: 1603, comm: squid Not tainted 3.3.4-build-0061 #8
[ 762.904542] Call Trace:
[ 762.904542] [<c0347b73>] ? printk+0x18/0x1d
[ 762.904542] [<c015873a>] valid_state+0x1f6/0x201
[ 762.904542] [<c0158816>] mark_lock+0xd1/0x1bb
[ 762.904542] [<c015876b>] ? mark_lock+0x26/0x1bb
[ 762.904542] [<c015805d>] ? check_usage_forwards+0x77/0x77
[ 762.904542] [<c0158bf8>] __lock_acquire+0x2f8/0xc26
[ 762.904542] [<c0159b8e>] ? mark_held_locks+0x5d/0x7b
[ 762.904542] [<c0159cf6>] ? trace_hardirqs_on+0xb/0xd
[ 762.904542] [<c0158dd4>] ? __lock_acquire+0x4d4/0xc26
[ 762.904542] [<c01598e8>] lock_acquire+0x71/0x85
[ 762.904542] [<c0232cc4>] ? __percpu_counter_sum+0xd/0x58
[ 762.904542] [<c0349765>] _raw_spin_lock+0x33/0x40
[ 762.904542] [<c0232cc4>] ? __percpu_counter_sum+0xd/0x58
[ 762.904542] [<c0232cc4>] __percpu_counter_sum+0xd/0x58
[ 762.904542] [<c02cebc4>] __sk_mem_schedule+0xdd/0x1c7
[ 762.904542] [<c02d178d>] ? __alloc_skb+0x76/0x100
[ 762.904542] [<c0305e8e>] sk_wmem_schedule+0x21/0x2d
[ 762.904542] [<c0306370>] sk_stream_alloc_skb+0x42/0xaa
[ 762.904542] [<c0306567>] tcp_sendmsg+0x18f/0x68b
[ 762.904542] [<c031f3dc>] ? ip_fast_csum+0x30/0x30
[ 762.904542] [<c0320193>] inet_sendmsg+0x53/0x5a
[ 762.904542] [<c02cb633>] sock_aio_write+0xd2/0xda
[ 762.904542] [<c015876b>] ? mark_lock+0x26/0x1bb
[ 762.904542] [<c01a1017>] do_sync_write+0x9f/0xd9
[ 762.904542] [<c01a2111>] ? file_free_rcu+0x2f/0x2f
[ 762.904542] [<c01a17a1>] vfs_write+0x8f/0xab
[ 762.904542] [<c01a284d>] ? fget_light+0x75/0x7c
[ 762.904542] [<c01a1900>] sys_write+0x3d/0x5e
[ 762.904542] [<c0349ec9>] syscall_call+0x7/0xb
[ 762.904542] [<c0340000>] ? rp_sidt+0x41/0x83
Bug is that sk_sockets_allocated_read_positive() calls
percpu_counter_sum_positive() without BH being disabled.
This bug was added in commit 180d8cd942
(foundations of per-cgroup memory pressure controlling.), since previous
code was using percpu_counter_read_positive() which is IRQ safe.
In __sk_mem_schedule() we dont need the precise count of allocated
sockets and can revert to previous behavior.
Reported-by: Denys Fedoryshchenko <denys@visp.net.lb>
Sined-off-by: Eric Dumazet <edumazet@google.com>
Cc: Glauber Costa <glommer@parallels.com>
Acked-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
|
2012-04-30 13:37:59 -04:00 |
| .. |
|
9p
|
9p: Reduce object size with CONFIG_NET_9P_DEBUG
|
2012-01-05 10:51:44 -06:00 |
|
bluetooth
|
Bluetooth: Fix userspace compatibility issue with mgmt interface
|
2012-04-05 15:05:51 -03:00 |
|
caif
|
caif-hsi: Add RX flip buffer
|
2012-02-04 16:06:28 -05:00 |
|
irda
|
Fix common misspellings
|
2011-03-31 11:26:23 -03:00 |
|
iucv
|
af_iucv: add shutdown for HS transport
|
2012-03-07 22:52:24 -08:00 |
|
netfilter
|
netfilter: xt_LOG: don't use xchg() for simple assignment
|
2012-03-26 14:00:28 +02:00 |
|
netns
|
BUG: headers with BUG/BUG_ON etc. need linux/bug.h
|
2012-03-04 17:54:34 -05:00 |
|
nfc
|
NFC: NCI code identation fixes
|
2012-03-06 15:16:25 -05:00 |
|
phonet
|
net: dont hold rtnl mutex during netlink dump callbacks
|
2011-05-02 15:26:28 -07:00 |
|
sctp
|
sctp: Export sctp_do_peeloff
|
2012-03-08 13:52:08 -08:00 |
|
tc_act
|
|
|
|
act_api.h
|
net: sched: constify tcf_proto and tc_action
|
2011-07-06 02:52:16 -07:00 |
|
addrconf.h
|
ipv6: Remove never used function inet6_ac_check().
|
2012-02-01 16:14:17 -05:00 |
|
af_ieee802154.h
|
|
|
|
af_rxrpc.h
|
net: Remove __KERNEL__ cpp checks from include/net
|
2011-04-24 10:54:56 -07:00 |
|
af_unix.h
|
switch unix_sock to struct path
|
2012-03-20 21:29:41 -04:00 |
|
ah.h
|
ipsec: update MAX_AH_AUTH_LEN to support sha512
|
2011-01-13 21:48:25 -08:00 |
|
arp.h
|
ipv4: Eliminate spurious argument to __ipv4_neigh_lookup
|
2012-02-15 17:48:35 -05:00 |
|
atmclip.h
|
atm: clip: Use device neigh support on top of "arp_tbl".
|
2011-11-30 18:51:03 -05:00 |
|
ax25.h
|
atomic: use <linux/atomic.h>
|
2011-07-26 16:49:47 -07:00 |
|
ax88796.h
|
|
|
|
cfg80211-wext.h
|
cfg80211: remove unused wext handler exports
|
2011-08-08 14:26:29 -04:00 |
|
cfg80211.h
|
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
|
2012-03-27 22:15:01 -04:00 |
|
checksum.h
|
|
|
|
cipso_ipv4.h
|
doc: Update the email address for Paul Moore in various source files
|
2011-08-01 17:58:33 -07:00 |
|
cls_cgroup.h
|
|
|
|
compat.h
|
net: get rid of some pointless casts to sockaddr
|
2012-03-11 19:11:22 -07:00 |
|
datalink.h
|
|
|
|
dcbevent.h
|
dcb: Add stub routines for !CONFIG_DCB
|
2011-10-06 15:49:51 -04:00 |
|
dcbnl.h
|
net: dcb: getnumtcs()/setnumtcs() should return an int
|
2012-03-02 18:16:49 -08:00 |
|
dn.h
|
decnet: net/dn.h needs net/flow.h
|
2012-02-15 16:37:44 -05:00 |
|
dn_dev.h
|
|
|
|
dn_fib.h
|
decnet: Convert to use flowidn where applicable.
|
2011-03-12 15:08:55 -08:00 |
|
dn_neigh.h
|
|
|
|
dn_nsp.h
|
|
|
|
dn_route.h
|
decnet: Convert to use flowidn where applicable.
|
2011-03-12 15:08:55 -08:00 |
|
dsa.h
|
dsa: Include linux/if_ether.h to fix build error
|
2011-12-01 11:41:06 -05:00 |
|
dsfield.h
|
|
|
|
dst.h
|
set fake_rtable's dst to NULL to avoid kernel Oops
|
2012-04-24 00:16:24 -04:00 |
|
dst_ops.h
|
net: Rename the dst_opt default_mtu method to mtu
|
2011-11-26 14:29:50 -05:00 |
|
esp.h
|
|
|
|
ethoc.h
|
|
|
|
fib_rules.h
|
|
|
|
flow.h
|
ipv4: reset flowi parameters on route connect
|
2012-02-04 19:29:48 -05:00 |
|
flow_keys.h
|
flow_dissector: use a 64bit load/store
|
2011-11-29 13:17:03 -05:00 |
|
garp.h
|
garp: remove last synchronize_rcu() call
|
2011-05-12 17:46:56 -04:00 |
|
gen_stats.h
|
Fix common misspellings
|
2011-03-31 11:26:23 -03:00 |
|
genetlink.h
|
net: Deinline __nlmsg_put and genlmsg_put. -7k code on i386 defconfig.
|
2012-01-30 15:22:06 -05:00 |
|
gre.h
|
|
|
|
icmp.h
|
ipv4: reduce percpu needs for icmpmsg mibs
|
2011-11-09 16:04:20 -05:00 |
|
ieee80211_radiotap.h
|
wireless: move ieee80211chan2mhz macro
|
2011-11-11 12:32:50 -05:00 |
|
ieee802154.h
|
6LoWPAN: add fragmentation support
|
2011-11-14 00:19:42 -05:00 |
|
ieee802154_netdev.h
|
|
|
|
if_inet6.h
|
ipv6: updates to privacy addresses per RFC 4941.
|
2011-08-01 18:05:00 -07:00 |
|
inet6_connection_sock.h
|
inet: Pass flowi to ->queue_xmit().
|
2011-05-08 15:28:28 -07:00 |
|
inet6_hashtables.h
|
net: use IS_ENABLED(CONFIG_IPV6)
|
2011-12-11 18:25:16 -05:00 |
|
inet_common.h
|
|
|
|
inet_connection_sock.h
|
net: rename sk_clone to sk_clone_lock
|
2011-11-08 17:07:07 -05:00 |
|
inet_ecn.h
|
inet: add rfc 3168 extract in front of INET_ECN_encapsulate()
|
2011-10-22 01:25:23 -04:00 |
|
inet_frag.h
|
|
|
|
inet_hashtables.h
|
atomic: use <linux/atomic.h>
|
2011-07-26 16:49:47 -07:00 |
|
inet_sock.h
|
net: implement IP_RECVTOS for IP_PKTOPTIONS
|
2012-02-13 00:46:41 -05:00 |
|
inet_timewait_sock.h
|
inet: remove rcu protection on tw_net
|
2011-12-14 13:34:55 -05:00 |
|
inetpeer.h
|
route: Remove redirect_genid
|
2012-03-08 00:30:32 -08:00 |
|
ip.h
|
ipv4: Make ip_call_ra_chain() return bool.
|
2012-03-09 14:34:50 -08:00 |
|
ip6_checksum.h
|
|
|
|
ip6_fib.h
|
ipv6: clean up rt6_clean_expires
|
2012-04-17 22:31:59 -04:00 |
|
ip6_route.h
|
Merge branch 'nf-next' of git://1984.lsi.us.es/net-next
|
2011-12-25 02:21:45 -05:00 |
|
ip6_tunnel.h
|
|
|
|
ip_fib.h
|
ipv4: Call fib_select_default() only when actually necessary.
|
2011-04-14 15:05:22 -07:00 |
|
ip_vs.h
|
ipvs: kernel oops - do_ip_vs_get_ctl
|
2012-04-30 10:40:35 +02:00 |
|
ipcomp.h
|
|
|
|
ipconfig.h
|
|
|
|
ipip.h
|
|
|
|
ipv6.h
|
ipv6: Add fragment reporting to ipv6_skip_exthdr().
|
2011-12-03 09:35:10 -08:00 |
|
ipx.h
|
net: Remove __KERNEL__ cpp checks from include/net
|
2011-04-24 10:54:56 -07:00 |
|
iw_handler.h
|
Fix common misspellings
|
2011-03-31 11:26:23 -03:00 |
|
lapb.h
|
wan: make LAPB callbacks const
|
2011-09-16 19:20:20 -04:00 |
|
lib80211.h
|
include: replace linux/module.h with "struct module" wherever possible
|
2011-10-31 19:32:32 -04:00 |
|
llc.h
|
atomic: use <linux/atomic.h>
|
2011-07-26 16:49:47 -07:00 |
|
llc_c_ac.h
|
|
|
|
llc_c_ev.h
|
|
|
|
llc_c_st.h
|
|
|
|
llc_conn.h
|
|
|
|
llc_if.h
|
|
|
|
llc_pdu.h
|
bonding,llc: Fix structure sizeof incompatibility for some PDUs
|
2011-05-13 15:13:24 -04:00 |
|
llc_s_ac.h
|
|
|
|
llc_s_ev.h
|
|
|
|
llc_s_st.h
|
|
|
|
llc_sap.h
|
|
|
|
mac80211.h
|
mac80211: Convert WARN_ON to WARN_ON_ONCE
|
2012-04-09 15:54:48 -04:00 |
|
mip6.h
|
|
|
|
mld.h
|
|
|
|
ndisc.h
|
ipv6: Remove neigh argument from ndisc_send_redirect()
|
2012-01-27 21:00:08 -05:00 |
|
neighbour.h
|
ipv6: Use universal hash for NDISC.
|
2011-12-28 15:06:58 -05:00 |
|
net_namespace.h
|
net: use IS_ENABLED(CONFIG_IPV6)
|
2011-12-11 18:25:16 -05:00 |
|
net_ratelimit.h
|
net: Kill ratelimit.h dependency in linux/net.h
|
2011-05-27 13:41:33 -04:00 |
|
netdma.h
|
|
|
|
netevent.h
|
net: Remove __KERNEL__ cpp checks from include/net
|
2011-04-24 10:54:56 -07:00 |
|
netlabel.h
|
doc: Update the email address for Paul Moore in various source files
|
2011-08-01 17:58:33 -07:00 |
|
netlink.h
|
net: Deinline __nlmsg_put and genlmsg_put. -7k code on i386 defconfig.
|
2012-01-30 15:22:06 -05:00 |
|
netprio_cgroup.h
|
netprio_cgroup: fix wrong memory access when NETPRIO_CGROUP=m
|
2012-02-10 15:08:57 -05:00 |
|
netrom.h
|
|
|
|
nexthop.h
|
|
|
|
nl802154.h
|
|
|
|
p8022.h
|
|
|
|
ping.h
|
net: ping: fix build failure
|
2011-05-17 14:16:58 -04:00 |
|
pkt_cls.h
|
|
|
|
pkt_sched.h
|
net: sched: constify tcf_proto and tc_action
|
2011-07-06 02:52:16 -07:00 |
|
protocol.h
|
net: use IS_ENABLED(CONFIG_IPV6)
|
2011-12-11 18:25:16 -05:00 |
|
psnap.h
|
|
|
|
raw.h
|
|
|
|
rawv6.h
|
net: Remove __KERNEL__ cpp checks from include/net
|
2011-04-24 10:54:56 -07:00 |
|
red.h
|
net_sched: red: Make minor corrections to comments
|
2012-04-16 23:53:11 -04:00 |
|
regulatory.h
|
cfg80211: pass DFS region to drivers through reg_notifier()
|
2011-11-21 16:20:41 -05:00 |
|
request_sock.h
|
tcp: Change possible SYN flooding messages
|
2011-09-15 14:49:43 -04:00 |
|
rose.h
|
rose: Add length checks to CALL_REQUEST parsing
|
2011-03-27 17:59:04 -07:00 |
|
route.h
|
ipv4: reset flowi parameters on route connect
|
2012-02-04 19:29:48 -05:00 |
|
rtnetlink.h
|
rtnetlink: Fix problem with buffer allocation
|
2012-02-21 16:56:45 -05:00 |
|
sch_generic.h
|
net: Make qdisc_skb_cb upper size bound explicit.
|
2012-02-09 13:50:34 -05:00 |
|
scm.h
|
af_unix: dont send SCM_CREDENTIALS by default
|
2011-09-28 13:29:50 -04:00 |
|
secure_seq.h
|
tcp: add const qualifiers where possible
|
2011-10-21 05:22:42 -04:00 |
|
slhc_vj.h
|
|
|
|
snmp.h
|
Merge branch 'for-3.3' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
|
2012-01-09 13:08:28 -08:00 |
|
sock.h
|
net: fix sk_sockets_allocated_read_positive
|
2012-04-30 13:37:59 -04:00 |
|
stp.h
|
|
|
|
tcp.h
|
The following text was taken from the original review request:
|
2012-03-24 10:08:39 -07:00 |
|
tcp_memcontrol.h
|
cgroup: remove cgroup_subsys argument from callbacks
|
2012-02-02 09:20:22 -08:00 |
|
tcp_states.h
|
|
|
|
timewait_sock.h
|
BUG: headers with BUG/BUG_ON etc. need linux/bug.h
|
2012-03-04 17:54:34 -05:00 |
|
transp_v6.h
|
net: relax PKTINFO non local ipv6 udp xmit check
|
2011-08-30 17:39:01 -04:00 |
|
udp.h
|
BUG: headers with BUG/BUG_ON etc. need linux/bug.h
|
2012-03-04 17:54:34 -05:00 |
|
udplite.h
|
net: ipv4: Standardize prefixes for message logging
|
2012-03-12 17:05:21 -07:00 |
|
wext.h
|
|
|
|
wimax.h
|
net: wimax: Remove of unused 'rfkill_input' pointer
|
2011-06-24 17:50:44 -07:00 |
|
wpan-phy.h
|
BUG: headers with BUG/BUG_ON etc. need linux/bug.h
|
2012-03-04 17:54:34 -05:00 |
|
x25.h
|
|
|
|
x25device.h
|
|
|
|
xfrm.h
|
xfrm: remove unneeded method typedef declaration in net/xfrm.h.
|
2012-02-25 20:19:24 -05:00 |