[libvirt] PATCH: User mode linux driver

Daniel Veillard veillard at redhat.com
Wed Nov 19 13:49:01 UTC 2008


On Wed, Nov 19, 2008 at 01:12:55PM +0000, Daniel P. Berrange wrote:
> This patch is an update of
> 
> http://www.redhat.com/archives/libvir-list/2008-October/msg00355.html
> 
> providing a user mode linux driver. I've fixed a number of stupid bugs
> since the first posting, so its more reliable & less crash prone on
> startup. I also added a short driver doc page for the website. Even
> though this driver isn't finished (it still lacks networking), I'd
> like to get this info 0.5.0 release so it can at least be tried out by
> interested people. It shouldn't impact any users of existing drivers.

  Okay, principle sounds right, it's not bad to push this now even if
there is a few sharp edges :-)

[...]
> @@ -2016,32 +2023,30 @@ static virDomainDefPtr virDomainDefParse
>      }
>      VIR_FREE(nodes);
>  
> -    /*
> -     * If no serial devices were listed, then look for console
> -     * devices which is the legacy syntax for the same thing
> -     */
> -    if (def->nserials == 0) {
> -        if ((node = virXPathNode(conn, "./devices/console[1]", ctxt)) != NULL) {
> -            virDomainChrDefPtr chr = virDomainChrDefParseXML(conn,
> -                                                             node);
> -            if (!chr)
> -                goto error;
> +    if ((node = virXPathNode(conn, "./devices/console[1]", ctxt)) != NULL) {
> +        virDomainChrDefPtr chr = virDomainChrDefParseXML(conn,
> +                                                         node);
> +        if (!chr)
> +            goto error;
>  
> -            chr->dstPort = 0;
> -            /*
> -             * For HVM console actually created a serial device
> -             * while for non-HVM it was a parvirt console
> -             */
> -            if (STREQ(def->os.type, "hvm")) {
> +        chr->dstPort = 0;
> +        /*
> +         * For HVM console actually created a serial device
> +         * while for non-HVM it was a parvirt console
> +         */
> +        if (STREQ(def->os.type, "hvm")) {
> +            if (def->nserials != 0) {
> +                virDomainChrDefFree(chr);
> +            } else {
>                  if (VIR_ALLOC_N(def->serials, 1) < 0) {
>                      virDomainChrDefFree(chr);
>                      goto no_memory;
>                  }
>                  def->nserials = 1;
>                  def->serials[0] = chr;
> -            } else {
> -                def->console = chr;
>              }
> +        } else {
> +            def->console = chr;
>          }
>      }

  Hummm, that change to console code parsing seems rather unrelated,
isn't it ?

[...]
> +int umlBuildCommandLine(virConnectPtr conn,
> +                        struct uml_driver *driver ATTRIBUTE_UNUSED,
> +                        virDomainObjPtr vm,
> +                        const char ***retargv,
> +                        const char ***retenv,
> +                        int **tapfds,
> +                        int *ntapfds) {
[...]
> +#define ADD_ARG_SPACE                                                   \
> +    do { \

  Align \\ with others
In general I prefer to see macros definitions outside of C code blocks,
I don't know why that makes me a bit nervous.


> +    for (i = 0 ; i < 16 ; i++) {
> +        char *ret;
> +        if (i == 0 && vm->def->console)
> +            ret = umlBuildCommandLineChr(conn, vm->def->console, "con");
> +        else
> +            if (asprintf(&ret, "con%d=none", i) < 0)
> +                goto no_memory;
> +        ADD_ARG(ret);
> +    }
> +
> +    for (i = 0 ; i < 16 ; i++) {
> +        virDomainChrDefPtr chr = NULL;
> +        char *ret;
> +        for (j = 0 ; j < vm->def->nserials ; j++)
> +            if (vm->def->serials[j]->dstPort == i)
> +                chr = vm->def->serials[j];
> +        if (chr)
> +            ret = umlBuildCommandLineChr(conn, chr, "ssl");
> +        else
> +            if (asprintf(&ret, "ssl%d=none", i) < 0)
> +                goto no_memory;
> +        ADD_ARG(ret);
> +    }

  I'm a bit puzzled by 16 is that an internal UML limit ?

[...]
> --- /dev/null
> +++ b/src/uml_conf.h
[...]
> +#define umlDebug(fmt, ...) do {} while(0)

  humpf we really need to get this debug internal API set up, my fault
I'm too slow !

[...]
> +++ b/src/uml_driver.c
> @@ -0,0 +1,1671 @@
> +/*
> + * driver.c: core driver methods for managing qemu guests

  s/qemu/uml/

  maybe we could abstract even more internal APIs ;-)

[...]
> +/* umlDebug statements should be changed to use this macro instead. */

  we should have fixed the qemu driver before doing the copy it seems

> +#define DEBUG(fmt,...) VIR_DEBUG(__FILE__, fmt, __VA_ARGS__)
> +#define DEBUG0(msg) VIR_DEBUG(__FILE__, "%s", msg)
> +
> +#define umlLog(level, msg...) fprintf(stderr, msg)
[...]
> +    if (fscanf(pidinfo, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %llu %llu", &usertime, &systime) != 2) {

  heh, I didn't knew the * assignment-suppression character, I learned
  something !


  okay, no surprises,

   fine by me, +1

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list