On Fri, Apr 10, 2015 at 17:36:27 -0400, John Ferlan wrote: > https://bugzilla.redhat.com/show_bug.cgi?id=1161617 > > Add command to allow adding and removing IOThreads from the domain including > the configuration and live domain. > > $ virsh iothreadadd --help > NAME > iothreadadd - add an IOThread to the guest domain > > SYNOPSIS > iothreadadd <domain> <id> [--name <string>] [--config] [--live] [--current] > > DESCRIPTION > Add an IOThread to the guest domain. > > OPTIONS > [--domain] <string> domain name, id or uuid > [--id] <number> iothread for the new IOThread > --name <string> a name for the new IOThread > --config affect next boot > --live affect running domain > --current affect current domain > > $ virsh iothreaddel --help > NAME > iothreaddel - delete an IOThread from the guest domain > > SYNOPSIS > iothreaddel <domain> <id> [--config] [--live] [--current] > > DESCRIPTION > Delete an IOThread from the guest domain. > > OPTIONS > [--domain] <string> domain name, id or uuid > [--id] <number> iothread_id for the IOThread to delete > --config affect next boot > --live affect running domain > --current affect current domain > > Assuming a running $dom with multiple IOThreads assigned and that > that the $dom has disks assigned to IOThread 1 and IOThread 2: > > $ virsh iothreadinfo $dom > IOThread ID CPU Affinity > --------------------------------------------------- > 1 2 > 2 3 > 3 0-1 > > $ virsh iothreadadd $dom 1 > error: invalid argument: an IOThread is already using iothread_id '1' in iothreadpids > > $ virsh iothreadadd $dom 1 --config > error: invalid argument: an IOThread is already using iothread_id '1' in persistent iothreadids > > $ virsh iothreadadd $dom 4 > $ virsh iothreadinfo $dom > IOThread ID CPU Affinity > --------------------------------------------------- > 1 2 > 2 3 > 3 0-1 > 4 0-3 > > $ virsh iothreadinfo $dom --config > IOThread ID CPU Affinity > --------------------------------------------------- > 1 2 > 2 3 > 3 0-1 > > $ virsh iothreadadd $dom 4 --config > $ virsh iothreadinfo $dom --config > IOThread ID CPU Affinity > --------------------------------------------------- > 1 2 > 2 3 > 3 0-1 > 4 0-3 > > $ virsh iothreadadd $dom 5 userdisk > $ virsh qemu-monitor-command $dom '{"execute":"query-iothreads"}' > {"return":[{"thread-id":17889,"id":"iothread1"},{"thread-id":17890,"id":"iothread2"},{"thread-id":17892,"id":"iothread3"},{"thread-id":17893,"id":"iothread4"},{"thread-id":18108,"id":"userdisk_iothread5"}],"id":"libvirt-104"} > > $ virsh iothreaddel $dom 5 userdisk > > Assuming the same original configuration > > $ virsh iothreaddel $dom 1 > error: invalid argument: cannot remove IOThread 1 since it is being used by disk path '/home/vm-images/f18' > > $ virsh iothreaddel $dom 3 > > $ virsh iothreadinfo $dom > IOThread ID CPU Affinity > --------------------------------------------------- > 1 2 > 2 3 > > $ virsh iothreadinfo $dom --config > IOThread ID CPU Affinity > --------------------------------------------------- > 1 2 > 2 3 > 3 0-1 > > Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> > --- > tools/virsh-domain.c | 174 +++++++++++++++++++++++++++++++++++++++++++++++++++ > tools/virsh.pod | 32 ++++++++++ > 2 files changed, 206 insertions(+) > > diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c > index 928360c..37836ce 100644 > --- a/tools/virsh-domain.c > +++ b/tools/virsh-domain.c > @@ -6977,6 +6977,168 @@ cmdIOThreadPin(vshControl *ctl, const vshCmd *cmd) > } > > /* > + * "iothreadadd" command > + */ > +static const vshCmdInfo info_iothreadadd[] = { > + {.name = "help", > + .data = N_("add an IOThread to the guest domain") > + }, > + {.name = "desc", > + .data = N_("Add an IOThread to the guest domain.") > + }, > + {.name = NULL} > +}; > + > +static const vshCmdOptDef opts_iothreadadd[] = { > + {.name = "domain", > + .type = VSH_OT_DATA, > + .flags = VSH_OFLAG_REQ, > + .help = N_("domain name, id or uuid") > + }, > + {.name = "id", > + .type = VSH_OT_INT, > + .flags = VSH_OFLAG_REQ, > + .help = N_("iothread for the new IOThread") > + }, > + {.name = "name", > + .type = VSH_OT_STRING, > + .help = N_("a name for the new IOThread") > + }, > + {.name = "config", > + .type = VSH_OT_BOOL, > + .help = N_("affect next boot") > + }, > + {.name = "live", > + .type = VSH_OT_BOOL, > + .help = N_("affect running domain") > + }, > + {.name = "current", > + .type = VSH_OT_BOOL, > + .help = N_("affect current domain") > + }, > + {.name = NULL} > +}; > + > +static bool > +cmdIOThreadAdd(vshControl *ctl, const vshCmd *cmd) > +{ > + virDomainPtr dom; > + int iothread_id = 0; > + const char *name_option = NULL; > + bool ret = false; > + bool config = vshCommandOptBool(cmd, "config"); > + bool live = vshCommandOptBool(cmd, "live"); > + bool current = vshCommandOptBool(cmd, "current"); > + unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT; > + > + VSH_EXCLUSIVE_OPTIONS_VAR(current, live); > + VSH_EXCLUSIVE_OPTIONS_VAR(current, config); > + > + if (config) > + flags |= VIR_DOMAIN_AFFECT_CONFIG; > + if (live) > + flags |= VIR_DOMAIN_AFFECT_LIVE; > + > + if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) > + return false; > + > + if (vshCommandOptInt(cmd, "id", &iothread_id) < 0 || iothread_id <= 0) { > + vshError(ctl, _("Invalid IOThread id value: '%d'"), iothread_id); > + goto cleanup; > + } > + > + if (vshCommandOptStringReq(ctl, cmd, "name", &name_option) < 0) { vshCommandOptStringReq should already report a sane error. > + vshError(ctl, "%s", _("Unable to parse 'name' parameter")); > + goto cleanup; > + } > + > + if (virDomainAddIOThread(dom, iothread_id, name_option, flags) < 0) > + goto cleanup; > + > + ret = true; > + > + cleanup: > + virDomainFree(dom); > + return ret; > +} > + > +/* > + * "iothreaddel" command > + */ > +static const vshCmdInfo info_iothreaddel[] = { > + {.name = "help", > + .data = N_("delete an IOThread from the guest domain") > + }, > + {.name = "desc", > + .data = N_("Delete an IOThread from the guest domain.") > + }, > + {.name = NULL} > +}; > + > +static const vshCmdOptDef opts_iothreaddel[] = { > + {.name = "domain", > + .type = VSH_OT_DATA, > + .flags = VSH_OFLAG_REQ, > + .help = N_("domain name, id or uuid") > + }, > + {.name = "id", > + .type = VSH_OT_INT, > + .flags = VSH_OFLAG_REQ, > + .help = N_("iothread_id for the IOThread to delete") > + }, > + {.name = "config", > + .type = VSH_OT_BOOL, > + .help = N_("affect next boot") > + }, > + {.name = "live", > + .type = VSH_OT_BOOL, > + .help = N_("affect running domain") > + }, > + {.name = "current", > + .type = VSH_OT_BOOL, > + .help = N_("affect current domain") > + }, > + {.name = NULL} > +}; Looks good. Peter
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list