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);