Commit 354d8614 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'net-reduce-dynamic-lockdep-keys'



Cong Wang says:

====================
net: reduce dynamic lockdep keys

syzbot has been complaining about low MAX_LOCKDEP_KEYS for a
long time, it is mostly because we register 4 dynamic keys per
network device.

This patchset reduces the number of dynamic lockdep keys from
4 to 1 per netdev, by reverting to the previous static keys,
except for addr_list_lock which still has to be dynamic.
The second patch removes a bonding-specific key by the way.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ea84c842 e7511f56
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -4491,7 +4491,6 @@ static void bond_uninit(struct net_device *bond_dev)

	list_del(&bond->bond_list);

	lockdep_unregister_key(&bond->stats_lock_key);
	bond_debug_unregister(bond);
}

@@ -4896,8 +4895,7 @@ static int bond_init(struct net_device *bond_dev)
		return -ENOMEM;

	spin_lock_init(&bond->stats_lock);
	lockdep_register_key(&bond->stats_lock_key);
	lockdep_set_class(&bond->stats_lock, &bond->stats_lock_key);
	netdev_lockdep_set_classes(bond_dev);

	list_add_tail(&bond->bond_list, &bn->dev_list);

+16 −0
Original line number Diff line number Diff line
@@ -299,6 +299,20 @@ static void nfp_repr_clean(struct nfp_repr *repr)
	nfp_port_free(repr->port);
}

static struct lock_class_key nfp_repr_netdev_xmit_lock_key;

static void nfp_repr_set_lockdep_class_one(struct net_device *dev,
					   struct netdev_queue *txq,
					   void *_unused)
{
	lockdep_set_class(&txq->_xmit_lock, &nfp_repr_netdev_xmit_lock_key);
}

static void nfp_repr_set_lockdep_class(struct net_device *dev)
{
	netdev_for_each_tx_queue(dev, nfp_repr_set_lockdep_class_one, NULL);
}

int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
		  u32 cmsg_port_id, struct nfp_port *port,
		  struct net_device *pf_netdev)
@@ -308,6 +322,8 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
	u32 repr_cap = nn->tlv_caps.repr_cap;
	int err;

	nfp_repr_set_lockdep_class(netdev);

	repr->port = port;
	repr->dst = metadata_dst_alloc(0, METADATA_HW_PORT_MUX, GFP_KERNEL);
	if (!repr->dst)
+20 −0
Original line number Diff line number Diff line
@@ -107,6 +107,25 @@ struct bpqdev {

static LIST_HEAD(bpq_devices);

/*
 * bpqether network devices are paired with ethernet devices below them, so
 * form a special "super class" of normal ethernet devices; split their locks
 * off into a separate class since they always nest.
 */
static struct lock_class_key bpq_netdev_xmit_lock_key;

static void bpq_set_lockdep_class_one(struct net_device *dev,
				      struct netdev_queue *txq,
				      void *_unused)
{
	lockdep_set_class(&txq->_xmit_lock, &bpq_netdev_xmit_lock_key);
}

static void bpq_set_lockdep_class(struct net_device *dev)
{
	netdev_for_each_tx_queue(dev, bpq_set_lockdep_class_one, NULL);
}

/* ------------------------------------------------------------------------ */


@@ -477,6 +496,7 @@ static int bpq_new_device(struct net_device *edev)
	err = register_netdevice(ndev);
	if (err)
		goto error;
	bpq_set_lockdep_class(ndev);

	/* List protected by RTNL */
	list_add_rcu(&bpq->bpq_list, &bpq_devices);
+2 −0
Original line number Diff line number Diff line
@@ -2456,6 +2456,8 @@ static int netvsc_probe(struct hv_device *dev,
		NETIF_F_HW_VLAN_CTAG_RX;
	net->vlan_features = net->features;

	netdev_lockdep_set_classes(net);

	/* MTU range: 68 - 1500 or 65521 */
	net->min_mtu = NETVSC_MTU_MIN;
	if (nvdev->nvsp_version >= NVSP_PROTOCOL_VERSION_2)
+2 −0
Original line number Diff line number Diff line
@@ -131,6 +131,8 @@ static int ipvlan_init(struct net_device *dev)
	dev->gso_max_segs = phy_dev->gso_max_segs;
	dev->hard_header_len = phy_dev->hard_header_len;

	netdev_lockdep_set_classes(dev);

	ipvlan->pcpu_stats = netdev_alloc_pcpu_stats(struct ipvl_pcpu_stats);
	if (!ipvlan->pcpu_stats)
		return -ENOMEM;
Loading