On Wed, 29 Jan 2025 00:10:12 +0000 Long Li <lon...@microsoft.com> wrote:
> > Subject: [EXTERNAL] Re: [PATCH 4/4] net/netvsc: cache device parameters for > > hot plug events > > > > On Mon, 27 Jan 2025 17:35:06 -0800 > > lon...@linuxonhyperv.com wrote: > > > > > @@ -1409,9 +1424,6 @@ eth_hn_dev_uninit(struct rte_eth_dev *eth_dev) > > > ret_stop = hn_dev_stop(eth_dev); > > > hn_dev_close(eth_dev); > > > > > > - free(hv->vf_devargs); > > > - hv->vf_devargs = NULL; > > > - > > > hn_detach(hv); > > > hn_chim_uninit(eth_dev); > > > rte_vmbus_chan_close(hv->channels[0]); > > > @@ -1423,6 +1435,61 @@ eth_hn_dev_uninit(struct rte_eth_dev *eth_dev) > > > return ret_stop; > > > } > > > > > > +static int populate_cache_list(void) > > > +{ > > > + int ret; > > > + struct rte_devargs *da; > > > + > > > + rte_spinlock_lock(&netvsc_lock); > > > + da_cache_usage++; > > > + if (da_cache_usage > 1) { > > > + ret = 0; > > > + goto out; > > > + } > > > + > > > + LIST_INIT(&da_cache_list); > > > + RTE_EAL_DEVARGS_FOREACH("pci", da) { > > > + struct da_cache *cache; > > > + > > > + cache = rte_zmalloc("NETVSC-HOTADD", sizeof(*cache), > > rte_mem_page_size()); > > > + if (!cache) { > > > + ret = -ENOMEM; > > > + goto out; > > > + } > > > + > > > + strncpy(cache->name, da->name, sizeof(da->name)); > > > + cache->drv_str = strdup(da->drv_str); > > > + if (!cache->drv_str) { > > > + rte_free(cache); > > > + ret = -ENOMEM; > > > + goto out; > > > + } > > > + > > > + LIST_INSERT_HEAD(&da_cache_list, cache, list); > > > + } > > > > Why do you need to cache entry to be page aligned, that seems unnecessary > > wasteful? > > You are right it doesn't need to. I'm removing the alignment. > > > Why does it need to be huge pages? versus normal malloc? > > I thought it would make it easier to debug memory leaks through EAL. But > normal malloc is fine because this data is not shared between > primary/secondary. > > > The string is coming from malloc (strdup) so it can't be used by secondary > > process. > > > > Since you are allocating a devargs cache entry, you could just as well use > > flexible > > array where entry was like: > > struct da_cache { > > LIST_ENTRY(da_cache) list; > > char name[RTE_DEV_NAME_MAX_LEN]; > > char drv_str[]; > > }; > > This is difficult as I don't know how big it is for drv_str[]. That is why the malloc adds extra space for drv_str, see below. Flexible array allow one array at end of structure > > > > > > cache = malloc(sizeof(*cache) + strlen(da->drv_str) + 1); ... > > strcpy(cache->drv_str, da->drv_str); > > Another approach is to modify EAL to never delete driver arguments when a > device is removed. i.e., It doesn't call rte_devargs_remove() on device > removal, instead keep those devargs for the lifetime of the process. Do you > think this is a better approach? This will save work if other drivers want to > cache devargs list for device hot plug events. Not sure, right now I don't think it is possible to pre-add devargs for future hot plug