> Date: Sun, 18 Sep 2022 08:43:14 +0000
> From: Klemens Nanni <k...@openbsd.org>
> 
> Assignable PCIe devices have a root complex path and a more descriptive
> I/O slot path;  example output from a T4-2:
> 
>       # ldomctl list-io
>       PATH             NAME
>       /@400/@2/@0/@8   /SYS/MB/PCIE0
>       /@500/@2/@0/@a   /SYS/MB/PCIE1
>       ...
>       /@400/@2/@0/@e   /SYS/MB/SASHBA
>       /@400/@1/@0/@4   /SYS/MB/NET0
>       /@500/@1/@0/@5   /SYS/MB/NET2
> 
> The latter is much more descriptive, matches actual labels on the back
> of the hardware as well as information from ILOM.
> 
> ldom.conf currently accepts only the first value, which is not really
> informative unless you know how each element maps to physical hardware.
> 
> The second value is a no-brainer, stable across different machines and
> more useful to work with when building systems whith many domains having
> PCIe devices assigned; `ldomctl list-io' is no longer needed to produce
> a working configuration.
> 
> So make ldom.conf `iodevice' take both values;  ldomctl looks them up
> in the list of components which stores both, so just match against both
> and keep yielding the root complex path internally.
> 
> The diff is bigger because I renamed struct iodev's path member to dev
> to clarify how it may be either a path or a name/NAC.
> 
> Changing my ldom.conf like this after the diff still results in
> `ldomctl init-system' producing identical machine descriptions:
> 
>       -iodevice       "/@400/@2/@0/@8"        # /SYS/MB/PCIE0
>       +iodevice       "/SYS/MB/PCIE0"
> 
> 
> Feedback? OK? (for after release)

ok kettenis@

> commit 3016bbec8c36884c64b5dff8b3bc520d50d36c5d
> Author: Klemens Nanni <k...@openbsd.org>
> Date:   Sun Sep 18 01:07:49 2022 +0200
> 
>     Allow passing iodevice pseudonyms
> 
> diff --git a/usr.sbin/ldomctl/config.c b/usr.sbin/ldomctl/config.c
> index 048e6e58e72..82f4f6ce5cb 100644
> --- a/usr.sbin/ldomctl/config.c
> +++ b/usr.sbin/ldomctl/config.c
> @@ -2645,7 +2645,7 @@ guest_add_variable(struct guest *guest, const char 
> *name, const char *str)
>  }
>  
>  void
> -guest_add_iodev(struct guest *guest, const char *path)
> +guest_add_iodev(struct guest *guest, const char *dev)
>  {
>       struct component *component;
>       struct subdevice *subdevice;
> @@ -2654,17 +2654,18 @@ guest_add_iodev(struct guest *guest, const char *path)
>               errx(1, "direct I/O not supported by hypervisor");
>  
>       TAILQ_FOREACH(component, &components, link) {
> -             if (strcmp(component->path, path) == 0)
> +             if (strcmp(component->nac, dev) == 0 ||
> +                 strcmp(component->path, dev) == 0)
>                       break;
>       }
>  
>       if (component == NULL)
> -             errx(1, "incorrect device path %s", path);
> +             errx(1, "incorrect device path %s", dev);
>       if (component->assigned)
> -             errx(1, "device path %s already assigned", path);
> +             errx(1, "device path %s already assigned", dev);
>  
>       subdevice = xzalloc(sizeof(*subdevice));
> -     subdevice->path = path;
> +     subdevice->path = component->path;
>       TAILQ_INSERT_TAIL(&guest->subdevice_list, subdevice, link);
>       component->assigned = 1;
>  }
> @@ -2873,7 +2874,7 @@ build_config(const char *filename, int noaction)
>               SIMPLEQ_FOREACH(var, &domain->var_list, entry)
>                       guest_add_variable(guest, var->name, var->str);
>               SIMPLEQ_FOREACH(iodev, &domain->iodev_list, entry)
> -                     guest_add_iodev(guest, iodev->path);
> +                     guest_add_iodev(guest, iodev->dev);
>  
>               guest_finalize(guest);
>       }
> diff --git a/usr.sbin/ldomctl/ldom.conf.5 b/usr.sbin/ldomctl/ldom.conf.5
> index a6555199e65..efad2b38b46 100644
> --- a/usr.sbin/ldomctl/ldom.conf.5
> +++ b/usr.sbin/ldomctl/ldom.conf.5
> @@ -50,8 +50,13 @@ Declare the amount of memory assigned to a domain, in 
> bytes.
>  can be specified with a human-readable scale, using the format described in
>  .Xr scan_scaled 3 ,
>  e.g. 512M.
> -.It Ic iodevice Ar path
> +.It Ic iodevice Ar device
>  Assign the specified PCIe device to the guest domain.
> +.Ar device
> +may be either a device path
> +.Pq Pa /@400/@2/@0/@8
> +or a pseudonym
> +.Pq Pa /SYS/MB/PCIE0 .
>  This keyword can be used multiple times.
>  .It Ic variable Ar name Ns = Ns Ar value
>  Set the specified NVRAM variable for the domain.
> diff --git a/usr.sbin/ldomctl/ldomctl.h b/usr.sbin/ldomctl/ldomctl.h
> index b5210ee3c0e..ee40b59df30 100644
> --- a/usr.sbin/ldomctl/ldomctl.h
> +++ b/usr.sbin/ldomctl/ldomctl.h
> @@ -176,7 +176,7 @@ struct var {
>  
>  struct iodev {
>       SIMPLEQ_ENTRY(iodev)    entry;
> -     const char              *path;
> +     const char              *dev;
>  };
>  
>  struct domain {
> diff --git a/usr.sbin/ldomctl/parse.y b/usr.sbin/ldomctl/parse.y
> index f987ab60042..2323bfebe30 100644
> --- a/usr.sbin/ldomctl/parse.y
> +++ b/usr.sbin/ldomctl/parse.y
> @@ -220,13 +220,13 @@ domainopts      : VCPU vcpu {
>                       struct iodev *iodev;
>                       SIMPLEQ_FOREACH(odomain, &conf->domain_list, entry)
>                               SIMPLEQ_FOREACH(iodev, &odomain->iodev_list, 
> entry)
> -                                     if (strcmp(iodev->path, $2) == 0) {
> +                                     if (strcmp(iodev->dev, $2) == 0) {
>                                               yyerror("iodevice %s already"
>                                                   " assigned", $2);
>                                               YYERROR;
>                                       }
>                       iodev = xmalloc(sizeof(struct iodev));
> -                     iodev->path = $2;
> +                     iodev->dev = $2;
>                       SIMPLEQ_INSERT_TAIL(&domain->iodev_list, iodev, entry);
>               }
>               ;
> 
> 

Reply via email to