Messages in this thread | | | From | Haiyang Zhang <> | Subject | RE: [PATCH net] hyperv: Fix the error processing in netvsc_send() | Date | Fri, 30 Jan 2015 15:05:00 +0000 |
| |
> -----Original Message----- > From: Jason Wang [mailto:jasowang@redhat.com] > 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.
> 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. It's handled in the same way as errors != -EAGAIN, so we don't need to check this value specifically.
Thanks, - Haiyang
| |