kernel_optimize_test/net
Guillaume Nault f98be6c635 l2tp: initialise PPP sessions before registering them
pppol2tp_connect() initialises L2TP sessions after they've been exposed
to the rest of the system by l2tp_session_register(). This puts
sessions into transient states that are the source of several races, in
particular with session's deletion path.

This patch centralises the initialisation code into
pppol2tp_session_init(), which is called before the registration phase.
The only field that can't be set before session registration is the
pppol2tp socket pointer, which has already been converted to RCU. So
pppol2tp_connect() should now be race-free.

The session's .session_close() callback is now set before registration.
Therefore, it's always called when l2tp_core deletes the session, even
if it was created by pppol2tp_session_create() and hasn't been plugged
to a pppol2tp socket yet. That'd prevent session free because the extra
reference taken by pppol2tp_session_close() wouldn't be dropped by the
socket's ->sk_destruct() callback (pppol2tp_session_destruct()).
We could set .session_close() only while connecting a session to its
pppol2tp socket, or teach pppol2tp_session_close() to avoid grabbing a
reference when the session isn't connected, but that'd require adding
some form of synchronisation to be race free.

Instead of that, we can just let the pppol2tp socket hold a reference
on the session as soon as it starts depending on it (that is, in
pppol2tp_connect()). Then we don't need to utilise
pppol2tp_session_close() to hold a reference at the last moment to
prevent l2tp_core from dropping it.

When releasing the socket, pppol2tp_release() now deletes the session
using the standard l2tp_session_delete() function, instead of merely
removing it from hash tables. l2tp_session_delete() drops the reference
the sessions holds on itself, but also makes sure it doesn't remove a
session twice. So it can safely be called, even if l2tp_core already
tried, or is concurrently trying, to remove the session.
Finally, pppol2tp_session_destruct() drops the reference held by the
socket.

Fixes: fd558d186d ("l2tp: Split pppol2tp patch into separate l2tp and ppp parts")
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
2017-10-29 11:16:22 +09:00
..
6lowpan
9p
802
8021q Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-10-05 18:19:22 -07:00
appletalk
atm net: atm/mpc: Stop using open-coded timer .data field 2017-10-25 13:07:37 +09:00
ax25 net: ax25: Convert timers to use timer_setup() 2017-10-25 12:03:56 +09:00
batman-adv batman-adv: Avoid spurious warnings from bat_v neigh_cmp implementation 2017-10-17 08:09:47 +02:00
bluetooth Bluetooth: Fix compiler warning with selftest duration calculation 2017-10-06 21:49:13 +03:00
bpf
bridge bridge: vlan: signal if anything changed on vlan add 2017-10-29 11:03:43 +09:00
caif
can Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-10-22 13:39:14 +01:00
ceph
core bonding: remove rtmsg_ifinfo called after bond_lower_state_changed 2017-10-25 10:54:39 +09:00
dcb
dccp net: dccp: Convert timers to use timer_setup() 2017-10-25 12:59:19 +09:00
decnet decnet: af_decnet: mark expected switch fall-throughs 2017-10-18 14:10:29 +01:00
dns_resolver KEYS: Fix race between updating and finding a negative key 2017-10-18 09:12:40 +01:00
dsa net: dsa: move fixed link registration helpers 2017-10-28 18:50:12 +09:00
ethernet
hsr net: hsr: Convert timers to use timer_setup() 2017-10-25 13:00:27 +09:00
ieee802154 Merge remote-tracking branch 'net-next/master' 2017-10-18 17:40:18 +02:00
ife
ipv4 tcp: Remove "linux/unaligned/access_ok.h" include. 2017-10-29 11:14:08 +09:00
ipv6 tcp: Namespace-ify sysctl_tcp_workaround_signed_windows 2017-10-28 19:24:38 +09:00
ipx net: ipx: mark expected switch fall-through 2017-10-18 14:13:08 +01:00
iucv
kcm
key
l2tp l2tp: initialise PPP sessions before registering them 2017-10-29 11:16:22 +09:00
l3mdev
lapb net/lapb: Convert timers to use timer_setup() 2017-10-18 12:39:36 +01:00
llc net: LLC: Convert timers to use timer_setup() 2017-10-25 12:06:25 +09:00
mac80211 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-10-22 13:39:14 +01:00
mac802154
mpls ip_tunnel: fix building with NET_IP_TUNNEL=m 2017-10-12 12:21:11 -07:00
ncsi net/ncsi: Fix length of GVI response packet 2017-10-21 01:56:38 +01:00
netfilter bpf: Add file mode configuration into bpf maps 2017-10-20 13:32:59 +01:00
netlabel
netlink Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-10-22 13:39:14 +01:00
netrom net: netrom: nr_in: mark expected switch fall-through 2017-10-22 02:00:33 +01:00
nfc
nsh
openvswitch openvswitch: conntrack: mark expected switch fall-through 2017-10-22 02:01:26 +01:00
packet net: af_packet: Convert timers to use timer_setup() 2017-10-25 13:01:12 +09:00
phonet net: phonet: mark phonet_protocol as const 2017-10-07 23:15:08 +01:00
psample
qrtr net: qrtr: Support decoding incoming v2 packets 2017-10-11 15:28:39 -07:00
rds RDS: IB: Initialize max_items based on underlying device attributes 2017-10-05 21:16:33 -07:00
rfkill
rose net: rose: mark expected switch fall-throughs 2017-10-22 02:02:26 +01:00
rxrpc net: rxrpc: mark expected switch fall-throughs 2017-10-24 18:27:06 +09:00
sched net/sched: Fix actions list corruption when adding offloaded tc flows 2017-10-24 19:00:54 +09:00
sctp net: sctp: Convert timers to use timer_setup() 2017-10-25 12:02:09 +09:00
smc smc: add SMC rendezvous protocol 2017-10-26 18:00:29 +09:00
strparser
sunrpc sunrpc: Convert timers to use timer_setup() 2017-10-18 12:40:27 +01:00
switchdev
tipc tipc: fix a dangling pointer 2017-10-26 17:46:53 +09:00
tls
unix net: af_unix: mark expected switch fall-through 2017-10-22 03:07:50 +01:00
vmw_vsock vsock: always call vsock_init_tables() 2017-10-26 17:45:58 +09:00
wimax
wireless Three fixes for the recently added new code: 2017-10-14 18:36:46 -07:00
x25 net: x25: mark expected switch fall-throughs 2017-10-22 03:08:46 +01:00
xfrm xfrm: Convert timers to use timer_setup() 2017-10-18 12:39:37 +01:00
compat.c
Kconfig
Makefile
socket.c
sysctl_net.c