On 9/19/2017 6:31 AM, John Daley (johndale) wrote:
> 
>> -----Original Message-----
>> From: Thomas Monjalon [mailto:tho...@monjalon.net]
>> Sent: Monday, September 18, 2017 3:25 PM
>> To: John Daley (johndale) <johnd...@cisco.com>
>> Cc: Ferruh Yigit <ferruh.yi...@intel.com>; dev@dpdk.org; Sergio Gonzalez
>> Monroy <sergio.gonzalez.mon...@intel.com>
>> Subject: Re: [PATCH] net/enic: fix multi-process operation
>>
>> 18/09/2017 23:27, Ferruh Yigit:
>>> On 9/11/2017 7:58 PM, John Daley wrote:
>>>> - Use rte_malloc() instead of malloc() for the per device 'vdev' structure
>>>>   so that it can be shared across processes.
>>>> - Only initialize the device if the process type is RTE_PROC_PRIMARY
>>>> - Only allow the primary process to do queue setup, start/stop, promisc
>>>>   allmulticast, mac add/del, mtu.
>> [...]
>>>> --- a/drivers/net/enic/enic_ethdev.c
>>>> +++ b/drivers/net/enic/enic_ethdev.c
>>>> @@ -142,6 +142,10 @@ enicpmd_dev_filter_ctrl(struct rte_eth_dev
>>>> *dev,  static void enicpmd_dev_tx_queue_release(void *txq)  {
>>>>    ENICPMD_FUNC_TRACE();
>>>> +
>>>> +  if (rte_eal_process_type() != RTE_PROC_PRIMARY)
>>>> +          return;
>>>> +
>>>
>>> Hi John,
>>>
>>> I am not sure about these updates. Agree that these functions should
>>> know process type, but all others PMDs don't do this.
> 
> I looked at mlx5 and it does something similar with its mlx5_is_secondary() 
> in functions that modify fields in its shared private structure.

Right, mlx5 also has these checks.

> 
>>>
>>> Added a few more people for comment, but as far I understand its
>>> application responsibility to NOT call these functions if it is
>>> secondary process.
>>>
>>> For device init/uninit, that is part of eal_init() and have to be
>>> called both for primary and secondary process and PMD needs to protect
>>> it, for other functions application's responsibility.
> 
> I put the checks into the PMD because I didn't want to trust the app and I 
> didn't see checks in the library functions. I assumed that is why it was done 
> in mlx5. I was afraid that the secondary may try to write fields in the 
> shared structure and cause some silent bad behavior, like if secondary sets 
> the MTU then the primary does, then secondary assumes it was different than 
> what it is, or something like that.

The set values are in the shared memory, so a variable set by secondary
will be visible to primary, via versa. Of course a synchronization
required between primary and secondary processes.

Also why secondary shouldn't be allowed to do some work, like start/stop
the port?

I believe this should be application level concern, at worst libraries
but not drivers.

>>
>> Yes for now it is the policy.
>> But it is a gray area and it could be clearer with my "ownership proposal":
>>      http://dpdk.org/ml/archives/dev/2017-September/074656.html
>> A secondary process could manage the ports it owns.
> 
> I think the ownership concept would help make DPDK more flexible and 
> potentially cleaner. Perhaps ownership checks could be pushed the lib 
> functions, like rte_eth_dev_set_mtu(), and remove all such checks in the 
> PMD(s). 
>>
>> Feel free to comment the proposal.

Reply via email to