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 <mar...@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

_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to