Reviewed-by: Alistair Popple <apopple@xxxxxxxxxx> On Thursday, 27 January 2022 2:09:45 PM AEDT Alex Sierra wrote: > new ioctl cmd added to query zone device type. This will be > used once the test_hmm adds zone device coherent type. > > Signed-off-by: Alex Sierra <alex.sierra@xxxxxxx> > --- > lib/test_hmm.c | 23 +++++++++++++++++++++-- > lib/test_hmm_uapi.h | 8 ++++++++ > 2 files changed, 29 insertions(+), 2 deletions(-) > > diff --git a/lib/test_hmm.c b/lib/test_hmm.c > index c259842f6d44..fb1fa7c6fa98 100644 > --- a/lib/test_hmm.c > +++ b/lib/test_hmm.c > @@ -84,6 +84,7 @@ struct dmirror_chunk { > struct dmirror_device { > struct cdev cdevice; > struct hmm_devmem *devmem; > + unsigned int zone_device_type; > > unsigned int devmem_capacity; > unsigned int devmem_count; > @@ -1025,6 +1026,15 @@ static int dmirror_snapshot(struct dmirror *dmirror, > return ret; > } > > +static int dmirror_get_device_type(struct dmirror *dmirror, > + struct hmm_dmirror_cmd *cmd) > +{ > + mutex_lock(&dmirror->mutex); > + cmd->zone_device_type = dmirror->mdevice->zone_device_type; > + mutex_unlock(&dmirror->mutex); > + > + return 0; > +} > static long dmirror_fops_unlocked_ioctl(struct file *filp, > unsigned int command, > unsigned long arg) > @@ -1075,6 +1085,9 @@ static long dmirror_fops_unlocked_ioctl(struct file *filp, > ret = dmirror_snapshot(dmirror, &cmd); > break; > > + case HMM_DMIRROR_GET_MEM_DEV_TYPE: > + ret = dmirror_get_device_type(dmirror, &cmd); > + break; > default: > return -EINVAL; > } > @@ -1235,14 +1248,20 @@ static void dmirror_device_remove(struct dmirror_device *mdevice) > static int __init hmm_dmirror_init(void) > { > int ret; > - int id; > + int id = 0; > + int ndevices = 0; > > ret = alloc_chrdev_region(&dmirror_dev, 0, DMIRROR_NDEVICES, > "HMM_DMIRROR"); > if (ret) > goto err_unreg; > > - for (id = 0; id < DMIRROR_NDEVICES; id++) { > + memset(dmirror_devices, 0, DMIRROR_NDEVICES * sizeof(dmirror_devices[0])); > + dmirror_devices[ndevices++].zone_device_type = > + HMM_DMIRROR_MEMORY_DEVICE_PRIVATE; > + dmirror_devices[ndevices++].zone_device_type = > + HMM_DMIRROR_MEMORY_DEVICE_PRIVATE; > + for (id = 0; id < ndevices; id++) { > ret = dmirror_device_init(dmirror_devices + id, id); > if (ret) > goto err_chrdev; > diff --git a/lib/test_hmm_uapi.h b/lib/test_hmm_uapi.h > index f14dea5dcd06..17f842f1aa02 100644 > --- a/lib/test_hmm_uapi.h > +++ b/lib/test_hmm_uapi.h > @@ -19,6 +19,7 @@ > * @npages: (in) number of pages to read/write > * @cpages: (out) number of pages copied > * @faults: (out) number of device page faults seen > + * @zone_device_type: (out) zone device memory type > */ > struct hmm_dmirror_cmd { > __u64 addr; > @@ -26,6 +27,7 @@ struct hmm_dmirror_cmd { > __u64 npages; > __u64 cpages; > __u64 faults; > + __u64 zone_device_type; > }; > > /* Expose the address space of the calling process through hmm device file */ > @@ -35,6 +37,7 @@ struct hmm_dmirror_cmd { > #define HMM_DMIRROR_SNAPSHOT _IOWR('H', 0x03, struct hmm_dmirror_cmd) > #define HMM_DMIRROR_EXCLUSIVE _IOWR('H', 0x04, struct hmm_dmirror_cmd) > #define HMM_DMIRROR_CHECK_EXCLUSIVE _IOWR('H', 0x05, struct hmm_dmirror_cmd) > +#define HMM_DMIRROR_GET_MEM_DEV_TYPE _IOWR('H', 0x06, struct hmm_dmirror_cmd) > > /* > * Values returned in hmm_dmirror_cmd.ptr for HMM_DMIRROR_SNAPSHOT. > @@ -62,4 +65,9 @@ enum { > HMM_DMIRROR_PROT_DEV_PRIVATE_REMOTE = 0x30, > }; > > +enum { > + /* 0 is reserved to catch uninitialized type fields */ > + HMM_DMIRROR_MEMORY_DEVICE_PRIVATE = 1, > +}; > + > #endif /* _LIB_TEST_HMM_UAPI_H */ >