[PATCH 2/2] uacce: add uacce module

zhangfei.gao at foxmail.com zhangfei.gao at foxmail.com
Mon Aug 19 19:43:40 AEST 2019


Hi, Greg

On 2019/8/15 下午10:20, Greg Kroah-Hartman wrote:
> On Wed, Aug 14, 2019 at 05:34:25PM +0800, Zhangfei Gao wrote:
>> +/* lock to protect all queues management */
>> +static DECLARE_RWSEM(uacce_qs_lock);
>> +#define uacce_qs_rlock() down_read(&uacce_qs_lock)
>> +#define uacce_qs_runlock() up_read(&uacce_qs_lock)
>> +#define uacce_qs_wlock() down_write(&uacce_qs_lock)
>> +#define uacce_qs_wunlock() up_write(&uacce_qs_lock)
> Do not define your own locking macros.  That makes the code impossible
> to review.
>
> And are you _sure_ you need a rw lock?  You have benchmarked where it
> has a performance impact?
OK, will use uacce_mutex for this first version, and put performance 
tunning later.
>> +/**
>> + * uacce_wake_up - Wake up the process who is waiting this queue
>> + * @q the accelerator queue to wake up
>> + */
>> +void uacce_wake_up(struct uacce_queue *q)
>> +{
>> +	dev_dbg(&q->uacce->dev, "wake up\n");
> ftrace is your friend, no need for any such logging lines anywhere in
> these files.
OK, will remove the dev_dbg.
>> +	wake_up_interruptible(&q->wait);
>> +}
>> +EXPORT_SYMBOL_GPL(uacce_wake_up);
> ...
>
>> +static struct attribute *uacce_dev_attrs[] = {
>> +	&dev_attr_id.attr,
>> +	&dev_attr_api.attr,
>> +	&dev_attr_node_id.attr,
>> +	&dev_attr_numa_distance.attr,
>> +	&dev_attr_flags.attr,
>> +	&dev_attr_available_instances.attr,
>> +	&dev_attr_algorithms.attr,
>> +	&dev_attr_qfrs_offset.attr,
>> +	NULL,
>> +};
>> +
>> +static const struct attribute_group uacce_dev_attr_group = {
>> +	.name	= UACCE_DEV_ATTRS,
>> +	.attrs	= uacce_dev_attrs,
>> +};
> Why is your attribute group in a subdirectory?  Why not in the "normal"
> class directory?
Yes,  .name = UACCE_DEV_ATTRS can be removed to make it simple.
Then attrs are in /sys/class/uacce/hisi_zip-x/xxx
>
> You are adding sysfs files to the kernel without any Documentation/ABI/
> entries, which is a requirement.  Please fix that up for the next time
> you send these.
Will add Documentation/ABI/entries in next version.
>> +static const struct attribute_group *uacce_dev_attr_groups[] = {
>> +	&uacce_dev_attr_group,
>> +	NULL
>> +};
>> +
>> +static int uacce_create_chrdev(struct uacce *uacce)
>> +{
>> +	int ret;
>> +
>> +	ret = idr_alloc(&uacce_idr, uacce, 0, 0, GFP_KERNEL);
>> +	if (ret < 0)
>> +		return ret;
>> +
> Shouldn't this function create the memory needed for this structure?
> You are relying ont he caller to do it for you, why?
I think you mean uacce structure here.
Yes, currently we count on caller to prepare uacce structure and call 
uacce_register(uacce).
We still think this method is simpler, prepare uacce, register uacce.
And there are other system using the same method, like crypto 
(crypto_register_acomp), nand, etc.

>> +	cdev_init(&uacce->cdev, &uacce_fops);
>> +	uacce->dev_id = ret;
>> +	uacce->cdev.owner = THIS_MODULE;
>> +	device_initialize(&uacce->dev);
>> +	uacce->dev.devt = MKDEV(MAJOR(uacce_devt), uacce->dev_id);
>> +	uacce->dev.class = uacce_class;
>> +	uacce->dev.groups = uacce_dev_attr_groups;
>> +	uacce->dev.parent = uacce->pdev;
>> +	dev_set_name(&uacce->dev, "%s-%d", uacce->drv_name, uacce->dev_id);
>> +	ret = cdev_device_add(&uacce->cdev, &uacce->dev);
>> +	if (ret)
>> +		goto err_with_idr;
>> +
>> +	dev_dbg(&uacce->dev, "create uacce minior=%d\n", uacce->dev_id);
>> +	return 0;
>> +
>> +err_with_idr:
>> +	idr_remove(&uacce_idr, uacce->dev_id);
>> +	return ret;
>> +}
>> +
>> +static void uacce_destroy_chrdev(struct uacce *uacce)
>> +{
>> +	cdev_device_del(&uacce->cdev, &uacce->dev);
>> +	idr_remove(&uacce_idr, uacce->dev_id);
>> +}
>> +
>> +static int uacce_default_get_available_instances(struct uacce *uacce)
>> +{
>> +	return -1;
> Do not make up error values, use the proper -EXXXX value instead.
>
>> +}
>> +
>> +static int uacce_default_start_queue(struct uacce_queue *q)
>> +{
>> +	dev_dbg(&q->uacce->dev, "fake start queue");
>> +	return 0;
> Why even have this function if you do not do anything in it?
OK, will remove these two funcs.
>> +}
>> +
>> +static int uacce_dev_match(struct device *dev, void *data)
>> +{
>> +	if (dev->parent == data)
>> +		return -EBUSY;
> There should be in-kernel functions for this now, no need for you to
> roll your own.
Sorry, do not find this function.
Only find class_find_device, which still require match.

Thanks.




More information about the Linux-accelerators mailing list