RE: [PATCH net] hyperv: Fix the error processing in netvsc_send()

From: Jason Wang
Date: Mon Feb 02 2015 - 01:49:49 EST




On Fri, Jan 30, 2015 at 11:05 PM, Haiyang Zhang <haiyangz@xxxxxxxxxxxxx> wrote:


-----Original Message-----
From: Jason Wang [mailto:jasowang@xxxxxxxxxx]
Sent: Friday, January 30, 2015 5:25 AM
> + if (ret != 0) {
> + if (section_index != NETVSC_INVALID_INDEX)
> + netvsc_free_send_slot(net_device, section_index);
What if ret is -EINVAL or -ENOSPC? Looks like we need free the skb in
this case also.

In these cases, skb is freed in netvsc_start_xmit().


>
> + } else if (skb) {
> + dev_kfree_skb_any(skb);
The caller - netvsc_start_xmit() do this also, may be handle this in
caller is better since netvsc_start_xmit() is the only user that tries
to send a skb?

When the packet is sent out normally, we frees it in netvsc_send() if it's
copied to send-buffer. The free is done in netvsc_send(), because the copy
is also in this function. If it's not copied, it will be freed in another
function -- netvsc_xmit_completion().

netvsc_start_xmit() only does free skb in error case.

Ok.


btw, I find during netvsc_start_xmit(), ret was change to -ENOSPC when
queue_sends[q_idx] < 1. But non of the caller check -ENOSPC in fact?

In this case, we don't request re-send, so set ret to a value other than
-EAGAIN.

Why not? We have available slots for it to be sent now. Dropping the packet in this case may cause out of order sending.
It's handled in the same way as errors != -EAGAIN, so we don't
need to check this value specifically.

Thanks

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/