> -----Original Message----- > From: Tan, Jianfeng > Sent: Thursday, February 25, 2016 4:36 PM > To: Ananyev, Konstantin; dev at dpdk.org > Cc: Zhang, Helin; nelio.laranjeiro at 6wind.com; adrien.mazarguil at > 6wind.com; rahul.lakkireddy at chelsio.com > Subject: Re: [PATCH v3 01/12] ethdev: add API to query packet type filling > info > > Hi Konstantin, > > On 2/25/2016 11:46 PM, Ananyev, Konstantin wrote: > > Hi Jainfeng, > > > >> Add a new API rte_eth_dev_get_ptype_info to query whether/what packet > >> type can be filled by given pmd rx burst function. > >> > >> Signed-off-by: Jianfeng Tan <jianfeng.tan at intel.com> > >> --- > >> lib/librte_ether/rte_ethdev.c | 32 ++++++++++++++++++++++++++++++++ > >> lib/librte_ether/rte_ethdev.h | 23 +++++++++++++++++++++++ > >> 2 files changed, 55 insertions(+) > >> > >> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c > >> index 1257965..b52555b 100644 > >> --- a/lib/librte_ether/rte_ethdev.c > >> +++ b/lib/librte_ether/rte_ethdev.c > >> @@ -1576,6 +1576,38 @@ rte_eth_dev_info_get(uint8_t port_id, struct > >> rte_eth_dev_info *dev_info) > >> dev_info->driver_name = dev->data->drv_name; > >> } > >> > >> +int > >> +rte_eth_dev_get_ptype_info(uint8_t port_id, uint32_t ptype_mask, > >> + uint32_t **p_ptypes) > >> +{ > >> + int i, j, ret; > >> + struct rte_eth_dev *dev; > >> + const uint32_t *all_ptypes; > >> + > >> + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); > >> + dev = &rte_eth_devices[port_id]; > >> + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_ptype_info_get, -ENOTSUP); > >> + all_ptypes = (*dev->dev_ops->dev_ptype_info_get)(dev); > >> + > >> + if (!all_ptypes) > >> + return 0; > >> + > >> + for (i = 0, ret = 0; all_ptypes[i] != RTE_PTYPE_UNKNOWN; ++i) > >> + if (all_ptypes[i] & ptype_mask) > >> + ret++; > >> + if (ret == 0) > >> + return 0; > >> + > >> + *p_ptypes = (uint32_t *)malloc(sizeof(uint32_t) * ret); > >> + if (*p_ptypes == NULL) > >> + return -ENOMEM; > > > > I thought we all agreed to follow snprintf()-like logic and avoid any > > memory allocations inside that function. > > So why malloc() again? > > Konstantin > > > > Sorry for the setback. I still have concerns that snprintf()-like needs > to be called twice by an application to get the ptype info. So I write > this implementation for you to comment. > > So what's the reason why we should avoid memory allocations inside that > function?
By the same reason none of other rte_ethdev get_info() style functions (rte_eth_dev_info_get, rte_eth_rx_queue_info_get, rte_eth_xstats_get, rte_eth_dev_rss_reta_query, etc) allocate space themselves. It is a good practice to let user to decide himself how/where to allocate/free a space for that date: on a stack, inside a data segment (global variable), on heap (malloc), at hugepages via rte_malloc, somewhere else. BTW, if you had concerns about that approach, why didn't you provide any arguments when it was discussed/agreed? Instead you came up a month later with same old approach that voids my and other reviewers comments and even v2 of your own patch. Do you have any good reason for that? Konstantin