[libvirt] [PATCH] test_driver: implement virDomainSendProcessSignal
Erik Skultety
eskultet at redhat.com
Fri Jun 14 08:07:25 UTC 2019
On Thu, Jun 13, 2019 at 02:20:22PM +0200, Ilias Stamatis wrote:
> On Thu, Jun 13, 2019 at 10:20 AM Erik Skultety <eskultet at redhat.com> wrote:
> >
> > On Tue, Jun 04, 2019 at 03:17:43PM +0200, Ilias Stamatis wrote:
> > > Only succeed when @pid_value is 1, since according to the docs this is
> >
> > Why do we need to restrict ourselves for @pid 1 in the test driver? This
> > restriction exists in LXC for a reason, but why in test driver?
> > a) it's only a check with @pid not being actually used
> > b) each guest OS will have their own limit in /proc/sys/kernel/pid_max for the
> > max number of PID so restricting it from the top doesn't make sense
> > c) - at pid is used for process groups, so again, this will be handled within the
> > guest OS in reality
>
> To my understanding if there's no process with such pid in the guest,
> this API will fail. If we succeed for any pid, that would mean that
> the test domain has 2^8 processes running and I wasn't sure if we
> wanted that. But yes, as I wrote as a "comment" in the initial patch
> this could as well make sense within test driver's scope so it's fine
> to remove the check.
Well, 2^8 isn't that bad is it? That's realistic, but long long is 64bit, so
2^63-1 that's a lot of PIDs, so you're right, it would feel weird, on the
other hand, looking at it from the perspective of an app developer, requiring
pid==1 is restrictive, if you allow any pid, you give them flexibility - PID
being filled from a dynamic data structure, so eventually, they're just simply
switch test driver for the real API, but that is my perspective, I don't want
to force it to upstream, we can wait for another opinion, one can say that if
they want to test with dynamic PIDs, use the real API.
Erik
>
> >
> > With the check removed:
> > Reviewed-by: Erik Skultety <eskultet at redhat.com>
> >
> > > the minimum requirement for any driver to implement this API.
> > >
> > > >From man 2 kill:
> > > The only signals that can be sent to process ID 1, the init process, are
> > > those for which init has explicitly installed signal handlers.
> > >
> > > Regarding sending SIGTERM and SIGKILL to init, the test driver domains
> > > pretend to run Linux, and on Linux init/systemd explicitly ignores these
> > > signals.
> > >
> > > Correspondingly, we can assume that no signal handlers are installed for
> > > any other signal and succeed by doing nothing.
> > >
> > > Signed-off-by: Ilias Stamatis <stamatis.iliass at gmail.com>
> > > ---
> > >
> > > Alternatively, we could succeed when @pid_value is any number or belongs
> > > to a set of specific numbers.
> > >
> > > src/test/test_driver.c | 35 +++++++++++++++++++++++++++++++++++
> > > 1 file changed, 35 insertions(+)
> > > mode change 100644 => 100755 src/test/test_driver.c
> > >
> > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> > > old mode 100644
> > > new mode 100755
> > > index cae2521b21..490a605a77
> > > --- a/src/test/test_driver.c
> > > +++ b/src/test/test_driver.c
> > > @@ -2825,6 +2825,40 @@ static int testDomainSetMetadata(virDomainPtr dom,
> > > return ret;
> > > }
> > >
> > > +static int
> > > +testDomainSendProcessSignal(virDomainPtr dom,
> > > + long long pid_value,
> > > + unsigned int signum,
> > > + unsigned int flags)
> > > +{
> > > + int ret = -1;
> > > + virDomainObjPtr vm = NULL;
> > > +
> > > + virCheckFlags(0, -1);
> > > +
> > > + if (pid_value != 1) {
> > > + virReportError(VIR_ERR_INVALID_ARG,
> > > + _("only sending a signal to pid 1 is supported"));
> > > + return -1;
> > > + }
> > > +
> > > + if (signum >= VIR_DOMAIN_PROCESS_SIGNAL_LAST) {
> > > + virReportError(VIR_ERR_INVALID_ARG,
> > > + _("signum value %d is out of range"),
> > > + signum);
> > > + return -1;
> > > + }
> > > +
> > > + if (!(vm = testDomObjFromDomain(dom)))
> > > + goto cleanup;
> > > +
> > > + /* do nothing */
> > > + ret = 0;
> > > +
> > > + cleanup:
> > > + virDomainObjEndAPI(&vm);
> > > + return ret;
> > > +}
> > >
> > > static int testNodeGetCellsFreeMemory(virConnectPtr conn,
> > > unsigned long long *freemems,
> > > @@ -7027,6 +7061,7 @@ static virHypervisorDriver testHypervisorDriver = {
> > > .domainScreenshot = testDomainScreenshot, /* 1.0.5 */
> > > .domainGetMetadata = testDomainGetMetadata, /* 1.1.3 */
> > > .domainSetMetadata = testDomainSetMetadata, /* 1.1.3 */
> > > + .domainSendProcessSignal = testDomainSendProcessSignal, /* 5.5.0 */
> > > .connectGetCPUModelNames = testConnectGetCPUModelNames, /* 1.1.3 */
> > > .domainManagedSave = testDomainManagedSave, /* 1.1.4 */
> > > .domainHasManagedSaveImage = testDomainHasManagedSaveImage, /* 1.1.4 */
> > > --
> > > 2.21.0
> > >
> > > --
> > > libvir-list mailing list
> > > libvir-list at redhat.com
> > > https://www.redhat.com/mailman/listinfo/libvir-list
More information about the libvir-list
mailing list