[PATCH v4 2/2] cobalt/rtdm: allow for device teardown

Philippe Gerum rpm at xenomai.org
Fri Aug 30 19:16:53 CEST 2019


On 8/30/19 6:58 PM, Jan Kiszka wrote:
> On 30.08.19 18:03, Philippe Gerum wrote:
>> Currently, rtdm_dev_unregister() will hang soft until all references
>> on the dismantled device have been dropped, which in turn cannot
>> happen until all rtdm_fds on the device have been closed, which cannot
>> happen until all references on those fds have been dropped eventually.
>> Unfortunately, applications have no indication that such teardown has
>> been requested, and keep sleeping on I/O channels managed by the
>> dismantled device, which prevents rtdm_dev_unregister() from
>> completing.
>>
>> Allow for orderly device teardown by tracking all file descriptors
>> representing connections active on a device, forcing each of them down
>> by calling the driver's close() handler from rtdm_dev_unregister().
>> Since a close() handler should abort any ongoing I/O operation on the
>> channel being dismantled, any blocking I/O call on such channel should
>> return on error with no additional change to the existing drivers. The
>> common error code indicating an aborted I/O operation in this case is
>> EBADF.
>>
>> Upon receiving the error, the application is expected to close the
>> stale file descriptor and/or exit, which would drop the corresponding
>> file reference.
>>
>> Stale file descriptors lingering in applications will still prevent
>> driver modules serving them from unloading until they are eventually
>> closed. Subsequent operations on a file descriptor connected to a
>> device which is being torn now down lead to the EBADF error.
>>
>> Signed-off-by: Philippe Gerum <rpm at xenomai.org>
>> ---
>>   include/cobalt/kernel/list.h        |  2 +-
>>   include/cobalt/kernel/rtdm/driver.h |  1 +
>>   include/cobalt/kernel/rtdm/fd.h     |  2 ++
>>   kernel/cobalt/rtdm/core.c           | 25 ++++++++++++++++++++-----
>>   kernel/cobalt/rtdm/device.c         | 24 ++++++++++++++++++++++--
>>   kernel/cobalt/rtdm/fd.c             | 13 +++++++++++--
>>   kernel/cobalt/rtdm/internal.h       |  6 ++++++
>>   7 files changed, 63 insertions(+), 10 deletions(-)
>>
>> diff --git a/include/cobalt/kernel/list.h b/include/cobalt/kernel/list.h
>> index 989d934b8..37b91b0d5 100644
>> --- a/include/cobalt/kernel/list.h
>> +++ b/include/cobalt/kernel/list.h
>> @@ -45,7 +45,7 @@ do {                                        \
>>     ({                                \
>>         __type *__item;                    \
>>         __item = list_first_entry(__head, __type, __member);    \
>> -      list_del(&__item->__member);                \
>> +      list_del(&(__item)->__member);            \
> 
> Not really needed, is it? Just trying to understand.
> 

No, just overlooked the declaration scope of the variable.

-- 
Philippe.



More information about the Xenomai mailing list