mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
sfc: Use netdev refcount tracking in struct efx_async_filter_insertion
I was debugging some netdev refcount issues in OpenOnload, and one of the places I was looking at was in the sfc driver. Only struct efx_async_filter_insertion was not using netdev refcount tracker, so add it here. GFP_ATOMIC because this code path is called by ndo_rx_flow_steer which holds RCU. This patch should be a no-op if !CONFIG_NET_DEV_REFCNT_TRACKER Signed-off-by: YiFei Zhu <zhuyifei@google.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Link: https://patch.msgid.link/20241219173004.2615655-1-zhuyifei@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
a6ac667467
commit
85101bda13
|
|
@ -831,6 +831,7 @@ struct efx_arfs_rule {
|
|||
/**
|
||||
* struct efx_async_filter_insertion - Request to asynchronously insert a filter
|
||||
* @net_dev: Reference to the netdevice
|
||||
* @net_dev_tracker: reference tracker entry for @net_dev
|
||||
* @spec: The filter to insert
|
||||
* @work: Workitem for this request
|
||||
* @rxq_index: Identifies the channel for which this request was made
|
||||
|
|
@ -838,6 +839,7 @@ struct efx_arfs_rule {
|
|||
*/
|
||||
struct efx_async_filter_insertion {
|
||||
struct net_device *net_dev;
|
||||
netdevice_tracker net_dev_tracker;
|
||||
struct efx_filter_spec spec;
|
||||
struct work_struct work;
|
||||
u16 rxq_index;
|
||||
|
|
|
|||
|
|
@ -897,7 +897,7 @@ static void efx_filter_rfs_work(struct work_struct *data)
|
|||
|
||||
/* Release references */
|
||||
clear_bit(slot_idx, &efx->rps_slot_map);
|
||||
dev_put(req->net_dev);
|
||||
netdev_put(req->net_dev, &req->net_dev_tracker);
|
||||
}
|
||||
|
||||
int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
|
||||
|
|
@ -989,7 +989,8 @@ int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
|
|||
}
|
||||
|
||||
/* Queue the request */
|
||||
dev_hold(req->net_dev = net_dev);
|
||||
req->net_dev = net_dev;
|
||||
netdev_hold(req->net_dev, &req->net_dev_tracker, GFP_ATOMIC);
|
||||
INIT_WORK(&req->work, efx_filter_rfs_work);
|
||||
req->rxq_index = rxq_index;
|
||||
req->flow_id = flow_id;
|
||||
|
|
|
|||
|
|
@ -753,6 +753,7 @@ struct efx_arfs_rule {
|
|||
/**
|
||||
* struct efx_async_filter_insertion - Request to asynchronously insert a filter
|
||||
* @net_dev: Reference to the netdevice
|
||||
* @net_dev_tracker: reference tracker entry for @net_dev
|
||||
* @spec: The filter to insert
|
||||
* @work: Workitem for this request
|
||||
* @rxq_index: Identifies the channel for which this request was made
|
||||
|
|
@ -760,6 +761,7 @@ struct efx_arfs_rule {
|
|||
*/
|
||||
struct efx_async_filter_insertion {
|
||||
struct net_device *net_dev;
|
||||
netdevice_tracker net_dev_tracker;
|
||||
struct efx_filter_spec spec;
|
||||
struct work_struct work;
|
||||
u16 rxq_index;
|
||||
|
|
|
|||
|
|
@ -888,7 +888,7 @@ static void efx_filter_rfs_work(struct work_struct *data)
|
|||
|
||||
/* Release references */
|
||||
clear_bit(slot_idx, &efx->rps_slot_map);
|
||||
dev_put(req->net_dev);
|
||||
netdev_put(req->net_dev, &req->net_dev_tracker);
|
||||
}
|
||||
|
||||
int efx_siena_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
|
||||
|
|
@ -980,7 +980,8 @@ int efx_siena_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
|
|||
}
|
||||
|
||||
/* Queue the request */
|
||||
dev_hold(req->net_dev = net_dev);
|
||||
req->net_dev = net_dev;
|
||||
netdev_hold(req->net_dev, &req->net_dev_tracker, GFP_ATOMIC);
|
||||
INIT_WORK(&req->work, efx_filter_rfs_work);
|
||||
req->rxq_index = rxq_index;
|
||||
req->flow_id = flow_id;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user