]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
hv_netvsc: avoid repeated updates of packet filter
authorStephen Hemminger <stephen@networkplumber.org>
Wed, 7 Mar 2018 21:49:10 +0000 (13:49 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 8 Mar 2018 17:48:56 +0000 (12:48 -0500)
The netvsc driver can get repeated calls to netvsc_rx_mode during
network setup; each of these calls ends up scheduling the lower
layers to update tha packet filter. This update requires an
request/response to the host. So avoid doing this if we already
know that the correct packet filter value is set.

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/hyperv/hyperv_net.h
drivers/net/hyperv/rndis_filter.c

index 0db3bd1ea06f5a71eb6fc67ba00abb066c7f3414..cd538d5a7986104e8a660c8416a14bf5b62c23b0 100644 (file)
@@ -173,6 +173,7 @@ struct rndis_device {
        struct list_head req_list;
 
        struct work_struct mcast_work;
+       u32 filter;
 
        bool link_state;        /* 0 - link up, 1 - link down */
 
index 411a3aee39b2fac5f6d5867559a75800a76fbdca..00ec80c23fe5d8f941199fa3bcb3112ef92f0b7a 100644 (file)
@@ -825,13 +825,15 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
        struct rndis_set_request *set;
        int ret;
 
+       if (dev->filter == new_filter)
+               return 0;
+
        request = get_rndis_request(dev, RNDIS_MSG_SET,
                        RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
                        sizeof(u32));
        if (!request)
                return -ENOMEM;
 
-
        /* Setup the rndis set */
        set = &request->request_msg.msg.set_req;
        set->oid = RNDIS_OID_GEN_CURRENT_PACKET_FILTER;
@@ -842,8 +844,10 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
               &new_filter, sizeof(u32));
 
        ret = rndis_filter_send_request(dev, request);
-       if (ret == 0)
+       if (ret == 0) {
                wait_for_completion(&request->wait_event);
+               dev->filter = new_filter;
+       }
 
        put_rndis_request(dev, request);