Date: Thu, 30 Aug 2012 12:01:17 +0400 From: Sergey Kandaurov <pluknet@gmail.com> To: Vijay Singh <vijju.singh@gmail.com> Cc: net@freebsd.org Subject: Re: sorele() and ACCEPT_LOCK() Message-ID: <CAE-mSO%2B3r-4E034okkuNYiYtcaaQtFFgD0iAtTjLyYteaUOBjw@mail.gmail.com> In-Reply-To: <CALCNsJTQNkPv41M0vBMoQJpFFLFHw7Q4Pf__rOmO%2BXADxAGi4g@mail.gmail.com> References: <CALCNsJTQNkPv41M0vBMoQJpFFLFHw7Q4Pf__rOmO%2BXADxAGi4g@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 30 August 2012 04:23, Vijay Singh <vijju.singh@gmail.com> wrote: > Is there any reason why sorele() needs the accept lock to be held? > > 231 #define sorele(so) do { \ > 232 ACCEPT_LOCK_ASSERT(); \ > 233 SOCK_LOCK_ASSERT(so); \ > 234 if ((so)->so_count <= 0) \ > 235 panic("sorele"); \ > 236 if (--(so)->so_count == 0) \ > 237 sofree(so); \ > 238 else { \ > 239 SOCK_UNLOCK(so); \ > 240 ACCEPT_UNLOCK(); \ > 241 } \ > 242 } while (0) sofree() needs accept lock to be held to operate on a qstate field. sofree() callers cannot be changed to push accept lock acquisition into sofree() because that would require to reacquire sock lock around accept lock to take locks in order; this in turn opens race. See r136682 for details. -- wbr, pluknet
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAE-mSO%2B3r-4E034okkuNYiYtcaaQtFFgD0iAtTjLyYteaUOBjw>