> -----Original Message----- > From: linux-kernel-owner@xxxxxxxxxxxxxxx <linux-kernel-owner@xxxxxxxxxxxxxxx> On Behalf > Of Haiyang Zhang > Sent: Thursday, March 22, 2018 12:01 PM > To: davem@xxxxxxxxxxxxx; netdev@xxxxxxxxxxxxxxx > Cc: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx>; KY Srinivasan <kys@xxxxxxxxxxxxx>; Stephen > Hemminger <sthemmin@xxxxxxxxxxxxx>; olaf@xxxxxxxxx; vkuznets@xxxxxxxxxx; > devel@xxxxxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx > Subject: [PATCH net-next,1/2] hv_netvsc: Fix the return status in RX path > > From: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx> > > As defined in hyperv_net.h, the NVSP_STAT_SUCCESS is one not zero. > Some functions returns 0 when it actually means NVSP_STAT_SUCCESS. > This patch fixes them. > > In netvsc_receive(), it puts the last RNDIS packet's receive status > for all packets in a vmxferpage which may contain multiple RNDIS > packets. > This patch puts NVSP_STAT_FAIL in the receive completion if one of > the packets in a vmxferpage fails. This patch changes the status field that is being reported back to the Hyper-V host in the receive completion message in enq_receive_complete(). The current code reports 0 on success, and with the patch, it will report 1 on success. So does this change affect anything on the Hyper-V side? Or is Hyper-V just ignoring the value? If this change doesn't have any impact on the interactions with Hyper-V, perhaps it would be good to explain why in the commit message. Michael > > Signed-off-by: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx> > --- > drivers/net/hyperv/netvsc.c | 8 ++++++-- > drivers/net/hyperv/netvsc_drv.c | 2 +- > drivers/net/hyperv/rndis_filter.c | 4 ++-- > 3 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c > index aa95e81af6e5..1ddb2c39b6e4 100644 > --- a/drivers/net/hyperv/netvsc.c > +++ b/drivers/net/hyperv/netvsc.c > @@ -1098,12 +1098,16 @@ static int netvsc_receive(struct net_device *ndev, > void *data = recv_buf > + vmxferpage_packet->ranges[i].byte_offset; > u32 buflen = vmxferpage_packet->ranges[i].byte_count; > + int ret; > > trace_rndis_recv(ndev, q_idx, data); > > /* Pass it to the upper layer */ > - status = rndis_filter_receive(ndev, net_device, > - channel, data, buflen); > + ret = rndis_filter_receive(ndev, net_device, > + channel, data, buflen); > + > + if (unlikely(ret != NVSP_STAT_SUCCESS)) > + status = NVSP_STAT_FAIL; > } > > enq_receive_complete(ndev, net_device, q_idx, > diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c > index cdb78eefab67..33607995be62 100644 > --- a/drivers/net/hyperv/netvsc_drv.c > +++ b/drivers/net/hyperv/netvsc_drv.c > @@ -818,7 +818,7 @@ int netvsc_recv_callback(struct net_device *net, > u64_stats_update_end(&rx_stats->syncp); > > napi_gro_receive(&nvchan->napi, skb); > - return 0; > + return NVSP_STAT_SUCCESS; > } > > static void netvsc_get_drvinfo(struct net_device *net, > diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c > index 2dc00f714482..591fb8080f11 100644 > --- a/drivers/net/hyperv/rndis_filter.c > +++ b/drivers/net/hyperv/rndis_filter.c > @@ -443,10 +443,10 @@ int rndis_filter_receive(struct net_device *ndev, > "unhandled rndis message (type %u len %u)\n", > rndis_msg->ndis_msg_type, > rndis_msg->msg_len); > - break; > + return NVSP_STAT_FAIL; > } > > - return 0; > + return NVSP_STAT_SUCCESS; > } > > static int rndis_filter_query_device(struct rndis_device *dev, > -- > 2.15.1 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel