ixgbe: Refactor MAC address configuration code
In the process of tracking down a memory leak when adding/removing FDB entries I had to go through the MAC address configuration code for ixgbe. In the process of doing so I found a number of issues that impacted readability and performance. This change updates the code in general to clean it up so it becomes clear what each step is doing. From what I can tell there a couple of bugs cleaned up in this code. First is the fact that the MAC addresses were being double counted for the PF. As a result once entries up to 63 had been used you could no longer add additional filters. A simple test case for this: for i in `seq 0 96` do ip link add link ens8 name mv$i type macvlan ip link set dev mv$i up done Test script: ethregs -s 0:8.0 | grep -e "RAH" | grep 8000....$ When things are working correctly RAL/H registers 1 - 97 will be consumed. In the failing case it will stop at 63 and prevent any further filters from being added. Signed-off-by: Alexander Duyck <aduyck@mirantis.com> Tested-by: Darin Miller <darin.j.miller@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:

committed by
Jeff Kirsher

parent
50985b5f62
commit
c9f53e63c2
@@ -587,9 +587,10 @@ static inline u16 ixgbe_desc_unused(struct ixgbe_ring *ring)
|
||||
|
||||
struct ixgbe_mac_addr {
|
||||
u8 addr[ETH_ALEN];
|
||||
u16 queue;
|
||||
u16 pool;
|
||||
u16 state; /* bitmask */
|
||||
};
|
||||
|
||||
#define IXGBE_MAC_STATE_DEFAULT 0x1
|
||||
#define IXGBE_MAC_STATE_MODIFIED 0x2
|
||||
#define IXGBE_MAC_STATE_IN_USE 0x4
|
||||
@@ -883,9 +884,9 @@ int ixgbe_wol_supported(struct ixgbe_adapter *adapter, u16 device_id,
|
||||
void ixgbe_full_sync_mac_table(struct ixgbe_adapter *adapter);
|
||||
#endif
|
||||
int ixgbe_add_mac_filter(struct ixgbe_adapter *adapter,
|
||||
u8 *addr, u16 queue);
|
||||
const u8 *addr, u16 queue);
|
||||
int ixgbe_del_mac_filter(struct ixgbe_adapter *adapter,
|
||||
u8 *addr, u16 queue);
|
||||
const u8 *addr, u16 queue);
|
||||
void ixgbe_clear_interrupt_scheme(struct ixgbe_adapter *adapter);
|
||||
netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *, struct ixgbe_adapter *,
|
||||
struct ixgbe_ring *);
|
||||
|
Reference in New Issue
Block a user