Re: [PATCH] HMM selftests changes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Mika Penttilä <mpenttil@xxxxxxxxxx> writes:

> On 10.3.2022 5.44, John Hubbard wrote:
>> On 3/8/22 5:10 AM, Vlastimil Babka wrote:
>>> +CC relevant folks
>>>
>>> On 3/8/22 02:57, mpenttil@xxxxxxxxxx wrote:
>>>> From: Mika Penttilä <mpenttil@xxxxxxxxxx>
>> Hi Mika,
>> This looks like a very nice cleanup and simplification, delighted to see
>> it!

Agreed, thanks for doing this.

> Thanks!
>
>> In fact, I like it so much that I've got a bunch of fussy nitpicks I'm
>> hoping you'll consider applying, below. :)
>> Also, I'm assuming you've tested it a little bit? (My test rig is boxed
>> up for another day or two, don't ask...haha.)
>>
>
> Yes it passed the tests with the changes.

Feel free to add:

Tested-by: Alistair Popple <apopple@xxxxxxxxxx>

It does currently conflict with linux-next due to the changes for device
coherent memory. So if that series ends up going in first this will need a
little bit of rework. It should be fairly straight forward though - the main
difference is that series introduces two new extra minor nodes.

- Alistair

>
>
>>>>
>>>> HMM selftests use a in-kernel pseudo device to emulate device private memory.
>>>>
>>>> For now, the pseudo device registers a major device range for two pseudo device instances.
>>>> User space has a script that goes figures out from /proc/devices the assigned major
>>>> and mknods the device nodes.
>>>>
>>>> Change this use to a more standard device framework, like misc device,
>>>> which makes the device node names to appear right under any decent user space.
>>>> This also makes it possible for udev- like processing if wanted,
>>>> and the /proc/devices parsing is not needed any more.
>> How about this for the subject line and body? I've made the subject line
>> match what other commits look like in this area, and I've clarified the
>> wording in the body:
>>
>> mm/hmm/test: simplify hmm test code: use miscdevice instead of char dev
>> HMM selftests use an in-kernel pseudo device to emulate device private
>> memory. The pseudo device registers a major device range for two pseudo
>> device instances. User space has a script that reads /proc/devices in
>> order to find the assigned major number, and sends that to mknod(1),
>> once for each node.
>> This duplicates a fair amount of boilerplate that misc device can do
>> instead.
>> Change this to use misc device, which makes the device node names appear
>> for us. This also enables udev-like processing if desired.
>> Delete the /proc/devices parsing from the user-space test script, now
>> that it is unnecessary.
>>
>>>>
>>>> Signed-off-by: Mika Penttilä <mpenttil@xxxxxxxxxx>
>>>> ---
>>>>   lib/test_hmm.c                         | 46 +++++++++++++++-----------
>>>>   tools/testing/selftests/vm/test_hmm.sh |  6 ----
>>>>   2 files changed, 26 insertions(+), 26 deletions(-)
>>>>
>>>> diff --git a/lib/test_hmm.c b/lib/test_hmm.c
>>>> index 767538089a62..76f6129e1f1f 100644
>>>> --- a/lib/test_hmm.c
>>>> +++ b/lib/test_hmm.c
>>>> @@ -10,7 +10,6 @@
>>>>   #include <linux/mm.h>
>>>>   #include <linux/module.h>
>>>>   #include <linux/kernel.h>
>>>> -#include <linux/cdev.h>
>>>>   #include <linux/device.h>
>>>>   #include <linux/mutex.h>
>>>>   #include <linux/rwsem.h>
>>>> @@ -25,18 +24,25 @@
>>>>   #include <linux/swapops.h>
>>>>   #include <linux/sched/mm.h>
>>>>   #include <linux/platform_device.h>
>>>> +#include <linux/miscdevice.h>
>>>>   #include <linux/rmap.h>
>>>>     #include "test_hmm_uapi.h"
>>>>   -#define DMIRROR_NDEVICES  2
>>>>   #define DMIRROR_RANGE_FAULT_TIMEOUT 1000
>>>>   #define DEVMEM_CHUNK_SIZE  (256 * 1024 * 1024U)
>>>>   #define DEVMEM_CHUNKS_RESERVE  16
>>>>   +
>> Extra newline, please delete.
>>
>
> yep
>
>
>>>> +static const char *dmirror_device_names[] = {
>>>> +	"hmm_dmirror0",
>>>> +	"hmm_dmirror1"
>>>> +};
>>>> +
>>>> +#define DMIRROR_NDEVICES ARRAY_SIZE(dmirror_device_names)
>>>> +
>>>>   static const struct dev_pagemap_ops dmirror_devmem_ops;
>>>>   static const struct mmu_interval_notifier_ops dmirror_min_ops;
>>>> -static dev_t dmirror_dev;
>>>>     struct dmirror_device;
>>>>   @@ -82,7 +88,7 @@ struct dmirror_chunk {
>>>>    * Per device data.
>>>>    */
>>>>   struct dmirror_device {
>>>> -	struct cdev		cdevice;
>>>> +	struct miscdevice	miscdevice;
>>>>   	struct hmm_devmem *devmem;
>>>>     	unsigned int		devmem_capacity;
>>>> @@ -118,16 +124,20 @@ static void dmirror_bounce_fini(struct dmirror_bounce *bounce)
>>>>     static int dmirror_fops_open(struct inode *inode, struct file *filp)
>>>>   {
>>>> -	struct cdev *cdev = inode->i_cdev;
>>>> +
>>>> +	struct dmirror_device *dd = container_of(filp->private_data,
>>>> +                                              struct dmirror_device, miscdevice
>>>> +		);
>> Let's delete that whole chunk, because the variable is unnecessary, and
>> is adding to the line count and mental load for no reason.
>
>
> Agreed.
>
>
>> Look how much cleaner this it gets after applying this incremental diff
>> on top of your patch:
>> diff --git a/lib/test_hmm.c b/lib/test_hmm.c
>> index 76f6129e1f1f..3ec8ca8059cd 100644
>> --- a/lib/test_hmm.c
>> +++ b/lib/test_hmm.c
>> @@ -125,19 +125,16 @@ static void dmirror_bounce_fini(struct dmirror_bounce *bounce)
>>   static int dmirror_fops_open(struct inode *inode, struct file *filp)
>>   {
>>   -	struct dmirror_device *dd = container_of(filp->private_data,
>> -                                              struct dmirror_device, miscdevice
>> -		);
>>   	struct dmirror *dmirror;
>>   	int ret;
>>   -
>>   	/* Mirror this process address space */
>>   	dmirror = kzalloc(sizeof(*dmirror), GFP_KERNEL);
>>   	if (dmirror == NULL)
>>   		return -ENOMEM;
>>   -	dmirror->mdevice = dd;
>> +	dmirror->mdevice = container_of(filp->private_data,struct dmirror_device,
>> +									miscdevice);
>>   	mutex_init(&dmirror->mutex);
>>   	xa_init(&dmirror->pt);
>>
>>>>   	struct dmirror *dmirror;
>>>>   	int ret;
>>>>   +
>>>>   	/* Mirror this process address space */
>>>>   	dmirror = kzalloc(sizeof(*dmirror), GFP_KERNEL);
>>>>   	if (dmirror `= NULL)
>>>>   		return -ENOMEM;
>>>>   -	dmirror->mdevice = container_of(cdev, struct dmirror_device, cdevice);
>>>> +	dmirror->mdevice = dd;
>>>>   	mutex_init(&dmirror->mutex);
>>>>   	xa_init(&dmirror->pt);
>>>>   @@ -1216,16 +1226,18 @@ static const struct dev_pagemap_ops
>>>> dmirror_devmem_ops = {
>>>>     static int dmirror_device_init(struct dmirror_device *mdevice, int id)
>>>>   {
>>>> -	dev_t dev;
>>>> +
>>>>   	int ret;
>>>>   -	dev = MKDEV(MAJOR(dmirror_dev), id);
>>>>   	mutex_init(&mdevice->devmem_lock);
>>>>   	spin_lock_init(&mdevice->lock);
>>>>   -	cdev_init(&mdevice->cdevice, &dmirror_fops);
>>>> -	mdevice->cdevice.owner = THIS_MODULE;
>>>> -	ret = cdev_add(&mdevice->cdevice, dev, 1);
>>>> +	mdevice->miscdevice.minor = MISC_DYNAMIC_MINOR;
>>>> +	mdevice->miscdevice.name = dmirror_device_names[id];
>>>> +	mdevice->miscdevice.fops = &dmirror_fops;
>>>> +
>>>> +	ret = misc_register(&mdevice->miscdevice);
>>>> +
>>>>   	if (ret)
>>>>   		return ret;
>>>>   @@ -1252,7 +1264,7 @@ static void dmirror_device_remove(struct
>>>> dmirror_device *mdevice)
>>>>   		kfree(mdevice->devmem_chunks);
>>>>   	}
>>>>   -	cdev_del(&mdevice->cdevice);
>>>> +	misc_deregister(&mdevice->miscdevice);
>>>>   }
>>>>     static int __init hmm_dmirror_init(void)
>>>> @@ -1260,11 +1272,6 @@ static int __init hmm_dmirror_init(void)
>>>>   	int ret;
>>>>   	int id;
>>>>   -	ret = alloc_chrdev_region(&dmirror_dev, 0, DMIRROR_NDEVICES,
>>>> -				  "HMM_DMIRROR");
>>>> -	if (ret)
>>>> -		goto err_unreg;
>>>> -
>>>>   	for (id = 0; id < DMIRROR_NDEVICES; id++) {
>>>>   		ret = dmirror_device_init(dmirror_devices + id, id);
>>>>   		if (ret)
>>>> @@ -1277,8 +1284,7 @@ static int __init hmm_dmirror_init(void)
>>>>   err_chrdev:
>>>>   	while (--id >' 0)
>>>>   		dmirror_device_remove(dmirror_devices + id);
>>>> -	unregister_chrdev_region(dmirror_dev, DMIRROR_NDEVICES);
>>>> -err_unreg:
>>>> +
>>>>   	return ret;
>>>>   }
>>>>   @@ -1288,7 +1294,7 @@ static void __exit hmm_dmirror_exit(void)
>>>>     	for (id = 0; id < DMIRROR_NDEVICES; id++)
>>>>   		dmirror_device_remove(dmirror_devices + id);
>>>> -	unregister_chrdev_region(dmirror_dev, DMIRROR_NDEVICES);
>>>> +
>> Another extra newline, please delete it.
>
> yes
>
>>
>>>>   }
>>>>     module_init(hmm_dmirror_init);
>>>> diff --git a/tools/testing/selftests/vm/test_hmm.sh b/tools/testing/selftests/vm/test_hmm.sh
>>>> index 0647b525a625..69f5889f8575 100755
>>>> --- a/tools/testing/selftests/vm/test_hmm.sh
>>>> +++ b/tools/testing/selftests/vm/test_hmm.sh
>>>> @@ -41,17 +41,11 @@ check_test_requirements()
>>>>   load_driver()
>>>>   {
>>>>   	modprobe $DRIVER > /dev/null 2>&1
>>>> -	if [ $? == 0 ]; then
>>>> -		major=$(awk "\$2==\"HMM_DMIRROR\" {print \$1}" /proc/devices)
>>>> -		mknod /dev/hmm_dmirror0 c $major 0
>>>> -		mknod /dev/hmm_dmirror1 c $major 1
>>>> -	fi
>>>>   }
>>>>     unload_driver()
>>>>   {
>>>>   	modprobe -r $DRIVER > /dev/null 2>&1
>>>> -	rm -f /dev/hmm_dmirror?
>> Nice!
>>
>>>>   }
>>>>     run_smoke()
>>>
>> thanks,
>
>
>
> Ok will make the changes and repost,
>
> thanks!
>
> --Mika

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux