[dpdk-dev] [PATCH v13 4/6] dmadev: introduce DMA device library implementation

fengchengwen fengchengwen at huawei.com
Thu Aug 5 15:12:19 CEST 2021


On 2021/8/5 20:56, Walsh, Conor wrote:
>> This patch introduce DMA device library implementation which includes
>> configuration and I/O with the DMA devices.

[snip]

>>
>>  /**
>>   * @warning
>> @@ -952,10 +1029,27 @@ rte_dmadev_completed(uint16_t dev_id,
>> uint16_t vchan, const uint16_t nb_cpls,
>>   *   status array are also set.
>>   */
> 
> Hi Chenwen,
> 
> When completed status is called with status set to NULL the drivers will segfault.
> Users may have a valid use case where they pass NULL as status so it needs to be
> checked and handled appropriately.
> Could you handle this within dmadev similar to what I've added below?
> If added the doxygen comment will also need to be updated to specify NULL as a valid input.

Hi Conor,

The status must be an array pointer, so below status_tmp will not work well.

This API is slow path (vs completed API), and is designed to obtain detailed
status information, so application should pass valid status parameters.

> 
> Thanks,
> Conor.
> 
>>  __rte_experimental
>> -uint16_t
>> +static inline uint16_t
>>  rte_dmadev_completed_status(uint16_t dev_id, uint16_t vchan,
>>  			    const uint16_t nb_cpls, uint16_t *last_idx,
>> -			    enum rte_dma_status_code *status);
>> +			    enum rte_dma_status_code *status)
>> +{
>> +	struct rte_dmadev *dev = &rte_dmadevices[dev_id];
>> +	uint16_t idx;
>                enum rte_dma_status_code *status_tmp;
>> +
>> +#ifdef RTE_DMADEV_DEBUG
>> +	if (!rte_dmadev_is_valid_dev(dev_id) ||
>> +	    vchan >= dev->data->dev_conf.max_vchans ||
>> +	    nb_cpls == 0 || status == NULL)
>> +		return 0;
>> +	RTE_FUNC_PTR_OR_ERR_RET(*dev->completed_status, 0);
>> +#endif
>> +
>> +	if (last_idx == NULL)
>> +		last_idx = &idx;
>                if (status == NULL)
>                              status = &status_tmp;
>> +
>> +	return (*dev->completed_status)(dev, vchan, nb_cpls, last_idx,
>> status);
>> +}
>>
>>  #ifdef __cplusplus
>>  }
>> diff --git a/lib/dmadev/rte_dmadev_core.h
>> b/lib/dmadev/rte_dmadev_core.h
>> index 599ab15..9272725 100644
>> --- a/lib/dmadev/rte_dmadev_core.h
>> +++ b/lib/dmadev/rte_dmadev_core.h
>> @@ -177,4 +177,6 @@ struct rte_dmadev {
>>  	uint64_t reserved[2]; /**< Reserved for future fields. */
>>  } __rte_cache_aligned;
>>
>> +extern struct rte_dmadev rte_dmadevices[];
>> +
>>  #endif /* _RTE_DMADEV_CORE_H_ */
>> diff --git a/lib/dmadev/version.map b/lib/dmadev/version.map
>> index 408b93c..86c5e75 100644
>> --- a/lib/dmadev/version.map
>> +++ b/lib/dmadev/version.map
>> @@ -27,6 +27,7 @@ EXPERIMENTAL {
>>  INTERNAL {
>>          global:
>>
>> +	rte_dmadevices;
>>  	rte_dmadev_get_device_by_name;
>>  	rte_dmadev_pmd_allocate;
>>  	rte_dmadev_pmd_release;
>> --
>> 2.8.1
> 


More information about the dev mailing list