On 09/09/2010 11:25 AM, Jeremy Fitzhardinge wrote:
> On 09/10/2010 12:40 AM, Daniel De Graaf wrote:
>> On 09/09/2010 05:27 AM, Jun Zhu (Intern) wrote:
>>> Is it related to the following patch? The following patch fixes the problem
>>> of queue deletion.
>> Yes, this would have caused a zero return due to an empty item being left
>> in the queue. It's likely my patch is not needed with this one applied; we
>> are already careful to avoid adding zero-length elements to the queue,
>> which was my original idea for the cause.
>
> No, that's a separate issue. This patch fixes the case where the
> usermode buffer is near a page boundary so the copy to usermode is
> truncated.
>
> Anyway, I've applied both.
>
> J
One or both of these patches are needed in the 2.6.37 kernel; I have
observed a zero return from a read() on xenbus on 2.6.37-rc8 that is
fixed by this patch.
>>> diff --git a/drivers/xen/xenfs/xenbus.c b/drivers/xen/xenfs/xenbus.c
>>> index 64b3be4..763e90d 100644
>>> --- a/drivers/xen/xenfs/xenbus.c
>>> +++ b/drivers/xen/xenfs/xenbus.c
>>> @@ -143,7 +143,7 @@ static ssize_t xenbus_file_read(struct file *filp,
>>> i += sz - ret;
>>> rb->cons += sz - ret;
>>>
>>> - if (ret != sz) {
>>> + if (ret != 0) {
>>> if (i == 0)
>>> i = -EFAULT;
>>> goto out;
>>>
>>> Jun Zhu
>>> Citrix Systems UK
>>> ________________________________________
>>> From: Daniel De Graaf [dgdegra@xxxxxxxxxxxxx]
>>> Sent: 08 September 2010 18:10
>>> To: Jeremy Fitzhardinge
>>> Cc: xen-devel; Jun Zhu (Intern)
>>> Subject: [PATCH] xenbus: avoid zero returns from read()
>>>
>>> It is possible to get a zero return from read() in instances where the
>>> queue is not empty but has no elements with data to deliver to the user.
>>> Since a zero return from read is an error indicator, resume waiting or
>>> return -EAGAIN (for a nonblocking fd) in this case.
>>>
>>> Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
>>>
>>> ---
>>> diff --git a/drivers/xen/xenfs/xenbus.c b/drivers/xen/xenfs/xenbus.c
>>> index 88c87c9..0ddef43 100644
>>> --- a/drivers/xen/xenfs/xenbus.c
>>> +++ b/drivers/xen/xenfs/xenbus.c
>>> @@ -121,6 +121,7 @@ static ssize_t xenbus_file_read(struct file *filp,
>>> int ret;
>>>
>>> mutex_lock(&u->reply_mutex);
>>> +again:
>>> while (list_empty(&u->read_buffers)) {
>>> mutex_unlock(&u->reply_mutex);
>>> if (filp->f_flags & O_NONBLOCK)
>>> @@ -159,6 +160,8 @@ static ssize_t xenbus_file_read(struct file *filp,
>>> struct read_buffer, list);
>>> }
>>> }
>>> + if (i == 0)
>>> + goto again;
>>>
>>> out:
>>> mutex_unlock(&u->reply_mutex);
>>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
--
Daniel De Graaf
National Security Agency
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|