[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] Regarding Xenstore/Xenbus



Thanks for your reply. I was into trying out xenstore acess using 'libxenstore.so'. I have copied the exact code that I am trying to run (most of this comes from xenstore wiki). The issue is that I am able to run this code from dom0 but when I try to run it from inside a domU after the first printf output i.e. "Msg1" it terminates abnormally saying "unknown error". My guess is that its failing when it calls xs_daemon_open(). I can't figure out what am i missing. Some processes need to be started before i can acess xenstore? Are there any packages that need to be installed in domU to access xenstore? I already have 'xen-devel', 'xen-lib' and 'xen-tools' packages installed inside domU. Please help.

-------------------------------------------------------------------------------------------

#include <xs.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>

void main(int argc, char *argv[])
{

   struct xs_handle *xs;
   xs_transaction_t th;
   char *path;
   int fd;
   fd_set set;
   int er;
   struct timeval tv = {.tv_sec = 0, .tv_usec = 0 };
   char **vec;
   unsigned int num;
   char * buf;
   char ** buf2;
   unsigned int len;

   unsigned int domid;

   printf("Msg1\n");

   /* Get a connection to the daemon */
   xs = xs_daemon_open();
   if ( xs == NULL ) error();

   th = xs_transaction_start(xs);
       buf2 = xs_directory(xs, th,"/local/domain", &len);
   xs_transaction_end(xs, th, true);

   int i=0;

   for(i=0;i<len;i++)
   {
       printf("%s\n",buf2[i]);
   }

// I am running dom0 and oly 1 domU so this condition chooses one of them
   if(len>1)
       domid = atoi(buf2[1]);
   if(len==1)
       domid = atoi(buf2[0]);
       //sprintf( domid, "%ui", buf2[0] );

   printf("Domid: %i\n", domid);

   /* Get the local domain path */
   path = xs_get_domain_path(xs, domid);
   if ( path == NULL ) error();

   printf("Msg3\n");

   /* Make space for our node on the path */
   path = realloc(path, strlen(path) + strlen("/memory/target") + 1);
   if ( path == NULL ) error();
   strcat(path, "/memory/target");

   /* Create a watch on /local/domain/%d/mynode. */
   er = xs_watch(xs, path, "mytoken");
   if ( er == 0 ) error();

   /* We are notified of read availability on the watch via the
    * file descriptor.
    */
   fd = xs_fileno(xs);

   while (1)
   {
       FD_ZERO(&set);
       FD_SET(fd, &set);

       /* Poll for data. */
       if ( select(fd + 1, &set, NULL, NULL, &tv) > 0
            && FD_ISSET(fd, &set))
       {
           /* I am not sure how num works -- please describe. */
           vec = xs_read_watch(xs, &num);
           if ( !vec ) error();
           printf("vec contents: %s|%s\n", vec[XS_WATCH_PATH],
                                           vec[XS_WATCH_TOKEN]);

           /* Prepare a transaction and do a read. */
           th = xs_transaction_start(xs);
               buf = xs_read(xs, th, vec[XS_WATCH_PATH], &len);
           xs_transaction_end(xs, th, true);
           if ( buf )
           {
               printf("buflen: %d\nbuf: %s\n", len, buf);
           }

           /* Prepare a transaction and do a write. */
           /*th = xs_transaction_start(xs);
er = xs_write(xs, th, path, "somestuff", strlen("somestuff"));
           xs_transaction_end(xs, th, true);
           if ( er == 0 ) error();*/
       }
   }

   /* Cleanup */
   close(fd);
   xs_daemon_close(xs);
   free(path);

}
-------------------------------------------------------------------------------------------

----- Original Message ----- From: "Andrew D. Ball" <aball@xxxxxxxxxxxxxxxxxx>
To: "Umar Farooq Minhas" <umarfm13@xxxxxxxxxxx>
Cc: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sent: Monday, November 20, 2006 5:02 PM
Subject: Re: [Xen-devel] Regarding Xenstore/Xenbus


I think that's right.  Look into using libxenstore inside of the domU --
I think there are functions to do what you want there.

Peace.
Andrew


On Sun, 2006-11-19 at 03:09 -0500, Umar Farooq Minhas wrote:
Hi everyone,

I have installed Xen on OpenSUSE Linux 10.1 and am just starting to
develop with Xen. I want to implement a very straightforward
application in domUs which simply gets notified whenever a resource
provisioning change (specifically for cpu/memory allocation) is made
for that particular domU using for example xm mem-set. From the
readings that I have done so far it seems that since xenstore is a
shared database between all the domains which keeps track of domain
specific values(including values of allocated resources) and that it
can be accessed through xenbus from domUs so what I need to do is to
write a program that would access xenstore from withing that domU over
xenbus. Or more specifically I will have to register a 'watch' in
xenstore (just as the balloon driver does) to monitor memory values. I
don't know whether this is true or not. I would greatly appreciate if
someone could verify this understanding or point me in the right
direction. Also if this is true some pointers to start developing with
xenbus/xenstore would be very helpful.

A prompt response will be appreciated as I am running on a deadline :)

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




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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.