WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Create /dev/xen/evtchn if it doesn't exist.

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Create /dev/xen/evtchn if it doesn't exist.
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 07 Sep 2005 20:32:11 +0000
Delivery-date: Wed, 07 Sep 2005 20:30:41 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User shand@xxxxxxxxxxxxxxxxxxxxxxxxxxx
# Node ID b7c7cb88f0ba9c0473d926c3cf531f9e086c3d09
# Parent  7d0fb56b4a916cccc497d200e6a8329537ce740d
Create /dev/xen/evtchn if it doesn't exist. 

Signed-off-by: Steven Hand <steven@xxxxxxxxxxxxx>

diff -r 7d0fb56b4a91 -r b7c7cb88f0ba tools/xenstore/xenstored_domain.c
--- a/tools/xenstore/xenstored_domain.c Wed Sep  7 19:01:31 2005
+++ b/tools/xenstore/xenstored_domain.c Wed Sep  7 20:30:00 2005
@@ -433,33 +433,57 @@
 {
 }
 
+#define EVTCHN_DEV_NAME  "/dev/xen/evtchn"
+#define EVTCHN_DEV_MAJOR 10
+#define EVTCHN_DEV_MINOR 201
+
 /* Returns the event channel handle. */
 int domain_init(void)
 {
-       /* The size of the ringbuffer: half a page minus head structure. */
-       ringbuf_datasize = getpagesize() / 2 - sizeof(struct ringbuf_head);
-
-       xc_handle = talloc(talloc_autofree_context(), int);
-       if (!xc_handle)
-               barf_perror("Failed to allocate domain handle");
-       *xc_handle = xc_interface_open();
-       if (*xc_handle < 0)
-               barf_perror("Failed to open connection to hypervisor");
-       talloc_set_destructor(xc_handle, close_xc_handle);
-
+    /* The size of the ringbuffer: half a page minus head structure. */
+    ringbuf_datasize = getpagesize() / 2 - sizeof(struct ringbuf_head);
+    
+    xc_handle = talloc(talloc_autofree_context(), int);
+    if (!xc_handle)
+        barf_perror("Failed to allocate domain handle");
+
+    *xc_handle = xc_interface_open();
+    if (*xc_handle < 0)
+        barf_perror("Failed to open connection to hypervisor (privcmd)");
+
+    talloc_set_destructor(xc_handle, close_xc_handle);
+    
 #ifdef TESTING
-       eventchn_fd = fake_open_eventchn();
+    eventchn_fd = fake_open_eventchn();
 #else
-       eventchn_fd = open("/dev/xen/evtchn", O_RDWR);
+    {
+        struct stat st;
+        
+        /* Make sure any existing device file links to correct device. */
+        if ( (lstat(EVTCHN_DEV_NAME, &st) != 0) || !S_ISCHR(st.st_mode) ||
+             (st.st_rdev != makedev(EVTCHN_DEV_MAJOR, EVTCHN_DEV_MINOR)) )
+            (void)unlink(EVTCHN_DEV_NAME);
+        
+      reopen:
+        eventchn_fd = open(EVTCHN_DEV_NAME, O_NONBLOCK|O_RDWR);
+        if (eventchn_fd == -1) {
+            if ((errno == ENOENT) && (
+                    (mkdir("/dev/xen", 0755) == 0) || (errno == EEXIST)) 
+                && (mknod(EVTCHN_DEV_NAME, S_IFCHR|0600,
+                          makedev(EVTCHN_DEV_MAJOR,EVTCHN_DEV_MINOR)) == 0))
+                goto reopen;
+            return -errno;
+        }
+    }
 #endif
-       if (eventchn_fd < 0)
-               barf_perror("Failed to open connection to hypervisor");
-
-       if (xc_evtchn_bind_virq(*xc_handle, VIRQ_DOM_EXC, &virq_port))
-               barf_perror("Failed to bind to domain exception virq");
-
-       if (ioctl(eventchn_fd, EVENTCHN_BIND, virq_port) != 0)
-               barf_perror("Failed to bind to domain exception virq port");
-
-       return eventchn_fd;
-}
+    if (eventchn_fd < 0)
+        barf_perror("Failed to open connection to hypervisor (evtchn)");
+    
+    if (xc_evtchn_bind_virq(*xc_handle, VIRQ_DOM_EXC, &virq_port))
+        barf_perror("Failed to bind to domain exception virq");
+    
+    if (ioctl(eventchn_fd, EVENTCHN_BIND, virq_port) != 0)
+        barf_perror("Failed to bind to domain exception virq port");
+    
+    return eventchn_fd;
+}

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Create /dev/xen/evtchn if it doesn't exist., Xen patchbot -unstable <=