[systemd-devel] [PATCH kdbus] handle: Return POLLOUT | POLLWRNORM mask when no messages are pending
Marcel Holtmann
marcel at holtmann.org
Mon Aug 18 07:15:43 PDT 2014
Hi Lennart,
>>>> To facility the feature of doing an asynchronous sending of messages
>>>> when the bus is idle, make sure to return POLLOUT | POLLWRNORM from
>>>> kdbus_handle_poll.
>>>>
>>>> Signed-off-by: Marcel Holtmann <marcel at holtmann.org>
>>>> ---
>>>> handle.c | 2 ++
>>>> 1 file changed, 2 insertions(+)
>>>>
>>>> diff --git a/handle.c b/handle.c
>>>> index ac6868133280..fc15d28351b3 100644
>>>> --- a/handle.c
>>>> +++ b/handle.c
>>>> @@ -884,6 +884,8 @@ static unsigned int kdbus_handle_poll(struct file *file,
>>>> mask |= POLLERR | POLLHUP;
>>>> else if (!list_empty(&conn->msg_list))
>>>> mask |= POLLIN | POLLRDNORM;
>>>> + else
>>>> + mask |= POLLOUT | POLLWRNORM;
>>>
>>> Hmm, what's your use case here? list_empty(&conn->msg_list) only checks
>>> the incoming list of the current connection for pending messages. That
>>> doesn't tell you whether the bus is idle, or if your receiving end has
>>> messages pending ...
>>
>> if you are a good client citizen, then you only send messages when
>> POLLOUT gets signaled. That is what this is allowing now.
>>
>> Blindly sending messages is never a good idea. You want to poll for
>> POLLOUT first. This does not make a big difference for current kernel,
>> but it allows future extensions when the clients are well behaving and
>> just waiting for POLLOUT. Meaning once the kernel does not signal
>> POLLOUT, no new messages will come from the client.
>>
>> Current code does not do this POLLOUT before sending a messages, but
>> our kdbus client actually does that. It is the right thing to do. And
>> we have been doing this with all of our protocols that are using
>> asynchronous IO. No point in kdbus being any different.
>
> Well, kdbus keeps per-reciever buffers only, hence signalling on the
> kdbus fd when you are able to write is not really possible, since this
> information is not bound to the sender fd but only to the receiever of
> which there are many... If I understand you correctly you hence want the
> kdbus fd to always return EPOLLOUT then, because if a client wants to
> send something it can do that at any time?
>
> If that's the case then POLLOUT should really be ORed into the mask
> unconditionally, not just in some cases...
>
> So, I can sympathize with what you are trying to do. However, I think
> your patch doesn't do the right thing... It should really OR the POLLOUT
> into all masks always.
always returning POLLOUT is also fine. As long as the fd signals POLLOUT and not just swallows it.
Regards
Marcel
More information about the systemd-devel
mailing list