[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v5 09/13] xen/pvcalls: implement sendmsg



On 10/19/2017 09:41 PM, Stefano Stabellini wrote:
> On Tue, 17 Oct 2017, Boris Ostrovsky wrote:
>>> +static int __write_ring(struct pvcalls_data_intf *intf,
>>> +                   struct pvcalls_data *data,
>>> +                   struct iov_iter *msg_iter,
>>> +                   int len)
>>> +{
>>> +   RING_IDX cons, prod, size, masked_prod, masked_cons;
>>> +   RING_IDX array_size = XEN_FLEX_RING_SIZE(PVCALLS_RING_ORDER);
>>> +   int32_t error;
>>> +
>>> +   error = intf->out_error;
>>> +   if (error < 0)
>>> +           return error;
>>> +   cons = intf->out_cons;
>>> +   prod = intf->out_prod;
>>> +   /* read indexes before continuing */
>>> +   virt_mb();
>>> +
>>> +   size = pvcalls_queued(prod, cons, array_size);
>>> +   if (size >= array_size)
>>> +           return 0;
>>
>> I thought you were going to return an error here? If this can only be
>> due to someone messing up indexes is there a reason to continue trying
>> to write? What are the chances that the index will get corrected?
> Sorry, I forgot. I'll change it to return an error, maybe EFAULT.

I think EINVAL might be more appropriate. But either way you can tack on
my R-b to the patch.

-boris

>
>
>>> +   if (len > array_size - size)
>>> +           len = array_size - size;
>>> +
>>> +   masked_prod = pvcalls_mask(prod, array_size);
>>> +   masked_cons = pvcalls_mask(cons, array_size);
>>> +
>>> +   if (masked_prod < masked_cons) {
>>> +           copy_from_iter(data->out + masked_prod, len, msg_iter);
>>> +   } else {
>>> +           if (len > array_size - masked_prod) {
>>> +                   copy_from_iter(data->out + masked_prod,
>>> +                                  array_size - masked_prod, msg_iter);
>>> +                   copy_from_iter(data->out,
>>> +                                  len - (array_size - masked_prod),
>>> +                                  msg_iter);
>>> +           } else {
>>> +                   copy_from_iter(data->out + masked_prod, len, msg_iter);
>>> +           }
>>> +   }
>>> +   /* write to ring before updating pointer */
>>> +   virt_wmb();
>>> +   intf->out_prod += len;
>>> +
>>> +   return len;
>>> +}


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.