All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Christoph Egger" <Christoph.Egger@amd.com>
To: xen-devel@lists.xensource.com
Subject: [PATCH] libxc portability fixes
Date: Wed, 19 Sep 2007 15:19:37 +0200	[thread overview]
Message-ID: <200709191519.37628.Christoph.Egger@amd.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 791 bytes --]


Hi!

Attached patch mainly contains portability fixes:
- use MAP_ANON, that is what both (BSD-)Unix and Linux have
- change last_error handling to use pthreads
- cleanup: No need to include <xen/sys/privcmd.h>
  a second time in xg_private.h

The patch is mainly based on a diff for NetBSD.

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>



-- 
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy

[-- Attachment #2: xen_libxc.diff --]
[-- Type: text/x-diff, Size: 5535 bytes --]

diff -r a00cc97b392a tools/libxc/xc_dom_core.c
--- a/tools/libxc/xc_dom_core.c	Wed Sep 12 09:43:33 2007 +0100
+++ b/tools/libxc/xc_dom_core.c	Tue Sep 18 10:52:18 2007 +0200
@@ -122,7 +122,7 @@ void *xc_dom_malloc_page_aligned(struct 
     memset(block, 0, sizeof(*block));
     block->mmap_len = size;
     block->mmap_ptr = mmap(NULL, block->mmap_len,
-                           PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
+                           PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON,
                            -1, 0);
     if ( block->mmap_ptr == MAP_FAILED )
     {
@@ -354,7 +354,7 @@ void *xc_dom_pfn_to_ptr(struct xc_dom_im
     {
         mode = "anonymous memory";
         phys->ptr = mmap(NULL, phys->count << page_shift,
-                         PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
+                         PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON,
                          -1, 0);
         if ( phys->ptr == MAP_FAILED )
         {
diff -r a00cc97b392a tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c	Wed Sep 12 09:43:33 2007 +0100
+++ b/tools/libxc/xc_private.c	Tue Sep 18 12:06:17 2007 +0200
@@ -10,7 +10,12 @@
 #include <stdarg.h>
 #include <pthread.h>
 
-static __thread xc_error last_error = { XC_ERROR_NONE, ""};
+static pthread_key_t last_error_pkey;
+static pthread_once_t last_error_pkey_once = PTHREAD_ONCE_INIT;
+
+static pthread_key_t errbuf_pkey;
+static pthread_once_t errbuf_pkey_once = PTHREAD_ONCE_INIT;
+
 #if DEBUG
 static xc_error_handler error_handler = xc_default_error_handler;
 #else
@@ -23,15 +28,46 @@ void xc_default_error_handler(const xc_e
     fprintf(stderr, "ERROR %s: %s\n", desc, err->message);
 }
 
+static void
+_xc_clean_last_error(void *m)
+{
+	if (m)
+		free(m);
+	pthread_setspecific(last_error_pkey, NULL);
+}
+
+static void
+_xc_init_last_error(void)
+{
+		pthread_key_create(&last_error_pkey, _xc_clean_last_error);
+}
+
+static xc_error *
+_xc_get_last_error(void)
+{
+	xc_error *last_error;
+
+	pthread_once(&last_error_pkey_once, _xc_init_last_error);
+
+	last_error = pthread_getspecific(last_error_pkey);
+	if (last_error == NULL) {
+		last_error = malloc(sizeof(xc_error));
+		pthread_setspecific(last_error_pkey, last_error);
+	}
+	return last_error;
+}
+
+
 const xc_error *xc_get_last_error(void)
 {
-    return &last_error;
+    return _xc_get_last_error();
 }
 
 void xc_clear_last_error(void)
 {
-    last_error.code = XC_ERROR_NONE;
-    last_error.message[0] = '\0';
+    xc_error *last_error = _xc_get_last_error();
+    last_error->code = XC_ERROR_NONE;
+    last_error->message[0] = '\0';
 }
 
 const char *xc_error_code_to_desc(int code)
@@ -64,9 +100,10 @@ xc_error_handler xc_set_error_handler(xc
 
 static void _xc_set_error(int code, const char *msg)
 {
-    last_error.code = code;
-    strncpy(last_error.message, msg, XC_MAX_ERROR_MSG_LEN - 1);
-    last_error.message[XC_MAX_ERROR_MSG_LEN-1] = '\0';
+    xc_error *last_error = _xc_get_last_error();
+    last_error->code = code;
+    strncpy(last_error->message, msg, XC_MAX_ERROR_MSG_LEN - 1);
+    last_error->message[XC_MAX_ERROR_MSG_LEN-1] = '\0';
 }
 
 void xc_set_error(int code, const char *fmt, ...)
@@ -84,23 +121,29 @@ void xc_set_error(int code, const char *
 
     errno = saved_errno;
 
-    if ( error_handler != NULL )
-        error_handler(&last_error);
+    if ( error_handler != NULL ) {
+        xc_error *last_error = _xc_get_last_error();
+        error_handler(last_error);
+    }
 }
 
 int lock_pages(void *addr, size_t len)
 {
       int e = 0;
+      void *laddr = (void *)((u_long)addr & ~0xfffUL);
+      size_t llen = (len + 0xfffUL) & ~0xfffUL;
 #ifndef __sun__
-      e = mlock(addr, len);
+      e = mlock(laddr, llen);
 #endif
       return (e);
 }
 
 void unlock_pages(void *addr, size_t len)
 {
+    void *laddr = (void *)((u_long)addr & ~0xfffUL);
+    size_t llen = (len + 0xfffUL) & ~0xfffUL;
 #ifndef __sun__
-    safe_munlock(addr, len);
+    safe_munlock(laddr, llen);
 #endif
 }
 
@@ -466,20 +509,43 @@ unsigned long xc_make_page_below_4G(
     return new_mfn;
 }
 
+static void
+_xc_clean_errbuf(void * m)
+{
+	if (m)
+		free(m);
+	pthread_setspecific(errbuf_pkey, NULL);
+}
+	
+static void
+_xc_init_errbuf(void)
+{
+    	pthread_key_create(&errbuf_pkey, _xc_clean_errbuf);
+}
+
 char *safe_strerror(int errcode)
 {
-    static __thread char errbuf[32];
+#define XS_BUFSIZE 32
+    char *errbuf;
     static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
     char *strerror_str;
 
+    pthread_once(&errbuf_pkey_once, _xc_init_errbuf);
+
+    errbuf = pthread_getspecific(errbuf_pkey);
+    if (errbuf == NULL) {
+    	errbuf = malloc(XS_BUFSIZE);
+    	pthread_setspecific(errbuf_pkey, errbuf);
+    }
+    
     /*
      * Thread-unsafe strerror() is protected by a local mutex. We copy
      * the string to a thread-private buffer before releasing the mutex.
      */
     pthread_mutex_lock(&mutex);
     strerror_str = strerror(errcode);
-    strncpy(errbuf, strerror_str, sizeof(errbuf));
-    errbuf[sizeof(errbuf)-1] = '\0';
+    strncpy(errbuf, strerror_str, XS_BUFSIZE);
+    errbuf[XS_BUFSIZE-1] = '\0';
     pthread_mutex_unlock(&mutex);
 
     return errbuf;
diff -r a00cc97b392a tools/libxc/xg_private.h
--- a/tools/libxc/xg_private.h	Wed Sep 12 09:43:33 2007 +0100
+++ b/tools/libxc/xg_private.h	Wed Sep 19 15:00:58 2007 +0200
@@ -15,7 +15,6 @@
 #include "xenguest.h"
 #include "xc_private.h"
 
-#include <xen/sys/privcmd.h>
 #include <xen/memory.h>
 #include <xen/elfnote.h>
 

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

             reply	other threads:[~2007-09-19 13:19 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-19 13:19 Christoph Egger [this message]
2007-09-19 14:25 ` [PATCH] libxc portability fixes Vincent Hanquez
2007-09-19 14:32   ` Christoph Egger
2007-09-19 14:49     ` Vincent Hanquez
2007-09-19 15:04       ` Christoph Egger
2007-09-19 15:41         ` Vincent Hanquez
2007-09-19 16:44           ` Keir Fraser
2007-09-19 22:21       ` John Levon
2007-09-20 12:30         ` Vincent Hanquez
2007-09-20 16:41           ` John Levon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200709191519.37628.Christoph.Egger@amd.com \
    --to=christoph.egger@amd.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.