hv_netvsc: avoid repeated updates of packet filter
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>
This commit is contained in:
committed by
David S. Miller
parent
de3d50aadd
commit
7eeb4a6ee4
@ -173,6 +173,7 @@ struct rndis_device {
|
|||||||
struct list_head req_list;
|
struct list_head req_list;
|
||||||
|
|
||||||
struct work_struct mcast_work;
|
struct work_struct mcast_work;
|
||||||
|
u32 filter;
|
||||||
|
|
||||||
bool link_state; /* 0 - link up, 1 - link down */
|
bool link_state; /* 0 - link up, 1 - link down */
|
||||||
|
|
||||||
|
@ -825,13 +825,15 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
|
|||||||
struct rndis_set_request *set;
|
struct rndis_set_request *set;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (dev->filter == new_filter)
|
||||||
|
return 0;
|
||||||
|
|
||||||
request = get_rndis_request(dev, RNDIS_MSG_SET,
|
request = get_rndis_request(dev, RNDIS_MSG_SET,
|
||||||
RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
|
RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
|
||||||
sizeof(u32));
|
sizeof(u32));
|
||||||
if (!request)
|
if (!request)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
||||||
/* Setup the rndis set */
|
/* Setup the rndis set */
|
||||||
set = &request->request_msg.msg.set_req;
|
set = &request->request_msg.msg.set_req;
|
||||||
set->oid = RNDIS_OID_GEN_CURRENT_PACKET_FILTER;
|
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));
|
&new_filter, sizeof(u32));
|
||||||
|
|
||||||
ret = rndis_filter_send_request(dev, request);
|
ret = rndis_filter_send_request(dev, request);
|
||||||
if (ret == 0)
|
if (ret == 0) {
|
||||||
wait_for_completion(&request->wait_event);
|
wait_for_completion(&request->wait_event);
|
||||||
|
dev->filter = new_filter;
|
||||||
|
}
|
||||||
|
|
||||||
put_rndis_request(dev, request);
|
put_rndis_request(dev, request);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user