On Tue, Mar 10, 2015 at 11:04:00AM -0400, 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(a)redhat.com>
---
Changes | 2 +-
Virt.xs | 42 ++++++++++++++++++++++++++++++++++++++++++
examples/iothreadsinfo.pl | 33 +++++++++++++++++++++++++++++++++
lib/Sys/Virt/Domain.pm | 17 +++++++++++++++++
4 files changed, 93 insertions(+), 1 deletion(-)
create mode 100644 examples/iothreadsinfo.pl
diff --git a/Changes b/Changes
index b62ee24..88f648c 100644
--- a/Changes
+++ b/Changes
@@ -2,7 +2,7 @@ Revision history for perl module Sys::Virt
1.2.14 2015-00-00
- - XXX
+ - Add virDomainGetIOThreads and virDomainPinIOThread API bindings
1.2.13 2015-03-05
diff --git a/Virt.xs b/Virt.xs
index f9ec7a4..56e143d 100644
--- a/Virt.xs
+++ b/Virt.xs
@@ -5014,6 +5014,48 @@ 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));
+ }
+
+ Safefree(iothrinfo);
+
+
+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..97c5eb6
--- /dev/null
+++ b/examples/iothreadsinfo.pl
@@ -0,0 +1,33 @@
+# -*- 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 @bits = split(//, unpack("b$nodeinfo->{cpus}",
$info->{$_}));
+ print join ("", @bits), "\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
--
ACK
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 :|