[dpdk-dev] [PATCH 1/4] lpm: allocation of an existing object should fail

Olivier Matz olivier.matz at 6wind.com
Thu Mar 31 09:35:10 CEST 2016


Hi Stephen,

On 03/30/2016 11:46 PM, Stephen Hemminger wrote:
> On Wed, 30 Mar 2016 17:30:24 +0200
> Olivier Matz <olivier.matz at 6wind.com> wrote:
> 
>> diff --git a/lib/librte_lpm/rte_lpm6.c b/lib/librte_lpm/rte_lpm6.c
>> index 4c44cd7..9877a30 100644
>> --- a/lib/librte_lpm/rte_lpm6.c
>> +++ b/lib/librte_lpm/rte_lpm6.c
>> @@ -182,8 +182,11 @@ rte_lpm6_create(const char *name, int socket_id,
>>  		if (strncmp(name, lpm->name, RTE_LPM6_NAMESIZE) == 0)
>>  			break;
>>  	}
>> -	if (te != NULL)
>> +	if (te != NULL) {
>> +		lpm = NULL;
>> +		rte_errno = EEXIST;
>>  		goto exit;
>> +	}
>>  
>>  	/* allocate tailq entry */
>>  
> 
> with older memzone model, objects in huge memory area were never freed.
> That means when application restarts it finds the old LPM and works.
> With your change it would break such an application.
> 

Could you be more precise about the use case you are
describing? Are you talking about a secondary process?

The API description of lpm and hash says since the first
release that EEXIST should be returned if a memzone with
the same name already exists:

 * @return
 *   Handle to LPM object on success, NULL otherwise with rte_errno set
 *   to an appropriate values. Possible rte_errno values include:
 *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config
structure
 *    - E_RTE_SECONDARY - function was called from a secondary process
instance
 *    - EINVAL - invalid parameter passed to function
 *    - ENOSPC - the maximum number of memzones has already been allocated
 *    - EEXIST - a memzone with the same name already exists
 *    - ENOMEM - no appropriate memory area found in which to create memzone
 */
struct rte_lpm *
rte_lpm_create(const char *name, int socket_id,
		const struct rte_lpm_config *config);

 * @return
 *   Pointer to hash table structure that is used in future hash table
 *   operations, or NULL on error, with error code set in rte_errno.
 *   Possible rte_errno errors include:
 *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config
structure
 *    - E_RTE_SECONDARY - function was called from a secondary process
instance
 *    - ENOENT - missing entry
 *    - EINVAL - invalid parameter passed to function
 *    - ENOSPC - the maximum number of memzones has already been allocated
 *    - EEXIST - a memzone with the same name already exists
 *    - ENOMEM - no appropriate memory area found in which to create memzone
 */
struct rte_hash *
rte_hash_create(const struct rte_hash_parameters *params);


>From my point of view, the behavior I'm fixing is more a bug
fix than an API change. But if required, I can send a deprecation
notice for 16.04 and have the fix integrated for 16.07.



More information about the dev mailing list