Mirror of the lttng-dev mailing list
 help / color / mirror / Atom feed
From: compudj@krystal.dyndns.org (Mathieu Desnoyers)
Subject: [ltt-dev] [UST PATCH] libust: Fix multiple fd close during fork
Date: Wed, 23 Feb 2011 11:16:49 -0500	[thread overview]
Message-ID: <BLU0-SMTP730471C1CA1F760060900296DB0@phx.gbl> (raw)
In-Reply-To: <alpine.DEB.2.00.1102231710160.30437@as68123.uab.ericsson.se>

* Nils Carlson (nils.carlson at ericsson.com) wrote:
>
>
> On Wed, 23 Feb 2011, Mathieu Desnoyers wrote:
>
>> * Nils Carlson (nils.carlson at ericsson.com) wrote:
>>> On Wed, 23 Feb 2011, Mathieu Desnoyers wrote:
>>>
>>>> * Nils Carlson (nils.carlson at ericsson.com) wrote:
>>>>> Yep. fixed. merged.
>>>>>
>>>>>>>> +    /*
>>>>>>>> +     * FIXME: This could be prettier, we loop over the list twice and
>>>>>>>> +     * following good locking practice should lock around the loop
>>>>>>>> +     */
>>>>>>>> +    cds_list_for_each_entry_safe(trace, trace_tmp, &ltt_traces.head,
>>>>>>>> list) {
>>>>>>>> +        ltt_trace_destroy(trace->trace_name, 1);
>>>>>>>> +    }
>>>>
>>>> So what' up with these missing locks ?
>>>>
>>>
>>> They are actually taken by each ltt_trace_destroy. Also, this function is
>>> run as part of the ust_fork so locking in the child is a non-issue at
>>> this point. Its mostly an aesthetic thing that we should be consistent in
>>> dealing with locks.
>>
>> Most of the ust_fork code should actually be protected by a mutex to
>> deal with the fact that we might have a concurrent libust thread running
>> in the parent at the exact point we do the fork, thus letting the child
>> in a state where locks are taken, and waits on the locks forever,
>> because the libust thread is not present in the child. The concurrent
>> libust thread in the parent should be kept quiescent while we do the
>> fork.
>>
>
> ust_fork is only called by the child after the fork. The function name is 
> a bit misleading.
>
>> I don't think this is handled at the moment, and can leave us with
>> various of the other locks in a "held" state when we run in the child.
>
> As far as locking is concerned we're completely safe today, as we are  
> completely serialised. If we ever decide on multiple control threads or  
> some such we will probably have to recheck all the locking.

Let's look at:

ustfork.c:

Parent                           Child

fork()
  ust_before_fork()
    - disable signals
  plibc_func(); (real fork)
  ust_after_fork_parent()
    - restore signals
                                 ust_after_fork_child()
                                   - ust_fork()
                                       ltt_unlock_traces(); <- bug (never locked ?)
                                   - reenable signals

So if we have a libust listener thread running in the parent in parallel
with the fork(), we possibly leave many locks in "held" state when the
child starts, and we don't want that, right ? It looks like a can of
worms ready to be opened. Ideally, we should exclude the libust listener
thread by taking a mutex across the fork in ust_before_fork (after
disabling signals) and releasing it in both ust_after_fork_parent and
ust_after_fork_child.

Thoughts ?

Mathieu


>
> /Nils
>
>
>> Thoughts ?
>>
>> Mathieu
>>
>>>
>>> /Nils
>>>
>>>> Mathieu
>>>>
>>>>>>>>
>>>>>>>>     /* Clean up the listener socket and epoll, keeping the scoket
>>>>>>>> file */
>>>>>>>>     ustcomm_del_named_sock(listen_sock, 1);
>>>>>>>> --
>>>>>>>> 1.7.1
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> ltt-dev mailing list
>>>>> ltt-dev at lists.casi.polymtl.ca
>>>>> http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
>>>>>
>>>>
>>>> --
>>>> Mathieu Desnoyers
>>>> Operating System Efficiency R&D Consultant
>>>> EfficiOS Inc.
>>>> http://www.efficios.com
>>>>
>>>
>>
>> -- 
>> Mathieu Desnoyers
>> Operating System Efficiency R&D Consultant
>> EfficiOS Inc.
>> http://www.efficios.com
>>
>

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com




  reply	other threads:[~2011-02-23 16:16 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-23 12:40 Nils Carlson
2011-02-23 12:43 ` Nils Carlson
2011-02-23 14:46   ` Yannick Brosseau
2011-02-23 15:54     ` Nils Carlson
2011-02-23 15:40       ` Mathieu Desnoyers
     [not found]       ` <BLU0-SMTP169B3ABCBCF5E7D9DB528B96DB0@phx.gbl>
2011-02-23 16:03         ` Nils Carlson
2011-02-23 15:49           ` Mathieu Desnoyers
     [not found]           ` <BLU0-SMTP63BB495BA90023E1C54C0E96DB0@phx.gbl>
2011-02-23 16:14             ` Nils Carlson
2011-02-23 16:16               ` Mathieu Desnoyers [this message]
     [not found]               ` <BLU0-SMTP763331DEBE2782CAA18D5F96DB0@phx.gbl>
2011-02-23 18:54                 ` Nils Carlson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BLU0-SMTP730471C1CA1F760060900296DB0@phx.gbl \
    --to=compudj@krystal.dyndns.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox