On Mon, Jul 31, 2017 at 3:07 AM, <gfree.w...@vip.163.com> wrote: > From: Gao Feng <gfree.w...@vip.163.com> > > The PPTP set the pptp_sock_destruct as the sock's sk_destruct, it would > trigger this bug when __sk_free is invoked in atomic context, because of > the call path pptp_sock_destruct->del_chan->synchronize_rcu. > > Now move the synchronize_rcu to pptp_release from del_chan. This is the > only one case which would free the sock and need the synchronize_rcu.
I don't understand the last part. >From my understanding, this RCU is supposed to protect the pppox_sock pointers in 'callid_sock' which could be NULL'ed in del_chan(). And the pppox_sock is freed when the last refcnt is gone, that is, when sock dctor is called. pptp_release() is ONLY called when the fd in user-space is gone, not necessarily the last refcnt.