From: Jan Sokolowski <jan.sokolowski@intel.com>
To: intel-wired-lan@lists.osuosl.org
Cc: Grzegorz Szczurek <grzegorzx.szczurek@intel.com>,
Kamil Maziarz <kamil.maziarz@intel.com>
Subject: [Intel-wired-lan] [PATCH net-next v3 2/2] i40e: Only MACs from host must be preserved
Date: Fri, 13 Jan 2023 14:17:17 +0100 [thread overview]
Message-ID: <20230113131717.186154-2-jan.sokolowski@intel.com> (raw)
In-Reply-To: <20230113131717.186154-1-jan.sokolowski@intel.com>
From: Grzegorz Szczurek <grzegorzx.szczurek@intel.com>
Only MACs assigned from host must be preserved after VF reset/reload.
Added vm MAC list to filter vm MAC request from others then
vm MACs do not preserved by host during VF reset/reload.
This list is used to filter the MAC addresses list restored after reset.
Without this patch host automatically restore all the MAC addresses
after VF reset/reload.
Co-Developed-by: Kamil Maziarz <kamil.maziarz@intel.com>
Signed-off-by: Grzegorz Szczurek <grzegorzx.szczurek@intel.com>
Signed-off-by: Kamil Maziarz <kamil.maziarz@intel.com>
Signed-off-by: Jan Sokolowski <jan.sokolowski@intel.com>
---
.../ethernet/intel/i40e/i40e_virtchnl_pf.c | 64 ++++++++++++++++++-
.../ethernet/intel/i40e/i40e_virtchnl_pf.h | 9 +++
2 files changed, 72 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index 6654a230b035..6af627db71a7 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -1045,6 +1045,66 @@ static void i40e_disable_vf_mappings(struct i40e_vf *vf)
i40e_flush(hw);
}
+/**
+ * i40e_add_vmmac_to_list
+ * @vf: pointer to the VF info
+ * @macaddr: pointer to the MAC address
+ *
+ * add MAC address into the MAC list for VM
+ **/
+static int i40e_add_vmmac_to_list(struct i40e_vf *vf,
+ const u8 *macaddr)
+{
+ struct i40e_vm_mac *mac_elem;
+
+ mac_elem = kzalloc(sizeof(*mac_elem), GFP_ATOMIC);
+ if (!mac_elem)
+ return -ENOMEM;
+ ether_addr_copy(mac_elem->macaddr, macaddr);
+ INIT_LIST_HEAD(&mac_elem->list);
+ list_add(&mac_elem->list, &vf->vm_mac_list);
+ return 0;
+}
+
+/**
+ * i40e_del_vmmac_from_list
+ * @vf: pointer to the VF info
+ * @macaddr: pointer to the MAC address
+ *
+ * delete MAC address from the MAC list for VM
+ **/
+static void i40e_del_vmmac_from_list(struct i40e_vf *vf, const u8 *macaddr)
+{
+ struct i40e_vm_mac *entry, *tmp;
+
+ list_for_each_entry_safe(entry, tmp, &vf->vm_mac_list, list) {
+ if (ether_addr_equal(macaddr, entry->macaddr)) {
+ list_del(&entry->list);
+ kfree(entry);
+ break;
+ }
+ }
+}
+
+/**
+ * i40e_free_vmmac_list
+ * @vf: pointer to the VF info
+ *
+ * remove whole list of MAC addresses for VM
+ **/
+static void i40e_free_vmmac_list(struct i40e_vf *vf)
+{
+ struct i40e_vm_mac *entry, *tmp;
+
+ if (list_empty(&vf->vm_mac_list))
+ return;
+
+ list_for_each_entry_safe(entry, tmp, &vf->vm_mac_list, list) {
+ list_del(&entry->list);
+ kfree(entry);
+ }
+}
+
/**
* i40e_free_vf_res
* @vf: pointer to the VF info
@@ -1120,6 +1180,9 @@ static void i40e_free_vf_res(struct i40e_vf *vf)
wr32(hw, reg_idx, reg);
i40e_flush(hw);
}
+
+ i40e_free_vmmac_list(vf);
+
/* reset some of the state variables keeping track of the resources */
vf->num_queue_pairs = 0;
clear_bit(I40E_VF_STATE_MC_PROMISC, &vf->vf_states);
@@ -2975,7 +3038,6 @@ static inline int i40e_check_vf_permission(struct i40e_vf *vf,
}
/**
- * i40e_vc_add_mac_addr_msg
* i40e_vc_ether_addr_type - get type of virtchnl_ether_addr
* @vc_ether_addr: used to extract the type
**/
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
index a0bd12dd0939..f0e67a0d4ecf 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
@@ -67,6 +67,12 @@ struct i40e_time_mac {
u8 addr[ETH_ALEN];
};
+/* used for MAC list 'vm_mac_list' to recognize MACs added by VM */
+struct i40e_vm_mac {
+ struct list_head list;
+ u8 macaddr[ETH_ALEN];
+};
+
/* VF information structure */
struct i40e_vf {
struct i40e_pf *pf;
@@ -111,6 +117,9 @@ struct i40e_vf {
bool spoofchk;
u16 num_vlan;
+ /* MAC list created by VM */
+ struct list_head vm_mac_list;
+
/* ADq related variables */
bool adq_enabled; /* flag to enable adq */
u8 num_tc;
--
2.31.1
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
next prev parent reply other threads:[~2023-01-13 13:14 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-13 13:17 [Intel-wired-lan] [PATCH net-next v3 1/2] i40e: Add ability to change VFs default MAC address Jan Sokolowski
2023-01-13 13:17 ` Jan Sokolowski [this message]
2023-01-17 20:03 ` Tony Nguyen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230113131717.186154-2-jan.sokolowski@intel.com \
--to=jan.sokolowski@intel.com \
--cc=grzegorzx.szczurek@intel.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=kamil.maziarz@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox