[libvirt] [libvirt-perl PATCH] Add virDomainGetIOThreads and virDomainPinIOThread bindings
Daniel P. Berrange
berrange at redhat.com
Mon Mar 9 10:06:28 UTC 2015
On Fri, Mar 06, 2015 at 02:26:51PM -0500, John Ferlan wrote:
> Test results in the following output:
>
> $ perl examples/iothreadsinfo.pl
> Addr
> VMM type: QEMU
> ...
> Domain: {
> ID: 2 'f18iothr'
> UUID: fb9f7826-b5d7-4f74-b962-7181ef3fc9ec
> IOThread: {
> affinity: 0010
> number: 1
> }
> IOThread: {
> affinity: 0001
> number: 2
> }
> IOThread: {
> affinity: 1100
> number: 3
> }
> }
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>
> Figured I'd post these just to have them "ready" once the pinning options
> for IOThreads are done being reviewed. Also running the Perl bindings did
> find one issue regarding the already pushed GetIOThreadsInfo with respect
> to ReadOnly bit checking (when it shouldn't have been) - a patch to resolve
> that has been posted as well.
>
> Changes | 4 ++++
> Virt.xs | 43 +++++++++++++++++++++++++++++++++++++++++++
> examples/iothreadsinfo.pl | 36 ++++++++++++++++++++++++++++++++++++
> lib/Sys/Virt/Domain.pm | 17 +++++++++++++++++
> 4 files changed, 100 insertions(+)
> create mode 100644 examples/iothreadsinfo.pl
>
> diff --git a/Changes b/Changes
> index b62ee24..f3e2f83 100644
> --- a/Changes
> +++ b/Changes
> @@ -1,5 +1,9 @@
> Revision history for perl module Sys::Virt
>
> +1.2.14 2015-03-06
> +
> + - Add virDomainGetIOThreads and virDomainPinIOThread API bindings
> +
> 1.2.14 2015-00-00
>
> - XXX
Actually just replace this placeholder XXXX here & the date is something
I don't set untill day of release.
> diff --git a/Virt.xs b/Virt.xs
> index f9ec7a4..15d48f7 100644
> --- a/Virt.xs
> +++ b/Virt.xs
> @@ -5014,6 +5014,49 @@ get_emulator_pin_info(dom, flags=0)
> RETVAL
>
>
> +void
> +get_iothread_info(dom, flags=0)
> + virDomainPtr dom;
> + unsigned int flags;
> + PREINIT:
> + virDomainIOThreadInfoPtr *iothrinfo;
> + int niothreads;
> + int i;
> + PPCODE:
> + if ((niothreads = virDomainGetIOThreadsInfo(dom, &iothrinfo,
> + flags)) < 0)
> + _croak_error();
> +
> + EXTEND(SP, niothreads);
> + for (i = 0 ; i < niothreads ; i++) {
> + HV *rec = newHV();
> + (void)hv_store(rec, "number", 6,
> + newSViv(iothrinfo[i]->iothread_id), 0);
> + (void)hv_store(rec, "affinity", 8,
> + newSVpvn((char*)iothrinfo[i]->cpumap,
> + iothrinfo[i]->cpumaplen), 0);
> + PUSHs(newRV_noinc((SV *)rec));
> + }
> +
> + if (iothrinfo)
> + Safefree(iothrinfo);
Shouldn't need the 'if()' here as it should cope with NULL fine
> +
> +
> +void
> +pin_iothread(dom, iothread_id, mask, flags=0)
> + virDomainPtr dom;
> + unsigned int iothread_id;
> + SV *mask;
> + unsigned int flags;
> +PREINIT:
> + STRLEN masklen;
> + unsigned char *maps;
> + PPCODE:
> + maps = (unsigned char *)SvPV(mask, masklen);
> + if (virDomainPinVcpuFlags(dom, iothread_id, maps, masklen, flags) < 0)
> + _croak_error();
> +
> +
> int
> num_of_snapshots(dom, flags=0)
> virDomainPtr dom;
> diff --git a/examples/iothreadsinfo.pl b/examples/iothreadsinfo.pl
> new file mode 100644
> index 0000000..c527e8c
> --- /dev/null
> +++ b/examples/iothreadsinfo.pl
> @@ -0,0 +1,36 @@
> +# -*- perl -*-
> +use strict;
> +use warnings;
> +use Sys::Virt;
> +
> +my $addr = @ARGV ? shift @ARGV : "";
> +print "Addr $addr\n";
> +my $con = Sys::Virt->new(address => $addr, readonly => 1);
> +
> +print "VMM type: ", $con->get_type(), "\n";
> +
> +foreach my $dom (sort { $a->get_id <=> $b->get_id } $con->list_all_domains) {
> + print "Domain: {\n";
> + print " ID: ", $dom->get_id(), " '" , $dom->get_name(), "'\n";
> + print " UUID: ", $dom->get_uuid_string(), "\n";
> + my $nodeinfo = $con->get_node_info;
> + my @info = $dom->get_iothread_info(Sys::Virt::Domain::AFFECT_CONFIG);
> +
> + foreach my $info (@info) {
> + print " IOThread: {\n";
> + foreach (sort { $a cmp $b } keys %{$info}) {
> + if ($_ eq "affinity") {
> + print " ", $_, ": ";
> + my @mask = split //, $info->{$_};
> + for (my $p = 0 ; $p < $nodeinfo->{cpus} ; $p++) {
> + print ((ord($mask[$p/8]) & (1 << ($p % 8))) ? 1 : 0);
> + }
These 4 lines can be replaced with use of unpack as the API docs describe
@bits = split(//, unpack("b*", $newmask));
print join ("," @bits), "\n";
> + print "\n";
> + } else {
> + print " ", $_, ": ", $info->{$_}, "\n";
> + }
> + }
> + print " }\n";
> + }
> + print "}\n";
> +}
> diff --git a/lib/Sys/Virt/Domain.pm b/lib/Sys/Virt/Domain.pm
> index 5c8ef47..062c012 100644
> --- a/lib/Sys/Virt/Domain.pm
> +++ b/lib/Sys/Virt/Domain.pm
> @@ -1216,6 +1216,23 @@ the physical CPUa, 8 cpus per character. To create a suitable
> bitstring, use the C<vec> function with a value of C<1> for the
> C<BITS> parameter.
>
> +=item @iothreadinfo = $dom->get_iothread_info($flags=0)
> +
> +Obtain information about the state of all IOThreads in a running
> +guest domain. The returned list will have one element for each IOThread,
> +where each elements contains a hash reference. The keys in the hash
> +are, C<number> the IOThread number and C<affinity> giving the allowed
> +schedular placement. The value for C<affinity> is a
> +string representing a bitmask against physical CPUs, 8 cpus per
> +character. To extract the bits use the C<unpack> function with
> +the C<b*> template.
> +
> +=item $dom->pin_iothread($iothread, $mask)
> +
> +Pin the IOThread given by index C<$iothread> to physical CPUs
> +given by C<$mask>. The C<$mask> is a string representing a bitmask
> +against physical CPUs, 8 cpus per character.
> +
> =item my @stats = $dom->get_cpu_stats($startCpu, $numCpus, $flags=0)
>
> Requests the guests host physical CPU usage statistics, starting
Excellant, that looks great - ACK with those couple of nitpicks fixed.
Push once the actual APIs are pushed in libvirt.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list