[lttng-dev] [PATCH lttng-ust 2/2] Use ust_lock on fd tracker add operation for atomicity against fork
Jonathan Rajotte-Julien
jonathan.rajotte-julien at efficios.com
Mon Feb 5 21:11:22 UTC 2018
Hi,
Regarding double lock, ust_lock is nestable.
Still, you are quite right regarding the fact that this patch is useless. Not sure
what I was thinking at that time.
Cheers
On Thu, Feb 01, 2018 at 10:52:43PM +0000, Mathieu Desnoyers wrote:
>
> ----- On Feb 1, 2018, at 5:28 PM, Jonathan Rajotte jonathan.rajotte-julien at efficios.com wrote:
>
> > Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
> > ---
> > liblttng-ust/lttng-ust-comm.c | 8 ++++++++
> > liblttng-ust/lttng-ust-elf.c | 8 ++++++++
> > 2 files changed, 16 insertions(+)
> >
> > diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c
> > index 32ba3c1..f4b7b53 100644
> > --- a/liblttng-ust/lttng-ust-comm.c
> > +++ b/liblttng-ust/lttng-ust-comm.c
> > @@ -1255,10 +1255,16 @@ char *get_map_shm(struct sock_info *sock_info)
> > goto error;
> > }
> >
> > + if (ust_lock()) {
> > + ust_unlock();
> > + goto error;
> > + }
>
> get_map_shm() is called from a context that already holds the ust_lock().
>
> This is a double-lock...
>
>
> > +
> > lttng_ust_lock_fd_tracker();
> > wait_shm_fd = get_wait_shm(sock_info, page_size);
> > if (wait_shm_fd < 0) {
> > lttng_ust_unlock_fd_tracker();
> > + ust_unlock();
> > goto error;
> > }
> >
> > @@ -1269,11 +1275,13 @@ char *get_map_shm(struct sock_info *sock_info)
> > PERROR("Error closing fd");
> > }
> > lttng_ust_unlock_fd_tracker();
> > + ust_unlock();
> > goto error;
> > }
> >
> > wait_shm_fd = ret;
> > lttng_ust_unlock_fd_tracker();
> > + ust_unlock();
> >
> > wait_shm_mmap = mmap(NULL, page_size, PROT_READ,
> > MAP_SHARED, wait_shm_fd, 0);
> > diff --git a/liblttng-ust/lttng-ust-elf.c b/liblttng-ust/lttng-ust-elf.c
> > index c073e7a..03c715a 100644
> > --- a/liblttng-ust/lttng-ust-elf.c
> > +++ b/liblttng-ust/lttng-ust-elf.c
> > @@ -256,10 +256,16 @@ struct lttng_ust_elf *lttng_ust_elf_create(const char
> > *path)
> > goto error;
> > }
> >
> > + if (ust_lock()) {
> > + ust_unlock();
> > + goto error;
> > + }
>
> same here. iter_begin in liblttng-ust/lttng-ust-statedump.c already grabs the
> ust lock. This won't work.
>
> I wonder if any part of this patch is needed ?
>
> Thanks,
>
> Mathieu
>
> > +
> > lttng_ust_lock_fd_tracker();
> > fd = open(elf->path, O_RDONLY | O_CLOEXEC);
> > if (fd < 0) {
> > lttng_ust_unlock_fd_tracker();
> > + ust_unlock();
> > goto error;
> > }
> >
> > @@ -271,10 +277,12 @@ struct lttng_ust_elf *lttng_ust_elf_create(const char
> > *path)
> > }
> > ret = -1;
> > lttng_ust_unlock_fd_tracker();
> > + ust_unlock();
> > goto error;
> > }
> > elf->fd = ret;
> > lttng_ust_unlock_fd_tracker();
> > + ust_unlock();
> >
> > if (lttng_ust_read(elf->fd, e_ident, EI_NIDENT) < EI_NIDENT) {
> > goto error;
> > --
> > 2.7.4
>
> --
> Mathieu Desnoyers
> EfficiOS Inc.
> http://www.efficios.com
--
Jonathan Rajotte-Julien
EfficiOS
More information about the lttng-dev
mailing list