[libvirt] [PATCH v1 6/6] ivshmem: add start param to server attribute
David Marchand
david.marchand at 6wind.com
Thu Aug 28 08:34:11 UTC 2014
Hello Martin,
On 08/26/2014 11:33 AM, Martin Kletzander wrote:
> [Cc'ing David due to some questions/ideas about the ivshmem server]
>
>> @@ -5120,6 +5121,12 @@ qemuBuildIvshmemCommandLine(virCommandPtr cmd,
>> return -1;
>> virCommandAddArg(cmd, devstr);
>> VIR_FREE(devstr);
>> +
>> + if (ivshmem->server.start == VIR_TRISTATE_BOOL_YES) {
>> + if (virStartIvshmemServer(dev->name,
>> ivshmem->server.path,
>> + ivshmem->size,
>> ivshmem->msi.vectors))
>> + return -1;
>> + }
>> }
>
> What if the server is already running? Either 2 domains have server
> start='yes' or the user started it already. We should not fail in
> these cases, I guess.
>
[snip]
>
> It would be great if the domain with server start='yes' didn't have to
> be started first and killed last. Or if we could just signal the
> server (let's say SIGUSR1) that it should unlink the shmem and quit if
> no domains are connected. That way we could just send a signal to the
> server whenever any domain is disconnecting (maybe some check that no
> domain is being started might be good too ;) ).
Why not.
If we want to automagically start/stop the server, we don't need the
'start' field, but we need a way to find if a server is running for this
shared mem instance.
We can try to bind the unix socket and check if a EADDRINUSE is returned.
If EADDRINUSE, server is running, nothing to do.
Else libvirt starts the server with the option "-q" (new option I can
add which means "quit on last client disconnect")
On stop, libvirt does nothing about the ivshmem-server.
With this, if the server had been started with "-q" (by libvirt or by
the user), then the server will quit on the last disconnect.
If the user did not start the server with -q, it is his reponsibility to
stop it.
The 'start' field can disappear.
No need to send any signal to ivshmem-server.
What do you think of this ?
[snip]
>> +/**
>> + * virStopIvshmemServer:
>> + * @shm_name: the name of the shared memory
>> + *
>> + * Stop an Ivshmem Server
>> + *
>> + * Returns 0 in case of success or -1 in case of failure.
>> + */
>> +int
>> +virStopIvshmemServer(const char *shm_name)
>> +{
>> + char *ivshmserver_pidbase = NULL;
>> + pid_t ivshmserver_pid;
>> + int ret = -1;
>> +
>> + /* get pid of the ivshmem server */
>> + if (!(ivshmserver_pidbase =
>> virIvshmemServerPidFileBasename(shm_name)))
>> + goto cleanup;
>> + if (virPidFileRead(IVSHMEM_STATE_DIR, ivshmserver_pidbase,
>> + &ivshmserver_pid))
>> + goto cleanup;
>> +
>> + virProcessKill(ivshmserver_pid, SIGTERM);
>> + virPidFileDelete(IVSHMEM_STATE_DIR, ivshmserver_pidbase);
>
> The pidfile support could be added to the server too, maybe...
I am not sure I understand the point.
The only thing this code does here is retrieve the current pid for the
ivshmem-server, it kills the associated pid then remove the pidfile.
So what do you mean by "pidfile support" ?
Do you suggest that, on exit, the ivshmem-server should remove the
pidfile it first created ?
--
David Marchand
More information about the libvir-list
mailing list