DPDK patches and discussions
 help / color / mirror / Atom feed
From: "lihuisong (C)" <lihuisong@huawei.com>
To: Thomas Monjalon <thomas@monjalon.net>
Cc: <dev@dpdk.org>, <andrew.rybchenko@oktetlabs.ru>,
	<ferruh.yigit@amd.com>, <liudongdong3@huawei.com>,
	<huangdaode@huawei.com>, <jerinj@marvell.com>,
	<bruce.richardson@intel.com>, <david.marchand@redhat.com>
Subject: Re: [PATCH V5] ethdev: fix one address occupies two indexes in MAC addrs
Date: Thu, 19 Jan 2023 18:09:05 +0800	[thread overview]
Message-ID: <2f2ab3f2-8c8a-22d4-9791-80c7b37a9d5c@huawei.com> (raw)
In-Reply-To: <7970217.gsGJI6kyIV@thomas>


在 2023/1/18 16:38, Thomas Monjalon 写道:
> 18/01/2023 09:26, Thomas Monjalon:
>> 20/10/2022 11:31, Huisong Li:
>>> The dev->data->mac_addrs[0] will be changed to a new MAC address when
>>> applications modify the default MAC address by .mac_addr_set(). However,
>>> if the new default one has been added as a non-default MAC address by
>>> .mac_addr_add(), the .mac_addr_set() doesn't remove it from the mac_addrs
>>> list. As a result, one MAC address occupies two indexes in the list. Like:
>>> add(MAC1)
>>> add(MAC2)
>>> add(MAC3)
>>> add(MAC4)
>>> set_default(MAC3)
>>> default=MAC3, filters=MAC1, MAC2, MAC3, MAC4
>> I agree it may be simpler to ensure that the addresses are uniques.
>>
>>> In addition, some PMDs, such as i40e, ice, hns3 and so on, do remove the
>>> old default MAC when set default MAC. If user continues to do
>>> set_default(MAC5), and the mac_addrs list is default=MAC5, filters=(MAC1,
>>> MAC2, MAC3, MAC4). At this moment, user can still see MAC3 from the list,
>>> but packets with MAC3 aren't actually received by the PMD.
>> If MAC3 is not removed with rte_eth_dev_mac_addr_remove() by the app,
>> MAC3 packets should be received.
>> The MAC address should not be removed by the PMD.
> Sorry for the confusion. I mean the opposite.
> With the new behavior, if we want the old default address to be kept
> in the list, we need to add it explicitly with rte_eth_dev_mac_addr_add.
> This is a behavior change and must be highlighted in the release notes.
Hi Thomas,

Sorry for your confusion. Maybe my cmmmit log is misleading.
Please ignore the second paragraph description in my commit.

It has nothing to do with the old defalut address.

The purpose of this patch is to solve the problem that one
address occupies two entries in MAC list.
All network engines have this problem. If the new defalut address
has been added as a non-default MAC address to the MAC list, this
address will occupy two entries in MAC list.

It's still a problem for some network engines, like, hns3 and i40e.
That's what I described in the second paragraph in my commit.

/Huisong
>>> So this patch adds a remove operation in set default MAC API documents
>>> this behavior.
>> Let's be clear here: only the new default address is removed from the rest of the list.
>>
>>> Fixes: 854d8ad4ef68 ("ethdev: add default mac address modifier")
>>> Cc: stable@dpdk.org
>>> --- a/lib/ethdev/ethdev_driver.h
>>> +++ b/lib/ethdev/ethdev_driver.h
>>> @@ -116,7 +116,12 @@ struct rte_eth_dev_data {
>>>   
>>>   	uint64_t rx_mbuf_alloc_failed; /**< Rx ring mbuf allocation failures */
>>>   
>>> -	/** Device Ethernet link address. @see rte_eth_dev_release_port() */
>>> +	/**
>>> +	 * Device Ethernet link address. The index zero of the array is as the
>> It should be "addresses" as there can be multiple.
>>
>> What means "as" above?
>> Can we say the first entry (index zero) is the default address?
>>
>>> +	 * index of the default address, and other indexes can't be the same
>> You can split the sentence in 2 instead of ", and".
>> indexes -> entries
>> can't -> cannot
>>
>>> +	 * as the address corresponding to index 0.
>> simpler: as the default address.
>>
>>> +	 * @see rte_eth_dev_release_port()
>> Why referencing this function here?
>>
>>> +	 */
>>> --- a/lib/ethdev/rte_ethdev.c
>>> +++ b/lib/ethdev/rte_ethdev.c
>>> @@ -4498,7 +4498,10 @@ rte_eth_dev_mac_addr_remove(uint16_t port_id, struct rte_ether_addr *addr)
>>>   int
>>>   rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr)
>>>   {
>>> +	uint64_t mac_pool_sel_bk = 0;
>>>   	struct rte_eth_dev *dev;
>>> +	uint32_t pool;
>>> +	int index;
>>>   	int ret;
>>>   
>>>   	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
>>> @@ -4517,16 +4520,50 @@ rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr)
>>>   	if (*dev->dev_ops->mac_addr_set == NULL)
>>>   		return -ENOTSUP;
>>>   
>>> +	/*
>>> +	 * If the address has been added as a non-default MAC address by
>>> +	 * rte_eth_dev_mac_addr_add API, it should be removed from
>>> +	 * dev->data->mac_addrs[].
>>> +	 */
>> Make is simpler:
>> "Keep address unique in dev->data->mac_addrs[]."
>>
>>> +	index = eth_dev_get_mac_addr_index(port_id, addr);
>>> +	if (index > 0) {
>>> +		/* Remove address in dev data structure */
>>> +		mac_pool_sel_bk = dev->data->mac_pool_sel[index];
>>> +		ret = rte_eth_dev_mac_addr_remove(port_id, addr);
>>> +		if (ret < 0) {
>>> +			RTE_ETHDEV_LOG(ERR, "Delete MAC address from the MAC list of ethdev port %u.\n",
>>> +				       port_id);
>> It is not clear with this log that it failed.
>>
>>> +			return ret;
>>> +		}
>>> +		/* Reset pool bitmap */
>>> +		dev->data->mac_pool_sel[index] = 0;
>> mac_pool_sel[index] is already reset in rte_eth_dev_mac_addr_remove().
>>
>>> +	}
>>>   	ret = (*dev->dev_ops->mac_addr_set)(dev, addr);
>>>   	if (ret < 0)
>>> -		return ret;
>>> +		goto out;
>>>   
>>>   	/* Update default address in NIC data structure */
>>>   	rte_ether_addr_copy(addr, &dev->data->mac_addrs[0]);
>>>   
>>>   	return 0;
>>> -}
>>>   
>>> +out:
>>> +	if (index > 0) {
>>> +		pool = 0;
>>> +		do {
>>> +			if (mac_pool_sel_bk & UINT64_C(1)) {
>>> +				if (rte_eth_dev_mac_addr_add(port_id, addr,
>>> +							     pool) != 0)
>>> +					RTE_ETHDEV_LOG(ERR, "failed to restore MAC pool id(%u) in port %u.\n",
>>> +						       pool, port_id);
>>> +			}
>>> +			mac_pool_sel_bk >>= 1;
>>> +			pool++;
>>> +		} while (mac_pool_sel_bk != 0);
>>> +	}
>>> +
>>> +	return ret;
>>> +}
>> Can we avoid this rollback by removing the address after mac_addr_set() succeed?
>
>
> .

  reply	other threads:[~2023-01-19 10:09 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-22  3:36 [dpdk-dev] [PATCH] ethdev: fix one MAC address occupies two index in mac addrs Min Hu (Connor)
2021-09-22  6:39 ` Andrew Rybchenko
2021-09-22  7:43   ` Huisong Li
2021-09-22  8:02     ` Andrew Rybchenko
2021-09-22  9:48       ` Huisong Li
2021-10-05 19:21 ` Thomas Monjalon
2021-10-08  7:02   ` Min Hu (Connor)
2021-10-08 10:04     ` Thomas Monjalon
2021-10-09  9:53       ` Min Hu (Connor)
2021-10-11  9:02         ` Thomas Monjalon
2021-10-11  9:28 ` [dpdk-dev] [PATCH v2] " Min Hu (Connor)
2021-10-11 10:35   ` Thomas Monjalon
2021-10-12  2:58     ` lihuisong (C)
2021-10-12  7:14       ` Thomas Monjalon
2021-10-15  2:00         ` lihuisong (C)
2021-10-19 17:45   ` Ferruh Yigit
2021-10-20  6:49     ` lihuisong (C)
2021-10-20  7:41       ` Ferruh Yigit
2021-10-20 10:15         ` Kevin Traynor
2021-10-20 16:32           ` Ferruh Yigit
2021-10-21  2:05             ` lihuisong (C)
2021-10-21  8:30               ` Ferruh Yigit
2021-10-22  2:04                 ` lihuisong (C)
2021-10-26 10:21                   ` Ferruh Yigit
2021-11-08  6:55                     ` lihuisong (C)
2022-04-25  6:42                       ` Min Hu (Connor)
2022-10-20  9:31   ` [PATCH V5] ethdev: fix one address occupies two indexes in MAC addrs Huisong Li
2022-11-16  7:37     ` lihuisong (C)
2022-12-06  8:08     ` lihuisong (C)
2023-01-10  1:00     ` fengchengwen
2023-01-18  8:26     ` Thomas Monjalon
2023-01-18  8:38       ` Thomas Monjalon
2023-01-19 10:09         ` lihuisong (C) [this message]
2023-01-19  9:57       ` lihuisong (C)
2023-01-19 14:38         ` Thomas Monjalon
2023-01-28  1:38           ` lihuisong (C)
2023-01-31  6:41     ` [PATCH V6] ethdev: fix one address occupies two entries " Huisong Li
2023-02-01 10:42       ` Thomas Monjalon
2023-02-01 12:26         ` lihuisong (C)
2023-02-01 13:15     ` [PATCH V7] " Huisong Li
2023-02-01 16:37       ` Thomas Monjalon
2023-02-02  1:11         ` lihuisong (C)
2023-02-02 11:50           ` Thomas Monjalon
2023-02-02 12:19             ` lihuisong (C)
2023-02-02 12:36     ` [PATCH V8] " Huisong Li
2023-02-02 13:11       ` Thomas Monjalon
2023-02-02 18:09       ` Ferruh Yigit
2023-02-02 21:10         ` Thomas Monjalon
2023-02-02 21:50           ` Morten Brørup
2023-02-03  1:56           ` lihuisong (C)
2023-02-03 12:58             ` Ferruh Yigit
2023-02-04  2:57               ` lihuisong (C)
2023-02-09  8:32                 ` lihuisong (C)
2023-02-09 12:45                 ` Ferruh Yigit
2023-02-10  9:54                   ` lihuisong (C)
2023-02-10 12:27                     ` Ferruh Yigit
2023-02-10 13:20                       ` lihuisong (C)
2023-05-16 11:47       ` lihuisong (C)
2023-05-16 14:13         ` Ferruh Yigit
2023-05-17  7:45           ` lihuisong (C)
2023-05-17  8:53             ` Ferruh Yigit
2023-05-17 11:46               ` lihuisong (C)
2023-05-17 13:43                 ` Ferruh Yigit
2023-05-19  3:00     ` [PATCH V9] " Huisong Li
2023-05-19  8:42       ` Ferruh Yigit
2023-05-19  9:21         ` lihuisong (C)
2023-05-19  9:31     ` [PATCH V10] " Huisong Li
2023-05-19 10:45       ` Ferruh Yigit
2022-05-14  2:00 ` [PATCH V3 0/2] ethdev: fix MAC addrs list Min Hu (Connor)
2022-05-14  2:00   ` [PATCH V3 1/2] ethdev: fix one address occupies two indexes in MAC addrs Min Hu (Connor)
2022-05-14  2:00   ` [PATCH V3 2/2] ethdev: document default and non-default MAC address Min Hu (Connor)
2022-05-31 15:22   ` [PATCH V3 0/2] ethdev: fix MAC addrs list Andrew Rybchenko
2022-06-01  6:43     ` Min Hu (Connor)
2022-06-01  6:39   ` [PATCH v4 " Min Hu (Connor)
2022-06-01  6:39     ` [PATCH v4 1/2] ethdev: fix one address occupies two indexes in MAC addrs Min Hu (Connor)
2022-06-01 17:49       ` Andrew Rybchenko
2022-06-02  3:16         ` lihuisong (C)
2022-06-02 13:54           ` Andrew Rybchenko
2022-06-11  9:04             ` lihuisong (C)
2022-06-01  6:39     ` [PATCH v4 2/2] ethdev: document default and non-default MAC address Min Hu (Connor)
2022-06-01 17:49       ` Andrew Rybchenko
2022-06-01 17:49     ` [PATCH v4 0/2] ethdev: fix MAC addrs list Andrew Rybchenko

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=2f2ab3f2-8c8a-22d4-9791-80c7b37a9d5c@huawei.com \
    --to=lihuisong@huawei.com \
    --cc=andrew.rybchenko@oktetlabs.ru \
    --cc=bruce.richardson@intel.com \
    --cc=david.marchand@redhat.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@amd.com \
    --cc=huangdaode@huawei.com \
    --cc=jerinj@marvell.com \
    --cc=liudongdong3@huawei.com \
    --cc=thomas@monjalon.net \
    /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;
as well as URLs for NNTP newsgroup(s).