[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] tools: Refactor console/io.c to avoid using xc_domain_getinfo()
commit e522c98c30a9e911a2fb4ec07252ff90541aaddc Author: Alejandro Vallejo <alejandro.vallejo@xxxxxxxxx> AuthorDate: Fri Apr 28 11:41:20 2023 +0100 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Fri Apr 28 14:34:40 2023 +0100 tools: Refactor console/io.c to avoid using xc_domain_getinfo() It has 2 avoidable occurences * Check whether a domain is valid, which can be done faster with xc_domain_getinfo_single(). * Domain discovery, which can be done in a race-free way with the sysctl interface through xc_domain_getinfolist(). Signed-off-by: Alejandro Vallejo <alejandro.vallejo@xxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- tools/console/daemon/io.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c index 6bfe96715b..bb739bdb8c 100644 --- a/tools/console/daemon/io.c +++ b/tools/console/daemon/io.c @@ -405,13 +405,7 @@ static void buffer_advance(struct buffer *buffer, size_t len) static bool domain_is_valid(int domid) { - bool ret; - xc_dominfo_t info; - - ret = (xc_domain_getinfo(xc, domid, 1, &info) == 1 && - info.domid == domid); - - return ret; + return xc_domain_getinfo_single(xc, domid, NULL) == 0; } static int create_hv_log(void) @@ -961,24 +955,33 @@ static unsigned enum_pass = 0; static void enum_domains(void) { - int domid = 1; - xc_dominfo_t dominfo; + /* + * Memory set aside to query the state of every + * domain in the hypervisor in a single hypercall. + */ + static xc_domaininfo_t domaininfo[DOMID_FIRST_RESERVED - 1]; + + int ret; struct domain *dom; enum_pass++; - while (xc_domain_getinfo(xc, domid, 1, &dominfo) == 1) { - dom = lookup_domain(dominfo.domid); - if (dominfo.dying) { + /* Fetch info on every valid domain except for dom0 */ + ret = xc_domain_getinfolist(xc, 1, DOMID_FIRST_RESERVED - 1, domaininfo); + if (ret < 0) + return; + + for (size_t i = 0; i < ret; i++) { + dom = lookup_domain(domaininfo[i].domain); + if (domaininfo[i].flags & XEN_DOMINF_dying) { if (dom) shutdown_domain(dom); } else { if (dom == NULL) - dom = create_domain(dominfo.domid); + dom = create_domain(domaininfo[i].domain); } if (dom) dom->last_seen = enum_pass; - domid = dominfo.domid + 1; } } -- generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |