|
@@ -347,7 +347,51 @@ out:
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+/* batman-adv network devices have devices nesting below it and are a special
|
|
|
+ * "super class" of normal network devices; split their locks off into a
|
|
|
+ * separate class since they always nest.
|
|
|
+ */
|
|
|
+static struct lock_class_key batadv_netdev_xmit_lock_key;
|
|
|
+static struct lock_class_key batadv_netdev_addr_lock_key;
|
|
|
+
|
|
|
+/**
|
|
|
+ * batadv_set_lockdep_class_one - Set lockdep class for a single tx queue
|
|
|
+ * @dev: device which owns the tx queue
|
|
|
+ * @txq: tx queue to modify
|
|
|
+ * @_unused: always NULL
|
|
|
+ */
|
|
|
+static void batadv_set_lockdep_class_one(struct net_device *dev,
|
|
|
+ struct netdev_queue *txq,
|
|
|
+ void *_unused)
|
|
|
+{
|
|
|
+ lockdep_set_class(&txq->_xmit_lock, &batadv_netdev_xmit_lock_key);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * batadv_set_lockdep_class - Set txq and addr_list lockdep class
|
|
|
+ * @dev: network device to modify
|
|
|
+ */
|
|
|
+static void batadv_set_lockdep_class(struct net_device *dev)
|
|
|
+{
|
|
|
+ lockdep_set_class(&dev->addr_list_lock, &batadv_netdev_addr_lock_key);
|
|
|
+ netdev_for_each_tx_queue(dev, batadv_set_lockdep_class_one, NULL);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * batadv_softif_init - Late stage initialization of soft interface
|
|
|
+ * @dev: registered network device to modify
|
|
|
+ *
|
|
|
+ * Returns error code on failures
|
|
|
+ */
|
|
|
+static int batadv_softif_init(struct net_device *dev)
|
|
|
+{
|
|
|
+ batadv_set_lockdep_class(dev);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static const struct net_device_ops batadv_netdev_ops = {
|
|
|
+ .ndo_init = batadv_softif_init,
|
|
|
.ndo_open = batadv_interface_open,
|
|
|
.ndo_stop = batadv_interface_release,
|
|
|
.ndo_get_stats = batadv_interface_stats,
|