From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Egger Subject: [PATCH] libxc: make unlock_page return error Date: Wed, 18 Aug 2010 16:42:10 +0200 Message-ID: <201008181642.10467.Christoph.Egger@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary-00=_CF/aMEcaMItT4HP" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org --Boundary-00=_CF/aMEcaMItT4HP Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi! As a result of debugging 'xend segfaults when starting', the attached patch makes unlock_pages return an error. Signed-off-by: Christoph Egger -- ---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85609 Dornach b. Muenchen Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632 --Boundary-00=_CF/aMEcaMItT4HP Content-Type: text/x-diff; charset="iso 8859-15"; name="xen_tools_libxc.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xen_tools_libxc.diff" diff -r 36bd4630ad99 tools/libxc/xc_private.c --- a/tools/libxc/xc_private.c Wed Aug 18 10:22:48 2010 +0200 +++ b/tools/libxc/xc_private.c Wed Aug 18 16:39:11 2010 +0200 @@ -175,7 +175,7 @@ void xc_report_progress_step(xc_interfac #ifdef __sun__ int lock_pages(void *addr, size_t len) { return 0; } -void unlock_pages(void *addr, size_t len) { } +int unlock_pages(void *addr, size_t len) { return 0; } int hcall_buf_prep(void **addr, size_t len) { return 0; } void hcall_buf_release(void **addr, size_t len) { } @@ -184,20 +184,21 @@ void hcall_buf_release(void **addr, size int lock_pages(void *addr, size_t len) { - int e; + int e = 0; void *laddr = (void *)((unsigned long)addr & PAGE_MASK); size_t llen = (len + ((unsigned long)addr - (unsigned long)laddr) + PAGE_SIZE - 1) & PAGE_MASK; - e = mlock(laddr, llen); + if (mlock(laddr, llen) == -1) + e = errno; return e; } -void unlock_pages(void *addr, size_t len) +int unlock_pages(void *addr, size_t len) { void *laddr = (void *)((unsigned long)addr & PAGE_MASK); size_t llen = (len + ((unsigned long)addr - (unsigned long)laddr) + PAGE_SIZE - 1) & PAGE_MASK; - safe_munlock(laddr, llen); + return safe_munlock(laddr, llen); } static pthread_key_t hcall_buf_pkey; diff -r 36bd4630ad99 tools/libxc/xc_private.h --- a/tools/libxc/xc_private.h Wed Aug 18 10:22:48 2010 +0200 +++ b/tools/libxc/xc_private.h Wed Aug 18 16:39:11 2010 +0200 @@ -86,16 +86,19 @@ void xc_report_progress_step(xc_interfac void *xc_memalign(size_t alignment, size_t size); int lock_pages(void *addr, size_t len); -void unlock_pages(void *addr, size_t len); +int unlock_pages(void *addr, size_t len); int hcall_buf_prep(void **addr, size_t len); void hcall_buf_release(void **addr, size_t len); -static inline void safe_munlock(const void *addr, size_t len) +static inline int safe_munlock(const void *addr, size_t len) { + int err = 0; int saved_errno = errno; - (void)munlock(addr, len); + if (munlock(addr, len) == -1) + err = errno; errno = saved_errno; + return err; } int do_xen_hypercall(xc_interface *xch, privcmd_hypercall_t *hypercall); --Boundary-00=_CF/aMEcaMItT4HP Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --Boundary-00=_CF/aMEcaMItT4HP--