[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