Patch "ppp: Fix false xmit recursion detect with two ppp devices" has been added to the 4.12-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
ppp: Fix false xmit recursion detect with two ppp devices
to the 4.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ppp-fix-false-xmit-recursion-detect-with-two-ppp-devices.patch
and it can be found in the queue-4.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Fri Aug 11 09:09:38 PDT 2017
From: Gao Feng <[email protected]>
Date: Mon, 17 Jul 2017 18:34:42 +0800
Subject: ppp: Fix false xmit recursion detect with two ppp devices
From: Gao Feng <[email protected]>
[ Upstream commit e5dadc65f9e0177eb649bcd9d333f1ebf871223e ]
The global percpu variable ppp_xmit_recursion is used to detect the ppp xmit recursion to avoid the deadlock, which is caused by one CPU tries to lock the xmit lock twice. But it would report false recursion when one CPU wants to send the skb from two different PPP devices, like one L2TP on the PPPoE. It is a normal case actually.
Now use one percpu member of struct ppp instead of the gloable variable to detect the xmit recursion of one ppp device.
--- drivers/net/ppp/ppp_generic.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-)
drivers/net/ppp/ppp_generic.c +21 -9
@@ -120,6 +120,7 @@ struct ppp {int n_channels;/* how many channels are attached 54 */ spinlock_t rlock;/* lock for receive side 58 */ spinlock_t wlock;/* lock for transmit side 5c */ +int *xmit_recursion__percpu ;/* xmit recursion detect */ int mru;/* max receive unit 60 */ unsigned int flags;/* control bits 64 */ unsigned int xstate;/* transmit state bits 68 */
@@ -1025,6 +1026,7 @@ static int ppp_dev_configure(struct netstruct ppp *ppp =netdev_priv (dev);int indx;int err; +int cpu; ppp->dev = dev; ppp->ppp_net = src_net;
@@ -1039,6 +1041,15 @@ static int ppp_dev_configure(struct netINIT_LIST_HEAD (&ppp->channels);spin_lock_init (&ppp->rlock);spin_lock_init (&ppp->wlock); + + ppp->xmit_recursion =alloc_percpu (int); +if (!ppp->xmit_recursion) { + err = -ENOMEM ; + goto err1; + } +for_each_possible_cpu (cpu) + (*per_cpu_ptr (ppp->xmit_recursion, cpu)) =0 ; +#ifdef CONFIG_PPP_MULTILINK ppp->minseq =-1 ;skb_queue_head_init (&ppp->mrq);
@@ -1050,11 +1061,15 @@ static int ppp_dev_configure(struct net err =ppp_unit_register (ppp, conf->unit, conf->ifname_is_set);if (err <0 ) -return err; + goto err2; conf->file->private_data = &ppp->file;return 0 ; +err2: +free_percpu (ppp->xmit_recursion); +err1: +return err; }static const struct nla_policy ppp_nl_policy[IFLA_PPP_MAX +1 ] = {
@@ -1398,18 +1413,16 @@ static void __ppp_xmit_process(struct ppppp_xmit_unlock (ppp); } -static DEFINE_PER_CPU(int, ppp_xmit_recursion); -static void ppp_xmit_process (struct ppp *ppp) {local_bh_disable (); -if (unlikely (__this_cpu_read (ppp_xmit_recursion))) +if (unlikely (*this_cpu_ptr (ppp->xmit_recursion))) goto err; -__this_cpu_inc (ppp_xmit_recursion); + (*this_cpu_ptr (ppp->xmit_recursion))++;__ppp_xmit_process (ppp); -__this_cpu_dec (ppp_xmit_recursion); + (*this_cpu_ptr (ppp->xmit_recursion))--;local_bh_enable ();
@@ -1903,7 +1916,7 @@ static void __ppp_channel_push(struct chread_lock_bh (&pch->upl); ppp = pch->ppp;if (ppp) -__ppp_xmit_process (ppp); +ppp_xmit_process (ppp);read_unlock_bh (&pch->upl); } }
@@ -1912,9 +1925,7 @@ static void ppp_channel_push(struct chan {local_bh_disable (); -__this_cpu_inc (ppp_xmit_recursion);__ppp_channel_push (pch); -__this_cpu_dec (ppp_xmit_recursion);local_bh_enable (); }
@@ -3055,6 +3066,7 @@ static void ppp_destroy_interface(struct#endif /* CONFIG_PPP_FILTER */ kfree_skb (ppp->xmit_pending); +free_percpu (ppp->xmit_recursion);free_netdev (ppp->dev); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.12/ppp-fix-false-xmit-recursion-detect-with-two-ppp-devices.patch