Skip to content

Commit 429502f

Browse files
kuba-mooNipaLocal
authored and
NipaLocal
committed
net: avoid false positive warnings in __net_mp_close_rxq()
Commit under Fixes solved the problem of spurious warnings when we uninstall an MP from a device while its down. The __net_mp_close_rxq() which is used by io_uring was not fixed. Move the fix over and reuse __net_mp_close_rxq() in the devmem path. Fixes: a70f891 ("net: devmem: do not WARN conditionally after netdev_rx_queue_restart()") Signed-off-by: Jakub Kicinski <[email protected]> Acked-by: Stanislav Fomichev <[email protected]> Signed-off-by: NipaLocal <nipa@local>
1 parent 18d3f41 commit 429502f

File tree

2 files changed

+14
-15
lines changed

2 files changed

+14
-15
lines changed

net/core/devmem.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,21 +116,19 @@ void net_devmem_unbind_dmabuf(struct net_devmem_dmabuf_binding *binding)
116116
struct netdev_rx_queue *rxq;
117117
unsigned long xa_idx;
118118
unsigned int rxq_idx;
119-
int err;
120119

121120
if (binding->list.next)
122121
list_del(&binding->list);
123122

124123
xa_for_each(&binding->bound_rxqs, xa_idx, rxq) {
125-
WARN_ON(rxq->mp_params.mp_priv != binding);
126-
127-
rxq->mp_params.mp_priv = NULL;
128-
rxq->mp_params.mp_ops = NULL;
124+
const struct pp_memory_provider_params mp_params = {
125+
.mp_priv = binding,
126+
.mp_ops = &dmabuf_devmem_ops,
127+
};
129128

130129
rxq_idx = get_netdev_rx_queue_index(rxq);
131130

132-
err = netdev_rx_queue_restart(binding->dev, rxq_idx);
133-
WARN_ON(err && err != -ENETDOWN);
131+
__net_mp_close_rxq(binding->dev, rxq_idx, &mp_params);
134132
}
135133

136134
xa_erase(&net_devmem_dmabuf_bindings, binding->id);

net/core/netdev_rx_queue.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,17 +154,13 @@ void __net_mp_close_rxq(struct net_device *dev, unsigned int ifq_idx,
154154
const struct pp_memory_provider_params *old_p)
155155
{
156156
struct netdev_rx_queue *rxq;
157+
int err;
157158

158159
if (WARN_ON_ONCE(ifq_idx >= dev->real_num_rx_queues))
159160
return;
160161

161162
rxq = __netif_get_rx_queue(dev, ifq_idx);
162-
163-
/* Callers holding a netdev ref may get here after we already
164-
* went thru shutdown via dev_memory_provider_uninstall().
165-
*/
166-
if (dev->reg_state > NETREG_REGISTERED &&
167-
!rxq->mp_params.mp_ops)
163+
if (!rxq->mp_params.mp_ops)
168164
return;
169165

170166
if (WARN_ON_ONCE(rxq->mp_params.mp_ops != old_p->mp_ops ||
@@ -173,13 +169,18 @@ void __net_mp_close_rxq(struct net_device *dev, unsigned int ifq_idx,
173169

174170
rxq->mp_params.mp_ops = NULL;
175171
rxq->mp_params.mp_priv = NULL;
176-
WARN_ON(netdev_rx_queue_restart(dev, ifq_idx));
172+
err = netdev_rx_queue_restart(dev, ifq_idx);
173+
WARN_ON(err && err != -ENETDOWN);
177174
}
178175

179176
void net_mp_close_rxq(struct net_device *dev, unsigned ifq_idx,
180177
struct pp_memory_provider_params *old_p)
181178
{
182179
netdev_lock(dev);
183-
__net_mp_close_rxq(dev, ifq_idx, old_p);
180+
/* Callers holding a netdev ref may get here after we already
181+
* went thru shutdown via dev_memory_provider_uninstall().
182+
*/
183+
if (dev->reg_state <= NETREG_REGISTERED)
184+
__net_mp_close_rxq(dev, ifq_idx, old_p);
184185
netdev_unlock(dev);
185186
}

0 commit comments

Comments
 (0)