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@lists.xensource.com http://lists.xensource.com/xen-devel
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@lists.xensource.com > http://lists.xensource.com/xen-devel_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
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@linux.vnet.ibm.com> To: "Umar Farooq Minhas" <umarfm13@hotmail.com> Cc: <xen-devel@lists.xensource.com> 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@lists.xensource.com >> http://lists.xensource.com/xen-devel > >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
On Mon, Nov 20, 2006 at 08:21:20PM -0500, Umar Farooq Minhas wrote:> 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.you need to use "domain_open" instead of "daemon_open" in domU. daemon_open is using a direct unix socket to communicate with xenstored. this socket is only accessible to dom0. domU need to use the other way to communicate with xenstored. Cheers, -- Vincent Hanquez _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Once again thanks for replying, I appreciate your patience. Actually I already realized that mistake and replaced "daemon_open" with "domain_open". But getting the "unknown error" has now changed into a "segmentation fault" and apparently it occurs after i execute the "xs_directory" function to get the path in buf2 variable (line31 below). I checked the value of ''len'' variable after the call and it turns out to be arbitrarily large. What am I doing wrong here ? After replacing "daemon_open" with "domain_open" all the rest of the calls to xs.h functions remain the same or are there specific "daemon" and "domain" versions of functions? (apparently its the former case) A few related questions: -Are there any specific initializations/calls that need to be made from inside domU to first initialize and then access xenstore ? Or the functions exposed by xs.h are the only thing required ? Apparently xenstore is initialized by dom0 once at startup only. -Does ability to communicate with xenstore depend on whether the ethernet interface b/w dom0 and domU is working or not (since it uses sockets)? Currently my domU can''t ping dom0 or any one else for that matter. -I am trying to only read the xenstore(which is allowed to all domains by default), does my problem in anyway relate to xenstore access permissions ? -Are you aware of any user-space management tools available that access xenstore from within domU? Sorry for a detailed mail but I am just a beginner and dont know a lot of stuff. I''ll appreciate your help once again. ------------------------------------------------------------------------------------------- 1 #include <xs.h> 2 #include <sys/types.h> 3 #include <stdio.h> 4 #include <string.h> 5 6 void main(int argc, char *argv[]) 7 { 8 9 struct xs_handle *xs; 10 xs_transaction_t th; 11 char *path; 12 int fd; 13 fd_set set; 14 int er; 15 struct timeval tv = {.tv_sec = 0, .tv_usec = 0 }; 16 char **vec; 17 unsigned int num; 18 char * buf; 19 char ** buf2; 20 unsigned int len; 21 22 unsigned int domid; 23 24 printf("Msg1\n"); 25 26 /* Get a connection to the daemon */ 27 xs = xs_domain_open(); 28 if ( xs == NULL ) error(); 29 30 th = xs_transaction_start(xs); 31 buf2 = xs_directory(xs, th,"/local/domain", &len); 32 xs_transaction_end(xs, th, true); 33 34 int i=0; 35 36 for(i=0;i<len;i++) 37 { 38 printf("%s\n",buf2[i]); 39 } 40 41 42 // I am running dom0 and oly 1 domU so this condition chooses one of them 43 if(len>1) 44 domid = atoi(buf2[1]); 45 if(len==1) 46 domid = atoi(buf2[0]); 47 //sprintf( domid, "%ui", buf2[0] ); 48 49 printf("Domid: %i\n", domid); 50 51 /* Get the local domain path */ 52 path = xs_get_domain_path(xs, domid); 53 if ( path == NULL ) error(); 54 55 printf("Msg3\n"); 56 57 /* Make space for our node on the path */ 58 path = realloc(path, strlen(path) + strlen("/memory/target") + 1); 59 if ( path == NULL ) error(); 60 strcat(path, "/memory/target"); 61 62 /* Create a watch on /local/domain/%d/mynode. */ 63 er = xs_watch(xs, path, "mytoken"); 64 if ( er == 0 ) error(); 65 66 /* We are notified of read availability on the watch via the 67 * file descriptor. 68 */ 69 fd = xs_fileno(xs); 70 71 while (1) 72 { 73 FD_ZERO(&set); 74 FD_SET(fd, &set); 75 76 /* Poll for data. */ 77 if ( select(fd + 1, &set, NULL, NULL, &tv) > 0 78 && FD_ISSET(fd, &set)) 79 { 80 /* I am not sure how num works -- please describe. */ 81 vec = xs_read_watch(xs, &num); 82 if ( !vec ) error(); 83 printf("vec contents: %s|%s\n", vec[XS_WATCH_PATH], 84 vec[XS_WATCH_TOKEN]); 85 86 /* Prepare a transaction and do a read. */ 87 th = xs_transaction_start(xs); 88 buf = xs_read(xs, th, vec[XS_WATCH_PATH], &len); 89 xs_transaction_end(xs, th, true); 90 if ( buf ) 91 { 92 printf("buflen: %d\nbuf: %s\n", len, buf); 93 } 94 95 /* Prepare a transaction and do a write. */ 96 /*th = xs_transaction_start(xs); 97 98 er = xs_write(xs, th, path, "somestuff", strlen("somestuff")); 99 xs_transaction_end(xs, th, true); 100 if ( er == 0 ) error();*/ 101 } 102 } 103 104 /* Cleanup */ 105 close(fd); 106 xs_daemon_close(xs); 107 free(path); 108 109 } ----- Original Message ----- From: "Vincent Hanquez" <vincent@xensource.com> To: "Umar Farooq Minhas" <umarfm13@hotmail.com> Cc: <aball@linux.vnet.ibm.com>; <xen-devel@lists.xensource.com> Sent: Wednesday, November 22, 2006 10:52 AM Subject: Re: [Xen-devel] Regarding Xenstore/Xenbus> On Mon, Nov 20, 2006 at 08:21:20PM -0500, Umar Farooq Minhas wrote: >> 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. > > you need to use "domain_open" instead of "daemon_open" in domU. > > daemon_open is using a direct unix socket to communicate with xenstored. > this socket is only accessible to dom0. domU need to use the other way > to communicate with xenstored. > > Cheers, > -- > Vincent Hanquez >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Kindly, ignore my previous message. I figured out what was wrong with the code. I don''t need to call "xs_directory" function because I learned that when you access Xenstore from inside domU it has an implicit root at "/local/domain/<domid>" so in-order to read "/local/domain/<domid>/memory/target" I just need to pass "memory/target" to "xs_read" as path. The thing that I want to know now is that can a userspace tool register and be notified of watches on xenstore or is it allowed for kernel level drivers only? Apparently, the later seems to be the case because when I try to call "xs_watch" from domU it returns with an unknown error. Is there a workaround this? If not, I can always setup a loop that polls the path periodically to detect changes. I just want to be notified of changes to the path "memory/target". Thanks for your help. ----- Original Message ----- From: "Umar Farooq Minhas" <umarfm13@hotmail.com> To: "Vincent Hanquez" <vincent@xensource.com> Cc: <xen-devel@lists.xensource.com> Sent: Wednesday, November 22, 2006 7:56 PM Subject: Re: [Xen-devel] Regarding Xenstore/Xenbus> Once again thanks for replying, I appreciate your patience. > > Actually I already realized that mistake and replaced "daemon_open" with > "domain_open". > But getting the "unknown error" has now changed into a "segmentation > fault" and apparently > it occurs after i execute the "xs_directory" function to get the path in > buf2 variable (line31 below). > I checked the value of ''len'' variable after the call and it turns out to > be arbitrarily large. > What am I doing wrong here ? After replacing "daemon_open" with > "domain_open" all the rest > of the calls to xs.h functions remain the same or are there specific > "daemon" and "domain" > versions of functions? (apparently its the former case) > > A few related questions: > > -Are there any specific initializations/calls that need to be made from > inside domU to first initialize > and then access xenstore ? Or the functions exposed by xs.h are the only > thing required ? Apparently > xenstore is initialized by dom0 once at startup only. > > -Does ability to communicate with xenstore depend on whether the ethernet > interface b/w > dom0 and domU is working or not (since it uses sockets)? Currently my domU > can''t ping dom0 or any one else > for that matter. > > -I am trying to only read the xenstore(which is allowed to all domains by > default), does my problem > in anyway relate to xenstore access permissions ? > > -Are you aware of any user-space management tools available that access > xenstore from within domU? > > Sorry for a detailed mail but I am just a beginner and dont know a lot of > stuff. > > I''ll appreciate your help once again. > > > ------------------------------------------------------------------------------------------- > > 1 #include <xs.h> > 2 #include <sys/types.h> > 3 #include <stdio.h> > 4 #include <string.h> > 5 > 6 void main(int argc, char *argv[]) > 7 { > 8 > 9 struct xs_handle *xs; > 10 xs_transaction_t th; > 11 char *path; > 12 int fd; > 13 fd_set set; > 14 int er; > 15 struct timeval tv = {.tv_sec = 0, .tv_usec = 0 }; > 16 char **vec; > 17 unsigned int num; > 18 char * buf; > 19 char ** buf2; > 20 unsigned int len; > 21 > 22 unsigned int domid; > 23 > 24 printf("Msg1\n"); > 25 > 26 /* Get a connection to the daemon */ > 27 xs = xs_domain_open(); > 28 if ( xs == NULL ) error(); > 29 > 30 th = xs_transaction_start(xs); > 31 buf2 = xs_directory(xs, th,"/local/domain", &len); > 32 xs_transaction_end(xs, th, true); > 33 > 34 int i=0; > 35 > 36 for(i=0;i<len;i++) > 37 { > 38 printf("%s\n",buf2[i]); > 39 } > 40 > 41 > 42 // I am running dom0 and oly 1 domU so this condition chooses one of > them > 43 if(len>1) > 44 domid = atoi(buf2[1]); > 45 if(len==1) > 46 domid = atoi(buf2[0]); > 47 //sprintf( domid, "%ui", buf2[0] ); > 48 > 49 printf("Domid: %i\n", domid); > 50 > 51 /* Get the local domain path */ > 52 path = xs_get_domain_path(xs, domid); > 53 if ( path == NULL ) error(); > 54 > 55 printf("Msg3\n"); > 56 > 57 /* Make space for our node on the path */ > 58 path = realloc(path, strlen(path) + strlen("/memory/target") + 1); > 59 if ( path == NULL ) error(); > 60 strcat(path, "/memory/target"); > 61 > 62 /* Create a watch on /local/domain/%d/mynode. */ > 63 er = xs_watch(xs, path, "mytoken"); > 64 if ( er == 0 ) error(); > 65 > 66 /* We are notified of read availability on the watch via the > 67 * file descriptor. > 68 */ > 69 fd = xs_fileno(xs); > 70 > 71 while (1) > 72 { > 73 FD_ZERO(&set); > 74 FD_SET(fd, &set); > 75 > 76 /* Poll for data. */ > 77 if ( select(fd + 1, &set, NULL, NULL, &tv) > 0 > 78 && FD_ISSET(fd, &set)) > 79 { > 80 /* I am not sure how num works -- please describe. */ > 81 vec = xs_read_watch(xs, &num); > 82 if ( !vec ) error(); > 83 printf("vec contents: %s|%s\n", vec[XS_WATCH_PATH], > 84 vec[XS_WATCH_TOKEN]); > 85 > 86 /* Prepare a transaction and do a read. */ > 87 th = xs_transaction_start(xs); > 88 buf = xs_read(xs, th, vec[XS_WATCH_PATH], &len); > 89 xs_transaction_end(xs, th, true); > 90 if ( buf ) > 91 { > 92 printf("buflen: %d\nbuf: %s\n", len, buf); > 93 } > 94 > 95 /* Prepare a transaction and do a write. */ > 96 /*th = xs_transaction_start(xs); > 97 > 98 er = xs_write(xs, th, path, "somestuff", strlen("somestuff")); > 99 xs_transaction_end(xs, th, true); > 100 if ( er == 0 ) error();*/ > 101 } > 102 } > 103 > 104 /* Cleanup */ > 105 close(fd); > 106 xs_daemon_close(xs); > 107 free(path); > 108 > 109 } > ----- Original Message ----- > From: "Vincent Hanquez" <vincent@xensource.com> > To: "Umar Farooq Minhas" <umarfm13@hotmail.com> > Cc: <aball@linux.vnet.ibm.com>; <xen-devel@lists.xensource.com> > Sent: Wednesday, November 22, 2006 10:52 AM > Subject: Re: [Xen-devel] Regarding Xenstore/Xenbus > > >> On Mon, Nov 20, 2006 at 08:21:20PM -0500, Umar Farooq Minhas wrote: >>> 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. >> >> you need to use "domain_open" instead of "daemon_open" in domU. >> >> daemon_open is using a direct unix socket to communicate with xenstored. >> this socket is only accessible to dom0. domU need to use the other way >> to communicate with xenstored. >> >> Cheers, >> -- >> Vincent Hanquez >> >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel