[dpdk-dev] [PATCH v2 12/12] net/vhost: support to run in the secondary process

Tan, Jianfeng jianfeng.tan at intel.com
Sat Sep 30 06:03:33 CEST 2017


Hi Yuanhan,


On 9/29/2017 4:28 PM, Yuanhan Liu wrote:
> On Thu, Sep 28, 2017 at 01:55:59PM +0000, Jianfeng Tan wrote:
>>   static int
>> +share_device(int vid)
>> +{
>> +	uint32_t i, vring_num;
>> +	int len;
>> +	int fds[8];
>> +	struct rte_vhost_memory *mem;
>> +	struct vhost_params *params;
>> +	struct rte_vhost_vring vring;
>> +
>> +	/* share mem table */
>> +	if (rte_vhost_get_mem_table(vid, &mem) < 0) {
>> +		RTE_LOG(ERR, PMD, "Failed to get mem table\n");
>> +		return 0;
>> +	}
>> +	for (i = 0; i < mem->nregions; ++i)
>> +		fds[i] = mem->regions[i].fd;
>> +
>> +	len = sizeof(struct rte_vhost_mem_region) * mem->nregions;
>> +	params = malloc(sizeof(*params) + len);
>> +	if (params == NULL) {
>> +		RTE_LOG(ERR, PMD, "Failed to allocate memory\n");
>> +		return -1;
>> +	}
>> +
>> +	params->type = VHOST_MSG_TYPE_REGIONS;
>> +	params->vid = vid;
>> +	memcpy(params->regions, mem->regions, len);
>> +
>> +	if (rte_eal_mp_sendmsg("vhost pmd", params, sizeof(*params) + len,
> To me, it's not a good idea to identify an object by a string. The common
> practice is to use a handler, which could either be a struct or a nubmer.

My point is that if we choose the way you suggested, we need somewhere 
to maintain them. For example, every time we need register a new action, 
we need to update that file to add a new entry (number).

In current way, the duplicated register with the same name will fail, 
developers is responsible to check that.

>
>> +			       fds, mem->nregions) < 0) {
>> +		RTE_LOG(ERR, PMD, "Failed to share mem table\n");
>> +		free(params);
>> +		return -1;
>> +	}
>> +
>> +	/* share callfd and kickfd */
>> +	params->type = VHOST_MSG_TYPE_SET_FDS;
>> +	vring_num = rte_vhost_get_vring_num(vid);
>> +	for (i = 0; i < vring_num; i++) {
>> +		if (rte_vhost_get_vhost_vring(vid, i, &vring) < 0) {
> If you save the fds here, you don't have to get it every time when there
> is a new secondary process attached. Then as I have suggested firstly,
> you don't have to introduce callfd_pri in the vhost lib.

If we don't introduce callfd_pri, when we do virtqueue cleanup (or 
similar operations) in vhost lib, it will wrongly close fds belonging to 
secondary process.

You remind me that, instead of introduce callfd_pri, we can introduce 
callfd_effective, to reduce the modification lines.

Thanks,
Jianfeng


More information about the dev mailing list