[libvirt] [PATCH v1 6/6] ivshmem: add start param to server attribute
David Marchand
david.marchand at 6wind.com
Thu Aug 28 12:26:38 UTC 2014
On 08/28/2014 12:34 PM, Martin Kletzander wrote:
>
> Great! Really, and it's even easier than what I thought of. We just
> need to kill the server if we fail to start QEMU after starting the
> server.
>
> There is one caveat, though. There is a race between libvirt checking
> whether the socket exists and last domain disconnecting. We also need
> to be sure that the server is running and accepts the connection from
> QEMU. And we need to be able to specify the SELinux context of the
> socket before it is created. Adding SELinux support into
> ivshmem-server would be too much, however.
>
> Second and third points could be completely eliminated by the server
> accepting LISTEN_FDS environment variable which would say that libvirt
> is passing an FD with the socket already opened (libvirt would be sure
> QEMU is already connected to the socket, and it would take care of the
> permissions). To see how this works you can have a looks at our
> daemon code for libvirtd or virtlock, but even easier would probably
> be to check systemd's documentation on socket activation (even though
> this has nothing to do with systemd). I coded it up without systemd
> based on:
>
> http://www.freedesktop.org/software/systemd/man/sd_listen_fds.html
>
> and some other pages. Trying to understand it from libvirt sources
> might be an overkill.
>
> I'm not sure, though, what to do with the first point (race between
> libvirt creating the socket to see that it exists and ivshmem
> disconnecting). Maybe libvirt could do this (if QEMU would support
> it):
>
> 1: try to create the socket (if it exists, continue with 4)
>
> 2: connect to the socket
>
> 3: if connecting fails, goto 1;
>
> 4: if libvirt was the one who created the socket, start the server
> and pass the FD of the socket to it
>
> 5: start qemu and pass the socket to it (qemu already supports that
> with other devices like netdevs, etc.
>
> This would take care of all three points. No race, no permission
> issues, nothing.
>
> What do you think?
- Mmm, I had felt that there could be a race in the socket check, yes.
The LISTEN_FDS support in the server is not that big of a change.
I think I can take care of that.
- Did not think of the other points.
I think there is still some problem with your proposition, I need more
time to think about it (may be some prototyping to be sure).
>
>>
>> [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 ?
>>
>
> Disregard this comment, our above idea takes care of anything I might
> have meant in here :)
Yes, I thought so, no problem.
Thanks Martin.
--
David Marchand
More information about the libvir-list
mailing list