All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] libxc: check return values on mmap() and madvise() on xc_alloc_hypercall_buffer()
@ 2014-05-07 21:47 Luis R. Rodriguez
  2014-05-07 22:10 ` Andrew Cooper
  0 siblings, 1 reply; 8+ messages in thread
From: Luis R. Rodriguez @ 2014-05-07 21:47 UTC (permalink / raw)
  To: xen-devel
  Cc: Luis R. Rodriguez, Ian Jackson, Ian Campbell, Stefano Stabellini

From: "Luis R. Rodriguez" <mcgrof@suse.com>

On a Thinkpad T4440p with OpenSUSE tumbleweed with v3.15-rc4
and today's latest xen tip from the git tree strace -f reveals
we end up on a never ending wait shortly after

write(20, "backend/console/5\0", 18 <unfinished ...>

I've tracked this down to a lack of error return values on mmap() and
madvise() on xc_alloc_hypercall_buffer(). This moves us forward.

Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
---

BTW I see no ldconfig run after make install, where do we want to put it
given we have a few libs ?

 tools/libxc/xc_linux_osdep.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)


diff --git a/tools/libxc/xc_linux_osdep.c b/tools/libxc/xc_linux_osdep.c
index 73860a2..32e5332 100644
--- a/tools/libxc/xc_linux_osdep.c
+++ b/tools/libxc/xc_linux_osdep.c
@@ -92,14 +92,29 @@ static void *linux_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_ha
 {
     size_t size = npages * XC_PAGE_SIZE;
     void *p;
+    int rc, saved_errno;
 
     /* Address returned by mmap is page aligned. */
     p = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_LOCKED, -1, 0);
+    if ( p == MAP_FAILED )
+    {
+        PERROR("xc_alloc_hypercall_buffer: mmap failed");
+        return NULL;
+    }
 
     /* Do not copy the VMA to child process on fork. Avoid the page being COW
         on hypercall. */
-    madvise(p, npages * XC_PAGE_SIZE, MADV_DONTFORK);
+    rc = madvise(p, npages * XC_PAGE_SIZE, MADV_DONTFORK);
+    if ( rc < 0 )
+	    goto out;
+
     return p;
+out:
+    saved_errno = errno;
+    PERROR("xc_alloc_hypercall_buffer: madvise failed");
+    (void)munmap(p, size);
+    errno = saved_errno;
+    return NULL;
 }
 
 static void linux_privcmd_free_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, void *ptr, int npages)
-- 
1.8.4.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [RFC] libxc: check return values on mmap() and madvise() on xc_alloc_hypercall_buffer()
  2014-05-07 21:47 [RFC] libxc: check return values on mmap() and madvise() on xc_alloc_hypercall_buffer() Luis R. Rodriguez
@ 2014-05-07 22:10 ` Andrew Cooper
  2014-05-08  5:03   ` Luis R. Rodriguez
  0 siblings, 1 reply; 8+ messages in thread
From: Andrew Cooper @ 2014-05-07 22:10 UTC (permalink / raw)
  To: Luis R. Rodriguez, xen-devel
  Cc: Luis R. Rodriguez, Ian Jackson, Ian Campbell, Stefano Stabellini

On 07/05/2014 22:47, Luis R. Rodriguez wrote:
> From: "Luis R. Rodriguez" <mcgrof@suse.com>
>
> On a Thinkpad T4440p with OpenSUSE tumbleweed with v3.15-rc4
> and today's latest xen tip from the git tree strace -f reveals
> we end up on a never ending wait shortly after
>
> write(20, "backend/console/5\0", 18 <unfinished ...>
>
> I've tracked this down to a lack of error return values on mmap() and
> madvise() on xc_alloc_hypercall_buffer(). This moves us forward.
>
> Cc: Ian Jackson <ian.jackson@eu.citrix.com>
> Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Cc: Ian Campbell <ian.campbell@citrix.com>
> Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
> ---

Good catch.  I am supprised this hasn't blown up in someones face .  Out
of interest, which bit starts failing given correct error handling here?

>
> BTW I see no ldconfig run after make install, where do we want to put it
> given we have a few libs ?
>
>  tools/libxc/xc_linux_osdep.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
>
>
> diff --git a/tools/libxc/xc_linux_osdep.c b/tools/libxc/xc_linux_osdep.c
> index 73860a2..32e5332 100644
> --- a/tools/libxc/xc_linux_osdep.c
> +++ b/tools/libxc/xc_linux_osdep.c
> @@ -92,14 +92,29 @@ static void *linux_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_ha
>  {
>      size_t size = npages * XC_PAGE_SIZE;
>      void *p;
> +    int rc, saved_errno;
>  
>      /* Address returned by mmap is page aligned. */
>      p = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_LOCKED, -1, 0);
> +    if ( p == MAP_FAILED )
> +    {
> +        PERROR("xc_alloc_hypercall_buffer: mmap failed");
> +        return NULL;
> +    }
>  
>      /* Do not copy the VMA to child process on fork. Avoid the page being COW
>          on hypercall. */
> -    madvise(p, npages * XC_PAGE_SIZE, MADV_DONTFORK);
> +    rc = madvise(p, npages * XC_PAGE_SIZE, MADV_DONTFORK);
> +    if ( rc < 0 )
> +	    goto out;
> +

This might be cleaner like:

if ( rc == 0 )
    return p;

error cleanup;

as it is small enough to do without an out; label.  Also, you can do
without 'rc' if you are happy putting the madvise() in the if statement
itself.  'rc' isn't subsequently referenced.

~Andrew

>      return p;
> +out:
> +    saved_errno = errno;
> +    PERROR("xc_alloc_hypercall_buffer: madvise failed");
> +    (void)munmap(p, size);
> +    errno = saved_errno;
> +    return NULL;
>  }
>  
>  static void linux_privcmd_free_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, void *ptr, int npages)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] libxc: check return values on mmap() and madvise() on xc_alloc_hypercall_buffer()
  2014-05-07 22:10 ` Andrew Cooper
@ 2014-05-08  5:03   ` Luis R. Rodriguez
  2014-05-08 10:15     ` Ian Campbell
  0 siblings, 1 reply; 8+ messages in thread
From: Luis R. Rodriguez @ 2014-05-08  5:03 UTC (permalink / raw)
  To: Andrew Cooper
  Cc: xen-devel, Stefano Stabellini, Ian Jackson, Ian Campbell,
	Luis R. Rodriguez

On Wed, May 07, 2014 at 11:10:07PM +0100, Andrew Cooper wrote:
> On 07/05/2014 22:47, Luis R. Rodriguez wrote:
> > From: "Luis R. Rodriguez" <mcgrof@suse.com>
> >
> > On a Thinkpad T4440p with OpenSUSE tumbleweed with v3.15-rc4
> > and today's latest xen tip from the git tree strace -f reveals
> > we end up on a never ending wait shortly after
> >
> > write(20, "backend/console/5\0", 18 <unfinished ...>
> >
> > I've tracked this down to a lack of error return values on mmap() and
> > madvise() on xc_alloc_hypercall_buffer(). This moves us forward.
> >
> > Cc: Ian Jackson <ian.jackson@eu.citrix.com>
> > Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > Cc: Ian Campbell <ian.campbell@citrix.com>
> > Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
> > ---
> 
> Good catch.  I am supprised this hasn't blown up in someones face .

Tell me about it.

>  Out of interest, which bit starts failing given correct error handling here?

The next part that fails is:

1742  write(22, "b", 1)                 = 1                                     
1742  read(20, "\4\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0", 16) = 16                     
1742  read(20, "OK\0", 3)               = 3                                     
1735  futex(0x7f0f65173770, FUTEX_WAKE_PRIVATE, 1) = 0                          
1735  rt_sigaction(SIGPIPE, {SIG_IGN, ~[KILL STOP RTMIN RT_1], SA_RESTORER, 0x7f0f5f1cb9f0}, NULL, 8) = 0
1735  rt_sigaction(SIGPIPE, {SIG_IGN, [], SA_RESTORER, 0x7f0f5f1cb9f0}, {SIG_IGN, ~[KILL STOP RTMIN RT_1], SA_RESTORER, 0x7f0f5f1cb9f0}, 8) = 0
1735  write(20, "\1\0\0\0\0\0\0\0\0\0\0\0\22\0\0\0", 16 <unfinished ...>        
1734  <... wait4 resumed> 0x7fffa73a89ac, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
1734  --- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---                   
1734  wait4(1735,  

On a working system this looks like:

3905  write(22, "b", 1 <unfinished ...>                                         
3892  rt_sigaction(SIGPIPE, {SIG_IGN, [], SA_RESTORER, 0x7fdd47457880},  <unfinished ...>
3905  <... write resumed> )             = 1                                     
3892  <... rt_sigaction resumed> {SIG_IGN, ~[KILL STOP RTMIN RT_1], SA_RESTORER, 0x7fdd47457880}, 8) = 0
3905  read(20,  <unfinished ...>                                                
3892  write(20, "\1\0\0\0\0\0\0\0\0\0\0\0\22\0\0\0", 16) = 16                   
3892  write(20, "backend/console/1\0", 18) = 18                                 
3905  <... read resumed> "\1\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0", 16) = 16           
3892  futex(0x7fdd4dbc213c, FUTEX_WAIT_PRIVATE, 3, NULL <unfinished ...>        
3905  read(20, "0\0", 2)                = 2                                     
3905  futex(0x7fdd4dbc213c, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7fdd4dbc2138, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
3892  <... futex resumed> )             = 0                                     
3905  read(20,  <unfinished ...>                                                
3892  futex(0x7fdd4dbc2110, FUTEX_WAKE_PRIVATE, 1) = 0                          
3892  rt_sigaction(SIGPIPE, {SIG_IGN, ~[KILL STOP RTMIN RT_1], SA_RESTORER, 0x7fdd47457880}, NULL, 8) = 0
3892  ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff1c0e1b10) = -1 ENOTTY (Inappropriate ioctl for device)

The 1735 process should be qemu, so it ends up getting stuck on the infinite loop
on libxl__spawn_spawn() waiting for qemu. Its unclear why it doesn't end.

> > BTW I see no ldconfig run after make install, where do we want to put it
> > given we have a few libs ?

How about this?

> >  tools/libxc/xc_linux_osdep.c | 17 ++++++++++++++++-
> >  1 file changed, 16 insertions(+), 1 deletion(-)
> >
> >
> > diff --git a/tools/libxc/xc_linux_osdep.c b/tools/libxc/xc_linux_osdep.c
> > index 73860a2..32e5332 100644
> > --- a/tools/libxc/xc_linux_osdep.c
> > +++ b/tools/libxc/xc_linux_osdep.c
> > @@ -92,14 +92,29 @@ static void *linux_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_ha
> >  {
> >      size_t size = npages * XC_PAGE_SIZE;
> >      void *p;
> > +    int rc, saved_errno;
> >  
> >      /* Address returned by mmap is page aligned. */
> >      p = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_LOCKED, -1, 0);
> > +    if ( p == MAP_FAILED )
> > +    {
> > +        PERROR("xc_alloc_hypercall_buffer: mmap failed");
> > +        return NULL;
> > +    }
> >  
> >      /* Do not copy the VMA to child process on fork. Avoid the page being COW
> >          on hypercall. */
> > -    madvise(p, npages * XC_PAGE_SIZE, MADV_DONTFORK);
> > +    rc = madvise(p, npages * XC_PAGE_SIZE, MADV_DONTFORK);
> > +    if ( rc < 0 )
> > +	    goto out;
> > +
> 
> This might be cleaner like:
> 
> if ( rc == 0 )
>     return p;
> 
> error cleanup;
>
> 
> as it is small enough to do without an out; label.

Sure, that makes sesnse.

> Also, you can do without 'rc' if you are happy putting the madvise() in the if statement
> itself.  'rc' isn't subsequently referenced.

OK.

  Luis

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] libxc: check return values on mmap() and madvise() on xc_alloc_hypercall_buffer()
  2014-05-08  5:03   ` Luis R. Rodriguez
@ 2014-05-08 10:15     ` Ian Campbell
  2014-05-08 10:34       ` Luis R. Rodriguez
  0 siblings, 1 reply; 8+ messages in thread
From: Ian Campbell @ 2014-05-08 10:15 UTC (permalink / raw)
  To: Luis R. Rodriguez
  Cc: Andrew Cooper, Stefano Stabellini, Ian Jackson, xen-devel,
	Luis R. Rodriguez

On Thu, 2014-05-08 at 07:03 +0200, Luis R. Rodriguez wrote:
> > > BTW I see no ldconfig run after make install, where do we want to put it
> > > given we have a few libs ?
> 
> How about this?

Isn't this conventionally the admin's responsibility?

> 
> > >  tools/libxc/xc_linux_osdep.c | 17 ++++++++++++++++-
> > >  1 file changed, 16 insertions(+), 1 deletion(-)
> > >
> > >
> > > diff --git a/tools/libxc/xc_linux_osdep.c b/tools/libxc/xc_linux_osdep.c
> > > index 73860a2..32e5332 100644
> > > --- a/tools/libxc/xc_linux_osdep.c
> > > +++ b/tools/libxc/xc_linux_osdep.c
> > > @@ -92,14 +92,29 @@ static void *linux_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_ha
> > >  {
> > >      size_t size = npages * XC_PAGE_SIZE;
> > >      void *p;
> > > +    int rc, saved_errno;
> > >  
> > >      /* Address returned by mmap is page aligned. */
> > >      p = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_LOCKED, -1, 0);
> > > +    if ( p == MAP_FAILED )
> > > +    {
> > > +        PERROR("xc_alloc_hypercall_buffer: mmap failed");
> > > +        return NULL;
> > > +    }
> > >  
> > >      /* Do not copy the VMA to child process on fork. Avoid the page being COW
> > >          on hypercall. */
> > > -    madvise(p, npages * XC_PAGE_SIZE, MADV_DONTFORK);
> > > +    rc = madvise(p, npages * XC_PAGE_SIZE, MADV_DONTFORK);
> > > +    if ( rc < 0 )
> > > +	    goto out;
> > > +
> > 
> > This might be cleaner like:
> > 
> > if ( rc == 0 )
> >     return p;
> > 
> > error cleanup;
> >
> > 
> > as it is small enough to do without an out; label.
> 
> Sure, that makes sesnse.

The out label idiom you have used is pretty conventional and will save
faff if some other operation gets added here. I'm happy with the patch
as it is.

> > Also, you can do without 'rc' if you are happy putting the madvise() in the if statement
> > itself.  'rc' isn't subsequently referenced.
> 
> OK.
> 
>   Luis

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] libxc: check return values on mmap() and madvise() on xc_alloc_hypercall_buffer()
  2014-05-08 10:15     ` Ian Campbell
@ 2014-05-08 10:34       ` Luis R. Rodriguez
  2014-05-08 11:32         ` Ian Campbell
  2014-05-12 12:03         ` Ian Campbell
  0 siblings, 2 replies; 8+ messages in thread
From: Luis R. Rodriguez @ 2014-05-08 10:34 UTC (permalink / raw)
  To: Ian Campbell; +Cc: Andrew Cooper, Stefano Stabellini, Ian Jackson, xen-devel

On Thu, May 8, 2014 at 3:15 AM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Thu, 2014-05-08 at 07:03 +0200, Luis R. Rodriguez wrote:
>> > > BTW I see no ldconfig run after make install, where do we want to put it
>> > > given we have a few libs ?
>>
>> How about this?
>
> Isn't this conventionally the admin's responsibility?

If that is part of the documentation of requirements :)

>> > error cleanup;
>> >
>> >
>> > as it is small enough to do without an out; label.
>>
>> Sure, that makes sesnse.
>
> The out label idiom you have used is pretty conventional and will save
> faff if some other operation gets added here. I'm happy with the patch
> as it is.

OK feel free to take it then.

BTW any idea where in code we get the trigger for what strace picks up as:

1742  write(22, "b", 1)                 = 1

I'm now in a state where instead of b I get "/" written and I just
can't explain this yet.

  Luis

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] libxc: check return values on mmap() and madvise() on xc_alloc_hypercall_buffer()
  2014-05-08 10:34       ` Luis R. Rodriguez
@ 2014-05-08 11:32         ` Ian Campbell
  2014-05-12 12:03         ` Ian Campbell
  1 sibling, 0 replies; 8+ messages in thread
From: Ian Campbell @ 2014-05-08 11:32 UTC (permalink / raw)
  To: Luis R. Rodriguez; +Cc: Andrew Cooper, Ian Jackson, xen-devel

On Thu, 2014-05-08 at 03:34 -0700, Luis R. Rodriguez wrote:
> On Thu, May 8, 2014 at 3:15 AM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Thu, 2014-05-08 at 07:03 +0200, Luis R. Rodriguez wrote:
> >> > > BTW I see no ldconfig run after make install, where do we want to put it
> >> > > given we have a few libs ?
> >>
> >> How about this?
> >
> > Isn't this conventionally the admin's responsibility?
> 
> If that is part of the documentation of requirements :)

http://wiki.xen.org/wiki/Compiling_Xen_From_Source
Ctrl-F
ldconfig
Profit.

> 
> >> > error cleanup;
> >> >
> >> >
> >> > as it is small enough to do without an out; label.
> >>
> >> Sure, that makes sesnse.
> >
> > The out label idiom you have used is pretty conventional and will save
> > faff if some other operation gets added here. I'm happy with the patch
> > as it is.
> 
> OK feel free to take it then.
> 
> BTW any idea where in code we get the trigger for what strace picks up as:
> 
> 1742  write(22, "b", 1)                 = 1

No idea. /proc/$pid/fds might tell you what fd 22 is, which might start
to give a clue.

> I'm now in a state where instead of b I get "/" written and I just
> can't explain this yet.
> 
>   Luis

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] libxc: check return values on mmap() and madvise() on xc_alloc_hypercall_buffer()
  2014-05-08 10:34       ` Luis R. Rodriguez
  2014-05-08 11:32         ` Ian Campbell
@ 2014-05-12 12:03         ` Ian Campbell
  2014-05-12 18:01           ` Luis R. Rodriguez
  1 sibling, 1 reply; 8+ messages in thread
From: Ian Campbell @ 2014-05-12 12:03 UTC (permalink / raw)
  To: Luis R. Rodriguez; +Cc: Andrew Cooper, Ian Jackson, xen-devel

On Thu, 2014-05-08 at 03:34 -0700, Luis R. Rodriguez wrote:
> On Thu, May 8, 2014 at 3:15 AM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > The out label idiom you have used is pretty conventional and will save
> > faff if some other operation gets added here. I'm happy with the patch
> > as it is.
> 
> OK feel free to take it then.

I hadn't noticed that there was a failure specific PERROR at the out
label location. For this to make sense it would need to be:

    rc = madvise(p, npages * XC_PAGE_SIZE, MADV_DONTFORK);
    if ( rc < 0 )
    {
        PERROR("xc_alloc_hypercall_buffer: madvise failed");
         goto out;
    }

    ....
 out:
    the cleanup

Ian.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] libxc: check return values on mmap() and madvise() on xc_alloc_hypercall_buffer()
  2014-05-12 12:03         ` Ian Campbell
@ 2014-05-12 18:01           ` Luis R. Rodriguez
  0 siblings, 0 replies; 8+ messages in thread
From: Luis R. Rodriguez @ 2014-05-12 18:01 UTC (permalink / raw)
  To: Ian Campbell; +Cc: Andrew Cooper, Ian Jackson, xen-devel

On Mon, May 12, 2014 at 5:03 AM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> I hadn't noticed that there was a failure specific PERROR at the out
> label location. For this to make sense it would need to be:
>
>     rc = madvise(p, npages * XC_PAGE_SIZE, MADV_DONTFORK);
>     if ( rc < 0 )
>     {
>         PERROR("xc_alloc_hypercall_buffer: madvise failed");
>          goto out;
>     }
>
>     ....
>  out:
>     the cleanup


OK I'll move the PERROR() above, and will fold this into my series of
systemd patches as I have a second spin coming up.

  Luis

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-05-12 18:02 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-07 21:47 [RFC] libxc: check return values on mmap() and madvise() on xc_alloc_hypercall_buffer() Luis R. Rodriguez
2014-05-07 22:10 ` Andrew Cooper
2014-05-08  5:03   ` Luis R. Rodriguez
2014-05-08 10:15     ` Ian Campbell
2014-05-08 10:34       ` Luis R. Rodriguez
2014-05-08 11:32         ` Ian Campbell
2014-05-12 12:03         ` Ian Campbell
2014-05-12 18:01           ` Luis R. Rodriguez

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.