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@xxxxxxxxxx> > --- > > 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list