* [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.