Merge tag 'kvm-riscv-fixes-5.19-1' of https://github.com/kvm-riscv/linux into HEAD
[linux-2.6-microblaze.git] / drivers / net / macsec.c
index 832f09a..817577e 100644 (file)
@@ -99,6 +99,7 @@ struct pcpu_secy_stats {
  * struct macsec_dev - private data
  * @secy: SecY config
  * @real_dev: pointer to underlying netdevice
+ * @dev_tracker: refcount tracker for @real_dev reference
  * @stats: MACsec device stats
  * @secys: linked list of SecY's on the underlying device
  * @gro_cells: pointer to the Generic Receive Offload cell
@@ -107,6 +108,7 @@ struct pcpu_secy_stats {
 struct macsec_dev {
        struct macsec_secy secy;
        struct net_device *real_dev;
+       netdevice_tracker dev_tracker;
        struct pcpu_secy_stats __percpu *stats;
        struct list_head secys;
        struct gro_cells gro_cells;
@@ -3459,6 +3461,9 @@ static int macsec_dev_init(struct net_device *dev)
        if (is_zero_ether_addr(dev->broadcast))
                memcpy(dev->broadcast, real_dev->broadcast, dev->addr_len);
 
+       /* Get macsec's reference to real_dev */
+       dev_hold_track(real_dev, &macsec->dev_tracker, GFP_KERNEL);
+
        return 0;
 }
 
@@ -3704,6 +3709,8 @@ static void macsec_free_netdev(struct net_device *dev)
        free_percpu(macsec->stats);
        free_percpu(macsec->secy.tx_sc.stats);
 
+       /* Get rid of the macsec's reference to real_dev */
+       dev_put_track(macsec->real_dev, &macsec->dev_tracker);
 }
 
 static void macsec_setup(struct net_device *dev)