summaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ice/ice_repr.c
diff options
context:
space:
mode:
authorMichal Swiatkowski <michal.swiatkowski@linux.intel.com>2023-10-24 13:09:20 +0200
committerTony Nguyen <anthony.l.nguyen@intel.com>2023-11-13 11:42:14 -0800
commitaf41b1859024114c672c483ccd635c88b71eaf3d (patch)
tree41e4ad6a8acb80a57300030488f1c7a52dac9a73 /drivers/net/ethernet/intel/ice/ice_repr.c
parent5c53c1224f241284d1945c62697e1140f2147b05 (diff)
downloadlinux-stable-af41b1859024114c672c483ccd635c88b71eaf3d.tar.gz
linux-stable-af41b1859024114c672c483ccd635c88b71eaf3d.tar.bz2
linux-stable-af41b1859024114c672c483ccd635c88b71eaf3d.zip
ice: track port representors in xarray
Instead of assuming that each VF has pointer to port representor save it in xarray. It will allow adding port representor for other device types. Drop reference to VF where it is use only to get port representor. Get it from xarray instead. The functions will no longer by specific for VF, rename them. Track id assigned by xarray in port representor structure. The id can't be used as ::q_id, because it is fixed during port representor lifetime. ::q_id can change after adding / removing other port representors. Side effect of removing VF pointer is that we are losing VF MAC information used in unrolling. Store it in port representor as parent MAC. Reviewed-by: Piotr Raczynski <piotr.raczynski@intel.com> Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com> Tested-by: Sujai Buvaneswaran <sujai.buvaneswaran@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_repr.c')
-rw-r--r--drivers/net/ethernet/intel/ice/ice_repr.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_repr.c b/drivers/net/ethernet/intel/ice/ice_repr.c
index 903a3385eacb..e56c59a304ef 100644
--- a/drivers/net/ethernet/intel/ice/ice_repr.c
+++ b/drivers/net/ethernet/intel/ice/ice_repr.c
@@ -318,6 +318,11 @@ static int ice_repr_add(struct ice_vf *vf)
}
repr->q_vector = q_vector;
+ err = xa_alloc(&vf->pf->eswitch.reprs, &repr->id, repr,
+ xa_limit_32b, GFP_KERNEL);
+ if (err)
+ goto err_xa_alloc;
+
err = ice_devlink_create_vf_port(vf);
if (err)
goto err_devlink;
@@ -338,6 +343,8 @@ static int ice_repr_add(struct ice_vf *vf)
err_netdev:
ice_devlink_destroy_vf_port(vf);
err_devlink:
+ xa_erase(&vf->pf->eswitch.reprs, repr->id);
+err_xa_alloc:
kfree(repr->q_vector);
vf->repr->q_vector = NULL;
err_alloc_q_vector:
@@ -363,6 +370,7 @@ static void ice_repr_rem(struct ice_vf *vf)
kfree(repr->q_vector);
unregister_netdev(repr->netdev);
ice_devlink_destroy_vf_port(vf);
+ xa_erase(&vf->pf->eswitch.reprs, repr->id);
free_netdev(repr->netdev);
kfree(repr);
vf->repr = NULL;