[PATCH] Flexible vcpu pinning configuration

Neel Natu neelnatu at gmail.com
Tue Apr 29 16:21:49 UTC 2014


Hi Roman,

On Sun, Apr 27, 2014 at 3:45 AM, Roman Bogorodskiy <novel at freebsd.org> wrote:
> I've created an initial version of the patch which allows more flexible
> vcpu pinning configuration.
>
> Current schema is:
>
> bhyve -p N
>
> pins vcpu i to hostcpu N + i.
>
> The propsed extension is:
>
> bhyve -p N:M .... -p 0:1 -p 3:5
>
> which pins vcpu N to host pcpu M. Option needs to be specified
> individually for each vcpu.
>
> So it works like that for me:
>
> sudo /usr/sbin/bhyve -p 0:0 -p 1:3 -c 2 ...
>
> # sudo cpuset -g -t 100262
> tid 100262 mask: 0
> # sudo cpuset -g -t 100264
> tid 100264 mask: 3
>
> PS I used cpumat_t* array to store these values instead of int, because
> if the idea is OK, I'll extend it to support ranges like e.g. cpuset(1)
> supports, e.g.: "1:2-5".
>
> The questions are:
>
>  - Is it OK to chance '-p' arg syntax or it's better to introduce a new
>    one?
>

I think we can reuse the "-p" option unless anybody objects vociferously.

>  - Is the syntax OK (currently: 'vcpu:pcpu', later
>    'vcpu:pcpuN-pcpuM,pcpuX")?

Yup, I think that works fine.

The patch looks good in general but I have a few comments:

- Scope of 'vcpupmap[]' should be restricted to 'static'.

- usage() and man page need to be updated.

- pincpu_parse():
The option parsing can be made much easier by using:

  if (sscanf(str, "%d:%d", &vcpu, &pcpu) == 2) {
          /* success */
  } else {
          return (-1);
  }

If the same vcpu is specified multiple times then we should
malloc(sizeof(cpuset_t)) only the first time:

  if (vcpumap[vcpu] != NULL)
          mask = vcpumap[vcpu];
  else
          mask = malloc(sizeof(cpuset_t));

We need to range-check 'vcpu' before using it as an index into the
'vcpumap[]' array.

best
Neel

>
> Roman Bogorodskiy


More information about the freebsd-virtualization mailing list