[dpdk-dev] [PATCH v3 16/34] net/ice: support device initialization

Lu, Wenzhuo wenzhuo.lu at intel.com
Fri Dec 14 03:30:43 CET 2018


Hi Ferruh,

> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Thursday, December 13, 2018 11:14 PM
> To: Lu, Wenzhuo <wenzhuo.lu at intel.com>; dev at dpdk.org
> Cc: Yang, Qiming <qiming.yang at intel.com>; Li, Xiaoyun
> <xiaoyun.li at intel.com>; Wu, Jingjing <jingjing.wu at intel.com>
> Subject: Re: [dpdk-dev] [PATCH v3 16/34] net/ice: support device
> initialization
> 
> On 12/13/2018 2:39 AM, Lu, Wenzhuo wrote:
> > Hi Ferruh,
> >
> >> -----Original Message-----
> >> From: Yigit, Ferruh
> >> Sent: Thursday, December 13, 2018 2:18 AM
> >> To: Lu, Wenzhuo <wenzhuo.lu at intel.com>; dev at dpdk.org
> >> Cc: Yang, Qiming <qiming.yang at intel.com>; Li, Xiaoyun
> >> <xiaoyun.li at intel.com>; Wu, Jingjing <jingjing.wu at intel.com>
> >> Subject: Re: [dpdk-dev] [PATCH v3 16/34] net/ice: support device
> >> initialization
> >>
> >> On 12/12/2018 6:59 AM, Wenzhuo Lu wrote:
> >>> Signed-off-by: Wenzhuo Lu <wenzhuo.lu at intel.com>
> >>> Signed-off-by: Qiming Yang <qiming.yang at intel.com>
> >>> Signed-off-by: Xiaoyun Li <xiaoyun.li at intel.com>
> >>> Signed-off-by: Jingjing Wu <jingjing.wu at intel.com>
> >>
> >> <...>
> >>
> >>> @@ -297,6 +297,15 @@
> >> CONFIG_RTE_LIBRTE_FM10K_RX_OLFLAGS_ENABLE=y
> >>>  CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR=y
> >>>
> >>>  #
> >>> +# Compile burst-oriented ICE PMD driver #
> >> CONFIG_RTE_LIBRTE_ICE_PMD=y
> >>> +CONFIG_RTE_LIBRTE_ICE_DEBUG_RX=n
> >> CONFIG_RTE_LIBRTE_ICE_DEBUG_TX=n
> >>> +CONFIG_RTE_LIBRTE_ICE_DEBUG_TX_FREE=n
> >>> +CONFIG_RTE_LIBRTE_ICE_RX_ALLOW_BULK_ALLOC=y
> >>
> >> Is there a way to convert this into runtime config? Does it needs to
> >> be compile time config?
> > If only considering the functionality, we can totally remove this macro.
> That's why it's set to 'y' by default.
> > We introduce this macro for the users to improve performance for some
> specific cases. For example, if the MTU is small enough, we can totally
> remove the code wrapped by this macro. So the performance is better.
> Considering the purpose, to achieve the best performance, it's hard to make
> it a runtime configure.
> 
> Thanks for clarification.
> >>
> >>> +
> >>> +include $(RTE_SDK)/mk/rte.lib.mk
> >>> diff --git a/drivers/net/ice/ice_ethdev.c
> >>> b/drivers/net/ice/ice_ethdev.c new file mode 100644 index
> >>> 0000000..e0bf15c
> >>> --- /dev/null
> >>> +++ b/drivers/net/ice/ice_ethdev.c
> >>> @@ -0,0 +1,640 @@
> >>> +/* SPDX-License-Identifier: BSD-3-Clause
> >>> + * Copyright(c) 2018 Intel Corporation  */
> >>> +
> >>> +#include <rte_ethdev_pci.h>
> >>> +
> >>> +#include "base/ice_sched.h"
> >>> +#include "ice_ethdev.h"
> >>> +#include "ice_rxtx.h"
> >>> +
> >>> +#define ICE_MAX_QP_NUM "max_queue_pair_num"
> >>
> >> When documentation is added into this patch, can you also add this
> >> runtime config to that please?
> > The macro? It's not a configuration. It’s a string used internally.
> 
> It is used as devargs string:
> 
>  +	const char *queue_num_key = ICE_MAX_QP_NUM;
>  <...>
>  +	if (!rte_kvargs_count(kvlist, queue_num_key)) {
>  +		rte_kvargs_free(kvlist);
>  +		return 0;
>  +	}
> 
> And briefly what I am suggesting is to document runtime devargs in ice
> documentation.
Sorry, I didn’t get it at first. Will update the document.

> 
> >
> >>
> >> <...>
> >>
> >>> +static int
> >>> +ice_dev_init(struct rte_eth_dev *dev) {
> >>> +	struct rte_pci_device *pci_dev;
> >>> +	struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data-
> >>> dev_private);
> >>> +	struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data-
> >>> dev_private);
> >>> +	int ret;
> >>> +
> >>> +	dev->dev_ops = &ice_eth_dev_ops;
> >>> +
> >>> +	pci_dev = RTE_DEV_TO_PCI(dev->device);
> >>> +
> >>> +	rte_eth_copy_pci_info(dev, pci_dev);
> >>
> >> This is done by rte_eth_dev_pci_generic_probe(), do we need here?
> > No, we only need the info, don’t want to probe.
> 
> Sorry, I didn't get it, let me rephrase:
> 
> rte_eth_copy_pci_info() called as following with existing code:
> ice_pci_probe()
>   rte_eth_dev_pci_generic_probe()
>     rte_eth_dev_pci_allocate()  <---- (1)
>       rte_eth_copy_pci_info()
>     ice_dev_init()
>       rte_eth_copy_pci_info()   <---- (2)
> 
> I am asking can we remove (2) one, since (1) does the copy already?
Agree it looks redundant. Will check if we can remove (2).

> 
> >
> >>
> >> <...>
> >>
> >>> +RTE_INIT(ice_init_log);
> >>> +static void
> >>> +ice_init_log(void)
> >>
> >> Can merge these lines, please check other samples.
> > Will change it in v4.
> >
> >>
> >>> +{
> >>> +	ice_logtype_init = rte_log_register("pmd.ice.init");
> >>
> >> pmd.net.ice.init
> > Will change it in v4.
> >
> >>
> >>> +	if (ice_logtype_init >= 0)
> >>> +		rte_log_set_level(ice_logtype_init, RTE_LOG_NOTICE);
> >>> +	ice_logtype_driver = rte_log_register("pmd.ice.driver");
> >>
> >> pmd.net.ice.driver
> > Will change it in v4.
> >
> >>
> >> <...>
> >>
> >>> +static void
> >>> +ice_dev_close(struct rte_eth_dev *dev) {
> >>> +	struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data-
> >>> dev_private);
> >>> +	struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data-
> >>> dev_private);
> >>> +
> >>> +	ice_res_pool_destroy(&pf->msix_pool);
> >>> +	ice_release_vsi(pf->main_vsi);
> >>> +
> >>> +	ice_shutdown_all_ctrlq(hw);
> >>> +}
> >>
> >> I am mostly for ordering functions in a way that it doesn't require
> >> the forward declaration, which is mostly helps reading the code since
> >> the function order is close the call order.
> > I just want to align the order with ice_eth_dev_ops. But anyway I can move
> it forward.
> 
> I think it make sense to align the order with ice_eth_dev_ops, again
> improves readability, and both can be done at same time:
> 
> static dev_ops1() {}
> static dev_ops2() {}
> static dev_ops3() {}
> 
> static const struct eth_dev_ops ice_eth_dev_ops = {
>   ops1 = dev_ops1,
>   ops2 = dev_ops2,
>   ops3 = dev_ops3,
> };
> 
> ice_dev_init() {
>   dev->dev_ops = &ice_eth_dev_ops;
> }
> 
> ice_pci_probe() {
>   rte_eth_dev_pci_generic_probe(..., ice_dev_init); }
> 
> rte_pci_driver rte_ice_pmd = {
>   .probe = ice_pci_probe,
>   .remove = ice_pci_remove,
> };
> 
> RTE_PMD_REGISTER_PCI(net_ice, rte_ice_pmd);
> 
> >
> >>
> >> It is up to you but also for sake of consistancy I think better to
> >> move this function up, and leave probe/remove/init_log functions as
> >> last functions in file.
> > So, it's a bad try to show the strong connection of probe/remove with
> > dev_init/uninit :)
> 
> No it is good to show that relation and keep them close, sorry perhaps I
> missed your point but I wasn't suggesting to separate probe/remove &
> dev_init/uninit.
> 
> It looks me better to keep file entry/exit points at the bottom and develop
> through upwards as call-stack moves deeper, instead of functions jump
> within the file against call-stack. This improves readability because you only
> scroll one way as you advance through code also you expose to code from
> more abstract to detailed order. That order also has benefit of removing
> forward declarations.
> 
> I am aware it is already complex to develop a new PMD and you are already
> dealing with lots of hardware details, I have no intention to make it more
> complex for you, please take this only as an input.
I have the same feeling. Actually I've done much this kind of adjustment before creating the patches. Will make it better.




More information about the dev mailing list