Commit 85101bda authored by YiFei Zhu's avatar YiFei Zhu Committed by Jakub Kicinski
Browse files

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: default avatarYiFei Zhu <zhuyifei@google.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20241219173004.2615655-1-zhuyifei@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a6ac6674
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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;
+3 −2
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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;
+3 −2
Original line number Diff line number Diff line
@@ -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;